summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 05:48:59 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 05:48:59 +0000
commitc484829272cd13a738e35412498e12f2c9a194ac (patch)
treea1f5ec09629ee895bd3963fa8820b45f2f4c574b
parentInitial commit. (diff)
downloadliborcus-c484829272cd13a738e35412498e12f2c9a194ac.tar.xz
liborcus-c484829272cd13a738e35412498e12f2c9a194ac.zip
Adding upstream version 0.19.2.upstream/0.19.2upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
-rw-r--r--AUTHORS14
-rw-r--r--CHANGELOG702
-rw-r--r--ChangeLog25887
-rw-r--r--LICENSE373
-rw-r--r--Makefile.am987
-rw-r--r--Makefile.in1946
-rw-r--r--README.md37
-rw-r--r--aclocal.m41811
-rwxr-xr-xautogen.sh16
-rw-r--r--benchmark/Makefile.am30
-rw-r--r--benchmark/Makefile.in745
-rw-r--r--benchmark/json_parser.cpp187
-rw-r--r--benchmark/threaded_json_parser.cpp209
-rwxr-xr-xbin/build-extra-dist.sh26
-rw-r--r--bin/env-osx.sh16
-rwxr-xr-xbin/gen-cli-docs.py173
-rw-r--r--bin/gen-files.py83
-rwxr-xr-xbin/gen-gfm-release-table.sh30
-rwxr-xr-xbin/gen-test-json-structure-outputs.sh14
-rwxr-xr-xbin/gen-test-xml-outputs.sh19
-rwxr-xr-xbin/run-bulk-tests.py63
-rwxr-xr-xbin/run-python.sh47
-rwxr-xr-xbin/unpack-zipped-xml.sh49
-rwxr-xr-xcompile348
-rwxr-xr-xconfig.guess1754
-rw-r--r--config.h.in135
-rwxr-xr-xconfig.sub1890
-rwxr-xr-xconfigure26793
-rw-r--r--configure.ac423
-rwxr-xr-xdepcomp791
-rw-r--r--doc/_static/images/overview/doc-content.pngbin0 -> 10859 bytes
-rw-r--r--doc/_static/images/overview/multi-sheets-sheet1.pngbin0 -> 19740 bytes
-rw-r--r--doc/_static/images/overview/multi-sheets-sheet2.pngbin0 -> 12290 bytes
-rw-r--r--doc/cli/index.rst16
-rw-r--r--doc/cli/orcus_csv.rst65
-rw-r--r--doc/cli/orcus_gnumeric.rst57
-rw-r--r--doc/cli/orcus_json.rst45
-rw-r--r--doc/cli/orcus_ods.rst57
-rw-r--r--doc/cli/orcus_parquet.rst57
-rw-r--r--doc/cli/orcus_xls_xml.rst57
-rw-r--r--doc/cli/orcus_xlsx.rst57
-rw-r--r--doc/cli/orcus_xml.rst43
-rw-r--r--doc/cli/orcus_yaml.rst27
-rw-r--r--doc/conf.py288
-rw-r--r--doc/cpp/core/config.rst13
-rw-r--r--doc/cpp/core/import-filter/csv.rst6
-rw-r--r--doc/cpp/core/import-filter/detect.rst5
-rw-r--r--doc/cpp/core/import-filter/gnumeric.rst6
-rw-r--r--doc/cpp/core/import-filter/index.rst20
-rw-r--r--doc/cpp/core/import-filter/json.rst6
-rw-r--r--doc/cpp/core/import-filter/ods.rst9
-rw-r--r--doc/cpp/core/import-filter/xls_xml.rst6
-rw-r--r--doc/cpp/core/import-filter/xlsx.rst9
-rw-r--r--doc/cpp/core/import-filter/xml.rst6
-rw-r--r--doc/cpp/core/index.rst25
-rw-r--r--doc/cpp/core/interface/global.rst12
-rw-r--r--doc/cpp/core/interface/index.rst9
-rw-r--r--doc/cpp/core/interface/spreadsheet/document.rst21
-rw-r--r--doc/cpp/core/interface/spreadsheet/document_export.rst13
-rw-r--r--doc/cpp/core/interface/spreadsheet/index.rst15
-rw-r--r--doc/cpp/core/interface/spreadsheet/pivot.rst14
-rw-r--r--doc/cpp/core/interface/spreadsheet/sheet.rst30
-rw-r--r--doc/cpp/core/interface/spreadsheet/styles.rst30
-rw-r--r--doc/cpp/core/interface/spreadsheet/view.rst9
-rw-r--r--doc/cpp/core/tree-doc/index.rst13
-rw-r--r--doc/cpp/core/tree-doc/json.rst36
-rw-r--r--doc/cpp/core/tree-doc/yaml.rst19
-rw-r--r--doc/cpp/core/types/core.rst68
-rw-r--r--doc/cpp/core/types/index.rst12
-rw-r--r--doc/cpp/core/types/view.rst20
-rw-r--r--doc/cpp/core/utils.rst19
-rw-r--r--doc/cpp/index.rst10
-rw-r--r--doc/cpp/parser/archive.rst21
-rw-r--r--doc/cpp/parser/base64.rst5
-rw-r--r--doc/cpp/parser/css.rst84
-rw-r--r--doc/cpp/parser/csv.rst17
-rw-r--r--doc/cpp/parser/exception.rst37
-rw-r--r--doc/cpp/parser/index.rst24
-rw-r--r--doc/cpp/parser/json.rst14
-rw-r--r--doc/cpp/parser/stream.rst24
-rw-r--r--doc/cpp/parser/types.rst43
-rw-r--r--doc/cpp/parser/util.rst13
-rw-r--r--doc/cpp/parser/xml.rst65
-rw-r--r--doc/cpp/parser/xml_writer.rst7
-rw-r--r--doc/cpp/parser/yaml.rst14
-rw-r--r--doc/cpp/spreadsheet-doc/document.rst9
-rw-r--r--doc/cpp/spreadsheet-doc/import-export.rst50
-rw-r--r--doc/cpp/spreadsheet-doc/index.rst21
-rw-r--r--doc/cpp/spreadsheet-doc/pivot.rst21
-rw-r--r--doc/cpp/spreadsheet-doc/shared-strings.rst10
-rw-r--r--doc/cpp/spreadsheet-doc/sheet.rst6
-rw-r--r--doc/cpp/spreadsheet-doc/styles.rst30
-rw-r--r--doc/cpp/spreadsheet-doc/table.rst9
-rw-r--r--doc/cpp/spreadsheet-doc/types.rst5
-rw-r--r--doc/cpp/spreadsheet-doc/view.rst9
-rw-r--r--doc/doxygen.conf2276
-rw-r--r--doc/environment.yml9
-rw-r--r--doc/index.rst33
-rw-r--r--doc/notes/index.rst9
-rw-r--r--doc/notes/json_map/example.json203
-rw-r--r--doc/notes/json_map/index.rst326
-rw-r--r--doc/notes/xml_map/example.xml183
-rw-r--r--doc/notes/xml_map/index.rst314
-rw-r--r--doc/overview/doc-orcus.rst176
-rw-r--r--doc/overview/doc-user.rst574
-rw-r--r--doc/overview/index.rst95
-rw-r--r--doc/overview/json.rst353
-rw-r--r--doc/overview/yaml.rst8
-rw-r--r--doc/python/index.rst17
-rw-r--r--doc/python/orcus/cell.rst31
-rw-r--r--doc/python/orcus/cell_type.rst7
-rw-r--r--doc/python/orcus/csv/index.rst19
-rw-r--r--doc/python/orcus/document.rst21
-rw-r--r--doc/python/orcus/format_type.rst7
-rw-r--r--doc/python/orcus/formula_token.rst19
-rw-r--r--doc/python/orcus/formula_token_op.rst7
-rw-r--r--doc/python/orcus/formula_token_type.rst7
-rw-r--r--doc/python/orcus/formula_tokens.rst8
-rw-r--r--doc/python/orcus/gnumeric/index.rst24
-rw-r--r--doc/python/orcus/index.rst34
-rw-r--r--doc/python/orcus/named_expressions.rst13
-rw-r--r--doc/python/orcus/ods/index.rst24
-rw-r--r--doc/python/orcus/sheet.rst56
-rw-r--r--doc/python/orcus/sheet_rows.rst9
-rw-r--r--doc/python/orcus/tools/bugzilla.rst11
-rw-r--r--doc/python/orcus/tools/file_processor.rst9
-rw-r--r--doc/python/orcus/tools/index.rst10
-rw-r--r--doc/python/orcus/xls_xml/index.rst25
-rw-r--r--doc/python/orcus/xlsx/index.rst25
-rw-r--r--doc/requirements.txt3
-rw-r--r--doc_example/Makefile.am110
-rw-r--r--doc_example/Makefile.in1409
-rw-r--r--doc_example/files/document.odsbin0 -> 10282 bytes
-rw-r--r--doc_example/files/multi-sheets.odsbin0 -> 9882 bytes
-rw-r--r--doc_example/json_doc_1.cpp55
-rw-r--r--doc_example/json_doc_2.cpp219
-rw-r--r--doc_example/json_parser_1.cpp41
-rw-r--r--doc_example/spreadsheet_doc_1.cpp64
-rw-r--r--doc_example/spreadsheet_doc_1_num_and_formula.cpp62
-rw-r--r--doc_example/spreadsheet_doc_2.cpp44
-rw-r--r--doc_example/spreadsheet_doc_2_sheets_no_string_pool.cpp123
-rw-r--r--doc_example/spreadsheet_doc_2_sheets_with_formula.cpp290
-rw-r--r--doc_example/spreadsheet_doc_2_sheets_with_string_pool.cpp204
-rw-r--r--doc_example/xml_mapping_1.cpp129
-rw-r--r--include/Makefile.am1
-rw-r--r--include/Makefile.in718
-rw-r--r--include/orcus/Makefile.am88
-rw-r--r--include/orcus/Makefile.in828
-rw-r--r--include/orcus/base64.hpp37
-rw-r--r--include/orcus/cell_buffer.hpp42
-rw-r--r--include/orcus/config.hpp125
-rw-r--r--include/orcus/css_document_tree.hpp100
-rw-r--r--include/orcus/css_parser.hpp883
-rw-r--r--include/orcus/css_parser_base.hpp71
-rw-r--r--include/orcus/css_selector.hpp110
-rw-r--r--include/orcus/css_types.hpp139
-rw-r--r--include/orcus/csv_parser.hpp306
-rw-r--r--include/orcus/csv_parser_base.hpp80
-rw-r--r--include/orcus/detail/Makefile.am7
-rw-r--r--include/orcus/detail/Makefile.in662
-rw-r--r--include/orcus/detail/parser_token_buffer.hpp188
-rw-r--r--include/orcus/detail/thread.hpp35
-rw-r--r--include/orcus/dom_tree.hpp134
-rw-r--r--include/orcus/env.hpp141
-rw-r--r--include/orcus/exception.hpp152
-rw-r--r--include/orcus/format_detection.hpp52
-rw-r--r--include/orcus/info.hpp22
-rw-r--r--include/orcus/interface.hpp92
-rw-r--r--include/orcus/json_document_tree.hpp504
-rw-r--r--include/orcus/json_global.hpp30
-rw-r--r--include/orcus/json_parser.hpp402
-rw-r--r--include/orcus/json_parser_base.hpp46
-rw-r--r--include/orcus/json_parser_thread.hpp104
-rw-r--r--include/orcus/json_structure_tree.hpp137
-rw-r--r--include/orcus/measurement.hpp41
-rw-r--r--include/orcus/orcus_csv.hpp41
-rw-r--r--include/orcus/orcus_gnumeric.hpp43
-rw-r--r--include/orcus/orcus_import_ods.hpp32
-rw-r--r--include/orcus/orcus_import_xlsx.hpp37
-rw-r--r--include/orcus/orcus_json.hpp73
-rw-r--r--include/orcus/orcus_ods.hpp58
-rw-r--r--include/orcus/orcus_parquet.hpp41
-rw-r--r--include/orcus/orcus_xls_xml.hpp43
-rw-r--r--include/orcus/orcus_xlsx.hpp87
-rw-r--r--include/orcus/orcus_xml.hpp155
-rw-r--r--include/orcus/parser_base.hpp155
-rw-r--r--include/orcus/parser_global.hpp153
-rw-r--r--include/orcus/sax_ns_parser.hpp374
-rw-r--r--include/orcus/sax_parser.hpp576
-rw-r--r--include/orcus/sax_parser_base.hpp207
-rw-r--r--include/orcus/sax_token_parser.hpp186
-rw-r--r--include/orcus/sax_token_parser_thread.hpp92
-rw-r--r--include/orcus/spreadsheet/Makefile.am26
-rw-r--r--include/orcus/spreadsheet/Makefile.in680
-rw-r--r--include/orcus/spreadsheet/auto_filter.hpp149
-rw-r--r--include/orcus/spreadsheet/config.hpp37
-rw-r--r--include/orcus/spreadsheet/document.hpp166
-rw-r--r--include/orcus/spreadsheet/document_types.hpp77
-rw-r--r--include/orcus/spreadsheet/export_interface.hpp60
-rw-r--r--include/orcus/spreadsheet/factory.hpp143
-rw-r--r--include/orcus/spreadsheet/import_interface.hpp1332
-rw-r--r--include/orcus/spreadsheet/import_interface_pivot.hpp351
-rw-r--r--include/orcus/spreadsheet/import_interface_styles.hpp774
-rw-r--r--include/orcus/spreadsheet/import_interface_view.hpp78
-rw-r--r--include/orcus/spreadsheet/pivot.hpp254
-rw-r--r--include/orcus/spreadsheet/shared_strings.hpp77
-rw-r--r--include/orcus/spreadsheet/sheet.hpp150
-rw-r--r--include/orcus/spreadsheet/styles.hpp268
-rw-r--r--include/orcus/spreadsheet/types.hpp751
-rw-r--r--include/orcus/spreadsheet/view.hpp65
-rw-r--r--include/orcus/spreadsheet/view_types.hpp95
-rw-r--r--include/orcus/stream.hpp188
-rw-r--r--include/orcus/string_pool.hpp99
-rw-r--r--include/orcus/threaded_json_parser.hpp185
-rw-r--r--include/orcus/threaded_sax_token_parser.hpp165
-rw-r--r--include/orcus/tokens.hpp74
-rw-r--r--include/orcus/types.hpp634
-rw-r--r--include/orcus/xml_namespace.hpp195
-rw-r--r--include/orcus/xml_structure_tree.hpp198
-rw-r--r--include/orcus/xml_writer.hpp122
-rw-r--r--include/orcus/yaml_document_tree.hpp109
-rw-r--r--include/orcus/yaml_parser.hpp691
-rw-r--r--include/orcus/yaml_parser_base.hpp195
-rw-r--r--include/orcus/zip_archive.hpp126
-rw-r--r--include/orcus/zip_archive_stream.hpp71
-rwxr-xr-xinstall-sh541
-rw-r--r--liborcus-spreadsheet-model.pc.in12
-rw-r--r--liborcus.pc.in12
-rwxr-xr-xltmain.sh11251
-rw-r--r--m4/ax_cxx_compile_stdcxx.m4951
-rw-r--r--m4/ax_cxx_compile_stdcxx_17.m435
-rw-r--r--m4/boost.m41696
-rw-r--r--m4/libtool.m48394
-rw-r--r--m4/ltoptions.m4437
-rw-r--r--m4/ltsugar.m4124
-rw-r--r--m4/ltversion.m423
-rw-r--r--m4/lt~obsolete.m499
-rw-r--r--m4/m4_ax_valgrind_check.m4239
-rw-r--r--misc/arrow-parquet/arrow-test.cpp155
-rwxr-xr-xmisc/arrow-parquet/dump-parquet.py52
-rwxr-xr-xmisc/arrow-parquet/gen-parquet-test-files.py92
-rw-r--r--misc/character-set/data.csv631
-rwxr-xr-xmisc/character-set/gen-enum.py101
-rw-r--r--misc/file-processor-modules/preview.py33
-rw-r--r--misc/notes/column-width-and-row-height.txt69
-rw-r--r--misc/notes/zlib-in-memory-gzip.txt8
-rwxr-xr-xmisc/xml-tokens/dump-xsd-keys.py145
-rwxr-xr-xmisc/xml-tokens/gen-gnumeric-tokens.py81
-rwxr-xr-xmisc/xml-tokens/gen-odf-tokens.py192
-rwxr-xr-xmisc/xml-tokens/gen-ooxml-tokens.py84
-rwxr-xr-xmisc/xml-tokens/gen-tokens.py47
-rwxr-xr-xmisc/xml-tokens/gnumeric.xsd1296
-rw-r--r--misc/xml-tokens/ooxml-extra-tokens.txt3
-rw-r--r--misc/xml-tokens/token_util.py70
-rw-r--r--misc/xml-tokens/xls-xml-tokens.txt991
-rwxr-xr-xmissing215
-rw-r--r--slickedit/cmake.vpj106
-rw-r--r--slickedit/cpp.vpj219
-rw-r--r--slickedit/doc.vpj80
-rw-r--r--slickedit/orcus.vpw11
-rw-r--r--slickedit/orcus_cpp.h8
-rw-r--r--slickedit/python.vpj97
-rw-r--r--slickedit/sh.vpj82
-rw-r--r--slickedit/token-gen.vpj87
-rw-r--r--src/Makefile.am721
-rw-r--r--src/Makefile.in2986
-rw-r--r--src/cli_global.cpp63
-rw-r--r--src/cli_global.hpp39
-rw-r--r--src/include/Makefile.am9
-rw-r--r--src/include/Makefile.in726
-rw-r--r--src/include/cpu_features.hpp44
-rw-r--r--src/include/filesystem_env.hpp23
-rw-r--r--src/include/mock_spreadsheet.hpp179
-rw-r--r--src/include/mso/Makefile.am3
-rw-r--r--src/include/mso/Makefile.in542
-rw-r--r--src/include/mso/encryption_info.hpp37
-rw-r--r--src/include/numeric_parser.hpp216
-rw-r--r--src/include/ostream_utils.hpp34
-rw-r--r--src/include/test_global.hpp57
-rw-r--r--src/liborcus/Makefile.am590
-rw-r--r--src/liborcus/Makefile.in4283
-rw-r--r--src/liborcus/common_test.cpp245
-rw-r--r--src/liborcus/config.cpp54
-rw-r--r--src/liborcus/constants.inl.in4
-rw-r--r--src/liborcus/css_document_tree.cpp647
-rw-r--r--src/liborcus/css_document_tree_test.cpp690
-rw-r--r--src/liborcus/css_selector.cpp214
-rw-r--r--src/liborcus/detection_result.cpp20
-rw-r--r--src/liborcus/detection_result.hpp26
-rw-r--r--src/liborcus/dom_tree.cpp741
-rw-r--r--src/liborcus/dom_tree_test.cpp123
-rw-r--r--src/liborcus/format_detection.cpp135
-rw-r--r--src/liborcus/formula_result.cpp120
-rw-r--r--src/liborcus/formula_result.hpp72
-rw-r--r--src/liborcus/gnumeric_cell_context.cpp377
-rw-r--r--src/liborcus/gnumeric_cell_context.hpp85
-rw-r--r--src/liborcus/gnumeric_cell_context_test.cpp386
-rw-r--r--src/liborcus/gnumeric_context.cpp453
-rw-r--r--src/liborcus/gnumeric_context.hpp67
-rw-r--r--src/liborcus/gnumeric_detection_handler.cpp83
-rw-r--r--src/liborcus/gnumeric_detection_handler.hpp31
-rw-r--r--src/liborcus/gnumeric_filter_context.cpp256
-rw-r--r--src/liborcus/gnumeric_filter_context.hpp54
-rw-r--r--src/liborcus/gnumeric_handler.cpp32
-rw-r--r--src/liborcus/gnumeric_handler.hpp36
-rw-r--r--src/liborcus/gnumeric_names_context.cpp110
-rw-r--r--src/liborcus/gnumeric_names_context.hpp49
-rw-r--r--src/liborcus/gnumeric_namespace_types.cpp38
-rw-r--r--src/liborcus/gnumeric_namespace_types.hpp26
-rw-r--r--src/liborcus/gnumeric_sheet_context.cpp819
-rw-r--r--src/liborcus/gnumeric_sheet_context.hpp112
-rw-r--r--src/liborcus/gnumeric_sheet_context_test.cpp119
-rw-r--r--src/liborcus/gnumeric_styles_context.cpp342
-rw-r--r--src/liborcus/gnumeric_styles_context.hpp59
-rw-r--r--src/liborcus/gnumeric_token_constants.hpp21
-rw-r--r--src/liborcus/gnumeric_token_constants.inl258
-rw-r--r--src/liborcus/gnumeric_tokens.cpp20
-rw-r--r--src/liborcus/gnumeric_tokens.hpp23
-rw-r--r--src/liborcus/gnumeric_tokens.inl263
-rw-r--r--src/liborcus/gnumeric_types.cpp174
-rw-r--r--src/liborcus/gnumeric_types.hpp149
-rw-r--r--src/liborcus/gnumeric_value_format_parser.cpp131
-rw-r--r--src/liborcus/gnumeric_value_format_parser.hpp46
-rw-r--r--src/liborcus/impl_utils.hpp18
-rw-r--r--src/liborcus/info.cpp31
-rw-r--r--src/liborcus/interface.cpp37
-rw-r--r--src/liborcus/json_document_tree.cpp1777
-rw-r--r--src/liborcus/json_document_tree_test.cpp862
-rw-r--r--src/liborcus/json_map_tree.cpp786
-rw-r--r--src/liborcus/json_map_tree.hpp197
-rw-r--r--src/liborcus/json_map_tree_test.cpp130
-rw-r--r--src/liborcus/json_structure_mapper.cpp77
-rw-r--r--src/liborcus/json_structure_mapper.hpp37
-rw-r--r--src/liborcus/json_structure_tree.cpp720
-rw-r--r--src/liborcus/json_structure_tree_test.cpp201
-rw-r--r--src/liborcus/json_util.cpp27
-rw-r--r--src/liborcus/json_util.hpp21
-rw-r--r--src/liborcus/measurement.cpp214
-rw-r--r--src/liborcus/number_utils.cpp74
-rw-r--r--src/liborcus/number_utils.hpp22
-rw-r--r--src/liborcus/odf_document_styles_context.cpp73
-rw-r--r--src/liborcus/odf_document_styles_context.hpp50
-rw-r--r--src/liborcus/odf_helper.cpp260
-rw-r--r--src/liborcus/odf_helper.hpp55
-rw-r--r--src/liborcus/odf_helper_test.cpp51
-rw-r--r--src/liborcus/odf_namespace_types.cpp12
-rw-r--r--src/liborcus/odf_namespace_types.hpp16
-rw-r--r--src/liborcus/odf_namespace_types_cpp.inl63
-rw-r--r--src/liborcus/odf_namespace_types_hpp.inl31
-rw-r--r--src/liborcus/odf_number_format_context.cpp1126
-rw-r--r--src/liborcus/odf_number_format_context.hpp180
-rw-r--r--src/liborcus/odf_para_context.cpp165
-rw-r--r--src/liborcus/odf_para_context.hpp62
-rw-r--r--src/liborcus/odf_style_context.cpp774
-rw-r--r--src/liborcus/odf_style_context.hpp51
-rw-r--r--src/liborcus/odf_styles.cpp110
-rw-r--r--src/liborcus/odf_styles.hpp127
-rw-r--r--src/liborcus/odf_styles_context.cpp403
-rw-r--r--src/liborcus/odf_styles_context.hpp70
-rw-r--r--src/liborcus/odf_token_constants.hpp21
-rw-r--r--src/liborcus/odf_token_constants.inl2280
-rw-r--r--src/liborcus/odf_tokens.cpp23
-rw-r--r--src/liborcus/odf_tokens.hpp23
-rw-r--r--src/liborcus/odf_tokens.inl2285
-rw-r--r--src/liborcus/ods_content_xml_context.cpp900
-rw-r--r--src/liborcus/ods_content_xml_context.hpp138
-rw-r--r--src/liborcus/ods_dde_links_context.cpp49
-rw-r--r--src/liborcus/ods_dde_links_context.hpp42
-rw-r--r--src/liborcus/ods_session_data.cpp42
-rw-r--r--src/liborcus/ods_session_data.hpp82
-rw-r--r--src/liborcus/ooxml_content_types.cpp74
-rw-r--r--src/liborcus/ooxml_content_types.hpp49
-rw-r--r--src/liborcus/ooxml_global.cpp97
-rw-r--r--src/liborcus/ooxml_global.hpp48
-rw-r--r--src/liborcus/ooxml_namespace_types.cpp52
-rw-r--r--src/liborcus/ooxml_namespace_types.hpp44
-rw-r--r--src/liborcus/ooxml_schemas.cpp70
-rw-r--r--src/liborcus/ooxml_schemas.hpp47
-rw-r--r--src/liborcus/ooxml_token_constants.hpp21
-rw-r--r--src/liborcus/ooxml_token_constants.inl3519
-rw-r--r--src/liborcus/ooxml_tokens.cpp29
-rw-r--r--src/liborcus/ooxml_tokens.hpp21
-rw-r--r--src/liborcus/ooxml_tokens.inl3524
-rw-r--r--src/liborcus/ooxml_types.cpp27
-rw-r--r--src/liborcus/ooxml_types.hpp73
-rw-r--r--src/liborcus/opc_context.cpp310
-rw-r--r--src/liborcus/opc_context.hpp90
-rw-r--r--src/liborcus/opc_reader.cpp306
-rw-r--r--src/liborcus/opc_reader.hpp127
-rw-r--r--src/liborcus/opc_token_constants.hpp20
-rw-r--r--src/liborcus/opc_token_constants.inl31
-rw-r--r--src/liborcus/opc_tokens.inl36
-rw-r--r--src/liborcus/orcus_csv.cpp196
-rw-r--r--src/liborcus/orcus_gnumeric.cpp163
-rw-r--r--src/liborcus/orcus_import_ods.cpp51
-rw-r--r--src/liborcus/orcus_import_xlsx.cpp51
-rw-r--r--src/liborcus/orcus_json.cpp513
-rw-r--r--src/liborcus/orcus_ods.cpp230
-rw-r--r--src/liborcus/orcus_parquet.cpp547
-rw-r--r--src/liborcus/orcus_xls_xml.cpp134
-rw-r--r--src/liborcus/orcus_xlsx.cpp824
-rw-r--r--src/liborcus/orcus_xml.cpp702
-rw-r--r--src/liborcus/orcus_xml_impl.cpp22
-rw-r--r--src/liborcus/orcus_xml_impl.hpp51
-rw-r--r--src/liborcus/orcus_xml_map_def.cpp299
-rw-r--r--src/liborcus/session_context.cpp30
-rw-r--r--src/liborcus/session_context.hpp58
-rw-r--r--src/liborcus/spreadsheet_iface_util.cpp53
-rw-r--r--src/liborcus/spreadsheet_iface_util.hpp36
-rw-r--r--src/liborcus/spreadsheet_impl_types.cpp50
-rw-r--r--src/liborcus/spreadsheet_impl_types.hpp39
-rw-r--r--src/liborcus/spreadsheet_interface.cpp159
-rw-r--r--src/liborcus/spreadsheet_types.cpp763
-rw-r--r--src/liborcus/string_helper.cpp40
-rw-r--r--src/liborcus/string_helper.hpp21
-rw-r--r--src/liborcus/xls_xml_context.cpp2396
-rw-r--r--src/liborcus/xls_xml_context.hpp334
-rw-r--r--src/liborcus/xls_xml_detection_handler.cpp113
-rw-r--r--src/liborcus/xls_xml_detection_handler.hpp31
-rw-r--r--src/liborcus/xls_xml_handler.cpp22
-rw-r--r--src/liborcus/xls_xml_handler.hpp35
-rw-r--r--src/liborcus/xls_xml_namespace_types.cpp32
-rw-r--r--src/liborcus/xls_xml_namespace_types.hpp28
-rw-r--r--src/liborcus/xls_xml_token_constants.hpp20
-rw-r--r--src/liborcus/xls_xml_token_constants.inl992
-rw-r--r--src/liborcus/xls_xml_tokens.cpp21
-rw-r--r--src/liborcus/xls_xml_tokens.hpp20
-rw-r--r--src/liborcus/xls_xml_tokens.inl997
-rw-r--r--src/liborcus/xlsx_autofilter_context.cpp140
-rw-r--r--src/liborcus/xlsx_autofilter_context.hpp64
-rw-r--r--src/liborcus/xlsx_conditional_format_context.cpp878
-rw-r--r--src/liborcus/xlsx_conditional_format_context.hpp68
-rw-r--r--src/liborcus/xlsx_drawing_context.cpp173
-rw-r--r--src/liborcus/xlsx_drawing_context.hpp48
-rw-r--r--src/liborcus/xlsx_handler.cpp76
-rw-r--r--src/liborcus/xlsx_handler.hpp91
-rw-r--r--src/liborcus/xlsx_helper.cpp33
-rw-r--r--src/liborcus/xlsx_helper.hpp18
-rw-r--r--src/liborcus/xlsx_pivot_context.cpp1734
-rw-r--r--src/liborcus/xlsx_pivot_context.hpp118
-rw-r--r--src/liborcus/xlsx_revision_context.cpp578
-rw-r--r--src/liborcus/xlsx_revision_context.hpp53
-rw-r--r--src/liborcus/xlsx_session_data.cpp47
-rw-r--r--src/liborcus/xlsx_session_data.hpp92
-rw-r--r--src/liborcus/xlsx_shared_strings_context.cpp253
-rw-r--r--src/liborcus/xlsx_shared_strings_context.hpp48
-rw-r--r--src/liborcus/xlsx_sheet_context.cpp943
-rw-r--r--src/liborcus/xlsx_sheet_context.hpp141
-rw-r--r--src/liborcus/xlsx_sheet_context_test.cpp281
-rw-r--r--src/liborcus/xlsx_styles_context.cpp1055
-rw-r--r--src/liborcus/xlsx_styles_context.hpp86
-rw-r--r--src/liborcus/xlsx_table_context.cpp319
-rw-r--r--src/liborcus/xlsx_table_context.hpp52
-rw-r--r--src/liborcus/xlsx_types.cpp116
-rw-r--r--src/liborcus/xlsx_types.hpp93
-rw-r--r--src/liborcus/xlsx_workbook_context.cpp253
-rw-r--r--src/liborcus/xlsx_workbook_context.hpp65
-rw-r--r--src/liborcus/xml_context_base.cpp348
-rw-r--r--src/liborcus/xml_context_base.hpp192
-rw-r--r--src/liborcus/xml_context_global.cpp106
-rw-r--r--src/liborcus/xml_context_global.hpp71
-rw-r--r--src/liborcus/xml_element_types.cpp19
-rw-r--r--src/liborcus/xml_element_types.hpp30
-rw-r--r--src/liborcus/xml_element_validator.cpp60
-rw-r--r--src/liborcus/xml_element_validator.hpp50
-rw-r--r--src/liborcus/xml_empty_context.cpp44
-rw-r--r--src/liborcus/xml_empty_context.hpp39
-rw-r--r--src/liborcus/xml_map_tree.cpp772
-rw-r--r--src/liborcus/xml_map_tree.hpp316
-rw-r--r--src/liborcus/xml_map_tree_test.cpp274
-rw-r--r--src/liborcus/xml_simple_stream_handler.cpp54
-rw-r--r--src/liborcus/xml_simple_stream_handler.hpp40
-rw-r--r--src/liborcus/xml_stream_handler.cpp139
-rw-r--r--src/liborcus/xml_stream_handler.hpp66
-rw-r--r--src/liborcus/xml_stream_parser.cpp96
-rw-r--r--src/liborcus/xml_stream_parser.hpp84
-rw-r--r--src/liborcus/xml_structure_mapper.cpp84
-rw-r--r--src/liborcus/xml_structure_mapper.hpp40
-rw-r--r--src/liborcus/xml_structure_tree.cpp625
-rw-r--r--src/liborcus/xml_structure_tree_test.cpp286
-rw-r--r--src/liborcus/xml_util.cpp70
-rw-r--r--src/liborcus/xml_util.hpp43
-rw-r--r--src/liborcus/xpath_parser.cpp90
-rw-r--r--src/liborcus/xpath_parser.hpp49
-rw-r--r--src/liborcus/xpath_parser_test.cpp74
-rw-r--r--src/liborcus/yaml_document_tree.cpp856
-rw-r--r--src/liborcus/yaml_document_tree_test.cpp642
-rw-r--r--src/mso/Makefile.am13
-rw-r--r--src/mso/Makefile.in702
-rw-r--r--src/mso/encryption_info.cpp227
-rw-r--r--src/orcus_css_dump.cpp35
-rw-r--r--src/orcus_csv_main.cpp80
-rw-r--r--src/orcus_detect_main.cpp70
-rw-r--r--src/orcus_env_dump.cpp33
-rw-r--r--src/orcus_filter_global.cpp240
-rw-r--r--src/orcus_filter_global.hpp53
-rw-r--r--src/orcus_gnumeric_main.cpp36
-rw-r--r--src/orcus_json_cli.cpp443
-rw-r--r--src/orcus_json_cli.hpp54
-rw-r--r--src/orcus_json_cli_map.cpp57
-rw-r--r--src/orcus_mso_encryption.cpp34
-rw-r--r--src/orcus_ods_main.cpp38
-rw-r--r--src/orcus_ods_styles.cpp44
-rw-r--r--src/orcus_parquet_main.cpp35
-rw-r--r--src/orcus_test_csv.cpp253
-rw-r--r--src/orcus_test_global.cpp98
-rw-r--r--src/orcus_test_global.hpp42
-rw-r--r--src/orcus_test_gnumeric.cpp1386
-rw-r--r--src/orcus_test_import_ods.cpp1065
-rw-r--r--src/orcus_test_json_mapped.cpp99
-rw-r--r--src/orcus_test_ods.cpp958
-rw-r--r--src/orcus_test_parquet.cpp134
-rw-r--r--src/orcus_test_xls_xml.cpp2455
-rw-r--r--src/orcus_test_xlsx.cpp2401
-rw-r--r--src/orcus_test_xml.cpp226
-rw-r--r--src/orcus_test_xml_mapped.cpp321
-rw-r--r--src/orcus_xls_xml_main.cpp38
-rw-r--r--src/orcus_xlsx_main.cpp42
-rw-r--r--src/orcus_xml_main.cpp350
-rw-r--r--src/orcus_yaml_main.cpp195
-rw-r--r--src/orcus_zip_dump.cpp52
-rw-r--r--src/parser/Makefile.am338
-rw-r--r--src/parser/Makefile.in2328
-rw-r--r--src/parser/base64.cpp70
-rw-r--r--src/parser/base64_test.cpp44
-rw-r--r--src/parser/cell_buffer.cpp61
-rw-r--r--src/parser/css_parser_base.cpp337
-rw-r--r--src/parser/css_parser_test.cpp28
-rw-r--r--src/parser/css_types.cpp198
-rw-r--r--src/parser/csv_parser_base.cpp47
-rw-r--r--src/parser/csv_parser_test.cpp29
-rw-r--r--src/parser/exception.cpp141
-rw-r--r--src/parser/json_global.cpp46
-rw-r--r--src/parser/json_parser_base.cpp104
-rw-r--r--src/parser/json_parser_test.cpp28
-rw-r--r--src/parser/json_parser_thread.cpp294
-rw-r--r--src/parser/parser_base.cpp222
-rw-r--r--src/parser/parser_base_test.cpp74
-rw-r--r--src/parser/parser_global.cpp515
-rw-r--r--src/parser/parser_global_test.cpp175
-rw-r--r--src/parser/parser_test_json_validation.cpp439
-rw-r--r--src/parser/parser_test_numeric.cpp105
-rw-r--r--src/parser/parser_test_xml_validation.cpp95
-rw-r--r--src/parser/sax_ns_parser_test.cpp78
-rw-r--r--src/parser/sax_parser_base.cpp421
-rw-r--r--src/parser/sax_parser_test.cpp67
-rw-r--r--src/parser/sax_token_parser.cpp110
-rw-r--r--src/parser/sax_token_parser_test.cpp239
-rw-r--r--src/parser/sax_token_parser_thread.cpp204
-rw-r--r--src/parser/stream.cpp447
-rw-r--r--src/parser/stream_test.cpp144
-rw-r--r--src/parser/string_pool.cpp137
-rw-r--r--src/parser/string_pool_test.cpp134
-rw-r--r--src/parser/threaded_json_parser_test.cpp187
-rw-r--r--src/parser/threaded_sax_token_parser_test.cpp190
-rw-r--r--src/parser/tokens.cpp44
-rw-r--r--src/parser/types.cpp1454
-rw-r--r--src/parser/types_test.cpp47
-rw-r--r--src/parser/utf8.cpp524
-rw-r--r--src/parser/utf8.hpp28
-rw-r--r--src/parser/utf8_test.cpp170
-rw-r--r--src/parser/win_stdint.h46
-rw-r--r--src/parser/xml_namespace.cpp490
-rw-r--r--src/parser/xml_namespace_test.cpp239
-rw-r--r--src/parser/xml_writer.cpp326
-rw-r--r--src/parser/xml_writer_test.cpp106
-rw-r--r--src/parser/yaml_parser_base.cpp512
-rw-r--r--src/parser/yaml_parser_test.cpp32
-rw-r--r--src/parser/zip_archive.cpp601
-rw-r--r--src/parser/zip_archive_stream.cpp113
-rw-r--r--src/parser/zip_archive_test.cpp98
-rw-r--r--src/python/Makefile.am140
-rw-r--r--src/python/Makefile.in1405
-rw-r--r--src/python/cell.cpp349
-rw-r--r--src/python/cell.hpp44
-rw-r--r--src/python/csv.cpp105
-rw-r--r--src/python/csv.hpp21
-rw-r--r--src/python/document.cpp330
-rw-r--r--src/python/document.hpp83
-rw-r--r--src/python/formula_token.cpp250
-rw-r--r--src/python/formula_token.hpp40
-rw-r--r--src/python/formula_tokens.cpp200
-rw-r--r--src/python/formula_tokens.hpp39
-rw-r--r--src/python/global.cpp65
-rw-r--r--src/python/global.hpp26
-rw-r--r--src/python/gnumeric.cpp58
-rw-r--r--src/python/gnumeric.hpp21
-rw-r--r--src/python/json.cpp290
-rw-r--r--src/python/memory.cpp46
-rw-r--r--src/python/memory.hpp41
-rw-r--r--src/python/named_expression.cpp215
-rw-r--r--src/python/named_expression.hpp42
-rw-r--r--src/python/named_expressions.cpp218
-rw-r--r--src/python/named_expressions.hpp41
-rw-r--r--src/python/ods.cpp58
-rw-r--r--src/python/ods.hpp21
-rw-r--r--src/python/orcus/__init__.py111
-rw-r--r--src/python/orcus/csv.py10
-rw-r--r--src/python/orcus/gnumeric.py10
-rw-r--r--src/python/orcus/json.py10
-rw-r--r--src/python/orcus/ods.py10
-rw-r--r--src/python/orcus/tools/__init__.py9
-rw-r--r--src/python/orcus/tools/bugzilla.py219
-rw-r--r--src/python/orcus/tools/file_processor.py295
-rw-r--r--src/python/orcus/xls_xml.py10
-rw-r--r--src/python/orcus/xlsx.py10
-rw-r--r--src/python/python.cpp186
-rw-r--r--src/python/root.cpp68
-rw-r--r--src/python/root.hpp21
-rw-r--r--src/python/sheet.cpp327
-rw-r--r--src/python/sheet.hpp43
-rw-r--r--src/python/sheet_rows.cpp209
-rw-r--r--src/python/sheet_rows.hpp54
-rw-r--r--src/python/xls_xml.cpp58
-rw-r--r--src/python/xls_xml.hpp21
-rw-r--r--src/python/xlsx.cpp58
-rw-r--r--src/python/xlsx.hpp21
-rw-r--r--src/spreadsheet/Makefile.am90
-rw-r--r--src/spreadsheet/Makefile.in1134
-rw-r--r--src/spreadsheet/auto_filter.cpp116
-rw-r--r--src/spreadsheet/check_dumper.cpp209
-rw-r--r--src/spreadsheet/check_dumper.hpp38
-rw-r--r--src/spreadsheet/config.cpp28
-rw-r--r--src/spreadsheet/csv_dumper.cpp95
-rw-r--r--src/spreadsheet/csv_dumper.hpp38
-rw-r--r--src/spreadsheet/debug_state_dumper.cpp460
-rw-r--r--src/spreadsheet/debug_state_dumper.hpp61
-rw-r--r--src/spreadsheet/document.cpp526
-rw-r--r--src/spreadsheet/document_impl.cpp232
-rw-r--r--src/spreadsheet/document_impl.hpp104
-rw-r--r--src/spreadsheet/document_types.cpp77
-rw-r--r--src/spreadsheet/dumper_global.cpp87
-rw-r--r--src/spreadsheet/dumper_global.hpp31
-rw-r--r--src/spreadsheet/factory.cpp410
-rw-r--r--src/spreadsheet/factory_pivot.cpp303
-rw-r--r--src/spreadsheet/factory_pivot.hpp120
-rw-r--r--src/spreadsheet/factory_shared_strings.cpp118
-rw-r--r--src/spreadsheet/factory_shared_strings.hpp64
-rw-r--r--src/spreadsheet/factory_sheet.cpp640
-rw-r--r--src/spreadsheet/factory_sheet.hpp275
-rw-r--r--src/spreadsheet/factory_styles.cpp870
-rw-r--r--src/spreadsheet/factory_table.cpp213
-rw-r--r--src/spreadsheet/factory_table.hpp60
-rw-r--r--src/spreadsheet/flat_dumper.cpp208
-rw-r--r--src/spreadsheet/flat_dumper.hpp36
-rw-r--r--src/spreadsheet/formula_global.cpp56
-rw-r--r--src/spreadsheet/formula_global.hpp48
-rw-r--r--src/spreadsheet/global_settings.cpp50
-rw-r--r--src/spreadsheet/global_settings.hpp41
-rw-r--r--src/spreadsheet/html_dumper.cpp695
-rw-r--r--src/spreadsheet/html_dumper.hpp49
-rw-r--r--src/spreadsheet/impl_types.hpp40
-rw-r--r--src/spreadsheet/json_dumper.cpp95
-rw-r--r--src/spreadsheet/json_dumper.hpp36
-rw-r--r--src/spreadsheet/number_format.cpp25
-rw-r--r--src/spreadsheet/number_format.hpp28
-rw-r--r--src/spreadsheet/pivot.cpp371
-rw-r--r--src/spreadsheet/shared_formula.cpp32
-rw-r--r--src/spreadsheet/shared_formula.hpp36
-rw-r--r--src/spreadsheet/shared_strings.cpp61
-rw-r--r--src/spreadsheet/sheet.cpp555
-rw-r--r--src/spreadsheet/sheet_impl.cpp53
-rw-r--r--src/spreadsheet/sheet_impl.hpp72
-rw-r--r--src/spreadsheet/styles.cpp485
-rw-r--r--src/spreadsheet/view.cpp201
-rw-r--r--src/test/Makefile.am10
-rw-r--r--src/test/Makefile.in704
-rw-r--r--src/test/mock_spreadsheet.cpp319
-rw-r--r--src/test/test_global.cpp75
-rwxr-xr-xtest-driver153
-rw-r--r--test/css/basic1.css16
-rw-r--r--test/css/basic10.css7
-rw-r--r--test/css/basic11.css8
-rw-r--r--test/css/basic12.css19
-rw-r--r--test/css/basic13.css6
-rw-r--r--test/css/basic14.css5
-rw-r--r--test/css/basic2.css10
-rw-r--r--test/css/basic3.css10
-rw-r--r--test/css/basic4.css6
-rw-r--r--test/css/basic5.css7
-rw-r--r--test/css/basic6.css8
-rw-r--r--test/css/basic7.css26
-rw-r--r--test/css/basic8.css15
-rw-r--r--test/css/basic9.css20
-rw-r--r--test/css/chained1.css15
-rw-r--r--test/css/chained2.css6
-rw-r--r--test/css/complex/callout.css71
-rw-r--r--test/css/complex/excel-html.css103
-rw-r--r--test/css/empty.css1
-rw-r--r--test/css/invalids/1.css7
-rw-r--r--test/css/test.css15
-rw-r--r--test/css/utf8-1.css13
-rw-r--r--test/csv/double-quotes/check.txt6
-rw-r--r--test/csv/double-quotes/input.csv3
-rw-r--r--test/csv/normal-quotes/check.txt6
-rw-r--r--test/csv/normal-quotes/input.csv2
-rw-r--r--test/csv/quoted-with-delim/check.txt2
-rw-r--r--test/csv/quoted-with-delim/input.csv1
-rw-r--r--test/csv/simple-numbers/check.txt11
-rw-r--r--test/csv/simple-numbers/input.csv5
-rw-r--r--test/csv/split-sheet/check-1.txt42
-rw-r--r--test/csv/split-sheet/check-2.txt44
-rw-r--r--test/csv/split-sheet/check-3.txt22
-rw-r--r--test/csv/split-sheet/input.csv21
-rw-r--r--test/gnumeric/background-color/standard.gnumericbin0 -> 2046 bytes
-rw-r--r--test/gnumeric/borders/colors.gnumericbin0 -> 2156 bytes
-rw-r--r--test/gnumeric/borders/directions.gnumericbin0 -> 2288 bytes
-rw-r--r--test/gnumeric/borders/grid-box.gnumericbin0 -> 2170 bytes
-rw-r--r--test/gnumeric/borders/single-cells.gnumericbin0 -> 2601 bytes
-rw-r--r--test/gnumeric/cell-properties/wrap-and-shrink.gnumericbin0 -> 1883 bytes
-rw-r--r--test/gnumeric/cell-value-types/check.txt41
-rw-r--r--test/gnumeric/cell-value-types/input.gnumericbin0 -> 2129 bytes
-rw-r--r--test/gnumeric/colored-text/input.gnumericbin0 -> 2180 bytes
-rw-r--r--test/gnumeric/column-width-row-height/input.gnumericbin0 -> 2221 bytes
-rw-r--r--test/gnumeric/formula-cells/check.txt7
-rw-r--r--test/gnumeric/formula-cells/input.gnumericbin0 -> 1873 bytes
-rw-r--r--test/gnumeric/hidden-rows-columns/input.gnumericbin0 -> 1887 bytes
-rw-r--r--test/gnumeric/merged-cells/input.gnumericbin0 -> 2015 bytes
-rw-r--r--test/gnumeric/named-expression-sheet-local/check.txt22
-rw-r--r--test/gnumeric/named-expression-sheet-local/input.gnumericbin0 -> 2039 bytes
-rw-r--r--test/gnumeric/named-expression/check.txt12
-rw-r--r--test/gnumeric/named-expression/input.gnumericbin0 -> 1951 bytes
-rw-r--r--test/gnumeric/number-formats/input.gnumericbin0 -> 2276 bytes
-rw-r--r--test/gnumeric/raw-values-1/check.txt25
-rw-r--r--test/gnumeric/raw-values-1/input.gnumericbin0 -> 2114 bytes
-rw-r--r--test/gnumeric/table/autofilter.gnumericbin0 -> 2020 bytes
-rw-r--r--test/gnumeric/test.gnumericbin0 -> 1851 bytes
-rw-r--r--test/gnumeric/text-alignment/input.gnumericbin0 -> 2812 bytes
-rw-r--r--test/gnumeric/text-formats/input.gnumericbin0 -> 2901 bytes
-rw-r--r--test/json-mapped/array-of-arrays-basic/check.txt11
-rw-r--r--test/json-mapped/array-of-arrays-basic/input.json9
-rw-r--r--test/json-mapped/array-of-arrays-basic/map.json19
-rw-r--r--test/json-mapped/array-of-arrays-header/check.txt57
-rw-r--r--test/json-mapped/array-of-arrays-header/input.json19
-rw-r--r--test/json-mapped/array-of-arrays-header/map.json15
-rw-r--r--test/json-mapped/array-of-objects-basic/check.txt20
-rw-r--r--test/json-mapped/array-of-objects-basic/input.json32
-rw-r--r--test/json-mapped/array-of-objects-basic/map.json16
-rw-r--r--test/json-mapped/array-of-objects-header/check.txt64
-rw-r--r--test/json-mapped/array-of-objects-header/input.json15
-rw-r--r--test/json-mapped/array-of-objects-header/map.json16
-rw-r--r--test/json-mapped/nested-repeats-2/check.txt25
-rw-r--r--test/json-mapped/nested-repeats-2/input.json20
-rw-r--r--test/json-mapped/nested-repeats-2/map.json24
-rw-r--r--test/json-mapped/nested-repeats/check.txt64
-rw-r--r--test/json-mapped/nested-repeats/input.json45
-rw-r--r--test/json-mapped/nested-repeats/map.json22
-rw-r--r--test/json-structure/arrays-in-object/check.txt4
-rw-r--r--test/json-structure/arrays-in-object/input.json10
-rw-r--r--test/json-structure/multiple-ranges/check.txt5
-rw-r--r--test/json-structure/multiple-ranges/input.json49
-rw-r--r--test/json-structure/nested-arrays-mixed-2/check.txt3
-rw-r--r--test/json-structure/nested-arrays-mixed-2/input.json15
-rw-r--r--test/json-structure/nested-arrays-mixed/check.txt3
-rw-r--r--test/json-structure/nested-arrays-mixed/input.json15
-rw-r--r--test/json-structure/nested-arrays/check.txt1
-rw-r--r--test/json-structure/nested-arrays/input.json5
-rw-r--r--test/json-structure/no-value-nodes/01.json1
-rw-r--r--test/json-structure/no-value-nodes/02.json1
-rw-r--r--test/json-structure/no-value-nodes/03.json1
-rw-r--r--test/json-structure/no-value-nodes/04.json1
-rw-r--r--test/json-structure/repeat-objects-2/check.txt6
-rw-r--r--test/json-structure/repeat-objects-2/input.json6
-rw-r--r--test/json-structure/repeat-objects/check.txt2
-rw-r--r--test/json-structure/repeat-objects/input.json6
-rw-r--r--test/json/basic1/check.txt8
-rw-r--r--test/json/basic1/input.json6
-rw-r--r--test/json/basic1/output.yaml4
-rw-r--r--test/json/basic2/check.txt44
-rw-r--r--test/json/basic2/input.json17
-rw-r--r--test/json/basic2/output.yaml15
-rw-r--r--test/json/basic3/check.txt29
-rw-r--r--test/json/basic3/input.json11
-rw-r--r--test/json/basic3/output.yaml10
-rw-r--r--test/json/basic4/check.txt14
-rw-r--r--test/json/basic4/input.json6
-rw-r--r--test/json/basic4/output.yaml4
-rw-r--r--test/json/empty-array-1/check.txt2
-rw-r--r--test/json/empty-array-1/input.json1
-rw-r--r--test/json/empty-array-2/check.txt2
-rw-r--r--test/json/empty-array-2/input.json1
-rw-r--r--test/json/empty-array-3/check.txt2
-rw-r--r--test/json/empty-array-3/input.json2
-rw-r--r--test/json/nested1/check.txt14
-rw-r--r--test/json/nested1/input.json2
-rw-r--r--test/json/nested1/output.yaml5
-rw-r--r--test/json/nested2/check.txt20
-rw-r--r--test/json/nested2/input.json6
-rw-r--r--test/json/nested2/output.yaml4
-rw-r--r--test/json/refs1/check.txt19
-rw-r--r--test/json/refs1/input.json4
-rw-r--r--test/json/refs1/ref.json2
-rw-r--r--test/json/swagger/check.txt546
-rw-r--r--test/json/swagger/input.json226
-rw-r--r--test/json/swagger/output.yaml155
-rw-r--r--test/json/to-yaml-1/check.txt14
-rw-r--r--test/json/to-yaml-1/input.json1
-rw-r--r--test/json/to-yaml-1/output.yaml4
-rw-r--r--test/json/validation/LICENSE21
-rw-r--r--test/json/validation/README1
-rw-r--r--test/json/validation/i_number_double_huge_neg_exp.json1
-rw-r--r--test/json/validation/i_number_huge_exp.json1
-rw-r--r--test/json/validation/i_number_neg_int_huge_exp.json1
-rw-r--r--test/json/validation/i_number_pos_double_huge_exp.json1
-rw-r--r--test/json/validation/i_number_real_neg_overflow.json1
-rw-r--r--test/json/validation/i_number_real_pos_overflow.json1
-rw-r--r--test/json/validation/i_number_real_underflow.json1
-rw-r--r--test/json/validation/i_number_too_big_neg_int.json1
-rw-r--r--test/json/validation/i_number_too_big_pos_int.json1
-rw-r--r--test/json/validation/i_number_very_big_negative_int.json1
-rw-r--r--test/json/validation/i_object_key_lone_2nd_surrogate.json1
-rw-r--r--test/json/validation/i_string_1st_surrogate_but_2nd_missing.json1
-rw-r--r--test/json/validation/i_string_1st_valid_surrogate_2nd_invalid.json1
-rw-r--r--test/json/validation/i_string_UTF-16LE_with_BOM.jsonbin0 -> 12 bytes
-rw-r--r--test/json/validation/i_string_UTF-8_invalid_sequence.json1
-rw-r--r--test/json/validation/i_string_UTF8_surrogate_U+D800.json1
-rw-r--r--test/json/validation/i_string_incomplete_surrogate_and_escape_valid.json1
-rw-r--r--test/json/validation/i_string_incomplete_surrogate_pair.json1
-rw-r--r--test/json/validation/i_string_incomplete_surrogates_escape_valid.json1
-rw-r--r--test/json/validation/i_string_invalid_lonely_surrogate.json1
-rw-r--r--test/json/validation/i_string_invalid_surrogate.json1
-rw-r--r--test/json/validation/i_string_invalid_utf-8.json1
-rw-r--r--test/json/validation/i_string_inverted_surrogates_U+1D11E.json1
-rw-r--r--test/json/validation/i_string_iso_latin_1.json1
-rw-r--r--test/json/validation/i_string_lone_second_surrogate.json1
-rw-r--r--test/json/validation/i_string_lone_utf8_continuation_byte.json1
-rw-r--r--test/json/validation/i_string_not_in_unicode_range.json1
-rw-r--r--test/json/validation/i_string_overlong_sequence_2_bytes.json1
-rw-r--r--test/json/validation/i_string_overlong_sequence_6_bytes.json1
-rw-r--r--test/json/validation/i_string_overlong_sequence_6_bytes_null.json1
-rw-r--r--test/json/validation/i_string_truncated-utf-8.json1
-rw-r--r--test/json/validation/i_string_utf16BE_no_BOM.jsonbin0 -> 10 bytes
-rw-r--r--test/json/validation/i_string_utf16LE_no_BOM.jsonbin0 -> 10 bytes
-rw-r--r--test/json/validation/i_structure_500_nested_arrays.json1
-rw-r--r--test/json/validation/i_structure_UTF-8_BOM_empty_object.json1
-rw-r--r--test/json/validation/n_array_1_true_without_comma.json1
-rw-r--r--test/json/validation/n_array_a_invalid_utf8.json1
-rw-r--r--test/json/validation/n_array_colon_instead_of_comma.json1
-rw-r--r--test/json/validation/n_array_comma_after_close.json1
-rw-r--r--test/json/validation/n_array_comma_and_number.json1
-rw-r--r--test/json/validation/n_array_double_comma.json1
-rw-r--r--test/json/validation/n_array_double_extra_comma.json1
-rw-r--r--test/json/validation/n_array_extra_close.json1
-rw-r--r--test/json/validation/n_array_extra_comma.json1
-rw-r--r--test/json/validation/n_array_incomplete.json1
-rw-r--r--test/json/validation/n_array_incomplete_invalid_value.json1
-rw-r--r--test/json/validation/n_array_inner_array_no_comma.json1
-rw-r--r--test/json/validation/n_array_invalid_utf8.json1
-rw-r--r--test/json/validation/n_array_items_separated_by_semicolon.json1
-rw-r--r--test/json/validation/n_array_just_comma.json1
-rw-r--r--test/json/validation/n_array_just_minus.json1
-rw-r--r--test/json/validation/n_array_missing_value.json1
-rw-r--r--test/json/validation/n_array_newlines_unclosed.json3
-rw-r--r--test/json/validation/n_array_number_and_comma.json1
-rw-r--r--test/json/validation/n_array_number_and_several_commas.json1
-rw-r--r--test/json/validation/n_array_spaces_vertical_tab_formfeed.json1
-rw-r--r--test/json/validation/n_array_star_inside.json1
-rw-r--r--test/json/validation/n_array_unclosed.json1
-rw-r--r--test/json/validation/n_array_unclosed_trailing_comma.json1
-rw-r--r--test/json/validation/n_array_unclosed_with_new_lines.json3
-rw-r--r--test/json/validation/n_array_unclosed_with_object_inside.json1
-rw-r--r--test/json/validation/n_incomplete_false.json1
-rw-r--r--test/json/validation/n_incomplete_null.json1
-rw-r--r--test/json/validation/n_incomplete_true.json1
-rw-r--r--test/json/validation/n_multidigit_number_then_00.jsonbin0 -> 4 bytes
-rw-r--r--test/json/validation/n_number_++.json1
-rw-r--r--test/json/validation/n_number_+1.json1
-rw-r--r--test/json/validation/n_number_+Inf.json1
-rw-r--r--test/json/validation/n_number_-01.json1
-rw-r--r--test/json/validation/n_number_-1.0..json1
-rw-r--r--test/json/validation/n_number_-2..json1
-rw-r--r--test/json/validation/n_number_-NaN.json1
-rw-r--r--test/json/validation/n_number_.-1.json1
-rw-r--r--test/json/validation/n_number_.2e-3.json1
-rw-r--r--test/json/validation/n_number_0.1.2.json1
-rw-r--r--test/json/validation/n_number_0.3e+.json1
-rw-r--r--test/json/validation/n_number_0.3e.json1
-rw-r--r--test/json/validation/n_number_0.e1.json1
-rw-r--r--test/json/validation/n_number_0_capital_E+.json1
-rw-r--r--test/json/validation/n_number_0_capital_E.json1
-rw-r--r--test/json/validation/n_number_0e+.json1
-rw-r--r--test/json/validation/n_number_0e.json1
-rw-r--r--test/json/validation/n_number_1.0e+.json1
-rw-r--r--test/json/validation/n_number_1.0e-.json1
-rw-r--r--test/json/validation/n_number_1.0e.json1
-rw-r--r--test/json/validation/n_number_1_000.json1
-rw-r--r--test/json/validation/n_number_1eE2.json1
-rw-r--r--test/json/validation/n_number_2.e+3.json1
-rw-r--r--test/json/validation/n_number_2.e-3.json1
-rw-r--r--test/json/validation/n_number_2.e3.json1
-rw-r--r--test/json/validation/n_number_9.e+.json1
-rw-r--r--test/json/validation/n_number_Inf.json1
-rw-r--r--test/json/validation/n_number_NaN.json1
-rw-r--r--test/json/validation/n_number_U+FF11_fullwidth_digit_one.json1
-rw-r--r--test/json/validation/n_number_expression.json1
-rw-r--r--test/json/validation/n_number_hex_1_digit.json1
-rw-r--r--test/json/validation/n_number_hex_2_digits.json1
-rw-r--r--test/json/validation/n_number_infinity.json1
-rw-r--r--test/json/validation/n_number_invalid+-.json1
-rw-r--r--test/json/validation/n_number_invalid-negative-real.json1
-rw-r--r--test/json/validation/n_number_invalid-utf-8-in-bigger-int.json1
-rw-r--r--test/json/validation/n_number_invalid-utf-8-in-exponent.json1
-rw-r--r--test/json/validation/n_number_invalid-utf-8-in-int.json1
-rw-r--r--test/json/validation/n_number_minus_infinity.json1
-rw-r--r--test/json/validation/n_number_minus_sign_with_trailing_garbage.json1
-rw-r--r--test/json/validation/n_number_minus_space_1.json1
-rw-r--r--test/json/validation/n_number_neg_int_starting_with_zero.json1
-rw-r--r--test/json/validation/n_number_neg_real_without_int_part.json1
-rw-r--r--test/json/validation/n_number_neg_with_garbage_at_end.json1
-rw-r--r--test/json/validation/n_number_real_garbage_after_e.json1
-rw-r--r--test/json/validation/n_number_real_with_invalid_utf8_after_e.json1
-rw-r--r--test/json/validation/n_number_real_without_fractional_part.json1
-rw-r--r--test/json/validation/n_number_starting_with_dot.json1
-rw-r--r--test/json/validation/n_number_with_alpha.json1
-rw-r--r--test/json/validation/n_number_with_alpha_char.json1
-rw-r--r--test/json/validation/n_number_with_leading_zero.json1
-rw-r--r--test/json/validation/n_object_bad_value.json1
-rw-r--r--test/json/validation/n_object_bracket_key.json1
-rw-r--r--test/json/validation/n_object_comma_instead_of_colon.json1
-rw-r--r--test/json/validation/n_object_double_colon.json1
-rw-r--r--test/json/validation/n_object_emoji.json1
-rw-r--r--test/json/validation/n_object_garbage_at_end.json1
-rw-r--r--test/json/validation/n_object_key_with_single_quotes.json1
-rw-r--r--test/json/validation/n_object_lone_continuation_byte_in_key_and_trailing_comma.json1
-rw-r--r--test/json/validation/n_object_missing_colon.json1
-rw-r--r--test/json/validation/n_object_missing_key.json1
-rw-r--r--test/json/validation/n_object_missing_semicolon.json1
-rw-r--r--test/json/validation/n_object_missing_value.json1
-rw-r--r--test/json/validation/n_object_no-colon.json1
-rw-r--r--test/json/validation/n_object_non_string_key.json1
-rw-r--r--test/json/validation/n_object_non_string_key_but_huge_number_instead.json1
-rw-r--r--test/json/validation/n_object_repeated_null_null.json1
-rw-r--r--test/json/validation/n_object_several_trailing_commas.json1
-rw-r--r--test/json/validation/n_object_single_quote.json1
-rw-r--r--test/json/validation/n_object_trailing_comma.json1
-rw-r--r--test/json/validation/n_object_trailing_comment.json1
-rw-r--r--test/json/validation/n_object_trailing_comment_open.json1
-rw-r--r--test/json/validation/n_object_trailing_comment_slash_open.json1
-rw-r--r--test/json/validation/n_object_trailing_comment_slash_open_incomplete.json1
-rw-r--r--test/json/validation/n_object_two_commas_in_a_row.json1
-rw-r--r--test/json/validation/n_object_unquoted_key.json1
-rw-r--r--test/json/validation/n_object_unterminated-value.json1
-rw-r--r--test/json/validation/n_object_with_single_string.json1
-rw-r--r--test/json/validation/n_object_with_trailing_garbage.json1
-rw-r--r--test/json/validation/n_single_space.json1
-rw-r--r--test/json/validation/n_string_1_surrogate_then_escape.json1
-rw-r--r--test/json/validation/n_string_1_surrogate_then_escape_u.json1
-rw-r--r--test/json/validation/n_string_1_surrogate_then_escape_u1.json1
-rw-r--r--test/json/validation/n_string_1_surrogate_then_escape_u1x.json1
-rw-r--r--test/json/validation/n_string_accentuated_char_no_quotes.json1
-rw-r--r--test/json/validation/n_string_backslash_00.jsonbin0 -> 6 bytes
-rw-r--r--test/json/validation/n_string_escape_x.json1
-rw-r--r--test/json/validation/n_string_escaped_backslash_bad.json1
-rw-r--r--test/json/validation/n_string_escaped_ctrl_char_tab.json1
-rw-r--r--test/json/validation/n_string_escaped_emoji.json1
-rw-r--r--test/json/validation/n_string_incomplete_escape.json1
-rw-r--r--test/json/validation/n_string_incomplete_escaped_character.json1
-rw-r--r--test/json/validation/n_string_incomplete_surrogate.json1
-rw-r--r--test/json/validation/n_string_incomplete_surrogate_escape_invalid.json1
-rw-r--r--test/json/validation/n_string_invalid-utf-8-in-escape.json1
-rw-r--r--test/json/validation/n_string_invalid_backslash_esc.json1
-rw-r--r--test/json/validation/n_string_invalid_unicode_escape.json1
-rw-r--r--test/json/validation/n_string_invalid_utf8_after_escape.json1
-rw-r--r--test/json/validation/n_string_leading_uescaped_thinspace.json1
-rw-r--r--test/json/validation/n_string_no_quotes_with_bad_escape.json1
-rw-r--r--test/json/validation/n_string_single_doublequote.json1
-rw-r--r--test/json/validation/n_string_single_quote.json1
-rw-r--r--test/json/validation/n_string_single_string_no_double_quotes.json1
-rw-r--r--test/json/validation/n_string_start_escape_unclosed.json1
-rw-r--r--test/json/validation/n_string_unescaped_crtl_char.jsonbin0 -> 7 bytes
-rw-r--r--test/json/validation/n_string_unescaped_newline.json2
-rw-r--r--test/json/validation/n_string_unescaped_tab.json1
-rw-r--r--test/json/validation/n_string_unicode_CapitalU.json1
-rw-r--r--test/json/validation/n_string_with_trailing_garbage.json1
-rw-r--r--test/json/validation/n_structure_100000_opening_arrays.json1
-rw-r--r--test/json/validation/n_structure_U+2060_word_joined.json1
-rw-r--r--test/json/validation/n_structure_UTF8_BOM_no_data.json1
-rw-r--r--test/json/validation/n_structure_angle_bracket_..json1
-rw-r--r--test/json/validation/n_structure_angle_bracket_null.json1
-rw-r--r--test/json/validation/n_structure_array_trailing_garbage.json1
-rw-r--r--test/json/validation/n_structure_array_with_extra_array_close.json1
-rw-r--r--test/json/validation/n_structure_array_with_unclosed_string.json1
-rw-r--r--test/json/validation/n_structure_ascii-unicode-identifier.json1
-rw-r--r--test/json/validation/n_structure_capitalized_True.json1
-rw-r--r--test/json/validation/n_structure_close_unopened_array.json1
-rw-r--r--test/json/validation/n_structure_comma_instead_of_closing_brace.json1
-rw-r--r--test/json/validation/n_structure_double_array.json1
-rw-r--r--test/json/validation/n_structure_end_array.json1
-rw-r--r--test/json/validation/n_structure_incomplete_UTF8_BOM.json1
-rw-r--r--test/json/validation/n_structure_lone-invalid-utf-8.json1
-rw-r--r--test/json/validation/n_structure_lone-open-bracket.json1
-rw-r--r--test/json/validation/n_structure_no_data.json0
-rw-r--r--test/json/validation/n_structure_null-byte-outside-string.jsonbin0 -> 3 bytes
-rw-r--r--test/json/validation/n_structure_number_with_trailing_garbage.json1
-rw-r--r--test/json/validation/n_structure_object_followed_by_closing_object.json1
-rw-r--r--test/json/validation/n_structure_object_unclosed_no_value.json1
-rw-r--r--test/json/validation/n_structure_object_with_comment.json1
-rw-r--r--test/json/validation/n_structure_object_with_trailing_garbage.json1
-rw-r--r--test/json/validation/n_structure_open_array_apostrophe.json1
-rw-r--r--test/json/validation/n_structure_open_array_comma.json1
-rw-r--r--test/json/validation/n_structure_open_array_object.json1
-rw-r--r--test/json/validation/n_structure_open_array_open_object.json1
-rw-r--r--test/json/validation/n_structure_open_array_open_string.json1
-rw-r--r--test/json/validation/n_structure_open_array_string.json1
-rw-r--r--test/json/validation/n_structure_open_object.json1
-rw-r--r--test/json/validation/n_structure_open_object_close_array.json1
-rw-r--r--test/json/validation/n_structure_open_object_comma.json1
-rw-r--r--test/json/validation/n_structure_open_object_open_array.json1
-rw-r--r--test/json/validation/n_structure_open_object_open_string.json1
-rw-r--r--test/json/validation/n_structure_open_object_string_with_apostrophes.json1
-rw-r--r--test/json/validation/n_structure_open_open.json1
-rw-r--r--test/json/validation/n_structure_single_eacute.json1
-rw-r--r--test/json/validation/n_structure_single_star.json1
-rw-r--r--test/json/validation/n_structure_trailing_#.json1
-rw-r--r--test/json/validation/n_structure_uescaped_LF_before_string.json1
-rw-r--r--test/json/validation/n_structure_unclosed_array.json1
-rw-r--r--test/json/validation/n_structure_unclosed_array_partial_null.json1
-rw-r--r--test/json/validation/n_structure_unclosed_array_unfinished_false.json1
-rw-r--r--test/json/validation/n_structure_unclosed_array_unfinished_true.json1
-rw-r--r--test/json/validation/n_structure_unclosed_object.json1
-rw-r--r--test/json/validation/n_structure_unicode-identifier.json1
-rw-r--r--test/json/validation/n_structure_whitespace_U+2060_word_joiner.json1
-rw-r--r--test/json/validation/n_structure_whitespace_formfeed.json1
-rw-r--r--test/json/validation/y_array_arraysWithSpaces.json1
-rw-r--r--test/json/validation/y_array_empty-string.json1
-rw-r--r--test/json/validation/y_array_empty.json1
-rw-r--r--test/json/validation/y_array_ending_with_newline.json1
-rw-r--r--test/json/validation/y_array_false.json1
-rw-r--r--test/json/validation/y_array_heterogeneous.json1
-rw-r--r--test/json/validation/y_array_null.json1
-rw-r--r--test/json/validation/y_array_with_1_and_newline.json2
-rw-r--r--test/json/validation/y_array_with_leading_space.json1
-rw-r--r--test/json/validation/y_array_with_several_null.json1
-rw-r--r--test/json/validation/y_array_with_trailing_space.json1
-rw-r--r--test/json/validation/y_number.json1
-rw-r--r--test/json/validation/y_number_0e+1.json1
-rw-r--r--test/json/validation/y_number_0e1.json1
-rw-r--r--test/json/validation/y_number_after_space.json1
-rw-r--r--test/json/validation/y_number_double_close_to_zero.json1
-rw-r--r--test/json/validation/y_number_int_with_exp.json1
-rw-r--r--test/json/validation/y_number_minus_zero.json1
-rw-r--r--test/json/validation/y_number_negative_int.json1
-rw-r--r--test/json/validation/y_number_negative_one.json1
-rw-r--r--test/json/validation/y_number_negative_zero.json1
-rw-r--r--test/json/validation/y_number_real_capital_e.json1
-rw-r--r--test/json/validation/y_number_real_capital_e_neg_exp.json1
-rw-r--r--test/json/validation/y_number_real_capital_e_pos_exp.json1
-rw-r--r--test/json/validation/y_number_real_exponent.json1
-rw-r--r--test/json/validation/y_number_real_fraction_exponent.json1
-rw-r--r--test/json/validation/y_number_real_neg_exp.json1
-rw-r--r--test/json/validation/y_number_real_pos_exponent.json1
-rw-r--r--test/json/validation/y_number_simple_int.json1
-rw-r--r--test/json/validation/y_number_simple_real.json1
-rw-r--r--test/json/validation/y_object.json1
-rw-r--r--test/json/validation/y_object_basic.json1
-rw-r--r--test/json/validation/y_object_duplicated_key.json1
-rw-r--r--test/json/validation/y_object_duplicated_key_and_value.json1
-rw-r--r--test/json/validation/y_object_empty.json1
-rw-r--r--test/json/validation/y_object_empty_key.json1
-rw-r--r--test/json/validation/y_object_escaped_null_in_key.json1
-rw-r--r--test/json/validation/y_object_extreme_numbers.json1
-rw-r--r--test/json/validation/y_object_long_strings.json1
-rw-r--r--test/json/validation/y_object_simple.json1
-rw-r--r--test/json/validation/y_object_string_unicode.json1
-rw-r--r--test/json/validation/y_object_with_newlines.json3
-rw-r--r--test/json/validation/y_string_1_2_3_bytes_UTF-8_sequences.json1
-rw-r--r--test/json/validation/y_string_accepted_surrogate_pair.json1
-rw-r--r--test/json/validation/y_string_accepted_surrogate_pairs.json1
-rw-r--r--test/json/validation/y_string_allowed_escapes.json1
-rw-r--r--test/json/validation/y_string_backslash_and_u_escaped_zero.json1
-rw-r--r--test/json/validation/y_string_backslash_doublequotes.json1
-rw-r--r--test/json/validation/y_string_comments.json1
-rw-r--r--test/json/validation/y_string_double_escape_a.json1
-rw-r--r--test/json/validation/y_string_double_escape_n.json1
-rw-r--r--test/json/validation/y_string_escaped_control_character.json1
-rw-r--r--test/json/validation/y_string_escaped_noncharacter.json1
-rw-r--r--test/json/validation/y_string_in_array.json1
-rw-r--r--test/json/validation/y_string_in_array_with_leading_space.json1
-rw-r--r--test/json/validation/y_string_last_surrogates_1_and_2.json1
-rw-r--r--test/json/validation/y_string_nbsp_uescaped.json1
-rw-r--r--test/json/validation/y_string_nonCharacterInUTF-8_U+10FFFF.json1
-rw-r--r--test/json/validation/y_string_nonCharacterInUTF-8_U+FFFF.json1
-rw-r--r--test/json/validation/y_string_null_escape.json1
-rw-r--r--test/json/validation/y_string_one-byte-utf-8.json1
-rw-r--r--test/json/validation/y_string_pi.json1
-rw-r--r--test/json/validation/y_string_reservedCharacterInUTF-8_U+1BFFF.json1
-rw-r--r--test/json/validation/y_string_simple_ascii.json1
-rw-r--r--test/json/validation/y_string_space.json1
-rw-r--r--test/json/validation/y_string_surrogates_U+1D11E_MUSICAL_SYMBOL_G_CLEF.json1
-rw-r--r--test/json/validation/y_string_three-byte-utf-8.json1
-rw-r--r--test/json/validation/y_string_two-byte-utf-8.json1
-rw-r--r--test/json/validation/y_string_u+2028_line_sep.json1
-rw-r--r--test/json/validation/y_string_u+2029_par_sep.json1
-rw-r--r--test/json/validation/y_string_uEscape.json1
-rw-r--r--test/json/validation/y_string_uescaped_newline.json1
-rw-r--r--test/json/validation/y_string_unescaped_char_delete.json1
-rw-r--r--test/json/validation/y_string_unicode.json1
-rw-r--r--test/json/validation/y_string_unicodeEscapedBackslash.json1
-rw-r--r--test/json/validation/y_string_unicode_2.json1
-rw-r--r--test/json/validation/y_string_unicode_U+10FFFE_nonchar.json1
-rw-r--r--test/json/validation/y_string_unicode_U+1FFFE_nonchar.json1
-rw-r--r--test/json/validation/y_string_unicode_U+200B_ZERO_WIDTH_SPACE.json1
-rw-r--r--test/json/validation/y_string_unicode_U+2064_invisible_plus.json1
-rw-r--r--test/json/validation/y_string_unicode_U+FDD0_nonchar.json1
-rw-r--r--test/json/validation/y_string_unicode_U+FFFE_nonchar.json1
-rw-r--r--test/json/validation/y_string_unicode_escaped_double_quote.json1
-rw-r--r--test/json/validation/y_string_utf8.json1
-rw-r--r--test/json/validation/y_string_with_del_character.json1
-rw-r--r--test/json/validation/y_structure_lonely_false.json1
-rw-r--r--test/json/validation/y_structure_lonely_int.json1
-rw-r--r--test/json/validation/y_structure_lonely_negative_real.json1
-rw-r--r--test/json/validation/y_structure_lonely_null.json1
-rw-r--r--test/json/validation/y_structure_lonely_string.json1
-rw-r--r--test/json/validation/y_structure_lonely_true.json1
-rw-r--r--test/json/validation/y_structure_string_empty.json1
-rw-r--r--test/json/validation/y_structure_trailing_newline.json1
-rw-r--r--test/json/validation/y_structure_true_in_array.json1
-rw-r--r--test/json/validation/y_structure_whitespace_array.json1
-rw-r--r--test/ods/borders/grid-box.odsbin0 -> 8246 bytes
-rw-r--r--test/ods/borders/single-cells.odsbin0 -> 10311 bytes
-rw-r--r--test/ods/cell-properties/wrap-and-shrink.odsbin0 -> 12729 bytes
-rw-r--r--test/ods/column-width-row-height/input.odsbin0 -> 9861 bytes
-rw-r--r--test/ods/date-cell/input.odsbin0 -> 9050 bytes
-rw-r--r--test/ods/formatted-text/bold-and-italic.odsbin0 -> 13066 bytes
-rw-r--r--test/ods/formula-1/check.txt4
-rw-r--r--test/ods/formula-1/input.odsbin0 -> 7722 bytes
-rw-r--r--test/ods/formula-2/check.txt21
-rw-r--r--test/ods/formula-2/input.odsbin0 -> 10282 bytes
-rw-r--r--test/ods/import-styles/cell-protection.xml17
-rw-r--r--test/ods/import-styles/cell-styles.xml43
-rw-r--r--test/ods/import-styles/standard-styles.xml64
-rw-r--r--test/ods/japanese.odsbin0 -> 7810 bytes
-rw-r--r--test/ods/named-expression-sheet-local/check.txt24
-rw-r--r--test/ods/named-expression-sheet-local/input.odsbin0 -> 10209 bytes
-rw-r--r--test/ods/named-expression/check.txt14
-rw-r--r--test/ods/named-expression/input.odsbin0 -> 8582 bytes
-rw-r--r--test/ods/named-range/check.txt36
-rw-r--r--test/ods/named-range/input.odsbin0 -> 11252 bytes
-rw-r--r--test/ods/number-format/basic-set.odsbin0 -> 18601 bytes
-rw-r--r--test/ods/raw-values-1/check.txt25
-rw-r--r--test/ods/raw-values-1/input.odsbin0 -> 10425 bytes
-rw-r--r--test/ods/styles/asian-complex.odsbin0 -> 12366 bytes
-rw-r--r--test/ods/styles/column-styles.odsbin0 -> 13259 bytes
-rw-r--r--test/ods/styles/direct-format.odsbin0 -> 11171 bytes
-rw-r--r--test/ods/styles/text-underlines.odsbin0 -> 26122 bytes
-rw-r--r--test/ods/test.odsbin0 -> 599111 bytes
-rw-r--r--test/parquet/basic/basic-gzip.parquetbin0 -> 4951 bytes
-rw-r--r--test/parquet/basic/basic-gzip.parquet.check66
-rw-r--r--test/parquet/basic/basic-nocomp.parquetbin0 -> 4907 bytes
-rw-r--r--test/parquet/basic/basic-nocomp.parquet.check66
-rw-r--r--test/parquet/basic/basic-snappy.parquetbin0 -> 4851 bytes
-rw-r--r--test/parquet/basic/basic-snappy.parquet.check66
-rw-r--r--test/parquet/basic/basic-zstd.parquetbin0 -> 4894 bytes
-rw-r--r--test/parquet/basic/basic-zstd.parquet.check66
-rw-r--r--test/parquet/basic/float-with-nan.parquetbin0 -> 1784 bytes
-rw-r--r--test/parquet/basic/float-with-nan.parquet.check4
-rw-r--r--test/python/env.json.in6
-rw-r--r--test/python/file_load_common.py248
-rwxr-xr-xtest/python/perf/test_json.py273
-rwxr-xr-xtest/python/test_csv.py47
-rwxr-xr-xtest/python/test_csv_export.py107
-rwxr-xr-xtest/python/test_gnumeric.py39
-rwxr-xr-xtest/python/test_json.py45
-rwxr-xr-xtest/python/test_module.py56
-rwxr-xr-xtest/python/test_ods.py164
-rwxr-xr-xtest/python/test_xls_xml.py80
-rwxr-xr-xtest/python/test_xlsx.py103
-rw-r--r--test/xls-xml/background-color/standard.xml150
-rw-r--r--test/xls-xml/basic-utf-16-be/check.txt27
-rw-r--r--test/xls-xml/basic-utf-16-be/input.xmlbin0 -> 7898 bytes
-rw-r--r--test/xls-xml/basic-utf-16-le/check.txt27
-rw-r--r--test/xls-xml/basic-utf-16-le/input.xmlbin0 -> 7898 bytes
-rw-r--r--test/xls-xml/basic/check.txt27
-rw-r--r--test/xls-xml/basic/input.xml112
-rw-r--r--test/xls-xml/bold-and-italic/check.txt5
-rw-r--r--test/xls-xml/bold-and-italic/input.xml120
-rw-r--r--test/xls-xml/borders/colors.xml109
-rw-r--r--test/xls-xml/borders/directions.xml121
-rw-r--r--test/xls-xml/borders/grid-box.xml237
-rw-r--r--test/xls-xml/borders/single-cells.xml202
-rw-r--r--test/xls-xml/cell-properties/default-style.xml89
-rw-r--r--test/xls-xml/cell-properties/locked-and-hidden.xml83
-rw-r--r--test/xls-xml/cell-properties/wrap-and-shrink.xml82
-rw-r--r--test/xls-xml/character-set/input.xml112
-rw-r--r--test/xls-xml/colored-text/check.txt13
-rw-r--r--test/xls-xml/colored-text/input.xml136
-rw-r--r--test/xls-xml/column-width-row-height/input.xml140
-rw-r--r--test/xls-xml/date-time/input.xml86
-rw-r--r--test/xls-xml/double-bom/input.xml58050
-rw-r--r--test/xls-xml/empty-rows/check.txt7
-rw-r--r--test/xls-xml/empty-rows/input.xml79
-rw-r--r--test/xls-xml/formatted-text/basic.xml241
-rw-r--r--test/xls-xml/formula-array-1/check.txt23
-rw-r--r--test/xls-xml/formula-array-1/input.xml99
-rw-r--r--test/xls-xml/formula-cells-1/check.txt7
-rw-r--r--test/xls-xml/formula-cells-1/input.xml73
-rw-r--r--test/xls-xml/formula-cells-2/check.txt41
-rw-r--r--test/xls-xml/formula-cells-2/config.yaml3
-rw-r--r--test/xls-xml/formula-cells-2/input.xml198
-rw-r--r--test/xls-xml/formula-cells-3/check.txt6
-rw-r--r--test/xls-xml/formula-cells-3/input.xml98
-rw-r--r--test/xls-xml/formula-cells-parse-error/input.xml73
-rw-r--r--test/xls-xml/hidden-rows-columns/input.xml115
-rw-r--r--test/xls-xml/invalid-sub-structure/check.txt25
-rw-r--r--test/xls-xml/invalid-sub-structure/input.xml135
-rw-r--r--test/xls-xml/leading-whitespace/check.txt27
-rw-r--r--test/xls-xml/leading-whitespace/input.xml112
-rw-r--r--test/xls-xml/matrix-results/input.xml81
-rw-r--r--test/xls-xml/merged-cells/check.txt16
-rw-r--r--test/xls-xml/merged-cells/input.xml101
-rw-r--r--test/xls-xml/named-colors/check.txt282
-rw-r--r--test/xls-xml/named-colors/input-upper.xml1170
-rw-r--r--test/xls-xml/named-colors/input.xml1170
-rwxr-xr-xtest/xls-xml/named-colors/run.py55
-rw-r--r--test/xls-xml/named-colors/saved-by-excel.xml1170
-rw-r--r--test/xls-xml/named-expression-sheet-local/check.txt22
-rw-r--r--test/xls-xml/named-expression-sheet-local/input.xml131
-rw-r--r--test/xls-xml/named-expression/check.txt12
-rw-r--r--test/xls-xml/named-expression/input.xml92
-rw-r--r--test/xls-xml/number-format/date-time.xml244
-rw-r--r--test/xls-xml/raw-values-1/check.txt25
-rw-r--r--test/xls-xml/raw-values-1/input.xml131
-rw-r--r--test/xls-xml/styles/column-styles.xml175
-rw-r--r--test/xls-xml/styles/data-offset.xml28
-rw-r--r--test/xls-xml/styles/direct-format.xml97
-rw-r--r--test/xls-xml/table-offset/check.txt7
-rw-r--r--test/xls-xml/table-offset/input.xml50
-rw-r--r--test/xls-xml/table/autofilter.xml180
-rw-r--r--test/xls-xml/text-alignment/input.xml290
-rw-r--r--test/xls-xml/unnamed-parent-styles/check.txt37
-rw-r--r--test/xls-xml/unnamed-parent-styles/input.xml447
-rw-r--r--test/xls-xml/view/cursor-per-sheet.xml164
-rw-r--r--test/xls-xml/view/cursor-split-pane.xml270
-rw-r--r--test/xls-xml/view/frozen-pane.xml155
-rw-r--r--test/xlsx/background-color/standard.xlsxbin0 -> 8676 bytes
-rw-r--r--test/xlsx/boolean-values/check.txt3
-rw-r--r--test/xlsx/boolean-values/input.xlsxbin0 -> 8272 bytes
-rw-r--r--test/xlsx/borders/colors.xlsxbin0 -> 9753 bytes
-rw-r--r--test/xlsx/borders/directions.xlsxbin0 -> 9726 bytes
-rw-r--r--test/xlsx/borders/grid-box.xlsxbin0 -> 9562 bytes
-rw-r--r--test/xlsx/borders/single-cells.xlsxbin0 -> 8489 bytes
-rw-r--r--test/xlsx/cell-properties/wrap-and-shrink.xlsxbin0 -> 9928 bytes
-rw-r--r--test/xlsx/column-width-row-height/input.xlsxbin0 -> 9966 bytes
-rw-r--r--test/xlsx/conditional-format/basic.xlsxbin0 -> 13482 bytes
-rw-r--r--test/xlsx/conditional-format/data-bars.xlsxbin0 -> 11334 bytes
-rw-r--r--test/xlsx/data-table/multi-table.xlsxbin0 -> 9578 bytes
-rw-r--r--test/xlsx/data-table/one-variable.xlsxbin0 -> 9018 bytes
-rw-r--r--test/xlsx/date-cell/input.xlsxbin0 -> 7965 bytes
-rw-r--r--test/xlsx/date-time/input.xlsxbin0 -> 8358 bytes
-rw-r--r--test/xlsx/doc-structure/unordered-sheet-positions.xlsxbin0 -> 12924 bytes
-rw-r--r--test/xlsx/empty-shared-strings/check.txt8
-rw-r--r--test/xlsx/empty-shared-strings/input.xlsxbin0 -> 8246 bytes
-rw-r--r--test/xlsx/formatted-text/basic.xlsxbin0 -> 11637 bytes
-rw-r--r--test/xlsx/formatted-text/bold-and-italic.xlsxbin0 -> 9343 bytes
-rw-r--r--test/xlsx/formatted-text/colored-text.xlsxbin0 -> 8780 bytes
-rw-r--r--test/xlsx/formula-array-1/check.txt23
-rw-r--r--test/xlsx/formula-array-1/input.xlsxbin0 -> 8794 bytes
-rw-r--r--test/xlsx/formula-cells/check.txt7
-rw-r--r--test/xlsx/formula-cells/input.xlsxbin0 -> 8460 bytes
-rw-r--r--test/xlsx/formula-shared/check.txt29
-rw-r--r--test/xlsx/formula-shared/input.xlsxbin0 -> 8606 bytes
-rw-r--r--test/xlsx/formula-simple.xlsxbin0 -> 8476 bytes
-rw-r--r--test/xlsx/formula-with-string-results/check.txt33
-rw-r--r--test/xlsx/formula-with-string-results/input.xlsxbin0 -> 9384 bytes
-rw-r--r--test/xlsx/hidden-rows-columns/input.xlsxbin0 -> 9250 bytes
-rw-r--r--test/xlsx/matrix-results/input.xlsxbin0 -> 8514 bytes
-rw-r--r--test/xlsx/merged-cells/simple.xlsxbin0 -> 9456 bytes
-rwxr-xr-xtest/xlsx/named-expression-relative/input.xlsxbin0 -> 8321 bytes
-rw-r--r--test/xlsx/named-expression-sheet-local/check.txt22
-rw-r--r--test/xlsx/named-expression-sheet-local/input.xlsxbin0 -> 8921 bytes
-rw-r--r--test/xlsx/named-expression/check.txt12
-rw-r--r--test/xlsx/named-expression/input.xlsxbin0 -> 8209 bytes
-rw-r--r--test/xlsx/number-format/date-time.xlsxbin0 -> 9514 bytes
-rw-r--r--test/xlsx/pivot-table/chart-simple.xlsxbin0 -> 17470 bytes
-rw-r--r--test/xlsx/pivot-table/error-values.xlsxbin0 -> 11808 bytes
-rw-r--r--test/xlsx/pivot-table/group-by-dates.xlsxbin0 -> 14268 bytes
-rw-r--r--test/xlsx/pivot-table/group-by-numbers.xlsxbin0 -> 12059 bytes
-rw-r--r--test/xlsx/pivot-table/group-field.xlsxbin0 -> 13165 bytes
-rw-r--r--test/xlsx/pivot-table/many-fields.xlsxbin0 -> 12556 bytes
-rw-r--r--test/xlsx/pivot-table/mixed-type-field.xlsxbin0 -> 15206 bytes
-rw-r--r--test/xlsx/pivot-table/three-pivot-tables-on-one-sheet.xlsxbin0 -> 17103 bytes
-rw-r--r--test/xlsx/pivot-table/two-pivot-caches.xlsxbin0 -> 15538 bytes
-rw-r--r--test/xlsx/pivot-table/two-tables-one-source.xlsxbin0 -> 13496 bytes
-rw-r--r--test/xlsx/raw-values-1/check.txt25
-rw-r--r--test/xlsx/raw-values-1/input.xlsxbin0 -> 8127 bytes
-rwxr-xr-xtest/xlsx/revision/cell-change-basic.xlsxbin0 -> 15414 bytes
-rw-r--r--test/xlsx/styles/column-styles.xlsxbin0 -> 10289 bytes
-rw-r--r--test/xlsx/styles/direct-format.xlsxbin0 -> 10259 bytes
-rw-r--r--test/xlsx/table/autofilter-text-filter-1.xlsxbin0 -> 9115 bytes
-rw-r--r--test/xlsx/table/autofilter.xlsxbin0 -> 8742 bytes
-rw-r--r--test/xlsx/table/table-1.xlsxbin0 -> 9244 bytes
-rw-r--r--test/xlsx/table/table-2.xlsxbin0 -> 9325 bytes
-rw-r--r--test/xlsx/test.xlsxbin0 -> 12152 bytes
-rw-r--r--test/xlsx/text-alignment/input.xlsxbin0 -> 11421 bytes
-rw-r--r--test/xlsx/view/cursor-per-sheet.xlsxbin0 -> 11521 bytes
-rw-r--r--test/xlsx/view/cursor-split-pane.xlsxbin0 -> 12033 bytes
-rw-r--r--test/xlsx/view/frozen-pane.xlsxbin0 -> 9742 bytes
-rw-r--r--test/xml-mapped/attribute-basic/check-nomap.txt30
-rw-r--r--test/xml-mapped/attribute-basic/check.txt34
-rw-r--r--test/xml-mapped/attribute-basic/input.xml14
-rw-r--r--test/xml-mapped/attribute-basic/map.xml16
-rw-r--r--test/xml-mapped/attribute-namespace-2/check-nomap.txt12
-rw-r--r--test/xml-mapped/attribute-namespace-2/check.txt12
-rw-r--r--test/xml-mapped/attribute-namespace-2/input.xml8
-rw-r--r--test/xml-mapped/attribute-namespace-2/map.xml12
-rw-r--r--test/xml-mapped/attribute-namespace/check-nomap.txt12
-rw-r--r--test/xml-mapped/attribute-namespace/check.txt12
-rw-r--r--test/xml-mapped/attribute-namespace/input.xml8
-rw-r--r--test/xml-mapped/attribute-namespace/map.xml12
-rw-r--r--test/xml-mapped/attribute-range-self-close/check-nomap.txt24
-rw-r--r--test/xml-mapped/attribute-range-self-close/check.txt24
-rw-r--r--test/xml-mapped/attribute-range-self-close/input.xml8
-rw-r--r--test/xml-mapped/attribute-range-self-close/map.xml11
-rw-r--r--test/xml-mapped/attribute-single-element-2/check.txt2
-rw-r--r--test/xml-mapped/attribute-single-element-2/input.xml2
-rw-r--r--test/xml-mapped/attribute-single-element-2/map.xml6
-rw-r--r--test/xml-mapped/attribute-single-element/check.txt2
-rw-r--r--test/xml-mapped/attribute-single-element/input.xml2
-rw-r--r--test/xml-mapped/attribute-single-element/map.xml6
-rw-r--r--test/xml-mapped/content-basic/check-nomap.txt24
-rw-r--r--test/xml-mapped/content-basic/check.txt27
-rw-r--r--test/xml-mapped/content-basic/input.xml27
-rw-r--r--test/xml-mapped/content-basic/map.xml14
-rw-r--r--test/xml-mapped/content-namespace-2/check-nomap.txt12
-rw-r--r--test/xml-mapped/content-namespace-2/check.txt12
-rw-r--r--test/xml-mapped/content-namespace-2/input.xml22
-rw-r--r--test/xml-mapped/content-namespace-2/map.xml13
-rw-r--r--test/xml-mapped/content-namespace-3/check-nomap.txt12
-rw-r--r--test/xml-mapped/content-namespace-3/check.txt13
-rw-r--r--test/xml-mapped/content-namespace-3/input.xml26
-rw-r--r--test/xml-mapped/content-namespace-3/map.xml12
-rw-r--r--test/xml-mapped/content-namespace/check-nomap.txt12
-rw-r--r--test/xml-mapped/content-namespace/check.txt13
-rw-r--r--test/xml-mapped/content-namespace/input.xml26
-rw-r--r--test/xml-mapped/content-namespace/map.xml12
-rw-r--r--test/xml-mapped/content-one-column/check-nomap.txt4
-rw-r--r--test/xml-mapped/content-one-column/input.xml6
-rw-r--r--test/xml-mapped/custom-labels-2/check.txt12
-rw-r--r--test/xml-mapped/custom-labels-2/input.xml8
-rw-r--r--test/xml-mapped/custom-labels-2/map.xml12
-rw-r--r--test/xml-mapped/custom-labels/check.txt27
-rw-r--r--test/xml-mapped/custom-labels/input.xml27
-rw-r--r--test/xml-mapped/custom-labels/map.xml14
-rw-r--r--test/xml-mapped/encoding/euc-jp.xml12
-rw-r--r--test/xml-mapped/encoding/gbk.xml139
-rw-r--r--test/xml-mapped/encoding/utf-8.xml27
-rw-r--r--test/xml-mapped/fuel-economy/check-nomap.txt3
-rw-r--r--test/xml-mapped/fuel-economy/check.txt4
-rw-r--r--test/xml-mapped/fuel-economy/input.xml11
-rw-r--r--test/xml-mapped/fuel-economy/map.xml9
-rw-r--r--test/xml-mapped/invalids/map-defs/non-leaf-element-linked.xml9
-rw-r--r--test/xml-mapped/invalids/map-defs/not-xml.xml1
-rw-r--r--test/xml-mapped/nested-repeats-2/check-nomap.txt31
-rw-r--r--test/xml-mapped/nested-repeats-2/check.txt31
-rw-r--r--test/xml-mapped/nested-repeats-2/input.xml21
-rw-r--r--test/xml-mapped/nested-repeats-2/map.xml12
-rw-r--r--test/xml-mapped/nested-repeats-3/check-nomap.txt44
-rw-r--r--test/xml-mapped/nested-repeats-3/check.txt44
-rw-r--r--test/xml-mapped/nested-repeats-3/input.xml32
-rw-r--r--test/xml-mapped/nested-repeats-3/map.xml13
-rw-r--r--test/xml-mapped/nested-repeats-4/check-nomap.txt44
-rw-r--r--test/xml-mapped/nested-repeats-4/check.txt44
-rw-r--r--test/xml-mapped/nested-repeats-4/input.xml38
-rw-r--r--test/xml-mapped/nested-repeats-4/map.xml13
-rw-r--r--test/xml-mapped/nested-repeats/check-nomap.txt20
-rw-r--r--test/xml-mapped/nested-repeats/check.txt20
-rw-r--r--test/xml-mapped/nested-repeats/input.xml18
-rw-r--r--test/xml-mapped/nested-repeats/map.xml10
-rw-r--r--test/xml-structure/attribute-1/check.txt7
-rw-r--r--test/xml-structure/attribute-1/input.xml5
-rw-r--r--test/xml-structure/basic-1/check.txt5
-rw-r--r--test/xml-structure/basic-1/input.xml13
-rw-r--r--test/xml-structure/basic-2/check.txt5
-rw-r--r--test/xml-structure/basic-2/input.xml7
-rw-r--r--test/xml-structure/basic-3/check.txt9
-rw-r--r--test/xml-structure/basic-3/input.xml19
-rw-r--r--test/xml-structure/namespace-default/check.txt5
-rw-r--r--test/xml-structure/namespace-default/input.xml6
-rw-r--r--test/xml-structure/nested-repeat-1/check.txt12
-rw-r--r--test/xml-structure/nested-repeat-1/input.xml20
-rw-r--r--test/xml/bom/check.txt11
-rw-r--r--test/xml/bom/input.xml1
-rw-r--r--test/xml/cdata-1/check.txt18
-rw-r--r--test/xml/cdata-1/input.xml10
-rw-r--r--test/xml/custom-decl-1/check.txt99
-rw-r--r--test/xml/custom-decl-1/input.xml3
-rw-r--r--test/xml/default-ns/check.txt17
-rw-r--r--test/xml/default-ns/input.xml12
-rw-r--r--test/xml/doctype/html.xml6
-rw-r--r--test/xml/encoded-attrs/test1.xml5
-rw-r--r--test/xml/encoded-char/check.txt19
-rw-r--r--test/xml/encoded-char/input.xml11
-rw-r--r--test/xml/invalids/double-boms-and-invalid-byte.xml1
-rw-r--r--test/xml/invalids/only-bom.xml1
-rw-r--r--test/xml/invalids/only-double-boms.xml1
-rw-r--r--test/xml/invalids/partial-attr-value-with-encoding-char.xml2
-rw-r--r--test/xml/invalids/partial-open-element.xml2
-rw-r--r--test/xml/no-decl-1/check.txt8
-rw-r--r--test/xml/no-decl-1/input.xml8
-rw-r--r--test/xml/ns-alias-1/check.txt10
-rw-r--r--test/xml/ns-alias-1/input.xml6
-rw-r--r--test/xml/osm/street-in-aizu.osm227
-rw-r--r--test/xml/parse-only/rss/input.xml67
-rw-r--r--test/xml/self-closing-root/check.txt1
-rw-r--r--test/xml/self-closing-root/input.xml1
-rw-r--r--test/xml/simple/check.txt12
-rw-r--r--test/xml/simple/input.xml13
-rw-r--r--test/xml/single-quote/check.txt11
-rw-r--r--test/xml/single-quote/input.xml9
-rw-r--r--test/xml/underscore-identifier/check.txt5
-rw-r--r--test/xml/underscore-identifier/input.xml4
-rw-r--r--test/xml/utf8-1/check.txt4
-rw-r--r--test/xml/utf8-1/input.xml4
-rw-r--r--test/xml/utf8-2/check.txt4
-rw-r--r--test/xml/utf8-2/input.xml5
-rw-r--r--test/xml/valids/double-boms.xml1
-rw-r--r--test/yaml/basic1/input.yaml19
-rw-r--r--test/yaml/basic2/input.yaml6
-rw-r--r--test/yaml/basic3/input.yaml7
-rw-r--r--test/yaml/boolean/input.yaml33
-rw-r--r--test/yaml/empty-value-map-1/input.yaml3
-rw-r--r--test/yaml/empty-value-map-2/input.yaml3
-rw-r--r--test/yaml/empty-value-sequence-1/input.yaml2
-rw-r--r--test/yaml/empty-value-sequence-2/input.yaml3
-rw-r--r--test/yaml/invalids/1.yaml4
-rw-r--r--test/yaml/invalids/2.yaml4
-rw-r--r--test/yaml/invalids/3.yaml4
-rw-r--r--test/yaml/literal-block-1/input.yaml11
-rw-r--r--test/yaml/literal-block-2/input.yaml9
-rw-r--r--test/yaml/map-key-1/input.yaml5
-rw-r--r--test/yaml/multi-line-1/input.yaml4
-rw-r--r--test/yaml/multi-line-2/input.yaml5
-rw-r--r--test/yaml/null/input.yaml10
-rw-r--r--test/yaml/quoted-string/input.yaml22
-rw-r--r--test/yaml/swagger/input.yaml155
-rw-r--r--test/yaml/url/input.yaml7
1436 files changed, 303346 insertions, 0 deletions
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..3020bd9
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,14 @@
+Kohei Yoshida <kohei.yoshida@gmail.com> (maintainer)
+Markus Mohrhard <markus.mohrhard@googlemail.com>
+Jaskaran Singh <jvsg1303@gmail.com>
+David Tardon <dtardon@redhat.com>
+Tomas Chvatal <tchvatal@suse.cz>
+Caolán McNamara <caolanm@redhat.com>
+Fridrich Štrba <fridrich.strba@bluewin.ch>
+Stephan Bergmann <sbergman@redhat.com>
+Adam Majer <amajer@suse.de>
+Dmitry Roshchin <dmitry@roshchin.org>
+Eike Rathke <erack@redhat.com>
+Maks Naumov <maksqwe1@ukr.net>
+Mike Kaganski <mikekaganski@gmail.com>
+Miklos Vajna <vmiklos@collabora.co.uk>
diff --git a/CHANGELOG b/CHANGELOG
new file mode 100644
index 0000000..a0fe07a
--- /dev/null
+++ b/CHANGELOG
@@ -0,0 +1,702 @@
+orcus 0.19.2
+
+* general
+
+ * fixed a build issue with gcc 14 due to a missing include for std::find_if
+ and std::for_each.
+
+ * fixed a segmentation fault with the orcus-test-xml-mapped test which
+ manifested on hppa hardware, as originally reported on
+ https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1054376.
+
+* xls-xml
+
+ * fixed a crash when loading a document that includes a style record
+ referencing an unnamed style record as its parent. In Excel-generated
+ documents, styles only reference named styles as their parents. But in
+ 3rd-party generated documents, styles referencing unnamed styles as their
+ parents can occur.
+
+* gnumeric
+
+ * fixed a crash when the document model returned a null pointer when a
+ reference resolver interface was requested.
+
+orcus 0.19.1
+
+* general
+
+ * implemented orcus::create_filter() which instantiates a filter object of
+ specified type. The returned object is of type
+ orcus::iface::import_filter.
+
+ * moved test cases for format detection to the respective filter test files.
+
+* gnumeric
+
+ * fixed a bug where the import filter did not set the formula grammer prior
+ to importing.
+
+orcus 0.19.0
+
+* general
+
+ * added support for allowing use of std::filesystem,
+ std::experimental::filesystem or boost::filesystem per build
+ configuration.
+
+* xlsx
+
+ * refactored styles import to use style indices returned by the document
+ model implementer rather than using the indices stored in the file. This
+ allows the implementer to aggregate some style records and re-use the same
+ index for records that are stored as different records in the original
+ file.
+
+* xls-xml
+
+ * fixed a bug where column styles were not applied to the correct columns
+ when the starting column index was not 0.
+
+* gnumeric
+
+ * overhauled the Gnumeric import filter to fix many bugs and support many
+ missing features relative to the other filters included in orcus. Most
+ notable mentions are:
+
+ * cell styles
+
+ * rich-text strings
+
+ * named ranges
+
+ * row heights and column widths
+
+ * merged cells
+
+* parquet
+
+ * added partial support for Apache Parquet import filter. This is still
+ heavily experimental.
+
+orcus 0.18.1
+
+* sax parser
+
+ * added support for optionally skipping multiple BOM's in the beginning of
+ XML stream. This affects all XML-based file format filters such as
+ xls-xml (aka Excel 2003 XML).
+
+* xml-map
+
+ * fixed a bug where XML documents consisting of simple single-column records
+ were not properly converted to sheet data.
+
+* xls-xml
+
+ * fixed a bug where the filter would always pass border color even when it
+ was not set.
+
+* buildsystem
+
+ * added new configure switches --without-benchmark and --without-doc-example
+ to optinally skip building of these two directories.
+
+orcus 0.18.0
+
+* general
+
+ * fixed the flat output mode to properly calculate the lengths of UTF-8
+ encoded strings.
+
+ * replaced all uses of std::strtol() to parse_integer() to properly parse
+ strings that are not necessarily null-terminated.
+
+ * added a new output format type 'debug-state' which dumps the internal
+ state of the populated document model in detail. This can be useful
+ during debugging.
+
+ * separated the import_shared_string interface implementation from the
+ backend shared strings store per separation of responsibility.
+
+ * merged the foo_t and foo_active_t struct pair, such as font_t and
+ font_active_t, in the styles store into a single type using std::optional.
+
+ * revised the documentation and public API and cleaned things up where
+ necessary.
+
+* ods
+
+ * reimplemented the number format styles import to correctly keep track of
+ element stacks and correctly perform structure checks to detect malformed
+ documents.
+
+ * added new interface to import named styles applied to columns.
+
+ * added new interface to import attributes for asian and complex scripts for
+ the folloiwng font attributes:
+
+ * font name
+
+ * font size
+
+ * font style
+
+ * font weight
+
+ * re-designed the styles import interface to make it multi-level.
+
+ * re-worked the import of the style:text-underline-width attribute to make
+ its handling more in line with the specifications.
+
+* xls-xml
+
+ * added support for importing wrap-text and shrink-to-fit cell format
+ attributes.
+
+ * added support for importing cell-hidden and locked attributes.
+
+ * added support for importing direct and named cell formats applied to
+ columns and rows.
+
+* xlsx
+
+ * added support for importing wrap-text and shrink-to-fit cell format
+ attributes.
+
+ * added support for importing direct and named cell formats applied to
+ columns and rows.
+
+* xml-map
+
+ * added a new interface to pass the encoding information to the document
+ model so that it can correctly decode non-UTF-8-encoded string values.
+
+orcus 0.17.2
+
+* ods
+
+ * fixed a bug where the state of style:cell-protect="none" was not
+ explicitly pushed, thereby having had the same effect as not having this
+ attribute. After the fix, style:cell-protect="none" will explicitly push
+ the hidden state to false, locked state to false, and the formula-hidden
+ state to false.
+
+orcus 0.17.1
+
+* general
+
+ * addressed a number of coverity issues.
+
+ * removed a variety of compiler warnings.
+
+* ods
+
+ * re-generated sax parser tokens from ODF v1.3.
+
+ * revised the style import code to only push style attributes that are
+ actually specified in the XML.
+
+* xls-xml
+
+ * revised the XML structure validation strategy to ignore any mis-placed
+ elements and their sub structures rather than aborting the import.
+
+orcus 0.17.0
+
+* general
+
+ * set the baseline C++ version to 17.
+
+ * cleaned up the public API to replace pstring with std::string_view, union
+ with std::variant, and boost::optional with std::optional. With this
+ change, the public API no longer has dependency on boost.
+
+* spreadsheet document
+
+ * switched to using ixion::model_iterator for horizontal iteration of cells
+ instead of using mdds::mtv::collection.
+
+ * fixed a bug where exporting a spreadsheet document containing adjacent
+ merged cells regions to html incorrectly exported the merged cell areas.
+
+* xlsx
+
+ * cached cell values are now correctly loaded from the file.
+
+* sax parser
+
+ * utf-8 names are now allowed as element and attribute names.
+
+* css parser
+
+ * unquoted utf-8 property values are now allowed.
+
+* orcus-json
+
+ * fixed segmentation fault when using --mode structure with the Windows
+ build.
+
+ * added yaml output option.
+
+* xml-map
+
+ * fixed a bug where mapping of an XML document with namespace aliases
+ sometimes corrupts the alias values.
+
+* python
+
+ * added orcus.FormulaTokenOp enum type which describes type formula token
+ operator types in a more finer grained manner.
+
+* documentation
+
+ * added notes to how to use orcus-xml and orcus-json to map XML and JSON
+ documents to spreadsheet documents.
+
+orcus 0.16.1
+
+* fixed a build issue on 32-bit linux platforms, which was indirectly caused
+ by ixion.
+
+* fixed json parsing bug caused by an uninitialized variable, which manifested
+ itself on debian 32-bit platform.
+
+* removed compiler warnings on unused variables from the base parser handlers.
+
+orcus 0.16.0
+
+* general
+
+ * full formula recalculations are now optional when loading documents. It
+ makes more effective use of cached formula results.
+
+ * added the option of failing on the first faulty cell, or skipping them.
+
+ * fixed a bug that caused the threaded_sax_token_parser to deadlock.
+
+ * added base parser handler classes in the public headers so that they can
+ be sub-classed to overwrite necessary handler methods.
+
+* json-parser
+
+ * parsing of numeric values are now more strict for better conformance to
+ the specs.
+
+* ods
+
+ * added support for loading named expressions from ods documents.
+
+ * fixed an infinite loop when loading one of the attached ods documents from
+ https://bugs.documentfoundation.org/show_bug.cgi?id=82414
+
+* xlsx
+
+ * fixed a segfault when loading the xlsx document from
+ https://bugs.documentfoundation.org/show_bug.cgi?id=83711.
+
+* xls-xml
+
+ * fixed a bug that prevented formulas from referencing cells located in
+ later sheets.
+
+* xml-map
+
+ * adjusted the xml path expressions to be more like XPath. Previously, an
+ attribute was expressed as '@' in the old expression, but XPath uses '/@'.
+ The new expression uses '/@' for an attribute.
+
+ * added the ability to identify and import ranges from XML documents without
+ map file.
+
+ * added the ability to generate map file from XML documents for user
+ customization.
+
+ * added support to specify default namespace in the map file.
+
+* python
+
+ * added orcus.Cell class to represent individual cell values and attributes.
+
+ * fixed several memory leaks in the python binding layer.
+
+ * modified orcus.csv.read() function to take string input, instead of bytes.
+
+ * added __version__ attribute to the orcus module.
+
+ * cleaned up orcus.detect_format function to only take the stream parameter.
+
+ * added named_expressions properties to Document and Sheet class objects.
+
+ * added Python API to bulk-process a number of spreadsheet documents
+ (orcus.tools.file_processor).
+
+ * added Python API to download attachments from bugzilla services via REST
+ API (orcus.tools.bugzilla).
+
+orcus 0.15.4
+
+* fixed a build error with gcc 10 with LTO. For more details, visit
+ (https://bugs.gentoo.org/715154).
+
+* removed potentially non-free specification and schema files from the
+ package.
+
+orcus 0.15.3
+
+* xml-map
+
+ * fixed another bug related to filling of cells down the column in a linked
+ range with nested repeat elements. The bug would occur when the field in
+ a linked range is more than one level deeper than the nearest row group
+ element.
+
+* xls-xml
+
+ * fixed a bug where TopCell and LeftCell attributes of the Table element
+ were not properly honored.
+
+orcus 0.15.2
+
+* xml-map
+
+ * fixed a bug that prevented filling of cells down the column in a linked
+ range with nested repeat elements. The bug would occur when the field in
+ a linked range is associated with an element content rather than an
+ attribute.
+
+* xls-xml
+
+ * added code to properly pick up and pass the number format codes, including
+ named number format values such as 'General Date', 'Long Time, 'Currency'
+ etc.
+
+* fixed a build issue on older macOS environment, related to passing an rvalue
+ to a tuple expecting a const reference. The root cause was a bug in libc++
+ of LLVM < 7.
+
+* fixed a build issue with gcc5.
+
+orcus 0.15.1
+
+* switched xml_map_tree to using boost::object_pool to manage the life
+ cycles of the objects within xml_map_tree, to avoid memory
+ fragmentation.
+
+* fixed incorrect handling of newly created elements in xml_map_tree.
+
+* fixed segfault caused by double deletion of allocated memory for
+ xml_map_tree::element, which seemed to happen only on 32-bit gcc builds.
+
+* fixed weird test failures related to equality check of two double-precision
+ values, caused probably by aggressive compiler optimization which only seems
+ to get triggered in 32-bit gcc builds.
+
+orcus 0.15.0
+
+* spreadsheet interface
+
+ * import_sheet::fill_down_cells() has been added as a required method, to
+ allow the import filter code to duplicate cell value downward in one step.
+
+* json parser
+
+ * added test cases from JSONTestSuite.
+
+ * fixed a bug on parsing an empty array containing one or more blank
+ characters between the brackets.
+
+* sax parser
+
+ * fixed a bug on parsing an attribute value with encoded character
+ immediately followed by a ';', such as '&amp;;'.
+
+ * fixed a bug on parsing an assignment character '=' that either preceded or
+ followed by whitespaces in attribute definition.
+
+ * optionally use SSE4.2 intrinsics to speed up element name parsing.
+
+* orcus-xml
+
+ * revised its cli interface to make use of boost's program_options.
+
+ * orcus-xml-dump's functionality has been combined into orcus-xml.
+
+ * map mode now supports nested repeat elements to be mapped as range fields.
+
+* orcus-json
+
+ * map mode has been added to allow mapping of JSON documents to spreadsheet
+ document model. This mode either takes explicit mapping rule via map
+ file, or performs automatic mapping by auto-identifying mappable ranges by
+ analyzing the structure of the JSON document.
+
+ * structure mode has been added to display the logical structures of JSON
+ documents.
+
+ * significantly improved performance of json document tree by utilizing
+ object pool to manage the life cycles of json value instances.
+
+* xls-xml
+
+ * added support for importing named color values in the ss:Color attributes.
+
+ * added support for handling UTF-16 streams that contains byte order marks.
+
+* spreadsheet document
+
+ * significantly improved performance of flat format output generation.
+
+* internal
+
+ * string_pool now uses boost's object_pool to manage the instances of stored
+ strings.
+
+ * file_content class has been added to memory-map file contents instead of
+ loading them in-memory.
+
+ * memory_content class has been added to map in-memory buffer with the
+ optional ability to perform unicode conversion.
+
+ * dom_tree has been renamed to dom::document_tree, and its interface has
+ been cleaned up to hide its implementation details.
+
+orcus 0.14.1
+
+* addressed a number of coverity issues.
+
+* improved precision of points-to-twips measurement conversions by
+ reducing the number of numeric operations to be performed. This
+ especially helps on i386 platforms.
+
+orcus 0.14.0
+
+* spreadsheet interface
+
+ * import_data_table::set_range() now receives a parameter of type
+ range_t.
+
+ * import_sheet::set_array_formula() interface methods have been
+ removed and replaced with import_sheet::get_array_formula() that
+ returns an interface of type import_array_formula.
+
+ * import_formula interface class has been added to replace the
+ formula related methods of import_sheet. As a result,
+ set_formula(), set_shared_formula(), and set_formula_result()
+ methods have been removed from the import_sheet interface class.
+
+ * import_auto_filter::set_range() now receives a parameter of type
+ range_t, rather than a string value representing a range.
+
+ * import_sheet::set_fill_pattern_type() interface method now takes
+ an enum value of type fill_pattern_t, rather than a string value.
+
+* xls-xml
+
+ * pick up the character set from the XML declaration, and pass it
+ to the client app via import_global_settings interface.
+
+ * support importing of array formulas.
+
+* xlsx
+
+ * support importing of array formulas.
+
+ * fixed a bug where sheet indices being passed to the append_sheet()
+ interface method were incorrect.
+
+* shared formula handling code has been re-worked.
+
+* spreadsheet::sheet class has been de-coupled from the import and
+ export interfaces.
+
+* previously known as import_styles class is now split into styles
+ class and import_styles factory wrapper class.
+
+* sax_parser now gracefully ignores leading whitespace(s) if any,
+ rather than aborting the parsing for it's not a valid XML stream
+ to have leading whitespace(s). In the future we should make this
+ behavior configurable.
+
+* python
+
+ * add orcus.xlsx.read() function that takes a file object to load
+ an xlsx file as a replacement for orcus.xlsx.read_file().
+
+ * add orcus.ods.read(), orcus.xls_xml.read(), orcus.csv.read(),
+ and orcus.gnumeric.read() functions.
+
+ * add orcus.Sheet.write() method which exports sheet content to
+ specified format. For now only the csv format type is
+ supported.
+
+* xml_map_tree no longer requires the source stream persisted in
+ memory between the read and write.
+
+* the sax parser now stores the offset positions of each element
+ rather than their memory positions, in order to make the position
+ values usable between duplicated stream instances.
+
+* xml_structure_tree to support selection of an element by element
+ path.
+
+* document
+
+ * correctly set the argument separator depending on the formula
+ grammar type. This change fixes loading of ods documents with
+ formula cells.
+
+* fixed a build issue with boost 1.67.
+
+orcus 0.13.4
+
+* xls-xml
+
+ * fix incorrect handling of formula cells without result caches.
+
+* fix incorrect parsing of invalid XML documents with multiple
+ self-closing root elements.
+
+orcus 0.13.3
+
+* fix the handling of alpha values passed to set_fill_fg_color() and
+ set_fill_bg_color(). A value of 255 means fully opaque whereas a
+ value of 0 means fully transparent.
+
+* fix the solid fill color import, to use the foreground color
+ instead of the background color.
+
+* xlsx
+
+ * import colors to disgonal borders.
+
+ * remove carriage returns from multi-line cell strings.
+
+* xls-xml
+
+ * import border colors.
+
+ * import hidden row and column flags.
+
+orcus 0.13.2
+
+* xls-xml
+
+ * import column width and row height properties.
+
+ * import solid fill colors in cells.
+
+ * import text alignment properties.
+
+ * import cell borders.
+
+* xlsx
+
+ * import justified and distributed text alignment properties.
+
+ * fix exception being thrown when the diagonal element is
+ encountered.
+
+ * import diagonal cell borders.
+
+orcus 0.13.1
+
+* use a more efficient way to set format ranges in spreadsheet
+ model.
+
+* support single quoted strings in the css parser.
+
+orcus 0.13.0
+
+* fix incorrect parsing of XML 1.0 documents that don't include
+ header declarations.
+
+* fix incorrect parsing of XML elements and attributes whose names
+ start with an underscore.
+
+* orcus-csv: add an option to split content into multiple sheets in
+ case it doesn't fit in one sheet.
+
+* add csv dump mode for all spreadsheet document based filter
+ commands.
+
+* orcus-ods: suppress debug outputs unless the debug flag is set.
+
+* orcus-xlsx: correctly import boolean cell values.
+
+* add experimental cmake-based build support, primarily for Windows.
+
+* add initial support for importing select sheet view settings in
+ xlsx and xls-xml.
+
+* add API for directly constructing json document trees.
+
+* support import of cell formats for xls-xml.
+
+* support single-quoted attribute values in the sax xml parser.
+
+* orcus-xml: fix incorrect mapping of XML range data to sheet range
+ when the first column contains one or more empty elements.
+
+* support import of named expressions for xlsx and xls-xml.
+
+* support import of formula cells for xls-xml.
+
+* implement pivot cache import for xlsx.
+
+* fix a number of crashes in the csv parser.
+
+* fix a number of crashes in the json parser.
+
+* fix a number of crashes in the yaml parser.
+
+* integrate orcus into gitlab's continuous integration.
+
+orcus 0.12.1
+
+* fix build when --disable-spreadsheet-model is specified and the
+ ixion headers are not present.
+
+* fix loading of file streams on Windows.
+
+* get the debug flag to work again.
+
+orcus 0.12.0
+
+* handle escaped unicode in the xml parser
+
+* improve odf styles import
+
+* implement threaded xml parser
+
+* implement threaded json parser
+
+orcus 0.11.2
+
+* make it buildable with mdds-1.2.
+
+orcus 0.11.1
+
+* fixed various build issues with MSVC and clang on OSX.
+
+orcus 0.11.0
+
+* remove boost dependency from the public headers.
+
+* implement JSON parser and document storage model.
+
+* implement YAML parser and document storage model.
+
+* add orcus-json.
+
+* add orcus-yaml.
+
+* improve parse error output from the XML parser.
+
+* use enum class in import_style::set_border_style().
+
+* support non-local file import.
+
+orcus 0.1.0
+
+* initial release.
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 0000000..2bdadaf
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,25887 @@
+2023-11-08 Kohei Yoshida <kohei.yoshida@gmail.com> [45df2cabf9ca13ccb899df8dc8fd2af029fc2cd5]
+
+ Revise the handling of temporary output XML file
+
+ Ensure that the temporary output file is not removed while someone is holding
+ an open mmap reference to it. This may not be an issue on Linux, but on
+ Windows this causes an error. (#197)
+
+2023-11-07 Kohei Yoshida <kohei.yoshida@gmail.com> [86f90717f938480bdaa6a9c550ce029b97e17ead]
+
+ fix a typo
+
+
+2023-11-07 Kohei Yoshida <kohei.yoshida@gmail.com> [dfd938e8abe2ac7015eab17503066df835785956]
+
+ Add items for 0.19.2
+
+
+2023-11-02 Kohei Yoshida <kohei.yoshida@gmail.com> [340e90700874fb5b46a3b5aee9464417db53a6c9]
+
+ Fix make distcheck
+
+
+2023-11-02 Kohei Yoshida <kohei.yoshida@gmail.com> [dc8d66a76b2946af7ae27771859cc6f613e63b96]
+
+ Set the version number to 0.19.2
+
+
+2023-11-02 Kohei Yoshida <kohei.yoshida@gmail.com> [f880e60241f392c4de4939b9e558b7146ff35e2e]
+
+ Add a test case for #195
+
+ The test input file originates from
+
+ https://bug-attachments.documentfoundation.org/attachment.cgi?id=174536
+
+ which is an attachment for this report
+
+ https://bugs.documentfoundation.org/show_bug.cgi?id=144088
+
+2023-11-01 Kohei Yoshida <kohei.yoshida@gmail.com> [1f8f9d5a68755cdc4d1bd780b248d8a8860eb7cd]
+
+ Better warning message that includes the current style id
+
+
+2023-11-01 Kohei Yoshida <kohei.yoshida@gmail.com> [d31defd81911112949686e187e36143bb4d6328b]
+
+ Make sure the iterator is valid before dereferencing it
+
+
+2023-11-01 Kohei Yoshida <kohei.yoshida@gmail.com> [4d0a4d67e76c849adb975dab3b34a6b7d90e3a57]
+
+ Ensure the file contents stay alive while namespace context ...
+
+ ... object is used during parsing.
+
+2023-10-31 Kohei Yoshida <kohei.yoshida@gmail.com> [2e8f1edd2342c2a5f52d3d39426176ae49f46160]
+
+ Check for null resolver before dereferencing it
+
+
+2023-10-26 Kohei Yoshida <kohei.yoshida@gmail.com> [f5dca3b4f7c6ffda4b71e0ba9f7081ab2eec3405]
+
+ Attempt to fix a build failure with GCC 14 as reported in #192
+
+ The compiler output is:
+
+ CXX liborcus_spreadsheet_model_0.18_la-document_impl.lo
+ document_impl.cpp: In member function 'orcus::spreadsheet::col_t orcus::spreadsheet::detail::ixion_table_handler::find_column(const orcus::spreadsheet::table_t&, std::string_view, size_t) const':
+ document_impl.cpp:133:14: error: 'find_if' is not a member of 'std'; did you mean 'find'?
+ 133 | std::find_if(it_beg, it_end, find_column_by_name(name));
+ | ^~~~~~~
+ | find
+
+2023-10-25 Kohei Yoshida <kohei.yoshida@gmail.com> [c9c9cf3e37fe97a17284f84dd2bef592cefb60f3]
+
+ Fix build with -Werror=unused-parameter and --disable-spreadsheet-model
+
+ It addresses
+
+ > orcus_json_cli_map.cpp: In function ‘void orcus::detail::map_to_sheets_and_dump(const orcus::file_content&, orcus::detail::cmd_params&)’:
+ > orcus_json_cli_map.cpp:47:49: error: unused parameter ‘content’ [-Werror=unused-parameter]
+ > 47 | void map_to_sheets_and_dump(const file_content& content, cmd_params& params)
+ > | ~~~~~~~~~~~~~~~~~~~~^~~~~~~
+ > orcus_json_cli_map.cpp:47:70: error: unused parameter ‘params’ [-Werror=unused-parameter]
+ > 47 | void map_to_sheets_and_dump(const file_content& content, cmd_params& params)
+ > |
+
+ and
+
+ > python.cpp:99:6: error: ‘bool orcus::python::{anonymous}::add_type_to_module(PyObject*, PyTypeObject*, const char*)’ defined but not used [-Werror=unused-function]
+ > 99 | bool add_type_to_module(PyObject* m, PyTypeObject* typeobj, const char* type_name)
+ > |
+
+2023-10-19 Kohei Yoshida <kohei.yoshida@gmail.com> [dcead079eea2509a32c8438238d38ee977c43e7a]
+
+ Add highlights for 0.19.1
+
+
+2023-10-19 Kohei Yoshida <kohei.yoshida@gmail.com> [6d2482c2e44706935fc823df48010d05050a5bb4]
+
+ Increment the version to 0.19.1
+
+
+2023-10-19 Kohei Yoshida <kohei.yoshida@gmail.com> [db2d50593f413062ed728ce1341f79e36a83ad3b]
+
+ Use fs::path to handle file paths
+
+ This fixes a build issue with MSVC.
+
+2023-10-19 Kohei Yoshida <kohei.yoshida@gmail.com> [b68e7c5f3f5f3aa4920a8496f3464fae03eaf4fc]
+
+ Finally, remove format-detection-test
+
+
+2023-10-19 Kohei Yoshida <kohei.yoshida@gmail.com> [320154f0f3673def6a4d2b3e5e0bada75dd24d7a]
+
+ Add test case for ods format detection
+
+
+2023-10-19 Kohei Yoshida <kohei.yoshida@gmail.com> [69719d29256e32385ff4bb76d772b89de30eba9c]
+
+ Add format detection test case for xlsx
+
+
+2023-10-19 Kohei Yoshida <kohei.yoshida@gmail.com> [52651a45c350a88c2f2e2a3e7872470a09838e04]
+
+ Add format detection tests for gnumeric and xls-xml
+
+ And make sure we convert to utf-8 first during xls-xml detection.
+
+2023-10-04 Kohei Yoshida <kohei.yoshida@gmail.com> [9ba3b13b1192dbf60c2a3a0ddf329e766c5f6181]
+
+ Implement create_filter() and its test cases
+
+
+2023-09-29 Kohei Yoshida <kohei.yoshida@gmail.com> [353650ed58f1ff5e945c6b87875431f9537a95e9]
+
+ Make sure to set the grammar before loading the content
+
+
+2023-09-28 Kohei Yoshida <kohei.yoshida@gmail.com> [4dd132c19a4d4a33ae8c692db5554845bf27bdef]
+
+ Correct the name of the dependency
+
+
+2023-09-28 Kohei Yoshida <kohei.yoshida@gmail.com> [126da01fa87a3e94f2df4ba139d16b5f95d81b45]
+
+ Fix build issue with MSVC
+
+ The error output is
+
+ error C2398: Element '2': conversion from 'int' to 'const std::basic_string_view<char,std::char_traits<char>>::size_type'
+ requires a narrowing conversion
+
+2023-09-27 Kohei Yoshida <kohei.yoshida@gmail.com> [4ba0df989ce049e4634c09a5e0cf04d27cd46ef3]
+
+ Fix make distcheck
+
+
+2023-09-27 Kohei Yoshida <kohei.yoshida@gmail.com> [81bfca56dd842889d0381a8cc56e9fb296ad279d]
+
+ New script to build extra-dist lists in root Makefile.am
+
+ Better to write a script than hand-building the lists each and every
+ time...
+
+2023-09-27 Kohei Yoshida <kohei.yoshida@gmail.com> [78a9f1553a68e9f45b77954bdf33165f447ff88f]
+
+ Populate items for 0.19.0
+
+
+2023-09-26 Kohei Yoshida <kohei.yoshida@gmail.com> [20497c30b447492adbf8b56b81cd43739cca5424]
+
+ Set the version number string to 0.19.0
+
+
+2023-09-26 Kohei Yoshida <kohei.yoshida@gmail.com> [caa5bfdf1ed7409742862b6e46f468d8a726c7c8]
+
+ Requires ixion 0.19.0 (just released)
+
+
+2023-09-07 Kohei Yoshida <kohei.yoshida@gmail.com> [b0c122978c48918efda692650c5978afdcdce23c]
+
+ Map number format IDs for xf entries
+
+ For number format IDs, Excel provides the IDs themselves, so we'll
+ use unordered_map instead of vector to achieve mapping.
+
+ The built-in IDs are not pushed right now. In the futre we should
+ manually push built-in number formats to the document and set up
+ mapping for them as well.
+
+2023-09-06 Kohei Yoshida <kohei.yoshida@gmail.com> [0acd451059345d9525de87172b095cfea601fd8d]
+
+ Unused member
+
+
+2023-09-06 Kohei Yoshida <kohei.yoshida@gmail.com> [9c4bbb573d9a8162adbc3f962e02fb58bc0497d8]
+
+ Use mapped ID for xf@xfId which also references xf under cellStyleXfs
+
+ Turns out, we need to build mapping only for the xf records under
+ cellStyleXfs.
+
+2023-09-06 Kohei Yoshida <kohei.yoshida@gmail.com> [3e22f81cb3abf6ce41b8e4d81b93eb1ea7853c0a]
+
+ Use mapped ID as named cell style xf ID
+
+
+2023-09-06 Kohei Yoshida <kohei.yoshida@gmail.com> [accf45b71eadc3fc1a2a57b63564e2f04310ea5e]
+
+ Build cell-format (xf) ID mapping for cellStyleXfs, cellXfs and dxfs
+
+
+2023-09-06 Kohei Yoshida <kohei.yoshida@gmail.com> [ba691b76570ca99d65ea5eccecfd9d29a282894b]
+
+ Do the same with border IDs
+
+
+2023-09-06 Kohei Yoshida <kohei.yoshida@gmail.com> [4fb2ea4a927864bc7d463ea0e9199e7b9b2a586f]
+
+ Do the same with fill IDs
+
+
+2023-09-06 Kohei Yoshida <kohei.yoshida@gmail.com> [686b079865648ef10a3f937bce90f973d0aab83b]
+
+ Keep the font IDs returned by commit() and use them in set_font()
+
+ With this, we can re-enable font caching in the import factory code.
+
+2023-09-06 Kohei Yoshida <kohei.yoshida@gmail.com> [f558ea4d1bc541a0055afa7cb22bec85d8bf8e83]
+
+ spreadsheet -> ss
+
+
+2023-09-06 Kohei Yoshida <kohei.yoshida@gmail.com> [0d6c5806e7e5a28e09d10ad8fffc4da4e38c3eba]
+
+ Unused
+
+
+2023-09-06 Kohei Yoshida <kohei.yoshida@gmail.com> [6221158cfb3caea47c106251b395aae1e9437edd]
+
+ Rename xlsx_context.* to xlsx_shared_strings_context.*
+
+
+2023-09-06 Kohei Yoshida <kohei.yoshida@gmail.com> [448a944270dd41f49f39559e8af74da8d954af9c]
+
+ Extract xlsx_styles_context into its own header/source pair
+
+
+2023-09-05 Kohei Yoshida <kohei.yoshida@gmail.com> [17ca782133e37d2c6da1c490c181cf0889984ac1]
+
+ Add a test case for formatted string import for xlsx
+
+ and fix several issues discovered.
+
+2023-09-05 Kohei Yoshida <kohei.yoshida@gmail.com> [654fface358c7ed27b9dff36016a56795962c1e2]
+
+ Remove 'using namespace std'
+
+
+2023-09-03 Kohei Yoshida <kohei.yoshida@gmail.com> [7117da32371fdf035563dd6793afb4423adbfde2]
+
+ Add a test case for formatted text import
+
+ Also pick up the underline format attribute in cells.
+
+2023-09-03 Kohei Yoshida <kohei.yoshida@gmail.com> [602409e988a00fd414a7fb0f0799ce00fba8b847]
+
+ Reset the column row positions when the table ends
+
+
+2023-09-03 Kohei Yoshida <kohei.yoshida@gmail.com> [41e878db143076744dc46bf1740908ef8843cf85]
+
+ Use warn() for warning outputs
+
+
+2023-09-03 Kohei Yoshida <kohei.yoshida@gmail.com> [9b4a60136ea3613b48d45f0c08503ff2d03141c8]
+
+ Add test cases for column widths and row heights in secondary sheets
+
+
+2023-09-03 Kohei Yoshida <kohei.yoshida@gmail.com> [c8d9bcf68ec25b279cf0bfce621b2b908f184a45]
+
+ Properly reset the row and column positions when a new sheet starts
+
+
+2023-09-03 Kohei Yoshida <kohei.yoshida@gmail.com> [ecb6a038e2a58b656c3ab25c2c0ee5adac17eb58]
+
+ Pick up font names and sizes
+
+ Also handle cases where a cell itself has bold font applied but
+ contains a non-bold part. Because xls-xml doesn't have a construct
+ for expressing a non-bold segment, it sets the bold flag with the
+ base cell and the bolded text segments while the non-bold segment
+ doesn't have a bold tag. What this means that we need to interpret
+ the absence of a bold tag to mean setting a non- bold format explicitly
+ for that segment. I'm assuming it's the same situation with the italic
+ attribute.
+
+2023-09-03 Kohei Yoshida <kohei.yoshida@gmail.com> [2ee17f5d8ce1f16dc9f0539c26c4fb20d57df01f]
+
+ Pick up underline, strikethrough, subscript and superscript format runs
+
+ These are not yet pushed to the document; it requires an API change.
+
+2023-09-03 Kohei Yoshida <kohei.yoshida@gmail.com> [f990788cbbf063786dc5fda6c0f22b65e7d512fe]
+
+ Use std::optional to determine whether or not the text is formatted
+
+
+2023-09-03 Kohei Yoshida <kohei.yoshida@gmail.com> [3075f884f5119fbf2ed6c6c7e63f4b6ddede0186]
+
+ Add more parent-child relations to cover rich-text format runs
+
+
+2023-09-03 Kohei Yoshida <kohei.yoshida@gmail.com> [1d0f25588f14bb365f00fd0e41bd20bc49f05e18]
+
+ Regenerate tokens for Excel 2003 XML (xls-xml)
+
+ The following new tokens are added:
+
+ - U
+ - S
+ - Sup
+ - Sub
+
+2023-09-03 Kohei Yoshida <kohei.yoshida@gmail.com> [889180e1a197e0471c94dec801557f00195cd8ba]
+
+ Fix the test files to make them in sync with the original Gnumeric test file
+
+
+2023-09-03 Kohei Yoshida <kohei.yoshida@gmail.com> [eafbaae29813ec9e93d34e0948cba8dde5fd8a29]
+
+ Update the test file to add another sheet
+
+ This is to test the logic of resetting the internal column and row
+ positions for new sheets.
+
+2023-09-03 Kohei Yoshida <kohei.yoshida@gmail.com> [c4fbb0d318a57423d6009e5bea175fa4df167cb9]
+
+ New Excel-sourced test files for format runs with font names and sizes
+
+
+2023-09-01 Kohei Yoshida <kohei.yoshida@gmail.com> [90118e49097d00e0d2bdfbcb567029cb65a6affa]
+
+ Add test case for mixed font names and sizes
+
+ And also make sure we handle overlapped format runs correctly.
+
+2023-09-01 Kohei Yoshida <kohei.yoshida@gmail.com> [d6b1d9fdb2e5c365f4b49208ad9d508e32ca3064]
+
+ Correctly handle overlapping format runs
+
+
+2023-09-01 Kohei Yoshida <kohei.yoshida@gmail.com> [ac25a3ddf16eacce8c3c4896686d4a5d3a0c1953]
+
+ Pick up font names and sizes in formatted strings
+
+ It is not tested yet as I've just discovered a bug where overlapped
+ format runs are not correctly imported.
+
+2023-08-30 Kohei Yoshida <kohei.yoshida@gmail.com> [4cd526367176704df7503e9f95b5c3c60ee1b7de]
+
+ Gnumeric *does* support colored format segments
+
+
+2023-08-29 Kohei Yoshida <kohei.yoshida@gmail.com> [8da21b3f5c52c34b8aac4807bcf2aa6f41bb17d8]
+
+ Alpha value should be maxed out for the segmen to be visible
+
+ Alpha value of 0 means it's transparent.
+
+2023-08-25 Kohei Yoshida <kohei.yoshida@gmail.com> [ccde68226fbda14f6ec922bef5eece5eb82dcbe1]
+
+ Add test case for number format import
+
+
+2023-08-25 Kohei Yoshida <kohei.yoshida@gmail.com> [344f0e9368a10e243fd751c26ae31f244acd13cd]
+
+ Pick up number formats and import them
+
+
+2023-08-24 Kohei Yoshida <kohei.yoshida@gmail.com> [0869ec20c1007b82394534064bbe1002e3cb293c]
+
+ Replace pstring with std::string_view & remove pstring class
+
+
+2023-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [b657b72d41e0efd6fd139aad2f8fbd85a7cf3b7a]
+
+ Add a test case for #185
+
+
+2023-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [b282a37a69a667c209e50e96ad7fe4bdb02cb18c]
+
+ Correctly handle column offset when the LeftCell value is > 1
+
+ Related to #185.
+
+2023-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [2dd719baeade0cb323c35f04566c2d0a9f843202]
+
+ Use a common header to manage filesystem header includes
+
+
+2023-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [314182936770f5ba831c5b734d3ce7812b037b99]
+
+ Let's always use std::filesystem in example code used in the doc
+
+ And disable building of the doc example sources by default.
+
+2023-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [632250f4264229115c75fff0626a42ec911a4d66]
+
+ Fix the build with parquet filter enabled
+
+
+2023-08-22 Fridrich Štrba <fridrich.strba@bluewin.ch> [a2c8e1de381570221560501ee7b7c65d0f443a29]
+
+ Possibility to build against a host of filesystem implementations
+
+
+2023-08-22 Fridrich Štrba <fridrich.strba@bluewin.ch> [3fc9b876a2bd8c75d0b555e989a5d659e5f1b878]
+
+ Fix narrowing warning
+
+
+2023-08-21 Kohei Yoshida <kohei.yoshida@gmail.com> [dc9f72d08f7dc93814e2f2cc4a8b8957da2a0935]
+
+ Use the 'ss' alias across the board
+
+
+2023-08-21 Kohei Yoshida <kohei.yoshida@gmail.com> [b9045632449fd5826f203386ce84afcabfdc24c1]
+
+ Add three test cases for importing borders
+
+ These are mostly copy-n-paste from the xls-xml test cases with some
+ adjustments. In Gnumeric, the colors of the black borders are
+ explicitly given, which get imported into the document accordingly.
+
+2023-08-21 Kohei Yoshida <kohei.yoshida@gmail.com> [9f732b05d465642e7ddb4d81ceae652cdee7a679]
+
+ Pick up the diagonal borders as well
+
+
+2023-08-21 Kohei Yoshida <kohei.yoshida@gmail.com> [0116ce27b570ddbde81b91878fe3334cf4bed0a9]
+
+ Import border styles to the document
+
+
+2023-08-21 Kohei Yoshida <kohei.yoshida@gmail.com> [0891b092c673f4a563309bb0ba943f64762f706a]
+
+ Move the font and fill import blocks into separate functions
+
+
+2023-08-18 Kohei Yoshida <kohei.yoshida@gmail.com> [e8b32e095b40414ab93edb1005c6df2197ea1153]
+
+ Use gnumeric_style::border_type as return type
+
+
+2023-08-17 Kohei Yoshida <kohei.yoshida@gmail.com> [63c0c862ea0f42320b35ea6e74014f17f7d9f97a]
+
+ Pick up cell border attributes
+
+ They are not commited to the document yet.
+
+2023-08-17 Kohei Yoshida <kohei.yoshida@gmail.com> [b594df2940dfb0d5949c2558af05954ec87eb80b]
+
+ Avoid inserting duplicate font entries
+
+
+2023-08-16 Kohei Yoshida <kohei.yoshida@gmail.com> [b5cbfcf189da87112e193d7a7f409997aee97410]
+
+ We can now remove gnumeric_helper
+
+
+2023-08-16 Kohei Yoshida <kohei.yoshida@gmail.com> [1b376bcdb57a3f14350a14b9e555489c6661b195]
+
+ We can at least test cell-wide strikethrough and underline
+
+
+2023-08-16 Kohei Yoshida <kohei.yoshida@gmail.com> [58183e7125d679976900d6d67831c6c9ad405c9f]
+
+ Rename the functions to make them less awkward
+
+
+2023-08-16 Kohei Yoshida <kohei.yoshida@gmail.com> [125c189373587930ed2cd5a664ae71fa56bbea87]
+
+ Pick up the font names and sizes
+
+
+2023-08-16 Kohei Yoshida <kohei.yoshida@gmail.com> [1a83b9285b612afc4a80c2d28cb5892ddb626db0]
+
+ Test the rest of the rows
+
+ Not all parts are tested due to a bug and unsupported format types.
+
+2023-08-16 Kohei Yoshida <kohei.yoshida@gmail.com> [80f9f6fc9345c1e1052bdeb04b5829a1c39af99a]
+
+ Implement a parser for ValueFormat and apply bold and italic formats
+
+ The rest will be supported later.
+
+2023-08-15 Kohei Yoshida <kohei.yoshida@gmail.com> [7403ddfef7b1bedad1755590c404a743bfadfe66]
+
+ Add test case for basic cell format attributes
+
+ Format runs are not yet implemented.
+
+2023-07-28 Kohei Yoshida <kohei.yoshida@gmail.com> [7549d7678e13354d4d9a135a4d63b392d1d0b3e8]
+
+ Pick up bold, italic, underline and strikethrough font properties
+
+
+2023-07-27 Kohei Yoshida <kohei.yoshida@gmail.com> [8b4b8b7e365bb68e04d7619dee3eb1cbed796bcf]
+
+ Use structured binding for better readability
+
+
+2023-07-27 Kohei Yoshida <kohei.yoshida@gmail.com> [50d36a78c7ebbac43eb5cd7a20497a6165cebd6f]
+
+ Add a test case for shared formula and array import
+
+
+2023-07-27 Kohei Yoshida <kohei.yoshida@gmail.com> [79d4ff35ba54cc6a7da259124c11989e18d2fdf6]
+
+ Correctly import shared formula cells
+
+ Also clarify the expection of the use of the import_formula interface
+ with regard to shared formulas.
+
+2023-07-27 Kohei Yoshida <kohei.yoshida@gmail.com> [f13d20e1e76fb0385b5dd8960fc884ae773bc83d]
+
+ Make sure mp_sheet is not null; it can be sometimes...
+
+ Especially when the interface providers are external code (such as
+ libreoffice)
+
+2023-07-26 Kohei Yoshida <kohei.yoshida@gmail.com> [ebadfa883f5a28dbe146f1530ca7d2d0a66630df]
+
+ Correctly handle cell's ValueType attributes
+
+ I took the ValueType values directly from Gnumeric's source.
+
+2023-07-26 Kohei Yoshida <kohei.yoshida@gmail.com> [d32ffc92ddc14fc7466f493f44db5c6533eb9f47]
+
+ Gnumeric doesn't support format runs
+
+ This means mixed-color texts are not possible.
+
+2023-07-26 Kohei Yoshida <kohei.yoshida@gmail.com> [e60392f01e932782141171a990b5f9e30ea15cb4]
+
+ Add a test case for text color imports
+
+ Except for support for format runs, which has yet to be implemented.
+
+2023-07-26 Kohei Yoshida <kohei.yoshida@gmail.com> [8897cf797f9826733d3c596065f84a727c12b4a2]
+
+ Add a test case for background fill colors
+
+
+2023-07-25 Kohei Yoshida <kohei.yoshida@gmail.com> [2e0c70d1cf51969f7d6f7e57668500879e81830b]
+
+ Pick up cell background colors and font colors
+
+
+2023-07-25 Kohei Yoshida <kohei.yoshida@gmail.com> [082a5d397d77fc70c21763897abf7bdd60e80038]
+
+ Add a test case for text-wrap
+
+ Gnumeric has yet to support shrink-to-fit, so that part is not tested.
+
+2023-07-25 Kohei Yoshida <kohei.yoshida@gmail.com> [0a9b943f99660b7d19800fb53bb9e914aec6b983]
+
+ Set horizontal and vertical alignment values only when they are set
+
+
+2023-07-25 Kohei Yoshida <kohei.yoshida@gmail.com> [0f197bea9fc8bb2c4be95e26def47bee55200a42]
+
+ Pick up wrap-text properties
+
+ Make sure that we pass this along only when it's set.
+
+2023-07-25 Kohei Yoshida <kohei.yoshida@gmail.com> [85ad90186c1ca4dbb5ef2b8b5bd99a9a73ed5102]
+
+ Add a test case for importing text alignment attributes
+
+ This is also a mostly copy-n-paste from the one for xls-xml.
+
+2023-07-24 Kohei Yoshida <kohei.yoshida@gmail.com> [3fa0ff090f0495793a98a4b80c2a1a6366bd4eac]
+
+ Actually push collected styles to document
+
+
+2023-07-24 Kohei Yoshida <kohei.yoshida@gmail.com> [95171382a9be1265a33cf5b226c99b1397d3ea74]
+
+ Collect all styles from all sheets and process them all at once
+
+ The processing part is still a TODO.
+
+2023-07-20 Kohei Yoshida <kohei.yoshida@gmail.com> [314789611e58be0c916796ae0c571e130c2b46d6]
+
+ Pick up style regions and horizontal and vertical text alignments
+
+
+2023-07-20 Kohei Yoshida <kohei.yoshida@gmail.com> [8a48591dca8a453051e73788618c3c2eb189b31e]
+
+ Set up an empty brand-new context for handling <gnm:Styles> scope
+
+
+2023-07-19 Kohei Yoshida <kohei.yoshida@gmail.com> [29380093d4ca57b40d2119f891b245ccc7feec05]
+
+ Dump global and sheet-local named expressions as part of debug-state output
+
+
+2023-07-19 Kohei Yoshida <kohei.yoshida@gmail.com> [52f262ab0322908375f668560539b5ada0dee7b8]
+
+ Add a test case for sheet-local named expression import
+
+ It's also a copy-n-paste from the equivalent test for xls-xml.
+
+2023-07-19 Kohei Yoshida <kohei.yoshida@gmail.com> [73ec9aaae2500cf39cd325971090fb852a59bd3a]
+
+ Also catch exception on failed named expressions in global scope
+
+
+2023-07-19 Kohei Yoshida <kohei.yoshida@gmail.com> [43cf244800459ba2ce76bd54a9ec67537dd50ed4]
+
+ Import sheet local named expressions
+
+
+2023-07-18 Kohei Yoshida <kohei.yoshida@gmail.com> [d2d2fd3f74df10b6bffa42acc05939e822921526]
+
+ Define element validation rules
+
+
+2023-07-18 Kohei Yoshida <kohei.yoshida@gmail.com> [5b622076b2bede0a67bfb09e76152c6878a9ead7]
+
+ Add a test for importing global named expressions
+
+
+2023-07-18 Kohei Yoshida <kohei.yoshida@gmail.com> [63a11492c50a1aab9d8a8fe4b8283ec67c1b8bf6]
+
+ Gnumeric lists sheet names ahead of time; use them to append sheets
+
+ This way all of the sheets have been created before the named expressions
+ get parsed, and the parsing will not fail because the sheet name is not
+ found.
+
+2023-07-18 Kohei Yoshida <kohei.yoshida@gmail.com> [9d7442d4b06b56a165d0e1b4b44484f716daa373]
+
+ Pick up global named expressions
+
+ It's not working yet as the expression is not being parsed
+ successfully.
+
+2023-07-17 Kohei Yoshida <kohei.yoshida@gmail.com> [5bf82a4a88be9d17c74105e77a5dff1e53658c56]
+
+ Pick up and set merged cell areas
+
+ The test case is a near copy-n-paste from the xls-xml test case.
+
+2023-07-17 Kohei Yoshida <kohei.yoshida@gmail.com> [8b6ca49d1696d142910e83e98d46adf5ec897d32]
+
+ Store the content of <gnm:Name> in a separate member
+
+
+2023-07-17 Kohei Yoshida <kohei.yoshida@gmail.com> [ca95cd5c71a2bbeb3c3bc1d527d01cce9abc21ba]
+
+ This is now handled in a separate context class
+
+
+2023-07-17 Kohei Yoshida <kohei.yoshida@gmail.com> [4e350e4f3b77725e7a0308a5f152df41906d78a4]
+
+ Define structure rules for sheet context
+
+ This is just an initial list; more will be added as needed.
+
+2023-07-17 Kohei Yoshida <kohei.yoshida@gmail.com> [d20b7a54909b9768d36dd11114f622cac6f1bb66]
+
+ Add test case for hidden rows and columns
+
+ This one is almost near copy-n-paste from the equivalent xls-xml
+ test case.
+
+2023-07-17 Kohei Yoshida <kohei.yoshida@gmail.com> [423a8fa9fa4027ad7e0dc371bafae75862166ca4]
+
+ Add element structure validation rules
+
+
+2023-07-17 Kohei Yoshida <kohei.yoshida@gmail.com> [f2fcafd49da5e1c3a9a031be000fae14287cd795]
+
+ Write a test case for auto filter import
+
+
+2023-07-13 Kohei Yoshida <kohei.yoshida@gmail.com> [92836be7bdb0dbcbb97b3c548e0936036ab8d7d9]
+
+ Dump the sheet-local auto-filter data & really set filtered range
+
+
+2023-07-12 Kohei Yoshida <kohei.yoshida@gmail.com> [580bf6856515b82c13bfc5249fef2e5ccccda500]
+
+ mp_sheet may be nullptr
+
+
+2023-07-12 Kohei Yoshida <kohei.yoshida@gmail.com> [06affd09679d276619c5d9c5110b44d9a15e1a78]
+
+ Move the auto filter import part into a separate context class
+
+
+2023-07-12 Kohei Yoshida <kohei.yoshida@gmail.com> [1cafaa88209ae1393fe83c8d0d27c3a0eb984eb8]
+
+ Unused headers
+
+
+2023-07-11 Kohei Yoshida <kohei.yoshida@gmail.com> [8ac123240a00beafd01e2b34afd21a4b057211d4]
+
+ Remove empty virtual methods that have default implementations
+
+
+2023-07-11 Kohei Yoshida <kohei.yoshida@gmail.com> [2a2b1377862934adc76e9f6b46198b1a1056ac0e]
+
+ Add test file for testing import of column widths and row heights
+
+
+2023-07-11 Kohei Yoshida <kohei.yoshida@gmail.com> [6da7fbfd76e45fda70df5778290cdcd661f0e359]
+
+ Dump column widths and row heights in debug-state output
+
+
+2023-07-10 Kohei Yoshida <kohei.yoshida@gmail.com> [426eddc384834e8f361a79fc85bb824564b2808f]
+
+ No need to add 1 to the end row here
+
+ The row size is used, which is already the max row index + 1.
+
+2023-07-10 Kohei Yoshida <kohei.yoshida@gmail.com> [c027097e49deb785037593ae4df8e89d4a0303fd]
+
+ Use segment_range() from mdds 2.1.1 with ranged for loop
+
+
+2023-07-10 Kohei Yoshida <kohei.yoshida@gmail.com> [ef273c84bd912e37f735d3166a3b81cf8e0e0704]
+
+ mp_child is not used & specify initial values in variable declaration
+
+
+2023-07-10 Kohei Yoshida <kohei.yoshida@gmail.com> [d7db8547a3af0b94bf1a4b92b5ba68669295383a]
+
+ Use color_rgb_t to store color values
+
+
+2023-07-10 Kohei Yoshida <kohei.yoshida@gmail.com> [502e6d9ad9d658e8ef5a84556de874d90eb30a8e]
+
+ We should use std::optional<T> for this type of struct
+
+
+2023-07-10 Kohei Yoshida <kohei.yoshida@gmail.com> [a13eaab39f90075d8b63b283a0b7ca10fc0784b6]
+
+ Use the string pool from the session context
+
+
+2023-07-10 Kohei Yoshida <kohei.yoshida@gmail.com> [a48d744792ab2fad47b3581db682ef1a814764fe]
+
+ Use ranged for loop instead of for_each()
+
+
+2023-07-08 Kohei Yoshida <kohei.yoshida@gmail.com> [78f4cf6a045de88cf24685a5df14dac6a3170988]
+
+ Use the shared-level string pool here
+
+
+2023-07-08 Kohei Yoshida <kohei.yoshida@gmail.com> [8bff98541d4a8103111bca68dd15cdda7603ae9e]
+
+ Use std::optional to store cell data & move the local types in ...
+
+ ... to the context class scope.
+
+2023-07-07 Kohei Yoshida <kohei.yoshida@gmail.com> [b583e7f1d6a13d26bef8881a12b3c6aaf7dc787a]
+
+ Use boost::filesystem & clean things up a bit
+
+
+2023-07-07 Kohei Yoshida <kohei.yoshida@gmail.com> [35d791117332be59c33f9046e005d9f982110749]
+
+ Add a test file with formula cells
+
+
+2023-07-07 Kohei Yoshida <kohei.yoshida@gmail.com> [0c190514d74f23d127e6382b3fa804a213e4d3cf]
+
+ Avoid atoi etc.
+
+
+2023-07-07 Kohei Yoshida <kohei.yoshida@gmail.com> [e769aa8db00d7daaf8453dd3f857310458b5d364]
+
+ gnumeric: Correctly import formula values
+
+ Gnumeric's formula expressions start with '=', but orcus expects a
+ formula expression to not start with '='. We need to strip it before
+ passing it to set_formula().
+
+2023-07-07 Kohei Yoshida <kohei.yoshida@gmail.com> [0cd43c15ecf5d9607c43e150ca581da81968984a]
+
+ Use namespace alias for orcus::spreadsheet
+
+
+2023-07-07 Kohei Yoshida <kohei.yoshida@gmail.com> [0ff4e0cecbca8bf72fe814d40ee8aa4102c83aba]
+
+ Some cleanup
+
+
+2023-07-05 Kohei Yoshida <kohei.yoshida@gmail.com> [21d8edaebeaf6d7bffc1c451706020b5eae17eef]
+
+ Fix some linting issues
+
+
+2023-06-30 Kohei Yoshida <kohei.yoshida@gmail.com> [45af843d8cc1f1cd98e47647c41758f6794802f2]
+
+ Pre-emptively avoid crashing
+
+ Not quite sure if this is a bug in StreamReader or not. But let's not
+ crash at least, until we find out more.
+
+2023-06-27 Kohei Yoshida <kohei.yoshida@gmail.com> [d921f115584c4e47f56164c663312f37998d7a95]
+
+ Add script to bulk-run a command on a number of files
+
+
+2023-06-27 Kohei Yoshida <kohei.yoshida@gmail.com> [5779658b05cff738c2fc3d7e662e4d7f6029e327]
+
+ Add orcus-parquet to the command list and regen the CLI doc pages
+
+
+2023-06-27 Kohei Yoshida <kohei.yoshida@gmail.com> [074ce7826c948c99d373df7f9449174638cea46e]
+
+ parse_import_filter_args() returns true on success, false on failure
+
+
+2023-06-22 Kohei Yoshida <kohei.yoshida@gmail.com> [6dc3701037657030758208fba86356a70b36d827]
+
+ Add test case involving float64 NaN
+
+ Also organize the test file generation script to make the test files
+ re-createable.
+
+2023-06-21 Kohei Yoshida <kohei.yoshida@gmail.com> [49e41b3665327f69399feafc181f61449e856dd4]
+
+ Include the exception message in the warning output
+
+ More info the better.
+
+2023-06-21 Kohei Yoshida <kohei.yoshida@gmail.com> [8ffed453f70b22d0bfc85b20cb0ccc708963676b]
+
+ Reading a value may throw an exception, so let's handle that
+
+ Especially a field with double type may store a 'null' value which will
+ throw if you try to read it as a double type.
+
+2023-06-21 Kohei Yoshida <kohei.yoshida@gmail.com> [0c4f76343813d3f0f20058c13322486ba80793fb]
+
+ New script to dump the structure of parquet file
+
+ It also dumps some data for the first number of rows. --num to specify
+ how many rows to print. For now, I'm only dumping data from the first
+ row group and from the first chunk.
+
+2023-06-19 Kohei Yoshida <kohei.yoshida@gmail.com> [8c4f9baf5d899a226795b4307dbf8df9b3bacba9]
+
+ When getting unexpected exception, at least keep partial import
+
+ It's better than not importing anything at all.
+
+2023-06-19 Kohei Yoshida <kohei.yoshida@gmail.com> [e48433f1a5088755a43a75438750fc48ff176e90]
+
+ Skip the column in stream reader when we can't import the value
+
+ Without this, reading of the next column value would fail.
+
+2023-06-19 Kohei Yoshida <kohei.yoshida@gmail.com> [99f444128127c4c82c23dc6f72d4d59f42fdf204]
+
+ Set the version to 0.18.99 (pre 0.19.0)
+
+
+2023-06-19 Kohei Yoshida <kohei.yoshida@gmail.com> [82d5a6c2b6ab38b11bfff87a17c880bd13053947]
+
+ Add test for orcus_parquet::read_stream()
+
+ Manually rename the sheet to the stem of the input file to ensure the
+ check string generated from the document matches the control.
+
+2023-06-19 Kohei Yoshida <kohei.yoshida@gmail.com> [521e726d62466912c00ce0af5feb8f040f902342]
+
+ Really support loading parquet files from in-memory stream
+
+ It was just a matter of using arrow::io::BufferReader to map
+ std::string_view, which can be directly passed onto ParquetFileReader
+ via its Open() method. BufferReader is a a sub-class of
+ RandomAccessFile.
+
+2023-06-12 Kohei Yoshida <kohei.yoshida@gmail.com> [5be2c29c08efc50ec55fb7bd2324b6bfe8000e27]
+
+ Add Apache Parquet to the list & drop consideration for non-spreadsheet filters
+
+
+2023-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [81b0b96f8e55af0a120e8751df52718b6fb3715e]
+
+ native() returns std::basic_string<wchar_t> on windows which will not compile
+
+
+2023-06-07 Kohei Yoshida <kohei.yoshida@gmail.com> [0394ca2814d2868bcaf6efadd4020e07bf6faae6]
+
+ Add parquet build option to cmake and make sure it builds
+
+
+2023-05-31 Kohei Yoshida <kohei.yoshida@gmail.com> [f7cfecd8d463ebb14332a287aa0fb21a781e27ed]
+
+ Write parquet stream to a temp file and load from it
+
+ Also don't forget to call the factory's finalize() method, per interface
+ contract.
+
+2023-05-26 Kohei Yoshida <kohei.yoshida@gmail.com> [29bf73c40486c561ea4106e032b15598ff957ed3]
+
+ Talk about the parquet support
+
+
+2023-05-26 Kohei Yoshida <kohei.yoshida@gmail.com> [987cd6106e94876f1d8d2451734f555390302b75]
+
+ Add ORCUS_WITH_PARQUET option to conditionalize parquet filter support
+
+ Also replace cmake's WITH_... options with ORCUS_WITH_... just to be in line
+ with what other projects do.
+
+ Note that currently ORCUS_WITH_PARQUET option is not tested, and will probably
+ not build.
+
+2023-05-26 Kohei Yoshida <kohei.yoshida@gmail.com> [b5039c9b830cc77fa58cbf275a30c90222baa5cf]
+
+ Re-organize the header includes & use <> instead
+
+
+2023-05-26 Kohei Yoshida <kohei.yoshida@gmail.com> [2fa656c0129fc0145e5048be48f3114ad89ddf79]
+
+ Print created-by property from the metadata
+
+
+2023-05-26 Kohei Yoshida <kohei.yoshida@gmail.com> [e9ae4dc6f62acb3f75d8717d57822f080f96fe1c]
+
+ Slightly more probing during parquet format detection
+
+
+2023-05-26 Kohei Yoshida <kohei.yoshida@gmail.com> [0952781006e1c0f3b5e0fe7750d37d628d998bb9]
+
+ Implement basic detection algorithm for parquet
+
+ For now, we only do bare minimum check.
+
+2023-05-26 Kohei Yoshida <kohei.yoshida@gmail.com> [72aa00601b98f58a874c8840e89ec8fe0ce5e0cd]
+
+ Add the ability to dump metadata from a parquet stream
+
+
+2023-05-25 Kohei Yoshida <kohei.yoshida@gmail.com> [941af5d4696de63c36fd180fb9cdd15cafdcb898]
+
+ Add a basic test case for the Parquet file format
+
+
+2023-05-25 Kohei Yoshida <kohei.yoshida@gmail.com> [0097ca9f45c6ab9c522b0654aedc0a003699e123]
+
+ Better to skip unsupported value types than throwing exception
+
+ But issue warnings at least.
+
+2023-05-25 Kohei Yoshida <kohei.yoshida@gmail.com> [b42d25e1ff994073537b97a255f2e4a6fddfc59f]
+
+ Add basic support for INT32 and FLOAT physical column types
+
+
+2023-05-25 Kohei Yoshida <kohei.yoshida@gmail.com> [dc8646f31b671a1d9adfde62e81c8c3cd41c29df]
+
+ Let's not randomize the string values
+
+ It's better to make the test documents reproducible.
+
+2023-05-24 Kohei Yoshida <kohei.yoshida@gmail.com> [47319f9c292c38e1830213735a97b917727c47a7]
+
+ Generate a basic set of test files for parquet
+
+
+2023-05-23 Kohei Yoshida <kohei.yoshida@gmail.com> [62d2d17f547cff16f1017ad7a743d72be190117d]
+
+ Restructure the code to make it easier to add handled types
+
+
+2023-05-22 Kohei Yoshida <kohei.yoshida@gmail.com> [8714100e01b933e98e4e72d7724dcba1e75d8dba]
+
+ Move the read_file() code into the impl class
+
+
+2023-05-22 Kohei Yoshida <kohei.yoshida@gmail.com> [4bf80b62b428ba521d836d3273a037551c1e291c]
+
+ Import picked up values into sheet
+
+ Also clean up debug outout.
+
+2023-05-22 Kohei Yoshida <kohei.yoshida@gmail.com> [e06ec4fe927d1bf8cb1091909509e227e23ff52b]
+
+ Turn off parquet filter by default
+
+
+2023-05-19 Kohei Yoshida <kohei.yoshida@gmail.com> [dcb69fe42420015802dceba1e312ea806e21e1d0]
+
+ Start parsing from file and write values to stdout for now
+
+
+2023-05-19 Kohei Yoshida <kohei.yoshida@gmail.com> [f6afbade76373e799e0f2b7b2508ce2f4294d71f]
+
+ Create an empty setup for orcus-parquet command
+
+
+2023-05-18 Kohei Yoshida <kohei.yoshida@gmail.com> [b3c5700adf790cdabce40bd1a94d512b68049189]
+
+ Use column descriptor to determine column value types
+
+
+2023-05-17 Kohei Yoshida <kohei.yoshida@gmail.com> [9cae5bd52544b696046082b0dc491b5c3a99dab1]
+
+ Explore the Parquet file format and the Arrow Parquet API
+
+
+2023-05-15 Kohei Yoshida <kohei.yoshida@gmail.com> [49fabacdb0cd8002a13a9e224944284566560c9d]
+
+ Update the CI script
+
+
+2023-02-10 Kohei Yoshida <kohei.yoshida@gmail.com> [f3a40e69e890c262e6e8ea7649a6c96e854ba82b]
+
+ Fix grammar error
+
+
+2023-02-09 Kohei Yoshida <kohei.yoshida@gmail.com> [02721652da67cbe1307496c902aad5c7480be75e]
+
+ Add new items for 0.18.1
+
+
+2023-02-09 Kohei Yoshida <kohei.yoshida@gmail.com> [eb221592993f7db530d179ccb372185e0245da0d]
+
+ Mark potentially unused variables
+
+
+2023-02-09 Kohei Yoshida <kohei.yoshida@gmail.com> [6c3389fe20a83bd5afec3cf249093017125178e5]
+
+ Remove unused variables
+
+
+2023-02-09 Kohei Yoshida <kohei.yoshida@gmail.com> [05caaaf3ebba67a949a5bb63eecb5504bde75c91]
+
+ Let's not redefine NDEBUG as it still makes assert no-op in release build
+
+
+2023-02-09 Kohei Yoshida <kohei.yoshida@gmail.com> [1adfcc8e914b4c209f15bedf91fa40409c973beb]
+
+ Fix make distcheck
+
+
+2023-02-09 Kohei Yoshida <kohei.yoshida@gmail.com> [9df4abfc6559fc465003e29bb5b0bb9dc6353f74]
+
+ Set version number to 0.18.1
+
+
+2023-02-08 Kohei Yoshida <kohei.yoshida@gmail.com> [b5470c93471d9954f76624a60318466dff0f4f11]
+
+ We shouldn't need this visibility marker
+
+
+2023-02-08 Kohei Yoshida <kohei.yoshida@gmail.com> [45e11ea56126c7dac271706afaaa84b11725f173]
+
+ Add --with-doc-example configure switch (default on)
+
+
+2023-02-08 Kohei Yoshida <kohei.yoshida@gmail.com> [3ed7e1fcc7b16f4158b2d3ecd59e3b2b497fc874]
+
+ Add --with-benchmark configure switch (default on)
+
+
+2023-02-07 Kohei Yoshida <kohei.yoshida@gmail.com> [30a8465b2ccc6190ac6d95208ef6eefa12eec533]
+
+ More build fixes with VS 2019
+
+
+2023-02-07 Kohei Yoshida <kohei.yoshida@gmail.com> [bcf260a03a62b6d771c3a410352db43000a338d4]
+
+ Use correct visibility macro
+
+
+2023-02-07 Kohei Yoshida <kohei.yoshida@gmail.com> [250dbd2978d8381d3270f7fbc8a3f4f4f6581294]
+
+ Fix build with VS 2019
+
+
+2023-02-07 Kohei Yoshida <kohei.yoshida@gmail.com> [c616b0a29e4d8d97e561ee54abc53afddcaf19c0]
+
+ Add peek_chars() to simplify the BOM sniffing
+
+
+2023-02-07 Kohei Yoshida <kohei.yoshida@gmail.com> [0a439a42f57152f46b63afe069d5e17b8b0c056f]
+
+ Use the now global skip_bom()
+
+
+2023-02-07 Kohei Yoshida <kohei.yoshida@gmail.com> [f7bf29ddc8adae3ad27e3ef646f381489dfc836a]
+
+ Check for BOM first then skip leading space
+
+ It's unlikely that BOM be placed at a non-head position.
+
+2023-02-07 Kohei Yoshida <kohei.yoshida@gmail.com> [540e23f311cd502be7fc8a450aaf9221fbe798bf]
+
+ Move skip_bom() to global parser_base class
+
+ BOM is used in other format types too.
+
+ Also rename next_char() to peek_char() with an optional offset. The
+ term `peek` implies checking a character at an advanced position
+ without moving the current position.
+
+2023-02-07 Kohei Yoshida <kohei.yoshida@gmail.com> [e377994de03c4e9a70146c9724c1e0e28fc40217]
+
+ Use available_size() over remains()
+
+ These two methods did the same thing. Let's just keep one.
+
+2023-02-06 Kohei Yoshida <kohei.yoshida@gmail.com> [ba230ab983a9e42c17fd415fed12e682ffc6f344]
+
+ Add a test framework for valid XML documents
+
+
+2023-02-06 Kohei Yoshida <kohei.yoshida@gmail.com> [03526b4f3a62aaf06b4ea563f2dc09e95cb41b88]
+
+ Add two more invalid XML files that only contain BOM's
+
+
+2023-02-06 Kohei Yoshida <kohei.yoshida@gmail.com> [8269277e445d23646e14a03b3b25152e5438ba73]
+
+ Add an invalid XML file with double BOM's and a wrong byte
+
+ This file starts with double BOM's followed by an invalid byte. One
+ or more BOM's must be followed by a '<'.
+
+2023-02-06 Kohei Yoshida <kohei.yoshida@gmail.com> [9116c32093fc1d6dc9779f82cecf1da3b0901e03]
+
+ Simplify BOM skipping logic
+
+
+2023-02-06 Kohei Yoshida <kohei.yoshida@gmail.com> [24ef26927b2f297579d879f4efdde06c9dc18e27]
+
+ Skip leading space first them handle BOM
+
+
+2023-02-06 Kohei Yoshida <kohei.yoshida@gmail.com> [b36fd7fde0d2692ad422aa3fe9d510fef612b3e4]
+
+ Add a test case for XML doc starting with double BOM's
+
+
+2023-02-06 Andreas Heinisch <andreas.heinisch@yahoo.de> [a8f9afe098bb08e5c9b1580649ead918a37a7b31]
+
+ Changed skip_bom in order to address tdf#150023
+
+ Double BOM (invalid XML) prevents importing some Excel 2003 XML
+ (Excel reads them)
+
+ c.f. https://bugs.documentfoundation.org/show_bug.cgi?id=150023
+
+ Patch modified from !151.
+
+ Signed-off-by: Kohei Yoshida <kohei.yoshida@gmail.com>
+
+2023-02-03 Kohei Yoshida <kohei.yoshida@gmail.com> [e1d8dd99da39a9663ca0cfa8f6dcbb633e0df59b]
+
+ Add a test case
+
+
+2023-02-03 Kohei Yoshida <kohei.yoshida@gmail.com> [5dd614219ce562d3397cf94f12c55f362b6ffc71]
+
+ No 'using namespace std'
+
+
+2023-02-03 Kohei Yoshida <kohei.yoshida@gmail.com> [f338c3a4139787e377266ebd93b579e0253b8605]
+
+ Some cleanup
+
+
+2023-02-03 Kohei Yoshida <kohei.yoshida@gmail.com> [928a5ba1f9e7e1f1f6fc652bee0f244a049e5f81]
+
+ Revise the logic of determining the range parent from first linked field
+
+ This new logic should work with the use case in #172.
+
+2023-02-02 Kohei Yoshida <kohei.yoshida@gmail.com> [2b7f4c629eee682c2f5bf4ef02a55c70d38e8bba]
+
+ enum to enum class
+
+ On the following enum types:
+
+ * linkable_node_type
+ * reference_type
+ * element_type
+
+2023-02-02 Kohei Yoshida <kohei.yoshida@gmail.com> [29dbe18fc32ba2ad69da7a2f4271472adf494888]
+
+ pstring -> std::string_view
+
+
+2023-02-02 Kohei Yoshida <kohei.yoshida@gmail.com> [a1a4aaddb07081968e393f48e4614b41e10c66dd]
+
+ No 'using namespace std' & use ranged-for loop
+
+
+2023-01-24 Kohei Yoshida <kohei.yoshida@gmail.com> [f0653d1d72b8888be4fdb40b8b8541fc64b23c7d]
+
+ Only pass the border color when it's actually set
+
+
+2023-01-12 Kohei Yoshida <kohei.yoshida@gmail.com> [f1d7888a1857e5aacdebb728face3f543b015d82]
+
+ Fix orcus-check target in cmake build
+
+
+2023-01-12 Kohei Yoshida <kohei.yoshida@gmail.com> [6ab3b89d71ceb88eaae6fefa76077a7599632ea0]
+
+ Add yaml-parser-test to the test list and fix build breakage
+
+
+2023-01-12 Kohei Yoshida <kohei.yoshida@gmail.com> [8949c3530b1940e5395e46b1c73965b89e149d40]
+
+ Fix make distcheck
+
+
+2023-01-10 Kohei Yoshida <kohei.yoshida@gmail.com> [077567f2053a19e096caedf3a394d3ef396a70d1]
+
+ Take std::ostream& as an output parameter
+
+
+2023-01-10 Kohei Yoshida <kohei.yoshida@gmail.com> [d4c513b8a13f2a393e8342bebb9e7707acf2e93c]
+
+ Edit docs on shared_strings
+
+
+2023-01-10 Kohei Yoshida <kohei.yoshida@gmail.com> [5fb945c5053f4b0ba6d06db697e16ebaf7460809]
+
+ Edit docs on styles symbols
+
+
+2023-01-10 Kohei Yoshida <kohei.yoshida@gmail.com> [71e73f22a3b721642e4ec0659683f564bc291b57]
+
+ Declare class default methods & simplify commit_column()
+
+
+2023-01-09 Kohei Yoshida <kohei.yoshida@gmail.com> [b287a72181a79d562bca08c4f8645bb3a047291a]
+
+ Forgot to add these files...
+
+
+2023-01-09 Kohei Yoshida <kohei.yoshida@gmail.com> [441b659396b5481290b8dd6785c13dcf797a1a9c]
+
+ This is worth mentioning.
+
+
+2023-01-09 Kohei Yoshida <kohei.yoshida@gmail.com> [a0594933baefb970c9e6a8d966ff6df642b90fbb]
+
+ Adjust titles a bit
+
+
+2023-01-09 Kohei Yoshida <kohei.yoshida@gmail.com> [d677b1c80d5e835d2df8dd54369d5bb2ec3d03b0]
+
+ Rename the filter section as core, and move the tree doc into it
+
+ This structure makes more sense.
+
+2023-01-09 Kohei Yoshida <kohei.yoshida@gmail.com> [567d66c44b8b46742222fe31330b6677721bf9e5]
+
+ More editing of the spreadsheet document section
+
+
+2023-01-07 Kohei Yoshida <kohei.yoshida@gmail.com> [25f3a09c0076c7c642fa2317d7a2d18469008e03]
+
+ Re-org the import and export factory section
+
+
+2023-01-07 Kohei Yoshida <kohei.yoshida@gmail.com> [95d48828d47a4eddb62c46ec6c47f4a19aba2af4]
+
+ These classes don't need to be public
+
+
+2023-01-07 Kohei Yoshida <kohei.yoshida@gmail.com> [8ae9d0a2128dd9abbea6b28d1949d9620e50b64b]
+
+ Split the section into multiple subpages
+
+
+2023-01-07 Kohei Yoshida <kohei.yoshida@gmail.com> [712300d2d171db86ce701b0cc5df29531ac58157]
+
+ Add 'index' role to reference the landing page from another project
+
+
+2023-01-07 Kohei Yoshida <kohei.yoshida@gmail.com> [62ff33abcce0f47e03dbaa0cb2ba72a0054821b5]
+
+ Add inter-sphinx mapping to ixion doc
+
+
+2023-01-06 Kohei Yoshida <kohei.yoshida@gmail.com> [02f3d921ce22d35ed88e921cb53b59895ba005d3]
+
+ These methods no longer need to be public
+
+
+2023-01-06 Kohei Yoshida <kohei.yoshida@gmail.com> [0174e8bf89e4b21bcf3955b394f4804bfca9b423]
+
+ Move up the interface methods
+
+
+2023-01-06 Kohei Yoshida <kohei.yoshida@gmail.com> [8abe382dcb80a9e0b9510e8ee7fd6e6f99d7fd70]
+
+ Include yaml::document_tree for real
+
+
+2023-01-06 Kohei Yoshida <kohei.yoshida@gmail.com> [5c5f8f47abdeaffc5a71a1175c28d4e44775e6f6]
+
+ Hide finalize() and ensure it gets called only from import_factory
+
+
+2023-01-06 Kohei Yoshida <kohei.yoshida@gmail.com> [4d109272c9110ad9cf91c46bb3b511ecae1dfb86]
+
+ Document and clean up the API of spreadsheet::document
+
+ Still on-going.
+
+2023-01-06 Kohei Yoshida <kohei.yoshida@gmail.com> [24db55b87c2ca24b76767ffdc9bc260e622889f8]
+
+ Seprate sections for tree-structured docs from spreadsheet doc
+
+ The tree docs are provided by liborcus, whereas the spreadsheet doc
+ is provided by liborcus-spreadsheet.
+
+ Also standardize on using hyphens for the doc.
+
+2023-01-06 Kohei Yoshida <kohei.yoshida@gmail.com> [635b583be1f1e353dfa5f8f2f2ec09810fd404ab]
+
+ Be specific about the value range
+
+
+2023-01-06 Kohei Yoshida <kohei.yoshida@gmail.com> [7a0d23c485a745f01e0bdeca5a7dc5627dcfa53d]
+
+ Call the section just "Utilities"
+
+
+2022-12-21 Kohei Yoshida <kohei.yoshida@gmail.com> [49ae1ab7b1ff7ec335bef7b891f54df76c680311]
+
+ Re-organize the filter section a bit more
+
+ Let's not repeat the word 'spreadsheet' needlessly; that's mostly implied.
+
+2022-12-21 Kohei Yoshida <kohei.yoshida@gmail.com> [1a6ca15759a3f9a9a7d39081271f714249fe5d6b]
+
+ Adjust section titles
+
+
+2022-12-21 Kohei Yoshida <kohei.yoshida@gmail.com> [d766afe8fc2baed26e5118cce4c34e5d5e3ec5f7]
+
+ Reorganize the import filter section a bit
+
+ Also add some intros in the parser and filter index pages.
+
+2022-12-20 Kohei Yoshida <kohei.yoshida@gmail.com> [c9a41c95a01c2cbf0e8b6e07c7a163564c07e2e7]
+
+ Move the utility functions page up one level
+
+
+2022-12-20 Kohei Yoshida <kohei.yoshida@gmail.com> [58c8b14943435f18390ee2a5269170ac0eac9b6b]
+
+ Document sheet view specific types
+
+
+2022-12-20 Kohei Yoshida <kohei.yoshida@gmail.com> [8611df752815f5e39563117a2f9cfb85c3b88afe]
+
+ underline_attrs_t is unused
+
+
+2022-12-20 Kohei Yoshida <kohei.yoshida@gmail.com> [6bd7224a2741febd75aa8f3067c8450897455edd]
+
+ Document the view and export interfaces
+
+
+2022-12-19 Kohei Yoshida <kohei.yoshida@gmail.com> [e1204631a43981c5655bda695364740e2a9b8d0f]
+
+ Use code markers to pick up code blocks from source file
+
+
+2022-12-19 Kohei Yoshida <kohei.yoshida@gmail.com> [014ee4b29c8d7fb74ba2e9901defde9fe2fc58b8]
+
+ Go through the styles import interfaces and add or edit docs
+
+
+2022-12-15 Kohei Yoshida <kohei.yoshida@gmail.com> [450b69e7c5f5e9a5984acf1f3c8535dd239eb10b]
+
+ Reword the description of the base_index parameter
+
+ The old wording sounded weird and probably was not factual.
+
+2022-12-14 Kohei Yoshida <kohei.yoshida@gmail.com> [d9b740e1e5c0fa0aa0dd10dacf7748acb74dcd95]
+
+ Document pivot table related interfaces
+
+ Also rename create_field_group() to start_field_group(), and check for
+ the field group interface pointer before dereferencing it.
+
+2022-12-14 Kohei Yoshida <kohei.yoshida@gmail.com> [8b47b0c44c24426d12b5a2ba2b838349dc135d3f]
+
+ Remove 'using namespace std'
+
+
+2022-12-14 Kohei Yoshida <kohei.yoshida@gmail.com> [3ed31f183e8412b097cd51c090a72de129dbdb88]
+
+ import_table::set_range() to take a range_t value
+
+
+2022-12-14 Kohei Yoshida <kohei.yoshida@gmail.com> [61327a44622474ff1f9e92861fc3f4f433350f88]
+
+ Document import_array_formula
+
+
+2022-12-13 Kohei Yoshida <kohei.yoshida@gmail.com> [1661fcfd0064f7d70052107104ac1ff8f0580d3e]
+
+ Add description to import_formula interface
+
+
+2022-12-13 Kohei Yoshida <kohei.yoshida@gmail.com> [63c56e1a1a00f4fa8a8d6cc422b1042cea314eb3]
+
+ Document import_table interface
+
+
+2022-12-13 Kohei Yoshida <kohei.yoshida@gmail.com> [146300b1ba58382d1966cfc09b29e5c34d1bf2d2]
+
+ Update the test files for conditional formatting in xlsx
+
+
+2022-12-13 Kohei Yoshida <kohei.yoshida@gmail.com> [014ffb66079ddca7b7e6fa8e07a0483dc4963523]
+
+ Edit the doc for import_conditional_format
+
+ We should revise this interface for 0.19.0. For 0.18.0 it will be
+ unchanged.
+
+2022-12-13 Kohei Yoshida <kohei.yoshida@gmail.com> [80676ec15b65ea6564d4a2466dfcaa456ce36d85]
+
+ Test file for conditional formatting import
+
+ This one contains only the basic rule set. Other features such as databar will
+ be coming later.
+
+2022-12-12 Kohei Yoshida <kohei.yoshida@gmail.com> [e0dc2777e10a281bc560c44c359c7c084ecc3c29]
+
+ Go through and edit the doc on import_auto_filter
+
+
+2022-12-12 Kohei Yoshida <kohei.yoshida@gmail.com> [3732a9287ffba8ba3814e08b54f6b6aa74dec0da]
+
+ Document import_data_table interface
+
+
+2022-12-12 Kohei Yoshida <kohei.yoshida@gmail.com> [bd3dd50edf12f7083729f9fc6b01138cd5830273]
+
+ Edit the doc on import_sheet_properties
+
+
+2022-12-12 Kohei Yoshida <kohei.yoshida@gmail.com> [6b8b218a81d1eed6ca47cdbe6a1f757af2732fde]
+
+ Go through and edit the doc on import_sheet
+
+
+2022-12-10 Kohei Yoshida <kohei.yoshida@gmail.com> [0e922fe148e8a027c03827a75f8c113a583e0cb9]
+
+ Give a brief introduction for the document import section
+
+
+2022-12-10 Kohei Yoshida <kohei.yoshida@gmail.com> [7abedd3166f0a0dbdad98b874885957091b1e90a]
+
+ Provide a class description for import_reference_resolver interface
+
+
+2022-12-07 Kohei Yoshida <kohei.yoshida@gmail.com> [c0c1089a744ad31667b215b45c31f12d9acbd7bb]
+
+ Edit the doc for import_named_expression interface
+
+
+2022-12-07 Kohei Yoshida <kohei.yoshida@gmail.com> [6b713551d8de28c83d107e35fa3de457e020ca8f]
+
+ Go through and edit the doc for import_shared_strings
+
+
+2022-12-05 Kohei Yoshida <kohei.yoshida@gmail.com> [ebcab14008399e785f4b79d8021f8a5549e86660]
+
+ Go through and add or edit docs for global settings interface
+
+
+2022-12-05 Kohei Yoshida <kohei.yoshida@gmail.com> [2fa3581fef1845337eba4c4e2fc86f6d9b2f8bd9]
+
+ Edit documentation for import_factory
+
+
+2022-12-05 Kohei Yoshida <kohei.yoshida@gmail.com> [c8ce41c8321fb1d907357be37e1d9d995494df31]
+
+ Separate the sheet import interfaces into own section
+
+
+2022-12-05 Kohei Yoshida <kohei.yoshida@gmail.com> [5d047a0df31cb4e5baafb7e6d4bd13335e219a5c]
+
+ Split the spreadsheet interface section into multiple sub-pages
+
+
+2022-12-05 Kohei Yoshida <kohei.yoshida@gmail.com> [7fdc89c2a0fbbd4f4b482d1567f54caa831fcd09]
+
+ More on documenting the base spreadsheet types
+
+ Move color_t, format_run and format_runs_t to document_types.hpp,
+ since technically these types are only used in the backend document
+ model.
+
+2022-11-30 Kohei Yoshida <kohei.yoshida@gmail.com> [0d9926657e07b0700dc28054432b88beb0da542b]
+
+ Add more docs to spreadsheet types
+
+ This is still on-going.
+
+2022-11-30 Kohei Yoshida <kohei.yoshida@gmail.com> [3bd57018eaa7337808bf6cfc39a584d7e10a285a]
+
+ Tweak the global interface page & use std::string_view for read_file()
+
+
+2022-11-30 Kohei Yoshida <kohei.yoshida@gmail.com> [747342a40fbd7f6f2373c9b53a15d7dab876415c]
+
+ Split the interface section into multiple pages
+
+
+2022-11-29 Kohei Yoshida <kohei.yoshida@gmail.com> [0c7661c4a5f25b63335aa6ad43e1edac751a27ba]
+
+ Document the global filter interfaces & re-org the doc structure a bit
+
+
+2022-11-29 Kohei Yoshida <kohei.yoshida@gmail.com> [337592a0f77700c6b3d181f6ef854d90534aff83]
+
+ Remove get() and size() from cell_buffer in favor of str()
+
+
+2022-11-29 Kohei Yoshida <kohei.yoshida@gmail.com> [9bb243e944543a10522d0f20e36c2b87a1579869]
+
+ yaml_parser to adopt std::string_view
+
+
+2022-11-29 Kohei Yoshida <kohei.yoshida@gmail.com> [1d1978d3d3ea10120e4ad5f5b7bd72d5a6bc7061]
+
+ csv_parser to adopt std::string_view where appropriate
+
+
+2022-11-29 Kohei Yoshida <kohei.yoshida@gmail.com> [badf216eb3909d9809de3c5c6c9e79a262d6daab]
+
+ Document combinators
+
+
+2022-11-29 Kohei Yoshida <kohei.yoshida@gmail.com> [1df0147193431ff99534a86411011fbe6d4ed4ec]
+
+ Use std::string_view as the key type for sorted_string_map
+
+
+2022-11-29 Kohei Yoshida <kohei.yoshida@gmail.com> [ff7970aad468b31241b8aaff67bd98d14f95648f]
+
+ Add more content to our CSS doc
+
+
+2022-11-29 Kohei Yoshida <kohei.yoshida@gmail.com> [a2d774549211b49254f1af447648e32b0ab4bb75]
+
+ Use std::string_view in public functions
+
+
+2022-11-29 Kohei Yoshida <kohei.yoshida@gmail.com> [0ede4c01a6d5fd7ae6b8378db4436a4ded07decf]
+
+ json_parser and its handler to use std::string_view over char*-size pair
+
+
+2022-11-29 Kohei Yoshida <kohei.yoshida@gmail.com> [76cdac58f46b3c1647ec658c1abac9fda647d1ed]
+
+ All sax parsers to take contents as std::string_view
+
+
+2022-11-24 Kohei Yoshida <kohei.yoshida@gmail.com> [79407cf53f80fce872d0829e13f950ba017c3fbf]
+
+ Remove unnecessary @p tags
+
+
+2022-11-24 Kohei Yoshida <kohei.yoshida@gmail.com> [a06ed2d664a12ffcdb85f74b7c2a8209d715863b]
+
+ Document base64 utility functions
+
+ These are currently not actively used, but may be used in the future.
+
+2022-11-24 Kohei Yoshida <kohei.yoshida@gmail.com> [c1adf7bf4ea777e4fc6612b264cae531471204e3]
+
+ Document the rest of basic enum types
+
+
+2022-11-24 Kohei Yoshida <kohei.yoshida@gmail.com> [f43f16a399e9c5dc13f4ec1d7ec2b94873b40f5d]
+
+ Make xmlns_repository movable
+
+
+2022-11-24 Kohei Yoshida <kohei.yoshida@gmail.com> [7b9eeb082ce8ef31c7be8e71a312adc4838ae01c]
+
+ Add more details to the docs of XML namespace classes
+
+ Also rename 'key' with 'alias', as the latter sounds more apt.
+
+2022-11-24 Kohei Yoshida <kohei.yoshida@gmail.com> [a0d9574612084f2ef576066723c86a496d376800]
+
+ xmlns_repository::get_short_name(size_t) is not used at all
+
+ Only the other variant is used.
+
+2022-11-24 Kohei Yoshida <kohei.yoshida@gmail.com> [d2931aa472065b8c12abdc16ddc84e50e62585d9]
+
+ More on documenting the basic types and adding default member functions
+
+
+2022-11-24 Kohei Yoshida <kohei.yoshida@gmail.com> [7e82df8d3d80a959fe54ce12fc059bd24bf61397]
+
+ Use type alias here
+
+
+2022-11-24 Kohei Yoshida <kohei.yoshida@gmail.com> [3118ce31a7f5d4818ad73d876d28d8924980e916]
+
+ Document these type aliases
+
+
+2022-11-24 Kohei Yoshida <kohei.yoshida@gmail.com> [0c522e8de8d86b3000ea2c2ac48b3e95a6093768]
+
+ Move previously public types into liborcus only location
+
+ These types are only used within liborcus
+
+2022-11-23 Kohei Yoshida <kohei.yoshida@gmail.com> [b3a9486c0b05162fc97477994a445006291660ea]
+
+ Organize docs on date_time_t & use default keywords where appropriate
+
+
+2022-11-23 Kohei Yoshida <kohei.yoshida@gmail.com> [131eece503963b4687b2a0664883ab0d3fcd831c]
+
+ Rename xml_attrs_t to xml_token_attrs_t
+
+
+2022-11-23 Kohei Yoshida <kohei.yoshida@gmail.com> [5979effb63e6663b387f591919d7eef66f00e7a1]
+
+ Upcase index_not_found for consistency as a global constant
+
+
+2022-11-23 Kohei Yoshida <kohei.yoshida@gmail.com> [5813ef70363a0eadb073b2afb60a1cfadda4c5fc]
+
+ Organic doc items in types.hpp & reorder sections under parser
+
+
+2022-11-22 Kohei Yoshida <kohei.yoshida@gmail.com> [9f1d7074002b6adbee6dfc98f5200bd9f97c0ae2]
+
+ Add orcus_json to the doc
+
+
+2022-11-22 Kohei Yoshida <kohei.yoshida@gmail.com> [25b25d646a3919e78b70bf53a10a8937e9ef0a46]
+
+ Use sentence casing for section headers
+
+
+2022-11-22 Kohei Yoshida <kohei.yoshida@gmail.com> [254c5f34a6333796bb076e34161e1c98ba207517]
+
+ Remove dump_file_entry() which wasn't generally very useful
+
+ Instead, add a method that returns the header info and add a function
+ to print it to std::ostream.
+
+2022-11-22 Kohei Yoshida <kohei.yoshida@gmail.com> [fb598144d8ba4d49a25848537f2daaadf50b6e4d]
+
+ Remove using namespace std
+
+
+2022-11-22 Kohei Yoshida <kohei.yoshida@gmail.com> [559a1f116c3dce9c9c489d63af8ec4821de0e7a2]
+
+ read_file_entry() to return the retrieved data stream directly
+
+
+2022-11-22 Kohei Yoshida <kohei.yoshida@gmail.com> [5a38a5af5016898480e3b34fb5b9a70216479016]
+
+ Use std::unique_ptr for the pimpl idiom
+
+
+2022-11-22 Kohei Yoshida <kohei.yoshida@gmail.com> [24bd9006ddc22b27a75a4111ee47af9672c23c4f]
+
+ Move zip_error into exception.hpp
+
+
+2022-11-21 Kohei Yoshida <kohei.yoshida@gmail.com> [befe0dcc6be5a27677d88041241bd18cbc4b7e66]
+
+ Create a section for zip archive related classes
+
+
+2022-11-21 Kohei Yoshida <kohei.yoshida@gmail.com> [2cf2a04d9faed476c62153ce75a3464c497b0af2]
+
+ I have no use for this
+
+
+2022-11-21 Kohei Yoshida <kohei.yoshida@gmail.com> [556d35bdb9b9008090b6810a38eac99c5f23a128]
+
+ Kill the idea of "transient stream"
+
+ That was mis-guided.
+
+2022-11-21 Kohei Yoshida <kohei.yoshida@gmail.com> [22e07945c0d826a80887af0f7b208e4c4ca11604]
+
+ Move malformed_xml_error to exception.hpp
+
+ And take it out of the sax namespace.
+
+2022-11-21 Kohei Yoshida <kohei.yoshida@gmail.com> [cfb0ad6454422bc5db08acf7b911ce632dea14fd]
+
+ This variant of ctor is used in derived classes only
+
+
+2022-11-21 Kohei Yoshida <kohei.yoshida@gmail.com> [8300189c8beaa2e7490feed0e204ff3f252bcc15]
+
+ Pass std::string as r-value when appropriate
+
+
+2022-11-21 Kohei Yoshida <kohei.yoshida@gmail.com> [0929753d505222e4ecd4f19bc2167ee4e22292ab]
+
+ build_message() can be private
+
+
+2022-11-21 Kohei Yoshida <kohei.yoshida@gmail.com> [bf114ce3903efeaed3f478ba6d08d2e192cf93fd]
+
+ Remove yaml::parse_error in favor of generic parse_error
+
+
+2022-11-21 Kohei Yoshida <kohei.yoshida@gmail.com> [406a6e0630c96915ec7ccdd7c2bb6597443658e5]
+
+ Remove css::parse_error in favor of generic parse_error
+
+
+2022-11-21 Kohei Yoshida <kohei.yoshida@gmail.com> [300d583cf5c0d51ee76740ae83bbbb2890a9e4af]
+
+ Remove csv::parse_error in favor of generic parse_error
+
+
+2022-11-21 Kohei Yoshida <kohei.yoshida@gmail.com> [cd48c621213b3d2b56e95a5c8123c696ce31e9ac]
+
+ Remove json::parse_error; just use orcus::parse_error
+
+
+2022-11-21 Kohei Yoshida <kohei.yoshida@gmail.com> [a1bfd021e0800cbcef7b9e284acc16b3b517a403]
+
+ Move generic parse_error into exception.hpp
+
+
+2022-11-21 Kohei Yoshida <kohei.yoshida@gmail.com> [b89c98ed8917783fda0152a15197302ea67a582a]
+
+ Destructor with throw() is not a thing anymore
+
+
+2022-11-21 Kohei Yoshida <kohei.yoshida@gmail.com> [bb6ee140fc87cc53b86620a09211b326a5489d14]
+
+ Document sax_token_parser and related types
+
+
+2022-11-21 Kohei Yoshida <kohei.yoshida@gmail.com> [b3e3dcbfa6cc0b79224916a812b902cbbdc21aac]
+
+ Apply the same renaming of template parameters to the definitions
+
+
+2022-11-21 Kohei Yoshida <kohei.yoshida@gmail.com> [316eee7c98b0cfa8c0727e3a04a6539cd981a515]
+
+ Add docs to ns-handler members
+
+
+2022-11-19 Kohei Yoshida <kohei.yoshida@gmail.com> [ef2d0f6d0784ecb9eedd6ea314d21ee869d20d02]
+
+ No need to use std::unique_ptr for element scope structure
+
+
+2022-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [a030e4614cdc601cd4f21bf3bcffb592a5e75719]
+
+ Rename __sax namespace to sax::detail
+
+
+2022-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [2c306c9b21cbb10d4f77b27dcc7616f5e14ddc9e]
+
+ Use range-based for loop
+
+
+2022-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [b6a7dcd652532aacb0ecbcc99815d35c2d11c8ce]
+
+ Document XML parsers and related types & make trivial code cleanups
+
+
+2022-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [f6d2ec51135efccf570104b59afc4e15591f00e1]
+
+ Document & add tests for locate_line_with_offset()
+
+ Also ensure that the offset doesn't exceed the length of the stream
+ being searched.
+
+2022-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [cd46ad28fdf6048631da605a85fff619f7bc1aff]
+
+ Use more compiler-default functions where applicable
+
+
+2022-11-17 Kohei Yoshida <kohei.yoshida@gmail.com> [6d8086cc6b77c374f73a8ca9c660f9e56a66e114]
+
+ Add a separate section for stream classes and functions
+
+ And add stream functions to that section.
+
+2022-11-17 Kohei Yoshida <kohei.yoshida@gmail.com> [814eb27812c1c01cd8d94f807f251160951c946b]
+
+ Add file_content and memory_content to doc
+
+ Also reword the description of file_content to make it flow a bit
+ better.
+
+2022-11-17 Kohei Yoshida <kohei.yoshida@gmail.com> [6522af789c041ef2cddb9459498098d7353f575f]
+
+ detect() to take std::string_view to simplify its use
+
+ Also add it to the doc along with a whole bunch other types which
+ were previously not included in the doc.
+
+2022-11-17 Kohei Yoshida <kohei.yoshida@gmail.com> [434be9437a08c6b95e381ad8cb6bc5192b8cfe43]
+
+ Revise the doc for cell_buffer just a tiny bit
+
+
+2022-11-17 Kohei Yoshida <kohei.yoshida@gmail.com> [639453a76a80c91f2ee6e7c10c02e1f67093e65e]
+
+ Document tokens class & make it officially non-copyable
+
+
+2022-11-17 Kohei Yoshida <kohei.yoshida@gmail.com> [c592f47fa4a7310ba423aff3becf89a6a911d76a]
+
+ Make string_pool move-constructible
+
+ This will make string_pool a lot more usable.
+
+2022-11-17 Kohei Yoshida <kohei.yoshida@gmail.com> [6fc6fc45f576277d60cbbbf01c09dd2fca560bd6]
+
+ Document string_pool a bit more
+
+
+2022-11-17 Kohei Yoshida <kohei.yoshida@gmail.com> [fdc57fc043f4384d873f8e68a79898cf32e1a064]
+
+ Emphasize that the yaml_parser is still experimental
+
+ Also add some docs while I'm at it.
+
+2022-11-17 Kohei Yoshida <kohei.yoshida@gmail.com> [917043d66e8df345131a1f4d2397a05188358051]
+
+ Summarize the change in 0.18.0
+
+
+2022-11-17 Kohei Yoshida <kohei.yoshida@gmail.com> [b9b499adf40d6cdc6a862eb313051eb46bab50b2]
+
+ Fix make distcheck
+
+
+2022-11-17 Kohei Yoshida <kohei.yoshida@gmail.com> [beefecd7b325db444be91f7f4ef0cc156a0cabe2]
+
+ Ignore this file too
+
+
+2022-11-17 Kohei Yoshida <kohei.yoshida@gmail.com> [4f7a433b201a6b396a7ab60a4bf936dc15b67abb]
+
+ Set the version number to 0.18.0
+
+
+2022-11-14 Kohei Yoshida <kohei.yoshida@gmail.com> [9e4e9b6fcc88779443e8d2315106d416de1b0761]
+
+ Fix MSVC build
+
+ gcc apparently has no issues with std::optional<auto> but MSVC does. Not
+ sure about clang.
+
+2022-11-14 Kohei Yoshida <kohei.yoshida@gmail.com> [7cb909e6fbf19030cfc0912d2460b9b950814b4e]
+
+ Fix build due to recent ixion API change relted to formula_token
+
+
+2022-10-24 Kohei Yoshida <kohei.yoshida@gmail.com> [4859af1287a6f9ad96f88e5923a69333f48ec95d]
+
+ Fix make check-valgrind-memcheck
+
+ Those optional values were actually not set.
+
+2022-10-24 Kohei Yoshida <kohei.yoshida@gmail.com> [2961d1abeb2f3cb58bf9a32eba6cef8b8ae4ca88]
+
+ Rework importing of style:text-underline-width (#150)
+
+ Note that percent, positive integer and positive length are not enum
+ values but they just mean the actual width value is given separately.
+
+ Also, when the font uses the same color for both font and underline,
+ let's not explicitly set the underline color.
+
+2022-10-20 Kohei Yoshida <kohei.yoshida@gmail.com> [d6bddaeb417e37156b0de3556bc9ea81e1996be7]
+
+ More on removal of pstring in favor of std::string_view
+
+ Still a long way to go, but every bit helps.
+
+2022-10-20 Kohei Yoshida <kohei.yoshida@gmail.com> [2deef59f1564035ecf81b62d41782a8c1c938a7b]
+
+ Merge font_t and font_active_t
+
+ This is the last item to merge.
+
+2022-10-20 Kohei Yoshida <kohei.yoshida@gmail.com> [8110353322f4a01dc5fb337e973bfce46edb0160]
+
+ Merge fill_t and fill_active_t
+
+
+2022-10-19 Kohei Yoshida <kohei.yoshida@gmail.com> [efccb6dc324d7d30435c004a6f9bc7d2e5a3f3fa]
+
+ border_t and border_attrs_t to use std::optional
+
+ And remove their corresponding *_active_t
+
+2022-10-18 Kohei Yoshida <kohei.yoshida@gmail.com> [c242242e1ca845a05ca3a66fba4dcd9303d96453]
+
+ Merge protection_t and protection_active_t
+
+
+2022-10-18 Kohei Yoshida <kohei.yoshida@gmail.com> [7c4ce2e80f2cde70bb87f0407625145c578df6d4]
+
+ Merge number_format_t and number_format_active_t
+
+
+2022-10-17 Kohei Yoshida <kohei.yoshida@gmail.com> [f41745b3f21137aa60184d48402866820ce2b62d]
+
+ Import several font attributes for asian and complex scripts
+
+ For now this is only for ods, and only for font names, font sizes,
+ font bold/non-bold and italic/non-italic.
+
+2022-10-17 Kohei Yoshida <kohei.yoshida@gmail.com> [acc6b29e1713b010fd954c875c434e980f0679e1]
+
+ Fix windows build via cmake
+
+
+2022-10-16 Kohei Yoshida <kohei.yoshida@gmail.com> [c8bde749c6630b5a77bdf63c85982585f9c4b4f5]
+
+ Add test on Sheet2, and fix the incorrect column style import
+
+
+2022-10-16 Kohei Yoshida <kohei.yoshida@gmail.com> [f52ff30f94c65e4bb5c4f97b55f24e086d19e1ae]
+
+ Check the cell formats on row 10 & fix cell style repetition
+
+ ODF doesn't have the concept of row formats. So when a row-wise format
+ is applied, it gets applied as a series of individual cell formats.
+
+2022-10-13 Kohei Yoshida <kohei.yoshida@gmail.com> [d2020559f73aff04bcb0eb503fd6db2d3424ccb9]
+
+ Check on column F
+
+
+2022-10-13 Kohei Yoshida <kohei.yoshida@gmail.com> [d64e3628395f55ebcc6b3782c3f0883ee5c31339]
+
+ Finish up on column C and check on column D
+
+
+2022-10-12 Kohei Yoshida <kohei.yoshida@gmail.com> [bef45743eae100252a4d6fbb276da00b2f495190]
+
+ Make sure the "Gray With Lime" style has "Default" as its parent
+
+ We check this through style_xf attribute, not through parent_name.
+ The parent_name attribute should be deprecated in the near future.
+
+2022-10-12 Kohei Yoshida <kohei.yoshida@gmail.com> [0931d548d74520d46e78452f36a9bb47a1291c0b]
+
+ Check the cell style of C1 which has "Gray With Lime" style applied
+
+ Because this style uses the display-name attribute, we also need to pick
+ that up in order to test it properly.
+
+2022-10-12 Kohei Yoshida <kohei.yoshida@gmail.com> [bf941b08616667226ae52b4f966878737c8d80e9]
+
+ Check the cell styles in columns B, E, G etc and fix an issue found
+
+
+2022-10-12 Kohei Yoshida <kohei.yoshida@gmail.com> [9cdeecb7757dfc23486ff740652e629ef472bd12]
+
+ set_column_format() to take the column span value
+
+
+2022-10-12 Kohei Yoshida <kohei.yoshida@gmail.com> [03cf11fdc2b174de5c30004878ee57468a7b238f]
+
+ set_column_width() and set_column_hidden() to take the column span param
+
+ All the supported file formats to do make use of the concept of column span,
+ and our backend storage too, so why not.
+
+2022-10-11 Kohei Yoshida <kohei.yoshida@gmail.com> [e3977081aa5d30899f67b3b85e304cf63b9b6319]
+
+ Properly handle table:number-columns-repeated attribute
+
+
+2022-10-11 Kohei Yoshida <kohei.yoshida@gmail.com> [e99979a4c4cc0e1831befdee7cba47cf09d98003]
+
+ Pick up the default cell styles for columns & test case for it
+
+ As a starter, check the applied cell style on Sheet1.A1. A lot more
+ checks to follow soon.
+
+2022-10-11 Kohei Yoshida <kohei.yoshida@gmail.com> [b32b91d388fc7a5afb2663eec6d2fa23d34b5c21]
+
+ Modernize the code a bit
+
+
+2022-10-10 Kohei Yoshida <kohei.yoshida@gmail.com> [98d45670732ef81f8c8ee73acb1b801d5576afbe]
+
+ Modify the test file to add a case for style spanning over multiple columns
+
+
+2022-10-10 Kohei Yoshida <kohei.yoshida@gmail.com> [76a3dbd6fb9bae331b77a139d31e352a97d4a73b]
+
+ Now transfer_common() is finally unused
+
+
+2022-10-10 Kohei Yoshida <kohei.yoshida@gmail.com> [055c287183319ac253126d131f6b0770c458547a]
+
+ Have gnumeric_cell_context as a concrete member and child context
+
+
+2022-10-10 Kohei Yoshida <kohei.yoshida@gmail.com> [2ce281fc413ff995259c2a6a0a37c6d8abb42b7f]
+
+ Add a test case for calling clear() and using the same pool afterward
+
+
+2022-10-10 Kohei Yoshida <kohei.yoshida@gmail.com> [59ffe63deb53e61db6a73c15af563569d10cecbd]
+
+ Remove pstring and 'using namespace std'
+
+
+2022-10-10 Kohei Yoshida <kohei.yoshida@gmail.com> [e4edda33338d9b983d5fc44dad876cec4fd2235e]
+
+ Make gnumeric_sheet_context a concrete data member and a child context
+
+ Also fix a bug in string_pool::clear(). The empty state needs to have
+ the impl::m_stores containing one element. So, simply clearing the
+ m_stores and m_set would not work.
+
+2022-10-10 Kohei Yoshida <kohei.yoshida@gmail.com> [aae8a3d8e5cfbb3a5eca2f9747d3387b74ca7a57]
+
+ Make xlsx_autofilter_context as a concrete child of xlsx_table_context
+
+
+2022-10-10 Kohei Yoshida <kohei.yoshida@gmail.com> [1ca76b7f1856e383178d46fb48178d177a91ea58]
+
+ Make xlsx_conditional_format_context a concrete child context
+
+
+2022-10-10 Kohei Yoshida <kohei.yoshida@gmail.com> [bfe471f15adbdfffcbcbbd0df8bab076cb4e084d]
+
+ Let's use the 'ss' alias in lieu of 'spreadsheet' namespace
+
+
+2022-10-10 Kohei Yoshida <kohei.yoshida@gmail.com> [3ef6476bbe0440c9a2063d0db4d8540fc4735271]
+
+ These break statements have no effects
+
+
+2022-10-10 Kohei Yoshida <kohei.yoshida@gmail.com> [e4e45795378603ebcd8d10b7b53f49aa6a197364]
+
+ Replace pstring with std::string_view
+
+
+2022-10-10 Kohei Yoshida <kohei.yoshida@gmail.com> [af240ae892c5f74bb567ac89c5029ca4dc78fcda]
+
+ Allow import_conditional_format interface pointer to be null
+
+
+2022-10-10 Kohei Yoshida <kohei.yoshida@gmail.com> [c75e75858e401c73e1cb6c9842a4009623ccc89f]
+
+ xlsx_autofilter_context as a member child context
+
+
+2022-10-06 Kohei Yoshida <kohei.yoshida@gmail.com> [5f0f8c757d989cf84067c540b36e2abb575628cd]
+
+ Remove 'using namespace std'
+
+
+2022-10-06 Kohei Yoshida <kohei.yoshida@gmail.com> [b913db4dc66d8090f10fbfd8a31770cf0d8770fa]
+
+ Use the alias 'ss' in lieu of 'spreadsheet'
+
+
+2022-10-06 Kohei Yoshida <kohei.yoshida@gmail.com> [8617bb0b48816fa9852298d6bfb722c2e7057403]
+
+ Let's use std::optional here
+
+
+2022-10-06 Kohei Yoshida <kohei.yoshida@gmail.com> [4c3a526dc77e745ad4d5f035f640e4c4aab579e3]
+
+ Pick up column and row styles in xlsx
+
+
+2022-10-06 Kohei Yoshida <kohei.yoshida@gmail.com> [218816d355524ad69b3ec41f12061bba78b1a6e9]
+
+ Update the test file to match that of the xls-xml
+
+
+2022-10-05 Kohei Yoshida <kohei.yoshida@gmail.com> [10bc5827e4ffa75f0e796545a86ab38634838b48]
+
+ Substitute 'spreadsheet::' with 'ss::' for consistency
+
+
+2022-10-05 Kohei Yoshida <kohei.yoshida@gmail.com> [f8d3a19855aecb0e50e5cb5451f656ad45508a8d]
+
+ No more 'using namespace std'
+
+
+2022-10-05 Kohei Yoshida <kohei.yoshida@gmail.com> [3f82bda9afe85372d48ac5d33d8de0dcc1af3abe]
+
+ Pick up row format indices and make sure they are stored correctly
+
+
+2022-10-04 Kohei Yoshida <kohei.yoshida@gmail.com> [b6f2805fa44ab9852a9d1ee8d5bb5db3b6d1d791]
+
+ Import column styles and make sure they are stored correctly
+
+
+2022-10-04 Kohei Yoshida <kohei.yoshida@gmail.com> [01878f858821c5240182128b29b516f82387bee1]
+
+ Add another sheet that contains a column style spanning over three columns
+
+
+2022-10-04 Kohei Yoshida <kohei.yoshida@gmail.com> [1dead2bbabef4d0d1a451b29984964d615c4dfcd]
+
+ Remove 'using namespace std'
+
+
+2022-10-03 Kohei Yoshida <kohei.yoshida@gmail.com> [9856b2f7df9c256049b3381423cc299590f98e17]
+
+ Add skeleton set_column_format() and set_row_format() interface methods
+
+ They will be implemented next.
+
+2022-10-03 Kohei Yoshida <kohei.yoshida@gmail.com> [49f525d11908772fb49ff8fb608a84c8935aed5e]
+
+ Update test files to include row-wise properties
+
+
+2022-09-29 Kohei Yoshida <kohei.yoshida@gmail.com> [38fef5511c6f46b5828c28e20709783c1cb58d9d]
+
+ Check the format on D6, and conclude this test case
+
+
+2022-09-29 Kohei Yoshida <kohei.yoshida@gmail.com> [cac4a005db1839f827d63aaa6356f17ef90ed585]
+
+ Properly handle cells referencing named styles directly
+
+ This fixes the previously failing test case.
+
+2022-09-29 Kohei Yoshida <kohei.yoshida@gmail.com> [fb870234e9867c735abf20812e2dd2d720e3394f]
+
+ Check the format on B4 and D4, but D4 fails
+
+
+2022-09-28 Kohei Yoshida <kohei.yoshida@gmail.com> [4a1074bf6635942d8cdfd1adb52b16cb7289bbd6]
+
+ Check the format on cell B2
+
+
+2022-09-27 Kohei Yoshida <kohei.yoshida@gmail.com> [a8aa90cde1d0b53618e77a91fb9487858b52d3b4]
+
+ Set up a test case for direct-format.ods and simplify doc loading
+
+ The test file has been updated to include a cell that directly references
+ a named style.
+
+2022-09-27 Kohei Yoshida <kohei.yoshida@gmail.com> [fbbcf8a55184d183777279e8578119cacaeb08df]
+
+ It's possible that cell style entries have non-contiguous style xf ID's
+
+
+2022-09-26 Kohei Yoshida <kohei.yoshida@gmail.com> [305605733f3e59e1f895c96451dccadb572b5e70]
+
+ Update to include named style with direct format applied on top
+
+
+2022-09-26 Kohei Yoshida <kohei.yoshida@gmail.com> [f273240349a22e2b25d73804c5ce93cf1295be78]
+
+ Let's not return the position of the inserted cell style record to be safe
+
+ Since that doesn't represent an xfid, there is little point returning it.
+
+2022-09-26 Kohei Yoshida <kohei.yoshida@gmail.com> [2d32c766e679efe22e3d87e7283a6c49e11acbe0]
+
+ Re-enable the test cases and fix one aspect of styles import
+
+ The cell style records may not appear in the same order as their cell style
+ format records counterpart. Each cell style record does store the xfid of its
+ corresponding cell style format record, so we can sort them by the xfid's at
+ the end of the import, to make sure the two record sets are ordered the same
+ way.
+
+2022-09-26 Kohei Yoshida <kohei.yoshida@gmail.com> [f6adf0b4e954dad7068ba085f3e133666bc32d77]
+
+ Copy the test case from xls-xml to xlsx and disable the untested part
+
+
+2022-09-26 Kohei Yoshida <kohei.yoshida@gmail.com> [e652a47067e9b5a811db843392dc726ab620f019]
+
+ Test the format applied to cell D8
+
+
+2022-09-23 Kohei Yoshida <kohei.yoshida@gmail.com> [1e210d748ebd2f4b1a43fbbe93e369c452d10f51]
+
+ Check the format on D6, and correctly import cell referencing named style
+
+
+2022-09-23 Kohei Yoshida <kohei.yoshida@gmail.com> [7a17a0a3a1a3503df7fb124e421d4055b3dfafe3]
+
+ Check the cell format of cell B4
+
+
+2022-09-22 Kohei Yoshida <kohei.yoshida@gmail.com> [051ca778fd848792a85fe3b6e8dcbfcb98d863f6]
+
+ Start writing a test for direct-format.xml, still WIP
+
+
+2022-09-22 Kohei Yoshida <kohei.yoshida@gmail.com> [07d70b981abf71559b3a077981ebd9a1a5b9b21b]
+
+ Properly import named cell styles and link them to direct cell styles
+
+
+2022-09-21 Kohei Yoshida <kohei.yoshida@gmail.com> [d9ea206ae970aaacab6919cb1ae26de381881c17]
+
+ Rename those get_* interface methods to start_*
+
+ Since calling a start_foo method signals the start of a transaction-
+ like import step, the name should be more reflective of that.
+
+2022-09-20 Kohei Yoshida <kohei.yoshida@gmail.com> [180417340b28b1606698bc56a3cc687f30a972fe]
+
+ Add test files for direct format styles
+
+
+2022-09-19 Kohei Yoshida <kohei.yoshida@gmail.com> [31c9512f529043b821dbb066e0ebff1e57d838b2]
+
+ Test files (xlsx and xls-xml) for importing styles applied to columns
+
+
+2022-09-19 Kohei Yoshida <kohei.yoshida@gmail.com> [98b9ab6cf81ee442e9c354e0e3d6d361571575ea]
+
+ Test file for ods on importing styles applied to columns
+
+
+2022-09-19 Kohei Yoshida <kohei.yoshida@gmail.com> [475f2fbf6cc116e25af9b4af167bf1c202ca23a8]
+
+ Move test files for orcus-import-ods
+
+
+2022-09-16 Kohei Yoshida <kohei.yoshida@gmail.com> [1b6996f931a7fab30b49c74bfc74c092e5e8c55d]
+
+ Add a simple test case for flat dump containing utf-8 strings
+
+
+2022-09-16 Kohei Yoshida <kohei.yoshida@gmail.com> [50f13d2befa937543a616750e746d785ac18889a]
+
+ Use logical string lengths to determine optimal column widths
+
+ This doesn't work well with East Asian languages, unfortunately...
+
+2022-09-16 Kohei Yoshida <kohei.yoshida@gmail.com> [e3762f4a3c73da6b037bf98551a568e256fd9af3]
+
+ More examples from Russian and German
+
+
+2022-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [792d3c601aefb6b1a32d3918f673380a893ccfaf]
+
+ Add calc_logical_string_length() public function.
+
+
+2022-09-13 Kohei Yoshida <kohei.yoshida@gmail.com> [902b27227df7154655bb1d6733c6b1b97ef8b804]
+
+ Properly pick up cell protection properties
+
+
+2022-09-13 Kohei Yoshida <kohei.yoshida@gmail.com> [ee154da63372d9ce25c9247b82fc353dacbd67c2]
+
+ Add a test file for cell locked and hidden properties
+
+
+2022-09-12 Kohei Yoshida <kohei.yoshida@gmail.com> [abe24a79915fe458fdaceaab9777213fca78e5b7]
+
+ Activate MDDS_SORTED_STRING_MAP_DEBUG when debug-utils is enabled
+
+
+2022-09-12 Kohei Yoshida <kohei.yoshida@gmail.com> [37e482a41c279c416059a20d24b8b66be2bc5e02]
+
+ Pick up the hide-formula attribute
+
+ Also check for the rest of the cells' formats.
+
+2022-09-12 Kohei Yoshida <kohei.yoshida@gmail.com> [4c15945de7c591c74792a801845b4a41912214d9]
+
+ Pick up more default styles, minus cell protection attributes
+
+
+2022-09-12 Kohei Yoshida <kohei.yoshida@gmail.com> [aadfd1a3c1bd26fccc3177b8ed5354afbc65e645]
+
+ Add more cell values
+
+
+2022-09-12 Kohei Yoshida <kohei.yoshida@gmail.com> [d6368450e9d673eebcad0675f4b6c773b20bd801]
+
+ Replace pstring with std::string_view
+
+
+2022-09-08 Kohei Yoshida <kohei.yoshida@gmail.com> [b754265cdd093783206eb46e7db23a6d5a23b4a8]
+
+ Add a test file for importing a default style
+
+
+2022-09-07 Kohei Yoshida <kohei.yoshida@gmail.com> [67db4feffd8a170ad66cc22a0ae25104afc796f8]
+
+ Correctly import default alignment properties
+
+
+2022-09-07 Kohei Yoshida <kohei.yoshida@gmail.com> [c1c7e01bf4effbc3c231b9c34a64ad893720305a]
+
+ font_style must be non-null
+
+
+2022-09-07 Kohei Yoshida <kohei.yoshida@gmail.com> [81f3cd6cdb98ecbf340423c8a6a3ece3d81c7ce8]
+
+ Make wrap-text and shrink-to-fit optional
+
+ ODF styles need this behavior for style hierarchy to work correctly.
+
+2022-09-07 Kohei Yoshida <kohei.yoshida@gmail.com> [fd92263b35df127ec4d6b8a4fde255dab491d512]
+
+ Pick up wrap-text and shrink-to-fit in ods too
+
+
+2022-09-07 Kohei Yoshida <kohei.yoshida@gmail.com> [88ebe61a7e658021386453cb3f5f095dc0517ae2]
+
+ pstring related cleanup
+
+
+2022-09-07 Kohei Yoshida <kohei.yoshida@gmail.com> [3aeb6f570b1ab07f5582f67df0985107660e0db6]
+
+ Pick up the wrap-text and shrink-to-fit properties in xls-xml
+
+
+2022-09-07 Kohei Yoshida <kohei.yoshida@gmail.com> [186449cb8a143f0760f85202b85c3a08b33239e4]
+
+ Add an xlsx test case for wrap-text and shrink-to-fit
+
+
+2022-09-07 Kohei Yoshida <kohei.yoshida@gmail.com> [f05c9e8eb06a962810912b83be63301117db974f]
+
+ Replace pstring with std::string_view
+
+
+2022-09-07 Kohei Yoshida <kohei.yoshida@gmail.com> [7f999772359570d07feb83960b0c3942de2a9a6c]
+
+ Remove 'using namespace std;'
+
+
+2022-09-07 Kohei Yoshida <kohei.yoshida@gmail.com> [1f5f35872f7bcc95aa4df4a11b353756cb5ff6ac]
+
+ Remove using namespace orcus::spreadsheet in favor of using 'ss' alias
+
+
+2022-09-07 Kohei Yoshida <kohei.yoshida@gmail.com> [4b187121ffc890fbe41d799bc0b0ed183d9a0362]
+
+ Pick up the wrap-text and shrink-to-fix cell properties
+
+
+2022-09-06 Kohei Yoshida <kohei.yoshida@gmail.com> [74f368606b83f327bf2789658589d9a5e95b9e60]
+
+ Let's just remove empty case blocks
+
+
+2022-09-06 Kohei Yoshida <kohei.yoshida@gmail.com> [c755e8d0da494d2746ea465441dca34a1f85e268]
+
+ Switch to using element validator to validate element structure
+
+
+2022-09-06 Kohei Yoshida <kohei.yoshida@gmail.com> [69799f9def94a0aedc3e6846278d5c0d7f17c4b3]
+
+ Add interface for wrap-text and shrink-to-fix cell properties
+
+
+2022-09-06 Kohei Yoshida <kohei.yoshida@gmail.com> [03d7cf538221ff79dda5be9a8712957b4aaca51c]
+
+ Replace use of tempfile with mktemp
+
+ Apparently tempfile is deprecated.
+
+2022-09-03 Kohei Yoshida <kohei.yoshida@gmail.com> [23d149037fae48d9705995c74fec3a7195ba562b]
+
+ Add a test case for EUC-JP encoded XML file
+
+
+2022-09-02 Kohei Yoshida <kohei.yoshida@gmail.com> [63cd8ed934a01799bfd2ddbe0c83a6337ee577dd]
+
+ Add some rudimentary test for parsing character set names to enum
+
+
+2022-09-02 Kohei Yoshida <kohei.yoshida@gmail.com> [992b4fa11db3883315162e533a3a381c474269ba]
+
+ Add preprocessing rules for slickedit symbol tagging
+
+
+2022-09-02 Kohei Yoshida <kohei.yoshida@gmail.com> [965b407a9a66dd3a4d289b5e966c29d81b2287d0]
+
+ Regenerate the character_set_t member entries
+
+ The entries are generated from data.csv, which was created from the
+ character set table in
+
+ https://www.iana.org/assignments/character-sets/character-sets.xhtml
+
+ The new set contains mapping rules for the aliases as well.
+
+2022-09-02 Kohei Yoshida <kohei.yoshida@gmail.com> [cd78cec7d477fb8c9a59154aabdc78aa366984cc]
+
+ Pick up the 'encoding' attribute in XML declaration during XML mapping
+
+ This is related to #154.
+
+2022-09-02 Kohei Yoshida <kohei.yoshida@gmail.com> [1215a16eb7d21858ab0a7964855c961be8ca4ea8]
+
+ Fix build issue on Gentoo
+
+ This is related to #165. Thanks to jospezial for bringing up this issue.
+
+2022-09-01 Kohei Yoshida <kohei.yoshida@gmail.com> [bb2a2ed037499f5375f4aaf1d508338d571e63bf]
+
+ Mark these operators noexcept, now that we are changing the API version
+
+
+2022-08-31 Kohei Yoshida <kohei.yoshida@gmail.com> [83bf9095349446bd0dc81f8ee811397ff5eea11e]
+
+ Remove the old test cases
+
+ This also contained some non-reproducible test cases. It is superceded by
+ the odf file based test cases located in test/ods/number-format/basic-set.ods.
+
+2022-08-31 Kohei Yoshida <kohei.yoshida@gmail.com> [abcb414b7e0cd7f0085985a2d722a06c2660b87c]
+
+ Remove use of pstring
+
+
+2022-08-31 Kohei Yoshida <kohei.yoshida@gmail.com> [7e10fc9525c553b2bcbbc2e6bd813147105f5192]
+
+ Add a test document of basic cases on number format import
+
+ To be expanded on later. Also fixed a bug on std::string construction.
+ You can't pass a char value followed by count; you need to pass a
+ const char* as the first argument.
+
+2022-08-31 Kohei Yoshida <kohei.yoshida@gmail.com> [ceb27d4fb8ba9ab9eea0600286664951a74673bc]
+
+ Remove 'using namespace std'
+
+
+2022-08-31 Kohei Yoshida <kohei.yoshida@gmail.com> [ec9ed72c183c2ffc60e1675610cb0d1f11bec0e3]
+
+ Pick up the style:data-style-name and record the corresponding ...
+
+ ... number format id.
+
+2022-08-31 Kohei Yoshida <kohei.yoshida@gmail.com> [6ad5cd2e434abc238571dfd28211a790f2c66b5b]
+
+ <number:text> may occur under <number:text-style>
+
+
+2022-08-30 Kohei Yoshida <kohei.yoshida@gmail.com> [d8eeb3ef5c4321b660e67811ea9122682ae8abee]
+
+ Remove meaningless return statement
+
+
+2022-08-30 Kohei Yoshida <kohei.yoshida@gmail.com> [baae59a8b721175cc6a120ec35fe83aa4f76ea79]
+
+ Let's not forget to handle <number:text-style> too
+
+
+2022-08-30 Kohei Yoshida <kohei.yoshida@gmail.com> [b9bd8309609353099aaa53573ddf66f3eacf7a34]
+
+ Use stack printer for test cases and fix the test program linkage
+
+
+2022-08-30 Kohei Yoshida <kohei.yoshida@gmail.com> [c27a094a8421864abfc4e3ee449b1936dc68111a]
+
+ Handle <number:time-style> element scope, and remove number_format_context
+
+ and all its associated function objects that are no longer used.
+
+2022-08-30 Kohei Yoshida <kohei.yoshida@gmail.com> [fb2b4f6f7657a01d304d3019b55507bb28421d76]
+
+ Don't forget to define the validation rules
+
+
+2022-08-30 Kohei Yoshida <kohei.yoshida@gmail.com> [7a7fbc67a55dda6ff428d93cd94c5f0f89c25d10]
+
+ Handle <number:date-style> element scope
+
+
+2022-08-30 Kohei Yoshida <kohei.yoshida@gmail.com> [80ad771c2baa6d36cdcbd18d2e0534654646545e]
+
+ Handle <number:percentage-style> element scope
+
+ Also make xml_context_base::characters() non-pure virtual function.
+
+2022-08-30 Kohei Yoshida <kohei.yoshida@gmail.com> [780199dce4fd95ff113ba76e3215a7a74c06b52b]
+
+ Handle <number:boolean-style> element scope
+
+
+2022-08-30 Kohei Yoshida <kohei.yoshida@gmail.com> [2f70234a5a97a90a2b34ccec0867579885fdd51b]
+
+ create_child_context() and end_child_context() should have default versions
+
+ These two methods are not very common; let's have the base class provide
+ their default implementations.
+
+2022-08-30 Kohei Yoshida <kohei.yoshida@gmail.com> [8371a52e3fa4d36199895cda1e3cd7e5b36bf321]
+
+ Add validation rules to currency_style_context
+
+
+2022-08-29 Kohei Yoshida <kohei.yoshida@gmail.com> [34405c24b8a6f1bcedf599bd1ed78b4227b85ae4]
+
+ Handle <number:currency-style> element scope
+
+
+2022-08-29 Kohei Yoshida <kohei.yoshida@gmail.com> [d3d708ad0836b3a451c0ace07d01167ccf17ff42]
+
+ Add validation rule set to number_style_context
+
+
+2022-08-28 Kohei Yoshida <kohei.yoshida@gmail.com> [dafb22810ae2a34dc7d4720243f99237a6f93f18]
+
+ Set up an empty context for <number:currency-style> which will be next
+
+
+2022-08-28 Kohei Yoshida <kohei.yoshida@gmail.com> [7d4343a1cd170572e540200fd8c296ecbead1bec]
+
+ Handle <number:scientific-number>
+
+
+2022-08-28 Kohei Yoshida <kohei.yoshida@gmail.com> [ad80c6bb6a406f4390bfa33c657e4b53530e5614]
+
+ Handle <number:fraction>
+
+ This needs more testing.
+
+2022-08-28 Kohei Yoshida <kohei.yoshida@gmail.com> [9e6b23ed5692bcc7e699f8081a314a4084b4cc40]
+
+ We don't really need to handle style:volatile attribute
+
+ How it should be used is unclear per 1.3 specs.
+
+2022-08-28 Kohei Yoshida <kohei.yoshida@gmail.com> [cf614401330ad17840e57c5748ca788b3bc5dea7]
+
+ Handle <style:map> below <number:number-style>
+
+ This combines multiple number formatting rules into one.
+
+2022-08-28 Kohei Yoshida <kohei.yoshida@gmail.com> [f81d5e69e64717c752887e6d715bf83814bef064]
+
+ import style interface no longer used
+
+
+2022-08-28 Kohei Yoshida <kohei.yoshida@gmail.com> [979491b5ad643f36b1403e53d7f128a049d50538]
+
+ Store number-format names to ids and ids to codes in session data store
+
+ This will be used later when combining multiple number styles into one code.
+
+2022-08-27 Kohei Yoshida <kohei.yoshida@gmail.com> [17e5cdb356aea4fbe8402dc594caf5b5e5314697]
+
+ Handle <style:text-properties> element scope
+
+
+2022-08-27 Kohei Yoshida <kohei.yoshida@gmail.com> [6f2c56271b9697f9eba2d3df1b7d17158ba1fbe0]
+
+ Handle <number:text> scope
+
+ Also remove character_stream from odf_number_format. It doesn't belong
+ there.
+
+2022-08-27 Kohei Yoshida <kohei.yoshida@gmail.com> [5d59b674cfdf6e11a0e2bd10f201f9bf68faae35]
+
+ more files to ignore
+
+
+2022-08-27 Kohei Yoshida <kohei.yoshida@gmail.com> [8000f4425c83b43b68db4454bddf05f1ced593f9]
+
+ Add a context dedicated for <number:number-style> element scope
+
+ Still WIP
+
+2022-08-26 Kohei Yoshida <kohei.yoshida@gmail.com> [59801364d83b4c33a3b73e6fe89cfb89de4b3e63]
+
+ These are now used
+
+
+2022-08-26 Kohei Yoshida <kohei.yoshida@gmail.com> [af6a68b7bb74fc86db0b092b104680021450d50d]
+
+ Internalize styles_map with styles_context with some access functions
+
+ This feels a bit better than passing a reference to it at construction.
+
+2022-08-26 Kohei Yoshida <kohei.yoshida@gmail.com> [28667a6e936d7175e0dea590f1473fa7bf27eb37]
+
+ Register child contexts with parent so that the parent can push out ...
+
+ ... some common settings to all its child contexts at appropriate time.
+
+ This feels more proper way of handling setting distribution than calling
+ transfer_common() at much later time. It does also avoid unnecessary
+ copying of the settings objects.
+
+2022-08-26 Kohei Yoshida <kohei.yoshida@gmail.com> [d28c913950fbce36fbb4180339b61b4faa99a780]
+
+ Call transfer_common() at the right time
+
+
+2022-08-26 Kohei Yoshida <kohei.yoshida@gmail.com> [9f9a3072bd81d9f87280c617f156c33655bb754e]
+
+ Move the odf-styles state dumping code into a separate function
+
+ and call it also from the end of the styles.xml parsing.
+
+2022-08-26 Kohei Yoshida <kohei.yoshida@gmail.com> [0c4b7fcf564559979bd6f51dbdcccf203e875b53]
+
+ Reduce the amount of static_cast to get the custom data
+
+
+2022-08-26 Kohei Yoshida <kohei.yoshida@gmail.com> [8ca119bd585793d6dc3e0c0e60a91650fe5a94ae]
+
+ Remove m_ prefixes from struct members
+
+
+2022-08-26 Kohei Yoshida <kohei.yoshida@gmail.com> [c870c3fd6353e2c25fd8726fecf1cc3d77d73d60]
+
+ Use std::make_unique<> over raw new operator
+
+
+2022-08-26 Kohei Yoshida <kohei.yoshida@gmail.com> [eb44661e42344d31f3b1f3bc5e84c034b398e1b9]
+
+ Remove m_ prefixes from struct's
+
+
+2022-08-26 Kohei Yoshida <kohei.yoshida@gmail.com> [8b6a2321bac1acb116eeb47456a4844799ce1f1f]
+
+ There is really no need for ods_content_xml_handler class
+
+
+2022-08-26 Kohei Yoshida <kohei.yoshida@gmail.com> [6cb386785451eb44148928cf80a69bc93800f404]
+
+ Parse styles.xml stream in ods and pick up styles defined therein
+
+
+2022-08-26 Kohei Yoshida <kohei.yoshida@gmail.com> [0f3b2ebd66bd43ba1a8922ea2648d545dde6a6cb]
+
+ Extract the context for the <style:style> element scope
+
+
+2022-08-24 matoro <11910244-matoro3@users.noreply.gitlab.com> [14d15bf331b5cc3ca2c1cdb8097dfe918173cba1]
+
+ Only recurse into src/python when BUILD_PYTHON is set
+
+
+2022-08-24 Kohei Yoshida <kohei.yoshida@gmail.com> [a912a79ffc10e3f5f2f3d052de54cc5acbdd81d1]
+
+ fo:text-align may occur for families other than table-cell
+
+ At least for paragraph and graphic.
+
+2022-08-24 Kohei Yoshida <kohei.yoshida@gmail.com> [0383b7297df97145b3145fe1dcd83552d27f3b23]
+
+ Always build orcus-env-dump even when --without-tools is specified
+
+ This is related to #144.
+
+ See also https://bugs.gentoo.org/713586
+
+ Thanks to James Beddek <telans@posteo.de> for the report as well as
+ the fix.
+
+2022-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [6ae2b11f86a6c3471d4061ab4ac4c69fa0d84199]
+
+ Remove ORCUS_ASCII and with it the global.hpp header file too
+
+
+2022-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [e11df5525aed8ecfa9cc28caaba7e4d07ed3b078]
+
+ More on replacing ORCUS_ASCII with std::string_view
+
+
+2022-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [e9e29db6cd720fb375ea2536b9adeb527e78f86f]
+
+ More on using string_view_map_entry
+
+
+2022-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [722a76fe5f9872a7c28faaa51939177a76119b94]
+
+ More on using string_view_map_entry
+
+
+2022-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [668a36f2e22e1dcf3088713490dc948378e84a3c]
+
+ Replace ORCUS_ASCII with std::string_view
+
+
+2022-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [af9c329e453e1fb6bbd3218cb97991c585b9d3fc]
+
+ More on using string_view_map_entry
+
+
+2022-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [76573ac5e1ad716b61a424302c2153393025817d]
+
+ parse_expected() to take std::string_view
+
+
+2022-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [5221947cbf01e7cf97fbfe16dd004e4ed7572c3e]
+
+ Use string_view_map_entry to store the keys as std::string_view
+
+
+2022-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [568512808727753c1d3a50dddf03c607faf3a8f2]
+
+ Use std::string_view to replace ORCUS_ASCII
+
+
+2022-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [a3cfbee8e58c0cbf5f9839f62e0fa66b45bb430b]
+
+ skip(...) to take std::string_view thus avoiding ORCUS_ASCII macro
+
+
+2022-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [38f9d676823a66fe27f9e7c28495ec65380cfddf]
+
+ Use std::string_view for entries
+
+
+2022-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [7777f4f60e88c459b1b7c5a4e6c802518aadeaa7]
+
+ Use std::string_view for entries
+
+
+2022-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [5715f1ea6b1c3d4faecdbfebbef203baba931359]
+
+ Use std::string_view for entries
+
+
+2022-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [c788b79551994b6434c9128506304da49f39c662]
+
+ Use std::string_view for entries
+
+
+2022-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [ccc7fcce656cc052040b70188fd4745a15978da1]
+
+ Use std::string_view for entries
+
+ Also put all relevant definition code into a namespace.
+
+2022-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [45be9d84192b8d3725379e945e0d5ecb8610db42]
+
+ Use std::string_view for entries
+
+
+2022-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [2ec419c9e56b6ff29cee00ca276fc089eb70019b]
+
+ Use std::string_view for entries
+
+
+2022-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [815aa0915f2d7b129d6e8c1c75fcb00bc2627a3c]
+
+ Use std::string_view for entries
+
+ Also split the three map instances into separate namespaces.
+
+2022-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [944fa76d46aef7a05d18329e8a79ac9149b15d19]
+
+ Use std::string_view for entries
+
+
+2022-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [e12c67aee97d1fd4b9b96ea5ce70510d66f8b3d0]
+
+ Use std::string_view for entries
+
+ Also turn color_rgb_t into POD so that it can be declared constexpr.
+
+2022-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [0535ca2dbe96aa464683e0af0c0da8f790a8dc28]
+
+ Use std::string_view for entries
+
+
+2022-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [459bedc60f6210feedb309423510499ddb3a48c3]
+
+ Use std::string_view for entries
+
+
+2022-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [1db17be961175aaf9d18a1c339ec159a7548a746]
+
+ Use std::string_view for entries
+
+
+2022-08-23 WANG Xuerui <xen0n@gentoo.org> [ce66c0fb64c667e78476f8611eb5f097ec572f0a]
+
+ Include <cstdint> in base64.hpp too
+
+ This is also necessary for building with gcc-13.
+
+ Signed-off-by: WANG Xuerui <xen0n@gentoo.org>
+
+2022-08-21 Kohei Yoshida <kohei.yoshida@gmail.com> [7e82ade9f967cb5590a2046da1328d948a3c9656]
+
+ Use mdds::string_view_map_entry to simplify uses of sorted_string_map
+
+
+2022-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [18788ae7fbb49cffff34b5e145b6dfc7969ad6c0]
+
+ Adjust for the latest API change in mdds::sorted_string_map
+
+ keylen -> key_length
+
+2022-08-19 Kohei Yoshida <kohei.yoshida@gmail.com> [ec1b6a388f2c7c32ddcbe7c99275aa6430e591de]
+
+ Use std::unique_ptr instead of raw pointer
+
+ With this change, nobody uses map_object_deleter.
+
+2022-08-19 Kohei Yoshida <kohei.yoshida@gmail.com> [9146aca9779f2db3f8a4967d0831677ccb8f19ce]
+
+ Tuck these types inside elem_prop
+
+
+2022-08-19 Kohei Yoshida <kohei.yoshida@gmail.com> [49a5ebfd9abdcbfbb8e7489ff614bab026793bbd]
+
+ Move to_date_time() to date_time_t::from_chars()
+
+ With this change, global.cpp no longer contains any code.
+
+2022-08-18 Kohei Yoshida <kohei.yoshida@gmail.com> [f4605a5bdfad1f8a30a2678914f7f744c0ec0210]
+
+ Remove all uses of ORCUS_N_ELEMENTS in favor of std::size()
+
+
+2022-08-18 Kohei Yoshida <kohei.yoshida@gmail.com> [2e0c68335f14575716889ab5ee2ed757f0fd89d9]
+
+ Define sorted_string_map in more standard way
+
+
+2022-08-18 Kohei Yoshida <kohei.yoshida@gmail.com> [70424815e8d2fde5361800a6279525f1f099706e]
+
+ Turn it into an immutable singleton
+
+
+2022-08-18 Kohei Yoshida <kohei.yoshida@gmail.com> [5ead3e707dc9f299f1c10c4782bb5707840502d9]
+
+ Replace ORCUS_N_ELEMENTS with std::size() and other cleanup
+
+
+2022-08-18 Kohei Yoshida <kohei.yoshida@gmail.com> [5549d3f908c4d4ca7337813cf3f71ad8a38b5445]
+
+ Internalize print_attrs() which is only used in liborcus
+
+
+2022-08-18 Kohei Yoshida <kohei.yoshida@gmail.com> [2c9a217017a251f08ab72b37e6af66c55e1a3a44]
+
+ Unused function
+
+
+2022-08-18 Kohei Yoshida <kohei.yoshida@gmail.com> [bdf40b4f48517999dfdf4af5175c6e7bfe2710a0]
+
+ Replace use of std::strtol() to parse_integer() where appropriate
+
+
+2022-08-18 Kohei Yoshida <kohei.yoshida@gmail.com> [f0c5e6b7a083b90bf876485e815a32a3265ae2da]
+
+ Make the sig of parse_numeric() similar to that of parse_integer()
+
+
+2022-08-18 Kohei Yoshida <kohei.yoshida@gmail.com> [83d5cf39b8a979289aa7c3c735a6459a30e3c117]
+
+ Safeguard against some invalid input values
+
+
+2022-08-17 Kohei Yoshida <kohei.yoshida@gmail.com> [a751d28b44b3afad5d1625dd0836c243cf41c35c]
+
+ Replace pstring with std::string_view in common_test.cpp
+
+ Move the test for pstring::trim() to parse-global-test and use it to
+ test orcus::trim() instead.
+
+2022-08-17 Kohei Yoshida <kohei.yoshida@gmail.com> [ca75ec7e241557b96bbd07b23aec8daf766fef5b]
+
+ Change the signature of parse_integer to make it similar to that ...
+
+ ... of std::from_chars(...), and set up a test case for parse_integer().
+
+2022-08-17 Kohei Yoshida <kohei.yoshida@gmail.com> [791921abe18fe5a01986a1a39d2965775a681ce9]
+
+ Set the new mdds baseline to 2.1 & try to fix gitlab-ci build failure
+
+
+2022-08-17 Kohei Yoshida <kohei.yoshida@gmail.com> [0a32f053a67c0a3adfc3e259e79142d95b7d9a66]
+
+ Use autoreconf over autoconf
+
+
+2022-07-20 Rosen Penev <rosenp@gmail.com> [5553ca5a4ae4f6bea0961ee5a666aa2b5f6ed6fc]
+
+ fix for MinGW
+
+ Avoids redefinition errors and a compilation fix for clang on MinGW.
+
+2022-07-19 Kohei Yoshida <kohei.yoshida@gmail.com> [fa68d6a76778df26e41108e3400f4a907e351203]
+
+ Explicitly include <cstdint> header with GCC 13 (#162)
+
+ c.f. https://gcc.gnu.org/gcc-13/porting_to.html#header-dep-changes
+
+2022-07-19 Kohei Yoshida <kohei.yoshida@gmail.com> [907c6b42d7b8203b8a731adccb2cea1eee15729e]
+
+ Fix build issue with MSVC
+
+
+2022-06-09 Kohei Yoshida <kohei.yoshida@gmail.com> [1dfbda6ba2992e65f9f3c77033f708acc5821168]
+
+ Rename number_formatting_context to just number_format_context
+
+
+2022-06-09 Kohei Yoshida <kohei.yoshida@gmail.com> [58bc1b9cf16373edaa9c756b0a1bb3c7cdf03628]
+
+ Let's use switch statement here in lieu of chained if statements
+
+
+2022-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [74ccca3047c17f87998433ec77428e7979b154e5]
+
+ Rename number_formatting_code to odf_number_format
+
+ Also clean up its members.
+
+2022-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [f8c3c264da1fcbb520d0f7a4d51a67a4cb226c80]
+
+ Remove m_styles as unused
+
+
+2022-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [75c232ea1f2fbbb8f6771561af30698b05594c00]
+
+ Add view types
+
+
+2022-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [9fb0768c20791bd7bcf8aaef21272bf0f728053c]
+
+ Add some content to the API doc
+
+
+2022-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [1a356e0fd52a9347fdfa85399d67a5d06ac0ee3e]
+
+ Remove the old interface
+
+
+2022-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [98601fdd57d9513ce23254cff9bfd49ffcf936d6]
+
+ Use import_cell_style in odf styles import
+
+
+2022-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [5d323b0035b32450466acb38c9c80c4b13fd367c]
+
+ Don't forget to ensure the xf interface exists
+
+
+2022-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [c7cec298f498e286220d74eb2364ce2a95cc6e35]
+
+ Use import_cell_style in xlsx
+
+
+2022-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [80dafcf91af103adb8e7c3ce0eee987399e389ca]
+
+ Add import_cell_style sub-interface and use it in xls-xml
+
+
+2022-06-07 Kohei Yoshida <kohei.yoshida@gmail.com> [56d2c266f1b7fe6fc9d8ebd00c001acb181dc9d1]
+
+ Clarify (for the n-th time) what this style-xf is used for
+
+ This is Excel specific, and is only used with the <xf> record that
+ occurs below the <cellXfs> element. It refers to the <xf> record
+ below the <cellStyleXfs> element which stores the format records for
+ named cell styles.
+
+2022-06-07 Kohei Yoshida <kohei.yoshida@gmail.com> [dc29c2d295b1b87f4b94e1c1c0c7ecc8e6cfc8ab]
+
+ Remove the old interface and fix a few more places I overlooked
+
+
+2022-06-07 Kohei Yoshida <kohei.yoshida@gmail.com> [397dfd57390de6a28d0b792d36341a840d6ea668]
+
+ No 'using namespace std'
+
+
+2022-06-07 Kohei Yoshida <kohei.yoshida@gmail.com> [e7f41cd257d66853318e21f781abedd4310b9354]
+
+ One more place that uses the old xf interface
+
+
+2022-06-07 Kohei Yoshida <kohei.yoshida@gmail.com> [7ba88cc6476158f8da5759413d5ba2e8c3191e99]
+
+ Use std::variant to replace union
+
+
+2022-06-07 Kohei Yoshida <kohei.yoshida@gmail.com> [a2549f26b9eb1ad854e699ebd21a9619731c2da7]
+
+ Add debug symbol when debug-utils is enabled
+
+
+2022-06-07 Kohei Yoshida <kohei.yoshida@gmail.com> [90d0d3afa3c6babdf0fd3ded302d17ebf5fa3e67]
+
+ Let's have start_paragraph_properties() method just to be consistent
+
+
+2022-06-07 Kohei Yoshida <kohei.yoshida@gmail.com> [068dc7d7661ab9d829671447b988a42991431598]
+
+ Simplify the hor and ver alignment extraction function implementations
+
+
+2022-06-07 Kohei Yoshida <kohei.yoshida@gmail.com> [7d54608dc334406349d10de9d1c919c6fd69131b]
+
+ More opportunity to use range-based for loops over for_each
+
+
+2022-06-07 Kohei Yoshida <kohei.yoshida@gmail.com> [6854616b4cb1243c3dc900e79aa7849c4f3bf531]
+
+ Let's use insert_or_assign from C++17
+
+
+2022-06-07 Kohei Yoshida <kohei.yoshida@gmail.com> [cb265604d86b8e1d4fb18a9fde3961b4cd443be2]
+
+ Use import_xf in odf styles import
+
+
+2022-06-07 Kohei Yoshida <kohei.yoshida@gmail.com> [ac7106f0581d9ff8852cce8c067152c9ef193bc4]
+
+ Use range-based for loop over for_each with function object
+
+
+2022-06-07 Kohei Yoshida <kohei.yoshida@gmail.com> [579a756977f5461e9dc11502aa2c77f9dd927b38]
+
+ Prefer std::make_unique over reset & reduce indentation by early bailout
+
+
+2022-06-07 Kohei Yoshida <kohei.yoshida@gmail.com> [a714e1732a52fc1c5d9e6c85961cd5039b7c8bc6]
+
+ Use import_xf in gnumeric
+
+
+2022-06-06 Kohei Yoshida <kohei.yoshida@gmail.com> [77a26f36b3b5d5302d1ce4161f3bf29a3afc8750]
+
+ Use import_xf in xls-xml
+
+
+2022-06-06 Kohei Yoshida <kohei.yoshida@gmail.com> [8ec42c299640fc7793f04f2e8b013233a32cbe03]
+
+ Add import_xf sub-interface and use it in xlsx
+
+
+2022-06-06 Kohei Yoshida <kohei.yoshida@gmail.com> [2a6263ff4bcb195d7e9c398f5644511b43801730]
+
+ Introduce xf_category_t and combine some of the interfaces
+
+ The xf, style-xf, and dxf all share common attributes, so let's
+ combine their interfaces. This is just the beginning of that work.
+
+2022-06-06 Kohei Yoshida <kohei.yoshida@gmail.com> [9f7bc5b568e03b4094ea6b8ffe3be4edf3273a70]
+
+ These are no longer used
+
+
+2022-06-06 Kohei Yoshida <kohei.yoshida@gmail.com> [1081395adb8792908a8f2b853133a88a0999fa10]
+
+ Remove the old interface for number format import
+
+
+2022-06-06 Kohei Yoshida <kohei.yoshida@gmail.com> [36a2d91eae2b2e1583be79e837144de9d53b3e64]
+
+ Use import_number_format on ods styles import
+
+ I need to come back to this and fix the issue with number_formatting_context.
+ It doesn't properly track the element stack within its context.
+
+2022-06-02 Kohei Yoshida <kohei.yoshida@gmail.com> [8b2e357176a538898bae7fba7b00bada9dcfb50d]
+
+ Use import_number_format in gnumeric
+
+
+2022-06-02 Kohei Yoshida <kohei.yoshida@gmail.com> [d58185d1e54f9b1d749ab9ee9380f2e870993c7c]
+
+ Use import_number_format in xlsx
+
+
+2022-06-02 Kohei Yoshida <kohei.yoshida@gmail.com> [b8bbfdc622841a3a0b8963ff500dde5bb87d9ae9]
+
+ Add import_number_format interface and use it in xls-xml
+
+
+2022-06-02 Kohei Yoshida <kohei.yoshida@gmail.com> [b24cbd1516c4a88667720ae1916fee914fbb1bdb]
+
+ Remove the old interface methods
+
+
+2022-06-02 Kohei Yoshida <kohei.yoshida@gmail.com> [d648800e83da57c7f8d554e2ed5d6802d03719da]
+
+ Add ENSURE_INTERFACE macro to remove repetitive interface checks
+
+ Also add a class doc to the exception being thrown when the check
+ fails.
+
+2022-06-02 Kohei Yoshida <kohei.yoshida@gmail.com> [81cbe7cdad8f2c1e0d9bff4ab28b9c8f6661f8fa]
+
+ Use import_cell_protection in odf styles import
+
+
+2022-06-02 Kohei Yoshida <kohei.yoshida@gmail.com> [cf68531c016440668fb830ff99b5e79e850c4535]
+
+ Use import_cell_protection in gnumeric
+
+
+2022-06-02 Kohei Yoshida <kohei.yoshida@gmail.com> [39e9628bc6516614808a870292be75393c851ae8]
+
+ Use range-based for loop in start_style()
+
+
+2022-06-02 Kohei Yoshida <kohei.yoshida@gmail.com> [2fce813115731e0a6e53bc2bbac7f0cfd63f23c7]
+
+ Use import_cell_protection in xlsx
+
+
+2022-06-02 Kohei Yoshida <kohei.yoshida@gmail.com> [63385c4a40af709217a75af73dfbcc900aba03d3]
+
+ Add import_cell_protection interface & impl and use it in xls-xml
+
+ Although xls-xml currently doesn't import cell protection attributes.
+ We'll tackle that with #159.
+
+2022-06-02 Kohei Yoshida <kohei.yoshida@gmail.com> [eb1950424d583b9d6711c11316a4d6ffd7daea08]
+
+ A bit of cleanup to switch to ranged-for loop etc.
+
+
+2022-06-01 Kohei Yoshida <kohei.yoshida@gmail.com> [ebaf75286c7d7da80d0582ccf995bee8f1ddd9a9]
+
+ Remove the old interface
+
+
+2022-06-01 Kohei Yoshida <kohei.yoshida@gmail.com> [0ced9ee3d043b8e8a60a0faab5513adc737111ab]
+
+ Use import_border_style in odf styles import
+
+
+2022-06-01 Kohei Yoshida <kohei.yoshida@gmail.com> [f22e27e2965eb67857d3005e16f19dfe8c17d0f6]
+
+ Use import_border_style in xlsx
+
+
+2022-06-01 Kohei Yoshida <kohei.yoshida@gmail.com> [df6b55f53f57aca588e6216a95489d7847976374]
+
+ Implement import_border_style and use it in xls-xml
+
+
+2022-05-31 Kohei Yoshida <kohei.yoshida@gmail.com> [816c9d20cb322dade1af9e94cb4b5e0251c47966]
+
+ Remove the old interface for fill style
+
+
+2022-05-31 Kohei Yoshida <kohei.yoshida@gmail.com> [0fbfcc740f91d1c6e3f3fa062e009a69437b3f24]
+
+ Use import_fill_style in gnumeric
+
+
+2022-05-31 Kohei Yoshida <kohei.yoshida@gmail.com> [64eab6cf448b2a7d5fb040023890c23a0117b79f]
+
+ Use import_fill_style in odf styles import
+
+
+2022-05-31 Kohei Yoshida <kohei.yoshida@gmail.com> [757da3a28d57464983113fc397d99a0fd05a4d7c]
+
+ Use import_fill_style in xlsx
+
+
+2022-05-31 Kohei Yoshida <kohei.yoshida@gmail.com> [2f9bea87a8890748a9d551abe6b24a897f9c982e]
+
+ Add implementation for import_fill_style and use it in xls-xml
+
+
+2022-05-26 Kohei Yoshida <kohei.yoshida@gmail.com> [dfd261b9313b55a4c1d87831a47dfe6d3e117dfe]
+
+ Add method docs for the set_*_count method interfaces
+
+
+2022-05-26 Kohei Yoshida <kohei.yoshida@gmail.com> [403e6698cb85df865f5f285f55144abedf8872af]
+
+ Completely remove the old interface ...
+
+ ... and fix some left-over code that was still using the old interface.
+
+2022-05-26 Kohei Yoshida <kohei.yoshida@gmail.com> [a4568198e216982e755b01bc17ba02f526479cc3]
+
+ Use import_font_style in the odf styles importer
+
+
+2022-05-26 Kohei Yoshida <kohei.yoshida@gmail.com> [28a9d1768104400da485132e0196d16eaa396364]
+
+ Use import_font_style in the gnumeric importer
+
+
+2022-05-26 Kohei Yoshida <kohei.yoshida@gmail.com> [861ef2db0087e554c5da501d7295f795cbf2fbe3]
+
+ Use import_font_style in the xls-xml import code
+
+ Also make it official that get_font_style() must return a non-null
+ pointer to the interface instance. I don't think allowing it to
+ return null here would work correctly if the import_style interface
+ is provided.
+
+ Let's also replace throw() with noexcept in the exception classes.
+
+2022-05-26 Kohei Yoshida <kohei.yoshida@gmail.com> [5a7f17072da85aeab96cc8b28e58304a5a001afb]
+
+ pstring -> std::string_view
+
+
+2022-05-26 Kohei Yoshida <kohei.yoshida@gmail.com> [8f89a07cd1fc0ebcf194e31933ee3a7ef2a2af60]
+
+ Consistent indentation on 'break'
+
+
+2022-05-26 Kohei Yoshida <kohei.yoshida@gmail.com> [08f3dc349d2004f7dc5d49ea89a840ff8d3d1ade]
+
+ Create import_font_style interface, and use it for xlsx
+
+ The old font style interfaces will be removed once it is all finished.
+
+2022-05-23 Kohei Yoshida <kohei.yoshida@gmail.com> [8c85c8c87d9986bc50c1a6c040b8f999a97768e8]
+
+ Move import_styles interface into its own header.
+
+
+2022-05-23 Kohei Yoshida <kohei.yoshida@gmail.com> [bb14f5d41c8438080cd3bbbae55d546b4138dac6]
+
+ Use relative header paths consistently
+
+
+2022-05-23 Kohei Yoshida <kohei.yoshida@gmail.com> [ac2c2a7670c841ffdbe1e9d5dc74c31a0b8db759]
+
+ Remove '= 0' from destructors with definitions
+
+
+2022-05-21 Kohei Yoshida <kohei.yoshida@gmail.com> [a646acb0408807ab62e8677cb6262ea077339818]
+
+ Add or modify the comments to clarify some cell style structure
+
+ This can be quite confusing.
+
+2022-05-19 Kohei Yoshida <kohei.yoshida@gmail.com> [a48c2d143076d760e89b1c72ff39c8a1a816b48f]
+
+ No need for m_ prefix with struct members
+
+
+2022-05-19 Kohei Yoshida <kohei.yoshida@gmail.com> [e7954837f6b57f7340106c98b4fe5fc9fab77e9a]
+
+ A bit more cleanup
+
+
+2022-05-19 Kohei Yoshida <kohei.yoshida@gmail.com> [d85b7b3505110020648a2d0028184d2ca3194a01]
+
+ Move some common types into the spreadsheet types header
+
+
+2022-05-19 Kohei Yoshida <kohei.yoshida@gmail.com> [16a5c224047d0d20bf67b2d204a95bb5500b80c1]
+
+ Remove unused code from shared_strings (#156)
+
+
+2022-05-19 Kohei Yoshida <kohei.yoshida@gmail.com> [2ceada380d911b3495669f1786eaa184189bcb34]
+
+ Rename original import_shared_strings to just shared_strings
+
+ ... and make it a non-heap member of document_impl.
+
+2022-05-19 Kohei Yoshida <kohei.yoshida@gmail.com> [9601eff42f4265da0ccce5601c07271f8ddbaddd]
+
+ Create a truly import only import_shared_strings class, and ...
+
+ ... use it to import shared strings. (#156)
+
+2022-05-17 Kohei Yoshida <kohei.yoshida@gmail.com> [c77deae627da7acb651fc699ace30a29fa4e7305]
+
+ Use forward declarations
+
+
+2022-05-17 Kohei Yoshida <kohei.yoshida@gmail.com> [931ecf49915dfa64705279378ab2c1ff1afc6061]
+
+ Actually we don't need these guards...
+
+ These methods use distinct stream instances, so no points setting
+ guards for them.
+
+2022-05-17 Kohei Yoshida <kohei.yoshida@gmail.com> [9161baed625c59e5fccc5c2db49aa52a02a63608]
+
+ Dump misc document properties
+
+ Also fix date_time_t::to_string() to ensure correct width for each
+ date component value.
+
+2022-05-17 Kohei Yoshida <kohei.yoshida@gmail.com> [d55b84e81c0a8c3d67ce91facb3c724dbb67be54]
+
+ Slightly better approach to universally handling enum to size_t
+
+
+2022-05-16 Kohei Yoshida <kohei.yoshida@gmail.com> [6391a2751470c26aef3df35e52e74b0dc90d76bd]
+
+ String with '-' also needs to be quoted
+
+
+2022-05-16 Kohei Yoshida <kohei.yoshida@gmail.com> [6d99b43c6199c801b43668fa3769f010e66473c4]
+
+ Dump number format values
+
+
+2022-05-16 Kohei Yoshida <kohei.yoshida@gmail.com> [f23fc33c30978fc6c3fa793ba001a47794639da4]
+
+ Dump protection values
+
+
+2022-05-16 Kohei Yoshida <kohei.yoshida@gmail.com> [161a3c145d16fae726f1be4d49aecd18d79a547c]
+
+ Remove duplicates
+
+
+2022-05-16 Kohei Yoshida <kohei.yoshida@gmail.com> [99143d48921c6863c7c1efb5425378d78411ca15]
+
+ Dynamically determine whether the value should be quoted
+
+
+2022-05-16 Kohei Yoshida <kohei.yoshida@gmail.com> [0c8f09671e65bc9bafed5b845eb22e47a9fc695b]
+
+ Dump strikethrough-style, -type, -width and -text
+
+ Also rename strikethrough_type_t::single to single_type, for the same
+ reason as underline_type_t.
+
+2022-05-16 Kohei Yoshida <kohei.yoshida@gmail.com> [aadd71c7217b8cbb227748991e0243c32ae633ac]
+
+ Dump underline-width, -mode and -type
+
+ Also rename underline_type_t::single to single_type as noted in my
+ comment.
+
+2022-05-16 Kohei Yoshida <kohei.yoshida@gmail.com> [be018396ed5f85d3b52c629ff59dc78b3cc41f0b]
+
+ Correctly spell 'continuous'
+
+
+2022-05-16 Kohei Yoshida <kohei.yoshida@gmail.com> [15a2a983313d886138718f58a08a6623cacc1773]
+
+ Rename dot_dot_dot_dash to dot_dot_dash.
+
+ This officially breaks the API compat.
+
+2022-05-16 Kohei Yoshida <kohei.yoshida@gmail.com> [78a8b85cdf346c16bc22434bff8a16c6e9545b27]
+
+ Dump the underline style of font attributes.
+
+
+2022-05-16 Kohei Yoshida <kohei.yoshida@gmail.com> [8026421d974368b742d747ef9bf33aed33b6dc7c]
+
+ Dump border attributes.
+
+
+2022-05-16 Kohei Yoshida <kohei.yoshida@gmail.com> [eabd2568eaac3f545011b1dd62ab1acb1fb2c8e6]
+
+ Explain what this template does.
+
+
+2022-05-16 Kohei Yoshida <kohei.yoshida@gmail.com> [4f66a161d0754eb82be0e305989208b970cf6514]
+
+ Dump the rest of the cell format values.
+
+ Also dump boolean values as true or false.
+
+2022-05-16 Kohei Yoshida <kohei.yoshida@gmail.com> [2f44883b994a7b50c898e42e439c0ac9e76aeafc]
+
+ Maintain consistency.
+
+
+2022-05-16 Kohei Yoshida <kohei.yoshida@gmail.com> [8f85308273a9d5c898d167c361d2985284fff3f5]
+
+ Dump horizontal and vertical alignment values.
+
+
+2022-05-16 Kohei Yoshida <kohei.yoshida@gmail.com> [17449ff020cbf3972e62be182b83c8935c416c59]
+
+ Remove duplicated code for dumping cell format contents.
+
+
+2022-05-16 Kohei Yoshida <kohei.yoshida@gmail.com> [de5486bc4c8d4aee492a459ef9a8e98571c175d8]
+
+ Dump unset value with '(unset)'.
+
+
+2022-05-16 Kohei Yoshida <kohei.yoshida@gmail.com> [93cb2a134edc2790e4354e2be45525ba2ff3f5f5]
+
+ Share ostream_format_guard because this is universally useful.
+
+
+2022-05-16 Kohei Yoshida <kohei.yoshida@gmail.com> [423537108a21fc4e90dbae445eaeb21c802132d0]
+
+ Tweaking the style dump output a bit.
+
+
+2022-05-16 Kohei Yoshida <kohei.yoshida@gmail.com> [e8fc630cb128fd0e722b38707fea528fdec84d91]
+
+ Dump cell format state.
+
+
+2022-05-16 Kohei Yoshida <kohei.yoshida@gmail.com> [d63bf6ac1bb2ae8279f1b87b022f318e063b3472]
+
+ Put the color values in quotes to make it a valid yaml.
+
+
+2022-05-16 Kohei Yoshida <kohei.yoshida@gmail.com> [f98f28c5019276b40f746d8b01f3a53c040db5c3]
+
+ Partially dump some styles stored in the document.
+
+
+2022-05-16 Kohei Yoshida <kohei.yoshida@gmail.com> [459518a4007ba39b66494ae426d6ec8f05bfef3e]
+
+ Use unique_ptr here
+
+
+2022-05-16 Kohei Yoshida <kohei.yoshida@gmail.com> [76445a18b6881a3b678d24e77376af23e01b96ab]
+
+ Put sheet_impl in detail namespace too
+
+
+2022-05-16 Kohei Yoshida <kohei.yoshida@gmail.com> [a35084202b16c08d89dfc50a708d40ee4daf73e0]
+
+ Rename debug_state_dumper to sheet_debug_state_dumper
+
+
+2022-05-16 Kohei Yoshida <kohei.yoshida@gmail.com> [e4580f2b7e8d7bf915afee654980510ed31e7fc4]
+
+ Put document_impl and its associated types inside detail namespace.
+
+
+2022-05-16 Kohei Yoshida <kohei.yoshida@gmail.com> [4b7d67bc45bcc2edd779047afb66cdb7666319ad]
+
+ Move document_impl out into its own header and source.
+
+ This will be referenced later in a doc state dumper.
+
+2022-05-16 Kohei Yoshida <kohei.yoshida@gmail.com> [2325e1fd9b9fbc554a8fd46576b27d2cc4925d56]
+
+ No m_ prefixes on struct members.
+
+
+2022-05-16 Kohei Yoshida <kohei.yoshida@gmail.com> [f729451f15ecbf13362b1370a625dc368e523b64]
+
+ Use std::unique_ptr here.
+
+
+2022-05-16 Kohei Yoshida <kohei.yoshida@gmail.com> [065b091b6ee8706e855f056603dd809a784c8d82]
+
+ Move this into a separate method.
+
+
+2022-05-16 Kohei Yoshida <kohei.yoshida@gmail.com> [d01cf79cdff54fbabd088a38ff67f61ba58051ad]
+
+ Let's not use the m_ prefix on struct members.
+
+
+2022-05-16 Kohei Yoshida <kohei.yoshida@gmail.com> [1c253e5700d25186d1f30bfa6d5797f378a165cd]
+
+ Convert tabs to spaces in all cmake files.
+
+
+2022-05-16 Kohei Yoshida <kohei.yoshida@gmail.com> [5218bac9de960682db7200deab722e207e41b57c]
+
+ Set up a debug state dumper and dumper cell values first.
+
+ This is the same dump as the 'check' output dump.
+
+2022-05-16 Kohei Yoshida <kohei.yoshida@gmail.com> [27e784590b80b7d4fa1be4647e54f5286ff493c2]
+
+ Avoid using namespace boost
+
+
+2022-05-16 Kohei Yoshida <kohei.yoshida@gmail.com> [d57b7d14e0a0d6685838ea96514e4eaf4bdaede9]
+
+ Make room for the debug-state output type.
+
+
+2022-05-16 Tom Stellard <tstellar@redhat.com> [469aca3c76965b9031947506a15d940cbcd11cdb]
+
+ Fix error when compiling with clang
+
+ csv.cpp:83:29: error: non-constant-expression cannot be narrowed from type 'Py_ssize_t' (aka 'long') to 'std::basic_string_view::size_type' (aka 'unsigned long') in initializer list [-Wc++11-narrowing]
+ app.read_stream({p, n});
+ ^
+ csv.cpp:83:29: note: insert an explicit cast to silence this issue
+ app.read_stream({p, n});
+ ^
+ static_cast<size_type>( )
+ 1 error generated.
+
+2022-05-11 Kohei Yoshida <kohei.yoshida@gmail.com> [08fa2255d24a232ac75027e8f114fe6824061113]
+
+ Replace pstring with std::string_view.
+
+
+2022-04-21 Kohei Yoshida <kohei.yoshida@gmail.com> [9a437392f126fd58b84d70a0a7fc34cccf84b9c2]
+
+ Do not reference a temporary object.
+
+ > orcus_filter_global.cpp: In function ‘std::string orcus::gen_help_output_format()’:
+ > orcus_filter_global.cpp:76:51: error: loop variable ‘entry’ of type ‘const std::pair<orcus::pstring, orcus::dump_format_t>&’ binds to a temporary constructed from type ‘std::pair<std::basic_string_view<char>, orcus::dump_format_t>’ [-Werror=range-loop-construct]
+ > 76 | for (const std::pair<pstring, dump_format_t>& entry : get_dump_format_entries())
+ > |
+
+2022-04-21 Kohei Yoshida <kohei.yoshida@gmail.com> [4fcc8d69fa5cf1be73a0e100cba61f63e4eee02c]
+
+ Fix typo.
+
+
+2022-03-31 Kohei Yoshida <kohei.yoshida@gmail.com> [3ef2457d0f0f53445573568762c16b766c059e2f]
+
+ Set up a test for format detection on invalid input blobs.
+
+
+2022-03-31 Kohei Yoshida <kohei.yoshida@gmail.com> [cc85fd039b447749dc226933f2b3797cdf36f3ec]
+
+ Use boost::filesystem to handle file paths.
+
+
+2022-03-30 Caolán McNamara <caolanm@redhat.com> [f5a8247b5ff59a73e6fcb11138212de5ca523243]
+
+ forcepoint#95 read past end of string on malformed input
+
+
+2022-03-25 Kohei Yoshida <kohei.yoshida@gmail.com> [0eab7d2407a1e157e3b2274f941a2649cb84885a]
+
+ Update the method doc wrt valid stream check.
+
+ Also make sure no callers check for valid stream before calling the
+ method. Turns out there is only one call site that did the check.
+
+2022-03-25 Caolán McNamara <caolanm@redhat.com> [0a99ca6d50af51f1b0a151fdcac5e12ec9b01bf8]
+
+ forcepoint#88 assigned temp std::string return to string_view
+
+ it's out of scope when used
+
+ =ERROR: AddressSanitizer: stack-use-after-scope on address 0x7ffcaf91b111 at pc 0x000000486ec4 bp 0x7ffcaf91aed0 sp 0x7ffcaf91a680
+ READ of size 2 at 0x7ffcaf91b111 thread T0
+ #0 0x486ec3 in __interceptor_memcpy.part.0 (instdir/program/soffice.bin+0x486ec3)
+ #1 0x7fa6c4471b77 in std::basic_streambuf<char, std::char_traits<char> >::xsputn(char const*, long) (/lib64/libstdc++.so.6+0x143b77)
+ #2 0x7fa6c4463ae3 in std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long) (/lib64/libstdc++.so.6+0x135ae3)
+ #3 0x7fa6b4027a26 in std::basic_ostream<char, std::char_traits<char> >& std::operator<<<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::basic_string_view<char, std::char_traits<char> >) /usr/bin/../lib/gcc/x86_64-redhat-linux/11/../../../../include/c++/11/string_view:669:14
+ #4 0x7fa6b426792b in orcus::xml_element_printer::print_namespace(std::ostream&, char const*) const workdir/UnpackedTarball/liborcus/src/liborcus/xml_util.cpp:35:12
+ #5 0x7fa6b4267c68 in orcus::xml_element_printer::print_element(std::ostream&, char const*, unsigned long) const workdir/UnpackedTarball/liborcus/src/liborcus/xml_util.cpp:46:5
+ #6 0x7fa6b41c1956 in orcus::xml_context_base::print_element(std::ostream&, std::pair<char const*, unsigned long> const&) const workdir/UnpackedTarball/liborcus/src/liborcus/xml_context_base.cpp:280:20
+
+2022-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [99e8e9019c1c64fb96c87cc29604ac0072d2a1d8]
+
+ Add valgrind-memcheck to the mix.
+
+
+2022-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [55c5caa73d577a00eb1e1acd8801423b73726bed]
+
+ New invalid test file.
+
+ This is for the fix in a718524ca424fb8a7e7931345a118342d1d4a507.
+
+2022-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [ddcfde18054580dc9027e266728bf61e25b5d0be]
+
+ Set up a test framework for parsing invalid XML docs.
+
+
+2022-03-24 Caolán McNamara <caolanm@redhat.com> [a718524ca424fb8a7e7931345a118342d1d4a507]
+
+ forcepoint#87 Assertion `mp_char <= mp_end' failed
+
+ soffice.bin: ../../include/orcus/parser_base.hpp:65: bool orcus::parser_base::has_char() const: Assertion `mp_char <= mp_end' failed.
+
+2022-03-24 Caolán McNamara <caolanm@redhat.com> [223defe95d6f20f1bc5fd22fecc80a79a9519028]
+
+ forcepoint#84 Invalid read of size 1
+
+ ==356879== Invalid read of size 1
+ ==356879== at 0x11EC50B0: orcus::parser_base::cur_char() const (parser_base.hpp:79)
+ ==356879== by 0x11EDD736: orcus::sax::parser_base::value(std::basic_string_view<char, std::char_traits<char> >&, bool) (sax_parser_base.cpp:303)
+ ==356879== by 0x11B7C3D5: orcus::sax_parser<orcus::sax_ns_parser<orcus::sax_token_parser<orcus::xml_stream_handler>::handler_wrapper>::handler_wrapper, orcus::sax_parser_default_config>::attribute() (sax_parser.hpp:563)
+ ==356879== by 0x11B7B35E: orcus::sax_parser<orcus::sax_ns_parser<orcus::sax_token_parser<orcus::xml_stream_handler>::handler_wrapper>::handler_wrapper, orcus::sax_parser_default_config>::element_open(long) (sax_parser.hpp:292)
+ ==356879== by 0x11B7A2F7: orcus::sax_parser<orcus::sax_ns_parser<orcus::sax_token_parser<orcus::xml_stream_handler>::handler_wrapper>::handler_wrapper, orcus::sax_parser_default_config>::element() (sax_parser.hpp:246)
+ ==356879== by 0x11B7A1C7: orcus::sax_parser<orcus::sax_ns_parser<orcus::sax_token_parser<orcus::xml_stream_handler>::handler_wrapper>::handler_wrapper, orcus::sax_parser_default_config>::body() (sax_parser.hpp:214)
+ ==356879== by 0x11B7A009: orcus::sax_parser<orcus::sax_ns_parser<orcus::sax_token_parser<orcus::xml_stream_handler>::handler_wrapper>::handler_wrapper, orcus::sax_parser_default_config>::parse() (sax_parser.hpp:182)
+ ==356879== by 0x11B79FBB: orcus::sax_ns_parser<orcus::sax_token_parser<orcus::xml_stream_handler>::handler_wrapper>::parse() (sax_ns_parser.hpp:277)
+ ==356879== by 0x11B79798: orcus::sax_token_parser<orcus::xml_stream_handler>::parse() (sax_token_parser.hpp:215)
+ ==356879== by 0x11B79436: orcus::xml_stream_parser::parse() (xml_stream_parser.cpp:68)
+ ==356879== by 0x11BE3855: orcus::orcus_xlsx::detect(unsigned char const*, unsigned long) (orcus_xlsx.cpp:188)
+ ==356879== by 0x11AB2492: orcus::detect(unsigned char const*, unsigned long) (format_detection.cpp:60)
+
+2022-03-24 Caolán McNamara <caolanm@redhat.com> [9f6400b8192e39fefd475a96222713e9e9c60038]
+
+ forcepoint#83 Invalid read of size 1
+
+ ==343916== Invalid read of size 1
+ ==343916== at 0x11A7B2F0: orcus::parser_base::cur_char() const (parser_base.hpp:79)
+ ==343916== by 0x11B7B112: orcus::sax_parser<orcus::sax_ns_parser<orcus::sax_token_parser<orcus::xml_stream_handler>::handler_wrapper>::handler_wrapper, orcus::sax_parser_default_config>::element_open(long) (sax_parser.hpp:258)
+ ==343916== by 0x11B7A2C7: orcus::sax_parser<orcus::sax_ns_parser<orcus::sax_token_parser<orcus::xml_stream_handler>::handler_wrapper>::handler_wrapper, orcus::sax_parser_default_config>::element() (sax_parser.hpp:246)
+ ==343916== by 0x11B7A197: orcus::sax_parser<orcus::sax_ns_parser<orcus::sax_token_parser<orcus::xml_stream_handler>::handler_wrapper>::handler_wrapper, orcus::sax_parser_default_config>::body() (sax_parser.hpp:214)
+ ==343916== by 0x11B79FD9: orcus::sax_parser<orcus::sax_ns_parser<orcus::sax_token_parser<orcus::xml_stream_handler>::handler_wrapper>::handler_wrapper, orcus::sax_parser_default_config>::parse() (sax_parser.hpp:182)
+ ==343916== by 0x11B79F8B: orcus::sax_ns_parser<orcus::sax_token_parser<orcus::xml_stream_handler>::handler_wrapper>::parse() (sax_ns_parser.hpp:277)
+ ==343916== by 0x11B79768: orcus::sax_token_parser<orcus::xml_stream_handler>::parse() (sax_token_parser.hpp:215)
+ ==343916== by 0x11B79406: orcus::xml_stream_parser::parse() (xml_stream_parser.cpp:68)
+ ==343916== by 0x11BE3805: orcus::orcus_xlsx::detect(unsigned char const*, unsigned long) (orcus_xlsx.cpp:188)
+ ==343916== by 0x11AB2482: orcus::detect(unsigned char const*, unsigned long) (format_detection.cpp:60)
+ ==343916== by 0x30E60945: (anonymous namespace)::OrcusFormatDetect::detect(com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue>&) (filterdetect.cxx:83)
+ ==343916== by 0x30E60ABE: non-virtual thunk to (anonymous namespace)::OrcusFormatDetect::detect(com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue>&) (filterdetect.cxx:0)
+
+2022-03-23 Kohei Yoshida <kohei.yoshida@gmail.com> [1bb9375dcfb43b7b06e371310f01688bd3efb02e]
+
+ Use ax_valgrind_check to enable running tests under valgrind.
+
+
+2022-03-23 Kohei Yoshida <kohei.yoshida@gmail.com> [a63b9f598dac150e6af7a6126ccff8793a4ba035]
+
+ Update the required ixion API version.
+
+
+2021-12-15 Kohei Yoshida <kohei.yoshida@gmail.com> [8865b88c8627953c1c4f371c3a582f58f233295d]
+
+ Set the next version to 0.17.2.
+
+
+2021-12-14 Kohei Yoshida <kohei.yoshida@gmail.com> [d93d1d89db946c6578d8575cfa6b4fc64ae11767]
+
+ Add to CHANGELOG.
+
+
+2021-12-14 Kohei Yoshida <kohei.yoshida@gmail.com> [8e270ff28bcbdfec1e07b01d8b34b6f4b2ce5545]
+
+ style:cell-protect="none" means explicitly not protected.
+
+ We need to therefore pass this state to the handler explicitly.
+
+2021-12-10 Kohei Yoshida <kohei.yoshida@gmail.com> [04e3d8e6d78dd4644ea8f46926c4c347fae41535]
+
+ Mention coverity issues and compiler warnings.
+
+
+2021-12-10 Kohei Yoshida <kohei.yoshida@gmail.com> [f7f9060e758109a8d4661691c044ee2a46074108]
+
+ Add items for 0.17.1.
+
+
+2021-12-10 Kohei Yoshida <kohei.yoshida@gmail.com> [5a459c8e70e38ccbf466ae2196aca2e2e48c4472]
+
+ Fix make distcheck.
+
+
+2021-12-08 Kohei Yoshida <kohei.yoshida@gmail.com> [82a5da70dae6b96a2f63dc1cc000aeae1fc1c276]
+
+ Add a test case for ignore invalid sub structure.
+
+ Also tweak the validator to allow elements when no rules are defined.
+
+ This is related to #138.
+
+2021-12-08 Kohei Yoshida <kohei.yoshida@gmail.com> [13fd8c214a34e7817afe493068f00d47a073ab09]
+
+ Print short name in case an alias is not available.
+
+
+2021-12-08 Kohei Yoshida <kohei.yoshida@gmail.com> [61126fb6ef8889cffa129ea34559fe6d12675f16]
+
+ Introduce ORCUS_ODS_USE_THREADS env var to toggle threaded parsing.
+
+
+2021-12-07 Kohei Yoshida <kohei.yoshida@gmail.com> [7ef047ae9ff3508d3c41749c55c893dcd2e1defb]
+
+ Print ':' only when the namespace is not empty.
+
+ Also add dump_state() to xmlns_context for debugging. Sometimes the
+ code fails to fetch correct alias string from a namespace value.
+
+2021-12-07 Kohei Yoshida <kohei.yoshida@gmail.com> [06f7d237fce4e47f388e58e721ac60e84b3f9b2e]
+
+ Add even more rules.
+
+
+2021-12-07 Kohei Yoshida <kohei.yoshida@gmail.com> [5345e4d55a2356d888c0811ea05cb9c03308936a]
+
+ Add a whole bunch more rules.
+
+
+2021-12-07 Kohei Yoshida <kohei.yoshida@gmail.com> [fde279c75ec388b2fea61900d3632e993df5d5c8]
+
+ Define rules for <ss:Data> context.
+
+
+2021-12-07 Kohei Yoshida <kohei.yoshida@gmail.com> [e26163ab7abfba598fb95133dc1457d1d021e032]
+
+ Move up child element evaluation to the xml_context_base.
+
+ And have the derived class provide the validation rules. This makes
+ more sense.
+
+ Also rename element_printer to xml_element_printer.
+
+2021-12-07 Kohei Yoshida <kohei.yoshida@gmail.com> [6377c883c50d09e6aae2aea62dcb8e58a8bb59fd]
+
+ No need to check XML structure in start_element(), now that it ...
+
+ ... is done in evaluate_child_element().
+
+2021-12-07 Kohei Yoshida <kohei.yoshida@gmail.com> [7641764abc4a3b21f5825510d41d5e858aa1b545]
+
+ More descriptive validation results.
+
+
+2021-12-07 Kohei Yoshida <kohei.yoshida@gmail.com> [bb0ef631ca829e7a47039cdf397a4362bc8ce638]
+
+ Move evaluate_child_element() above create_child_context().
+
+
+2021-12-07 Kohei Yoshida <kohei.yoshida@gmail.com> [4242c31449a110bdad9fe6d34d638426b5cd8056]
+
+ Extract the element printing logic and re-use it in xml_stream_handler.
+
+
+2021-12-07 Kohei Yoshida <kohei.yoshida@gmail.com> [d06d31f182650cf74646b1177a313eb58a589de0]
+
+ No reason why we wouldn't set it to all contexts on the stack.
+
+
+2021-12-07 Kohei Yoshida <kohei.yoshida@gmail.com> [225f5ee352e861ce326f7576b72b8cd4c3a18385]
+
+ This shouldn't be necessary since the ns cxt gets passed ...
+
+ ... from the parent context to the child via transfer_common(). For
+ the invalid context, it gets set when in the stream handler's
+ set_ns_context() method.
+
+2021-12-06 Kohei Yoshida <kohei.yoshida@gmail.com> [96820dc40fc89ba2215b7e9ba4ef7ab26c2cfa60]
+
+ Add some TODO items.
+
+
+2021-12-06 Kohei Yoshida <kohei.yoshida@gmail.com> [bef436d0c99ccb55efc8fef30c0f1c216342774e]
+
+ Now we can have xml_stream_handler create an invalid context directly.
+
+ With this, there is no need to store this context in xml_stream_base.
+
+2021-12-06 Kohei Yoshida <kohei.yoshida@gmail.com> [d6afee4ad69f51f523a45994db967c452d3086e2]
+
+ Pass session_cxt and tokens to xml_stream_handler too.
+
+
+2021-12-06 Kohei Yoshida <kohei.yoshida@gmail.com> [1702f665ce30940031c670456a1413d5cf090cf0]
+
+ Add more valid rules.
+
+
+2021-12-06 Kohei Yoshida <kohei.yoshida@gmail.com> [7f983dd85ed3bfbdc0747ca10e2e76486d1ef89d]
+
+ <ss:Cell> to <ss:Data> is allowed.
+
+
+2021-12-06 Kohei Yoshida <kohei.yoshida@gmail.com> [63e718cc1a4169cabf99592c26704967a0ea751e]
+
+ print_element() to always print <>.
+
+
+2021-12-06 Kohei Yoshida <kohei.yoshida@gmail.com> [32d14d7d8db63767161d396544b1174e12a10fa5]
+
+ Tidy up the element structure validation rules.
+
+
+2021-12-03 Kohei Yoshida <kohei.yoshida@gmail.com> [ebbfcbb8a3bc58e3305fc90c5a1faadcef6b4ef9]
+
+ Print warning when an invalid element is encountered.
+
+
+2021-12-03 Kohei Yoshida <kohei.yoshida@gmail.com> [4bfab6d792b4960144aae529c010389d98d4d161]
+
+ Evaluate child element's validity ahead of time and make use of ...
+
+ ... an empty context to ignore the whole sub structure in case the
+ child element is not valid. Implemented only in xls_xml_context for
+ now.
+
+2021-12-03 Kohei Yoshida <kohei.yoshida@gmail.com> [caff6bd698bed25b957783e2eb5eb9d36e53bd4f]
+
+ get_current_element() to not throw.
+
+
+2021-12-03 Kohei Yoshida <kohei.yoshida@gmail.com> [b08628149729ee75d82df3ce947b5162e2c71cfd]
+
+ We don't need non-const get_current_element() and get_parent_element().
+
+
+2021-12-03 Kohei Yoshida <kohei.yoshida@gmail.com> [98866699519f14ccaecab01054a9e6cfe997ddc7]
+
+ Add method docs.
+
+
+2021-12-03 Kohei Yoshida <kohei.yoshida@gmail.com> [ab0376681244ddbe6cdaf23350adf3f93e0ec359]
+
+ Add xml_empty_context to use it to ignore XML sub structures.
+
+
+2021-12-03 Kohei Yoshida <kohei.yoshida@gmail.com> [889dde85e65e4460418fa8b000ae321304d29e86]
+
+ Remove all traces of can_handle_element() virtual methods.
+
+
+2021-12-02 Kohei Yoshida <kohei.yoshida@gmail.com> [f5b0a2e4542ec347ee4a9d796103dba198342f33]
+
+ Remove can_handle_element() virtual method.
+
+ By combining the role of can_handle_element() and create_child_context(),
+ can_handle_element() is no longer needed. The next step is to remove all
+ the can_handle_element() methods from all the derived classes.
+
+2021-12-02 Kohei Yoshida <kohei.yoshida@gmail.com> [26d8b8621db43667eb44f8d4159ea99b2d81137d]
+
+ Re-generate ODF tokens based on v1.3 schema doc.
+
+ Aside from the already deprecated 'process-content' token, v1.3 is
+ a super set of v1.2 in terms of generated token set. So this should
+ be a safe change.
+
+2021-12-02 Kohei Yoshida <kohei.yoshida@gmail.com> [bf9e3219b8f753f2a81d86157c1bc299e5411e97]
+
+ Skip relaxNG namespace. This is only used in the schema doc.
+
+
+2021-12-02 Kohei Yoshida <kohei.yoshida@gmail.com> [f03e8fec974ef4341043714d2a52f9f354fcce0e]
+
+ A little cleanup
+
+
+2021-12-02 Kohei Yoshida <kohei.yoshida@gmail.com> [1a1ffb361aed0f7cbbcf326f162fddb0fc020983]
+
+ Add the option of generating token summary output.
+
+ Useful for v1.2 to v1.3 comparison.
+
+2021-12-02 Kohei Yoshida <kohei.yoshida@gmail.com> [6311423006f6c6cf4522fecb1638b51b62f6c242]
+
+ Update the code to modern python and fix token generation.
+
+
+2021-12-01 Kohei Yoshida <kohei.yoshida@gmail.com> [f6be585269e769233a01875dfc75192de11f03ea]
+
+ Switch away from for_each() with function object.
+
+
+2021-11-30 Kohei Yoshida <kohei.yoshida@gmail.com> [ee27f8ea326cfb5b304e46ceb7f84b441e090681]
+
+ for_each to range for loop.
+
+
+2021-11-30 Kohei Yoshida <kohei.yoshida@gmail.com> [a19ec1ab80af831cc2230bbc244d5e50e0452d32]
+
+ Use namespace to group mapped values.
+
+
+2021-11-30 Kohei Yoshida <kohei.yoshida@gmail.com> [81faf0b92dc296c751d220b60de7d69c99175e4c]
+
+ for_each to range-based for loop.
+
+
+2021-11-30 Kohei Yoshida <kohei.yoshida@gmail.com> [cf9a8a5a1f94765bd8c931af13e9c8d4bc40290b]
+
+ More on pstring to std::string_view conversion.
+
+
+2021-11-30 Kohei Yoshida <kohei.yoshida@gmail.com> [f108bc1625bce24a0d129a5fc8e2295ee8387012]
+
+ pstring to std::string_view in xml_stream_handler.
+
+
+2021-11-30 Kohei Yoshida <kohei.yoshida@gmail.com> [fdfaa98ac5125d6952b6d43f40998f196be9cb04]
+
+ Use std::unique_ptr to wrap the root context instance.
+
+
+2021-11-23 Kohei Yoshida <kohei.yoshida@gmail.com> [1e42935a443f6add4714affc57a35b2b5fc9235a]
+
+ Set the next version to 0.17.1.
+
+
+2021-11-23 Kohei Yoshida <kohei.yoshida@gmail.com> [e5bc949dbefd92dd0aef68f9cb35231ef3e09af3]
+
+ Fix CMake's check target.
+
+
+2021-11-23 Kohei Yoshida <kohei.yoshida@gmail.com> [134fe27bdc3d032da66cf5abf5030ebfa9e5c0d6]
+
+ Fix the cmake build.
+
+
+2021-11-19 Kohei Yoshida <kohei.yoshida@gmail.com> [0ed3e31c655f08dc5c774dd4598dd4a25505a94e]
+
+ Introduce style_attrs_t<T> to simplify some types a bit.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [9513c43edc6bb439d490bcf9a988d3af516b45d8]
+
+ Move this into a separate function like the other test groups.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [12fd70bcaaccb23a4df32025946e76bb07a583f7]
+
+ Test for active flags on number format attributes.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [e23dc2f86a11ef1d3a895b54ae2a5f58bae541d7]
+
+ Simplify the number format test code.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [a63c2ad2477c9bb4d7dc6c77a7efffa03a09d1af]
+
+ Keep track of applied number format attributes and store that info.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [05a9bb17dec8b5895388f0cc196dcf5efa295645]
+
+ Commit format code only when it's not empty. Otherwise use the default.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [0f31a7bc54cc82ccdafaf11b1f1adac7552ba017]
+
+ Use override keywords.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [a7b59a58f0c8941c88020894b461c5a3bc4e0709]
+
+ pstring to std::string_view.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [049fa8fd068702eda308166e83a05d970f902df5]
+
+ Avoid repeatedly instantiating the number format context object.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [c1f1ee2b2c442c2003ec0771bcdc450d1f9bd3c8]
+
+ Add active flags to number_format_t and store that in the backend.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [7a11d9d9673711843d4ed75eadc0e9feb30b34cf]
+
+ Use to_bool().
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [690676d6214a4de95d29420752eb0ef4884dc479]
+
+ Class description.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [b906bda3a34e840f299b7670e084670a8a6e57cb]
+
+ Add test cases for the rest of the protection styles.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [ba766652e39b8a1a63bf9605c37eb0fe7e42dc97]
+
+ Only pass specified protection attributes during parsing...
+
+ ... and test the values for the "Hide Formula" style.
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [c899a4727ef85003dea353c155814d46c9ea7f22]
+
+ Create a test file for cell-protection styles, and set up a test function.
+
+ Also add the active flags for protection_t and store that infor in the
+ backend model.
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [486317a6262a35b4db8e08a139a65c31a68db7be]
+
+ Make the unexpected element error output more viewer friendly.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [40bfea71d98dc3447b184f66a5e4f4f122afe574]
+
+ Add class annotations.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [594d9d22eb50b0e4cbb50f4539bfb82e777d9bf3]
+
+ Add test code for border styles.
+
+ Only the "Note" style in the standard styles has border attributes.
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [1ec387914983bb95dc5443e41b2c81c3cae03032]
+
+ Keep track of active states of border attributes.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [35662b1f4ddac35ec80e966a0f97f0683e07c21c]
+
+ Simplify the code a bit.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [20a3efbcccc9c012f91c8cc44213347157b34825]
+
+ Use value_type in lieu of std::make_pair(...).
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [be7a595e8b8dc312c36900084ed11c6989fe7a76]
+
+ Commit each property group only when they exist.
+
+ Otherwise we'd be adding a whole bunch of duplicated default styles.
+ An index of 0 is associated with the default style for that group,
+ so using 0 is fine in case of empty property group.
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [752a12afe0c0c02d0f64cb885b490c8744d756d1]
+
+ Add test cases for fill properties for the rest of the standard styles.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [3eecdaa1dd4253f522440c5876076cc3547fccc9]
+
+ When for RGB color values without A, set A to 255, not to 0.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [78d193b22e1c9d1e650d0ef5ad5ad1d597f04bbb]
+
+ Add test cases for fill properties of "Note" style.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [8abe6858968377498c4139afa5da4059f3966842]
+
+ Make the background color optional.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [6a50282e32b18d268d0cd239381b653ef76649c1]
+
+ border_details -> border_details_t.
+
+ This will prevent the type name and the variable name to be the same.
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [cc8f5b0508d1039b2abdf9fa00895feab83f0dd8]
+
+ Add fill_active_t and use it to keep track of active fill attributes.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [ddbed5d954d8ef0dce4d380f65357d55e53872bf]
+
+ Switch from std::for_each to range-based for loop.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [7f43e353b51fea806b2344bb8a0587e4f2a34ee8]
+
+ Early bail out on mp_styles being null.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [e506786779f7c3bbee5fc96c6ec31eb6ee01f409]
+
+ Let's re-use xml_structure_error for this.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [331ad9cc53151c5b8a2527c0128c060c4a64c2a1]
+
+ Handle table-cell-properties parsing in a separate method.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [d83bcd7cc65920ebe33853e3e100e09eebca558f]
+
+ Add partial test case for the "Hyperlink" style properties.
+
+ Also handle "font-color" underline color value, which re-uses the color
+ of the font.
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [0c3cbecddd3db3b066abb05681bcfb8884bc8ec4]
+
+ Clean up and fix ODF's style:text-underline-style.
+
+ There is no dot_dot_dot_dash. It is probably meant to be dot_dot_dash.
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [5f62010ea02bee779cdbe038ba48df3d3beec131]
+
+ Switch odf_helper class to namespace odf & do some cleanup.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [09354805f5c8e0c11e1ebfd535e376bf16aca5b6]
+
+ Add checks for text properties.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [b7a9f8700f227a0631c91669f8864b512f8a6177]
+
+ Add all styles entries with name checking.
+
+ The properties will be evaluated later.
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [134aa901e9a349e81eac6e589b0e42d6114bbf03]
+
+ test_global.hpp must be included as the first header in every test.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [cf9601859cd7ba442208bedfb39a9bfd52f15d62]
+
+ Test text properties for 'Heading 1'.
+
+ Also mention the name of the style in case it's not found.
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [8b5f6e62e47988e29e32d10ea1a0a5e1425ee3ac]
+
+ Add function to simplify verification of active font attributes.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [cbfc4796b8c8dfb1036890300639f2dca4485fb8]
+
+ Add active flag for the name attribute too.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [cc7cbf7960697fe97b219b4bb3bc16957f880263]
+
+ Add test code to ensure correct active font attributes.
+
+ Also, we shouldn't automatically use the font color for underline color
+ in case the underline color is not specified. That should be left up to
+ the client application.
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [57cbacf8cfc04cea69fc333ac7462453d161fcfa]
+
+ Use xml_elem_set_t for validation against multiple elements.
+
+ Also fix some coding style with break.
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [e4cf1db1e252f70f905cb725e0e5e74ebd62d927]
+
+ Make strikethrough attributes optional.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [10bca6a9918b84d811b9bcadf3e1085050051c74]
+
+ has_underline flag is probably meaningless.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [72352fd21c83bd2723c14e2a9fd7848ac5980534]
+
+ Make underline attributes optional.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [9e01fbf64deb922426c4bc88114a2e279966b5ef]
+
+ Add a missing header.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [0ffcc64137cb4d734f9c3063f38b1478e7d07fb4]
+
+ Simplify the underline color handling logic with one less flag.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [512474b49097625212bb204daa912880f5e81418]
+
+ Use color_rgb_t for underline color & make it optional.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [cd871067b37f64c7f9f49335df3aaa6306cadba6]
+
+ Make color value optional & simplify its handling a bit.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [c07be816e5f5a62ecb756e4575fbf9ec1477ec06]
+
+ Make font name, size, bold and italic values optional.
+
+ This fixes one unit test case.
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [de45db084d697916e1a9a9d3560d23cc6152244f]
+
+ Use namespace to group related stuff.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [4e56fbb69c9dcafbd3f168b02d21b0d20a174ba7]
+
+ spreadsheet -> ss
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [faa55b6b42f5a9c321dacc6ee2e0842047b71053]
+
+ Switch for_each with functor to range-based for loop.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [e714244cea2f535d36d6aaba08e460b4922ac46e]
+
+ No using namespace std & fix header braces.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [e21774782146628c7e112da2e6d07246915f803b]
+
+ Store active flags for font_t attribute values.
+
+ Also set up a test framework for this.
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [8c4f314d8d3f5ddb95e420c99faecfc152a30942]
+
+ Use boost::filesystem to handle file paths.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [ed733e1c26f6c033f3b2a679dbad54a691382610]
+
+ Remove m_ prefixes from struct members.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [4b9a2ae674c9fc911e2813275c596bbe49ec7b21]
+
+ No more m_ prefixes on members of structs.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [a309312d6442ed34e127b5801ac937d36f3cd60d]
+
+ Move mock_spreadsheet.* into test static lib.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [4d0abb255a0e615f7db86e814bcab642fa4e03dc]
+
+ Rename orcus-odf-styles-context-test to orcus-test-import-ods.
+
+ To be consistent with the rest of the tests in the same directory.
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [0a03a307d9cc15450780d9ab7cdca7cde7f9adb8]
+
+ The entire code (besides main) can be in anonymous namespace.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [9e216782e09da35665304933c9a51d4863fb1e5a]
+
+ Set up a test model to simplify loading of styles.
+
+
+2021-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [d59f11d296281154204d99d58f7508726107a479]
+
+ const correctness & pass as reference not as a pointer.
+
+
+2021-11-17 Caolán McNamara <caolanm@redhat.com> [17c502dc816158aec83e92e13e68f62c80fa7748]
+
+ crashtesting: crash on passing null to std::string_view
+
+ with many documents, e.g. moz377878-1.xhtml
+
+2021-11-11 Caolán McNamara <caolanm@redhat.com> [19b3e2eb949240ce2f79d59b5433491f3cc3ca06]
+
+ cid#364089 Uncaught exception
+
+
+2021-11-11 Caolán McNamara <caolanm@redhat.com> [fd1e7d0dcc493dc4cd3e143c11e0b2f1c46ddd61]
+
+ cid#364092 Uncaught exception
+
+
+2021-11-11 Caolán McNamara <caolanm@redhat.com> [0fff7e0a27902ebbe759348c3e75968699ebb7fa]
+
+ cid#364093 Uncaught exception
+
+
+2021-11-11 Caolán McNamara <caolanm@redhat.com> [4be858d227504fab6d1b2a3f82e93c3378cd09b1]
+
+ cid#364094 Uncaught exception
+
+
+2021-11-11 Caolán McNamara <caolanm@redhat.com> [81afa784c85535850e539ed203d6dd1e548bcf86]
+
+ cid#364090 Logically dead code
+
+
+2021-11-11 Caolán McNamara <caolanm@redhat.com> [9b97d1d83715fe74b2942de387d088633bb18d40]
+
+ cid#364091 Not restoring ostream format
+
+
+2021-11-11 Caolán McNamara <caolanm@redhat.com> [0ab455332c226d9047035ddee16a317e0378101a]
+
+ cid#364067 Uncaught exception
+
+ suppress
+ cid#364067 Uncaught exception
+ cid#364064 Uncaught exception
+
+ this makes ./configure --disable-spreadsheet-model 0 coverity warnings
+
+2021-11-10 Caolán McNamara <caolanm@redhat.com> [0b5708a9fe0c4115f526ba36838b6725e4918af6]
+
+ cid#364062 Uncaught exception
+
+
+2021-11-10 Caolán McNamara <caolanm@redhat.com> [618e8716f7e441f9da62b3c0e4296d16701940c6]
+
+ cid#364072 Uncaught exception
+
+
+2021-11-09 Caolán McNamara <caolanm@redhat.com> [60dd68d0108f3b2a5c5bf4ab059cc0e611838807]
+
+ cid#54447 Uninitialized pointer field
+
+
+2021-11-09 Caolán McNamara <caolanm@redhat.com> [f1bfa7a1224d7ef54ea49703e95f54334786a767]
+
+ cid#364070 Uninitialized scalar variable
+
+
+2021-11-09 Caolán McNamara <caolanm@redhat.com> [d896dbae605420f98aaff1c7c34da1a42983cb59]
+
+ cid364066 Missing move assignment operator
+
+
+2021-11-09 Caolán McNamara <caolanm@redhat.com> [7241e81760d9e12f1f013c30b852bead2b2a7f0b]
+
+ cid#54436 Uncaught exception
+
+
+2021-11-09 Caolán McNamara <caolanm@redhat.com> [3e7e03c639797ebd6e3c744b59d202b37a63deac]
+
+ cid#364068 Uninitialized scalar variable
+
+
+2021-11-09 Caolán McNamara <caolanm@redhat.com> [4f29d4ed2255d758424f0667ab50a58fdc8660cb]
+
+ cid#364063 drop unused variable
+
+
+2021-11-09 Caolán McNamara <caolanm@redhat.com> [e80b0c36c404a941145b5ad4e7bc135bfe82c485]
+
+ cid#364073 Uninitialized scalar field
+
+
+2021-11-03 Kohei Yoshida <kohei.yoshida@gmail.com> [45fad9dff0731a278bee629fb088d4b5b7bd464b]
+
+ Try using boost::filesystem instead of std::filesystem.
+
+ std::filesystem still seems unreliable.
+
+2021-11-03 Kohei Yoshida <kohei.yoshida@gmail.com> [bc2fc5c359b09f912ca4703da49d6749b397d50e]
+
+ Unused variables.
+
+
+2021-11-02 Kohei Yoshida <kohei.yoshida@gmail.com> [5bb64db5ecfd1dc3be3304092f4bdebff54deae5]
+
+ Remove unused parameter warnings.
+
+
+2021-10-29 Kohei Yoshida <kohei.yoshida@gmail.com> [bf4f3a43e18d670bcd1e9d9ba3be6933667cc56a]
+
+ Update CHANGELOG.
+
+
+2021-10-28 Kohei Yoshida <kohei.yoshida@gmail.com> [347ab944b31055c52a808cfa087dd83b231ee1f4]
+
+ Set the version to 0.17.0.
+
+
+2021-10-28 Kohei Yoshida <kohei.yoshida@gmail.com> [3410f561c2d883c0dfd3f870e2e318991ceeec7d]
+
+ Fix cmake build for 'check' target.
+
+
+2021-10-27 Kohei Yoshida <kohei.yoshida@gmail.com> [0828f365c5c20f1fabe45f16b9c799d40b347a84]
+
+ We don't need TEST_BINS either.
+
+
+2021-10-27 Kohei Yoshida <kohei.yoshida@gmail.com> [ed292f25af499df675169e238b788dfb7dbdbc6d]
+
+ Fix make distcheck.
+
+ Turns out we don't need these *.run files to set environment variables
+ when we can simply use AM_TESTS_ENVIRONMENT instead.
+
+2021-10-27 Kohei Yoshida <kohei.yoshida@gmail.com> [bfb29b7289e3c4bd7803a936871e3b3fdb78e1b8]
+
+ Convert spaces to tabs for makefile.
+
+
+2021-10-27 Kohei Yoshida <kohei.yoshida@gmail.com> [bd337588f051119f367e3b8b69525f8d697760d5]
+
+ Replace the rest of boost::optional with std::optional.
+
+
+2021-10-27 Kohei Yoshida <kohei.yoshida@gmail.com> [8f300171790b642743a2ca78f4db194dfff18594]
+
+ Replace boost::optional with std::optional.
+
+ This also helped remove the following warnings:
+
+ xlsx_pivot_context.cpp:964:37: warning: ‘*((void*)& max_value +8)’ may be used uninitialized in this function [-Wmaybe-uninitialized]
+ 964 | m_pcache.set_field_max_value(*max_value);
+ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~
+ xlsx_pivot_context.cpp:961:37: warning: ‘*((void*)& min_value +8)’ may be used uninitialized in this function [-Wmaybe-uninitialized]
+ 961 | m_pcache.set_field_min_value(*min_value);
+ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~
+
+2021-10-27 Kohei Yoshida <kohei.yoshida@gmail.com> [de870554e43297e1db63b1d4e55f4c7a52a7ce9c]
+
+ Add test case for utf-8 value parsing & implement move assignment.
+
+
+2021-10-27 Kohei Yoshida <kohei.yoshida@gmail.com> [d28f63b2cd5b99f1677fc7040fa27a8ba2c736cd]
+
+ Use std::unique_ptr for css_document_tree's pimpl, and simplify ...
+
+ ... test document loading.
+
+2021-10-27 Kohei Yoshida <kohei.yoshida@gmail.com> [7f66db7253e4042a1f106050ec22f7f0fafc2084]
+
+ Use boost::filesystem::path to handle file paths.
+
+
+2021-10-27 Kohei Yoshida <kohei.yoshida@gmail.com> [de0aca38c48ca9b2f6eff8ec353e51b70dbe4d9a]
+
+ Replace pstring with std::string_view and remove 'using namespace std'
+
+
+2021-10-26 Kohei Yoshida <kohei.yoshida@gmail.com> [bb1b874aab2939bbcdf0584192ff6dff28e0c5ac]
+
+ Retire clip() in favor of std::clamp().
+
+
+2021-10-26 Kohei Yoshida <kohei.yoshida@gmail.com> [966c72f1258a36884bc32467b843393eac2694ff]
+
+ Use std::isdigit().
+
+
+2021-10-26 Kohei Yoshida <kohei.yoshida@gmail.com> [4b67ee4b204b72d34e72a0c5d933343affb51a82]
+
+ Avoid shadowing of 'max_size'.
+
+
+2021-10-26 Kohei Yoshida <kohei.yoshida@gmail.com> [528e35ea718913d454882fa1720bb7fc0c032e05]
+
+ Remove is_name_char(). Is has limited usefulness.
+
+
+2021-10-26 Kohei Yoshida <kohei.yoshida@gmail.com> [683012f54f5110562c4bfd016f537061697fedc7]
+
+ Revise css property value parsing to allow valid utf-8 strings.
+
+
+2021-10-26 Kohei Yoshida <kohei.yoshida@gmail.com> [5ca468a21142ae0f33bb523ec13c805e4d0feca6]
+
+ css::parser_base::identifier() to take std::string_view.
+
+
+2021-10-26 Kohei Yoshida <kohei.yoshida@gmail.com> [776289de7035069a61bea22eb49ddc7bef4f2011]
+
+ Use std::isalpha() for alpha-numeric character test.
+
+ But first cast it to unsigned char before calling std::isalpha, for
+ safety.
+
+2021-10-26 Kohei Yoshida <kohei.yoshida@gmail.com> [500c0b8441914ffa3104e34fbb96d0ed0f3285ed]
+
+ Fix header includes to use <> for orcus public headers.
+
+
+2021-10-26 Kohei Yoshida <kohei.yoshida@gmail.com> [a0f016bb1add86e153cd7ed3292f480eb116bc77]
+
+ Remove write_to(). This is not all that useful.
+
+
+2021-10-26 Kohei Yoshida <kohei.yoshida@gmail.com> [56ecd338b818e76d988057f6af5b49f96d80c065]
+
+ is_in() to take std::string_view.
+
+ Also use std::any_of() instead of manual loop.
+
+2021-10-25 Kohei Yoshida <kohei.yoshida@gmail.com> [3f0194b513f99c894f186b05e7e5eb7f5fc7d0ef]
+
+ Remove unnecessary check for the first char of a name.
+
+ With the utf-8 parsing code doubling as a check for valid first
+ character of a name, we don't need these extra checks anymore.
+
+ This should fix #143.
+
+2021-10-25 Kohei Yoshida <kohei.yoshida@gmail.com> [a252d4e521c8773c53fa65366688bfa513131c2e]
+
+ Rename non-ascii -> utf8-1.
+
+
+2021-10-25 Kohei Yoshida <kohei.yoshida@gmail.com> [18ce63710577dfe9f55b99648595cb503ba9933d]
+
+ Quote key strings in presence of '#' or ': '.
+
+ This is related to #14.
+
+2021-10-25 Kohei Yoshida <kohei.yoshida@gmail.com> [28ba2d878b7394c625ebb28c24a9ba7abb54c9c7]
+
+ Build fix for VS 2017.
+
+
+2021-10-22 Kohei Yoshida <kohei.yoshida@gmail.com> [e5e747145957555d33b61cd1dd382e1251621d6f]
+
+ Use literalinclude instead of copy-n-paste the code block.
+
+
+2021-10-22 Kohei Yoshida <kohei.yoshida@gmail.com> [5e22dcf1a1eaa027c9ed59957009a3a3ad08ef1d]
+
+ Add YAML option to the doc.
+
+
+2021-10-21 Kohei Yoshida <kohei.yoshida@gmail.com> [a2a221a7178cba774b56356ea241255ecf9cf525]
+
+ Add yaml option to the help output.
+
+
+2021-10-21 Kohei Yoshida <kohei.yoshida@gmail.com> [3d0870372835a6d3f44fbcf515f70dc17c9c49d6]
+
+ Update slickedit project.
+
+
+2021-10-21 Kohei Yoshida <kohei.yoshida@gmail.com> [d560ef1fe0cfb756494a4b8ba4c026900522ca3d]
+
+ I forgot to add this file...
+
+
+2021-10-21 Kohei Yoshida <kohei.yoshida@gmail.com> [d1e748055b7281e3f98fdefbaaac2b92e303acfc]
+
+ Add more yaml output controls.
+
+
+2021-10-21 Kohei Yoshida <kohei.yoshida@gmail.com> [6c289a932d6dadbc2f8e0c769bed82a6ce3b96c0]
+
+ Turn test_global.cpp into a static lib and reference it as a lib.
+
+ This way we can avoid the possible forward imcompatibility warning of
+ automake.
+
+2021-10-21 Kohei Yoshida <kohei.yoshida@gmail.com> [43414037943bae59b87104b132a7db5c4f0b7187]
+
+ Set up a framework to test json doc tree against yaml output.
+
+
+2021-10-21 Kohei Yoshida <kohei.yoshida@gmail.com> [2a0820846a0d3b2d8e7787e44b1abe36dd22f80f]
+
+ Use boost::filesystem instead of string to handle file paths.
+
+
+2021-10-21 Kohei Yoshida <kohei.yoshida@gmail.com> [bbde1e1636d3971e53498b6fefd8bd929f937fcd]
+
+ Remove using namespace std.
+
+
+2021-10-21 Kohei Yoshida <kohei.yoshida@gmail.com> [0beb5b4bbd5092fe3e2e8748423c7e28f205fa5b]
+
+ Don't start with a line break at root scope.
+
+
+2021-10-21 Kohei Yoshida <kohei.yoshida@gmail.com> [fe1b2e9f47b66129b51b9d874204d82d7a1e6a0f]
+
+ Re-use the "bullet" line in case the parent is an array.
+
+ Instead of writing
+
+ -
+ key: value
+ key: value
+
+ write
+
+ - key: value
+ key: value
+
+2021-10-21 Kohei Yoshida <kohei.yoshida@gmail.com> [2004de9a27812913dd65b5a097d6bcb992feaef8]
+
+ Put string value in quotes if it contains '#'.
+
+
+2021-10-21 Kohei Yoshida <kohei.yoshida@gmail.com> [8ce9bdfa63e730be6c8735883dc868f9f431a71e]
+
+ Dump all json value types in yaml output.
+
+
+2021-10-21 Kohei Yoshida <kohei.yoshida@gmail.com> [ad88468b7bf0c8862596313e7da49ca44f2c006d]
+
+ Set up 'yaml' output type for orcus-json with minimal dump function.
+
+ No support for nested structures just yet.
+
+2021-10-20 Kohei Yoshida <kohei.yoshida@gmail.com> [4e08ce88c4e9de5da6a6e8ffcb251f10cff4e103]
+
+ Only remove the binaries, not the .run script files.
+
+ This should fix #141.
+
+2021-10-13 Kohei Yoshida <kohei.yoshida@gmail.com> [8fea3b3e0811891411b1ba66eb9e710f08de92ef]
+
+ Set the doc version to 0.17.
+
+
+2021-10-13 Kohei Yoshida <kohei.yoshida@gmail.com> [2d153266322a7be339510344ced901f2bd0bfec1]
+
+ Use literalinclude for the JSON code examples.
+
+
+2021-10-13 Kohei Yoshida <kohei.yoshida@gmail.com> [eee97476db14336e6a951d8076276f7a36e091b7]
+
+ Use literalinclude for the rest of the section.
+
+
+2021-10-13 Kohei Yoshida <kohei.yoshida@gmail.com> [07430422d3d7b08087567f5de1f4e5d9643642eb]
+
+ Use literalinclude for the shared strings code examples.
+
+
+2021-10-12 Kohei Yoshida <kohei.yoshida@gmail.com> [9126f3d82cf3b967d44928d940ccbb402ffb13d9]
+
+ Add a sentence about 'ss' namespace alias.
+
+
+2021-10-12 Kohei Yoshida <kohei.yoshida@gmail.com> [7e08e346391d66c79650ae4f0f89f8671f46568c]
+
+ Use literalinclude for example code blocks with no string pool.
+
+
+2021-10-12 Kohei Yoshida <kohei.yoshida@gmail.com> [359f115f6b1fc12418d92c59cb1318dfe51b20b7]
+
+ Adjust the example code to remove using namespace.
+
+ Also switch them to using INPUTDIR env var.
+
+2021-10-12 Kohei Yoshida <kohei.yoshida@gmail.com> [1b879d08c1ea47b38f6f3aad91c35d18a4274c7e]
+
+ Convert the first code example of user-defined custom doc class section.
+
+
+2021-10-11 Kohei Yoshida <kohei.yoshida@gmail.com> [9a31d12063773a0e210e44e150e2ab150c060df0]
+
+ Also cover the rest of the example code on the same page.
+
+
+2021-10-11 Kohei Yoshida <kohei.yoshida@gmail.com> [2b054671e1390dcea30f6fa58f7671a77a1b06b9]
+
+ Directly in clude example code verbatim from the source file.
+
+ Also change how the input file path gets passed to the code, to make
+ it look more presentable.
+
+2021-10-08 Kohei Yoshida <kohei.yoshida@gmail.com> [e4c221827177c8ac3c96a41633d459eec314365b]
+
+ Remove warnings in sphinx doc.
+
+
+2021-10-07 Kohei Yoshida <kohei.yoshida@gmail.com> [e54ddafc4b73876d1238bf05f1ccfe2cc1d9c509]
+
+ Move encryption_info.hpp header out of public location.
+
+
+2021-10-07 Kohei Yoshida <kohei.yoshida@gmail.com> [e50c2fbe6281b7091a68a21083796a6fe41703f7]
+
+ file_content interface to use std::string_view.
+
+
+2021-10-07 Kohei Yoshida <kohei.yoshida@gmail.com> [1c5951dd3160d05157947e8c19d87b4206fdb5d9]
+
+ memory_content to use std::string_view.
+
+
+2021-10-07 Kohei Yoshida <kohei.yoshida@gmail.com> [0956260f9de0024e2d19296a24e6f8b68fbf6bb9]
+
+ Modernize import_xlsx.
+
+
+2021-10-07 Kohei Yoshida <kohei.yoshida@gmail.com> [d2b4288d43f60d4ccaa0a8f8d1aea3e99c9aad81]
+
+ Modernize import_ods.
+
+
+2021-10-07 Kohei Yoshida <kohei.yoshida@gmail.com> [885fbc68afca4f2eacd72a5ad6d51681d18b7865]
+
+ append_record_value_character() to take std::string_view.
+
+
+2021-10-07 Kohei Yoshida <kohei.yoshida@gmail.com> [51689c75cec0390b1535c2a8e8a4a2021a96fc10]
+
+ Modernize orcus_gnumeric interface a bit.
+
+
+2021-10-07 Kohei Yoshida <kohei.yoshida@gmail.com> [440924bbb22e6570e2c6cfe73c997702cf0eb4b0]
+
+ yaml::document_tree::load() to take std::string_view.
+
+
+2021-10-07 Kohei Yoshida <kohei.yoshida@gmail.com> [87b6a531a4c63917c310e8d7f7916d871325f70b]
+
+ xml_structure_tree::parse() to take std::string_view.
+
+
+2021-10-06 Kohei Yoshida <kohei.yoshida@gmail.com> [d7d6dad1d555f1482e9d2148cb52c5399fd0c595]
+
+ Clean up orcus_csv public interfaces.
+
+
+2021-10-06 Kohei Yoshida <kohei.yoshida@gmail.com> [b7ee2361d75ff2f2c21b9dfba720d3791d67a757]
+
+ const char* to std::string_view in orcus_xml public interfaces.
+
+
+2021-10-06 Kohei Yoshida <kohei.yoshida@gmail.com> [cfd3b3977a225833e175a134bde0cf53e9e4f327]
+
+ Clean up to_double() and to_long() functions.
+
+
+2021-10-06 Kohei Yoshida <kohei.yoshida@gmail.com> [09694ac4a3942082ad7672a371477f55e38f6f0b]
+
+ const char* to std::string_view in pivot cache related interfaces.
+
+
+2021-10-05 Kohei Yoshida <kohei.yoshida@gmail.com> [a110e4ddf6f351e9b618cdf49318330229302776]
+
+ std::string_view in import_factory.
+
+
+2021-10-05 Kohei Yoshida <kohei.yoshida@gmail.com> [95f5ecadf39e4000bdce16a8ad821d3580682d08]
+
+ std::string_view in import_reference_resolver.
+
+
+2021-10-05 Kohei Yoshida <kohei.yoshida@gmail.com> [5ecbd244cb7748d072475235d1a14060f0ea04dd]
+
+ std::string_view in import_formula and import_array_formula.
+
+
+2021-10-05 Kohei Yoshida <kohei.yoshida@gmail.com> [3e7f822096a224f0678227528710f5418903de8c]
+
+ std::string_view in import_table.
+
+
+2021-10-05 Kohei Yoshida <kohei.yoshida@gmail.com> [3ce9753754f82544099573c0cff21703401bc3a0]
+
+ std::string_view in import_conditional_format.
+
+
+2021-10-05 Kohei Yoshida <kohei.yoshida@gmail.com> [18fd94351da32e9a92cca0ec008ce08f088fe4b6]
+
+ std::string_view in import_auto_filter.
+
+
+2021-10-05 Kohei Yoshida <kohei.yoshida@gmail.com> [5e6d061d4648addb046988d04b0b6225925927dc]
+
+ std::string_view in import_data_table.
+
+
+2021-10-05 Kohei Yoshida <kohei.yoshida@gmail.com> [1e5d163240120956441885d70d805c0d50a87010]
+
+ std::string_view in import_named_expression.
+
+
+2021-10-04 Kohei Yoshida <kohei.yoshida@gmail.com> [935ecdd79004fad3a37be02062446131b65d7bb4]
+
+ import_styles interface to all use std::string_view.
+
+
+2021-10-04 Kohei Yoshida <kohei.yoshida@gmail.com> [8d2a4c23579a79993032d8e92e59f54a652a1429]
+
+ set_auto() to take std::string_view.
+
+
+2021-10-04 Kohei Yoshida <kohei.yoshida@gmail.com> [1402bb2778c0a0261bd4c6aca03af643270ccf88]
+
+ More on replacing const char* to std::string_view.
+
+
+2021-10-01 Kohei Yoshida <kohei.yoshida@gmail.com> [76a5cab6165c5671ee898653761f3993a5a2ed52]
+
+ const char* -> std::string_view in import_shared_strings.
+
+
+2021-10-01 Kohei Yoshida <kohei.yoshida@gmail.com> [b9e191c2cbd181874b59d92419e6b32eb4019380]
+
+ const char* -> std::string_view in spreadsheet/types.hpp
+
+
+2021-10-01 Kohei Yoshida <kohei.yoshida@gmail.com> [b8f5295e2e1ec7891dbb9ec8c7086cd5c0da1fee]
+
+ Remove variant of string_pool::intern() that takes const char*.
+
+
+2021-10-01 Kohei Yoshida <kohei.yoshida@gmail.com> [5f2add13301828fe71d15f88b9fcfa486ddee5d0]
+
+ to_dump_format_enum() to take string_view.
+
+
+2021-10-01 Kohei Yoshida <kohei.yoshida@gmail.com> [e65c9049cddadc81935ef976a3521e2f9744bb64]
+
+ export_factory::get_sheet() to take std::string_view.
+
+
+2021-10-01 Kohei Yoshida <kohei.yoshida@gmail.com> [ec5d6089fd21e0bde1fd9b9b191dd8b17773b9cb]
+
+ import_filter::get_name() to return std::string_view.
+
+
+2021-09-30 Kohei Yoshida <kohei.yoshida@gmail.com> [fa89b49601118f861d549c68f285d82563fc3ab5]
+
+ read_stream() to take std::string_view.
+
+
+2021-09-30 Kohei Yoshida <kohei.yoshida@gmail.com> [f90e11fc0bc60ed678e69fe73febdb6f125a605a]
+
+ css::to_property_function() to take std::string_view.
+
+
+2021-09-30 Kohei Yoshida <kohei.yoshida@gmail.com> [a1b4e10d37d38f226f133b780380a7343b75c897]
+
+ css_document_tree::load() to take std::string_view.
+
+
+2021-09-30 Kohei Yoshida <kohei.yoshida@gmail.com> [849eb511d8a465ffb47ba95adabba7c6037eaa93]
+
+ Revise base64 API for modern C++.
+
+
+2021-09-29 Kohei Yoshida <kohei.yoshida@gmail.com> [a15b69876ece2ed27ac15c595efb364c8ecefd5a]
+
+ This can be const ref.
+
+
+2021-09-29 Kohei Yoshida <kohei.yoshida@gmail.com> [b12549df863200a2ef744ed276c50f22bdc05c8a]
+
+ Use ranged for loop in lieu of std::for_each.
+
+
+2021-09-29 Kohei Yoshida <kohei.yoshida@gmail.com> [17937696ba483e8137dd9fc685c055c927ba9f96]
+
+ Remove union from config and replace it with std::variant.
+
+ This is the last union keyword in the public headers.
+
+2021-09-29 Kohei Yoshida <kohei.yoshida@gmail.com> [9ce833e58cb8f76f862b5d47099637ddbc761a7e]
+
+ Replace union with std::variant in css_selector.hpp.
+
+
+2021-09-29 Kohei Yoshida <kohei.yoshida@gmail.com> [3c99831d84050adeb65f5a9aa5eb201b1f8fa85c]
+
+ Replace union with std::variant in sax_token_parser_thread.hpp.
+
+
+2021-09-29 Kohei Yoshida <kohei.yoshida@gmail.com> [911024d78e39aacf406fde7aecb75052cb8222d1]
+
+ Fix the normal 'make' build. 'make check' worked fine.
+
+
+2021-09-29 Kohei Yoshida <kohei.yoshida@gmail.com> [bf96563697ec404407354e51a74e9ea66a64cef1]
+
+ Replace union with std::variant in parse_token type.
+
+
+2021-09-29 Kohei Yoshida <kohei.yoshida@gmail.com> [7aa37823da7464676a9a616614bf8f1a6feb21f9]
+
+ Replace union with std::variant in pivot.hpp.
+
+
+2021-09-28 Kohei Yoshida <kohei.yoshida@gmail.com> [7a1fcf7d70b16fc61054d61d5c06dfb29f271bce]
+
+ Move pstring.hpp header into a "private" location to hide it.
+
+
+2021-09-28 Kohei Yoshida <kohei.yoshida@gmail.com> [a226511eaa6692e807f2cfa1a5262f1ca9e5a682]
+
+ Remove pstring from document.hpp.
+
+ I believe this is the last public header with pstring.
+
+2021-09-28 Kohei Yoshida <kohei.yoshida@gmail.com> [283bc8183a2c7ed7bc986c04d7ffa25396187874]
+
+ Remove pstring from shared_strings.hpp.
+
+
+2021-09-28 Kohei Yoshida <kohei.yoshida@gmail.com> [7c9735f905ccff99161f6ab717662e3d43cb5500]
+
+ Remove pstring from pivot.hpp.
+
+
+2021-09-28 Kohei Yoshida <kohei.yoshida@gmail.com> [7cb8c3ccb37f2681b7f9c1127b7ed64f8f77c444]
+
+ Remove pstring from sheet.hpp.
+
+
+2021-09-28 Kohei Yoshida <kohei.yoshida@gmail.com> [d370f7f3bfc9136c375b62b531718f3bd5b10922]
+
+ Remove pstring from styles.hpp.
+
+
+2021-09-28 Kohei Yoshida <kohei.yoshida@gmail.com> [71d1a54eefa2ad4de075f89434311c777bab1610]
+
+ Remove pstring from auto_filter.hpp.
+
+
+2021-09-28 Kohei Yoshida <kohei.yoshida@gmail.com> [6f6eb66631250ebbc3c513b65355a134ba182a94]
+
+ Remove pstring from the rest of the sax_parser header files.
+
+
+2021-09-28 Kohei Yoshida <kohei.yoshida@gmail.com> [549ad4578712b046bbcbcd9e97ffbf95235f2a55]
+
+ Remove pstring from sax_ns_parser.hpp.
+
+
+2021-09-28 Kohei Yoshida <kohei.yoshida@gmail.com> [9d8e89ca2f9163c18d20034ae56f3654fe53a7c9]
+
+ Remove pstring from sax_parser_base.hpp and sax_parser.hpp.
+
+
+2021-09-28 Kohei Yoshida <kohei.yoshida@gmail.com> [6ce754fd138b5f9ce4b096cbde5c493b97f6449b]
+
+ Remove pstring from orcus_json.hpp and orcus_xml.hpp.
+
+
+2021-09-27 Kohei Yoshida <kohei.yoshida@gmail.com> [1a8356b503a3baa849263705ec1da0d462d6425a]
+
+ Remove pstring from xml_namespace.*.
+
+
+2021-09-27 Kohei Yoshida <kohei.yoshida@gmail.com> [e6fd7523271ad5df658b33831f6639691eeca376]
+
+ Remove pstring from xml_structure_tree.hpp.
+
+
+2021-09-27 Kohei Yoshida <kohei.yoshida@gmail.com> [12de6277cd582527073e0b48b1aa37e72acf1172]
+
+ Remove pstring from types.hpp, and fix an avalanche of compilation issues.
+
+
+2021-09-27 Kohei Yoshida <kohei.yoshida@gmail.com> [d6246f2731d7021c6f7140b6a95d0f0e4dbc886f]
+
+ Remove pstring from tokens.hpp.
+
+
+2021-09-25 Kohei Yoshida <kohei.yoshida@gmail.com> [a3bf970fed8375e30b748b5318cc3ba2b6f46b84]
+
+ Fix the benchmark code build.
+
+
+2021-09-25 Kohei Yoshida <kohei.yoshida@gmail.com> [2014c90a827b6a49f185815cd8c2165f01183d2f]
+
+ pstring to std::string_view in stream.*.
+
+
+2021-09-25 Kohei Yoshida <kohei.yoshida@gmail.com> [121f305f151cf7de01254e1aa281a01889cedff1]
+
+ Replace pstring with std::string_view in the yaml parser code.
+
+
+2021-09-25 Kohei Yoshida <kohei.yoshida@gmail.com> [52f2e13cf005cfc41b7cfd2ca36e6528af9cf743]
+
+ Fix build on linux.
+
+
+2021-09-25 Kohei Yoshida <kohei.yoshida@gmail.com> [5509c51a0950a2e705a2c2aa419868302c1f26f9]
+
+ Some header include cleaning.
+
+
+2021-09-25 Kohei Yoshida <kohei.yoshida@gmail.com> [774581ccb94b2be5f59e9847c96aabb7a66c8ac2]
+
+ Fix assertions.
+
+
+2021-09-25 Kohei Yoshida <kohei.yoshida@gmail.com> [792fcff84e106cccaa739183e41e044bde576013]
+
+ Remove pstring from measurement.*, and fix one test failure vs string_pool.
+
+
+2021-09-25 Kohei Yoshida <kohei.yoshida@gmail.com> [cc469682e3534644d08615d3b877a06a36436292]
+
+ The intern(const char* str) variant is not needed.
+
+ const char* can decay to std::string_view.
+
+2021-09-25 Kohei Yoshida <kohei.yoshida@gmail.com> [134be911681fb2f725b4fe61cd92ec1c57fb193d]
+
+ Remove pstring from string_pool.*.
+
+
+2021-09-25 Kohei Yoshida <kohei.yoshida@gmail.com> [3292dd91152ed05465946d8eac66813586752f53]
+
+ Remove pstring from json_document_tree.*.
+
+
+2021-09-25 Kohei Yoshida <kohei.yoshida@gmail.com> [c3570e65ad5c0342f7c41f06b509e4c859fd72f0]
+
+ Remove pstring from zip_archive.* & remove 'using namespace std'.
+
+
+2021-09-25 Kohei Yoshida <kohei.yoshida@gmail.com> [2b42d04b1a1a3dff0e53cc5fa5530571f16f7953]
+
+ Remove cmake warning.
+
+ Here is the exact output of the warning:
+
+ CMake Warning (dev) at C:/Program Files/CMake/share/cmake-3.21/Modules/FindPackageHandleStandardArgs.cmake:438 (message):
+ The package name passed to `find_package_handle_standard_args` (ZLIB) does
+ not match the name of the calling package (Zlib). This can lead to
+ problems in calling code that expects `find_package` result variables
+ (e.g., `_FOUND`) to follow a certain pattern.
+
+2021-09-24 Kohei Yoshida <kohei.yoshida@gmail.com> [fcbd0662c1d327bcaf8c37a2d791bc643e3fd351]
+
+ Remove string_view from global.hpp.
+
+
+2021-09-24 Kohei Yoshida <kohei.yoshida@gmail.com> [7fb3d5a9f41151927c494b7d90f9b4d82bfada31]
+
+ Remove pstring from dom_tree.hpp.
+
+
+2021-09-24 Kohei Yoshida <kohei.yoshida@gmail.com> [f53fc08354460ecac2dab02ffb8f1bf44f6a7bcd]
+
+ Replace pstring with std::string_view in css_selector.hpp.
+
+
+2021-09-24 Kohei Yoshida <kohei.yoshida@gmail.com> [2c354577a9db254c8f3a0c1e887c89de28b0481e]
+
+ Use std::string_view in functions in css_types.hpp.
+
+
+2021-09-23 Kohei Yoshida <kohei.yoshida@gmail.com> [402be06d1ec3d7e86590eda34af17444b5c9c33e]
+
+ Adjust to API changes in ixion.
+
+
+2021-09-09 Kohei Yoshida <kohei.yoshida@gmail.com> [81603a5a904cbbb58109876f31852db680edf36a]
+
+ Use 32-bit unsigned integer as string ID's as opposed to size_t.
+
+ This reflects the recent similar change in ixion.
+
+2021-08-28 Kohei Yoshida <kohei.yoshida@gmail.com> [171731d01b9cb04a5594d8b9a5f00fc4bbef99b4]
+
+ Query _M_IX86_FP preprocessor macro from MSVC.
+
+
+2021-08-14 Kohei Yoshida <kohei.yoshida@gmail.com> [50439b35284c02223007ecc57b0ca92845982135]
+
+ Remove doxygen warnings.
+
+
+2021-08-14 Kohei Yoshida <kohei.yoshida@gmail.com> [5789bfbd386d2c68a05c1810cfc68eca909a94b1]
+
+ Silence warning about deprecated <codecvt>.
+
+ According to
+
+ https://stackoverflow.com/questions/42946335/deprecated-header-codecvt-replacement
+
+ There is currently no alternatives to this deprecated functionality.
+
+2021-08-14 Kohei Yoshida <kohei.yoshida@gmail.com> [de4a36fbcae53348448c0edcccbfc4da1e949314]
+
+ We no longer need this workaround for MSVC as of VS 2019.
+
+
+2021-08-13 Kohei Yoshida <kohei.yoshida@gmail.com> [613072affe9a9fabda8a06111470dec969be06e7]
+
+ Add sphinx-argparse as a requirement in conda.
+
+
+2021-08-13 Kohei Yoshida <kohei.yoshida@gmail.com> [281b8235a69601d94d3620f7bcbfc364470e40a0]
+
+ Update the doc build settings for readthedocs.io.
+
+
+2021-08-12 Kohei Yoshida <kohei.yoshida@gmail.com> [1811332d3859d2b317292bbaff2dfed3cf3fcd54]
+
+ Fix the 'check' target with cmake build.
+
+
+2021-05-13 Kohei Yoshida <kohei.yoshida@gmail.com> [b2abd2359fd054de60ada09e04a3b0a0eace810f]
+
+ Add #137.
+
+
+2021-05-13 Kohei Yoshida <kohei.yoshida@gmail.com> [9a0da92c9fb9d910f2024b3d3aa312d8be783f4e]
+
+ Add negative test cases, and fix one byte mis-handling.
+
+
+2021-05-13 Kohei Yoshida <kohei.yoshida@gmail.com> [9cd8c3419e45798b1e2c272c17a595fe68fb2a7e]
+
+ I don't need this note.
+
+
+2021-05-13 Kohei Yoshida <kohei.yoshida@gmail.com> [d376c74042c232bfe7d67f1e009b36f9c6358745]
+
+ Fix CI build.
+
+
+2021-05-13 Kohei Yoshida <kohei.yoshida@gmail.com> [e9ca232de45e992fd4c8b3a37299647948fe188d]
+
+ Re-structure the utf-8 parsing code for better clarity.
+
+ Also fix the remaining byte check as well as two failing ranges.
+
+2021-05-10 Kohei Yoshida <kohei.yoshida@gmail.com> [8735a55dbfe3f55919677db5eb5a0a98dc3e2cfe]
+
+ Add a function to encode code points to utf-8, and use it in tests.
+
+ Two code-point ranges still fail.
+
+2021-05-10 Kohei Yoshida <kohei.yoshida@gmail.com> [1067b1451b57b13dca0bb6c6138104247745432a]
+
+ Add positive tests for 3-byte ranges.
+
+ But I now realize that this approach is flawed.
+
+2021-05-08 Kohei Yoshida <kohei.yoshida@gmail.com> [96db3c5f8f5d32655b49690db056028ca55be9d0]
+
+ Let's use a regular array.
+
+
+2021-05-08 Kohei Yoshida <kohei.yoshida@gmail.com> [20df6bc9c5b2c06a1550d848114de4f493ea0e3c]
+
+ Add positive tests for 2-char ranges.
+
+
+2021-05-07 Kohei Yoshida <kohei.yoshida@gmail.com> [1d4092972d6f30b06da2a64f8c5f4f3c2534a79f]
+
+ Clean up a bit.
+
+
+2021-05-07 Kohei Yoshida <kohei.yoshida@gmail.com> [4e3af4f6e2e75c046d5d607c3281ee5c576c9cb1]
+
+ Move the utf8 parsing helper code into separate sources...
+
+ ... and set up a test harness for it.
+
+2021-05-04 Luboš Luňák <l.lunak@centrum.cz> [2c2215e94bd8fce4b9a93e986339aa6ae06d2cba]
+
+ allow utf-8 in xml names (#137)
+
+ https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-NameStartChar
+ has a list of all allowed characters.
+
+2021-05-04 Kohei Yoshida <kohei.yoshida@gmail.com> [3e1f42aa1ad4c4bb53cb87a94e791da874bd33a4]
+
+ Use gfortran-9.
+
+
+2021-05-02 David Tardon <dtardon@redhat.com> [34f93cdc383432aeb34c31184de8a2fb5940e0c7]
+
+ make FormatType conversion work with python 3.10
+
+ The str() function for Enum returns only the member name since 3.10:
+ https://docs.python.org/3.10/whatsnew/3.10.html#enum
+ Let's just check separately the enum type name and the member name.
+
+2021-05-02 David Tardon <dtardon@redhat.com> [87c29eaa90f1aaf769f0f1d1baee5a91e4e83596]
+
+ replace hand-written search by STL algorithm
+
+
+2021-05-02 David Tardon <dtardon@redhat.com> [022612302c5bc302e14570424dfa7602d3dada39]
+
+ impl. operator+ in terms of operator+=
+
+
+2021-05-02 David Tardon <dtardon@redhat.com> [3ea647aa76a8e9699ba6d8733137dc4059b41220]
+
+ use std::string::append
+
+
+2021-05-02 David Tardon <dtardon@redhat.com> [68fb35a4bac3d760a0a74ea7c61735f8c13ee0dc]
+
+ use std::lexicographical_compare to impl. operator<
+
+ The algorithm exists for this very purpose.
+
+2021-05-02 David Tardon <dtardon@redhat.com> [a09bb35b3195c2a0cdf5e5d4b699513e0c72026e]
+
+ replace hand-written string comparison by std::equal
+
+
+2021-05-02 David Tardon <dtardon@redhat.com> [eda22698961fd1c5325ae0a5ec098a4d9907db02]
+
+ replace a string literal by a constant
+
+ This fixes test_module.py test with debug build with gcc 11. It "works"
+ with optimized builds because the compiler apparently deduplicates the
+ string literals...
+
+2021-05-01 David Tardon <dtardon@redhat.com> [ba3d345fda0bf3f25b25b2d3723e93e49682c59d]
+
+ catch exception by reference
+
+
+2021-02-09 Kohei Yoshida <kohei.yoshida@gmail.com> [9c63f274506d70bdf92334670071756ebea4042a]
+
+ Add assignment operators and swap method to xmlns_context.
+
+ Also write test cases for them.
+
+2021-02-09 Kohei Yoshida <kohei.yoshida@gmail.com> [0795a085f0181d8ea5d6e73ab43442a64e3e7402]
+
+ Fix shadowed declaration of 'repo'.
+
+
+2021-02-09 Kohei Yoshida <kohei.yoshida@gmail.com> [b62b4eb179f4d415eb8bcbd4d43f78442e11f926]
+
+ Make xmlns_context moveable & add a default constructor to it.
+
+ This fixes a build error with VS 2017.
+
+2021-02-08 Kohei Yoshida <kohei.yoshida@gmail.com> [49764a9dc4b3cd03ff5bce149a7d3858972e0e0b]
+
+ Let's not move the loaded_tree instances...
+
+ I don't think xmlns_context is movable in its current state. Let's
+ make that explicit.
+
+2021-02-08 Kohei Yoshida <kohei.yoshida@gmail.com> [563a86575d452f5c1331366fdd2ec797b5e624c0]
+
+ Prefix string literals with u8 to ensure they get parsed as utf-8.
+
+ Otherwise the literals use the implementation's character set, which
+ in my Windows environment appears to be Windows-1252.
+
+2021-02-08 Kohei Yoshida <kohei.yoshida@gmail.com> [14a6c973c0d477ab4706084527d6de9d6c52b340]
+
+ get_short_name(...) returns std::string. Let's not receive it with pstring
+
+ Doing so apparently caused string buffer corruption which for some reason
+ only manifested itself in the debug build with MSVC.
+
+ This fixes #136.
+
+2021-02-06 Kohei Yoshida <kohei.yoshida@gmail.com> [3713d0f8a522ae32a4a8d56a6a838407ed544dec]
+
+ Update the CHANGELOG about the crasher fix.
+
+
+2021-02-06 Kohei Yoshida <kohei.yoshida@gmail.com> [292b090ae2df166d1ab3275c91fd99e710091951]
+
+ Ensure that the output stream object gets moved when the cmd_params...
+
+ ... object moves.
+
+2021-02-05 Kohei Yoshida <kohei.yoshida@gmail.com> [c028c815d5b24990eee996dc85df04df35db93e6]
+
+ Fix CMake build with VS 2017.
+
+
+2021-01-10 Kohei Yoshida <kohei.yoshida@gmail.com> [3364eb5553960046d2aeebb7794084b60b3f1e42]
+
+ Draw table borders in light gray color.
+
+
+2021-01-10 Kohei Yoshida <kohei.yoshida@gmail.com> [1d8c62c8a028bc9c7db385b18802e84d12786123]
+
+ Fix the rendering of neighboring merged cells (#133)
+
+
+2021-01-10 Kohei Yoshida <kohei.yoshida@gmail.com> [25413a7250c9fad9a856a61e3d767c9de778f14c]
+
+ Fix the test cases that had been broken by the addition of ...
+
+ ... the merged cell info in the check.txt files.
+
+2021-01-10 Kohei Yoshida <kohei.yoshida@gmail.com> [f344546b71e8d8c6666c47dd4bf5b686c38ac37f]
+
+ Include merged cell information when dumping the doc in check mode.
+
+ This temporarily breaks some test cases due to extra information
+ generated.
+
+2021-01-10 Kohei Yoshida <kohei.yoshida@gmail.com> [dd9ab0d73f07daf01e580b1f11fb4c712114d0bc]
+
+ Move the dumper code for 'check' format out into its own files.
+
+ Als move the sheet_impl code into a separate set of files to allow
+ access to it from check_dumper (and potentially other dumper classes
+ in the future).
+
+2021-01-09 Kohei Yoshida <kohei.yoshida@gmail.com> [3d2ab5fb76c1ce7aaa9d6cf957f6075cea6b1f6b]
+
+ Use range-based for loop over std::for_each.
+
+
+2021-01-08 hedmo <hedmoo@yahoo.com> [5e8fb255dc6bc9b7084a05b8dc24f31417542e5e]
+
+ Update xlsx_revision_context.cpp to build with gcc-11
+
+
+2021-01-08 hedmo <hedmoo@yahoo.com> [3bfa1a000e4639fe68781c584356ceea7c6b1a72]
+
+ Update xls_xml_context.cpp to build with gcc-11
+
+
+2021-01-08 hedmo <hedmoo@yahoo.com> [50506d534230d90de2b0a2af3fb072428c942a4e]
+
+ Update orcus_xlsx.cpp to build with gcc-11
+
+
+2021-01-08 Kohei Yoshida <kohei.yoshida@gmail.com> [2af5e916889896676f3cfda10e0f905f4dc8adc5]
+
+ Insert a blank line to prevent the line above from being bolded ...
+
+ ... when converted to rst.
+
+2021-01-08 Kohei Yoshida <kohei.yoshida@gmail.com> [83138a49e98aa26ea2b612661f66b7b40ee00c01]
+
+ Write a script to parse and convert program-options' help output ...
+
+ ... to rst format, and update the CLI docs.
+
+2021-01-08 Kohei Yoshida <kohei.yoshida@gmail.com> [2177a5d4a7f16b44a71b18238fc4c25658e576ec]
+
+ Add bits about how the features are exposed.
+
+
+2021-01-08 Kohei Yoshida <kohei.yoshida@gmail.com> [8bd4c97bb9de15abe555c12a33d5478dc21f957d]
+
+ Rework the wording of the overview section a bit.
+
+
+2021-01-07 Kohei Yoshida <kohei.yoshida@gmail.com> [484ae086201eaefc95ac82c4a8a198596301613d]
+
+ Add a new test case for handling formulas with string results.
+
+ Cover both recalc and non-recalc scenarios. (#134)
+
+2021-01-07 Kohei Yoshida <kohei.yoshida@gmail.com> [3f6af4b3db3435ce9baf72dd0a3bec13d8caf24a]
+
+ Handle cached string formula results properly.
+
+ This change also changes the interface related to setting cached
+ string formula values. This reflects the recent change in ixion to
+ store the string buffers directly with the formulas.
+
+ This is related to #134.
+
+2021-01-06 Kohei Yoshida <kohei.yoshida@gmail.com> [081f6b0862d71753e839bd5cad9e2ecdaae98c72]
+
+ Pick up and store cached formula results for array formulas.
+
+ Numeric and boolean values only for now. Boolean values are not yet
+ tested. Related to #134.
+
+2021-01-06 Kohei Yoshida <kohei.yoshida@gmail.com> [d37539c2edc07316b8a1e99aff71238d3df7e12b]
+
+ Add a test input file containing formula cells with string results.
+
+
+2021-01-06 Kohei Yoshida <kohei.yoshida@gmail.com> [697cf113cd11fd2d89cb397f6b334380957794ee]
+
+ Add a test case for loading cached results for numeric shared formulas.
+
+
+2021-01-06 Kohei Yoshida <kohei.yoshida@gmail.com> [574f35eea7a6744814377079fb5c3db45c0cf26a]
+
+ Pick up and store numeric formula results for shared formulas.
+
+ Also related to #134.
+
+2020-12-19 Kohei Yoshida <kohei.yoshida@gmail.com> [2ccb6c3d9e21bec02fd4589e4f8f07bd1d4ab51b]
+
+ Add a test case for xlsx loading with no recalculation on load.
+
+
+2020-12-19 Kohei Yoshida <kohei.yoshida@gmail.com> [7a56b9ec3f3add03040157d8735e7f80966ff830]
+
+ Pick up and store numeric formula results for non-shared formulas.
+
+ Related to #134.
+
+2020-12-19 Kohei Yoshida <kohei.yoshida@gmail.com> [d17b3990834039bf946b1631428f5db9649eb48d]
+
+ Add test case for unprefixed attribute NOT belonging to default ...
+
+ ... namespace like unprefixed elements would. For more info, see
+
+ https://stackoverflow.com/questions/3312390/xml-default-namespaces-for-unqualified-attribute-names
+
+2020-12-19 Kohei Yoshida <kohei.yoshida@gmail.com> [5808158d908d77ccd5ae609455ed140092f273dd]
+
+ Use address resolver to resolve cell addresses.
+
+
+2020-12-19 Kohei Yoshida <kohei.yoshida@gmail.com> [7c248da75dca856c1e38bbff07f51fddcca5d1e2]
+
+ Remove cell_attr_parser in favor of ranged for loop.
+
+
+2020-12-19 Kohei Yoshida <kohei.yoshida@gmail.com> [b14610aa5a7157c87c90cae5b08e28f4c5a62c3f]
+
+ Move the cell element start code into its own method.
+
+
+2020-10-27 Kohei Yoshida <kohei.yoshida@gmail.com> [34865af2e65021dbc6f0b2f871f1adb3f6a4b592]
+
+ Talk about mapping with map file.
+
+ This concludes this tutorial.
+
+2020-10-27 Kohei Yoshida <kohei.yoshida@gmail.com> [c0174a842380185a607443663172f4ebc9886b0f]
+
+ Don't forget to set the row-header param to true.
+
+
+2020-10-27 Kohei Yoshida <kohei.yoshida@gmail.com> [ddb1d069f06bdf3a2ee067e730f3d6606795bacf]
+
+ Let's not print the detected mapping rules.
+
+
+2020-10-27 Kohei Yoshida <kohei.yoshida@gmail.com> [fcd740e9b5578c760467848d31b7013e0b0bca77]
+
+ Talk about json auto-mapping.
+
+
+2020-10-27 Kohei Yoshida <kohei.yoshida@gmail.com> [a34ed48e63eab4ae1eca75fe6164c8ed99b1178d]
+
+ Add more files to ignore.
+
+
+2020-10-27 Kohei Yoshida <kohei.yoshida@gmail.com> [f4d83cfeb91b5f088bd872f7d84528cbbbaad105]
+
+ Create a new page for JSON mapping, and talk about analyzing ...
+
+ ... the structure of JSON document.
+
+2020-10-21 Kohei Yoshida <kohei.yoshida@gmail.com> [3be6b814a44067ff7321ac0dc2ccfae08fa1fbd2]
+
+ Go over the map file structure and run the command again.
+
+
+2020-10-21 Kohei Yoshida <kohei.yoshida@gmail.com> [de136ea8e1181985b3572b6f2e9833329a6ad8ca]
+
+ Talk about map file generation.
+
+
+2020-10-21 Kohei Yoshida <kohei.yoshida@gmail.com> [7ce2045c83fe1546feda6cfbd057975b1853221c]
+
+ Use a more specific xmlns value for xml map files.
+
+
+2020-10-21 Kohei Yoshida <kohei.yoshida@gmail.com> [6341f2a3019488b7af5f08f2856cc0de6d7014ec]
+
+ Also make sure the map file exists if it's specified.
+
+
+2020-10-21 Kohei Yoshida <kohei.yoshida@gmail.com> [b5d4387808201cccc015de54b26573c293927165]
+
+ Make sure not to let exception leak when the input file is not there.
+
+
+2020-10-20 Kohei Yoshida <kohei.yoshida@gmail.com> [59f182c5426c43f5e9c5799462b1eaa186e8dae7]
+
+ Add auto-mapping section.
+
+
+2020-10-20 Kohei Yoshida <kohei.yoshida@gmail.com> [c5d6f71763f8a7bdfc770c175f0f5a2a04de6b42]
+
+ Cover orcus-xml's structure mode.
+
+
+2020-10-19 Kohei Yoshida <kohei.yoshida@gmail.com> [ce8ec901b18b0d321fb334e54aafb62ff78251af]
+
+ Create a new section for XML mapping tutorial, with sample XML.
+
+
+2020-10-02 Kohei Yoshida <kohei.yoshida@gmail.com> [9bf763219f1f562bdca4700a952913d74f013e8b]
+
+ Add the new op member for orcus.FormulaToken to the doc.
+
+
+2020-10-01 Kohei Yoshida <kohei.yoshida@gmail.com> [63dfd2db910bf867b9d633aa3d61c43c5a1e8be9]
+
+ Add another test case (#127)
+
+
+2020-10-01 Kohei Yoshida <kohei.yoshida@gmail.com> [8435a3fa57f6a1d1f8826d496155d3f9d94a4726]
+
+ Use pathlib instead of os.path & remove unused module imports.
+
+
+2020-10-01 Kohei Yoshida <kohei.yoshida@gmail.com> [f70123b5e61d5050e0b41a536cae888ba1ed52f1]
+
+ Add op member to orcus FormulaToken (#127)
+
+
+2020-09-30 Kohei Yoshida <kohei.yoshida@gmail.com> [20bb0a704af470d53447fa6d3965a0a0642709d6]
+
+ Set the new mdds API version requirement to 2.0.
+
+
+2020-09-30 Kohei Yoshida <kohei.yoshida@gmail.com> [1579c12111074a50f2307b8fa749a68749af11ba]
+
+ Set the new C++ baseline in cmake too. (#125)
+
+
+2020-09-30 Kohei Yoshida <kohei.yoshida@gmail.com> [25a27fb94468f1fe06376a4ef18adf78ccc6b102]
+
+ Replace all instances of orcus::make_unique with the one from ...
+
+ ... the std namespace.
+
+2020-09-30 Kohei Yoshida <kohei.yoshida@gmail.com> [224583c4b055436e9548d7008505f2445bafbbe4]
+
+ Raise the baseline to C++17. This is related to #125.
+
+
+2020-09-29 Kohei Yoshida <kohei.yoshida@gmail.com> [fb5cd0c4bbcb7dc9bc49026f85ba90f56942dc05]
+
+ Fix the gitlab-ci build.
+
+
+2020-09-29 Kohei Yoshida <kohei.yoshida@gmail.com> [e97af620c7760f343e6749167ec1addb80ea1cfd]
+
+ Make sure it builds against ixion-0.17.
+
+ ixion-0.17 no longer has get_column(s) methods in model_context.
+
+2020-09-29 Kohei Yoshida <kohei.yoshida@gmail.com> [f57b919553529f8ad976cc91395573e96ea2738d]
+
+ Re-implement csv_dumper and json_dumper.
+
+ The new implementation uses ixion::model_iterator.
+
+2020-09-29 Kohei Yoshida <kohei.yoshida@gmail.com> [3067613510c92da123270cd0ebfb32c30bab2ecc]
+
+ Avoid using ixion::model_context::get_columns().
+
+ This also simplifies the code quite a bit.
+
+2020-09-28 Kohei Yoshida <kohei.yoshida@gmail.com> [d9407df13c2f0428bc8767a851647376e15f77ba]
+
+ The sheet_range class is no longer used. Remove it.
+
+ With this change, we need to increment the API version to 0.17.
+
+2020-09-28 Kohei Yoshida <kohei.yoshida@gmail.com> [b98e2b922f7105d3476c034699d8e4adbae652ae]
+
+ Re-implement orcus.SheetRows using ixion::model_iterator.
+
+
+2020-09-26 Kohei Yoshida <kohei.yoshida@gmail.com> [6273dd57f1cbdf5000f1f439aac63e0add4b4f7f]
+
+ Update CHANGELOG.
+
+
+2020-09-26 Kohei Yoshida <kohei.yoshida@gmail.com> [99778a54c765e271805bb33134591936f8e87586]
+
+ Set the version number to 0.16.1.
+
+
+2020-09-24 Kohei Yoshida <kohei.yoshida@gmail.com> [0eb2e3f7e81275a14958fa3cab900501c37c404c]
+
+ Check the size of void* and pass it as a compiler define.
+
+ This is needed in order to link against libixion. Related to #129.
+
+2020-09-24 Kohei Yoshida <kohei.yoshida@gmail.com> [2f3fa91679b449d3079152fb847c71350815df49]
+
+ Don't forget to initialize this struct member.
+
+ This ended up becoming "true" on a 32-bit debian platform, though
+ this is not strictly a 32-bit build issue...
+
+ Related to #129.
+
+2020-09-18 Kohei Yoshida <kohei.yoshida@gmail.com> [535ebd34724d8a8db5f0fe60bc9c0b1cdd83495f]
+
+ This file is no longer there.
+
+
+2020-09-11 Kohei Yoshida <kohei.yoshida@gmail.com> [6d34c41b661a9e8dddf6d08bf1f3c1fd4f5581da]
+
+ Mark all untentionally unused variables.
+
+
+2020-09-10 Kohei Yoshida <kohei.yoshida@gmail.com> [cd92973452a9e2f2e65cde70949d93de967d3a55]
+
+ Tweak the wording to make it flow better.
+
+
+2020-09-09 Kohei Yoshida <kohei.yoshida@gmail.com> [aff45bbb1ba44774cc9fc44214bf1e139ffcd725]
+
+ Add some clarification as to why we have two different methods ...
+
+ ... for defining named expressions.
+
+2020-09-03 Kohei Yoshida <kohei.yoshida@gmail.com> [c64e545d33125da374c9ee5e96f1c637eb7f036a]
+
+ There is only one orcus.detect_format function.
+
+
+2020-09-03 Kohei Yoshida <kohei.yoshida@gmail.com> [34cb20bd1c6a0900f7f4309f2531df1509ac50b4]
+
+ Fix typos.
+
+
+2020-09-03 Kohei Yoshida <kohei.yoshida@gmail.com> [bfa21be05172020e19d4cf19fb39e29beb93b65e]
+
+ Add script to generate release note template.
+
+
+2020-09-03 Kohei Yoshida <kohei.yoshida@gmail.com> [f871fd06ee7791ba8435b8038e411e3e4e80f683]
+
+ Update CHANGELOG for the 0.16.0 items.
+
+
+2020-09-03 Kohei Yoshida <kohei.yoshida@gmail.com> [913d0eab2e70214d3cd07dda1a92119d9187abe0]
+
+ Up the version to 0.16.0.
+
+
+2020-09-03 Kohei Yoshida <kohei.yoshida@gmail.com> [f4cc9124f70ce956aa95e088b1db3b3ffe82f14a]
+
+ Fix make distcheck.
+
+
+2020-09-02 Kohei Yoshida <kohei.yoshida@gmail.com> [1b504009150565d0d5e0e7323468dc5becc7cfae]
+
+ Add dom-tree-test to cmake build.
+
+
+2020-09-02 Kohei Yoshida <kohei.yoshida@gmail.com> [bed6e49587a829a112eaa099158e01660de5d45a]
+
+ A few more test programs to rename, to match their names with ...
+
+ ... their corresponding source file names.
+
+2020-09-02 Kohei Yoshida <kohei.yoshida@gmail.com> [985e763dc7c66b073374cc3e5b33f0c9e049fa18]
+
+ Rename test programs to match their corresponding source file names.
+
+
+2020-09-02 Kohei Yoshida <kohei.yoshida@gmail.com> [c047be8effdcdbf7de56da077538c3cf9ebdebcf]
+
+ Add new test programs to cmake build.
+
+
+2020-09-02 Kohei Yoshida <kohei.yoshida@gmail.com> [321a4897e4c22e7702351105bb264760599116be]
+
+ Let's depend on the official release of ixion.
+
+
+2020-09-02 Kohei Yoshida <kohei.yoshida@gmail.com> [046565afd1b7d6fb9496ded437a6328d19333dfd]
+
+ Attempt to fix the build after the ixion API change (take 2).
+
+ Also, no need to escape '#' in string literals.
+
+2020-09-02 Kohei Yoshida <kohei.yoshida@gmail.com> [4527528e2878233298d49e0077b9942cb8f72387]
+
+ Get it to build again after the ixion interface change.
+
+ Also fix the check target in cmake build.
+
+2020-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [93c2e69e35e218043bfa5ad258f339e03be1b4e2]
+
+ We can enable these negative test cases now.
+
+ The two we can't enable cause memory exhaustion due to too many
+ open tokens for arrays and objects.
+
+2020-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [650520b51dddd357d817832eb5a198308e898e79]
+
+ Check for presence of unescaped control character in strings.
+
+ JSON strings do not allow characters whose values are between 0x00
+ and 0x1F, according to RFC 7159 Section 7.
+
+2020-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [94cb46c366bd8284d39afd0c678d0ab29fae7aa3]
+
+ Unnecessary break statements.
+
+
+2020-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [232f571f947ece3c5788f2e8ecf35a67f220ab73]
+
+ Throw an exception on empty input & write some test cases.
+
+ Because this is a public function, we shouldn't be using assert()
+ on the input validation. Also, we can remove the max_length == 0
+ block since that is now handled as part of the input validation.
+
+2020-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [05b6ba1e72a5f60dbc3ce538a15ac51beb73fd56]
+
+ These can be now enabled.
+
+
+2020-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [be1ae1c2d9993d756a698a877451a67b722ca318]
+
+ JSON requires at least one digit before the decimal point.
+
+ A number string such as -.123 is invalid in JSON string, but is
+ accepted as valid in other places.
+
+2020-08-19 Kohei Yoshida <kohei.yoshida@gmail.com> [f0dd87b85973b0e444142af74ce00491c6cb194d]
+
+ We can use has_decimal to track whether we are before or after ...
+
+ ... the decimal point.
+
+2020-08-19 Kohei Yoshida <kohei.yoshida@gmail.com> [1ea9ba242f7c20cc957e6ea9654fac70410d7e31]
+
+ We can enable 5 more test cases.
+
+
+2020-08-19 Kohei Yoshida <kohei.yoshida@gmail.com> [3b6199f2b422f9b654b5cd789fa04ff68c5e7692]
+
+ We can just use the general trait type. No need to break down ...
+
+ ... the individual behavior differences between the generic parser
+ and the json parser.
+
+2020-08-19 Kohei Yoshida <kohei.yoshida@gmail.com> [124de6acd06fe51e049e68c479a4aa9231217ff1]
+
+ A number in json must have at least one digit after the decimal ...
+
+ ... if the number string has a decimal point.
+
+2020-08-19 Kohei Yoshida <kohei.yoshida@gmail.com> [7454f2cbe5f23ed65ab4c22d37d5b656aba5c282]
+
+ We can enable this test case now.
+
+
+2020-08-19 Kohei Yoshida <kohei.yoshida@gmail.com> [7ba63c33db8adfd9f1dd12c4f1a3b8dbe202717b]
+
+ Rename variables and add comments for clarity.
+
+
+2020-08-19 Kohei Yoshida <kohei.yoshida@gmail.com> [0c5c0229c49f2038c53e4794190d3ece6146d453]
+
+ Apply JSON's own numeric parser for json::parser_base, and fix ...
+
+ ... all necessary bits to get all test cases pass.
+
+2020-08-19 Kohei Yoshida <kohei.yoshida@gmail.com> [5227241a915ac1b4571bb9824ed240f4119420e0]
+
+ Turn this into template specializations.
+
+
+2020-08-18 Kohei Yoshida <kohei.yoshida@gmail.com> [ab763629692143a606bac1ae3dc3c0521394b4d8]
+
+ Group parser state into a structure.
+
+
+2020-08-17 Kohei Yoshida <kohei.yoshida@gmail.com> [63a499a724140bb4575255347b9266005859b55b]
+
+ Parse leading zeros as invalid in json.
+
+ For now, it's a regular if statement. I do need to turn this into
+ template specialization.
+
+2020-08-17 Kohei Yoshida <kohei.yoshida@gmail.com> [5ec6fa12529661d8085c9bc43c9a6f0030743c0f]
+
+ Add a first failing test case for json numeric parsing.
+
+ Not enabled yet. I need to work on this.
+
+2020-08-17 Kohei Yoshida <kohei.yoshida@gmail.com> [31c28e848b4331b5bad06e9c2c066608d7f55ee8]
+
+ Slightly better error output.
+
+
+2020-08-17 Kohei Yoshida <kohei.yoshida@gmail.com> [8bde20b0ec3769578c69a1c51b98e7d9692f938f]
+
+ Annotate the test case categories.
+
+
+2020-08-17 Kohei Yoshida <kohei.yoshida@gmail.com> [e4a443413ea52b3ce5032d1f4e0331c62a4a4437]
+
+ We can use orcus::json_handler for this type of use cases.
+
+
+2020-08-17 Kohei Yoshida <kohei.yoshida@gmail.com> [f1ffce6ec3d04a8c27276af8238750cd0ac0efba]
+
+ Combine test cases from parser_global_test.cpp.
+
+
+2020-08-17 Kohei Yoshida <kohei.yoshida@gmail.com> [92de9902a969f5ae2946e6fe6f3008ab2df80321]
+
+ Remove duplicate code blocks.
+
+
+2020-08-17 Kohei Yoshida <kohei.yoshida@gmail.com> [33aca3a22ecdcaeb446efdbc5917142c0bea1a4b]
+
+ Add rudimentary test framework for numeric_parser class.
+
+ We need to add lots more test cases for this...
+
+2020-08-17 Kohei Yoshida <kohei.yoshida@gmail.com> [34fc96a9182d2b304c853399f416d69badf483f6]
+
+ Move the numeric parsing code to a private template class.
+
+ The idea is to make it configurable without sacrificing run-time
+ performance.
+
+2020-08-13 Kohei Yoshida <kohei.yoshida@gmail.com> [6c7f94c105ad534ed254fa60fe79335aeb12bc9c]
+
+ Add documentation for orcus.detect_format().
+
+
+2020-08-13 Kohei Yoshida <kohei.yoshida@gmail.com> [bf50fb5737d7aab48c085c14c88d019ab230839d]
+
+ Change orcus.detect_format() to *only* take the stream parameter.
+
+ And update the test code to test both passing the bytes and the file
+ objects.
+
+2020-08-13 Kohei Yoshida <kohei.yoshida@gmail.com> [87bc0ea3a392733780daf1e9622d8c471ea68aee]
+
+ Make it so that if a file path is not given, it starts the ...
+
+ ... interpreter in interactive mode.
+
+2020-08-13 Kohei Yoshida <kohei.yoshida@gmail.com> [f600410ee6f3c79942a9f70522fa6d30508e11f2]
+
+ Rename the current function to indicate what it currently does.
+
+
+2020-08-12 Kohei Yoshida <kohei.yoshida@gmail.com> [7aa417494e79a5ca4b407f1ff3b263e9690c1bcc]
+
+ Update the doc.
+
+
+2020-08-12 Kohei Yoshida <kohei.yoshida@gmail.com> [c294e3312f7f35afc8317fa7c0501295c1f324c6]
+
+ Actually check the format parameter, and raise an exception if necessary.
+
+
+2020-08-12 Kohei Yoshida <kohei.yoshida@gmail.com> [27ee5f0f4656f64eaaef5d3912a42b4d79522c90]
+
+ When writing sheet content as csv, write it as string, not as bytes.
+
+ Now test_csv_export passes again.
+
+2020-08-12 Kohei Yoshida <kohei.yoshida@gmail.com> [e0a260a603b99745035ef71951ba1d11c6f8f40d]
+
+ csv.read() to read from string, not bytes.
+
+ Also, the recalc and error_policy parameters have been dropped.
+ The test_csv_export test fails.
+
+2020-08-12 Kohei Yoshida <kohei.yoshida@gmail.com> [be498a50d402448ee5e56cc17fa6ee4c1cf0999b]
+
+ Abstract away the file loading part from run_test_dir(), and ...
+
+ ... use a different loader type for csv so that it reads from
+ string instead of bytes. This currently fails the test.
+
+ While I'm at it, prevent the code from terminating by checking for
+ bytes beforehand.
+
+2020-08-11 Kohei Yoshida <kohei.yoshida@gmail.com> [23ac43a84dca30dd274cabb93ccc6478736ac9f9]
+
+ Make sure the version number string is as expected.
+
+ This is also related to #122.
+
+2020-08-11 Kohei Yoshida <kohei.yoshida@gmail.com> [a164fb983f805a9e66ba8484c01af86714884d86]
+
+ Add test files to slickedit project.
+
+
+2020-08-11 Kohei Yoshida <kohei.yoshida@gmail.com> [762341282732995a818a3ff89ff2a008deabbead]
+
+ Rename the test files to prefix with test_.
+
+
+2020-08-11 Kohei Yoshida <kohei.yoshida@gmail.com> [2e20c9bd569496af2bde5c145d6796625fee6082]
+
+ Convert tabs to spaces.
+
+
+2020-08-11 Kohei Yoshida <kohei.yoshida@gmail.com> [f3e9da0f1921fe0022e892effe257f661d98155e]
+
+ Add __version__ member to the orcus module.
+
+ This is related to #122.
+
+2020-08-10 Kohei Yoshida <kohei.yoshida@gmail.com> [5d4b310059d17f96cf3398b3b1b996d723e2d670]
+
+ I believe the right terminology is packages, not modules.
+
+
+2020-08-10 Kohei Yoshida <kohei.yoshida@gmail.com> [211de8924ebab4ec6b5e2de3cd757bbbb4036c53]
+
+ Add documentation around cells and formula tokens.
+
+
+2020-08-10 Kohei Yoshida <kohei.yoshida@gmail.com> [c75d754294d815cb8669107cedc61d73f24c4c63]
+
+ Don't forget csv.
+
+
+2020-08-10 Kohei Yoshida <kohei.yoshida@gmail.com> [8f55c95255e40041068ac864b83cfeaf2e3616e8]
+
+ Add docs for the loaders for other document types.
+
+
+2020-08-10 Kohei Yoshida <kohei.yoshida@gmail.com> [32154d896ec93bf334c4aa0dfd38b7614414f744]
+
+ Add back the doc for a few classes that got dropped accidentally.
+
+ Also revert back to the sphinx default style. Google style doesn't
+ seem to work unless it's used in docstring.
+
+2020-08-10 Kohei Yoshida <kohei.yoshida@gmail.com> [c7e424937bf8ec1a83c55b45f36c44c658b8bd5d]
+
+ Update the doc on orcus.xlsx.read().
+
+
+2020-08-10 Kohei Yoshida <kohei.yoshida@gmail.com> [df00c5792076245dc09758a00dde5fea1bd438ad]
+
+ Re-organize the Python API doc based on package paths.
+
+
+2020-08-08 Kohei Yoshida <kohei.yoshida@gmail.com> [1a8fe30e2482a3ad0c51e7b64771d452c1a01b5d]
+
+ Update the doc to reflect the latest API. Still more to cover.
+
+
+2020-08-08 Kohei Yoshida <kohei.yoshida@gmail.com> [bf4488f3cc5a200fafb8a8c02dc6134bfbaf5b52]
+
+ Add more help contents to the bugzilla command.
+
+
+2020-08-08 Kohei Yoshida <kohei.yoshida@gmail.com> [19cf430a302ff220453c059e7c04254ddc357aa2]
+
+ Document the orcus.tools commands using sphinx-argparse extension.
+
+
+2020-08-08 Kohei Yoshida <kohei.yoshida@gmail.com> [8e19aa33505759710b92a57e17dd163c91770793]
+
+ Still trying to get the doc to build on the RTD site.
+
+
+2020-08-08 Kohei Yoshida <kohei.yoshida@gmail.com> [39b8ffff7f3df89e0708bd112d4d4cb17d147105]
+
+ Try to get the doc to build on the RTD site.
+
+
+2020-08-08 Kohei Yoshida <kohei.yoshida@gmail.com> [a378823a106733d8c3cfbe7ffa6fa9335599777b]
+
+ Re-organize the python section to make room for new contents.
+
+
+2020-08-07 Kohei Yoshida <kohei.yoshida@gmail.com> [f5bf4f29fc0154cb2e6b18a9de25704333c15b04]
+
+ Add bugzilla.py to Makefile.am.
+
+
+2020-08-07 Kohei Yoshida <kohei.yoshida@gmail.com> [ba7e4d9a27a493f5187e0d184601a79e803fdea1]
+
+ Make sure the data isn't empty.
+
+
+2020-08-07 Kohei Yoshida <kohei.yoshida@gmail.com> [7034d672e4745a8aaf9bda14384e4ef445dc0864]
+
+ Use fixed width and right-align the index for better visual.
+
+
+2020-08-07 Kohei Yoshida <kohei.yoshida@gmail.com> [689b43001481ff53f9fad7c83447a31728e77bca]
+
+ Handle '/' in query terms when caching to a file.
+
+
+2020-08-07 Kohei Yoshida <kohei.yoshida@gmail.com> [92c277c8ba5fdc0d755cb4e278a84d836b0cca7d]
+
+ Support arbitrary query terms.
+
+
+2020-08-07 Kohei Yoshida <kohei.yoshida@gmail.com> [4e7f4a2832e4c3f44306fe819a091b3a6b3fb77a]
+
+ Wrap all the functions with a class to avoid using globals.
+
+
+2020-08-06 Kohei Yoshida <kohei.yoshida@gmail.com> [e6b6d8e7e93b2e7d75b0def4782681f79e7197c2]
+
+ Parameterize the bugzilla URL and cache directory.
+
+
+2020-08-06 Kohei Yoshida <kohei.yoshida@gmail.com> [d638bac507b3a07fe1641172082a97e6e28c03cc]
+
+ Move the file to its new location.
+
+
+2020-08-04 Kohei Yoshida <kohei.yoshida@gmail.com> [f3cf6924f2fa02c5600e4fb92844481714b42757]
+
+ Add a section for the CSS parser and friends.
+
+ And annotate the CSS related symbols a bit.
+
+2020-08-04 Kohei Yoshida <kohei.yoshida@gmail.com> [190765d185395116d4315da94630d09511170212]
+
+ Update the example doc for the low-level json parser in regards ...
+
+ ... to the base handler class being made available in the public
+ header.
+
+ This is related to #117.
+
+2020-08-03 Kohei Yoshida <kohei.yoshida@gmail.com> [2b113efb40f4a3b54eb39f9a91c997f284782c67]
+
+ I don't think we need two variants of append_field_link().
+
+
+2020-08-03 Kohei Yoshida <kohei.yoshida@gmail.com> [6c4d940d81abc3c8fae2392b1dd8c0e3f5c31f05]
+
+ Add another test case that involves attributes.
+
+
+2020-08-03 Kohei Yoshida <kohei.yoshida@gmail.com> [0d6d7950728bda7c7e2582456f416c0990191e81]
+
+ Read the label values from the map file and make use of them.
+
+ And add a test case for it.
+
+2020-08-03 Kohei Yoshida <kohei.yoshida@gmail.com> [aa1d6d8ba330eb84bc2043bb3d385fe0faff68e5]
+
+ Add a variant of append_field_link that takes a label value, ...
+
+ ... store it in the proper place inside, and use it in lieu of the
+ name of the linkable.
+
+2020-08-03 Kohei Yoshida <kohei.yoshida@gmail.com> [317f7ca0cea93ae9ab4fcae77e73ba849adc72bb]
+
+ Use xml_name_t and clean things up a bit.
+
+
+2020-08-03 Kohei Yoshida <kohei.yoshida@gmail.com> [c66a4fb59f655bf39cccc6a14f832d5a3260bfc7]
+
+ Use range-for loop.
+
+
+2020-07-30 Kohei Yoshida <kohei.yoshida@gmail.com> [62dd75fc47cfa8fea66e661674055f46320f3792]
+
+ Add another test case.
+
+
+2020-07-30 Kohei Yoshida <kohei.yoshida@gmail.com> [c962218d287d36721d6eb7499336beac4815ed97]
+
+ Add method docs to orcus_xml.
+
+
+2020-07-30 Kohei Yoshida <kohei.yoshida@gmail.com> [e89597502e6e05f96f680e27626b151610e2448e]
+
+ Support default namespace in the map definition file.
+
+ This is related to #90.
+
+2020-07-30 Kohei Yoshida <kohei.yoshida@gmail.com> [8959cfd81a1673fb50e007e66361218ef145336b]
+
+ No need for double-nesting of if scopes.
+
+
+2020-07-30 Kohei Yoshida <kohei.yoshida@gmail.com> [40c976e58bd77b9f7a1b119e96d92f9666d99f75]
+
+ I think calling it push_element_scope() is more appropriate.
+
+
+2020-07-28 Kohei Yoshida <kohei.yoshida@gmail.com> [b3e0d09d63bb8125cc8685900c1b8ea9037472c0]
+
+ Sync the version numbers.
+
+
+2020-07-28 Kohei Yoshida <kohei.yoshida@gmail.com> [1d21dc34521a7d600ad7eca3afe6afd87c577ea6]
+
+ Use basic_ostream's write() to write pstring's content.
+
+ This should be more efficient than creating a std::string
+ instance (!) and writing that to ostream.
+
+2020-07-28 Kohei Yoshida <kohei.yoshida@gmail.com> [89851d2a6e0c0585a49c43c35c37010409571c2b]
+
+ Make xml_writer non-copyable but moveable.
+
+
+2020-07-28 Kohei Yoshida <kohei.yoshida@gmail.com> [779c0903969cc20d7ccee2903f69a9d86040ff98]
+
+ Add documentation for the xml_writer class.
+
+
+2020-07-28 Kohei Yoshida <kohei.yoshida@gmail.com> [6b26ec3237fbc18b935007592adecc67f3193214]
+
+ Properly encode contents when writing them.
+
+
+2020-07-27 Kohei Yoshida <kohei.yoshida@gmail.com> [cb186d5504928173a2e323a77c019692d1b37a14]
+
+ Add a new method to print xml_name_t value as string.
+
+
+2020-07-27 Kohei Yoshida <kohei.yoshida@gmail.com> [a3afc669a7aca92a35019117fee431dd00532362]
+
+ Use xml_name_t for the name in linkable.
+
+
+2020-07-27 Kohei Yoshida <kohei.yoshida@gmail.com> [ea07a06721ee6a66e03139a89ebeb6f1b4e3c83b]
+
+ Indent the exception messages to make them easier to read.
+
+
+2020-07-27 Kohei Yoshida <kohei.yoshida@gmail.com> [23981a4bbb304a11ea1f188c6722366d69b379ae]
+
+ Add a test case to cover invalid linking of non-leaf elements.
+
+
+2020-07-27 Kohei Yoshida <kohei.yoshida@gmail.com> [741314ab68cf1695acfed1e06a22cc6144cfe590]
+
+ Adjust test_invalid_map_definition() to load content from file.
+
+ And introduce a loop to make it easier to add more invalid
+ contents.
+
+2020-07-27 Kohei Yoshida <kohei.yoshida@gmail.com> [ca2b6993bef259714edfe069a7f8d69212947c2a]
+
+ Write tests for generating map definitions.
+
+
+2020-07-27 Kohei Yoshida <kohei.yoshida@gmail.com> [bd126919a0077eb80b73d081f8ee056ba2e5319d]
+
+ Use brace initializers to make it look a bit more concise.
+
+
+2020-07-27 Kohei Yoshida <kohei.yoshida@gmail.com> [45a7d7e239541bf46a86cc6dde15c8f9a7d447f3]
+
+ Set the linked range position to row=0 and column=0.
+
+
+2020-07-27 Kohei Yoshida <kohei.yoshida@gmail.com> [0e49f2a99c62c28161b0b668431963ba6cd5f223]
+
+ Re-use an existing xmlns_repository instance.
+
+
+2020-07-27 Kohei Yoshida <kohei.yoshida@gmail.com> [e77c5b3cb01d9cc6c1a2c0a018b1a81542e1b678]
+
+ Let's retire the doxygen documentation.
+
+
+2020-07-26 Kohei Yoshida <kohei.yoshida@gmail.com> [100ff7b5d3abc99d5d0506a78d8e738f264339fa]
+
+ Rename to write_map_definition, for consistency.
+
+
+2020-07-26 Kohei Yoshida <kohei.yoshida@gmail.com> [51bc5125da227d133030c154d41b6f26ca86901f]
+
+ Let's not use m_ prefix for members of impl struct.
+
+ The impl member itself is already prefixed with mp_. It feels
+ repetitive to use the m_ prefix in the impl member names too.
+
+2020-07-26 Kohei Yoshida <kohei.yoshida@gmail.com> [f8764c737cd894cae4fcdaa90f24c749e83e587c]
+
+ Use the namespace repo instance from orcus_xml::impl.
+
+ But in order to have access to it, I first needed to move the impl
+ class code into separate header/source file pair.
+
+2020-07-26 Kohei Yoshida <kohei.yoshida@gmail.com> [6dda93e76a4b66a408f8b37cfb6461cf9d723168]
+
+ Leftover forward declaration.
+
+
+2020-07-25 Kohei Yoshida <kohei.yoshida@gmail.com> [44884ff33405ad3e4506b724bef77e6b67bb2206]
+
+ Minor formatting tweak.
+
+
+2020-07-25 Kohei Yoshida <kohei.yoshida@gmail.com> [443cf7dbd38318ce10bf6f301112813cc7535d33]
+
+ No need to create an impl instance for the other object when moving.
+
+
+2020-07-25 Kohei Yoshida <kohei.yoshida@gmail.com> [c5bf46c65ec3fbab26446a2128ff314b2f44bb73]
+
+ Move the map-generation code into orcus_xml.
+
+
+2020-07-25 Kohei Yoshida <kohei.yoshida@gmail.com> [6192bbd58fc10867b3bd844b312e547fc48e95a5]
+
+ Implement add_content() method. Currently not used yet.
+
+
+2020-07-25 Kohei Yoshida <kohei.yoshida@gmail.com> [dccbcadc2ab43fb4d0b66147579e17079f975656]
+
+ Make the scope object move assignable.
+
+
+2020-07-25 Kohei Yoshida <kohei.yoshida@gmail.com> [34b8d6284ed80f98f7a397bab37beaf453cc6ca4]
+
+ Introduce RAII-based element scoping.
+
+ This will eliminate the manual push-pop call pairs.
+
+2020-07-25 Kohei Yoshida <kohei.yoshida@gmail.com> [20bfaf37957f0ac5fa63ef68d63c870260d51148]
+
+ Pop all the elements on the stack when the writer instance is ...
+
+ ... being destroyed.
+
+2020-07-24 Kohei Yoshida <kohei.yoshida@gmail.com> [92a8d7a8124d042d770afdb84cd5098855754e74]
+
+ Slightly better handling of the default namespace value.
+
+
+2020-07-24 Kohei Yoshida <kohei.yoshida@gmail.com> [a018838f61d8319cf8b7e5b28a861de9c7cd74a3]
+
+ Intern all string instances.
+
+
+2020-07-24 Kohei Yoshida <kohei.yoshida@gmail.com> [59d07a793bfd8faf794f401f2b40a325c75f47c8]
+
+ Remove duplicated code blocks.
+
+
+2020-07-24 Kohei Yoshida <kohei.yoshida@gmail.com> [f1e3b507a35f81a8c4e48298421a35c0a5fe9cb2]
+
+ Handle self-closing elements.
+
+
+2020-07-24 Kohei Yoshida <kohei.yoshida@gmail.com> [388ac1a3c583f8623fe2abd55f1751ea14d880bc]
+
+ First shot at generating map file. Still lots of issues.
+
+
+2020-07-23 Kohei Yoshida <kohei.yoshida@gmail.com> [29f134075ded741ff922bb8980ea322fcb69fe7a]
+
+ Set up the basic structure for map generation.
+
+ All I have to do now is to convert this flat output into an XML
+ form.
+
+2020-07-23 Kohei Yoshida <kohei.yoshida@gmail.com> [af394336ca0c05983e63e7dd46a100b0fc5a8fae]
+
+ Adjust the cli parser code and make room for the map-gen mode.
+
+ Not implemented yet.
+
+2020-07-23 Kohei Yoshida <kohei.yoshida@gmail.com> [d739a02853d791fec0272c6df455a6bf5a9bcf78]
+
+ Make use of the new 'has_content' attribute in the auto-mapping ...
+
+ ... and only auto-link those elements with actual contents.
+
+2020-07-23 Kohei Yoshida <kohei.yoshida@gmail.com> [5638d09bc248ef7c2fb784e5311f96e4df0fd69c]
+
+ Remove using namespace std and get the code to build.
+
+
+2020-07-23 Kohei Yoshida <kohei.yoshida@gmail.com> [8f64eb3c475976c0d5406d1fb58454c1d0a6e1ac]
+
+ Detect whether or not each element has content.
+
+
+2020-07-23 Kohei Yoshida <kohei.yoshida@gmail.com> [85c2bd89e136a95f70fb88ec43118fc7c394ba23]
+
+ Switch to using boost::filesystem & rename the executable to ...
+
+ ... match the source file.
+
+2020-07-22 Kohei Yoshida <kohei.yoshida@gmail.com> [5358a1e6644baed9d6f80e417f8edb3cda7276a3]
+
+ Let's not forget to add these files.
+
+
+2020-07-22 Kohei Yoshida <kohei.yoshida@gmail.com> [f49a117a4aedf08bcabe57724cb34326cfdb2b1d]
+
+ Fix orcus-json for map mode.
+
+ It was creating an output *file* up-front when in fact we shouldn't
+ for the map mode. In map mode, we let the backend document decide
+ whether to create an output file or an output directory.
+
+2020-07-22 Kohei Yoshida <kohei.yoshida@gmail.com> [245c355daa3cb67dea11b327cd578014885e32a7]
+
+ Add the rest of the test cases, minus 2.
+
+ Two of the existing test cases didn't get added because they didn't
+ have any linkable ranges in them.
+
+2020-07-22 Kohei Yoshida <kohei.yoshida@gmail.com> [f22eeb203abda4691319dfc2a0f74e6e549e4fe2]
+
+ Add the first test case for auto xml mapping.
+
+
+2020-07-22 Kohei Yoshida <kohei.yoshida@gmail.com> [00b081e6962a73a1173d2746e0dcf10be0f276ff]
+
+ Set up a new test spot for xml mapping with no map files.
+
+
+2020-07-21 Kohei Yoshida <kohei.yoshida@gmail.com> [741ad7a4b6cdbd1a53fe757d7acade1a9259589b]
+
+ I don't need this any more.
+
+
+2020-07-21 Kohei Yoshida <kohei.yoshida@gmail.com> [29b753d17ba9089464a8ac1ccc02b866fc755731]
+
+ Correctly handle attribute names with namespaces.
+
+
+2020-07-21 Kohei Yoshida <kohei.yoshida@gmail.com> [7caa35079661d43597fa2678137a0b3c31a3a1b5]
+
+ Do the same for get_attributes().
+
+
+2020-07-21 Kohei Yoshida <kohei.yoshida@gmail.com> [6c55a68e279954744884651bbc430e23fefb9ae4]
+
+ get_children() to return the list directly instead of using ...
+
+ ... an out-bound reference parameter.
+
+2020-07-21 Kohei Yoshida <kohei.yoshida@gmail.com> [4aca3735d426d5c0853c923b992e010d885020e8]
+
+ Implement automatic detection of linkable ranges in XML documents.
+
+
+2020-05-23 Kohei Yoshida <kohei.yoshida@gmail.com> [77633c019d4c90bf80cb8470257c9a49e367f4f1]
+
+ Add a new test case.
+
+
+2020-05-23 Kohei Yoshida <kohei.yoshida@gmail.com> [b89de912c0317f8722d99fab53c1bcc3e7abfdce]
+
+ Update the test file to include range reference to numeric cells.
+
+
+2020-05-23 Kohei Yoshida <kohei.yoshida@gmail.com> [108d611e66c45cc69924def3dabd8d2687cb0aef]
+
+ Defer all cell formula imports until the end of Workbook element.
+
+
+2020-05-23 Kohei Yoshida <kohei.yoshida@gmail.com> [5e068133878586c72929cca865df20cfdf883d05]
+
+ Use range-based for loop here too.
+
+
+2020-05-23 Kohei Yoshida <kohei.yoshida@gmail.com> [fbb6b04358b8bc11b407b87e43c2f155702828ec]
+
+ Replace use of function object in favor for range-based for loop.
+
+
+2020-05-23 Kohei Yoshida <kohei.yoshida@gmail.com> [aaa12dae2e46e9b6b35e7ae89dae29202a67608f]
+
+ Move the worksheet element handling code into its own methods.
+
+
+2020-05-23 Kohei Yoshida <kohei.yoshida@gmail.com> [8d16788e169ec326db3e94f98a10bb7146574bb9]
+
+ Get the cmake build fixed up. Also remove the unconditional lib prefix.
+
+
+2020-05-23 Kohei Yoshida <kohei.yoshida@gmail.com> [048d13a28db069969ff1c065f883f40a6a5c9c8e]
+
+ Fix the cmake build with MSVC.
+
+
+2020-05-22 Kohei Yoshida <kohei.yoshida@gmail.com> [760a3e785350f182f144e4ab6a044575254c7c14]
+
+ Add a test document that orcus currently fails to load.
+
+
+2020-05-22 Kohei Yoshida <kohei.yoshida@gmail.com> [c3cd6e4dfc87c19adbe8eb4614922873887301a8]
+
+ I found another one here too.
+
+
+2020-05-22 Kohei Yoshida <kohei.yoshida@gmail.com> [cacaae52a457ce568a448143ec7ff072a0552f22]
+
+ Minor fixes.
+
+ I still need to generate the output file to signal the file has been
+ "processed".
+
+2020-05-22 Kohei Yoshida <kohei.yoshida@gmail.com> [6b61f74285fef9e039bc5882014549ef63fe127f]
+
+ Another one for page field attributes.
+
+
+2020-05-22 Kohei Yoshida <kohei.yoshida@gmail.com> [e142e72f6a1ed5decd85c968b4149dd2dca96d62]
+
+ Another one.
+
+
+2020-05-22 Kohei Yoshida <kohei.yoshida@gmail.com> [9ec730a72c19920f7b0f028335a9895eca95d27e]
+
+ More on funcobj removal & unwanted debug output supression.
+
+
+2020-05-22 Kohei Yoshida <kohei.yoshida@gmail.com> [3a4b70af847266481f74efe54e16998af3477a1c]
+
+ More on supressing output when the debug flag is off.
+
+
+2020-05-22 Kohei Yoshida <kohei.yoshida@gmail.com> [2c8fca24eb43926da82a77db4ea727382bc0c4b1]
+
+ Remove another attr-parsing func object in favor of ranged for loop.
+
+ And print stuff only when the debug flag is on.
+
+2020-05-22 Kohei Yoshida <kohei.yoshida@gmail.com> [fb9c519648a0c0a2e78db0b1f5aa356b011437af]
+
+ Output only when the debug flag is on.
+
+
+2020-05-22 Kohei Yoshida <kohei.yoshida@gmail.com> [73f4dfdd5df1afd004de9d453af0cabe2e9ffde2]
+
+ Remove this attribute handler func object...
+
+ ... in favor of range-based for loop.
+
+2020-05-22 Kohei Yoshida <kohei.yoshida@gmail.com> [1a717ccdad986ac93277d26c1eb5108a3365ecb4]
+
+ Support multi-processing in orcus.tools.file_processor.
+
+ Though due to excessive memory usage, I could only use up to 2
+ processes on my machine.
+
+2020-05-21 Kohei Yoshida <kohei.yoshida@gmail.com> [915eb6e52277a1bec6e330faa689605467528db1]
+
+ Adjust the documentation for the parser handler relocations.
+
+
+2020-05-14 Kohei Yoshida <kohei.yoshida@gmail.com> [8d85b114db23ab12f9b45406eeb22b40460e324f]
+
+ Add method to string_pool to return all interned strings.
+
+
+2020-05-14 Kohei Yoshida <kohei.yoshida@gmail.com> [27e40efba817843461cfa50fff49df9b0ce81794]
+
+ Complete xml_name_t and add some test code for it.
+
+
+2020-05-11 Kohei Yoshida <kohei.yoshida@gmail.com> [1ef150f7602f100bc91d82f590204078afa348d7]
+
+ This file does not exist.
+
+
+2020-05-11 Kohei Yoshida <kohei.yoshida@gmail.com> [96cb30ab1335baf25d455b034dd0c7413e5cedf7]
+
+ Finally, move the handler for yaml_parser into header.
+
+ With this, parser_handlers is no more.
+
+2020-05-11 Kohei Yoshida <kohei.yoshida@gmail.com> [a83b0d48eb1ed5adf4f0b1d7829ee9e5319232da]
+
+ Move the handler for json_parser into public header.
+
+
+2020-05-11 Kohei Yoshida <kohei.yoshida@gmail.com> [a1aa2ea7c67dd974087c9210f38c90d9ea24f5a6]
+
+ Move handler for csv_parser into header space.
+
+
+2020-05-11 Kohei Yoshida <kohei.yoshida@gmail.com> [af5345851f8f6b1320c2cf1ff481944b3bb76d32]
+
+ Move the handler for css_parser into header space.
+
+
+2020-05-11 Kohei Yoshida <kohei.yoshida@gmail.com> [0fac43815e517a4e99bff47861e0f7a6f91ca31a]
+
+ Move the sax parser handlers into proper headers.
+
+ Also move their test codes into src/parser/.
+
+2020-05-08 Kohei Yoshida <kohei.yoshida@gmail.com> [2dd55209efabeb276a744b1e04a0049901ff3327]
+
+ Make sure the read() methods can take mmap'ed streams.
+
+
+2020-05-08 Kohei Yoshida <kohei.yoshida@gmail.com> [a34c4e6e76db222c17741ae61560bb5d13baefad]
+
+ Allow the file processor module file to contain dashes.
+
+
+2020-05-02 Kohei Yoshida <kohei.yoshida@gmail.com> [bdbf7d6c9783c6b987209acdfccfa9c7968be4c0]
+
+ Adjust the test cases to reflect the new xpath parser rule.
+
+
+2020-05-02 Kohei Yoshida <kohei.yoshida@gmail.com> [9e6d8c8041bd55f73c02fa39ec4aa1bf0c9b7eb9]
+
+ Modify the logic of xpath_parser to handle '/@' for attributes.
+
+
+2020-04-29 Kohei Yoshida <kohei.yoshida@gmail.com> [9d0928c7b42345f90ec05e9e2407be6092f2b9d5]
+
+ Add this test to cmake too, but this is completely untested.
+
+
+2020-04-29 Kohei Yoshida <kohei.yoshida@gmail.com> [d40a13e7efbf8bf639140fc4f9772a0bfc6af874]
+
+ Add a test case for attribute.
+
+ This one tests the current incorrect syntax. The correct syntax is
+ coming next.
+
+2020-04-29 Kohei Yoshida <kohei.yoshida@gmail.com> [0d291693005a24253c8e4dfc6461a6c74dea8b73]
+
+ Add test file for xpath_parser.
+
+
+2020-04-29 Kohei Yoshida <kohei.yoshida@gmail.com> [0916a95da9fb60e47c9929f55a7025e5449df290]
+
+ Promote xpath_error into a top-level exception.
+
+
+2020-04-29 Kohei Yoshida <kohei.yoshida@gmail.com> [549af501a72df3ce2e22e039ae9ef8d97e1b9579]
+
+ Move xpath_parser into its own source file.
+
+
+2020-04-29 Kohei Yoshida <kohei.yoshida@gmail.com> [80428da9592e2d7e3446131c57cedee86f1920f0]
+
+ Prepend extra '/' with '@' for attribute nodes.
+
+
+2020-04-28 Kohei Yoshida <kohei.yoshida@gmail.com> [4f0c51e8812e67f5dcfd6b4e9768f93e8633a35e]
+
+ These files no longer exist.
+
+
+2020-04-28 Kohei Yoshida <kohei.yoshida@gmail.com> [a0e65ef7f91a8e54466bdc794e21ae2473588e2c]
+
+ Move this file to the orcus/ml-engine repo.
+
+ Since this module is used primarily for future ML training, it should
+ be in the other repo.
+
+2020-04-28 Kohei Yoshida <kohei.yoshida@gmail.com> [988de1a1122fd93eff2fea622571c79474dfc36e]
+
+ Allow skipping files per regex rules.
+
+ This comes in handy esp. with those files that would otherwise take
+ over 10 minutes to load and/or always end up killing the process due
+ to massive memory usage.
+
+2020-04-28 Kohei Yoshida <kohei.yoshida@gmail.com> [27b9095be1eb319b7ba91e717a35e05d2f7b14d3]
+
+ Introduce a STRING_WITH_ERROR type for string cells containing ...
+
+ ... invalid string values.
+
+2020-04-28 Kohei Yoshida <kohei.yoshida@gmail.com> [0d32a1cedd929f27690de3b0b09a3dfee2f40b99]
+
+ Add a function to find a loader module per specified format type.
+
+
+2020-04-27 Kohei Yoshida <kohei.yoshida@gmail.com> [68de888a42c3be3f7aa6e26ee7b1cf260a149989]
+
+ Get these processor modules to work properly again after the relocation.
+
+
+2020-04-27 Kohei Yoshida <kohei.yoshida@gmail.com> [53b51ec3e2ce2f21a1083beeacb04639bff8dda8]
+
+ You still need this for this module to be executable.
+
+
+2020-04-27 Kohei Yoshida <kohei.yoshida@gmail.com> [aa57f7b04abe62150be6884aa31a4a54a95db4e4]
+
+ Move the file processor code into proper orcus module tree.
+
+
+2020-03-29 Kohei Yoshida <kohei.yoshida@gmail.com> [d85dcbb86a0f51d5b3ed3ab15869cb54c7bd182c]
+
+ Update for the 0.15.4 release.
+
+
+2020-03-29 Kohei Yoshida <kohei.yoshida@gmail.com> [dcec0c56b0a435790fc8e189344a3de9287b1410]
+
+ Reorganize the info a bit.
+
+ Going forward, I'll be using GitLab's releases feature to provide
+ source packages.
+
+2020-03-28 hedmo <hedmoo@yahoo.com> [0d0d06207b1df25e7c855b85bd05a014f2e9f98c]
+
+ Update json_map_tree.cpp
+
+
+2020-03-27 Kohei Yoshida <kohei.yoshida@gmail.com> [da4ebdee489434d8cdbb1b460a9ebcf4583be341]
+
+ Fix make distcheck.
+
+
+2020-03-27 Kohei Yoshida <kohei.yoshida@gmail.com> [c19effb517bd759249c8e42adb0b5598c20c9cb8]
+
+ Clean up the file entries in misc and slickedit...
+
+ ... and remove a project file that we no longer use.
+
+2020-03-27 Kohei Yoshida <kohei.yoshida@gmail.com> [5c28b772124d1a395b5bbd301bbd0178a29cb3ba]
+
+ Remove things that are no longer useful.
+
+
+2020-03-27 Kohei Yoshida <kohei.yoshida@gmail.com> [7d54f256222fa8b208fcb306e21fa00419ddab4b]
+
+ Remove specification and schema files.
+
+
+2020-02-11 Kohei Yoshida <kohei.yoshida@gmail.com> [919b0d2195671fe90427ef22cdc4365129d76fdf]
+
+ Fix the spelling error.
+
+
+2020-02-06 Kohei Yoshida <kohei.yoshida@gmail.com> [4f983a09ec870805558fa2d542cf248722ba90e3]
+
+ Make sure to escape all strings that may potentially contain special chars.
+
+
+2020-02-06 Kohei Yoshida <kohei.yoshida@gmail.com> [fec272625b5876348076136c11a34fd9bf502766]
+
+ Fix the handling of formula cells with error.
+
+
+2020-02-06 Kohei Yoshida <kohei.yoshida@gmail.com> [10cdc98c636dddea2ccffd63af86317a09e14e6c]
+
+ Write xml output by hand.
+
+
+2020-02-05 Kohei Yoshida <kohei.yoshida@gmail.com> [a95bd7c0f784e6a6c316e45ab574046da196e86e]
+
+ Change the name of the special name to include the source file name.
+
+ Also encapculate the code that has dependency on xml.etree.
+
+2020-02-05 Kohei Yoshida <kohei.yoshida@gmail.com> [f7617eee70dd1f69cda08606640941ca2b6bc130]
+
+ Turn off token data generation.
+
+
+2020-02-05 Kohei Yoshida <kohei.yoshida@gmail.com> [22506821a6a129b560374c90a7a56910e3d8310a]
+
+ Stringify the tokens before shoving them to the dom.
+
+
+2020-02-05 Kohei Yoshida <kohei.yoshida@gmail.com> [52385250889c212645d8a5e3ecdd13a6a1c6c6da]
+
+ Directly write xml output files as we process the document files.
+
+
+2020-02-05 Kohei Yoshida <kohei.yoshida@gmail.com> [d51134ea28667b778e3ef82796f9f7993c5f67f0]
+
+ Add names() method that returns a set of named expression names.
+
+
+2020-02-05 Kohei Yoshida <kohei.yoshida@gmail.com> [b4624e9e22e83370f5a03c09b82ab8d8a4cdd3b1]
+
+ Remove 'named_expressions' member from orcus.Sheet.
+
+
+2020-02-05 Kohei Yoshida <kohei.yoshida@gmail.com> [530207c026f836e50a71e0ace0df19e9d9d3a7e0]
+
+ Implement named expressions iterator for sheets.
+
+
+2020-02-04 Kohei Yoshida <kohei.yoshida@gmail.com> [56996749b2b9f47b044c4f67b696871d0ac87ea3]
+
+ Remove named_expressions attribute from orcus.Document.
+
+
+2020-02-04 Kohei Yoshida <kohei.yoshida@gmail.com> [f8ef0f6c388cb37ea69ad37ffb4c021143dc931c]
+
+ No need to pass origin sheet ID.
+
+
+2020-02-04 Kohei Yoshida <kohei.yoshida@gmail.com> [75ac9ac90f533171dd7508a2e228122f4667e7d7]
+
+ Add support for built-in len().
+
+
+2020-02-04 Kohei Yoshida <kohei.yoshida@gmail.com> [0ee17361b4a949794f150fc9c85965abd2a40978]
+
+ Iterator to return a tuple of (name, exp).
+
+
+2020-02-04 Kohei Yoshida <kohei.yoshida@gmail.com> [1d521c1ce07e57e6c2494370dcb6b215ee11c0b5]
+
+ Initial implementation of named expressions iterator.
+
+
+2020-02-04 Kohei Yoshida <kohei.yoshida@gmail.com> [93b89ed1bf7a5166a16ddb052ba078e48b136182]
+
+ Add these files to slickedit project.
+
+
+2020-02-04 Kohei Yoshida <kohei.yoshida@gmail.com> [8971979326c54e6c6138da9e0ba4266c8b0a4852]
+
+ Add an empty implementation for orcus.NamedExpressions.
+
+ I'll fill in the blanks later.
+
+2020-02-04 Kohei Yoshida <kohei.yoshida@gmail.com> [8a00fb47f4725bfcfb5ef8261cdcdfcb213f3b66]
+
+ Remove 'formula_tokens' member from orcus.NamedExpression.
+
+
+2020-02-04 Kohei Yoshida <kohei.yoshida@gmail.com> [308a198461b34a859123dccbd932313db5be1c1e]
+
+ Use formula token iterator for orcus.NamedExpression too.
+
+
+2020-02-04 Kohei Yoshida <kohei.yoshida@gmail.com> [5c1ce9fb60c607a2bbed19768ec928b7141b4944]
+
+ Remove formula_tokens member from orcus.Cell.
+
+
+2020-02-04 Kohei Yoshida <kohei.yoshida@gmail.com> [0001e2dad59e0b6c9695982389742212fef702c4]
+
+ Add a test case for orcus.FormulaTokens iterator.
+
+
+2020-02-04 Kohei Yoshida <kohei.yoshida@gmail.com> [72f469c3321e759a7980c361bec195fe48e53508]
+
+ Support built-in len() method on orcus.FormulaTokens object.
+
+
+2020-02-04 Kohei Yoshida <kohei.yoshida@gmail.com> [b310570ed8a102c7370e3dfd5b390e9e35637247]
+
+ Hook the formula tokens iterator to orcus.Cell.get_formula_tokens().
+
+
+2020-02-04 Kohei Yoshida <kohei.yoshida@gmail.com> [13e177e6d25b6393f3a5a1368b4b643161c68bb8]
+
+ Fill in the blanks. Still not tested.
+
+
+2020-02-04 Kohei Yoshida <kohei.yoshida@gmail.com> [b9759990ebaa1beee5e3fcb34a46d268e0c08844]
+
+ Let's not forget to add these files to slickedit project.
+
+
+2020-02-03 Kohei Yoshida <kohei.yoshida@gmail.com> [da41e0ed2b55b3aa13e4fa6dd6e5296e91773cec]
+
+ Skeleton implementation for orcus.FormulaTokens.
+
+
+2020-02-03 Kohei Yoshida <kohei.yoshida@gmail.com> [6d0d59b42ae864e2aa5cd1fe8f728314bb854e50]
+
+ This is no longer needed.
+
+
+2020-02-03 Kohei Yoshida <kohei.yoshida@gmail.com> [5059e82dca13a7d7deb363099a65e653b05dc3f2]
+
+ Add 'origin' attribute to orcus.NamedExpression type.
+
+
+2020-02-03 Kohei Yoshida <kohei.yoshida@gmail.com> [d49f745fd7d244f2fe04729d3afc4f7a5aebe70c]
+
+ We don't need this.
+
+
+2020-02-03 Kohei Yoshida <kohei.yoshida@gmail.com> [49000b80a6adc3014aa833cd9efaa547842902b9]
+
+ Pick up and store the named expression origins.
+
+ Also, for a sheet-local name, use the index of the respective sheet
+ as the default base sheet.
+
+2020-02-03 Kohei Yoshida <kohei.yoshida@gmail.com> [bacbe35bfc3d5e1a2bc265452025b0e143765b19]
+
+ Adjust the code for named expression change in ixion.
+
+
+2020-02-03 Kohei Yoshida <kohei.yoshida@gmail.com> [d409fbeb79812c1f23a5c4d2034f32add8ab285c]
+
+ Rename sheet_size() to get_sheet_count() for disambiguation.
+
+
+2020-02-03 Kohei Yoshida <kohei.yoshida@gmail.com> [72b6997e22bb25b633f8df8d6ebda47bc09bdb50]
+
+ Make adjustment to recent ixion change.
+
+ Now we need to specify the desired sheet size at document construction
+ time, and that gets applied to all future sheets.
+
+2020-01-31 Kohei Yoshida <kohei.yoshida@gmail.com> [dd264e5e5cd069eeaa4d5295e67fd07d4ba6d6f8]
+
+ New test file including named expressions with relative references.
+
+
+2020-01-31 Kohei Yoshida <kohei.yoshida@gmail.com> [fff1c66f5705b5ccee16672a2a37dd5d5fe9496d]
+
+ Leave UTF-8 strings alone.
+
+
+2020-01-31 Kohei Yoshida <kohei.yoshida@gmail.com> [3e57e1624e431f2b5878e3f1d70dc95026558a08]
+
+ Let's always output in XML. JSON is harder to read for this type of data.
+
+
+2020-01-31 Kohei Yoshida <kohei.yoshida@gmail.com> [a6dd46ecc37e317c23c09058c372c7eace474b82]
+
+ Make XML pretty print optional.
+
+ As it turned out it was very expensive memory-wise.
+
+2020-01-31 Kohei Yoshida <kohei.yoshida@gmail.com> [5242a58334d2f851e38eef09fdbf062f91a00e4f]
+
+ Make token data output optional.
+
+
+2020-01-31 Kohei Yoshida <kohei.yoshida@gmail.com> [8ecb07cabcde5eab02488ce56a00926e132e895d]
+
+ I need to know which batch is being processed at any given moment.
+
+
+2020-01-31 Kohei Yoshida <kohei.yoshida@gmail.com> [eef9f040dc30ec35f88c2ec866f9165d40e70fed]
+
+ Flush the batch each time to reduce memory use.
+
+
+2020-01-30 Kohei Yoshida <kohei.yoshida@gmail.com> [912ac35ad7f2e0eee9ff9fd6d31e0f4f6b1dbd1d]
+
+ Fix the unit test code.
+
+
+2020-01-30 Kohei Yoshida <kohei.yoshida@gmail.com> [98fe315af1e5d268164459f9fbbb2f5531e945c3]
+
+ Use FormulaToken in named expressions and output them.
+
+
+2020-01-30 Kohei Yoshida <kohei.yoshida@gmail.com> [8a3c6bbe56cd641466acf45318ccbbff50b6308c]
+
+ Add this file to slickedit project.
+
+
+2020-01-30 Kohei Yoshida <kohei.yoshida@gmail.com> [8fe79e835d70724a8e601b870128347166ef58a8]
+
+ Apply the error policy to array formula import as well.
+
+
+2020-01-30 Kohei Yoshida <kohei.yoshida@gmail.com> [b4331dd744f6f1dd1a76f99eb03fb3af442d3297]
+
+ Extract formula token types.
+
+
+2020-01-30 Kohei Yoshida <kohei.yoshida@gmail.com> [22fa8fddee2c34ec6a84512fa23457dfb9d3788f]
+
+ Handle formulas with error properly when extracting formulas.
+
+ Also fix a bug on token to string conversion.
+
+2020-01-30 Kohei Yoshida <kohei.yoshida@gmail.com> [526e004cd1e84ff24250105a7f6d54eba3d23ee6]
+
+ Let's create a separate cell type for formula cells with error.
+
+
+2020-01-30 Kohei Yoshida <kohei.yoshida@gmail.com> [1cf1d2d02406ba5fbd48bdbe91726ba57da7c2ca]
+
+ Make sure the error formula tokens are formed as intended.
+
+
+2020-01-30 Kohei Yoshida <kohei.yoshida@gmail.com> [2df3ac4a30e3dee69120f17ccc92e96aa3a60103]
+
+ Add a test case for formula cells with error.
+
+
+2020-01-30 Kohei Yoshida <kohei.yoshida@gmail.com> [21d0e63ff76f8d17092c88fd658df0f1c0e252c6]
+
+ Assign a correct formula token type.
+
+
+2020-01-30 Kohei Yoshida <kohei.yoshida@gmail.com> [4366e29c51d6ad3823226e1f7631c85ce2701226]
+
+ Switch to using orcus.FormulaToken in orcus.Cell.formula_tokens tuple.
+
+
+2020-01-30 Kohei Yoshida <kohei.yoshida@gmail.com> [b86f02a5312e5790a8654d0da7e1df4682fea97d]
+
+ Let's remove this for now.
+
+ There is no internal sharing between Cell and other types, like Sheet,
+ Document, and SheetRows.
+
+2020-01-29 Kohei Yoshida <kohei.yoshida@gmail.com> [f034537b75af40cbd78e16b93d15db828c759856]
+
+ Let's not forget to add these files.
+
+
+2020-01-29 Kohei Yoshida <kohei.yoshida@gmail.com> [841aabdc17ecf1d2de9dec08385ef6d5d3580eaa]
+
+ Create an empty implementation for orcus.FormulaToken type.
+
+
+2020-01-29 Kohei Yoshida <kohei.yoshida@gmail.com> [e2e6a9d94cc32e21756bcf019d77a1e0cbee34b3]
+
+ Use the skip error policy when mass-processing files.
+
+
+2020-01-29 Kohei Yoshida <kohei.yoshida@gmail.com> [306eaa279af48dfc50da3ecb886e7465bb76cf37]
+
+ Expose the error policy option via Python API, ...
+
+ ... and add a test case for it.
+
+2020-01-29 Kohei Yoshida <kohei.yoshida@gmail.com> [c101eeb376e233343209e301330cf066e24f2093]
+
+ Add a test case for importing formula cells with error.
+
+
+2020-01-29 Kohei Yoshida <kohei.yoshida@gmail.com> [16605c2e1f1ee40e6ab405206447091390ff8421]
+
+ Test case with intentionally incorrect formula expressions.
+
+
+2020-01-29 Kohei Yoshida <kohei.yoshida@gmail.com> [adc2a1a8b48f7d24774754c39bab8fba46dc7e47]
+
+ Fix the weird indentation.
+
+
+2020-01-28 Kohei Yoshida <kohei.yoshida@gmail.com> [1b00d2b7b82f6595111fdc676433fa1cbe03a1a3]
+
+ Add a new CLI parameter --error-policy to control formula cell failure.
+
+ * skip to skip the offending cells and keep going.
+ * fail to abort the loading process immediately.
+
+2020-01-27 Kohei Yoshida <kohei.yoshida@gmail.com> [2fad6d6166900d283c8d9396f0de13dc87a70b58]
+
+ Simplify the function a bit.
+
+
+2020-01-27 Kohei Yoshida <kohei.yoshida@gmail.com> [364af279406eaca4c66686777d847dcde0f962ba]
+
+ Extract a function for named expression dictionary population.
+
+
+2020-01-27 Kohei Yoshida <kohei.yoshida@gmail.com> [f003b82fc939127d27e0d8e23ddcc4aab68f8838]
+
+ Populate sheet-local named expressions dict.
+
+
+2020-01-27 Kohei Yoshida <kohei.yoshida@gmail.com> [7713f4bf391ca93e5dfea6e4955cdff42ccfc4f5]
+
+ Populate the global named expressions dict.
+
+
+2020-01-27 Kohei Yoshida <kohei.yoshida@gmail.com> [47608118eefa742e90b4c9d21ba18b8872622d87]
+
+ Adjust for the recent ixion change.
+
+
+2020-01-25 Kohei Yoshida <kohei.yoshida@gmail.com> [879a8231c163345bcb37936012745992a2b529f1]
+
+ Add a function to create named expression objects. Not used yet.
+
+
+2020-01-24 Kohei Yoshida <kohei.yoshida@gmail.com> [d55d40f315f15adf537c163f2250fc7937058c7a]
+
+ Add a boilerplate code for orcus.NamedExpression.
+
+
+2020-01-24 Kohei Yoshida <kohei.yoshida@gmail.com> [50a908fa8ded8c0ded4eccd0bb7df7e71f0f06bc]
+
+ Update this constant variable name.
+
+
+2020-01-24 Kohei Yoshida <kohei.yoshida@gmail.com> [b00ade78025378e3f5477f7fc78c638e10e9a0e1]
+
+ Create a dedicated context to handle (or ignore) table:dde-links tree.
+
+
+2020-01-23 Kohei Yoshida <kohei.yoshida@gmail.com> [bb2cbe1e46b8e918142fee76c27c295ff1ae3300]
+
+ I forgot those breaks.
+
+
+2020-01-23 Kohei Yoshida <kohei.yoshida@gmail.com> [0850f1b2f67c53ad236c92a76b4d4610a60065f9]
+
+ Import sheet-local named ranges and expressions as well.
+
+ And add the file to the tested file list.
+
+2020-01-23 Kohei Yoshida <kohei.yoshida@gmail.com> [ec8b2767a26b027925fe8a57b753658b8546fa09]
+
+ Add this file to the list of tested files.
+
+
+2020-01-23 Kohei Yoshida <kohei.yoshida@gmail.com> [29b1ded97dbf2e0bd835c4f3243d40d426eb09e6]
+
+ Pick up named expressions as well. Not yet tested.
+
+
+2020-01-23 Kohei Yoshida <kohei.yoshida@gmail.com> [79265813bb074bf7dcee616fc16cd5124edf3847]
+
+ Add named-range to the list of tested ods files.
+
+
+2020-01-23 Kohei Yoshida <kohei.yoshida@gmail.com> [d052efd831f0181f30af64acd28dff1379f098a6]
+
+ Finally manage to import global named ranges from ods.
+
+ Not tested yet & sheet-local named ranges or expresions are to be
+ worked on later.
+
+2020-01-22 Kohei Yoshida <kohei.yoshida@gmail.com> [0a92a7a74e2b57676e3fc98afcf2767a2aaf7b37]
+
+ Add another named expression to clarify its syntax.
+
+ It looks as though it uses ODFF syntax without the 'of:' prefix for
+ named-expression, whereas named-range it uses something else...
+
+2020-01-22 Kohei Yoshida <kohei.yoshida@gmail.com> [fc883366a14f144673320f126c916f7742c927e3]
+
+ Update the test doc to add another named expression with references.
+
+
+2020-01-22 Kohei Yoshida <kohei.yoshida@gmail.com> [2b9c1f101b61c1c8ac47e5a28b15c9b103871eab]
+
+ Let's not forget destructor here.
+
+
+2020-01-22 Kohei Yoshida <kohei.yoshida@gmail.com> [7283d207bdff64da76d0915931a6b44e209c062e]
+
+ Attempt to import global named expressions.
+
+ It fails on e.g. '.E1:.F5' type of range reference which is not exactly
+ a Calc A1 flavor.
+
+2020-01-22 Kohei Yoshida <kohei.yoshida@gmail.com> [7ffe1b993f964fd89c99120ae0f552d2bfd9e22e]
+
+ Don't forget to switch reference context.
+
+
+2020-01-22 Kohei Yoshida <kohei.yoshida@gmail.com> [8ce8d0ebfaf017e5a6be0045c88248bdc48bb892]
+
+ Defer the base address resolution until the very end.
+
+ But before processing the formula cell strings which rely on the named
+ expressions being populated.
+
+2020-01-22 Kohei Yoshida <kohei.yoshida@gmail.com> [44201237bcb27e239a1f59c47d1b2dc73891d4de]
+
+ Reference resolver to return src (sheet-row-column) addresses.
+
+
+2020-01-22 Kohei Yoshida <kohei.yoshida@gmail.com> [d791d99447bdf8d1825d94f593312daf05ed45d6]
+
+ Pick up named ranges and store them for later processing.
+
+
+2020-01-22 Kohei Yoshida <kohei.yoshida@gmail.com> [300bcbbef3677dd95baaccd4f3846078ed964417]
+
+ Keep track of current sheet scope.
+
+ Mostly so that we know when we are NOT in a sheet scope.
+
+2020-01-22 Kohei Yoshida <kohei.yoshida@gmail.com> [c03d5528b279176b2e99671e82a0cccc159852a6]
+
+ Adjust the import_named_expression interface ...
+
+ ... to prepare for importing an optional base position parameter.
+
+2020-01-22 Kohei Yoshida <kohei.yoshida@gmail.com> [b546990b8a7b95ff759b6c335d5bbc34fc567696]
+
+ Use different resolver type for parsing named expression strings.
+
+
+2020-01-22 Kohei Yoshida <kohei.yoshida@gmail.com> [e378f483ecc15e6fc4ab3f64f5266d1f7e53e99b]
+
+ Introduce the concept of formula reference context.
+
+ This is meant to primarily serve the ODS format where it uses different
+ formula reference grammar for named expressions and possibly others.
+
+2020-01-21 Kohei Yoshida <kohei.yoshida@gmail.com> [afdf5526dd7c33ab9a75c0558c86315d244a01fb]
+
+ Set up a skeleton for future handling of named ranges.
+
+
+2020-01-21 Kohei Yoshida <kohei.yoshida@gmail.com> [5db518a58058c0d1c2131658da9ff3b6da1e3e4f]
+
+ Consistent styles...
+
+
+2020-01-21 Kohei Yoshida <kohei.yoshida@gmail.com> [42368e821fd422b625203ae82e011a2132965157]
+
+ Let's use std::deque over std::vector<std::unique_ptr<...>>.
+
+
+2020-01-21 Kohei Yoshida <kohei.yoshida@gmail.com> [9fa143cb9b1ececb65b2d018d0b20bc06ef77778]
+
+ Style names can be transient esp. when the name contains encoded chars.
+
+
+2020-01-21 Kohei Yoshida <kohei.yoshida@gmail.com> [8a573a4395a12c3754fa4166b21e05d7b20323df]
+
+ Add a few test files containing named ranges and expressions.
+
+
+2020-01-17 Kohei Yoshida <kohei.yoshida@gmail.com> [24413fd27908fd9abdefcba4cd302fa319c0f8a9]
+
+ Add a batch mode to split the output into a set of more manageable size outputs.
+
+
+2020-01-16 Kohei Yoshida <kohei.yoshida@gmail.com> [d5ebaae3d478931fd83428b46470844fb060965e]
+
+ Add sheet and formula counts to the output tree as attributes.
+
+
+2020-01-16 Kohei Yoshida <kohei.yoshida@gmail.com> [ef6cefd15c91b6ef99eddbbfa4b0bc7bf130836f]
+
+ Support xml output option.
+
+
+2020-01-16 Kohei Yoshida <kohei.yoshida@gmail.com> [4d52d320068d30777206eb25cfc99989108532fb]
+
+ Add code to aggregate all formula data into a single file.
+
+ It's in json format for now. I will probably add XML as an option.
+
+2020-01-16 Kohei Yoshida <kohei.yoshida@gmail.com> [926a8fad22bbc9223f8d147dd471f99a3516f482]
+
+ Add a new processor module to extract formula expression data.
+
+
+2020-01-16 Kohei Yoshida <kohei.yoshida@gmail.com> [820ea373618710defdc7df802e0e5d3f5098a236]
+
+ Adjust process-files.py to orcus.Cell objects & user processor module.
+
+ The processor module is responsible for processing each document loaded.
+
+2020-01-16 Kohei Yoshida <kohei.yoshida@gmail.com> [844cd6355f01466e3c8100524bea3cf56aa5fda3]
+
+ Move the XML token related files into their own directory.
+
+
+2020-01-15 Kohei Yoshida <kohei.yoshida@gmail.com> [7987b4590cb8d7bda08f23b1ac0a2a2a87662f35]
+
+ Add test case for python's detect_format() function.
+
+
+2020-01-15 Kohei Yoshida <kohei.yoshida@gmail.com> [88fb5befd4e7ed5292eed0aa2eb71a0b4e061893]
+
+ Add a tuple of individual tokens to the Cell class.
+
+
+2020-01-15 Kohei Yoshida <kohei.yoshida@gmail.com> [ee5e9b9f11ddb95984c3c53e21d93020b116e10b]
+
+ Have detect_format() return an enum FormatType value instead of a string.
+
+
+2020-01-15 Kohei Yoshida <kohei.yoshida@gmail.com> [da8c1beeb6ca4ce7cea62a78ff56d40329bef27f]
+
+ Get make check to pass again.
+
+
+2020-01-15 Kohei Yoshida <kohei.yoshida@gmail.com> [d243f7435537695b0780e8a1cdc9b5b5a32fad27]
+
+ Specify type during cell object creation.
+
+
+2020-01-15 Kohei Yoshida <kohei.yoshida@gmail.com> [d2fd8978657511492d9e6afc1d726267595c1b6f]
+
+ Convert formula cells, and add 'formula' member to orcus.Cell.
+
+
+2020-01-14 Kohei Yoshida <kohei.yoshida@gmail.com> [99fef3d152a6bf654d74946eb065cbcb473e9396]
+
+ Convert numeric cells to use orcus.Cell.
+
+
+2020-01-14 Kohei Yoshida <kohei.yoshida@gmail.com> [344b62e70bf99842b43782234a9fd6f5451021ce]
+
+ Start replacing cell tuple objects with objects of orcus.Cell type.
+
+ So far I've covered empty, boolean and string cells.
+
+2020-01-14 Kohei Yoshida <kohei.yoshida@gmail.com> [bf21c15798817fc088c64f5fdb21037d9ea10549]
+
+ Add 'type' member to the Cell class. For now, it stays UNKNOWN.
+
+
+2020-01-14 Kohei Yoshida <kohei.yoshida@gmail.com> [5a86560a328288d8c24ac3be68da469d735ae1b6]
+
+ Remove repeated code blocks.
+
+
+2020-01-14 Kohei Yoshida <kohei.yoshida@gmail.com> [dc952f7b9305d422cdaf6690c05ef456c041c45c]
+
+ Create a skeleton for orcus.Cell python class.
+
+
+2020-01-14 Kohei Yoshida <kohei.yoshida@gmail.com> [ac14469afcd86a81ac7f7a6e58dc410b376bfdff]
+
+ Support valgrind as run-mode.
+
+
+2020-01-14 Kohei Yoshida <kohei.yoshida@gmail.com> [7c11e930f64326ad9710027d723a468dc61fce36]
+
+ Fix memory leak.
+
+ Also keep the number_formatting_style instance within the context
+ instance, since it's only used within it.
+
+2020-01-13 Kohei Yoshida <kohei.yoshida@gmail.com> [f627a4df1f498ec9a1c2bd7223c1e2f89896ccba]
+
+ Handle attribute without namespace correctly.
+
+ c.f. https://www.w3.org/TR/REC-xml-names/#defaulting
+
+ When an element name does not have an explicit namespace, it takes
+ the current default namespace (if one is defined). An attribute name,
+ on the other hand, do NOT use the current default namespace when it
+ does not have an explicit namespace given; the decision should be up
+ to the element it belongs to, according to the above specification.
+
+ This issue mostly affects those ods and xlsx files generated by 3rd
+ party software that makes liberal use of default namespaces.
+
+2020-01-13 Kohei Yoshida <kohei.yoshida@gmail.com> [9a878b9c6966d2f219d3fbd7865bb8cadf025959]
+
+ Display current row.
+
+
+2020-01-13 Kohei Yoshida <kohei.yoshida@gmail.com> [d0bce251005f69c2b999089654eb0f0460cd61bf]
+
+ Ensure that it's a row style before accessing its union data member.
+
+
+2020-01-13 Kohei Yoshida <kohei.yoshida@gmail.com> [10b7b347eddb328c74263f34f7e0f23bd8c121da]
+
+ table:table element may occur under table:dde-link as well.
+
+ In which case the element may not have a 'name' attribute.
+
+2020-01-13 Kohei Yoshida <kohei.yoshida@gmail.com> [524ba0e3d16069361465e1269b880676951707a6]
+
+ Explicitly check the element namespace.
+
+
+2020-01-13 Kohei Yoshida <kohei.yoshida@gmail.com> [e50fd76d23e2646ed6ccd6e5e39dd8fe1e558e27]
+
+ Bail out on empty sheet names.
+
+
+2020-01-11 Ryo ONODERA <ryo@tetera.org> [7d2ae0b6e47aa0c1fc43a91300d82c5394420162]
+
+ Improve POSIX shell portability
+
+ DO not use bash syntax.
+
+2020-01-10 Kohei Yoshida <kohei.yoshida@gmail.com> [76084ea9f2db98c2786756f484eb394430e56387]
+
+ Handle attribute values with encoded chars surrounded by single quotes.
+
+
+2020-01-10 Kohei Yoshida <kohei.yoshida@gmail.com> [876421904797a1c2a87cd4c2514da24c11d06b2a]
+
+ Zero is zero even after the conversion.
+
+
+2020-01-10 Kohei Yoshida <kohei.yoshida@gmail.com> [17e5ed79d5f5aed9acaf613bc87dd1b5f9190709]
+
+ Use lambda function over old-style function object.
+
+
+2020-01-10 Kohei Yoshida <kohei.yoshida@gmail.com> [d2e983e7d430c5342515abb202079f40eb287858]
+
+ table-column can occur under table-columns.
+
+ Also replace the use of xml_elem_stack_t with xml_elem_set_t in its
+ vicinity.
+
+2020-01-10 Kohei Yoshida <kohei.yoshida@gmail.com> [d4099cbc05dfd9afd953dda6ff9fb631218122f6]
+
+ Gracefully fail formula registration for now.
+
+
+2020-01-10 Kohei Yoshida <kohei.yoshida@gmail.com> [273cb53ddb125d2dee017334f1d0146b8aa53377]
+
+ A little code cleanup.
+
+
+2020-01-10 Kohei Yoshida <kohei.yoshida@gmail.com> [f08fb8b4c383e3b60e2e6a9827f91297665a89fd]
+
+ There may be multpile pivot caches for the same worksheet range.
+
+
+2020-01-10 Kohei Yoshida <kohei.yoshida@gmail.com> [ca8fc729429f2a99308463b55f04f655f8fb211f]
+
+ Sometimes multiple pivot caches get created for the same table name.
+
+
+2020-01-10 Kohei Yoshida <kohei.yoshida@gmail.com> [5c88fdfb5c8fb3420a6e87ecfabd4a62d9881b9c]
+
+ Support importing of pivot caches associated with table names.
+
+
+2020-01-09 Kohei Yoshida <kohei.yoshida@gmail.com> [41fc4843dbb6dacd8edac2740e0fb27a82002daf]
+
+ Turns out sometimes we will find empty namespace values in the wild.
+
+
+2020-01-09 Kohei Yoshida <kohei.yoshida@gmail.com> [df637055a4d3efdd97265833a8ca12a73a17067d]
+
+ More on updating the expectations of the XML structure.
+
+
+2020-01-09 Kohei Yoshida <kohei.yoshida@gmail.com> [318d2de4a71a4cb02e379c5672b7710185d1bd29]
+
+ Add another anchor type to the list of expected parents.
+
+
+2020-01-09 Kohei Yoshida <kohei.yoshida@gmail.com> [7117abc0e679634d60947c9299d96541c60fb69d]
+
+ More on updating the expected XML structure in xlsx contexts.
+
+
+2020-01-08 Kohei Yoshida <kohei.yoshida@gmail.com> [2af9df2f5bedfc63cbbd6e0b29802bf620589aa4]
+
+ Always allow markup compatibility related elements.
+
+
+2020-01-08 Kohei Yoshida <kohei.yoshida@gmail.com> [6bf51b2d6a3d81f28a6011b38f9332db681bde10]
+
+ Update the OOXML tokens list to include OOXML MC tokens.
+
+
+2020-01-08 Kohei Yoshida <kohei.yoshida@gmail.com> [ac58a5d0302986a3f0b070280efb93224dd64469]
+
+ Allow extra tokens to be added to the list.
+
+ This is to add the extra token names used by OOXML markup compatibility
+ and extensibility framework.
+
+2020-01-08 Kohei Yoshida <kohei.yoshida@gmail.com> [47cb4dc2ac3bd0b7967e692a42d029d163808033]
+
+ Turns out I don't make use of schema types.
+
+
+2020-01-08 Kohei Yoshida <kohei.yoshida@gmail.com> [f8e6e5e8deb4184dc8c7756de1eba20c6f9c8ee5]
+
+ Update this python code to today's standard, in full on Python 3.
+
+
+2020-01-08 Kohei Yoshida <kohei.yoshida@gmail.com> [8b8f4c290088193da8835fe7ed4cb78eee24ff93]
+
+ Let's be explicit about the namespaces.
+
+
+2020-01-08 Kohei Yoshida <kohei.yoshida@gmail.com> [41b5ddbd8179f25e5a9857ac38f4b66de6952981]
+
+ cfRule may contain a formula element.
+
+
+2020-01-08 Kohei Yoshida <kohei.yoshida@gmail.com> [d7ed99bbac03897e99dab4e7fbf4e95c234676b0]
+
+ Update the expected parent element rules.
+
+ cxnSp element represents a connection shape.
+
+2020-01-06 Kohei Yoshida <kohei.yoshida@gmail.com> [9b5592fde0ec5f03ef04caa2070944d66d5a643c]
+
+ Add another test case for python ods API.
+
+
+2020-01-06 Kohei Yoshida <kohei.yoshida@gmail.com> [166c43c323017f62f9b99627305cd2f09ef57345]
+
+ Add more test cases for the Python API on xlsx.
+
+
+2020-01-06 Kohei Yoshida <kohei.yoshida@gmail.com> [2c7a7ca0145f82e8e3106d93101408bb804bac45]
+
+ Make sure the test documents load fine without recalc turned on.
+
+
+2020-01-06 Kohei Yoshida <kohei.yoshida@gmail.com> [45a39e0b85dd3ba22b376618e764cbacea17a68a]
+
+ Enable Git LFS.
+
+
+2020-01-06 Kohei Yoshida <kohei.yoshida@gmail.com> [e091bddd728acaf434ea8b0e90e5fb7f5a80f5b5]
+
+ Set dummy cached results for array formulas when not doing recalc.
+
+
+2020-01-06 Kohei Yoshida <kohei.yoshida@gmail.com> [65d5c4d2a46f31cebba2642f4504f211f2389f8e]
+
+ Add variant of set_grouped_formula() that takes cached results.
+
+
+2020-01-06 Kohei Yoshida <kohei.yoshida@gmail.com> [871853b4770b277103f3e0b8898ce101c94f7831]
+
+ Let's not forget to handle the result value here too.
+
+
+2020-01-06 Kohei Yoshida <kohei.yoshida@gmail.com> [2412f96e5ceb9457b407ea1b5e3f9ceb73eb4647]
+
+ Tiny cleanup.
+
+
+2020-01-03 Kohei Yoshida <kohei.yoshida@gmail.com> [43c9bfaabd911cb41ecd43aa6fef47f3dd8a9b9b]
+
+ Add a 'recalc' argument to python's read() function for all format types.
+
+ It's optional and False by default. The current test code has to set it
+ to True in order for some of the python unit test cases to pass.
+
+2020-01-03 Kohei Yoshida <kohei.yoshida@gmail.com> [291300d00b76a8e97ef35a5ec0744a128f04b43f]
+
+ Prepare for parsing multiple arguments from python's stream read function.
+
+ For now it's still handling the only argument that is 'stream'.
+
+2020-01-03 Kohei Yoshida <kohei.yoshida@gmail.com> [c3600293b2ee0e9dafa604269622c7ecdc6979ab]
+
+ The correct place to set the recalc mode on.
+
+ This is in line with what the CLI versions do.
+
+2020-01-03 Kohei Yoshida <kohei.yoshida@gmail.com> [fe5567faa69442222f53ad58239b11e24ba9d373]
+
+ Re-word the method doc.
+
+
+2020-01-03 Kohei Yoshida <kohei.yoshida@gmail.com> [1fea71f26fe2a52c0c57437989665bcfbf03b665]
+
+ recalc_formula_cells() do not need to be virtual.
+
+
+2020-01-03 Kohei Yoshida <kohei.yoshida@gmail.com> [896f4d91ae207f231d8e45a97cfbeff4dc9691c8]
+
+ Move the recalc-on-load flag to the import factory class.
+
+
+2020-01-03 Kohei Yoshida <kohei.yoshida@gmail.com> [40560c08fc2de7b5e85284f42240d684e017bc87]
+
+ Prepare for setting formulas with cached results.
+
+ And up the required ixion API version to 0.16 going forward.
+
+2020-01-03 Kohei Yoshida <kohei.yoshida@gmail.com> [483e96aae13bd6d2e3b152eef78d44220cc38340]
+
+ We definitely broke API compat. Up the API version.
+
+ It's based on what `git diff -r 1.5.3 -- include` says.
+
+2020-01-03 Kohei Yoshida <kohei.yoshida@gmail.com> [68d0e25e73e019b229aabaee221bac01e7dcf939]
+
+ Up the required ixion version & set the version up to 0.15.99.
+
+
+2020-01-03 Kohei Yoshida <kohei.yoshida@gmail.com> [dd9b13ab30cd2661e8602c91281d71974c12270f]
+
+ We don't need this extra flag as a loader configuration option.
+
+ It's strictly an option with the document store, and the loader should
+ only focus on importing formula cell contents as stored in the file.
+
+2020-01-03 Kohei Yoshida <kohei.yoshida@gmail.com> [5533905cae4bbd524723fc5cba83d3e78467b3c9]
+
+ Make the recalculation of formula cells off by default.
+
+
+2020-01-03 Kohei Yoshida <kohei.yoshida@gmail.com> [a19030ac2a752998a83bb7436524341b08601135]
+
+ Let's make this flag a boolean type.
+
+ Not sure why I used uint16_t originally, but seems to make little sense.
+
+2020-01-03 Kohei Yoshida <kohei.yoshida@gmail.com> [af736e5884494715a662fde697b2b96af5692bd9]
+
+ Introduce a recalc-on-load option. Not used yet.
+
+
+2019-12-20 Kohei Yoshida <kohei.yoshida@gmail.com> [5f1f1f942fc22d5c0f2a07847c7a7f0dbc2cb076]
+
+ Print ratios only when the total > 0.
+
+
+2019-12-20 Kohei Yoshida <kohei.yoshida@gmail.com> [419ad871c484bc4c428526b160ad5ebcb27e860e]
+
+ Handle documents containing DDE links.
+
+
+2019-12-20 Kohei Yoshida <kohei.yoshida@gmail.com> [175e097f7757e7cff5ba2b4edd8ff2af4101399b]
+
+ table:table-column can occur under table:table-header-columns.
+
+
+2019-12-20 Kohei Yoshida <kohei.yoshida@gmail.com> [f277f9433f40df8724e1fcb59a36b813cd667b6b]
+
+ table:table-row can occur under table:table-header-rows.
+
+
+2019-12-20 Kohei Yoshida <kohei.yoshida@gmail.com> [43429a2acf4da9c00b0cc8584fdc87db1676ee17]
+
+ Correctly handle file names with spaces in them.
+
+
+2019-12-20 Kohei Yoshida <kohei.yoshida@gmail.com> [b5c6d7ab7ca06b250f7cafa0b7bb57f130dd4a4c]
+
+ text-properies may occur under text:list-level-style-bullet too.
+
+
+2019-12-20 Kohei Yoshida <kohei.yoshida@gmail.com> [b1668ffdb150f8dbef98598999f3e8f374d8390e]
+
+ text-properies may occur under text:list-level-style-number.
+
+ But let's not handle it in such cases just yet.
+
+2019-12-20 Kohei Yoshida <kohei.yoshida@gmail.com> [669275c2ed423e1e5f1ddaee371e770820aaf26d]
+
+ Add separate method for handling text-properties element.
+
+
+2019-12-20 Kohei Yoshida <kohei.yoshida@gmail.com> [105721af0a2782932b2e2f661107274a9389fb78]
+
+ table:column and table:row can occur under table:table-column-group and table:table-row-group.
+
+
+2019-12-20 Kohei Yoshida <kohei.yoshida@gmail.com> [bffaed71aded56cfab6174a77430fc65c7afef85]
+
+ Use bool_switch to handle boolean flags.
+
+
+2019-12-19 Kohei Yoshida <kohei.yoshida@gmail.com> [c7fc7ff7fe746257ff17ae549daf84d7577153ad]
+
+ Prevent exception here.
+
+
+2019-12-19 Kohei Yoshida <kohei.yoshida@gmail.com> [0652056d3b899cc9dbf43f0e409d1699c8193e47]
+
+ Re-org slickedit workspace structure and add python and shell scripts.
+
+
+2019-12-18 Kohei Yoshida <kohei.yoshida@gmail.com> [f3b2401c30574c7eb68bf292a7d2c40b1523e413]
+
+ Add option to display some simple stats of the results.
+
+
+2019-12-18 Kohei Yoshida <kohei.yoshida@gmail.com> [8276274b896b980e660767d62b21535e834decb4]
+
+ Add option to remove result files from a directory tree.
+
+
+2019-12-18 Kohei Yoshida <kohei.yoshida@gmail.com> [0dee2bae66ef8f8f9b2bae0d2fdad5d173eed219]
+
+ Fix run-python.sh to correctly pass arguments to executable.
+
+
+2019-11-25 Kohei Yoshida <kohei.yoshida@gmail.com> [7d65474b3e5dd1aa8e8cf2bda30b07b286696142]
+
+ Use the name resolver owned by the document.
+
+ Now all tests do pass.
+
+2019-11-25 Kohei Yoshida <kohei.yoshida@gmail.com> [0244ee76d696bf797d4f3de8317631df9a93438f]
+
+ Store formula expression strings in sheet_rows objects.
+
+ TODO: test/python/xls_xml.py still fails. I'll fix this later.
+
+2019-11-25 Kohei Yoshida <kohei.yoshida@gmail.com> [37f4c910268834982b09e9b0f5035c9a9732dca4]
+
+ Include cell types when iterating over sheet cells via Python API.
+
+
+2019-11-22 Kohei Yoshida <kohei.yoshida@gmail.com> [91c51ebe1152f40bafdf1cdfcf2380f6e8785a8f]
+
+ Add a mechanism to parse and display the results of processed files.
+
+
+2019-11-22 Kohei Yoshida <kohei.yoshida@gmail.com> [b19a5c4a5c11730b9c48d2c23b9cda44a9257bf2]
+
+ Capture and cache the results of file processing.
+
+
+2019-11-20 Kohei Yoshida <kohei.yoshida@gmail.com> [9f5a366ef15abd6db13ddce1103900da598394e6]
+
+ Add file count to its output.
+
+
+2019-11-20 Kohei Yoshida <kohei.yoshida@gmail.com> [a705557292695ebca3399837dc26c2adb62b275d]
+
+ Sometimes the count attribute is not present.
+
+ In which case, let's not set the count value to avoid segfault.
+ This resolves #102.
+
+2019-11-20 Kohei Yoshida <kohei.yoshida@gmail.com> [2babdbbf7fc59015c4ec6b4892bf28a6be8dd709]
+
+ More on properly managing object's references.
+
+
+2019-11-19 Kohei Yoshida <kohei.yoshida@gmail.com> [32de9c6e36a408476bfd27687d3d53e56b137227]
+
+ Stop another memory leak, for the same reason as the previous one.
+
+
+2019-11-19 Kohei Yoshida <kohei.yoshida@gmail.com> [8e2bf85e492497d376869d3b07272f7bbf10d537]
+
+ Stop memory leak.
+
+ Turns out PyTypeObject.tp_new returns a new object with ref count of
+ 1. No need to increment its ref count before returning it to the caller.
+
+2019-11-19 Kohei Yoshida <kohei.yoshida@gmail.com> [5efa585de8b2a8f5180f6cc63f82f2e8f04c3676]
+
+ Add a test case for the threaded sax parser.
+
+ This one covers a use case where an exception gets thrown in the
+ main thread.
+
+2019-11-19 Kohei Yoshida <kohei.yoshida@gmail.com> [67098c70a27db3455d371c35da1b7e198aacfa24]
+
+ Abort the parsing thread when the main thread throws an exception.
+
+
+2019-11-19 Kohei Yoshida <kohei.yoshida@gmail.com> [ec768684aaa7c80329dd2a259b622952f28d6c58]
+
+ Turn the parsing state from boolean to tri-state.
+
+ To introduce an abort state.
+
+2019-11-19 Kohei Yoshida <kohei.yoshida@gmail.com> [480da2bc87caad82eca0df71a61b2e7d281b9f59]
+
+ Process parse error tokens and add a test case for it.
+
+
+2019-11-19 Kohei Yoshida <kohei.yoshida@gmail.com> [97400cf0ee524251ba47db6f44643d94776e1537]
+
+ Catch and tokenize parse error exceptions.
+
+
+2019-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [baf9d57db281961598964a9ac66b57dc0ec83a2f]
+
+ Call ixion::init() only once per process.
+
+
+2019-11-15 Kohei Yoshida <kohei.yoshida@gmail.com> [0be01f52df54c972bd2d9e37cea54ed14237aa46]
+
+ Don't forget to initialize ixion.
+
+
+2019-11-15 Kohei Yoshida <kohei.yoshida@gmail.com> [91467b2a4d0944372db941683a8cf261959220c6]
+
+ Display the exception name.
+
+
+2019-11-15 Kohei Yoshida <kohei.yoshida@gmail.com> [fee0b10900d32833efe8b41fd04af91af2145aa4]
+
+ Catch exception and keep going.
+
+
+2019-11-15 Kohei Yoshida <kohei.yoshida@gmail.com> [e8ab49ea0330991d118320593afc89b651eb35ae]
+
+ Catch C++ exception and translate it to a python one.
+
+
+2019-11-14 Kohei Yoshida <kohei.yoshida@gmail.com> [3a6a91248d2946e53100e83e1af26cb0a6815308]
+
+ Load the document and dump its content.
+
+
+2019-11-14 Kohei Yoshida <kohei.yoshida@gmail.com> [e39fce08e085606ea6cfbd0307727d7dba565d9d]
+
+ Use std::unique_ptr to manage stream PyObject instances.
+
+
+2019-11-14 Kohei Yoshida <kohei.yoshida@gmail.com> [5a392910badf1d10b8419f01c3db6ceb04f02e58]
+
+ Let's not forget to delete the bytes object when finished.
+
+
+2019-11-14 Kohei Yoshida <kohei.yoshida@gmail.com> [932d1344bf2e73f1f852d64372c4d55c45bcf7d9]
+
+ Add orcus.detect_format python function & use it from process-files.py.
+
+ Also, try to treat the object as bytes if possible, in case it's not a
+ buffer object with read() method.
+
+2019-11-14 Kohei Yoshida <kohei.yoshida@gmail.com> [facaa9b00815467b6d22ab4a2f8d1bcd09b42cbe]
+
+ Recursively traverse files from a root directory.
+
+ It's still a skeleton. More to come.
+
+2019-11-13 Kohei Yoshida <kohei.yoshida@gmail.com> [b4107089e21e3aa106c92f4125f09013a807d639]
+
+ Annotate the code a bit.
+
+
+2019-11-12 Kohei Yoshida <kohei.yoshida@gmail.com> [1074b47d72561ca6783142ddd5a46d938c97e611]
+
+ Use thread pool to speed up the fetching of the attachments.
+
+
+2019-11-12 Kohei Yoshida <kohei.yoshida@gmail.com> [511b6e30e0ae4d0bef5eec6ff52478cb023b53ff]
+
+ Abstract away the bugzilla URL, and add --limit parameter.
+
+
+2019-11-12 Kohei Yoshida <kohei.yoshida@gmail.com> [153ddaf75a843884f45fbec393594047ecf7ed46]
+
+ Manage to download the attachments for real.
+
+ Also cache the response contents from the remote server, to prevent
+ us from hitting it too frequently.
+
+2019-11-11 Kohei Yoshida <kohei.yoshida@gmail.com> [a5afbefd3963f3e15a5f8e20d57682b8912fcb49]
+
+ Start a script that uses TDF's bugzilla API to get a list of bug ID's.
+
+ Eventually we want to download all attachments, but this is just a
+ starter...
+
+2019-11-11 Kohei Yoshida <kohei.yoshida@gmail.com> [af5a3d424efebcf61f3725e70dc14502fa7947f1]
+
+ Remove now pointless wrapper scripts.
+
+ Use libtool directly on the executables instead.
+
+2019-10-09 Kohei Yoshida <kohei.yoshida@gmail.com> [15c02dd7f5c9f9e68e260cddf4c99b7dea5392bf]
+
+ Add the URL's to the 0.15.3 packages.
+
+
+2019-10-09 Kohei Yoshida <kohei.yoshida@gmail.com> [1a58f64290b2d1297728dcdc117085fbf312c95a]
+
+ Fix make distcheck.
+
+
+2019-10-09 Kohei Yoshida <kohei.yoshida@gmail.com> [2e3830798a727cefd826ee2d33ecdfb897db72e4]
+
+ Up the version to 0.15.3.
+
+
+2019-10-08 Kohei Yoshida <kohei.yoshida@gmail.com> [9f1bf9327520b1d738c77e8743c393f8f4737842]
+
+ I think I'll just do a release next. Let's close the change log.
+
+
+2019-10-08 Kohei Yoshida <kohei.yoshida@gmail.com> [a84c31bc78c28b5d110e2586a7e475be3182bc35]
+
+ Add this to CHANGELOG.
+
+
+2019-10-08 Kohei Yoshida <kohei.yoshida@gmail.com> [85edd04198e531797d978f4110d471059a9dbe96]
+
+ Use the closest row group element as the anchor element.
+
+ And finally add the latest test case to the list of auto-tested cases.
+
+2019-10-08 Kohei Yoshida <kohei.yoshida@gmail.com> [710ced8945f3400695d8b73a93e61f333b7741b6]
+
+ It's no longer necessary to track common range parent with data member.
+
+ All of that happens only within the commit() call. A local variable will
+ do just fine.
+
+2019-10-08 Kohei Yoshida <kohei.yoshida@gmail.com> [4b6c11295b037d20cf84881b1bad8a30d47df7a0]
+
+ mp_cur_range_ref is no longer necessary.
+
+
+2019-10-08 Kohei Yoshida <kohei.yoshida@gmail.com> [78a0258d470b3fe078ff5bd6ba64aa824c2f3e03]
+
+ Pass the position to start_range(), and not pass it to the rest of the methods.
+
+ The API looks a bit cleaner this way. Plus now it makes more sense.
+
+2019-10-07 Kohei Yoshida <kohei.yoshida@gmail.com> [1ad2b4c173076b233c50553ed03d52f65f58d93a]
+
+ Delay the insertion of range field links until the commit_range() call.
+
+ This ensures that by the time we are ready to insert the range field
+ links, all of the range row groups have been inserted.
+
+2019-10-07 Kohei Yoshida <kohei.yoshida@gmail.com> [bbc53ea0bf38babc85c90b311e021ca2fb34b9ec]
+
+ Add a test case that currently fails to work properly.
+
+
+2019-10-07 Kohei Yoshida <kohei.yoshida@gmail.com> [3ad78536f1ac85e6b4d9818baf6f19a7e6e4b936]
+
+ Add this item.
+
+
+2019-10-07 Kohei Yoshida <kohei.yoshida@gmail.com> [c18ea901cb13909257951ecbf6282810294ec419]
+
+ Create a shared header for all test codes.
+
+ And globally disable NDEBUG so that assert gets triggered even in
+ release builds.
+
+2019-10-06 Kohei Yoshida <kohei.yoshida@gmail.com> [615ed37f46bb1e0c82610c6866a446680a6fb06d]
+
+ Add this test file to the list of automatic test cases.
+
+
+2019-10-06 Kohei Yoshida <kohei.yoshida@gmail.com> [3fb28d456c58004c0e94e4f82ef7f5a7ecfef69a]
+
+ xls-xml: correctly handle table offset position.
+
+ Pick up the following properties:
+
+ * ss:TopCell
+ * ss:LeftCell
+
+ from each Table element which specify the top-left position of the
+ table structure.
+
+2019-10-06 Kohei Yoshida <kohei.yoshida@gmail.com> [86a37bce87727e440149c1d5d68e66e13fdcef91]
+
+ New test file for xls-xml filter.
+
+ This one originates from:
+ https://bugs.documentfoundation.org/show_bug.cgi?id=118227
+
+ and is slightly re-formatted for ease of read.
+
+2019-08-29 Kohei Yoshida <kohei.yoshida@gmail.com> [7e08a01c20a9aa96dddd8b4717a4914c2e36fcb4]
+
+ 0.15.2 is now released & adjust the category names.
+
+
+2019-08-28 Kohei Yoshida <kohei.yoshida@gmail.com> [5d77169f98b2422ca5855c0a289d8752dc5a0b74]
+
+ Add links to the 0.15.2 packages.
+
+
+2019-08-28 Kohei Yoshida <kohei.yoshida@gmail.com> [5219f48293980bc859a67164fc68e6ce7c9f619a]
+
+ Fix make distcheck.
+
+
+2019-08-28 Kohei Yoshida <kohei.yoshida@gmail.com> [a679bbae80c2422ce18805b2fdf4fd181c12f990]
+
+ Update CHANGELOG.
+
+
+2019-08-28 Kohei Yoshida <kohei.yoshida@gmail.com> [122b8e2645194110ea915c11511574e1e06d40f5]
+
+ Let's test these named number formats for real.
+
+ Also, replace a UTF-8 euro symbol with its escaped bytes.
+
+2019-08-28 Kohei Yoshida <kohei.yoshida@gmail.com> [232719067350e715ba16bffc23771a91a941914d]
+
+ Add more formats.
+
+
+2019-08-28 Kohei Yoshida <kohei.yoshida@gmail.com> [022a476c2614aef22411db091dfe59f15ef64f52]
+
+ No point having this entry since there would be no translation.
+
+
+2019-08-28 Kohei Yoshida <kohei.yoshida@gmail.com> [3160df38b187cf93df73e38517ff345196bcf10c]
+
+ Convert named number format values to their respective codes.
+
+ This is related to #98.
+
+2019-08-27 Kohei Yoshida <kohei.yoshida@gmail.com> [15afc33d99c2a15af3833fcc762829e20a2646b8]
+
+ Update the CHANGELOG for 0.15.2 items.
+
+
+2019-08-27 Stephan Bergmann <sbergman@redhat.com> [1c9b1c20cad59237377a27f9f87db63a6a700d1c]
+
+ Comment the workarounds
+
+ ...added by a124e3b46f5430fa1c13c5500f3cad6ed147f068 "Blind fix attempt for
+ older macOS builds", in case they can ever be removed again when building
+ against old libc++ is no longer relevant.
+
+ The underlying issue in libc++ should be fixed with <https://github.com/llvm/
+ llvm-project/commit/292617e7003efdbc4dd84bc49423dc662f856fb6> "[libc++] Fix
+ PR20855 -- libc++ incorrectly diagnoses illegal referenc…" since LLVM 7.
+
+2019-08-26 Kohei Yoshida <kohei.yoshida@gmail.com> [0eeb11739d5f6d55ba8f610a6420e61b1ca44b77]
+
+ Add a TODO comment as a future action item.
+
+
+2019-08-26 Kohei Yoshida <kohei.yoshida@gmail.com> [06381b2971e5e5b3fa0707af075f6349d845274c]
+
+ Work on picking up the number formats entries from xlsx.
+
+ There is one issue; however, in that xlsx uses number format codes to
+ identify the number format strings, whereas other style elements use
+ ordering as the identifiers. I need to think a bit about how to handle
+ this...
+
+2019-08-26 Kohei Yoshida <kohei.yoshida@gmail.com> [800615b0b51d09a8ff7f23701512367c40b84ad3]
+
+ Set up a test case for xlsx import of number format strings.
+
+ It currently fails.
+
+2019-08-26 Kohei Yoshida <kohei.yoshida@gmail.com> [9a22b162b9733372eb698bc33d5212661e794be2]
+
+ Add a first test case for importing number formats.
+
+ Also make sure to intern the format strings before storing them.
+
+2019-08-26 Kohei Yoshida <kohei.yoshida@gmail.com> [d2102e54c2515f24a1a566a83d73dd37bcba6952]
+
+ Add method docs to clarify the roles of these methods.
+
+
+2019-08-26 Kohei Yoshida <kohei.yoshida@gmail.com> [aed8b59ca5a27d4e90aab1d83da522725d0039ea]
+
+ The conditions between can_handle_element() and create_child_context() ...
+
+ ... MUST be identical at all times.
+
+2019-08-26 Kohei Yoshida <kohei.yoshida@gmail.com> [edca971c1077196f8fe768d1a61cd2628529bdc1]
+
+ text/xml is also a valid mime type for XML documents.
+
+ And according to google search, application/xml and text/xml are
+ equivalent of each other.
+
+2019-08-26 Kohei Yoshida <kohei.yoshida@gmail.com> [35735e090e10321b0d4d0c9499eb6b284cf0da71]
+
+ Add test files for importing number format entries.
+
+
+2019-08-26 Kohei Yoshida <kohei.yoshida@gmail.com> [3e6fd08a2228e72eb144a76207b8bd671161cf2d]
+
+ xls-xml: pick up number format entries during import.
+
+ Not tested yet.
+
+2019-08-23 orbea <orbea@riseup.net> [8e984d774b4df960f61f4113956babf1515a8f5f]
+
+ Fix build with gcc5.
+
+
+2019-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [aaaec1b15725b8821907382fa30bb6fd00a9b53f]
+
+ Probably this should be a top-level item, not a child of orcus-xml.
+
+
+2019-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [2414012065fd3d49ed0fc2f79b5e04f6ef7aef6d]
+
+ Up the version to 0.15.2.
+
+
+2019-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [2272137abd48cf4777311640b3c760c4f1524c05]
+
+ Add Stephan's bit.
+
+
+2019-08-23 Stephan Bergmann <sbergman@redhat.com> [a124e3b46f5430fa1c13c5500f3cad6ed147f068]
+
+ Blind fix attempt for older macOS builds
+
+ ...like <https://ci.libreoffice.org/job/gerrit_mac/40711/> (which builds with
+ MacOSX10.13.sdk, but not sure with what Clang and libc++ versions):
+
+ > In file included from xml_map_tree.cpp:8:
+ > In file included from ./xml_map_tree.hpp:11:
+ > In file included from ../../include/orcus/pstring.hpp:14:
+ > In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/string:470:
+ > In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/string_view:169:
+ > In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/__string:56:
+ > In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/algorithm:643:
+ > In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/memory:653:
+ > /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/tuple:227:10: error: static_assert failed "Attempted to construct a reference element in a tuple with an rvalue"
+ > {static_assert(__can_bind_reference<_Tp>(),
+ > ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ > /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/tuple:385:13: note: in instantiation of function template specialization 'std::__1::__tuple_leaf<2, const orcus::pstring &, false>::__tuple_leaf<orcus::pstring, void>' requested here
+ > __tuple_leaf<_Uf, _Tf>(_VSTD::forward<_Up>(__u))...,
+ > ^
+ > /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/tuple:738:15: note: in instantiation of function template specialization 'std::__1::__tuple_impl<std::__1::__tuple_indices<0, 1, 2, 3, 4>, orcus::xml_map_tree &, const char *, const orcus::pstring &, orcus::xml_map_tree::element_type, orcus::xml_map_tree::reference_type>::__tuple_impl<0, 1, 2, 3, 4, orcus::xml_map_tree &, const char *, const orcus::pstring &, orcus::xml_map_tree::element_type, orcus::xml_map_tree::reference_type, orcus::xml_map_tree &, const char *&, orcus::pstring, orcus::xml_map_tree::element_type, orcus::xml_map_tree::reference_type>' requested here
+ > : __base_(typename __make_tuple_indices<sizeof...(_Up)>::type(),
+ > ^
+ > xml_map_tree.cpp:216:13: note: in instantiation of function template specialization 'std::__1::tuple<orcus::xml_map_tree &, const char *, const orcus::pstring &, orcus::xml_map_tree::element_type, orcus::xml_map_tree::reference_type>::tuple<orcus::xml_map_tree &, const char *&, orcus::pstring, orcus::xml_map_tree::element_type, orcus::xml_map_tree::reference_type, false, false>' requested here
+ > element::args_type(
+ > ^
+ > 1 error generated.
+ > Makefile:1804: recipe for target 'liborcus_0.15_la-xml_map_tree.lo' failed
+ > make[5]: *** [liborcus_0.15_la-xml_map_tree.lo] Error 1
+
+ (while building orcus as part of LibreOffice).
+
+ (Using "nm" instead of a more descriptive variable name "name" to avoid
+ -Wshadow warnings like
+
+ > xml_map_tree.cpp: In member function ‘orcus::xml_map_tree::element* orcus::xml_map_tree::element::get_or_create_child(orcus::xml_map_tree&, orcus::xmlns_id_t, const orcus::pstring&)’:
+ > xml_map_tree.cpp:214:16: warning: declaration of ‘name’ shadows a member of ‘orcus::xml_map_tree::element’ [-Wshadow]
+ > 214 | auto const name = sp.intern(_name.get(), _name.size()).first;
+ > | ^~~~
+ > In file included from xml_map_tree.cpp:8:
+ > xml_map_tree.hpp:126:17: note: shadowed declaration is here
+ > 126 | pstring name;
+ > | ^~~~
+
+ )
+
+2019-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [aa3a5fa62b188e8c7511ae3843c5896df97de8f6]
+
+ Add this bug fix to CHANGELOG.
+
+
+2019-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [c00bb21d96db956fd42253acd5e083f9168b91e3]
+
+ Add a test case for this.
+
+
+2019-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [d5e1cc2587c697cdbb440749f98a738402cf998e]
+
+ Correctly identify the anchor element of a linked node.
+
+
+2019-08-21 Kohei Yoshida <kohei.yoshida@gmail.com> [c1b7a2d97c4aa695952d7b52971a83aa68983c61]
+
+ Add links to the 0.15.1 packages.
+
+
+2019-08-21 Kohei Yoshida <kohei.yoshida@gmail.com> [83ee4f09e489010a1bc8dfbcd4011d2ccf279996]
+
+ Add method doc to fill_down_cells().
+
+
+2019-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [d1a7c6bfd64c6102ff4d59c253a743db6e8a04d3]
+
+ Finish up CHANGELOG for the upcoming 0.15.1 release.
+
+
+2019-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [865e660e33585c9ab1bd2aac6fe3b73927218a7f]
+
+ linkable is a struct, not a class.
+
+
+2019-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [f3538986f9ff18b5371a0ec8e049567b0c3b7f8e]
+
+ Up the version to 0.15.1.
+
+
+2019-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [b1fdb3d0f1f7165c047566b51bfbaf4dc530e882]
+
+ Use object pool on range_reference as well. I think this is the last one.
+
+
+2019-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [dd9f6ff67cb34897c3360a40c80bc3122fdcf6ab]
+
+ Switch to using object_pool on element instances as well.
+
+
+2019-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [2d887329526558fe3c3f75087831805120c0b111]
+
+ Switch element constructor to using std::tuple.
+
+ This is in preparation for using object pool on element.
+
+2019-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [f1e8dc4c62ebd2bc5639347336d0948e6db321e9]
+
+ Use object pool for attribute instances.
+
+ One caveat is that boost::object_pool's construct() can only support up to
+ 3 arguments. One workaround is to switch to using std::tuple to reduce
+ the number of arguments to one then call construct() on that, which is exactly
+ what I'm doing here.
+
+2019-08-19 Kohei Yoshida <kohei.yoshida@gmail.com> [170c7893524e6244296f0e349002264ab2cd2394]
+
+ get_or_create_child can now simply return the element pointer.
+
+
+2019-08-19 Kohei Yoshida <kohei.yoshida@gmail.com> [05e12ad685594d3b8d517c9146b53e1b14c0522b]
+
+ Move the reference data up into linkable, and clean up the code a bit.
+
+
+2019-08-19 Kohei Yoshida <kohei.yoshida@gmail.com> [2bfd5f90bf7bab783dbf1e7e1cbc6b0a679ca7af]
+
+ Refactor the linked element handling code for clarity.
+
+
+2019-08-16 Kohei Yoshida <kohei.yoshida@gmail.com> [ba80955aeb32bb86ea8cc2765530bab9e0b51c87]
+
+ Use object_pool for cell_reference and field_in_range instances as well.
+
+
+2019-08-16 Kohei Yoshida <kohei.yoshida@gmail.com> [2b1417f6a2d5655c954204c126daf3524403a5e5]
+
+ Use object_pool for element_store_type objects.
+
+
+2019-08-15 Kohei Yoshida <kohei.yoshida@gmail.com> [5cbce8c9ada219f18c7a707a435b0574f6396693]
+
+ Add some changes which will go into the next release (0.15.1 most likely).
+
+
+2019-08-15 Stephan Bergmann <sbergman@redhat.com> [1e024e37c59574965e1b07bc5097c014d4625227]
+
+ Fix linking of newly created element
+
+ (see downstream <https://gerrit.libreoffice.org/#/c/77519/> "Fix linking of
+ newly created element in liborcus 0.15.0")
+
+2019-08-15 Kohei Yoshida <kohei.yoshida@gmail.com> [6a40c30658a8727d87ae0ac244c95d6e18dde75a]
+
+ Sigh... Another typo.
+
+
+2019-08-15 Kohei Yoshida <kohei.yoshida@gmail.com> [aa7a5e3f802d9e80c27147cea706927cb7e2be11]
+
+ Let's mention the new required method in the import_sheet interface.
+
+
+2019-08-15 Kohei Yoshida <kohei.yoshida@gmail.com> [6e4160af14491cabf4a018df6463161cf57b25a6]
+
+ Fix a typo. So much intern() calls affect my English spelling.
+
+
+2019-08-15 Kohei Yoshida <kohei.yoshida@gmail.com> [4c12dc4e02d824c81dce401f8aba76b1cae3e92c]
+
+ Add the 0.15.0 tag line. That version is out in the wild now.
+
+
+2019-08-14 Kohei Yoshida <kohei.yoshida@gmail.com> [56514d538a0b018e910ce4d0f134bfb38a5f82b9]
+
+ Unused private member.
+
+
+2019-08-14 Kohei Yoshida <kohei.yoshida@gmail.com> [1b11a47a3681015afda7f04b21f798e416ed6a84]
+
+ Let's not forget the override keyword here...
+
+
+2019-08-14 Kohei Yoshida <kohei.yoshida@gmail.com> [fff0bdf3b9d214d4e406f91d085f38d4a372f389]
+
+ Properly initialize these values, and keep valgrind memcheck happy.
+
+
+2019-08-13 Kohei Yoshida <kohei.yoshida@gmail.com> [32ff7b049033ab6b40ebfe7f900df29bfddb27e8]
+
+ element.child_elements is valid only for unlinked element type.
+
+
+2019-08-13 Kohei Yoshida <kohei.yoshida@gmail.com> [edfa29e40a7d1b937f95d66e35ceff4d73e71ebb]
+
+ Really kill orcus-xml-dump.
+
+
+2019-08-13 Kohei Yoshida <kohei.yoshida@gmail.com> [1846f57da57794abe3e64d447f8d5611a279a37c]
+
+ Let's use volatile keyword here too. It's a simpler solution.
+
+ This reverts commit 00e1d67350e7d85c05e8b1f8f49a265af78f85e3, and add
+ volatile keyword to prevent aggressive compiler optimization.
+
+2019-08-13 Kohei Yoshida <kohei.yoshida@gmail.com> [6698019746b562b173cf1bb849e4e85fb0044461]
+
+ Use of volatile keyword here fixes the test failure on 32-bit debian.
+
+ Perhaps the compiler is too aggressive on optimizing the double values
+ causing the equality check to fail?
+
+2019-08-13 Kohei Yoshida <kohei.yoshida@gmail.com> [a55f15cb9fd63a9b37e2c181c57e90c570292948]
+
+ Use std::deque here to avoid strange segfault issue on 32-bit debian...
+
+ The original code (with vector) for some reason crashes only on 32-bit
+ debian platforms. No such issue with deque.
+
+2019-08-13 Kohei Yoshida <kohei.yoshida@gmail.com> [00e1d67350e7d85c05e8b1f8f49a265af78f85e3]
+
+ Use a more reliable method to compare two double-precision values.
+
+ This hits especially hard on 32-bit platforms.
+
+2019-08-08 Kohei Yoshida <kohei.yoshida@gmail.com> [7306fdbc47574bfdff4341e69173447c45148341]
+
+ Add links to the 0.15.0 packages.
+
+
+2019-08-08 Kohei Yoshida <kohei.yoshida@gmail.com> [cac3852073f54d14a8fae0b6cd03e4e79df66df8]
+
+ Up the version to 0.15.0.
+
+
+2019-08-08 Kohei Yoshida <kohei.yoshida@gmail.com> [65797dc173272a1ee1a4dc7be24cbf80e595d0fe]
+
+ Populated CHANGELOG based on the tickets tucked under 0.15.0 milestone.
+
+ I hope I got everything here...
+
+2019-08-08 Kohei Yoshida <kohei.yoshida@gmail.com> [bd1d8bad33dd22daa8922b38068877e5a9241d44]
+
+ Update AUTHORS.
+
+
+2019-08-06 Kohei Yoshida <kohei.yoshida@gmail.com> [b67e82d9b2908dff7f6e82d4fb93e4d775ffdc39]
+
+ Flattern the code a bit by reversing logic.
+
+
+2019-08-06 Kohei Yoshida <kohei.yoshida@gmail.com> [97eba52b4dd448345a6f6687333e3a0e9fce9a30]
+
+ Share the logic of output stream creation between orcus-json and orcus-xml.
+
+
+2019-08-06 Kohei Yoshida <kohei.yoshida@gmail.com> [f8347e9d89d14c9cf3fadcb0a4dccd3952ffa080]
+
+ Move the orcus-xml-dump functionality into orcus-xml.
+
+ This addresses #96.
+
+2019-08-05 Kohei Yoshida <kohei.yoshida@gmail.com> [93a52be3507622a71f8c65d6aae769bbae41ec43]
+
+ Fix make distcheck.
+
+
+2019-08-05 Kohei Yoshida <kohei.yoshida@gmail.com> [d3db6695e02d61ce4b565f4e9ffb3d491a9f980f]
+
+ Add json-map-tree-test to cmake.
+
+
+2019-08-05 Kohei Yoshida <kohei.yoshida@gmail.com> [42e4550aa3bd3424cec0a320e33098e7e9113cee]
+
+ Add another test case that contains multiple ranges and row-groups.
+
+
+2019-08-05 Kohei Yoshida <kohei.yoshida@gmail.com> [e59e9763d1f5c0785f60467db01461eaadd35a67]
+
+ Two more test cases.
+
+
+2019-08-05 Kohei Yoshida <kohei.yoshida@gmail.com> [f775a0f4aa609d9d32612729e907c40e656f3dcd]
+
+ Add the first test case.
+
+
+2019-08-02 Kohei Yoshida <kohei.yoshida@gmail.com> [87c768a0cf67874a2e4cb573215f4d0381f44154]
+
+ Ignore this artifact.
+
+
+2019-08-02 Kohei Yoshida <kohei.yoshida@gmail.com> [91eaeccec82845b72e5ae08d2be63ac077e7f706]
+
+ Be explicit about where to put an inline file.
+
+
+2019-08-02 Kohei Yoshida <kohei.yoshida@gmail.com> [22a7d0adbe8ea3526d41769f9a9e12806922affc]
+
+ Remove a compiler warning with MSVC.
+
+
+2019-08-02 Kohei Yoshida <kohei.yoshida@gmail.com> [629b50ab1380b0d87fb690ac3020476856ea4aaf]
+
+ Fix the check target for cmake build.
+
+
+2019-08-02 Kohei Yoshida <kohei.yoshida@gmail.com> [d3f0a34788f3825c461d1944aa697f4f0c467dab]
+
+ Potentially skip whitespace chars before and after the '=' of an attr.
+
+ This fixes #95.
+
+2019-08-02 Kohei Yoshida <kohei.yoshida@gmail.com> [ac171c352dd78ae102fbf55eda124ab55dec1cdf]
+
+ Add a test case that currently fails. This is related to #95.
+
+
+2019-08-01 Kohei Yoshida <kohei.yoshida@gmail.com> [f9f5d9efb17dc3dd0d7e49c5ccee2ca48e58aa62]
+
+ Add header files to cmake scripts & add API version to libs.
+
+
+2019-08-01 Kohei Yoshida <kohei.yoshida@gmail.com> [82100a7717e0b011a70000e76597f435a6fd054b]
+
+ Add install targets.
+
+
+2019-08-01 Kohei Yoshida <kohei.yoshida@gmail.com> [ae96775517543c6560357dbf5e9aac0c0715471d]
+
+ Add all cmake scripts to slickedit workspace.
+
+
+2019-08-01 Kohei Yoshida <kohei.yoshida@gmail.com> [4cb0de2f8c939edb793a1e39dff4a4d820f9afc9]
+
+ Spaces to indent, not tabs.
+
+
+2019-08-01 Kohei Yoshida <kohei.yoshida@gmail.com> [dd272345e22038d1c668b19fe236b1af7c0f4883]
+
+ Let's just use auto here... I think I'm justified.
+
+
+2019-08-01 Kohei Yoshida <kohei.yoshida@gmail.com> [614e9cfa6bfac2a690520a278c8ff59390db6a60]
+
+ Add test cases for orcus_xls_xml::read_stream(...)...
+
+ ... in order to make sure that the automatic conversion to utf-8
+ still works via read_steam() as well.
+
+2019-08-01 Kohei Yoshida <kohei.yoshida@gmail.com> [6609c69ba6db499a089447dff7c3ce9167f01fbc]
+
+ Implement memory_content class to represent in-memory content.
+
+ This one is similar to pstring, but differs in that it can handle
+ conversion of stream encoding to utf-8.
+
+2019-08-01 Kohei Yoshida <kohei.yoshida@gmail.com> [f9aabfddb0d7c88a8d8120d23743452f5ff7a88f]
+
+ Move the impl of read_stream() to the impl class.
+
+
+2019-08-01 Kohei Yoshida <kohei.yoshida@gmail.com> [e179075cc8f6e0dc1ee7ac6aa6db7f9d52710168]
+
+ Modernize it a bit.
+
+
+2019-08-01 Kohei Yoshida <kohei.yoshida@gmail.com> [d56fb140d211c2800c0da3970721ae46d18be177]
+
+ Use separate object pool to manage node instances, and store their pointers.
+
+
+2019-07-31 Kohei Yoshida <kohei.yoshida@gmail.com> [4e2a10b95a9efd11ecd4d2e0a3975e0e53edd2fe]
+
+ Get orcus to build on Windows (with cmake).
+
+ MSVC's std::deque apparently cannot work with forward-declared types, but
+ std::vector works fine.
+
+2019-07-31 Kohei Yoshida <kohei.yoshida@gmail.com> [998570d2a1ede145da54baef2026add211d540dc]
+
+ Remove dump-check mode. This is now handled as output format type.
+
+ Also enhance the descriptions of the output formats.
+
+2019-07-31 Kohei Yoshida <kohei.yoshida@gmail.com> [f0c64a7f0b26021a73f77dcb0f200cbf4936ea71]
+
+ No need to do this check here.
+
+ All necessary checks on the output file/directory are now done within
+ document::dump().
+
+2019-07-31 Kohei Yoshida <kohei.yoshida@gmail.com> [c83e61c1628410181a52439025a69e31b12bb868]
+
+ Move the structure dumping code into a separate function.
+
+
+2019-07-31 Kohei Yoshida <kohei.yoshida@gmail.com> [8c9b7d67e54d59bc06c8dc57798905f1f35e8371]
+
+ Rename dump-document to map.
+
+ Also fix inproper error message when the output format is not specified.
+
+ This is related to #93.
+
+2019-07-31 Kohei Yoshida <kohei.yoshida@gmail.com> [75835dc64092f405b6a94883e82dcb3e08813d1b]
+
+ Rename xml-structure to just structure.
+
+ Related to #93.
+
+2019-07-30 Kohei Yoshida <kohei.yoshida@gmail.com> [671285dc5e15f3e202ba1d587929a2b506e1093a]
+
+ Make sure we throw an invalid_map_error on parsing invalid map file.
+
+ This is also in line with how it works in orcus_json.
+
+2019-07-30 Kohei Yoshida <kohei.yoshida@gmail.com> [2a1a0eca6beb4d1c16f060a674ec994139f1f533]
+
+ Let's call it just 'path', not 'xpath'.
+
+ This is also to make it inline with json mapping.
+
+2019-07-30 Kohei Yoshida <kohei.yoshida@gmail.com> [e8994e2cc787169db4bcceed9f09abebadaae209]
+
+ Simplify the code a bit.
+
+
+2019-07-30 Kohei Yoshida <kohei.yoshida@gmail.com> [47665a5d61135de08810add9ae7c7b642e227a0e]
+
+ Move the code that reads XML map file into orcus_xml as a new method.
+
+ This is in line with how orcus_json class is structured.
+
+2019-07-30 Kohei Yoshida <kohei.yoshida@gmail.com> [69d08a4115f086bf9725f0d11d5a5c71e4387cf1]
+
+ Add method docs for json::structure_tree::walker.
+
+
+2019-07-30 Kohei Yoshida <kohei.yoshida@gmail.com> [92d6a98ab99d0a928da3e22d4475eb24c23d3727]
+
+ Ensure that the row group nodes are always of array type.
+
+
+2019-07-30 Kohei Yoshida <kohei.yoshida@gmail.com> [33592c6b0c210ae43a52e0506c853898d941d1bd]
+
+ Rename the method and bind it to row-group nodes.
+
+
+2019-07-29 Kohei Yoshida <kohei.yoshida@gmail.com> [5e66d16d5fa55b4fc79b6a192141c4e0ed9e291c]
+
+ Better exception message in node::push_back().
+
+
+2019-07-27 Kohei Yoshida <kohei.yoshida@gmail.com> [a411025f8baa91030bdf36283496d664b25ef613]
+
+ Finally implement map file generation.
+
+
+2019-07-26 Kohei Yoshida <kohei.yoshida@gmail.com> [a8e0c46a4cdb54bbe1c90f1e7143e598aa914094]
+
+ Perhaps better to use a separate "implicit array" type to handle ...
+
+ ... implicit array values, and leave the real array type alone.
+
+2019-07-26 Kohei Yoshida <kohei.yoshida@gmail.com> [3b9df72733910fe23deab80f28e4af5b58d791bf]
+
+ Fix a bug in json::document_tree wrt empty array initialization.
+
+ And add a test case to go with it.
+
+2019-07-26 Kohei Yoshida <kohei.yoshida@gmail.com> [9c8ded7aab7de03268abd4bfb7c284607c9b80b7]
+
+ Set up a hook for writing a JSON map file for map-gen mode.
+
+ Still WIP.
+
+2019-07-26 Kohei Yoshida <kohei.yoshida@gmail.com> [2a29a924d598a02f720cee670a140ebfb1787b7e]
+
+ Make the range detection code a function of structure_tree.
+
+
+2019-07-26 Kohei Yoshida <kohei.yoshida@gmail.com> [f879d7b05db896083589cc987207fd088fca7c33]
+
+ Remove unused data members.
+
+
+2019-07-26 Kohei Yoshida <kohei.yoshida@gmail.com> [129aee647be4f293b1601b36883942e9f963f10f]
+
+ Add a hook for new 'map-gen' mode. Implementation will come later.
+
+
+2019-07-25 Kohei Yoshida <kohei.yoshida@gmail.com> [8dc0f2573a09d5f1ae819a0afe2e78e3c0dc4903]
+
+ Move structure_mapper so that it can be re-used.
+
+ Also, abstract out the range handling code and have the caller provide
+ it instead.
+
+2019-07-25 Kohei Yoshida <kohei.yoshida@gmail.com> [a233fe8afd17dedbf6d27fcc33d133817f958464]
+
+ Move the map definition rule detection code inside orcus_json.
+
+
+2019-07-25 Kohei Yoshida <kohei.yoshida@gmail.com> [9fff3abb7e9f4d88dcea10fc7460f2b1038f1275]
+
+ Import the detected ranges for real.
+
+ So far it works well enough for the input files I've tested with.
+
+2019-07-24 Kohei Yoshida <kohei.yoshida@gmail.com> [66156a03c0ceba27a7d36bedbe3d195360bddb1c]
+
+ Pave the way for pushing linked ranges.
+
+
+2019-07-24 Kohei Yoshida <kohei.yoshida@gmail.com> [d6045974a5e3e26ede50210ab32b1076ab55d80a]
+
+ Slightly better wording.
+
+
+2019-07-24 Kohei Yoshida <kohei.yoshida@gmail.com> [bf3520039b2c10d3f583ce5973a4aa54a3683e59]
+
+ Fix the row-group path generation logic.
+
+
+2019-07-24 Kohei Yoshida <kohei.yoshida@gmail.com> [c9c4a53bdcd103dc0600a38157787db4c6a6f524]
+
+ Fix the field path construction logic.
+
+ We shouldn't skip the root node; instead, we should skip the array
+ that is an immediate parent of the value.
+
+2019-07-24 Kohei Yoshida <kohei.yoshida@gmail.com> [34e1ab1db3ceaa8e461f26649fc1c878e89beeb9]
+
+ One misplaced closing brace...
+
+
+2019-07-24 Kohei Yoshida <kohei.yoshida@gmail.com> [a98f41283584b9f64d8fd6079fc52f0e26aeb463]
+
+ Implement the logic of generating all necessary map paths.
+
+ So far only tested with JSON with arrays.
+
+2019-07-24 Kohei Yoshida <kohei.yoshida@gmail.com> [548cb119905ec6ea869607796529afa0ba488f12]
+
+ Annotate some data members of the structure node.
+
+
+2019-07-24 Kohei Yoshida <kohei.yoshida@gmail.com> [2eae900761427dc4d282673914b406579b095dc3]
+
+ Wrong naming convention...
+
+
+2019-07-23 Kohei Yoshida <kohei.yoshida@gmail.com> [91f9feb9aab7464cc06f314e3e8f652369f03917]
+
+ Add another test case for json structure output.
+
+
+2019-07-23 Kohei Yoshida <kohei.yoshida@gmail.com> [af7008ce1ea4ef00f6108b58e7a654463f40557c]
+
+ json structure tree to keep track of array positions of value nodes.
+
+ An array position of a value node is recorded in the structure tree
+ only when that position always contains a value node and never a node
+ of non-value type.
+
+2019-07-23 Kohei Yoshida <kohei.yoshida@gmail.com> [79c475d1cc131c99968d1170adbaa4e99a531325]
+
+ Use a class to keep track of some traversal state.
+
+
+2019-07-22 Kohei Yoshida <kohei.yoshida@gmail.com> [ec9ab5a642eb933d73a8e7738c2e19678b4fbab3]
+
+ Code the basic logic of traversing through the structure tree.
+
+
+2019-07-22 Kohei Yoshida <kohei.yoshida@gmail.com> [35c61f9c6ab98ff38f1b02658c90723468ba045f]
+
+ Start setting up a way to traverse the structure tree.
+
+ Still WIP.
+
+2019-07-22 Kohei Yoshida <kohei.yoshida@gmail.com> [c13f0e5475ac1fe69e5ba4eb436aef840558c557]
+
+ Set up a hook for automatic mapping.
+
+ It gets invoked when the user specifies a map mode without an explicit
+ map file path.
+
+2019-07-22 Kohei Yoshida <kohei.yoshida@gmail.com> [bd1e7c6696472f7b55fb3f9f57c014e64e47c98c]
+
+ Let's not forget a line break at the end.
+
+
+2019-07-19 Kohei Yoshida <kohei.yoshida@gmail.com> [d153ea4c254f7454a2fd9a1a27df8f51cd62152a]
+
+ Don't forget to call finalize().
+
+
+2019-07-19 Kohei Yoshida <kohei.yoshida@gmail.com> [778703f49df7e838b5967d61ea9121d84c10b42f]
+
+ Add the ability to specify custom field labels.
+
+
+2019-07-19 Kohei Yoshida <kohei.yoshida@gmail.com> [f55ab1e05158adbbb86a169636c464a6384af31d]
+
+ New test case for importing array of arrays with header labels.
+
+
+2019-07-19 Kohei Yoshida <kohei.yoshida@gmail.com> [06b4a44f323e793a08c40045e02e5aec6a267c08]
+
+ Read the row-header attribute from the map file and make use of it.
+
+ Also add a test case for this.
+
+2019-07-18 Kohei Yoshida <kohei.yoshida@gmail.com> [85e20916a5f9681396de982789be98f124d55d73]
+
+ Pick up the last object key value, and use if as the field label.
+
+ If that field is associated with an object key that is.
+
+2019-07-18 Kohei Yoshida <kohei.yoshida@gmail.com> [e9faff9b90c04b52381111c1e471715a2e7d7e5b]
+
+ Const correctness.
+
+
+2019-07-18 Kohei Yoshida <kohei.yoshida@gmail.com> [f955248ed111d2e9bf762ce6bce59415538239ab]
+
+ We don't really need direct access to the nodes that fields belong to.
+
+
+2019-07-18 Kohei Yoshida <kohei.yoshida@gmail.com> [75812aadf9f2ffa2b609475868adde20e1ec1fa6]
+
+ Add the logic of inserting row headers for linked ranges.
+
+ It's not turned on yet.
+
+2019-07-17 Kohei Yoshida <kohei.yoshida@gmail.com> [7bf1b1165c4aca8c1e1e85751b3955b41f813f9e]
+
+ How about this?
+
+
+2019-07-17 Kohei Yoshida <kohei.yoshida@gmail.com> [545ebb279ba10920b23d0fde0cc93924ea7438e7]
+
+ Another try.
+
+
+2019-07-17 Kohei Yoshida <kohei.yoshida@gmail.com> [c4af63f3ea9d053d9804e55981f4466719d379b1]
+
+ Remove this. This is no longer needed.
+
+
+2019-07-17 Kohei Yoshida <kohei.yoshida@gmail.com> [751f92468eaad544e43051a5099682d53bdaacc8]
+
+ Revert "Try to query the distro name."
+
+ This reverts commit 4f318070c57fa2d498284531d7dc635b37d4922e.
+
+2019-07-17 Kohei Yoshida <kohei.yoshida@gmail.com> [4f318070c57fa2d498284531d7dc635b37d4922e]
+
+ Try to query the distro name.
+
+
+2019-07-17 Kohei Yoshida <kohei.yoshida@gmail.com> [e71a600d640ff51db009857c88979bdcb1bdfaa9]
+
+ Move odf-styles-context-test from src/liborcus to src.
+
+ If you get build issues, be sure to nuke the .deps directories and
+ re-run configure.
+
+2019-07-17 Kohei Yoshida <kohei.yoshida@gmail.com> [61feccca10d201b25d27a0334453396f3956170d]
+
+ Empty array can happen.
+
+
+2019-07-17 Kohei Yoshida <kohei.yoshida@gmail.com> [c5a217875c966bd89d31dc9f0cbb102fdfac8342]
+
+ Trynig to figure out the base distro for this runner.
+
+
+2019-07-17 Kohei Yoshida <kohei.yoshida@gmail.com> [5c1179a72ef9790ccc4b092812cdbec5c04da74b]
+
+ Maybe I need to specify -8 (?)
+
+
+2019-07-17 Kohei Yoshida <kohei.yoshida@gmail.com> [b077114e31266f120aa91caf481e07cce2260767]
+
+ Put gfortran first.
+
+
+2019-07-17 Kohei Yoshida <kohei.yoshida@gmail.com> [536d3580797ac8a598fef851515785eecfe162d5]
+
+ Not git, but apt.
+
+
+2019-07-17 Kohei Yoshida <kohei.yoshida@gmail.com> [46c521ce775c8d0e398423d8dec036d449524faf]
+
+ Let's see what happens if I try to install gfortran separately...
+
+
+2019-07-17 Kohei Yoshida <kohei.yoshida@gmail.com> [b25b52a92ce6ab8d325ff582874889fd06f0fc88]
+
+ Add another test case for triply-nested repeats.
+
+
+2019-07-17 Kohei Yoshida <kohei.yoshida@gmail.com> [1828703b38b5e008faf2eee11a2f792563113c0d]
+
+ Correctly handle loading of invalid json map file.
+
+
+2019-07-16 Kohei Yoshida <kohei.yoshida@gmail.com> [d1d88d2972e17987f96e49f6e2af5b15d2e4b5f1]
+
+ Another test case for nested repeats.
+
+ This one has three nested levels.
+
+2019-07-16 Kohei Yoshida <kohei.yoshida@gmail.com> [bb48c1b3d72522b16535444c14cf0dd95766a12a]
+
+ Add the nested-repeats to the list of tested cases for imports.
+
+
+2019-07-16 Kohei Yoshida <kohei.yoshida@gmail.com> [c381373959ab3c39b8cb6a6bf2008ae3e7498f09]
+
+ Perform fill-downs for real.
+
+
+2019-07-16 Kohei Yoshida <kohei.yoshida@gmail.com> [d5d2e61e7b95e3ff38bfb4729f7df3a2cd18960e]
+
+ Anchor linked field nodes to their respective row group node.
+
+ This information will be used to figure out which fields need to be
+ filled when they need to.
+
+2019-07-16 Kohei Yoshida <kohei.yoshida@gmail.com> [35b68659245858fb15058f52905fc71dbba5c016]
+
+ Have get_or_create_destination_node() to return the whole stack.
+
+ Rather than just returning the destination node, we need access to the
+ whole stack from the root to the destination.
+
+2019-07-16 Kohei Yoshida <kohei.yoshida@gmail.com> [d12b91606e02e5b96b6e644bc1cad2c7e30ef360]
+
+ Commit row-group paths first before the range field paths.
+
+
+2019-07-16 Kohei Yoshida <kohei.yoshida@gmail.com> [2f8c338fc3bac86658f70cd83539092006d7e597]
+
+ Start the start row position of each row group ...
+
+ ... and identify the code location in which to fill down the rows.
+
+2019-07-16 Kohei Yoshida <kohei.yoshida@gmail.com> [e411f7bf7c13fe19b431e7068cac99fc64a9af3f]
+
+ Add more records to the test file.
+
+
+2019-07-15 Kohei Yoshida <kohei.yoshida@gmail.com> [2793333f44b687740feeba08d845b1f89d4d4d3c]
+
+ Revise the logic of when to increment row positions.
+
+ This is necessary to support nested repeat nodes.
+
+2019-07-15 Kohei Yoshida <kohei.yoshida@gmail.com> [d0aeb994164e5cf8ad163cc08e77bdacb3b3962d]
+
+ New test case for nested repeat nodes.
+
+
+2019-07-15 Kohei Yoshida <kohei.yoshida@gmail.com> [67593474ed3f4054ced9939ce45d52a4d58c37ae]
+
+ Add test for object being the root of a tree.
+
+
+2019-07-15 Kohei Yoshida <kohei.yoshida@gmail.com> [f0004cfefc3a7786b919d6d2f5cdc2a3e0315a63]
+
+ Handle object node type in get_get_destination_node().
+
+
+2019-07-12 Kohei Yoshida <kohei.yoshida@gmail.com> [ede18ded1acb8129a003c9973ee51b1644c5348f]
+
+ Add another test case to the unit test.
+
+
+2019-07-12 Kohei Yoshida <kohei.yoshida@gmail.com> [9f87a4ba552d74ff4b8961952a280763dd426f7b]
+
+ Clean this up a bit.
+
+
+2019-07-12 Kohei Yoshida <kohei.yoshida@gmail.com> [efab9712aa39cf2532dcea6c675e5ef2482880f5]
+
+ Handle pushing and popping of objects.
+
+ Now the mapping works with the current test file containing objects.
+
+2019-07-12 Kohei Yoshida <kohei.yoshida@gmail.com> [38d402bccde665e0c3d80058f87f2dee03758dd9]
+
+ Parse object keys and start handling paths with objects.
+
+ Still WIP, with lots of TODO markers inserted.
+
+2019-07-12 Kohei Yoshida <kohei.yoshida@gmail.com> [0a6430b64666f59f0b452c529671ec610fe95b85]
+
+ Make the 'cells' and 'ranges' nodes optional in JSON map def file.
+
+
+2019-07-12 Kohei Yoshida <kohei.yoshida@gmail.com> [e43d256f81ea04365a453fc48e57b8fe2247fe26]
+
+ New set of test files for loading an array of objects, ...
+
+ ... which has yet to be implemented.
+
+2019-07-11 Kohei Yoshida <kohei.yoshida@gmail.com> [c9f4e5da6169646da8591980a2c470c17bd0091b]
+
+ Remove debug statements. I don't think I need them any more.
+
+
+2019-07-11 Kohei Yoshida <kohei.yoshida@gmail.com> [af76aa2cb667596c6c3ad30b2e8d549d8449c705]
+
+ Clean up the code a bit.
+
+ Remove the try - catch block since that was intended for the CLI
+ usage.
+
+2019-07-11 Kohei Yoshida <kohei.yoshida@gmail.com> [ec3ca441d74a1578094fae126f6644b4e6e92870]
+
+ Set up a basic unit test framework for json mapping.
+
+ And move the code that loads entire map difinition from map file to
+ orcus_json so that we can call it from the test code.
+
+2019-07-11 Kohei Yoshida <kohei.yoshida@gmail.com> [ed5700c5d39e06157963899b2a2d4518c4dae9b1]
+
+ Use boost filesystem on these guys...
+
+
+2019-07-11 Kohei Yoshida <kohei.yoshida@gmail.com> [528455eb5b18fd0688f7ffa1a4ba42c07e1c0ba0]
+
+ Handle the 'check' format in the document::dump() as well.
+
+
+2019-07-11 Kohei Yoshida <kohei.yoshida@gmail.com> [31106a729709fe7f6f7f5390384bbbf65e58d0e6]
+
+ Handle 'none' format correctly without errors.
+
+
+2019-07-11 Kohei Yoshida <kohei.yoshida@gmail.com> [2195dbf159b9c14709850a0a98ca32b2b17d986d]
+
+ Support dumping of document content the same way the other orcus-* do.
+
+
+2019-07-11 Kohei Yoshida <kohei.yoshida@gmail.com> [6b36332f199e3bb1f32b871d13c55ab2f90ee41d]
+
+ Move output directory handling into the document class implementation.
+
+
+2019-07-11 Kohei Yoshida <kohei.yoshida@gmail.com> [e31acf0372ce0ff6ddc2ab72948806deddc70a19]
+
+ Merge json_config::output_format_type with dump_format_t.
+
+
+2019-07-11 Kohei Yoshida <kohei.yoshida@gmail.com> [911bb8ad12bba4b67004b0c8c568111c627d3d84]
+
+ Move output stream creation to cmd_params.
+
+
+2019-07-10 Kohei Yoshida <kohei.yoshida@gmail.com> [43b166f6f90c0cb775fb6267e412cdf6c5891dc5]
+
+ Import the linked values to spreadsheet document.
+
+
+2019-07-10 Kohei Yoshida <kohei.yoshida@gmail.com> [f005a284c0a49874187e8d251f53cd3c67e052b1]
+
+ Handle value nodes in json input ...
+
+ ... and ensure that the traversal of the map tree works correctly.
+
+2019-07-10 Kohei Yoshida <kohei.yoshida@gmail.com> [521d9497826f5295f89105ddb21ad1d83c59bb8d]
+
+ Implement pop_node() but it has some issues I need to fix.
+
+
+2019-07-09 Kohei Yoshida <kohei.yoshida@gmail.com> [f295f50e5bfc2bd7122301f2f3dc092fd81a59c5]
+
+ Set up a walker class and handle pushing of array nodes.
+
+ I still need to handle array popping, which is my next task.
+
+2019-07-09 Kohei Yoshida <kohei.yoshida@gmail.com> [fb63caa85a7022c927c8a06a6308f64339d59cf0]
+
+ Check the row group attribute too.
+
+
+2019-07-09 Kohei Yoshida <kohei.yoshida@gmail.com> [e564866391af2616d041cd85a753358a258e3269]
+
+ Add a test case for linking a range and fix one bug discovered.
+
+ It's always good to write test for your code.
+
+2019-07-08 Kohei Yoshida <kohei.yoshida@gmail.com> [38b105a8655d5376da0105128f9929f1eed2dd71]
+
+ Support linking of range references.
+
+
+2019-07-08 Kohei Yoshida <kohei.yoshida@gmail.com> [8c5608fc95a7a14d729ed4a3ab4cfb5368a5c32d]
+
+ No need to handle named tokens anymore.
+
+
+2019-07-08 Kohei Yoshida <kohei.yoshida@gmail.com> [c21f6ade61fdfd7a1a7b1b45ed84cdd6e3d50172]
+
+ Add another test case and address the issue discovered.
+
+
+2019-07-08 Kohei Yoshida <kohei.yoshida@gmail.com> [3eeb296ee34a4b10e6c8949d77226a5593e7ae51]
+
+ Add a get_link() method to retrieve linked nodes ...
+
+ ... and add one test case for it.
+
+2019-07-03 Kohei Yoshida <kohei.yoshida@gmail.com> [9d04f7ff4e2fc847f09bb12b852bcd48ab5eb626]
+
+ Re-arrange this code a bit, to make it easier to follow.
+
+
+2019-07-03 Kohei Yoshida <kohei.yoshida@gmail.com> [6b953bbbd8df63464efb9e44bde6dd1474d18e8e]
+
+ Move this code into a method, for future re-usability.
+
+
+2019-07-03 Kohei Yoshida <kohei.yoshida@gmail.com> [1e60a25c25242c05e8ac41c96825310875576297]
+
+ Give this special child position a name.
+
+
+2019-07-03 Kohei Yoshida <kohei.yoshida@gmail.com> [e3630f0b6b18bb9de264652218b76fe4e38f3420]
+
+ WIP: manage to link single cell references at root array.
+
+
+2019-07-03 Kohei Yoshida <kohei.yoshida@gmail.com> [0420e804f73da8fcf4e296de2c9adf3125043725]
+
+ Let's use JSONPath for the paths in the map file.
+
+ I believe we can use slightly modified JSONPath for mapping definition.
+ I'll decide what to do for the paths in the structure output.
+
+2019-07-03 Kohei Yoshida <kohei.yoshida@gmail.com> [1fbae5c1b49f20ef1154a7e90b07c32f4ff2af12]
+
+ WIP: Fully parse array elements at root level.
+
+
+2019-07-03 Kohei Yoshida <kohei.yoshida@gmail.com> [f383334d83e1550a8a8812e24675fe49c9118073]
+
+ Regenerate the expected values for json structure outputs.
+
+
+2019-07-02 Kohei Yoshida <kohei.yoshida@gmail.com> [a386016b58b9a163c1149a941a951c758c61c2dc]
+
+ WIP: Start writing a json path parser. Still incomplete.
+
+ It's enough to parse the first 'array' token.
+
+2019-07-02 Kohei Yoshida <kohei.yoshida@gmail.com> [563e0e0ae492e102f499ec55a163b152d1c060e8]
+
+ I forgot to add this file to the slickedit project.
+
+
+2019-07-02 Kohei Yoshida <kohei.yoshida@gmail.com> [3dd58d95ea0eeee7dac6b8d7b536c62645c3dcf6]
+
+ Display the array size for all array nodes.
+
+
+2019-07-02 Kohei Yoshida <kohei.yoshida@gmail.com> [79569b1e208c8bfb92b937e67336a366105dc0db]
+
+ Handle appending of sheets.
+
+
+2019-07-02 Kohei Yoshida <kohei.yoshida@gmail.com> [7c2b70cccb9b652000c3ccde864c184f448bce13]
+
+ Route mapping all calls to the json_map_tree instance.
+
+
+2019-07-02 Kohei Yoshida <kohei.yoshida@gmail.com> [fd19cea13342ff3a91c0e9411c67c5d4800bb90f]
+
+ Complete the parsing of the map file.
+
+
+2019-06-28 Kohei Yoshida <kohei.yoshida@gmail.com> [9ab30c284d2b1907d4b2972d0b586474bd750e1d]
+
+ Remove duplicated code blocks.
+
+
+2019-06-28 Kohei Yoshida <kohei.yoshida@gmail.com> [524a0b3ab036d1b1f094a80f5f28ef64f231cdbb]
+
+ Add tests for this const_node_iterator and add an assignment operator.
+
+
+2019-06-28 Kohei Yoshida <kohei.yoshida@gmail.com> [5020b19f47d5bf277e1b90431a44c2d676bb7eba]
+
+ Add iterator support to json::const_node.
+
+ And switch to using ranged for loop where applicable.
+
+2019-06-28 Kohei Yoshida <kohei.yoshida@gmail.com> [83dc8c68879fdd142084390339813b7fa4ad2fff]
+
+ Iterate through the field nodes.
+
+
+2019-06-27 Kohei Yoshida <kohei.yoshida@gmail.com> [3cdb05f30d16c4067b73a5af8aa95a645292528e]
+
+ Start putting things into orcus_json app instance. Not finished yet.
+
+
+2019-06-27 Kohei Yoshida <kohei.yoshida@gmail.com> [5bfc32d0bae5e71565ba44131b2cf6a41dc04709]
+
+ Move the code that maps json to spreadsheet in a separate source file.
+
+
+2019-06-27 Kohei Yoshida <kohei.yoshida@gmail.com> [6d3e6f4fab1b3e681433dc039fff8de246acfbf4]
+
+ Rename orcus_json_main.cpp to orcus_json_cli.cpp.
+
+
+2019-06-27 Kohei Yoshida <kohei.yoshida@gmail.com> [640e6371d0ad131706dbc2574726de98cec874f4]
+
+ Start parsing the map file.
+
+
+2019-06-27 Kohei Yoshida <kohei.yoshida@gmail.com> [cb13554678e8b2bdb4d8039970e71e6a9ad79b6a]
+
+ We can safely ignore these files.
+
+
+2019-06-27 Kohei Yoshida <kohei.yoshida@gmail.com> [8956f84b8aaf5c2c4dc6eafdfa159654caa56969]
+
+ Add skeleton orcus_json and json_map_tree class definitions.
+
+
+2019-06-27 Kohei Yoshida <kohei.yoshida@gmail.com> [c5293894aca06edc8a00b370f9ef5edd1a9478c2]
+
+ Pick up the map file content and make file_content movable.
+
+
+2019-06-26 Kohei Yoshida <kohei.yoshida@gmail.com> [a78d8eed96b6d48aab55f4b5e6fc3b1f6c710341]
+
+ Parse CLI parameters for the map mode.
+
+
+2019-06-26 Kohei Yoshida <kohei.yoshida@gmail.com> [73eb4ec6220e295d996e5220f2a32da5231b911a]
+
+ Very first test data set for json mapping. Still subject to change.
+
+
+2019-06-26 Kohei Yoshida <kohei.yoshida@gmail.com> [0f8211062e271992341d3180ad6d0b2e7944ddc2]
+
+ This is probably wrong too, since we are parsing an object...
+
+
+2019-06-26 Kohei Yoshida <kohei.yoshida@gmail.com> [fe11df7199c7a1816e9dec6994e04e6906d139b3]
+
+ Set the expectation straight.
+
+ The code was expecting either '}' or ',' for sure, but that's not what
+ the exception message said.
+
+2019-06-26 Kohei Yoshida <kohei.yoshida@gmail.com> [89c3a9f4b4e398042a9b8ddd29e338f3c935aee9]
+
+ Capture json parse error in a single place.
+
+ Both for convert and structure mode, and probably for the future
+ map mode implementation.
+
+2019-06-25 Kohei Yoshida <kohei.yoshida@gmail.com> [58688aa83cb4570bc607d88641aec262646af771]
+
+ Extract the convert mode arg parsing into its own function.
+
+
+2019-06-25 Kohei Yoshida <kohei.yoshida@gmail.com> [3e877c8a463e5f17b3c4f8a913b67631eeec3276]
+
+ Add 'map' mode and adjust the parsing code accordingly.
+
+
+2019-06-24 Kohei Yoshida <kohei.yoshida@gmail.com> [11ce5652ca7319842b7ab27c1cf8b0178a049c6d]
+
+ Make sure we handle empty structures correctly.
+
+
+2019-06-24 Kohei Yoshida <kohei.yoshida@gmail.com> [e9dd23339d8304dbabe1c2829de4f920a6723858]
+
+ Regen the expected outputs for unit tests.
+
+
+2019-06-24 Kohei Yoshida <kohei.yoshida@gmail.com> [5a24c87547e6224ffdf2933c912066784128182a]
+
+ Change the structure output to make the paths look a bit like JSONPath.
+
+ Not exactly identical to JSONPath, but close...
+
+2019-06-24 Kohei Yoshida <kohei.yoshida@gmail.com> [3b525e46bdd6dfdcd3aeedd7f1e5e3283c24f390]
+
+ Omit the final 'value' node in json structure output when displaying.
+
+
+2019-06-22 Kohei Yoshida <kohei.yoshida@gmail.com> [934f44292c8c215b1c75843a6caea6f779c84bb5]
+
+ Handle transient strings properly.
+
+
+2019-06-22 Kohei Yoshida <kohei.yoshida@gmail.com> [58076df48d65fbcdbac3cc8224ae80e0e9aed37b]
+
+ I forgot to remove these debug statements.
+
+
+2019-06-22 Kohei Yoshida <kohei.yoshida@gmail.com> [e7abe5b5799af707fdd0f2f5cb82a88317771f88]
+
+ Add test for json::structure_tree::dump_compact().
+
+
+2019-06-22 Kohei Yoshida <kohei.yoshida@gmail.com> [0abaa6858c6be983c1c9f4abf3292160886e67be]
+
+ Expected output file should be named check.txt.
+
+
+2019-06-22 Kohei Yoshida <kohei.yoshida@gmail.com> [45eaf06c7c28a4668ec338221d43c6c0cf3d12ea]
+
+ Generate expected outputs.
+
+
+2019-06-22 Kohei Yoshida <kohei.yoshida@gmail.com> [adda2250f03d394f4b2981ec4485ea181661d141]
+
+ Three more test json contents.
+
+
+2019-06-22 Kohei Yoshida <kohei.yoshida@gmail.com> [e48ec10665b6166d62e22639c544f60e2c8b3dc3]
+
+ Slight format tweak.
+
+
+2019-06-21 Kohei Yoshida <kohei.yoshida@gmail.com> [e8027fe541715510c1e2aed2eafcdaf60a8ba7cd]
+
+ Let's make sure we handle all value types equally.
+
+
+2019-06-21 Kohei Yoshida <kohei.yoshida@gmail.com> [71f1be032a2d273983a7ea6220b2c251a88900aa]
+
+ Handle object key nodes.
+
+ Object key nodes are special non-leaf nodes in that they can only store
+ one child node. As such, we need to immediately move up the scope
+ whenever the scope position moves up to an object key node.
+
+2019-06-21 Kohei Yoshida <kohei.yoshida@gmail.com> [39bcaf55f95df286cf5d895cdc6ad44a2313cc5e]
+
+ Pick up the output file path parameter also for the structure mode.
+
+
+2019-06-21 Kohei Yoshida <kohei.yoshida@gmail.com> [4cfc4a815ab9166990d5a3a156777e9d83266129]
+
+ Record array widths in the JSON structure tree.
+
+ A width of an array node in a structure tree is the maximum width of
+ an array for that particular node.
+
+2019-06-21 Kohei Yoshida <kohei.yoshida@gmail.com> [0ed5d32c00a5914bea1081950c0ccfbc7af87f0d]
+
+ Handle repeating structure nodes.
+
+ The current prevailing rule is that only an object or array node that
+ is a child of an array node can be repeatable.
+
+2019-06-20 Kohei Yoshida <kohei.yoshida@gmail.com> [3ddfb30dc7dcfcb9154ba32b403ff94e47cd71fa]
+
+ Implement dumping of tree for simple nested arrays.
+
+ Still incomplete.
+
+2019-06-20 Kohei Yoshida <kohei.yoshida@gmail.com> [84e3ac0542a18fad26f513c7dae5b43263877852]
+
+ Allow equality check for object key nodes.
+
+ Object key nodes must be compared by the key value as well.
+
+2019-06-20 Kohei Yoshida <kohei.yoshida@gmail.com> [206954e1f488d267119265e91d56e3524330f621]
+
+ First test JSON content.
+
+ This one consists of simple nested arrays with numeric values.
+
+2019-06-19 Kohei Yoshida <kohei.yoshida@gmail.com> [87850b9912a8f36037169cc6e478018573361141]
+
+ WIP: start parsing json to build structure tree.
+
+
+2019-06-18 Kohei Yoshida <kohei.yoshida@gmail.com> [22616dd8df24d033e50533ba455e40117e91d0e7]
+
+ Set up an empty json parser handler.
+
+
+2019-06-18 Kohei Yoshida <kohei.yoshida@gmail.com> [73d600fd9c8e4545b3f4c64041e56fb7fca9e305]
+
+ More on switching to using std::unique_ptr from raw pointer.
+
+
+2019-06-18 Kohei Yoshida <kohei.yoshida@gmail.com> [5838d0e5d2e2a1ba34097b8ebbeb7a15637f632b]
+
+ Avoid use of raw pointer here...
+
+
+2019-06-18 Kohei Yoshida <kohei.yoshida@gmail.com> [d3eec7b0b48ef37a887fc916bd0f8f87d7482cfd]
+
+ Modernize the code a bit.
+
+
+2019-06-18 Kohei Yoshida <kohei.yoshida@gmail.com> [9af9bc083f6efc545c525210e2bedc9ffac3c75a]
+
+ Use sorted_string_map here.
+
+
+2019-06-17 Kohei Yoshida <kohei.yoshida@gmail.com> [2dff8a8ed020574ff03fda6fb463ca1ebae1e376]
+
+ Make sure an input file is given even for the structure mode.
+
+ Also, let's just put the whole main function body in a try block...
+
+2019-06-17 Kohei Yoshida <kohei.yoshida@gmail.com> [d996681295b0dc723391043839d0bdf0ac3693f9]
+
+ Add empty json_structure_tree class and use it from the cli main code.
+
+
+2019-06-17 Kohei Yoshida <kohei.yoshida@gmail.com> [ddc4758d6065241877f800665998c95d500aa057]
+
+ cmd_context -> cmd_params. The word 'context' is overused (by me).
+
+
+2019-06-17 Kohei Yoshida <kohei.yoshida@gmail.com> [bc2af2a456e6b978090f7583ba4bcb453cd45b05]
+
+ Output to stdout when the output file path is not given.
+
+
+2019-06-17 Kohei Yoshida <kohei.yoshida@gmail.com> [bb8960335a493e38bdade8fb096f07d14f85f4da]
+
+ Add --mode option to orcus-json.
+
+
+2019-06-17 Kohei Yoshida <kohei.yoshida@gmail.com> [e430f3d826e41344f5482bb93cb56d1efc619eea]
+
+ Correct my English.
+
+
+2019-06-17 Kohei Yoshida <kohei.yoshida@gmail.com> [4c85aef95ed01728fe68a9daa2f20752db46e328]
+
+ Generate better error message on missing map file.
+
+ Also, improve the help output a bit.
+
+2019-06-17 Kohei Yoshida <kohei.yoshida@gmail.com> [840aae66d7bdc2ec66b62f2fccc25cb01aab9d5b]
+
+ Use ORCUS_ASCII here.
+
+
+2019-06-17 Kohei Yoshida <kohei.yoshida@gmail.com> [ebb73553c11cb7763b60a1c36303bd44186a7b5a]
+
+ Remove duplicated code blocks. Related to #83.
+
+
+2019-06-17 Kohei Yoshida <kohei.yoshida@gmail.com> [93a0f6d091d643462788a7faaf064854dc1c797f]
+
+ Correctly handle ']' that occurs right after '['.
+
+ Also, make sure that we only recognize 0x09, 0x0A, 0x0D and 0x20 to be
+ whitespace characters when parsing JSON.
+
+ This fixes #83.
+
+2019-06-16 Kohei Yoshida <kohei.yoshida@gmail.com> [8db6eabdbad399369696887d2b59d444ed030685]
+
+ Some formatting change.
+
+
+2019-03-21 Kohei Yoshida <kohei.yoshida@gmail.com> [c3d4ef51d24e09162d6e2918cb45d1168f2c74de]
+
+ Add some inline docs.
+
+
+2019-03-21 Kohei Yoshida <kohei.yoshida@gmail.com> [a1231ee9a50a9ae58d185a5b67c3b82fd15cf352]
+
+ Remove the remaining uses of load_file_content(), and remove the function.
+
+
+2019-03-20 Kohei Yoshida <kohei.yoshida@gmail.com> [e895a34ce74b0572e48e48f5a6c4f9c480fa7978]
+
+ More on replacing load_file_content().
+
+
+2019-03-19 Kohei Yoshida <kohei.yoshida@gmail.com> [34d78934298a272c35fb703803e6dbc3aa375fc8]
+
+ More on replacing use of load_file_content() with file_content class.
+
+
+2019-03-19 Kohei Yoshida <kohei.yoshida@gmail.com> [4d641016acc051c2308e775f4900fc92f2a8de71]
+
+ Use file_content for css loading.
+
+
+2019-03-19 Kohei Yoshida <kohei.yoshida@gmail.com> [395b1cd6188ef7796a9adc72d19f6a5e39944e86]
+
+ Move the utf-8 conversion function to file_content class.
+
+ It makes more sense this way.
+
+2019-03-19 Kohei Yoshida <kohei.yoshida@gmail.com> [3a70aef91ecee787ee72f6921c4afb29899b3650]
+
+ Workaround for MSVC.
+
+ Without this, you'd get a linker error for undefined function.
+
+2019-03-18 Kohei Yoshida <kohei.yoshida@gmail.com> [88052e205828d63a211a06d3d94d1b66e4411912]
+
+ Create a file_content that memory-maps file instead of loading to memory.
+
+ And use this class in orcus_csv first.
+
+2019-03-15 Kohei Yoshida <kohei.yoshida@gmail.com> [c9479978417ab13dc75c68005240e585eb387258]
+
+ Let's also handle UTF-16 little-endian as well.
+
+ This is related to #80.
+
+2019-03-14 Kohei Yoshida <kohei.yoshida@gmail.com> [38ff668bff16f7cacfc9639ea62ad82199a2aad1]
+
+ Annotate the function.
+
+
+2019-03-14 Kohei Yoshida <kohei.yoshida@gmail.com> [5829b0d5a1610ce42aacdffe48f1025614f1f8b3]
+
+ Convert UTF-16 big-endian file per BOM.
+
+ This resolves #80.
+
+2019-03-13 Kohei Yoshida <kohei.yoshida@gmail.com> [b2646739d9ac1922cb4cc8d981b70655b7f94e40]
+
+ Add a test case for the upper-case color names.
+
+
+2019-03-13 Kohei Yoshida <kohei.yoshida@gmail.com> [c3a757f1d9c3dbf5622e985181a4d541081c75f1]
+
+ Make sure the colored names are evaluated in a case-insensitive manner.
+
+
+2019-03-13 Kohei Yoshida <kohei.yoshida@gmail.com> [cdbfa702e1808053536cf8fca957e4ea29cf3ceb]
+
+ Add a test case to ensure that the colors are imported properly.
+
+
+2019-03-13 Kohei Yoshida <kohei.yoshida@gmail.com> [e29c252e0d10065b173ff8edadab5720bfb415e6]
+
+ Add named-color to the list of content checks.
+
+
+2019-03-13 Kohei Yoshida <kohei.yoshida@gmail.com> [effc2ad5fc3cc84e4163e3f51a94ebc3297d2e74]
+
+ Make use of to_color_rgb_from_name() to handle named colors properly.
+
+
+2019-03-12 Kohei Yoshida <kohei.yoshida@gmail.com> [d7f2ee12936e055ac071b540d43bad49cecab239]
+
+ Add a new public utility function to convert color name to RGB.
+
+ Still not tested yet.
+
+2019-03-12 Kohei Yoshida <kohei.yoshida@gmail.com> [66ce2c1dc30086ab7c039c66a8d650a465b6ef85]
+
+ Create a valid test file with named colors.
+
+ * saved-by-excel.xml - original source XMLSS file saved by Excel.
+ * input.xml - source file with the raw RGB values replaced with their
+ respective color names. Excel can still open this file without errors
+ and their colors intact. So I assume this file is valid.
+
+2019-03-12 Kohei Yoshida <kohei.yoshida@gmail.com> [78065b9e750b0b31fa0f3d521933d07e36aadc96]
+
+ Script to replace raw RGB values to their respective color names.
+
+
+2019-03-11 Kohei Yoshida <kohei.yoshida@gmail.com> [da521afc9297597b5ee9b33a98f7f25d2a9e20aa]
+
+ Test file that contains all named colors from CSS color 3.
+
+ This is the original file saved from Excel. I need to find a way
+ to auto-convert the raw RGB values to their named equivalents.
+
+2019-03-11 Kohei Yoshida <kohei.yoshida@gmail.com> [9fa69b43db0aba9330fb463f932c6f5200b11461]
+
+ Be specific about the ixion API version it requires.
+
+
+2019-03-08 Kohei Yoshida <kohei.yoshida@gmail.com> [c635930d63b6e0f0b051ab7f4c7e150c1e790f8d]
+
+ Use virtual dtor when using class inheritance with virtual methods.
+
+
+2019-03-08 Kohei Yoshida <kohei.yoshida@gmail.com> [3c1f94102bbba5140f86e5d38268f40e1cf19630]
+
+ I forgot to add this file.
+
+
+2019-03-08 Kohei Yoshida <kohei.yoshida@gmail.com> [781d993bf1b1f97369c6dc28ae0bf08e7d9fced8]
+
+ Add another test case for triply-nested row groups.
+
+ Also, let's not write output xml unless we want to compare input to
+ output.
+
+2019-03-08 Kohei Yoshida <kohei.yoshida@gmail.com> [16e40f5078dfce1823c0e113e738588a01c4c857]
+
+ Don't forget to initialize this data member.
+
+ Now the test passes.
+
+2019-03-08 Kohei Yoshida <kohei.yoshida@gmail.com> [bef98a78886c3604ba7ff977a1c76e0a1ad467c5]
+
+ Use lossless numeric format for dump-check.
+
+ Also modify the nested row-group test. It currently fails.
+
+2019-03-08 Kohei Yoshida <kohei.yoshida@gmail.com> [fe6f72a45b8256a9e2d56440bd82b9f021b25076]
+
+ This is no longer needed. Remove it.
+
+
+2019-03-08 Kohei Yoshida <kohei.yoshida@gmail.com> [dc84d5eb886f10fb22ed9889f25dafce1736f1ec]
+
+ Properly implement filling down of parent row-group element values.
+
+
+2019-03-08 Kohei Yoshida <kohei.yoshida@gmail.com> [eb1e47c38dd943ce677ef1354a072df7a31c0126]
+
+ Rename row_size to row_position. The latter sounds more appropriate.
+
+
+2019-03-06 Kohei Yoshida <kohei.yoshida@gmail.com> [d6fa3d8051daf6bbe7134ec6ceba6bea90b4bbb7]
+
+ Add logic & hook to copy cell values down the columns for parent values.
+
+ For now I'm setting "---" value to those cells that need to be filled. Next
+ step is to implement copying down of the values.
+
+2019-03-06 Kohei Yoshida <kohei.yoshida@gmail.com> [7b2b5b2c58d3d5b69914def175c673028c3f1944]
+
+ Add a bit of annotation.
+
+
+2019-03-05 Kohei Yoshida <kohei.yoshida@gmail.com> [76f7810a725659f22c517856a309ef0442a45c1b]
+
+ Add a central place to manage numeric value formatting for file output.
+
+ And this format _must_ be lossless.
+
+2019-03-01 Kohei Yoshida <kohei.yoshida@gmail.com> [a883b55101f9288a39151bd5427b234b7f2c1433]
+
+ Revise the logic of incrementing the row position to support nested groups.
+
+ We now require explicit row-group definitions in the map file.
+
+2019-02-28 Kohei Yoshida <kohei.yoshida@gmail.com> [b04b664adc873de6cf80fccc252710b7c6cea6aa]
+
+ Remove excessive typedef.
+
+
+2019-02-27 Kohei Yoshida <kohei.yoshida@gmail.com> [7c0e62fb076985aa8c08fcc6c1261fef2755df86]
+
+ Rename get_element_stack() to get_linked_node() ...
+
+ ... and have it return both the element stack and the linked node pointer.
+
+2019-02-27 Kohei Yoshida <kohei.yoshida@gmail.com> [c9f1f34425b7b80494b6a4e482daa098833b3859]
+
+ Another place we can use get_or_create_child().
+
+
+2019-02-27 Kohei Yoshida <kohei.yoshida@gmail.com> [c39c7e2ce21b08ddc108216433eb89525858e069]
+
+ Extract a method here as well.
+
+
+2019-02-27 Kohei Yoshida <kohei.yoshida@gmail.com> [99eaddc7d0171e890e1114cb9343b5a81aa953ed]
+
+ Extract method for ease of read.
+
+
+2019-02-26 Kohei Yoshida <kohei.yoshida@gmail.com> [6e12e838f8c074c6cc4315e3765fae87fa7a8134]
+
+ intern() can take a pstring instance now.
+
+
+2019-02-26 Kohei Yoshida <kohei.yoshida@gmail.com> [b9a67db431b506fe4fe603138fb65e0693d0fbcb]
+
+ Use unique_ptr for the root element instance as well.
+
+
+2019-02-26 Kohei Yoshida <kohei.yoshida@gmail.com> [6da475db306466c138d1c33d271e75cbb7d59c2f]
+
+ Use unique_ptr to replace raw pointer with new.
+
+
+2019-02-26 Kohei Yoshida <kohei.yoshida@gmail.com> [144122558aa79daabfafc9cc1ad2909a793552ec]
+
+ Use unique_ptr for this pimpl idiom.
+
+
+2019-02-25 Kohei Yoshida <kohei.yoshida@gmail.com> [49899c9b8e924950477ce959724715874d40a319]
+
+ Test file to use to implement nested repeat elements.
+
+
+2019-02-21 Kohei Yoshida <kohei.yoshida@gmail.com> [ecd6bc630bf946bc78820073d297407a4703ca6d]
+
+ Point to the readthedocs doc.
+
+
+2019-02-21 Kohei Yoshida <kohei.yoshida@gmail.com> [21992002cfae64ac941bbeb84b8a3fc13f502602]
+
+ Adjust the doc configuration for readthedocs build.
+
+
+2019-02-20 Kohei Yoshida <kohei.yoshida@gmail.com> [37bfd4efa28d712c2d7217347d46c1fae1797e55]
+
+ Enable sax-token-parser-test in cmake build.
+
+
+2019-02-20 Kohei Yoshida <kohei.yoshida@gmail.com> [0e2be8524b1d1bbccfbba2e39bb426b062e0b20a]
+
+ Add sax-parser-test to the cmake test.
+
+
+2019-02-20 Kohei Yoshida <kohei.yoshida@gmail.com> [bf0c6b115531287d4ba5f522a7e7ab48600d572e]
+
+ Fix cmake build.
+
+
+2019-02-20 Kohei Yoshida <kohei.yoshida@gmail.com> [c93e27e211fc5221df24cf648942954607c4030a]
+
+ Finally make use of the output format in orcus-xml.
+
+
+2019-02-20 Kohei Yoshida <kohei.yoshida@gmail.com> [7a8ece3b4f9ba9c8f0cd4eca716530794fd17ce3]
+
+ Remove the unnecessary virtual method interfaces.
+
+
+2019-02-20 Kohei Yoshida <kohei.yoshida@gmail.com> [2b4b4f679d540cde2d21f4a1d93b1370999cf9ce]
+
+ Add dump() method interface that takes dump format type as parameter.
+
+
+2019-02-20 Kohei Yoshida <kohei.yoshida@gmail.com> [f81876c49ec6fc56bdc454790c126618a29ecacd]
+
+ I shouldn't use argv here...
+
+
+2019-02-19 Kohei Yoshida <kohei.yoshida@gmail.com> [a94c5a58fdbeab3d683f3c26ab064e0d030c2bcc]
+
+ Add output-format option to orcus-xml. Not used yet.
+
+
+2019-02-19 Kohei Yoshida <kohei.yoshida@gmail.com> [d79acf35b0d05303d1e0cdd9cb1172f0beeb6274]
+
+ A bit more simplification.
+
+
+2019-02-19 Kohei Yoshida <kohei.yoshida@gmail.com> [a23f0f4258af7a535deee5fcce2ea239ec49096e]
+
+ Move doc_output_format::type to a public place and call it dump_format_t.
+
+ And use it where doc_output_format::type was expected.
+
+2019-02-19 Kohei Yoshida <kohei.yoshida@gmail.com> [841a812040b35b99cb38c3645d13eee16355ad7f]
+
+ Use std::unique_ptr to replace a naked pointer.
+
+
+2019-02-18 Kohei Yoshida <kohei.yoshida@gmail.com> [fc16018f874c0026c24530c53f9d2c4d7cd4bdab]
+
+ Add the ability to dump the XML structure information.
+
+
+2019-02-18 Kohei Yoshida <kohei.yoshida@gmail.com> [c2c5bcecf098d6f643d55f561e928f30f568e8df]
+
+ Make use of the --output option.
+
+
+2019-02-18 Kohei Yoshida <kohei.yoshida@gmail.com> [f43bfaab083a8b66f800a559be660b872888abb8]
+
+ Switch to using boost::program_options for handling CLI arguments.
+
+
+2019-02-14 Kohei Yoshida <kohei.yoshida@gmail.com> [7adfed69d1627f3962f404bc3e03455ec229502a]
+
+ Use memcmp over strncmp for slightly better performance.
+
+
+2019-02-14 Kohei Yoshida <kohei.yoshida@gmail.com> [8101665fd75efbeef1824b78a0579143c40f4860]
+
+ Prevent integer overflow going from size_t to int.
+
+ For a very large stream, the length can be greater than the max value
+ of 32-bit signed integer...
+
+2019-02-14 Kohei Yoshida <kohei.yoshida@gmail.com> [91753487b67c1c9904f20c8797c65b2ca3eed018]
+
+ Append offset value to the exception message.
+
+
+2019-02-13 Kohei Yoshida <kohei.yoshida@gmail.com> [e4941bc995e0bae31a736d9a33e248bd4a6851eb]
+
+ Use skip_space_and_control() over its own blank().
+
+ This seems to slightly improve the XML parsing performance.
+
+2019-02-13 Kohei Yoshida <kohei.yoshida@gmail.com> [470130f7a17f218dcf1f7dac1c9fcc2e05971c21]
+
+ Use SSE 4.2 to parse XML element names.
+
+ This one does make the XML parsing slightly but noticeably faster.
+
+2019-02-12 Kohei Yoshida <kohei.yoshida@gmail.com> [53f3976500594a61972aeb42baea79034bdd36a8]
+
+ Fix a bug in pstring's equality check.
+
+ Pointing to the same buffer doesn't necessary mean equality; we still
+ need to check their sizes.
+
+2019-02-11 Kohei Yoshida <kohei.yoshida@gmail.com> [649b0c10d6ebd511b4799b953b88e7036ada620b]
+
+ This callback method is no longer used.
+
+
+2019-02-11 Kohei Yoshida <kohei.yoshida@gmail.com> [96edfa8b460f1ed3af4779eed01e68b5c20a1613]
+
+ Add test case for transient stream handling in sax_parser.
+
+
+2019-02-11 Kohei Yoshida <kohei.yoshida@gmail.com> [4a286c8c3240d2572d1f8c54f52421f4fb226a01]
+
+ Have dom::document_tree to support transient streams.
+
+
+2019-02-11 Kohei Yoshida <kohei.yoshida@gmail.com> [c6f29b32b0685cea25e18a94f1750645c93e5ce0]
+
+ Propagate the transient_stream parser flag up to sax_token_parser.
+
+ A test case (or two) has yet to be added.
+
+2019-02-10 Kohei Yoshida <kohei.yoshida@gmail.com> [2408e745ce581421eb1c78ec7384499915de6a44]
+
+ Add a boolean flag to specify whether the stream itself is transient.
+
+ And use this flag in the sax_parser code to determine the transient
+ flag for each call site. This *should* cover all of sax_parser,
+ sax_ns_parser and sax_token_parser since the latter two do not do
+ their own transient flag handling.
+
+2019-02-08 Kohei Yoshida <kohei.yoshida@gmail.com> [e4cbec0954318ecce8eb0affd33840c9abb3efbf]
+
+ This assertion is simply incorrect.
+
+ It's valid for an XML attribute to have an encoded character
+ immediately followed by a ';'.
+
+ This fixes #77.
+
+2019-02-06 Kohei Yoshida <kohei.yoshida@gmail.com> [6067fa45d90fb913c39c04fb75c7b14fdb62b479]
+
+ dom_tree -> dom::document_tree.
+
+
+2019-02-06 Kohei Yoshida <kohei.yoshida@gmail.com> [f5c862ec3c6cfb1e7b6424d5bff1d43eb835d57b]
+
+ A bit more test code...
+
+
+2019-02-06 Kohei Yoshida <kohei.yoshida@gmail.com> [80af553aad903a0f60bcf7ab5c55b352c89a6c68]
+
+ When no parent exists, the node type becomes unset.
+
+
+2019-02-06 Kohei Yoshida <kohei.yoshida@gmail.com> [4e3bf672fa3dc4026552d98e12647a0d9555b987]
+
+ Remove 'content' node type.
+
+ Also make sure the copying works.
+
+2019-02-06 Kohei Yoshida <kohei.yoshida@gmail.com> [f8ceee372e0ef5b36931abc0added4002f1c4ce7]
+
+ The attribute node type is no longer applicable.
+
+
+2019-02-06 Kohei Yoshida <kohei.yoshida@gmail.com> [421de16eb842b55ee940fac48e5c51aef5ff0203]
+
+ Add parent() method and equality and non-equality methods.
+
+
+2019-02-06 Kohei Yoshida <kohei.yoshida@gmail.com> [c9ff699663df5660812ddf3dcd7ca1dde8e5af16]
+
+ Add attribute_count().
+
+ It returns non-zero only from declaration and element instances.
+
+2019-02-05 Kohei Yoshida <kohei.yoshida@gmail.com> [7add5706f4c6d79cca775625584b5c712be897c8]
+
+ Start supporting element hierarchy traversal. Not finished yet.
+
+
+2019-02-05 Kohei Yoshida <kohei.yoshida@gmail.com> [9dfccd3f5526751a5231c068e9ebe6bdbca7bf74]
+
+ Support element name retrieval.
+
+
+2019-02-05 Kohei Yoshida <kohei.yoshida@gmail.com> [95a6a2168661eb9d7ed0f55f5fde0ed630ab627c]
+
+ Have declaration support attribute() instead.
+
+ This feels more natural & the code becomes more concise.
+
+2019-02-05 Kohei Yoshida <kohei.yoshida@gmail.com> [95d4c97a26b9fc3fbdecb06ffe248da71cade9d7]
+
+ Implement the hash function for entity_name.
+
+
+2019-02-05 Kohei Yoshida <kohei.yoshida@gmail.com> [b2d188d5ebda9083e805148c718f0a5738a8691c]
+
+ Test for a non-existing attribute.
+
+
+2019-02-05 Kohei Yoshida <kohei.yoshida@gmail.com> [69d3be4318e51a7aa7652731d7b5491ef9929bc0]
+
+ Support attribute() method in const_node.
+
+
+2019-02-05 Kohei Yoshida <kohei.yoshida@gmail.com> [6a80e1bed1eb6ff0431a0217b86bf45a3ae70500]
+
+ Get the root() method functional.
+
+
+2019-02-05 Kohei Yoshida <kohei.yoshida@gmail.com> [fdede58252f54edc8dbfa115788ea5620df380dd]
+
+ Modernize the code a bit.
+
+
+2019-02-05 Kohei Yoshida <kohei.yoshida@gmail.com> [6556833571bbaddb4c4cecd5bd837a24c6240e26]
+
+ Use std::deque here to avoid memory fragmentation.
+
+
+2019-02-05 Kohei Yoshida <kohei.yoshida@gmail.com> [2c2e3a93a850a19d3c851c2218553f7699a7e1a1]
+
+ Move up the dom_tree::impl method code & use lambda for std::sort.
+
+
+2019-02-05 Kohei Yoshida <kohei.yoshida@gmail.com> [69e616f56c335e674699a19e10ae8a493af94557]
+
+ Move the internal structure types into hiding.
+
+
+2019-02-04 Kohei Yoshida <kohei.yoshida@gmail.com> [2cae144f9e0cdfc99232fc9948602abe445a8cf2]
+
+ Move the print() function for attr into a private space.
+
+
+2019-02-04 Kohei Yoshida <kohei.yoshida@gmail.com> [66c1324cae88eca0e7b46c02ff141f0a27c054c2]
+
+ Use dom::entity_name instead of dom_tree::entity_name.
+
+
+2019-02-04 Kohei Yoshida <kohei.yoshida@gmail.com> [c0038a90008516cec4627ce2aefdadae0e5f8e82]
+
+ Use the node-based traversal method.
+
+ And remove the old get_declaration_attributes() method.
+
+2019-02-04 Kohei Yoshida <kohei.yoshida@gmail.com> [03030add98c0362b645caca9b1fd483beee0c447]
+
+ Add test case for traversing declarations.
+
+
+2019-02-04 Kohei Yoshida <kohei.yoshida@gmail.com> [1e29beac50e959765f4b26c39debf842822b85d0]
+
+ This type is an implementation detail. Hide it.
+
+
+2019-02-01 Kohei Yoshida <kohei.yoshida@gmail.com> [95fb6095a860c733558bee5b920b99b6e972e14d]
+
+ Use std::unique_ptr instead of naked new.
+
+
+2019-02-01 Kohei Yoshida <kohei.yoshida@gmail.com> [2b5acf44b578f6ce59c4421774e6560c5147a157]
+
+ Use dom_tree::impl as the handler for the sax parser.
+
+ And move dom_tree's original handler methods to its impl counterpart.
+ Now its interface looks a lot cleaner.
+
+2019-02-01 Kohei Yoshida <kohei.yoshida@gmail.com> [c74d4e765b1c46e1945a0a18bfdffb5b5d786adb]
+
+ Remove these files from the slickedit project.
+
+
+2019-02-01 Kohei Yoshida <kohei.yoshida@gmail.com> [795b79a66d01c7fd4bd2fff73f92a86bcc8bb470]
+
+ Fix AVX2 version of skip_space_and_control().
+
+ Turns out that _mm256_cmpgt_epi8() is a comparison of *signed*
+ integers, which means any value greater than 0x7F is considered
+ smaller than whitespace thus to be skipped. We need to work around
+ this by checking for the signed bit and mark that char disqualified
+ if it's on.
+
+ If there is an equivalent AVX intrinsic for unsigned integers, we
+ chould use that instead. But so far I couldn't find one.
+
+2019-01-31 Kohei Yoshida <kohei.yoshida@gmail.com> [80c29d71c16b3791fcfd5d15c2446c0193284fc3]
+
+ Use dom_tree directly. Now dom_tree_sax_handler is no longer used.
+
+
+2019-01-31 Kohei Yoshida <kohei.yoshida@gmail.com> [bc109ad09d5c9abac32004d4dcf3824ff45d29cd]
+
+ dom_tree_impl -> dom_tree::impl.
+
+
+2019-01-30 Kohei Yoshida <kohei.yoshida@gmail.com> [057492a8fd724c0b1bfeb91d32ef9bc5ef791bca]
+
+ Add AVX2 variant of skip_space_and_control().
+
+
+2019-01-29 Kohei Yoshida <kohei.yoshida@gmail.com> [2ae22680b94d86fb2856d0b74bdb918673b24d30]
+
+ Add compiler flag for AVX2 for cmake-based build.
+
+
+2019-01-29 Kohei Yoshida <kohei.yoshida@gmail.com> [64c995ad3c2ed877580abad6fb7fd4f08f3f4e37]
+
+ Simply use cmake's configure_file for this.
+
+
+2019-01-29 Kohei Yoshida <kohei.yoshida@gmail.com> [7432760f2e2db8b7b5222f2075960f8a55c31933]
+
+ option() is for boolean flags. set() is for string options.
+
+
+2019-01-29 Kohei Yoshida <kohei.yoshida@gmail.com> [09843f7e5676d22e0bd7f5178c328a623e79d1f5]
+
+ Boost_USE_STATIC_LIBS should be set externally.
+
+ Also run the tests in quiet mode during the build.
+
+2019-01-22 Kohei Yoshida <kohei.yoshida@gmail.com> [5f3ef41a96bb6f6237cd945bcdbd41c832935eea]
+
+ Fix the make check build on the Linux side.
+
+
+2019-01-22 Kohei Yoshida <kohei.yoshida@gmail.com> [c1c433eced50838f15246551d1a1eee2bfad42d9]
+
+ Use boost::filesystem::remove() to remove files.
+
+
+2019-01-22 Kohei Yoshida <kohei.yoshida@gmail.com> [06ece7dbb8c6d10361aa18032c6e138fa4831262]
+
+ Add option to turn on SSE 4.2 with CMake-based build.
+
+
+2019-01-22 Kohei Yoshida <kohei.yoshida@gmail.com> [ff96ba9ff6474ff75fbe9e49ca038f43052e05d7]
+
+ Add test programs in src to CMake-based build.
+
+
+2019-01-18 Kohei Yoshida <kohei.yoshida@gmail.com> [7a4d23c547a8b0d2bd384983fb9694c986a61791]
+
+ Actually I can use const_cast hack to make the node non-copyable.
+
+ This is a legitimate workaround for the time being, until we have a
+ moveable initializer_list.
+
+ c.f. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4166.pdf
+
+2019-01-18 Kohei Yoshida <kohei.yoshida@gmail.com> [457819b751275e1a044046bc67fc62919d1fd58a]
+
+ Fix json document initialization with nested initializer lists.
+
+ This type of initialization
+
+ json::document_tree doc = {
+ { true, false, nullptr },
+ { 1.1, 2.2, "text" }
+ };
+
+ failed previously because the inner initializer list instance would
+ delete all the enclosing node instances before handing them to the
+ outer initializer list. The code was "moving" the inner initializer
+ list to the outer one, which seems to have worked with gcc, but MSVC
+ does not move the values.
+
+ This change makes the initialization node copyable, and copy them
+ before handing them over to the outer list. Not ideal, but better
+ than not working...
+
+2019-01-18 Kohei Yoshida <kohei.yoshida@gmail.com> [bda930efeff53fc7dff0c083f1776321c091ce59]
+
+ A bit more helpful exception message.
+
+
+2019-01-18 Kohei Yoshida <kohei.yoshida@gmail.com> [c45632ee68832e87982ba4f740d1f5b19c57bbd3]
+
+ Add most of the test programs for the liborcus target.
+
+
+2019-01-18 Kohei Yoshida <kohei.yoshida@gmail.com> [289deb50be72eae854f2e27b7bee0a0966ff7ee6]
+
+ Use the python interpreter the builder has specified.
+
+
+2019-01-18 Kohei Yoshida <kohei.yoshida@gmail.com> [e1b8fa3f0e1704e3eda3790f930d53fcac10afa9]
+
+ No need to specify full source paths. CMake looks into current dir.
+
+ And if one needs to specify full path, you can always use the
+ CMAKE_CURRENT_SOURCE_DIR variable.
+
+2019-01-18 Kohei Yoshida <kohei.yoshida@gmail.com> [348a4c2bda1c1b87cc1ce0d22fcc58593796a250]
+
+ Specify the full path of each test source file.
+
+
+2019-01-17 Kohei Yoshida <kohei.yoshida@gmail.com> [c915d16370e6743ea69db37c5d5420a2d95807fc]
+
+ Add parser tests to the CMake-based test framework.
+
+
+2019-01-17 Kohei Yoshida <kohei.yoshida@gmail.com> [3020b5906a12ca150fac79693100fafcc9ebaad5]
+
+ Split CMakeLists.txt into multiple, one per directory.
+
+ And use add_directory() to link them all together.
+
+2019-01-17 Kohei Yoshida <kohei.yoshida@gmail.com> [c1ba3926cf3d15b0cb8d61badf27dffecae7274e]
+
+ More on fixing the build with MSVC.
+
+ * Disable warnings on implicit type casting.
+ * Disable warnings on "unsafe" C API calls.
+ * Fix inconsistent linkage issue with certain public symbols.
+
+2019-01-16 Kohei Yoshida <kohei.yoshida@gmail.com> [048d872aeb7db9b3547030475475a4c2cd4ea544]
+
+ Get orcus to build again on Windows via CMake.
+
+
+2019-01-12 Kohei Yoshida <kohei.yoshida@gmail.com> [23a11e8c209480739da8e370f8fd31d716503efa]
+
+ Use 32-bit int type instead of size_t for better hashing performance.
+
+ Also use int values for loop condition.
+
+2019-01-12 Kohei Yoshida <kohei.yoshida@gmail.com> [8a29df751e620f102def548703bb8a3ad4bb3380]
+
+ Take advantage of the fact that most pstring instances are pooled.
+
+ This slightly improves parsing performance.
+
+2019-01-12 Kohei Yoshida <kohei.yoshida@gmail.com> [77420c6a6615f7173d97ad27880cf2f7a5fe74ea]
+
+ Up the size of the initial memory block.
+
+
+2019-01-12 Kohei Yoshida <kohei.yoshida@gmail.com> [2d8bbda2507249eac4755a1c075338b3b8704802]
+
+ Use boost::object_pool in the implementation of string_pool.
+
+ This addresses #69. Unfortunately this change doesn't give us
+ noticeable performance improvement I was hoping to see. But it
+ at least keeps the implementation a bit cleaner.
+
+2019-01-12 Kohei Yoshida <kohei.yoshida@gmail.com> [4195360c482dc158f9ff606aa76d3a84a62132d6]
+
+ Use ranged for loop instead of for_each.
+
+
+2019-01-12 Kohei Yoshida <kohei.yoshida@gmail.com> [09d014425056cad6a2b30a920b32f4e629004f39]
+
+ Set a default null date value.
+
+ Turns out a null date is not always specified in the document.
+
+2019-01-12 Kohei Yoshida <kohei.yoshida@gmail.com> [3fd8e011bca9fec6aedac33e0fffa8fb0e9e8c67]
+
+ Optionally support debug levels. Not used in the code yet.
+
+
+2019-01-11 Kohei Yoshida <kohei.yoshida@gmail.com> [4a28670be7fd750e38c9ff62fbc066b30b584cde]
+
+ Remove unused method.
+
+
+2019-01-09 Kohei Yoshida <kohei.yoshida@gmail.com> [c0e1b73635303f88a69d8ff95b32ac786afbd341]
+
+ Inline frequently used simple methods.
+
+
+2019-01-08 Kohei Yoshida <kohei.yoshida@gmail.com> [92f8b61b06b6987f58d6763715209299c44ee575]
+
+ Update the method doc to match the parameter addition.
+
+
+2019-01-08 Kohei Yoshida <kohei.yoshida@gmail.com> [276c91bc2fc51ea5bf1eb0d08cbd17029435e69b]
+
+ Implement parse_expected using SSE4.2 intrinsics.
+
+
+2019-01-08 Kohei Yoshida <kohei.yoshida@gmail.com> [ae2834ac3dac4888231a05d754096b34ee26f8aa]
+
+ Pass the length of the string since we already know it ahead of time.
+
+
+2019-01-08 Kohei Yoshida <kohei.yoshida@gmail.com> [0bee80ee946000480e7deba28883d7f6ea65d0f7]
+
+ Delay clipping of the segment length until before it's really needed.
+
+
+2019-01-07 Kohei Yoshida <kohei.yoshida@gmail.com> [4ecbc9dae1ae889bdc7a658db839d8f015e4b925]
+
+ Finally convert json_value_array, and remove 'store' from json_value.
+
+
+2019-01-07 Kohei Yoshida <kohei.yoshida@gmail.com> [f8aaf8f1b472a573af5c28a590063e71ba88d4d1]
+
+ Use object_pool for json_value_object.
+
+ This actually makes the code slightly slower with document with many objects.
+
+2019-01-07 Kohei Yoshida <kohei.yoshida@gmail.com> [64feb4d03869c8ab3f0e256045a8aed6f3f64508]
+
+ Remove json_value_kvp and store key-value pair directly with json_value.
+
+ This will not affect the performance of json document loading since this
+ node type is only used when initializing a json document via initializer.
+
+2019-01-07 Kohei Yoshida <kohei.yoshida@gmail.com> [90acef58b43121677ad0c4f295d2854203fba2fe]
+
+ Store a json string value directly with the json_value instance.
+
+ This shaves off roughly 0.7 seconds in my environment with
+
+ perf-test/files/files/json/many-string-values.json
+
+ as the input file.
+
+2019-01-07 Kohei Yoshida <kohei.yoshida@gmail.com> [00fa950d783a71446f22b2803fecaf11a1c3888a]
+
+ Store numeric value directly in json_value.
+
+ This shaves off roughly 0.5 seconds in my environment.
+
+2019-01-07 Kohei Yoshida <kohei.yoshida@gmail.com> [2072eda5d2578c0811d170036db4d5f97ad47c2e]
+
+ Use object pool to manage all json_value instances.
+
+
+2019-01-07 Kohei Yoshida <kohei.yoshida@gmail.com> [a5f1c5b69025eaf7ea01ab029f0da6153647eb7f]
+
+ Add object pool for json_value to the resource instance.
+
+ Also rename string_pool instance from pool to str_pool.
+
+2019-01-07 Kohei Yoshida <kohei.yoshida@gmail.com> [7e4680fd6351ceae86c54e734ddd073926b13032]
+
+ Wrap document's string_pool within document_resource struct.
+
+
+2019-01-06 Markus Mohrhard <markus.mohrhard@googlemail.com> [7f15dfb26e451228f5bf42b2fab4ed776aed4064]
+
+ enable more fixed json validation tests
+
+
+2019-01-06 Markus Mohrhard <markus.mohrhard@googlemail.com> [6d7570f9e24e7e293cbd61eb8a4663759d14c7fd]
+
+ for signed char this comparison would catch too many characters
+
+
+2019-01-06 Markus Mohrhard <markus.mohrhard@googlemail.com> [3ff8120238a87cd070bf5564bf9b5ad2924c56e6]
+
+ parse_number: don't eat the 'e' if exponent parsing fails
+
+
+2019-01-06 Markus Mohrhard <markus.mohrhard@googlemail.com> [90def344a8144c035449789298dc2ba12ebd16e7]
+
+ reorganize parse_number test cases
+
+
+2019-01-06 Markus Mohrhard <markus.mohrhard@googlemail.com> [2bb670f937bf4cafa3838dea35fa2a483d0865e9]
+
+ don't accept numbers without a digit
+
+ The following would be an invalid number "+." or "-.".
+
+2019-01-06 Markus Mohrhard <markus.mohrhard@googlemail.com> [3d4f564c90294d504f0ccfba8019b7713e7f361d]
+
+ add a few tests for the orcus::parse_numeric method
+
+
+2019-01-06 Markus Mohrhard <markus.mohrhard@googlemail.com> [2e4a66a297ffd3bc59b364d75bed78c7cacf3ac0]
+
+ json: at least one digit is needed for a valid number
+
+
+2019-01-06 Markus Mohrhard <markus.mohrhard@googlemail.com> [ae18da54dbb8bc44cac32ecb954efd395acf0b08]
+
+ json: enable fixed tests
+
+
+2019-01-06 Markus Mohrhard <markus.mohrhard@googlemail.com> [b0f789e322e854087fe91eaf493179ce75bd3a20]
+
+ json: at least some json content is required in a valid document
+
+
+2019-01-05 Markus Mohrhard <markus.mohrhard@googlemail.com> [a984f9b0f4ff17cd28cae9608cf689f31d9f41aa]
+
+ json: after trailing comma in object a new key is expected
+
+
+2019-01-05 Markus Mohrhard <markus.mohrhard@googlemail.com> [5132158b17b3a14200eed612f6d3b4a0eebb5898]
+
+ json: trailing comma in array is forbidden
+
+ We already handled the case where a space was following the comma. This now
+ also covers the case that the trailing ']' is directly following the comma.
+
+2019-01-05 Markus Mohrhard <markus.mohrhard@googlemail.com> [d57a142e6136cd89cd860646c91fd74bf9f50ad3]
+
+ Add validation test cases from nst/JSONTestSuite
+
+ Fixes #61.
+
+2019-01-03 Kohei Yoshida <kohei.yoshida@gmail.com> [e9a4479b44e4709fe4bb62b99690152b8b7ad4ba]
+
+ Add MPL 2.0 full license text.
+
+
+2019-01-03 Kohei Yoshida <kohei.yoshida@gmail.com> [7a14fe48d7f61788dfc4aa5c62996763652c5c13]
+
+ This was wrong. n was already clipped at 16 at all times.
+
+
+2019-01-03 Kohei Yoshida <kohei.yoshida@gmail.com> [2a02e8e2b169ef98857c2253c4d4bee3d548d5ff]
+
+ Add simple unit test for skip_space_and_control().
+
+
+2019-01-03 Kohei Yoshida <kohei.yoshida@gmail.com> [e8374cacf0cf0c34e8c339c36e5902df4dc98c22]
+
+ I believe we can simply subtract 16 here.
+
+ Since the only way the code path reaches here is when the segment
+ length is 16 (full length) and the whole segment consists of skippable
+ characters.
+
+2019-01-03 Kohei Yoshida <kohei.yoshida@gmail.com> [105c5af87996a7c9b256c6249df33022ef65877a]
+
+ Fix --enable-debug-utils configure switch.
+
+ Now, not specifying the switch will set its flag to 'no' (as it should).
+
+2019-01-03 Kohei Yoshida <kohei.yoshida@gmail.com> [4dcb2bd13d18318345fad50f6c9e5a2253c964be]
+
+ Add this file to the slickedit project.
+
+
+2018-12-10 Kohei Yoshida <kohei.yoshida@gmail.com> [da2f88a1a2e95aa61f36baddda0fcbba98ebc138]
+
+ Initialize this only once.
+
+
+2018-12-10 Kohei Yoshida <kohei.yoshida@gmail.com> [8e6c6686f7882b071e852c2cf376e6f712e65177]
+
+ Remove unnecessary branching.
+
+
+2018-12-10 Kohei Yoshida <kohei.yoshida@gmail.com> [4291c7b5c75e137d5e293974846abd9396403cea]
+
+ available_size() is actually correct here.
+
+
+2018-12-10 Kohei Yoshida <kohei.yoshida@gmail.com> [8ca4f060fb81078623ebc7c73755f3136eb2df28]
+
+ Try to reduce the number of function calls.
+
+
+2018-12-07 Kohei Yoshida <kohei.yoshida@gmail.com> [df27b948db4b1b854d01e93c7aca0e4db9563ac1]
+
+ Use SSE4.2 for skipping space and control characters.
+
+
+2018-12-07 Kohei Yoshida <kohei.yoshida@gmail.com> [fa1cc351e1dccdd9c1512753373e2fa4f32d09e4]
+
+ Implement SSE4.2 version of parser_base::skip().
+
+ And have json::parser_base::skip_blanks() use it. Unfortunately this
+ causes the parser to be a bit slower even with the speedup with the
+ SSE4.2 intrinsics.
+
+2018-12-05 Kohei Yoshida <kohei.yoshida@gmail.com> [8f2a6857c94bc4a0aec89fab8c7d04b2340c1b97]
+
+ Introduce available_size() to check the available character.
+
+ This one includes the current character so it's the same as
+ remaining_size() + 1.
+
+2018-12-05 Kohei Yoshida <kohei.yoshida@gmail.com> [8ed6b8954ead8b1e0355f0574ea1b2e60d532289]
+
+ Add a debug util facility to start adding some extra checks.
+
+ Useful during development.
+
+2018-12-05 Kohei Yoshida <kohei.yoshida@gmail.com> [57c0937ea7be9174533c28bd4e0369574a486c75]
+
+ is_in(...) to take additional parameter for the length of char array.
+
+ To support non-null-terminated char array and also in the future avoid
+ having to call strlen() before SIMD call each and every time.
+
+2018-12-04 Kohei Yoshida <kohei.yoshida@gmail.com> [3f408d170110f0efb073415026ebd47ab582283d]
+
+ These functions ought to be constexpr.
+
+
+2018-12-04 Kohei Yoshida <kohei.yoshida@gmail.com> [4155a70335629f14b795e33426d8f6ac11287980]
+
+ Let's determine CPU features at compile time rather than run-time.
+
+
+2018-12-04 Kohei Yoshida <kohei.yoshida@gmail.com> [b629feded161afcff41b643d606b4a29ddb42485]
+
+ Let's not forget to add this file.
+
+
+2018-12-04 Kohei Yoshida <kohei.yoshida@gmail.com> [0e5f5db5845441edd2e944405539f8718e4b2319]
+
+ Use cpu_features to query for SSE 4.2 availability.
+
+
+2018-12-04 Kohei Yoshida <kohei.yoshida@gmail.com> [cff162fd3e744718c993890abc0e655ad7e923d7]
+
+ Set up a simple CPU feature bucket and a utility to dump it for debugging.
+
+
+2018-12-04 Kohei Yoshida <kohei.yoshida@gmail.com> [f75265c09d678b95984ce76bac2f74c889b28aba]
+
+ Add --with-cpu-features configure switch.
+
+
+2018-12-04 Kohei Yoshida <kohei.yoshida@gmail.com> [cf1d91dcb9a3c1737bca91565ce7eadd39f09790]
+
+ Use std::unique_ptr for cell format storage.
+
+
+2018-12-03 Kohei Yoshida <kohei.yoshida@gmail.com> [b1abd72e01bfb96a1fdd9c8ec2572861891e6603]
+
+ Let's not require the sheet ID be passed twice.
+
+
+2018-12-03 Kohei Yoshida <kohei.yoshida@gmail.com> [781de319107ff7beb1441dd8f8d1eb240c725c7e]
+
+ Overlapped ranges are only used in the html dumper code. Move it there.
+
+
+2018-12-03 Kohei Yoshida <kohei.yoshida@gmail.com> [67d885478d0f1218dfc4ab569dd6b5486d5f2162]
+
+ Move the html dumper code into its own files.
+
+
+2018-11-29 Kohei Yoshida <kohei.yoshida@gmail.com> [ce1d82fe24e2c58f672796e2159ea5d774e87fdc]
+
+ Let's use a simple vector instead of multi_type_matrix.
+
+ Since we are only dealing with one element-type matrix, a simple
+ vector will do & and it's much faster this way.
+
+ This is related to #66.
+
+2018-11-29 Kohei Yoshida <kohei.yoshida@gmail.com> [f4cf5e21509d525064c7e1b2da883318466911f7]
+
+ Avoid duplicate block searches for each element position.
+
+ This is related to #66.
+
+2018-11-29 Kohei Yoshida <kohei.yoshida@gmail.com> [b6c96fbcbc1087a1c3f95ee509c20d0f2bc0e0da]
+
+ Refactor flat dumper for better performance.
+
+ This is related to #66.
+
+2018-11-24 Kohei Yoshida <kohei.yoshida@gmail.com> [fd8ec37c9555e3af770b4b7c929aea99439fc950]
+
+ Move the flat dump code into its own source file.
+
+
+2018-11-21 Kohei Yoshida <kohei.yoshida@gmail.com> [c6b2e38467758f58119d271d0958b721bf5fc108]
+
+ Support convertion from millimeters to twips.
+
+
+2018-11-21 Kohei Yoshida <kohei.yoshida@gmail.com> [ee11571f50e1dcde51908e2f73423a7499905e52]
+
+ Generate a more useful error message.
+
+
+2018-11-20 Kohei Yoshida <kohei.yoshida@gmail.com> [283fb19885c41948b924c22c9313f3ac7b011887]
+
+ Add pivot table section.
+
+
+2018-11-19 Kohei Yoshida <kohei.yoshida@gmail.com> [991dfcc9e1ccb3085006813148eeecc83071176e]
+
+ A bit more editing.
+
+
+2018-11-19 Kohei Yoshida <kohei.yoshida@gmail.com> [4a0063c296c5356ff4481991f8791ac01dae5e34]
+
+ Add more missing types and functions.
+
+ Also predefine ORCUS_DLLPUBLIC to be empty in order to improve some
+ symbol generations.
+
+2018-11-19 Kohei Yoshida <kohei.yoshida@gmail.com> [ab0ddd18cb9666a10616e1ad10c7f33d4a3acdac]
+
+ Add missing interface types.
+
+ A whole bunch more interfaces have been added since 0.13.
+
+2018-11-19 Kohei Yoshida <kohei.yoshida@gmail.com> [07a2b9701e70032ff31bda1fc3b4429128d5df8a]
+
+ Split out the types and interfaces into separate file.
+
+ And a bit more editing.
+
+2018-11-16 Kohei Yoshida <kohei.yoshida@gmail.com> [6f2f19a4b912f96aee3ca331fe2e6d367ac13d0a]
+
+ Author the formula interface section.
+
+
+2018-11-16 Kohei Yoshida <kohei.yoshida@gmail.com> [181d5294e23862e8e26798ee03ee9b3a35a588f9]
+
+ Annotate formula_grammar_t.
+
+
+2018-11-15 Kohei Yoshida <kohei.yoshida@gmail.com> [231de5c4de1dd9937df7063a9dca6a884dbfe1ab]
+
+ Finish up the example code for receiving formula cells.
+
+
+2018-11-15 Kohei Yoshida <kohei.yoshida@gmail.com> [8c3227af01b7dc2cbb65c7027cd29075380a8b2d]
+
+ Add operator<< overload for formula_grammar_t enum type.
+
+
+2018-11-15 Kohei Yoshida <kohei.yoshida@gmail.com> [8277686257696458e654194ad76495c0cc5d02d0]
+
+ Let's not differentiate xlsx 2007 from xlsx 2010.
+
+ That would be too much of a hassle for a very little gain.
+
+2018-11-14 Kohei Yoshida <kohei.yoshida@gmail.com> [ccf916c9310e96193d7ae11310101e37333adc2b]
+
+ Add a new example code to illustrate how to receive formula data.
+
+ Still WIP.
+
+2018-11-14 Kohei Yoshida <kohei.yoshida@gmail.com> [5300d50d2b2de7236d12e221f29a1338ba322b8b]
+
+ Write a segway into the import_formula interface.
+
+
+2018-11-14 Kohei Yoshida <kohei.yoshida@gmail.com> [b1ffd08a1062eea73aa5057e123ca30f51a6ab77]
+
+ Finish up the section.
+
+
+2018-11-14 Kohei Yoshida <kohei.yoshida@gmail.com> [c2e3b31c734009bff9ba57850cdae613319b1c71]
+
+ Rewording a bit & add more method docs.
+
+
+2018-11-13 Kohei Yoshida <kohei.yoshida@gmail.com> [7c05c1132015ad9358eb5839906963c83b700a8d]
+
+ More on documenting the shared strings interface. Still not finished.
+
+
+2018-11-13 Kohei Yoshida <kohei.yoshida@gmail.com> [fb51e2236fc2be46f70b868ab5608308a51f91e0]
+
+ A bit more editing on sheet interface & shared strings doc.
+
+
+2018-11-12 Kohei Yoshida <kohei.yoshida@gmail.com> [6d2ae67f1bf3966f11c4a0970a4ef0e36200ed29]
+
+ Add an example code for string pool import.
+
+
+2018-11-12 Kohei Yoshida <kohei.yoshida@gmail.com> [547d4681500a3e51dd72f79c495daa0c23d62579]
+
+ More on authoring the sheet accessor documentation.
+
+ Still not finished yet.
+
+2018-11-09 Kohei Yoshida <kohei.yoshida@gmail.com> [eb2f009ed7d4df5648cfabf1a2eb61fc49ec352b]
+
+ More on documenting the sheet accessor.
+
+
+2018-11-08 Kohei Yoshida <kohei.yoshida@gmail.com> [8d319578c2945ecdf058517cdf544ab4a4b5db92]
+
+ Update the example code and the file being used in that code.
+
+ This is to be used in the documentation.
+
+2018-11-07 Kohei Yoshida <kohei.yoshida@gmail.com> [e160737d0bbe179467982f94c1c7bbb6772f3782]
+
+ Add a test case which previously caused unsigned integer underflow.
+
+ It's basically an empty stream with a few whitespace characters.
+
+2018-11-07 Kohei Yoshida <kohei.yoshida@gmail.com> [3876e8bff097620f8612f1b27f7881e3e1ce0694]
+
+ Prevent unsigned integer underflow.
+
+
+2018-11-07 Kohei Yoshida <kohei.yoshida@gmail.com> [bbbc39e72c01536831d787441091699e8f5d6080]
+
+ Set up a mechanism to parse invalid css files.
+
+
+2018-11-07 Kohei Yoshida <kohei.yoshida@gmail.com> [5d8875ca0afeaefdac3bf3387cff4affec3a5fb1]
+
+ Move this up since this can be used outside of XML specific code.
+
+
+2018-11-07 Kohei Yoshida <kohei.yoshida@gmail.com> [2c52e2992f105c882c2371dd2a2620c033267b71]
+
+ Switch the documentation theme to cloud theme.
+
+
+2018-11-07 Kohei Yoshida <kohei.yoshida@gmail.com> [479952f420e2493fdedfdffc4245c6836a567b7d]
+
+ Switch to mdds-1.5.
+
+ No other code changes necessary. Quite uneventful.
+
+2018-11-07 Kohei Yoshida <kohei.yoshida@gmail.com> [f96240206ca5246914483a455a572c792705ec1b]
+
+ ixion needs spdlog now.
+
+
+2018-11-07 Kohei Yoshida <kohei.yoshida@gmail.com> [bd51a375241cab623cb1632ce273ed1807aaf425]
+
+ Adjust CI to use ixion from the master branch.
+
+
+2018-11-07 Kohei Yoshida <kohei.yoshida@gmail.com> [b2636937c1f759e1662ee25143d18f15ec12f52e]
+
+ Switch to using ixion-0.15.
+
+
+2018-10-31 Kohei Yoshida <kohei.yoshida@gmail.com> [e3a6e29bafe4161e3f97e72d356cb101631a008b]
+
+ Fix all shadowed variables and make it buildable with -Wshadow.
+
+ Also up the version and the API version.
+
+2018-10-03 Kohei Yoshida <kohei.yoshida@gmail.com> [0dfa88f2adca7887dbe44bdb7025985777c89673]
+
+ Remove unused VERSION file.
+
+ Thanks to Stephan Bergmann for pointing this out.
+
+2018-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [e2bfc774801f7dffb734d3f47efa12ccb0bde9cb]
+
+ Add URL's to the 0.14.1 packages.
+
+
+2018-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [4ff564ab58c4525648371ffd9430232e366ed26d]
+
+ Up the version to 0.14.1, and fix configure error with werror enabled.
+
+
+2018-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [a832279652f5b59d9983abd51ed0392c5c951b55]
+
+ Update boost.m4 from http://github.com/tsuna/boost.m4.
+
+
+2018-09-13 Kohei Yoshida <kohei.yoshida@gmail.com> [2970d026e52f84e7c7a824826ff186a56ea30a0d]
+
+ Updated.
+
+
+2018-09-13 Kohei Yoshida <kohei.yoshida@gmail.com> [b4e561504be8af5ff4ec09aaf37244aebcfc946f]
+
+ CID#191680: Wrapper object use after free (WRAPPER_ESCAPE)
+
+ The coverity report says:
+
+ 3. escape: The internal representation of local jv escapes into
+ const_node->parent, but is destroyed when it exits scope.
+
+ but jv itself is returned from the function *moved*, and it lives on
+ in the caller's scope (as intended). I'm pretty certain that this
+ one is false positive.
+
+ The additional code added here verifies that the pointers stored in
+ the child nodes match that of the core of the parent.
+
+2018-09-12 Kohei Yoshida <kohei.yoshida@gmail.com> [a8b3e09bf08a3c0c5c417b14c4049309a75be4a2]
+
+ CID 191672 (#1 of 1): Uninitialized scalar field (UNINIT_CTOR)
+
+ 2. uninit_member: Non-static class member field m_panes.m_selection
+ is not initialized in this constructor nor in any functions that
+ it calls.
+ 4. uninit_member: Non-static class member field m_split_pane.top_left_cell
+ is not initialized in this constructor nor in any functions that
+ it calls.
+ 6. uninit_member: Non-static class member field m_frozen_pane.top_left_cell
+ is not initialized in this constructor nor in any functions that
+ it calls.
+
+2018-09-12 Kohei Yoshida <kohei.yoshida@gmail.com> [cc06d201a9855305692cb260afba361f84130ae6]
+
+ CID#191675: Not restoring ostream format (STREAM_FORMAT_STATE)
+
+ end_of_path: Changing format state of stream os for categories
+ uppercase, basefield without later restoring it.
+
+2018-09-12 Kohei Yoshida <kohei.yoshida@gmail.com> [831b146a8486d29a8b2211bc5d7c6d56d38f6484]
+
+ The name of the second column may be empty too.
+
+
+2018-09-12 Kohei Yoshida <kohei.yoshida@gmail.com> [d44e514fe848c773b1834db1d90ffac8a2872f29]
+
+ CID#89231: Improper use of negative value (NEGATIVE_RETURNS)
+
+ negative_returns: col1_index is passed to a parameter that cannot be
+ negative.
+
+2018-09-11 Kohei Yoshida <kohei.yoshida@gmail.com> [fd7bc42587bd005735e6dbeda76088fe233c1bd4]
+
+ CID#191681: Uninitialized scalar variable (UNINIT)
+
+ uninit_use: Using uninitialized value ret. Field ret.transient is
+ uninitialized.
+
+2018-09-11 Kohei Yoshida <kohei.yoshida@gmail.com> [5420e08bbb0b6e7bb4abba80afc906e50dad27be]
+
+ CID#149339: Uncaught exception (UNCAUGHT_EXCEPT)
+
+ root_function: In function main(int, char **) an exception of type
+ orcus::general_error is thrown and never caught.
+
+2018-09-11 Kohei Yoshida <kohei.yoshida@gmail.com> [56b6c15629783e0fdc880a6c20c7c7c29293407d]
+
+ CID#149314: Uncaught exception (UNCAUGHT_EXCEPT)
+
+ root_function: In function main(int, char **) an exception of type
+ boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::bad_any_cast> >
+ is thrown and never caught.
+
+2018-09-11 Kohei Yoshida <kohei.yoshida@gmail.com> [1999f8823bdf769a5366cb8ac721082057950888]
+
+ CID#164674: Uncaught exception (UNCAUGHT_EXCEPT)
+
+ root_function: In function main(int, char **) an exception of type
+ mdds::type_error is thrown and never caught.
+
+2018-09-11 Kohei Yoshida <kohei.yoshida@gmail.com> [bdbdfe7c604153819f30cbd0e8aeab1593813d2f]
+
+ CID#149342: Uncaught exception (UNCAUGHT_EXCEPT)
+
+ root_function: In function main(int, char **) an exception of type
+ orcus::xml_map_tree::xpath_error is thrown and never caught.
+
+2018-09-10 Kohei Yoshida <kohei.yoshida@gmail.com> [ea3c29e8cc43858ffe7053a9af7b36cdb8234c66]
+
+ CID#191671: Uncaught exception (UNCAUGHT_EXCEPT)
+
+ root_function: In function main(int, char **) an exception of type
+ std::invalid_argument is thrown and never caught.
+
+2018-09-10 Kohei Yoshida <kohei.yoshida@gmail.com> [7a9b818264b3d18937b0c42381cdc5b84b94f24f]
+
+ CID#191673: Uncaught exception (UNCAUGHT_EXCEPT)
+
+ root_function: In function main(int, char **) an exception of type
+ orcus::general_error is thrown and never caught.
+
+2018-09-10 Kohei Yoshida <kohei.yoshida@gmail.com> [b107a20722b48f096efc0cd4253b3ee8089b3d3c]
+
+ CID#149337: Uncaught exception (UNCAUGHT_EXCEPT)
+
+ root_function: In function main(int, char **) an exception of type
+ boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::bad_any_cast> >
+ is thrown and never caught.
+
+2018-09-10 Kohei Yoshida <kohei.yoshida@gmail.com> [d821b83af344d74bbba7e4fb47c46be8414d3c7f]
+
+ CID#89234: Uncaught exception (UNCAUGHT_EXCEPT)
+
+ root_function: In function main(int, char **) an exception of type
+ orcus::general_error is thrown and never caught.
+
+2018-09-10 Kohei Yoshida <kohei.yoshida@gmail.com> [53292c46f8a271c2405664d2fa2f8f50b5e0432e]
+
+ CID#89230: Unchecked return value (CHECKED_RETURN)
+
+ 2. check_return: Calling to_rgb without checking return value (as is
+ done elsewhere 4 out of 5 times).
+
+ This change also simplifies the code a bit.
+
+2018-09-10 Kohei Yoshida <kohei.yoshida@gmail.com> [829813863730c6908813edb3c14f170245ca8848]
+
+ CID#54448: Uninitialized scalar field (UNINIT_CTOR)
+
+ 2. uninit_member: Non-static class member field m_cur_array_range.first
+ is not initialized in this constructor nor in any functions that it
+ calls.
+
+ 4. uninit_member: Non-static class member field m_cur_array_range.last
+ is not initialized in this constructor nor in any functions that it
+ calls.
+
+ 6. uninit_member: Non-static class member m_active_pane is not
+ initialized in this constructor nor in any functions that it calls.
+
+2018-09-10 Kohei Yoshida <kohei.yoshida@gmail.com> [57942a5f6807ecf88d79eb2d3973bb9f4b6ad189]
+
+ CI to use ixion-0.14 for now.
+
+ The ixion master branch is gearing toward ixion-0.15, but orcus is
+ not yet ready to move on to it just yet.
+
+2018-09-10 Kohei Yoshida <kohei.yoshida@gmail.com> [9c92565a47aceee82eb1470a3630a270b9835a6b]
+
+ Missing header for std::tolower.
+
+
+2018-09-04 Kohei Yoshida <kohei.yoshida@gmail.com> [a3e472464753f0eada274feb6bb8a02a8e6e07f4]
+
+ CID 191674 (#1 of 1): Uninitialized scalar field (UNINIT_CTOR)
+
+
+2018-09-04 Kohei Yoshida <kohei.yoshida@gmail.com> [3341786c0777105a0c00bc1772503bbb95bcb322]
+
+ CID 191677 (#1 of 1): Uninitialized scalar field (UNINIT_CTOR)
+
+ 2. uninit_member: Non-static class member pattern_type is not
+ initialized in this constructor nor in any functions that it calls.
+
+2018-09-04 Kohei Yoshida <kohei.yoshida@gmail.com> [5aefa964f73abee0c7a9a147d9318198e243cd40]
+
+ CID#191684: Side effect in assertion (ASSERT_SIDE_EFFECT)
+
+ assert_side_effect: Argument ++it of assert() has a side effect.
+ The containing function might work differently in a non-debug
+ build.
+
+2018-08-29 Kohei Yoshida <kohei.yoshida@gmail.com> [87bb64f1723831a47211dc006c539e8494ffd1a7]
+
+ 0.14.0 is already out & talk about improved numeric precision.
+
+
+2018-08-29 Kohei Yoshida <kohei.yoshida@gmail.com> [1d30abeb74dd07f1398f586b7b0ab2bd047cf237]
+
+ No idea why I applied an extra indent on all lines...
+
+
+2018-08-29 Kohei Yoshida <kohei.yoshida@gmail.com> [bd87f46ba21669b175517cc80af4aa3d0e6f8c4e]
+
+ Reduce the number of numeric operations when converting points to twips.
+
+ Hopefully this will fix #65.
+
+2018-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [2316ecc3ccb3149ff9a53d584582a4a9d5dda8f2]
+
+ Add URL's to the 0.14.0 packages.
+
+
+2018-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [63452e56e01b793686c719360fcd073e3f63fa3c]
+
+ Up the version to 0.14.0.
+
+
+2018-08-22 Kohei Yoshida <kohei.yoshida@gmail.com> [50652df4c6a5c495c0b8801a4462d7136f8628c6]
+
+ Fix 'make distcheck'.
+
+
+2018-08-22 Kohei Yoshida <kohei.yoshida@gmail.com> [92d5c0f9da5fa65b51d48425e98bc372a2703e36]
+
+ Add a few items for the new release.
+
+
+2018-08-22 Kohei Yoshida <kohei.yoshida@gmail.com> [2e6db4525dceb34f643ee919b2e2145e2ac8e1f9]
+
+ ixion 0.14.0 (API version 0.14) is released.
+
+
+2018-08-21 Kohei Yoshida <kohei.yoshida@gmail.com> [e86a1ea1f69841580405e53973240f822592f028]
+
+ mdds 1.4.0 is released.
+
+
+2018-07-23 Kohei Yoshida <kohei.yoshida@gmail.com> [e6a7fa8f828ebdaad57998a96b993b12e8768c8f]
+
+ xlsx: Add a test case for #63.
+
+
+2018-07-23 Kohei Yoshida <kohei.yoshida@gmail.com> [9bda3a966d657fe0f80de477ccbb83b6026291a6]
+
+ xlsx: Count the sheet and use its counter as sheet index.
+
+ Excel's internal sheet indices are not necessarily sequential in
+ increasing order esp. when the sheets get shuffled around after they
+ have been created.
+
+ This fixes #63.
+
+2018-07-23 Kohei Yoshida <kohei.yoshida@gmail.com> [9666c0c4af9c11f6180c895aa6fe368063bbc208]
+
+ xlsx: Modernize it a bit.
+
+
+2018-06-12 Kohei Yoshida <kohei.yoshida@gmail.com> [c1816fef9b4e458a5b3c77b6fc0dffd1605118e2]
+
+ Use nproc for ixion build.
+
+
+2018-06-12 Kohei Yoshida <kohei.yoshida@gmail.com> [2039a4c18177ee76a2e3cfe03b8ee164da21a523]
+
+ It now depends on the master branch of mdds.
+
+
+2018-06-12 Kohei Yoshida <kohei.yoshida@gmail.com> [45e18ee358dcd4a2e325d66916479baf791733fd]
+
+ Use get_all_namespaces() method in the example code.
+
+
+2018-06-12 Kohei Yoshida <kohei.yoshida@gmail.com> [2dd2f17e0e6530afed76b262a5331f76c7ede798]
+
+ get_all_namespaces() to return a vector.
+
+
+2018-06-12 Kohei Yoshida <kohei.yoshida@gmail.com> [ab52b4cb077378edd99026b828c7a6d69fe4a2b7]
+
+ Add code example for stacked namespaces.
+
+
+2018-06-12 Kohei Yoshida <kohei.yoshida@gmail.com> [6f71d44fa5b12f581a4f87a720c6eb9961cf33ed]
+
+ Use unique_ptr for pimpl.
+
+
+2018-06-12 Kohei Yoshida <kohei.yoshida@gmail.com> [6dddb95c1815f12bfb551582e5b6ab74bec6e9ed]
+
+ Simple example on how to use xml namespace classes.
+
+
+2018-05-23 Adam Majer <amajer@suse.de> [f7485813af8e50f88c77312fb29b7bb489a0a17d]
+
+ Fix build with Boost 1.67
+
+ Boost:DateTime that no longer accepts non-integer types.
+ In the past, these types were implicitly cast down to integer
+ values. Now this requires explicit cast.
+
+ https://svn.boost.org/trac10/ticket/11168
+
+ This fixes #60
+
+2018-04-13 Kohei Yoshida <kohei.yoshida@gmail.com> [8d885d135667c412475fb88695fec322fe36ab66]
+
+ Wrong license header. This is supposed to be MPL.
+
+
+2018-04-13 Kohei Yoshida <kohei.yoshida@gmail.com> [6fa535308bf55d7c4a1caffbf8a324b0a0b69ce5]
+
+ We don't really need to fully-qualify these types with orcus::spreadsheet.
+
+ Remove'em.
+
+2018-04-13 Kohei Yoshida <kohei.yoshida@gmail.com> [11a25c9e2925c7fc713dbf3c234f869f33244a1b]
+
+ Add the bits about the import_formula interface class.
+
+ And re-organize the items a bit.
+
+2018-04-13 Kohei Yoshida <kohei.yoshida@gmail.com> [2479d637e646eab37fe9e8986f47f5e08fadf4a0]
+
+ Those set_formula_result() methods are no longer necessary.
+
+ Nuke'em.
+
+2018-04-13 Kohei Yoshida <kohei.yoshida@gmail.com> [5b3fa87a3b0d031ae7a7bd9b5a641bd0c1ebc53c]
+
+ Remove set_shared_formula in favor of import_formula.
+
+
+2018-04-13 Kohei Yoshida <kohei.yoshida@gmail.com> [d2777c7126a8e37fa6b3f9331acddee0e5106c21]
+
+ Remove set_formula and replace its use with import_formula interface.
+
+
+2018-04-13 Kohei Yoshida <kohei.yoshida@gmail.com> [6f45d887cbf66be54475b6bc7aaabc8246e3ea4b]
+
+ Add import_formula interface class. Not used yet.
+
+
+2018-04-13 Kohei Yoshida <kohei.yoshida@gmail.com> [b73d55c361dcde0ad810fedaa1f59e18177b407f]
+
+ Remove duplicated code blocks.
+
+
+2018-04-12 Kohei Yoshida <kohei.yoshida@gmail.com> [bcaa2597385dd87a943b091d0759ba42989c3406]
+
+ Talk about the array formula interface change.
+
+
+2018-04-12 Kohei Yoshida <kohei.yoshida@gmail.com> [b9c6d01c2cee4738a493cfc71d00d2ad38e98469]
+
+ Add a new feature.
+
+
+2018-04-12 Kohei Yoshida <kohei.yoshida@gmail.com> [21945a5ff6917e0cd980776aa96312a8a5cf2da4]
+
+ xls-xml: add unit test for the array formula import.
+
+
+2018-04-12 Kohei Yoshida <kohei.yoshida@gmail.com> [adeb28f5e1cdbd1b8bff3f404096b26687abfec9]
+
+ xls-xml: remove duplicate code blocks.
+
+
+2018-04-12 Kohei Yoshida <kohei.yoshida@gmail.com> [76fc6847d85d4f83fa265875bfd0415a1824e325]
+
+ xls-xml: check the array formula store at the end of each table...
+
+ ... and push them as needed.
+
+2018-04-12 Kohei Yoshida <kohei.yoshida@gmail.com> [5dd96d0770e95d610ab8b7f7837ae1fb4159a6ea]
+
+ Manage to store and push array formulas to the model.
+
+ Still not without issues. The last array formula won't get pushed
+ unless there is a cell following it.
+
+2018-04-11 Kohei Yoshida <kohei.yoshida@gmail.com> [f49315729a1c6ee1e152f4dd875d48a6ffbf7e3a]
+
+ Add a dedicated import interface class for array formulas.
+
+
+2018-04-11 Kohei Yoshida <kohei.yoshida@gmail.com> [8a2187a3187dd0baa21bb91b8667e6269c70e435]
+
+ xls-xml: get the formula string from the parent context as well.
+
+
+2018-04-11 Kohei Yoshida <kohei.yoshida@gmail.com> [ff1b89707df456a1f8453a0598d22405017eefbc]
+
+ xls-xml: get the current cell position from the parent context.
+
+
+2018-04-11 Kohei Yoshida <kohei.yoshida@gmail.com> [93b9cc800397b6395c70f8d35a75c850c2757b32]
+
+ xls-xml: get the sheet interface from the parent context.
+
+
+2018-04-11 Kohei Yoshida <kohei.yoshida@gmail.com> [be940db5abb5c4889d18c79de2ab535a7d7208d5]
+
+ xls-xml: pass refernce to the parent context to the data context.
+
+ This way there is no need to pass the import factory pointer.
+
+2018-04-11 Kohei Yoshida <kohei.yoshida@gmail.com> [869221727fad81927452f90686c8a2f9784e53b5]
+
+ xls-xml: pick up the array formula range.
+
+ It is not utilized yet.
+
+2018-04-10 Kohei Yoshida <kohei.yoshida@gmail.com> [7d8aced0b24bcc5c8c4a083894d0fa0acec63471]
+
+ xls-xml: New test file for array formula import.
+
+
+2018-04-10 Kohei Yoshida <kohei.yoshida@gmail.com> [5183e1487e8ff01be420ad9b5b5497c05635e173]
+
+ Another item to add to CHANGELOG.
+
+
+2018-04-10 Kohei Yoshida <kohei.yoshida@gmail.com> [d4b9dc58e366a92971a8fb6d7afab6a9a1aab219]
+
+ Let's not forget to pass on the character set when appending a sheet.
+
+
+2018-04-10 Kohei Yoshida <kohei.yoshida@gmail.com> [19b99a6ee42ce54dde9d72ab11111625d8a26a98]
+
+ Add new items to CHANGELOG.
+
+
+2018-04-10 Kohei Yoshida <kohei.yoshida@gmail.com> [1d9caf728ea511ea4372ab079a119935e2dfc28f]
+
+ Store the charset with the factory too. And add a test case for it.
+
+
+2018-04-10 Kohei Yoshida <kohei.yoshida@gmail.com> [af7cfe4707d829e334fc8880343880c0770563fe]
+
+ Use unique_ptr for this impl.
+
+
+2018-04-10 Kohei Yoshida <kohei.yoshida@gmail.com> [8dcec9d1699a65509af980bf7cb4a28640d054b0]
+
+ Pass the charset value to the sheets who need it.
+
+
+2018-04-10 Kohei Yoshida <kohei.yoshida@gmail.com> [6f4cc8ebe3a6469d4294ba4507933c347c9044e7]
+
+ Manage to pass the character set all the way to the import factory.
+
+ Also, import_global_settings does not have to be exposed in public.
+
+2018-04-10 Kohei Yoshida <kohei.yoshida@gmail.com> [ac487227a38b3b52de92b1394fae5593d17f15db]
+
+ Rename char_encoding_t to character_set_t.
+
+
+2018-04-09 Kohei Yoshida <kohei.yoshida@gmail.com> [c9099eb337eab7edf764d2357cdd7afbfb78d3e7]
+
+ Rename xml_encoding_t -> char_encoding_t.
+
+ This is not specific to XML documents.
+
+2018-04-09 Kohei Yoshida <kohei.yoshida@gmail.com> [7ee154b64ad83876c26929498f40e2f4ec833a32]
+
+ Add test cases for the XML declaration parsing.
+
+
+2018-04-09 Kohei Yoshida <kohei.yoshida@gmail.com> [f512a90655f17fe67daf25962972c686a0fdef05]
+
+ Pass the parsed XML declaration content to the handler.
+
+ This adds an additional method declaration() that the handler is
+ required to provide.
+
+2018-04-09 Kohei Yoshida <kohei.yoshida@gmail.com> [ed98b02877b9aa1c1b23a880b1af676029cab9a5]
+
+ Parse XML declaration and store the results into xml_declaration_t.
+
+
+2018-04-09 Kohei Yoshida <kohei.yoshida@gmail.com> [025dacf453a8ee51abc44c10876a0a30975fc51d]
+
+ Adjust for the recent ixion change.
+
+
+2018-04-08 Kohei Yoshida <kohei.yoshida@gmail.com> [1123c5b1e67564ca1f3942fee691c79215839539]
+
+ Add formula array test case to the automated test.
+
+
+2018-04-08 Kohei Yoshida <kohei.yoshida@gmail.com> [48f5433fdebf1626addf6fde57605dc143abd8cc]
+
+ Handle dumping of array formula strings correctly.
+
+
+2018-04-08 Kohei Yoshida <kohei.yoshida@gmail.com> [2bf46b6e15fd5e7803df27ab745cb48a905f95b9]
+
+ Let's not forget to add override to this method as well.
+
+
+2018-04-07 Kohei Yoshida <kohei.yoshida@gmail.com> [80511a90172287c665f5cd0b0e824a4f0a12007d]
+
+ Add more cells below the first matrix formula cells.
+
+
+2018-04-07 Kohei Yoshida <kohei.yoshida@gmail.com> [7d8255f7b75ef9da01d6ddf2a4e0ed575a44db03]
+
+ Fix the flat dump wrt matrix results.
+
+
+2018-04-07 Kohei Yoshida <kohei.yoshida@gmail.com> [05940cf71c8f02c84490e79f3931bad96e7f574e]
+
+ Put array formula cells into the sheet model for real.
+
+
+2018-04-07 Kohei Yoshida <kohei.yoshida@gmail.com> [1fa57fadd30c4c6826261a5f2d03338248166818]
+
+ Add mechanism to send array formula results to the client app.
+
+ This adds a new interface called import_formula_result, which optionally
+ gets returned from the set_array_formula() interface method.
+
+2018-04-07 Kohei Yoshida <kohei.yoshida@gmail.com> [4e9674164b05293579aee883f773d28d8db08212]
+
+ xlsx: Store cached array formula results during the load.
+
+
+2018-04-05 Kohei Yoshida <kohei.yoshida@gmail.com> [b577a311ebf1c363ee1aa4c40ccc98e54e6affcb]
+
+ Store array formulas separately from the regular formula cells.
+
+
+2018-04-05 Kohei Yoshida <kohei.yoshida@gmail.com> [502b8165f16f1745b622f5cca4a14489701c5a7f]
+
+ New structures to store cached formula results.
+
+ Not used yet.
+
+2018-04-05 Kohei Yoshida <kohei.yoshida@gmail.com> [6567b290ab7360bca562da0ed47cd7907300fe85]
+
+ xlsx: Resolve formula reference range earlier to avoid string copies.
+
+
+2018-04-05 Kohei Yoshida <kohei.yoshida@gmail.com> [c2b866922a49be3416a6ef52a4744f1bd4152fcf]
+
+ Pass range_t to data range's set_range() interface method.
+
+
+2018-04-05 Kohei Yoshida <kohei.yoshida@gmail.com> [805989dbbec5bc7fea394cca8eb8a743c5501ff9]
+
+ Potentially intern these attribute strings.
+
+
+2018-04-05 Kohei Yoshida <kohei.yoshida@gmail.com> [df4dcd963558fcf83b33fb5aafb2e37d60d65d85]
+
+ Use sorted_string_map for this string to enum conversion.
+
+
+2018-04-05 Kohei Yoshida <kohei.yoshida@gmail.com> [c2148660fe4d54a486098d450ad38a446b73afe8]
+
+ Let's not forget to check the namespace value.
+
+
+2018-04-05 Kohei Yoshida <kohei.yoshida@gmail.com> [9b80ae96e0397fbe2787986d20168e391f1d29f7]
+
+ Use range-based for loop over function object with for_each.
+
+
+2018-04-04 Kohei Yoshida <kohei.yoshida@gmail.com> [cf71adf47a58bc12514ecb556928271b3c3c190f]
+
+ Unify the previosly two set_array_formula() interface methods.
+
+ This fixes #54.
+
+2018-04-04 Kohei Yoshida <kohei.yoshida@gmail.com> [140bf38551a1b857aaa23ef0785cf8113396181a]
+
+ New Excel file containing a group of array formula cells.
+
+
+2018-04-04 Kohei Yoshida <kohei.yoshida@gmail.com> [6da8bfbd3b913430469b0d0ba37b84c5f07fc5f8]
+
+ xlsx: Add permanent test case for shared formulas.
+
+
+2018-04-04 Kohei Yoshida <kohei.yoshida@gmail.com> [0bd44f3d9dd33fcd7ee95be610a05813c07c6890]
+
+ Remove the variant of set_shared_formula with a range.
+
+ As promised in #58.
+
+2018-04-04 Kohei Yoshida <kohei.yoshida@gmail.com> [fd6da05deab540d158a475598a41165d8a5d0ea3]
+
+ Handle regular formula cells on the factory side as well.
+
+
+2018-04-04 Kohei Yoshida <kohei.yoshida@gmail.com> [0aab32342e9df4b6d6c4fb7cc8c0d9d6e28a5667]
+
+ Manage shared formula pool on the orcus side.
+
+ This was previosly managed on the ixion side, but now we do this in
+ orcus. It makes more sense this way.
+
+2018-04-04 Kohei Yoshida <kohei.yoshida@gmail.com> [cad45fda50b6d8892bb2077f4d6015d28728ba4f]
+
+ Get a single result value here as well.
+
+
+2018-04-02 Kohei Yoshida <kohei.yoshida@gmail.com> [e9078d37f6ac91d2e17455b8e6bf26ec7cd04cf5]
+
+ Get it to build again against the latest ixion.
+
+ I still need to fix the shared formula handling in the sheet backend.
+
+2018-03-10 Kohei Yoshida <kohei.yoshida@gmail.com> [2729ff4cc863262234412fd3f88d1e94711bc116]
+
+ Switch import_auto_filter::set_range() to take range_t parameter.
+
+ This is more generic than taking a range string whose style may be
+ different depending on the filter type.
+
+ This addresses #49.
+
+2018-03-10 Kohei Yoshida <kohei.yoshida@gmail.com> [6274f11529ec97433215047f691c6dd7c63c9cf2]
+
+ Use range-based loop.
+
+
+2018-03-09 Kohei Yoshida <kohei.yoshida@gmail.com> [1d8d5c2ba55408d2a6d4b65707b89f36ba89e4f2]
+
+ Use std::unique_ptr for this pimpl pattern.
+
+
+2018-03-09 Kohei Yoshida <kohei.yoshida@gmail.com> [af7fd72dba418349397617fdf4011c7a49bc84e0]
+
+ Remove iface::export_sheet base interface class from the sheet class.
+
+ This concludes #56.
+
+2018-03-09 Kohei Yoshida <kohei.yoshida@gmail.com> [04ff9a43fb90cf83b472b6205d00d65a558f92a8]
+
+ Create a separate export_sheet wrapper.
+
+ And have export_factory return that wrapper instead of the wrapped
+ sheet instance.
+
+2018-03-08 Kohei Yoshida <kohei.yoshida@gmail.com> [83fd13a92f83c9702e211f703c2f44cdf084b195]
+
+ Rename table.?pp to factory_table.?pp for consistency.
+
+
+2018-03-08 Kohei Yoshida <kohei.yoshida@gmail.com> [782af462663811e0f510f7f3a2c3a88a4addcb1c]
+
+ Rename table -> import_table.
+
+
+2018-03-08 Kohei Yoshida <kohei.yoshida@gmail.com> [358b040dea1eea7f42fea2f94f3cf14e547feba9]
+
+ Move the table wrapper out of sheet, to import_sheet.
+
+
+2018-03-08 Kohei Yoshida <kohei.yoshida@gmail.com> [3f379a2ba42ff2ea41eccfc45d849e7412c7f3d7]
+
+ Use std::unique_ptr for this pimpl pattern.
+
+
+2018-03-07 Kohei Yoshida <kohei.yoshida@gmail.com> [eaa000acf6d54fbcf90f865b636f2fffd0b90d23]
+
+ Move the auto_filter wrapper away from sheet.
+
+ This is related to #55.
+
+2018-03-07 Kohei Yoshida <kohei.yoshida@gmail.com> [eb377dc3cd1ad9dea2c53017b5b08ea97b109c55]
+
+ Remove the data_table wrapper from sheet.
+
+ Turns out that this one was an empty wrapper with no beef. This
+ is related to #55.
+
+2018-03-07 Kohei Yoshida <kohei.yoshida@gmail.com> [85a7de9faf40cfcb09f9bcffbfee188b194f3b02]
+
+ Remove sheet_properties wrapper from sheet.
+
+ And add import_sheet_properties near import_sheet. This is related
+ to #55.
+
+2018-03-07 Kohei Yoshida <kohei.yoshida@gmail.com> [4e2088c3b20dccee476bc8fffc6c4c2480067510]
+
+ Use unique_ptr for pimpl.
+
+
+2018-03-06 Kohei Yoshida <kohei.yoshida@gmail.com> [669b1cea3a565219a804601c21dba0045b804dd5]
+
+ Move the header include to reduce dependency in header.
+
+
+2018-03-06 Kohei Yoshida <kohei.yoshida@gmail.com> [e1cdb7482c363925f4bb92d37dc2034947d59ca5]
+
+ Apply pimpl to the styles class, to hide the private parts.
+
+
+2018-03-06 Kohei Yoshida <kohei.yoshida@gmail.com> [021b2724460dc4ac2717a8c7f18f7bec45e961c3]
+
+ The styles class no longer needs string_pool.
+
+
+2018-03-06 Kohei Yoshida <kohei.yoshida@gmail.com> [d20b9964852c753af015e7764368c133e8d9cba7]
+
+ Move the cell styles buffer to import_styles.
+
+ This is the last one of the bunch.
+
+2018-03-06 Kohei Yoshida <kohei.yoshida@gmail.com> [f8fda2d708bc25fba715998a5d02f6e50a77d8eb]
+
+ Move the cell format buffer to import_styles.
+
+
+2018-03-05 Kohei Yoshida <kohei.yoshida@gmail.com> [bd227887c68a82d7d56447510771e960697c198e]
+
+ Move the number format buffer to import_styles.
+
+
+2018-03-05 Kohei Yoshida <kohei.yoshida@gmail.com> [5dfad73f520f54707d34cee1976a420a342c1751]
+
+ Move the cell protection buffer to import_styles.
+
+
+2018-03-05 Kohei Yoshida <kohei.yoshida@gmail.com> [667911e6ee46bba09b53388751104c0de7c94ac9]
+
+ Move the border buffer from styles to import_styles.
+
+
+2018-03-05 Kohei Yoshida <kohei.yoshida@gmail.com> [469df4a8fd6166da7893d8c85e0d3241aae67057]
+
+ Move the fill buffer from styles to import_styles.
+
+
+2018-03-05 Kohei Yoshida <kohei.yoshida@gmail.com> [ccf5668dedaf46ffe0368c528f0227364e1e7537]
+
+ Move the font buffer used during import from styles to import_styles.
+
+ It makes more sense this way. The other properties will follow suit.
+
+2018-03-03 Kohei Yoshida <kohei.yoshida@gmail.com> [9deacc9c641b184d3398d453cae6dd10cebd68d6]
+
+ Rename _import_styles -> import_styles.
+
+
+2018-03-03 Kohei Yoshida <kohei.yoshida@gmail.com> [9379f03a1c5924e3fc39a5a1bae1701ccd9c1932]
+
+ Rename import_styles -> styles.
+
+ This class now represents a pure styles store, independent of the
+ import part.
+
+2018-03-03 Kohei Yoshida <kohei.yoshida@gmail.com> [b5c7cf2b40f82e3a0445d6d43d3c401449ebf9ca]
+
+ Remove iface::import_styles base class from the styles store class.
+
+ I needed to move the wrapper class to header since the odf styles
+ import class needs access to it.
+
+2018-03-03 Kohei Yoshida <kohei.yoshida@gmail.com> [c50d91a377ae1d2844f9431e963559563a013ef3]
+
+ Switch to using the interface wrapper during import.
+
+
+2018-03-03 Kohei Yoshida <kohei.yoshida@gmail.com> [f783478d2379bb585ad248a7fe6ae88bda295ffc]
+
+ Have the interface wrapper store ref to the concrete styles instance.
+
+ And have each interface method call its corresponding method in the
+ concrete class.
+
+2018-03-03 Kohei Yoshida <kohei.yoshida@gmail.com> [0336d4f1b608902f4e4e20e433551cf83f04973e]
+
+ Add an empty interface wrapper class for import_styles.
+
+
+2018-03-03 Kohei Yoshida <kohei.yoshida@gmail.com> [fa0b15861c85b7015bb99d0794547467b3a5bebb]
+
+ Add new items.
+
+
+2018-03-03 Kohei Yoshida <kohei.yoshida@gmail.com> [8cec652b0eebfe877cf243b3c2b300490c28203d]
+
+ Switch to using fill_pattern_t enum class instead of string values.
+
+ This addresses #50.
+
+2018-03-03 Kohei Yoshida <kohei.yoshida@gmail.com> [d16762b79d514fa0bc5e6651c34c6751cc9e8597]
+
+ Add a test case for #52.
+
+
+2018-03-03 Kohei Yoshida <kohei.yoshida@gmail.com> [230e43033178cba61ac3e476de8ab858708e2591]
+
+ Be lenient on XML stream with leading whitespace.
+
+ This fixes #52. In the future we should make this configurable,
+ either build-time or run-time.
+
+2018-03-02 Kohei Yoshida <kohei.yoshida@gmail.com> [53a9490099bcc672cd45a7ce3e8f224bc34b5a1f]
+
+ doc: Start working on the sheet accessor code example.
+
+
+2018-03-01 Kohei Yoshida <kohei.yoshida@gmail.com> [e073562877e20974b577c73d89859f31a3019531]
+
+ doc: More editing. Hopefully the first section is finished.
+
+
+2018-02-28 Kohei Yoshida <kohei.yoshida@gmail.com> [5b56ff6e444b70757bc44df7f2ca7e1ebb37b3c7]
+
+ doc: More editing.
+
+
+2018-02-26 Kohei Yoshida <kohei.yoshida@gmail.com> [f6a8382c5e6fe6373cc28560092ac86ff596c20b]
+
+ Add URL's to the 0.13.4 source packages & update the change log.
+
+
+2018-02-23 Kohei Yoshida <kohei.yoshida@gmail.com> [6954b667528e371eac23aad949d12f08c2f8dae1]
+
+ doc: Start authoring a new section on using a custom doc model.
+
+
+2018-02-22 Kohei Yoshida <kohei.yoshida@gmail.com> [02db0852e69d736609673a0591151fc48e92be7d]
+
+ Make the ods import filter tolerate empty import_factory instance.
+
+ This is related to a new example code I'm working on which uses an
+ entirely empty import_factory implementation, and I don't want that
+ code to segfault.
+
+2018-02-21 Kohei Yoshida <kohei.yoshida@gmail.com> [c21dbb11b352beb5e2c89b139d22ab69670511af]
+
+ doc: More editing.
+
+
+2018-02-21 Markus Mohrhard <markus.mohrhard@googlemail.com> [4d5deaa553cd254211edb2e4be9e8938390dd5b8]
+
+ add test for self-closing root xml elements
+
+
+2018-02-21 Markus Mohrhard <markus.mohrhard@googlemail.com> [12e5d89cbd7101c61fbdf063322203a1590a0ef5]
+
+ protect the self-closing xml element code against self-closing root elements
+
+ Found by Antti Levomäki and Christian Jalio from Forcepoint.
+
+2018-02-20 Kohei Yoshida <kohei.yoshida@gmail.com> [15b359a0b1c270b6cb9cc423ef84e195da400670]
+
+ doc: More on editing the Overview section.
+
+
+2018-02-19 Kohei Yoshida <kohei.yoshida@gmail.com> [a0057703e4bcad6562b42482c59ca9d57e3e681f]
+
+ doc: More editing.
+
+
+2018-02-19 Kohei Yoshida <kohei.yoshida@gmail.com> [f785468dd419466dea0e7d7dde707f9ea29093c1]
+
+ doc: Split the content into multiple files & revise structure a bit.
+
+
+2018-02-19 Kohei Yoshida <kohei.yoshida@gmail.com> [2ced45a97195c6f3bf73b5d79d2426a39de600fb]
+
+ yaml: Rename detail::node to const_node.
+
+ Again, to be consistent with json::const_node.
+
+2018-02-19 Kohei Yoshida <kohei.yoshida@gmail.com> [7b416061ef640554da37ac6d970f502bd7cf0734]
+
+ yaml: Rename several classes to put them under 'yaml' namespace.
+
+ To be consistent with json::document_tree and its friends.
+
+ * yaml_node_t -> yaml::node_t
+ * yaml_document_error -> yaml::document_error
+ * yaml_document_tree -> yaml::document_tree
+
+2018-02-19 Kohei Yoshida <kohei.yoshida@gmail.com> [d448724bf2b90cbe6b8922d7e85e4ea70432a120]
+
+ xls-xml: Add a new test case for #51.
+
+ Also add a mechanism to configure output format, to limit precision
+ to 2 for this specific test case.
+
+2018-02-19 Kohei Yoshida <kohei.yoshida@gmail.com> [32a1b05ffc6edd7d528b6760dab9035252329ab0]
+
+ xls-xml: Gracefully handle formula cells without cached results.
+
+ This fixes #51.
+
+2018-02-19 Kohei Yoshida <kohei.yoshida@gmail.com> [9bc310a9efb1af1ff07721fdb9895b971dd21da1]
+
+ xls-xml: Add debug statement for current cell data.
+
+
+2018-02-15 Kohei Yoshida <kohei.yoshida@gmail.com> [53da9a0e804e754d42841a7bd78d5559f9672ee2]
+
+ More editing.
+
+
+2018-02-14 Kohei Yoshida <kohei.yoshida@gmail.com> [dc9136fe9e3124780276aa4ab0b7834399b5ce1e]
+
+ Update the change log to add new items.
+
+
+2018-02-14 Kohei Yoshida <kohei.yoshida@gmail.com> [fc0917edfce068de93690ae01246b0ebc3e65dea]
+
+ Add URL's to the 0.13.3 packages.
+
+
+2018-02-13 Kohei Yoshida <kohei.yoshida@gmail.com> [7b5e292fb721ec1ce948f7d520beb34e2c8827a1]
+
+ xls-xml: Add a test case for importing hidden row and column flags.
+
+
+2018-02-13 Kohei Yoshida <kohei.yoshida@gmail.com> [95420c1a1e8c082bb5953b2a49f0d56eef0e5f7e]
+
+ xls-xml: Import hidden row and column flags.
+
+
+2018-02-13 Kohei Yoshida <kohei.yoshida@gmail.com> [c535d48c2edc7a3ce2eb3bff7d5ba8d515910aa4]
+
+ xlsx: Add a test case for importing hidden row and column flags.
+
+
+2018-02-13 Kohei Yoshida <kohei.yoshida@gmail.com> [d331b7c100f7fe303d4ab3b5a7c949113cb438d9]
+
+ Add new test cases for importing hidden rows and columns.
+
+
+2018-02-13 Kohei Yoshida <kohei.yoshida@gmail.com> [509ef95fdc22afb4dfb3e845f906deeb957ff8be]
+
+ More editing of the Overview section.
+
+
+2018-02-14 Markus Mohrhard <markus.mohrhard@googlemail.com> [4e8ad812f4e682f7afaebb7a5c57831b43084928]
+
+ select elements by path in structured xml tree, fixes #48
+
+
+2018-02-13 Kohei Yoshida <kohei.yoshida@gmail.com> [49df2050d7c7ad38db265cf58922adc4db8022d4]
+
+ Custom cmake build script only to build the CSV parser portion.
+
+
+2018-02-12 Kohei Yoshida <kohei.yoshida@gmail.com> [06ea6f784d2a7bbbd298c556fb36114d978d2d0c]
+
+ ods: Add a new test document for importing parameterized functions.
+
+
+2018-02-12 Kohei Yoshida <kohei.yoshida@gmail.com> [14e1a62673c2be1c17f92d2fc198321f6c3f1aee]
+
+ We need to set ';' as the arg separator for when loading ODS.
+
+ And this change requires the current master version of ixion, hence
+ the required version bump.
+
+2018-02-09 Kohei Yoshida <kohei.yoshida@gmail.com> [466e95dddc59876a78691ee33017a168fcd2681e]
+
+ More editing of the Overview section.
+
+
+2018-02-09 Kohei Yoshida <kohei.yoshida@gmail.com> [02819781d916740b7ec364e9002a0b133d8819e9]
+
+ More addition to the Overview section.
+
+
+2018-02-08 Kohei Yoshida <kohei.yoshida@gmail.com> [6644c24de2edd6ad6edd4fbb1f0d3ce1c6b2f436]
+
+ This wasn't meant to be checked in.
+
+
+2018-02-08 Kohei Yoshida <kohei.yoshida@gmail.com> [8ee2b32d03cf7feb663f761ed7ee5dc09c303f22]
+
+ xlsx: Add check to make sure multi-line strings are imported.
+
+
+2018-02-08 Kohei Yoshida <kohei.yoshida@gmail.com> [0412bd269983825e5019a8a12267b54f51117aba]
+
+ xlsx: Remove carriage returns from multi-line strings.
+
+ Let's try to consistently only use linefeed characters for multi-
+ line strings.
+
+2018-02-08 Kohei Yoshida <kohei.yoshida@gmail.com> [7e9f6542a151eeca71dc88c96f4e9ebd53c973e6]
+
+ xls-xml: Add check to make sure multi-line strings are imported.
+
+
+2018-02-08 Kohei Yoshida <kohei.yoshida@gmail.com> [62a0d70ed19b0b472a9a6e074b68b7defb2cfe11]
+
+ More editing of the Overview section.
+
+
+2018-02-08 Kohei Yoshida <kohei.yoshida@gmail.com> [dcb71604f48d64d4c46d5b463ffdaa05019b8fee]
+
+ xls-xml: Add a test case for border color imports.
+
+
+2018-02-08 Kohei Yoshida <kohei.yoshida@gmail.com> [e065d26dabafea465ec49e7d79775e62014ac0db]
+
+ xls-xml: Pick up border colors.
+
+
+2018-02-07 Kohei Yoshida <kohei.yoshida@gmail.com> [683231b61a450ee0b3bb8214d8d2bd720330554e]
+
+ xlsx: Add test case for border color imports.
+
+
+2018-02-07 Kohei Yoshida <kohei.yoshida@gmail.com> [e64bdf3b8ad5771c47f238fc9a010ab82322b20a]
+
+ Have color_t support ostream operator.
+
+
+2018-02-07 Kohei Yoshida <kohei.yoshida@gmail.com> [c392ea15000b331bb6580b09c1045fd14b449b46]
+
+ xlsx: Let's not forget to apply color for diagonal borders too.
+
+
+2018-02-07 Kohei Yoshida <kohei.yoshida@gmail.com> [1729aabd9f2bfe44af00ace3b363ecc2d3815e98]
+
+ Update the contents to fix errors.
+
+
+2018-02-07 Kohei Yoshida <kohei.yoshida@gmail.com> [c4c4eb328d894a4d454dcd5eb1cf0a7675134493]
+
+ New test documents for importing colored cell borders.
+
+
+2018-02-05 David Tardon <dtardon@redhat.com> [e2cb7738ed7880292302de23910d0c2daefd16a0]
+
+ fix GCC 8 warnings
+
+ error: ‘void* memcpy(void*, const void*, size_t)’ writing to an object of type ‘struct orcus::css_property_value_t’ with no trivial copy-assignment; use copy-assignment or copy-initialization instead [-Werror=class-memaccess]
+
+2018-02-03 Kohei Yoshida <kohei.yoshida@gmail.com> [f4953441b56cd2288197f18d6929252d3dbb714e]
+
+ doc: More editing of the Overview section.
+
+
+2018-02-03 Kohei Yoshida <kohei.yoshida@gmail.com> [a67dd7e709476098c9cbf67a170290c1cd9eca56]
+
+ Finish the example code.
+
+
+2018-02-02 Kohei Yoshida <kohei.yoshida@gmail.com> [9365a095ea5e27ba9f9feaf187afc59c18eacc84]
+
+ WIP: working on an example code for loading document.
+
+
+2018-02-01 Kohei Yoshida <kohei.yoshida@gmail.com> [a643d9354451d5dc679bbe645500f263c0a77579]
+
+ xls-xml: Add checks on white font colors.
+
+
+2018-02-01 Kohei Yoshida <kohei.yoshida@gmail.com> [e6cab3b46dd94c9b69093d7474a151f3f290b508]
+
+ More editing of the overview section.
+
+
+2018-01-31 Kohei Yoshida <kohei.yoshida@gmail.com> [f821995022df8dd1e580dd22cf131584b2b1ac4f]
+
+ We are supposed to use the foreground color for solid fill.
+
+
+2018-01-31 Kohei Yoshida <kohei.yoshida@gmail.com> [f7953a814d6a43205791b6cc01c528ef5d4b1ce3]
+
+ Alpha value of 0 means fully transparent. I'm sure 255 was intended.
+
+
+2018-01-31 Kohei Yoshida <kohei.yoshida@gmail.com> [132ea4d2b7aa4096854a895ff06da147be0462ed]
+
+ This is meant to be a background color.
+
+
+2018-01-31 Kohei Yoshida <kohei.yoshida@gmail.com> [62b17ac3aaf82e4901d071acaa5645824dea8b56]
+
+ Add method docs to the fill-related interface methods.
+
+
+2018-01-30 Kohei Yoshida <kohei.yoshida@gmail.com> [cb03b1b56704eb586faf88f0c3cd391906657a43]
+
+ doc: Add some paragraphs to the Overview section.
+
+
+2018-01-26 Kohei Yoshida <kohei.yoshida@gmail.com> [92582c78f8901b5d25e6f5da5a2e5979a14d3ef7]
+
+ Happy new year.
+
+
+2018-01-26 Kohei Yoshida <kohei.yoshida@gmail.com> [f0648c0a2346a93532e64870c6e530a2ff40ccc8]
+
+ Add links to the 0.13.2 packages.
+
+
+2018-01-26 Kohei Yoshida <kohei.yoshida@gmail.com> [dd673df312955bb2c2fe534d6dec4e700f69fcd6]
+
+ Fix automake file list...
+
+
+2018-01-26 Kohei Yoshida <kohei.yoshida@gmail.com> [4be5858af87ece662199b2b6b53cfdc05ee9857e]
+
+ Update for the upcoming 0.13.2.
+
+
+2018-01-26 Kohei Yoshida <kohei.yoshida@gmail.com> [3bcff0fdb59af4dd4c3326e57b26180f46d4aee4]
+
+ xls-xml: add another test case for cell border import.
+
+
+2018-01-25 Kohei Yoshida <kohei.yoshida@gmail.com> [b47f8a0f1f4d9fbb1bd55ea3f037d1ec3559999f]
+
+ xls-xml: add a test case for importing cell borders.
+
+
+2018-01-25 Kohei Yoshida <kohei.yoshida@gmail.com> [83f7fb42f5280f1732dfb135e3aa41adc29f29b2]
+
+ xls-xml: import cell borders.
+
+ We'll just map these cell borders to xlsx's cell border styles.
+
+2018-01-24 Kohei Yoshida <kohei.yoshida@gmail.com> [95266fc56f2793cc0a9a209ccf5c6859516b5877]
+
+ xlsx: test diagonal border import results.
+
+
+2018-01-24 Kohei Yoshida <kohei.yoshida@gmail.com> [6f4ff977fb912f389cb5f066c136f758e8431f78]
+
+ xlsx: pick up diagonal borders.
+
+
+2018-01-24 Kohei Yoshida <kohei.yoshida@gmail.com> [75776c8077bf67ffc656c24719a4c010967f1248]
+
+ Update the test files to include cross diagonal borders.
+
+
+2018-01-23 Kohei Yoshida <kohei.yoshida@gmail.com> [b162787321b3796f9e8b558d503134d9a51cb8cf]
+
+ xlsx: add new test case for importing cell borders.
+
+
+2018-01-23 Kohei Yoshida <kohei.yoshida@gmail.com> [b5d3809c70ef7531e2891d8ac0b04873a4573480]
+
+ xlsx: fix exception being thrown when diagonal element is encountered.
+
+
+2018-01-23 Kohei Yoshida <kohei.yoshida@gmail.com> [1175a3e6e7576c36f9fc8c20a5a369996320ac19]
+
+ xlsx: add a test case for cell border styles import.
+
+
+2018-01-23 Kohei Yoshida <kohei.yoshida@gmail.com> [5150e83acef8d22df4467703a0cf82a74ed19a18]
+
+ Consistent look for sorted_string_map singletons.
+
+
+2018-01-23 David Tardon <dtardon@redhat.com> [658e77a9fc43853cb25a9511e01772dd1bef3c36]
+
+ fix build failure in Rawhide
+
+
+2018-01-23 David Tardon <dtardon@redhat.com> [719ab1789710a32c034f85b826025c71808a5eb5]
+
+ fix automake warning
+
+
+2018-01-14 Kohei Yoshida <kohei.yoshida@gmail.com> [0f13b99c58e830470324c25c3337721695857346]
+
+ Add new test files for importing cell borders.
+
+
+2018-01-13 Kohei Yoshida <kohei.yoshida@gmail.com> [fef2ca47cb85184e3bac0fd1a752355884e6d4f6]
+
+ xls-xml: add test case for importing text alignment properties.
+
+
+2018-01-13 Kohei Yoshida <kohei.yoshida@gmail.com> [caece95470f4ba5cf4aaca513f493d6a94b4dfa7]
+
+ xls-xml: pick up text alignment properties.
+
+
+2018-01-13 Kohei Yoshida <kohei.yoshida@gmail.com> [9df31de04aab1e0c00136fa0c5dc636cbd3b59ca]
+
+ Ignore more files.
+
+
+2018-01-13 Kohei Yoshida <kohei.yoshida@gmail.com> [fa3daf48cd5624ace41bdf2d5c534280effcbf5a]
+
+ I guess I never checked in this file...
+
+
+2018-01-13 Kohei Yoshida <kohei.yoshida@gmail.com> [3e1f42b185e7b4d44961c6f1a1f21c7cd0ba6968]
+
+ CI still not happy yet. Let's try again.
+
+
+2018-01-13 Kohei Yoshida <kohei.yoshida@gmail.com> [8a159c60a8540ba19c3e0007b28c95751f81b119]
+
+ Try to keep the CI happy.
+
+
+2018-01-10 Kohei Yoshida <kohei.yoshida@gmail.com> [4247eb8c38aa3663d7bef53c350652ab001043e3]
+
+ Re-align the expected values.
+
+
+2018-01-10 Kohei Yoshida <kohei.yoshida@gmail.com> [b39f90b7132b6fbf3878a31375c5d142120bbf05]
+
+ xlsx: add a test case for this.
+
+
+2018-01-10 Kohei Yoshida <kohei.yoshida@gmail.com> [a138b970085b2ff1f43888d39f1e891f46c7e2b1]
+
+ xlsx: pick up justified and distributed alignment types as well.
+
+
+2018-01-10 Kohei Yoshida <kohei.yoshida@gmail.com> [39cdb272512799edd34d6556da3ee3aee3dd0a8b]
+
+ Update the test files to include distributed alignments.
+
+ Both in horizontal and vertical directions.
+
+2018-01-05 Kohei Yoshida <kohei.yoshida@gmail.com> [9728fa6ab59c1524911a07181e21f5158c3addd6]
+
+ New test files for import text alignment settings.
+
+ For both xlsx and xls-xml formats.
+
+2018-01-04 Kohei Yoshida <kohei.yoshida@gmail.com> [4b98396cedc46cd8e2999934eb7dd45a16990c15]
+
+ xls-xml: add test case for importing solid background fills.
+
+
+2018-01-04 Kohei Yoshida <kohei.yoshida@gmail.com> [62e49b9297c4c3417524d960bd0cd3e4fa4f9885]
+
+ xls-xml: alpha value must be 255 for being fully opaque.
+
+
+2018-01-04 Kohei Yoshida <kohei.yoshida@gmail.com> [f3c8707042914b1c771dd643983d773f9fcf217b]
+
+ xls-xml: pick up solid fill colors.
+
+
+2018-01-03 Kohei Yoshida <kohei.yoshida@gmail.com> [cd190dccaa478dd97853d235a43d03553ca05ecb]
+
+ xlsx: add test case for background color fill import.
+
+
+2017-12-30 Kohei Yoshida <kohei.yoshida@gmail.com> [239500e9ad0273e29f9d7a2be2b22430faa4f0e9]
+
+ Add ranged column widht and row height properties.
+
+
+2017-12-30 Kohei Yoshida <kohei.yoshida@gmail.com> [967159775ac053f22cb1c7e644c9ef8b70029390]
+
+ Add test cases for importing column width and row height properties.
+
+
+2017-12-30 Kohei Yoshida <kohei.yoshida@gmail.com> [0b9323fc39e4f4cc0f7b063f55fd8443feedf21c]
+
+ Pick up row height properties.
+
+
+2017-12-30 Kohei Yoshida <kohei.yoshida@gmail.com> [057d65f7db30f58fca880aa2952d9536e5d2a5ac]
+
+ Pick up column width properties.
+
+
+2017-12-30 Kohei Yoshida <kohei.yoshida@gmail.com> [06e8c13e40fc34230ef43c8c53ea0dcf4f4e18ac]
+
+ Add ranged column width and row height properties.
+
+
+2017-12-28 Kohei Yoshida <kohei.yoshida@gmail.com> [4edc295ec37ba51c191ebebd366024b5e225918f]
+
+ Test file for importing standard cell background colors.
+
+
+2017-12-28 Kohei Yoshida <kohei.yoshida@gmail.com> [30eedd2088a3d6b40427aed3eaa31cc205b74a2c]
+
+ New test file for column widths and row heights import.
+
+
+2017-12-17 Kohei Yoshida <kohei.yoshida@gmail.com> [251e44ca74f41c0b90b214c2277c0473441936ff]
+
+ Add these formula-cells test cases to the list of test cases.
+
+
+2017-12-17 Kohei Yoshida <kohei.yoshida@gmail.com> [f28458d29d5839db9f927a92f5d651aad65cf167]
+
+ Two new test cases for testing formula cell import.
+
+
+2017-12-17 Kohei Yoshida <kohei.yoshida@gmail.com> [53ecae110cf2977bcd8da342b1491961bd24bd8c]
+
+ New test cases for matrix formulas.
+
+
+2017-12-09 Kohei Yoshida <kohei.yoshida@gmail.com> [6855117f47f146ef8337c38e7c2144e4e46f9165]
+
+ Fix the sentence. The word 'not' was repeated.
+
+
+2017-11-27 Caolán McNamara <caolanm@redhat.com> [0a5014ae282f7a3bd2dae0cf6425d7b61d06b034]
+
+ Silence an assert.
+
+
+2017-11-15 Kohei Yoshida <kohei.yoshida@gmail.com> [58c0a5295eab51f926ac784e6ae4b16f6b134b25]
+
+ Add links to the 0.13.1 source packages.
+
+
+2017-11-15 Kohei Yoshida <kohei.yoshida@gmail.com> [496f1eeed45a655c30d2be788ffa196dc75798cb]
+
+ Update to add another item.
+
+
+2017-11-15 Kohei Yoshida <kohei.yoshida@gmail.com> [7dbcb917fa85a94d00384c3d74085c3c3d4e5a0d]
+
+ Update the changelog.
+
+
+2017-10-26 Mike Kaganski <mikekaganski@gmail.com> [43be0bed1084880f45c1040371f0975fe72ffa6b]
+
+ Remove unreachable code
+
+
+2017-10-08 Kohei Yoshida <kohei.yoshida@gmail.com> [c2a256e6ea1788d7f3de8fc51260b916d1a70c8a]
+
+ Removing obsolete Visual Studio solution files.
+
+ Use cmake on Windows instead.
+
+2017-10-08 Kohei Yoshida <kohei.yoshida@gmail.com> [bfba82d2389a81f91a4e532bd5922a7677cf4348]
+
+ python: add test for format types.
+
+
+2017-10-08 Kohei Yoshida <kohei.yoshida@gmail.com> [e06371e01ce88a57335af63e8dbaf747b44e2e16]
+
+ python: actually check the specified format type.
+
+ And make sure it is correctly set to CSV.
+
+2017-10-07 Kohei Yoshida <kohei.yoshida@gmail.com> [faa7d776f540cc96b9a4faf24896a47c39f3114b]
+
+ python: add two more test cases.
+
+
+2017-10-07 Kohei Yoshida <kohei.yoshida@gmail.com> [4f2ff9f1124d4035cb2543ab524a369d3bb7d847]
+
+ python: test the exported csv stream content against check.txt.
+
+
+2017-10-07 Kohei Yoshida <kohei.yoshida@gmail.com> [f1cad2b673ea94339e972e8d24ac679ad89241e0]
+
+ Add this file to slickedit project.
+
+
+2017-10-04 Kohei Yoshida <kohei.yoshida@gmail.com> [6845921412bc966d668a1392390d43475e410e0b]
+
+ python: write only when the content is not empty.
+
+
+2017-10-04 Kohei Yoshida <kohei.yoshida@gmail.com> [71203cc4723f6037c1bf4b3ffa9459f5b4d13220]
+
+ python: add unit test for csv export. Still WIP.
+
+
+2017-10-04 Kohei Yoshida <kohei.yoshida@gmail.com> [cbde5496aaeecf28b3848b23c809b43a00024829]
+
+ python: finish implementing the write() method.
+
+
+2017-10-04 Kohei Yoshida <kohei.yoshida@gmail.com> [302092ebe03adc03f20cb92e0d3270ae00033739]
+
+ python: get the csv content bytes and dump it to stdout (for now).
+
+
+2017-10-04 Kohei Yoshida <kohei.yoshida@gmail.com> [23faf94b92842ae4dd6ff6c6b63a4976c4592e5d]
+
+ python: set up a skeleton write() method for exporting.
+
+ Still to be implemented.
+
+2017-10-04 Kohei Yoshida <kohei.yoshida@gmail.com> [a83a0282448cc418cce957e987db450cfdd1e7e0]
+
+ python: add FormatType enum, to be used to specify export format type.
+
+
+2017-10-03 Kohei Yoshida <kohei.yoshida@gmail.com> [3f2487e928bb587b62cb36774a1f9015d53686e6]
+
+ I guess I forgot to add this file...
+
+
+2017-09-29 Kohei Yoshida <kohei.yoshida@gmail.com> [49284ff6b867817bab1cc54e3ad8db479d0fdd0a]
+
+ python: add gnumeric import test.
+
+
+2017-09-29 Kohei Yoshida <kohei.yoshida@gmail.com> [588c042f120e0400fd9641ade0674c34b9722e5c]
+
+ Add a rudimentary test framework for gnumeric.
+
+
+2017-09-29 Markus Mohrhard <markus.mohrhard@googlemail.com> [bd9d921c671777cb0942aba210d4d03940747961]
+
+ Fixes #46. Use efficient way to set format ranges in spreadsheet model
+
+
+2017-09-26 Kohei Yoshida <kohei.yoshida@gmail.com> [830c735fe965472e7e093bf26a52d24115ccc21d]
+
+ Add new python functions.
+
+
+2017-09-26 Kohei Yoshida <kohei.yoshida@gmail.com> [502c60f5f115b623851e4e71a8da1aac7e414094]
+
+ python: add the entire test case set for xls-xml.
+
+
+2017-09-26 Kohei Yoshida <kohei.yoshida@gmail.com> [f7e9e4819df01d8a419876fe8469e830f8f8d5a4]
+
+ python: fix the line parsing of a formula line.
+
+ And enable the "formula-1" test for ods.
+
+2017-09-26 Kohei Yoshida <kohei.yoshida@gmail.com> [fbdf80ed7b07ef583f6444b945698245071d4d64]
+
+ python: fix the crasher bug on calling get_rows() on empty sheet.
+
+ And enable another assert that checks for empty row set.
+
+2017-09-25 Kohei Yoshida <kohei.yoshida@gmail.com> [5a9f55fb8aec54402aba64c096d6f427f43a23db]
+
+ Throw an exception with a better error message.
+
+
+2017-09-25 Kohei Yoshida <kohei.yoshida@gmail.com> [10f805a99740bf5d27c46056cac65dd6ce312355]
+
+ python: parse the formula cell lines in check.txt correctly.
+
+
+2017-09-25 Kohei Yoshida <kohei.yoshida@gmail.com> [a5da2fd8b41beeb2915343350c91d57283dcc8bc]
+
+ python: try all five import test cases.
+
+ And fix the "boolean-values" test case. The "empty-shared-strings"
+ test case still fails.
+
+2017-09-25 Kohei Yoshida <kohei.yoshida@gmail.com> [30491e96f8218d518f8f8180d23c33cabaf52067]
+
+ It acutally looks fine without those ':'s.
+
+
+2017-09-25 Kohei Yoshida <kohei.yoshida@gmail.com> [1ffbca49d8ef0f05323c4be8ec6998f6b799031e]
+
+ python: properly unescape string cell values from check.txt.
+
+ Now all csv tests do pass.
+
+2017-09-25 Kohei Yoshida <kohei.yoshida@gmail.com> [200df821413c7d9c21cae90376bfab949ab7b319]
+
+ python: add test file for csv file load.
+
+ One test case currently fails. I need to look into this.
+
+2017-09-24 Kohei Yoshida <kohei.yoshida@gmail.com> [0f9c442a08f63d071e695599df6f03fe39fb3a52]
+
+ python: make use of check.txt file for content check.
+
+ This will make it easier to add new test cases.
+
+2017-09-24 Kohei Yoshida <kohei.yoshida@gmail.com> [4cc2113e4076750a22335b84dc6bb64ca29e1ae2]
+
+ python: first test case for orcus.xls_xml.read().
+
+
+2017-09-24 Kohei Yoshida <kohei.yoshida@gmail.com> [2be8b0f394d73ccf9504e55b7a06778732822707]
+
+ xls-xml: new test case, to be integrated.
+
+
+2017-09-24 Kohei Yoshida <kohei.yoshida@gmail.com> [d715d085721ccd7c422b811c49bda8f3dc216fda]
+
+ python: implement orcus.gnumeric.read().
+
+
+2017-09-24 Kohei Yoshida <kohei.yoshida@gmail.com> [a3d5f3b0ee6e1dadda05ce6ca242c30c124afeb3]
+
+ python: implement orcus.xls_xml.read().
+
+
+2017-09-23 Kohei Yoshida <kohei.yoshida@gmail.com> [cdeeaa70c63351800b657ca0a8bca7fc79a294b1]
+
+ python: add support for loading csv files.
+
+
+2017-09-23 Kohei Yoshida <kohei.yoshida@gmail.com> [28f8e23b378f837a1e6ef2d2eda9493f0dceb46f]
+
+ python: move the identical test case into common module.
+
+ This module will be shared between multiple test files for multiple
+ file format types.
+
+2017-09-23 Kohei Yoshida <kohei.yoshida@gmail.com> [1b77b2bb99b55c4e44250be6e9d7dddfb562b2e5]
+
+ python: add a rudimentary test case for loading of ods.
+
+
+2017-09-23 Kohei Yoshida <kohei.yoshida@gmail.com> [ed4d554367257f2021c8e023a3b5ba816b360cc8]
+
+ python: further refactoring to make the code a bit more shorter.
+
+
+2017-09-22 Kohei Yoshida <kohei.yoshida@gmail.com> [641fd99bfd3153139b65699276e218fe6a4487df]
+
+ python: check for null pointers and handle it gracefully.
+
+
+2017-09-22 Kohei Yoshida <kohei.yoshida@gmail.com> [1061404ec1fd89a7c7249099a43e2c0f756f50ff]
+
+ python: use the term 'stream' consistently.
+
+
+2017-09-22 Kohei Yoshida <kohei.yoshida@gmail.com> [ec2197a93ea7741c9d6b07b8cdee1b529c166a4c]
+
+ python: implement orcus.ods.read().
+
+
+2017-09-22 Kohei Yoshida <kohei.yoshida@gmail.com> [384039be2efb3232568bd8bf8d5e49a398aec85e]
+
+ python: extract another function to be reused.
+
+
+2017-09-21 Kohei Yoshida <kohei.yoshida@gmail.com> [7054fd3867417a9403f0ecdb932c7609d05759c5]
+
+ Extract some functions to make them reusable.
+
+
+2017-09-21 Kohei Yoshida <kohei.yoshida@gmail.com> [49bbc80c384a98d616b8c04a007a5256b913a60e]
+
+ Add the change.
+
+
+2017-09-21 Kohei Yoshida <kohei.yoshida@gmail.com> [d17429c9f8d7827ac950afd432166086ba8ea58c]
+
+ python: completely remove the read_file() function.
+
+
+2017-09-21 Kohei Yoshida <kohei.yoshida@gmail.com> [107acc453f313cec438550e98ddba27da83e2447]
+
+ python: use the new read() method to load xlsx file.
+
+
+2017-09-19 Kohei Yoshida <kohei.yoshida@gmail.com> [edeb521f28b2d56e96286c8f28810c24ff806283]
+
+ python: first cut on xlsx.read().
+
+ Some clean up to do later, as some temporary copy-n-paste has been
+ done...
+
+2017-09-19 Kohei Yoshida <kohei.yoshida@gmail.com> [ded737140e27cf5a8bb050ad7acb70c71ff7ab82]
+
+ python: add new method skeleton orcus.xlsx.read(...).
+
+ To be implemented.
+
+2017-09-19 Kohei Yoshida <kohei.yoshida@gmail.com> [fb49dab9b074b31f76a4797bdccf977b5fa532d8]
+
+ Add recent changes.
+
+
+2017-09-18 Kohei Yoshida <kohei.yoshida@gmail.com> [4208d5f28d32cba1bfccd9573c1bf0b0532ae86b]
+
+ No more read_file() and write_file(), and no more persistent stream.
+
+
+2017-09-18 Kohei Yoshida <kohei.yoshida@gmail.com> [694e04be17452ea3c40d4a99c5c31f04db2ed4c2]
+
+ Test to make sure it works without persistent source XML stream.
+
+
+2017-09-16 Kohei Yoshida <kohei.yoshida@gmail.com> [098750dcc5d17295bbf36d8a24f065bfb5b58bac]
+
+ Do the file I/O outside of orcus_xml instance.
+
+
+2017-09-16 Kohei Yoshida <kohei.yoshida@gmail.com> [0f5e4cd54013ece55b3f2ba4a69ca92d98c63cc1]
+
+ orcus-xml: create a generic write() method.
+
+ This method takes the input stream from the caller and the output
+ will be a generic ostream object.
+
+2017-09-16 Kohei Yoshida <kohei.yoshida@gmail.com> [cd1daf2b5761f5cd9385660d3824343bffc07fe2]
+
+ Exporting to a file doesn't change the state of the instance.
+
+
+2017-09-13 Kohei Yoshida <kohei.yoshida@gmail.com> [6ecea85efd5f156dc29242cd7065cc806a75dbc1]
+
+ Up the API version.
+
+
+2017-09-13 Kohei Yoshida <kohei.yoshida@gmail.com> [0f83fa41bee1d010dc8806353f7fda065ce27a71]
+
+ Store stream offsets instead of pointers to char.
+
+ In order to avoid having to store the original stream in memory
+ forever...
+
+2017-09-13 Kohei Yoshida <kohei.yoshida@gmail.com> [5e700a4cbf7f19de707d29c769f0143fb7f0d87f]
+
+ Ensure that we don't change the stream begin position once set.
+
+ We need this guarantee when using the offset values of a stream at
+ different points in time.
+
+2017-09-07 Kohei Yoshida <kohei.yoshida@gmail.com> [eafd86f475a7de9d9d43df472f453e068cb06141]
+
+ Reflect the latest patch from Miklos.
+
+
+2017-09-07 Miklos Vajna <vmiklos@collabora.co.uk> [cc8356089eb7ee226521162a23c32d48407833bb]
+
+ css parser: handle single quotes for property values
+
+ And modify one of the testcases where there are already two
+ double-quoted strings, so that one of them is single-quoted. This way
+ make check fails without the code change.
+
+2017-08-30 Kohei Yoshida <kohei.yoshida@gmail.com> [4d24143521d469b90541521b37d95862619ddcc2]
+
+ Add class descriptions.
+
+
+2017-08-30 Kohei Yoshida <kohei.yoshida@gmail.com> [715c91c6fc1ab38c5e9bd3fe354a85bbc4856c38]
+
+ doc: add example for json array's push_back() method.
+
+
+2017-08-29 Kohei Yoshida <kohei.yoshida@gmail.com> [891b21809ef02a91decec00e6b83b1de6f1f6ce6]
+
+ Add some class descriptions.
+
+
+2017-08-29 Kohei Yoshida <kohei.yoshida@gmail.com> [d048e01866588056fb3882116feec219982f1846]
+
+ doc: add the rest of the code examples and annotate them.
+
+
+2017-08-28 Kohei Yoshida <kohei.yoshida@gmail.com> [25196a7de1046ad68332c120d32d2ed3edce1835]
+
+ doc: this flows better.
+
+
+2017-08-28 Kohei Yoshida <kohei.yoshida@gmail.com> [4951f1b0a9bf526cb5b55a51412d5e6716a4c2f1]
+
+ doc: add more examples.
+
+
+2017-08-28 Kohei Yoshida <kohei.yoshida@gmail.com> [35801917a0985161aa3fac0a2366b2527df11511]
+
+ doc: add more code snippets and narratives.
+
+
+2017-08-26 Kohei Yoshida <kohei.yoshida@gmail.com> [60b505a3440950a80c0020f6572d9ca791d0ff95]
+
+ doc: edit and add some content.
+
+
+2017-08-26 Kohei Yoshida <kohei.yoshida@gmail.com> [d1e03f528ead6e57370cf4c222e044d548350bdd]
+
+ doc: add more example code blocks.
+
+
+2017-08-24 Kohei Yoshida <kohei.yoshida@gmail.com> [e1c57ee747a090c67d26eb21041aa928fd35a2b2]
+
+ Add these files to slickedit project.
+
+
+2017-08-24 Kohei Yoshida <kohei.yoshida@gmail.com> [206fd9ba51ad0815ea54c28ba53a610575a814fe]
+
+ doc: add another example code for direct json doc tree initialization.
+
+ Not finished yet.
+
+2017-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [3dcd866b0a20d7294772359df061b1035d63c5bf]
+
+ orcus-xml: rename read_content to read_stream.
+
+ To be consistent with the equivalent methods in the other orcus-*
+ classes.
+
+2017-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [543cf40fe554fa2b883df8cea2194b93a916c003]
+
+ doc: update the CLI options.
+
+
+2017-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [20bfdc6870d68095d7e3779d3e8acbb8871cabce]
+
+ doc: update the class names here as well.
+
+
+2017-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [eedf17c9f20aef4cd602202d95ee36d23bc52a3d]
+
+ doc: update the json example codes.
+
+
+2017-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [e829380c28ee48eb9935b9b8e2c0e1a056e38eaf]
+
+ Make the doc example code a part of the automatic test suite.
+
+ These codes now get run as part of 'make check'.
+
+2017-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [5f33e788ebbe5bcc40ffdb420a4aec68727c2b4d]
+
+ Add more classes to the doc.
+
+
+2017-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [337473cb0724a3a80590809261d87fc4c5bc81b5]
+
+ Avoid decltype and use real type of nullptr.
+
+ Doxygen also trips on decltype.
+
+2017-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [1e2e43a90a47d7cc0306ee8809f56d8e6bde01c7]
+
+ Fix the doc a bit.
+
+
+2017-08-22 Markus Mohrhard <markus.mohrhard@googlemail.com> [c2c8948110f630c48ed22b0660623472048811ed]
+
+ orcus_xml: add a read_content method
+
+
+2017-08-15 Kohei Yoshida <kohei.yoshida@gmail.com> [91b1b9cf81b01e5d1fba02b2c2031b5d86c51ae6]
+
+ Update the changelog post the 0.13.0 release.
+
+
+2017-08-15 Kohei Yoshida <kohei.yoshida@gmail.com> [941a31ca3644c8519146d652f1e24b9c68d60e06]
+
+ Fix the release date.
+
+
+2017-08-15 Kohei Yoshida <kohei.yoshida@gmail.com> [cd34695b55d598c6573923b638534944e037fc1b]
+
+ Add URL's to the 0.13.0 source packages.
+
+
+2017-08-15 Kohei Yoshida <kohei.yoshida@gmail.com> [c3b3b36e4a1a3dc97a12f062a483f96bbeaf0259]
+
+ Update the authors list.
+
+
+2017-08-15 Kohei Yoshida <kohei.yoshida@gmail.com> [0de183f531cf1e7890771ae5bddaf61a292eda5f]
+
+ Fix 'make distcheck'.
+
+
+2017-08-15 Kohei Yoshida <kohei.yoshida@gmail.com> [dc16a9fdcc1b18b0a892abc7f43a5d26bab03e6e]
+
+ Set the version to 0.13.0.
+
+
+2017-08-15 Markus Mohrhard <markus.mohrhard@googlemail.com> [37450e08b8cf29ddeef6cafc2ab00ae64b7af1ab]
+
+ add test for underscore as starting character of attributes and elements
+
+
+2017-08-15 Markus Mohrhard <markus.mohrhard@googlemail.com> [a9b0ea6e0ac482b0af1a99881507a118e29242ee]
+
+ also allow underscore as starting char for element names
+
+
+2017-08-15 Kohei Yoshida <kohei.yoshida@gmail.com> [ed7469e397cb5e369a9c6b5f72f2b0c9a1abb084]
+
+ sax: XML 1.0 apparently allows documents with no header declaration.
+
+
+2017-08-15 Markus Mohrhard <markus.mohrhard@googlemail.com> [f9628b892860fa69e4cab5b081ba97899e52f3d5]
+
+ underscore is a valid starting character for xml element names and attributes
+
+
+2017-08-15 Kohei Yoshida <kohei.yoshida@gmail.com> [1fbd4fb79625afb77cb1a7bb83863a47671109b4]
+
+ Get it to build with MSVC once again.
+
+
+2017-08-09 Kohei Yoshida <kohei.yoshida@gmail.com> [44964c728b7e4c82ccadd9aff9a7dd60a89c2e75]
+
+ csv-split: test case for truncating data on the first sheet.
+
+
+2017-08-09 Kohei Yoshida <kohei.yoshida@gmail.com> [922e39517658b35108b53e6e197b0379053530ee]
+
+ csv-split: make the decision of whether to split the data optional.
+
+ And add --split option to turn on this flag. It's off by default.
+
+2017-08-09 Kohei Yoshida <kohei.yoshida@gmail.com> [967c501e1e358f90ad6b1043963d132404de1c62]
+
+ Make the --row-size option available in other spreadsheet filters.
+
+ And move the json specific functions out of the global filter code.
+
+2017-08-08 Kohei Yoshida <kohei.yoshida@gmail.com> [929d28276598d27b00344f8434630e5c94b76e40]
+
+ csv-split: add another CLI option to specify max row size in a sheet.
+
+
+2017-08-08 Kohei Yoshida <kohei.yoshida@gmail.com> [4f57790c168e31ba1e9a5e18000cf67d7db26b79]
+
+ csv-split: add mechanism to allow extending the CLI args.
+
+ And have orcus-csv use it to add --row-header option.
+
+2017-08-07 Kohei Yoshida <kohei.yoshida@gmail.com> [a9bf0f2182eebc9e3aebe6cede877e5dfb42395d]
+
+ csv-split: duplicate the header rows when appropriate.
+
+
+2017-08-05 Kohei Yoshida <kohei.yoshida@gmail.com> [dd612f82f5b54d1a75444b8599aa4077093b7c0d]
+
+ Let's avoid directly touching mp_char.
+
+
+2017-08-05 Kohei Yoshida <kohei.yoshida@gmail.com> [6f8ec8c733ae38f00733af0096bd6b04bcf08794]
+
+ csv: potentially skip byte order mark if present.
+
+ Excel-generated csv files may contain byte order mark. Skip it if
+ present.
+
+2017-08-05 Kohei Yoshida <kohei.yoshida@gmail.com> [cae53c2d78a43c9db2c94890659dc4238646d3cd]
+
+ Better output in case of content verification failure.
+
+ And I just discovered that an Excel-generated csv file contains the
+ leading EFBBBF bytes (byte order mark).
+
+2017-08-03 Kohei Yoshida <kohei.yoshida@gmail.com> [c1b3a55ce0fde3fcbe31f3c834b1c2ec9edabff6]
+
+ csv-split: write the first test, and fix a few things...
+
+ But it still fails. Data won't get imported in the 2nd column on
+ sheet 1 for some reason.
+
+2017-08-03 Kohei Yoshida <kohei.yoshida@gmail.com> [d07e353aa04637c6022ff512cf64b6fe1807b2d7]
+
+ Re-structure config to accommodate format-specific settings.
+
+ For now only CSV will make use of this.
+
+2017-08-03 Kohei Yoshida <kohei.yoshida@gmail.com> [daf1853174af90ecb37995489ade3e7c15cfab62]
+
+ csv-split: add new test file to import.
+
+
+2017-08-02 Kohei Yoshida <kohei.yoshida@gmail.com> [fd955033be2c7dc20992e21cbb24a8c16cff37b4]
+
+ csv-split: add a new method to import_sheet to return sheet size.
+
+ And use it to decide whether or not to append a new sheet during csv
+ import.
+
+ It's not tested yet.
+
+2017-08-02 Kohei Yoshida <kohei.yoshida@gmail.com> [4cc0e545466c1be1ee0714fa3ef96b83aa4ee681]
+
+ csv-split: Prepare for importing csv data into multiple sheets.
+
+
+2017-08-01 Kohei Yoshida <kohei.yoshida@gmail.com> [041bcbcf5f9ec4cf16cb6e0f731a7a1207b3f9fc]
+
+ Actually this isn't needed.
+
+ Whether or not to quote the cell value is determined at the top of
+ the function now. This line was a left-over of the older method I
+ used.
+
+2017-07-31 Kohei Yoshida <kohei.yoshida@gmail.com> [e626f986b89e0f9e919154e12667ceae369ec474]
+
+ cmake: add new files to make it buildable again.
+
+
+2017-07-31 Kohei Yoshida <kohei.yoshida@gmail.com> [1c80baaf30c7031613cfe76bd13f868dc8f4b55f]
+
+ csv: correctly handle double-quotes when dumping as csv.
+
+ Now all tests pass.
+
+2017-07-31 Kohei Yoshida <kohei.yoshida@gmail.com> [a896aeab74f829169b40572a872c9cfb7e089111]
+
+ Add a stand-alone function for verifying document content.
+
+ We will improve the error output to make it more viewer-friendly
+ later.
+
+2017-07-31 Kohei Yoshida <kohei.yoshida@gmail.com> [884e8d09d0c48b9974e6dc16fd240052468eb067]
+
+ Start defining commonly-used test functions in a central place.
+
+ They will be used in other test code as well.
+
+2017-07-31 Kohei Yoshida <kohei.yoshida@gmail.com> [d2ae5380383757a15d443e4c105891cd9a7d54f4]
+
+ csv: update the csv test to test for csv dumping.
+
+ It currently fails.
+
+2017-07-31 Kohei Yoshida <kohei.yoshida@gmail.com> [d10f73bd6560badab87d641eb3439a0e83bbc869]
+
+ Modernize the code a bit, and remove 'using namespace std'.
+
+
+2017-07-27 Kohei Yoshida <kohei.yoshida@gmail.com> [9eb1f0521e774a8ebe9ab6d79248884ca9dc9671]
+
+ And finally sheet::dump_csv() as well.
+
+
+2017-07-27 Kohei Yoshida <kohei.yoshida@gmail.com> [25b80ac0116bf43bb02d6dae7659c022acc68cf8]
+
+ sheet::dump_json() to also take a generic output stream.
+
+
+2017-07-27 Kohei Yoshida <kohei.yoshida@gmail.com> [6999a8aa199750f8f8984eedbf920558890e7b58]
+
+ Rename output->os for consistency.
+
+
+2017-07-27 Kohei Yoshida <kohei.yoshida@gmail.com> [a71086899f25d6fa9297aaf69dd44407b7ef067d]
+
+ sheet::dump_html() to take a generic output stream.
+
+
+2017-07-27 Kohei Yoshida <kohei.yoshida@gmail.com> [0ad4a861f88e3eac1e7b48ff880fee13f25f85b0]
+
+ Remove near-duplicate code blocks.
+
+
+2017-07-27 Kohei Yoshida <kohei.yoshida@gmail.com> [c9fe0c67a4288fee6159ae7e9008a9ad0446a03a]
+
+ Initial implementation of csv dumping.
+
+
+2017-07-25 Kohei Yoshida <kohei.yoshida@gmail.com> [b8903c1672a413b301f40c92aed9082cfe86868b]
+
+ Add an entry point for csv dumping. To be implemented later.
+
+
+2017-07-25 Kohei Yoshida <kohei.yoshida@gmail.com> [1ab0b47252ceec8e0a72f98dcec9b13b4ad5170c]
+
+ Re-work the cli option parsing code to make it easier to extend...
+
+ ... w.r.t the outout format types. The new format type 'csv' is now
+ added, but not yet implemented.
+
+2017-07-25 Kohei Yoshida <kohei.yoshida@gmail.com> [593a12b8d567a9dd994b70d108e6c6845b2c3514]
+
+ fix the wording.
+
+
+2017-07-25 Kohei Yoshida <kohei.yoshida@gmail.com> [aa308d733d8a0cec63b298ad96f4d4d609eeab89]
+
+ ods: don't output debug statements unless the debug option is set.
+
+ This fixes issue #41.
+
+2017-07-25 Kohei Yoshida <kohei.yoshida@gmail.com> [609ac965561973ed8b891931aef7c26fca4f68a8]
+
+ ods: use unique_ptr for this impl member.
+
+
+2017-07-21 Kohei Yoshida <kohei.yoshida@gmail.com> [dbd330ba3e7486bd3c0bd8feae556fd31be02ae9]
+
+ interface: append_sheet to receive the index of the new sheet.
+
+ This will be used e.g. in case when the document provider initializes
+ with one sheet instead of no sheets and doesn't want to append a new
+ sheet on the first call.
+
+2017-07-18 Kohei Yoshida <kohei.yoshida@gmail.com> [4b7786a15a7cea88f37b270fff1858355b0c97ff]
+
+ Use lambda here too.
+
+
+2017-07-18 Kohei Yoshida <kohei.yoshida@gmail.com> [b036464ed168e40d1d6ef0dc7e05a8709730efe1]
+
+ This comment is no longer true.
+
+
+2017-07-18 Kohei Yoshida <kohei.yoshida@gmail.com> [ccc0bbbcfa518aea32dfbba736de85e1f222139c]
+
+ Use lambdas in lieu of the old-style function objects.
+
+
+2017-07-12 Kohei Yoshida <kohei.yoshida@gmail.com> [e6162381b3b5929366395d3af1ddf0b43c1f9837]
+
+ cmake: enable parallel build with MSVC backend.
+
+
+2017-07-12 Kohei Yoshida <kohei.yoshida@gmail.com> [99e1794c0243a6338e0855f4e22f2426165490af]
+
+ xlsx: properly handle boolean cell values.
+
+ This requires latest ixion from the master branch at the time of
+ this commit.
+
+2017-07-12 Kohei Yoshida <kohei.yoshida@gmail.com> [4a001c990889f57dec6349456894ffcb099022ec]
+
+ Slight update on the test file.
+
+
+2017-07-12 Kohei Yoshida <kohei.yoshida@gmail.com> [9791f7ae256e1aa6cc6650870f3b9a89957ef491]
+
+ Honor the debug flag for --dump-check mode as well.
+
+
+2017-07-12 Kohei Yoshida <kohei.yoshida@gmail.com> [b196b6ef7b56ea420ef1009ce77371b828035abd]
+
+ xlsx: new test file containing cells with boolean values.
+
+
+2017-07-10 Kohei Yoshida <kohei.yoshida@gmail.com> [5b631bd9fa2bdfa29fb8b56201baee034c2f2f60]
+
+ cmake: add orcus-xlsx and orcus-xls-xml.
+
+
+2017-07-07 Kohei Yoshida <kohei.yoshida@gmail.com> [791a4cd9e765098e727869f37f2384fd4b103f96]
+
+ cmake: add orcus-csv, orcus-xml, orcus-ods, and orcus-styles-ods.
+
+
+2017-07-06 Kohei Yoshida <kohei.yoshida@gmail.com> [c2a85ea45a97804183f5bead9892deca53b8f2ae]
+
+ cmake: add liborcus-spreadsheet-model.
+
+
+2017-07-06 Kohei Yoshida <kohei.yoshida@gmail.com> [7d2f26d993c5184c0a60fb716dcc46c1af12e9bf]
+
+ cmake: add orcus-yaml.
+
+
+2017-07-06 Kohei Yoshida <kohei.yoshida@gmail.com> [bb0eadb2426bb1c1dad88cfd20eb627a9780a76d]
+
+ cmake: add orcus-json.
+
+
+2017-07-06 Kohei Yoshida <kohei.yoshida@gmail.com> [acdf115882eab4664823a24f3ad269143efc1afc]
+
+ cmake: expand the TODO comment for the gnumeric filter code.
+
+
+2017-07-06 Kohei Yoshida <kohei.yoshida@gmail.com> [8b9d2caea39059ab51a56a1b7a86c1121f66d90b]
+
+ cmake: add orcus-xml-dump.
+
+
+2017-07-06 Kohei Yoshida <kohei.yoshida@gmail.com> [cd24b9f25f04d6ed91eaab541bc3fb1ccd851232]
+
+ cmake: add orcus-css-dump.
+
+
+2017-07-06 Kohei Yoshida <kohei.yoshida@gmail.com> [103af0abad2155f6513fa645551438cdbcd4c7a7]
+
+ cmake: add orcus-zip-dump.
+
+
+2017-07-06 Kohei Yoshida <kohei.yoshida@gmail.com> [d530ffd256ed62d62cf81421dd88a7c082744bbe]
+
+ cmake: add orcus-detect.
+
+
+2017-07-05 Kohei Yoshida <kohei.yoshida@gmail.com> [f79e04b7c1071dcb6518d985905c767d0669961d]
+
+ cmake: gnumeric code requires boost with zlib and gzip support.
+
+ Boost by default doesn't build with zlib and gzip support on Windows.
+ Find out a way and document it.
+
+2017-07-05 Kohei Yoshida <kohei.yoshida@gmail.com> [3095c6e9144def5584d81e47fc217d0694368aa2]
+
+ cmake: add the ods filter part to liborcus.
+
+
+2017-07-05 Kohei Yoshida <kohei.yoshida@gmail.com> [5eebd05dc8cb6e8fca69f4f34badd468d1e80d05]
+
+ Ignore C4251 and C4275 warnings on MSVC.
+
+
+2017-07-05 Kohei Yoshida <kohei.yoshida@gmail.com> [99a47ecadeabc52d39bb9a9de635cd9b738be71b]
+
+ cmake: add the xlsx and xls-xml filter parts.
+
+
+2017-07-05 Kohei Yoshida <kohei.yoshida@gmail.com> [964aba4815d20f34556c6a3e0afab892cd9b4926]
+
+ cmake: build the core part of liborcus.
+
+
+2017-07-01 Markus Mohrhard <markus.mohrhard@googlemail.com> [a6f4e233ca810f5d1d7974712c1479c47d0b2bb6]
+
+ fix crash on windows with nullptr in operator<<
+
+ E.g. http://crashreport.libreoffice.org/stats/crash_details/8962b764-6550-45c9-b08b-e99f5c968d61
+
+2017-06-30 Kohei Yoshida <kohei.yoshida@gmail.com> [9dab508d1d786fd346396050f7b431d2c2012664]
+
+ Use cmake to build liborcus-parser.
+
+ Thge other libraires will be added later.
+
+2017-06-15 Kohei Yoshida <kohei.yoshida@gmail.com> [87104e10f13dc9a9e9159babbfdf0bca5e18a809]
+
+ xls-xml: import the frozen pane information.
+
+
+2017-06-15 Kohei Yoshida <kohei.yoshida@gmail.com> [c01c28f9d105cf8d2d9befafd47ed963579e6910]
+
+ xls-xml: import the split pane information.
+
+
+2017-06-15 Kohei Yoshida <kohei.yoshida@gmail.com> [44ed3042d9d462931bb990d5035807bc65587e39]
+
+ xls-xml: re-use the resolver owned by the document.
+
+ This way the resolver type is set to the current grammar specified
+ by the client code.
+
+2017-06-14 Kohei Yoshida <kohei.yoshida@gmail.com> [3b43f2651c0a232c3b094493ebb6c4c8c08d773e]
+
+ xls-xml: import cursor selection.
+
+ TODO : range resolver is hard-coded for A1-style. I need to fix this.
+
+2017-06-14 Kohei Yoshida <kohei.yoshida@gmail.com> [f24b1d485410ee7c520975a75bf6d31244b5fadc]
+
+ xls-xml: updated test documents.
+
+ Added a new one for frozen pane import.
+
+2017-06-14 Kohei Yoshida <kohei.yoshida@gmail.com> [ffb89ec82b1fde21cf825cc0b561781f5b60bd1b]
+
+ xlsx: add tests for frozen panes.
+
+
+2017-06-13 Kohei Yoshida <kohei.yoshida@gmail.com> [277c2ca1c8c5d8d61b6da4ef10198a3896d5d058]
+
+ xlsx: add TODO for tomorrow.
+
+
+2017-06-13 Kohei Yoshida <kohei.yoshida@gmail.com> [8bb05bf47f9d142251376e739d53f4b1648d90fb]
+
+ xlsx: add tests for Sheet3 and Sheet4.
+
+
+2017-06-12 Kohei Yoshida <kohei.yoshida@gmail.com> [c9cb6a696116ada258d6e5e4ba2600358e441493]
+
+ xlsx: add test code for cursor-split-pane.xlsx test file.
+
+ Not finished yet.
+
+2017-06-12 Kohei Yoshida <kohei.yoshida@gmail.com> [dadd8e2155b9d85f2907127646deafa4611857bc]
+
+ xlsx: import the pane element data.
+
+
+2017-06-09 Kohei Yoshida <kohei.yoshida@gmail.com> [29b82ffdadfae04f1ffd4cc6171d3867a82c4d23]
+
+ Revise the interfaces for importing the split and frozen panes.
+
+ They are not implemented yet.
+
+2017-06-09 Kohei Yoshida <kohei.yoshida@gmail.com> [949ca52ad639bd306aa40e8a57477e41bfd05ad2]
+
+ xlsx: new test file for frozen panes.
+
+ Frozen panes are slightly different from split views.
+
+2017-06-09 Kohei Yoshida <kohei.yoshida@gmail.com> [f05be527bb079ec8304f003f8712d7ffae60d9f1]
+
+ xlsx: add two more sheets.
+
+
+2017-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [ae9d4001b0ceb5282e9f01d4c3e75d1a1e721022]
+
+ Clarify the expectation of what's considered a range address string.
+
+
+2017-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [63fda4ca2ea59c2ee08e8c72ef5ad3ef1fe23783]
+
+ xlsx: properly import cell cursor data.
+
+
+2017-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [2e052056c88781927422a738c29db64d0d53b3dc]
+
+ xlsx: import selected sheet setting.
+
+ Now the test passes.
+
+2017-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [9685a1b2780212eeb327303b69f372cdf9ce0a1d]
+
+ Start writing a test case for xlsx's view import.
+
+ Still WIP.
+
+2017-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [2ec5388edc8bea441a68d9a345cbe554a52cc929]
+
+ Minor optimization.
+
+
+2017-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [d6d2b1be65579ebf4d6e471c6bd798529a16322e]
+
+ Add beef to the view import.
+
+
+2017-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [73defadff0a2bbfb92d99dde089c8d94f56f298b]
+
+ Add skeleton import_sheet_view implementation.
+
+ No beef yet.
+
+2017-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [636e5c9ab52d02b77020cab3d10b623d9d1f788a]
+
+ Support optional view store in import_factory.
+
+ And use it for xlsx and xls-xml for a starter.
+
+2017-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [21471b446e471f86f72e8a47b9a91034d9778330]
+
+ Use std::unique_ptr for the pimpl pattern.
+
+
+2017-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [915e8a55aaccaf4f74c372e37a125fad803229fc]
+
+ Initial impl. for view storage. Not used yet.
+
+
+2017-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [cd295b761fd2cc29304300b83e267125358142be]
+
+ Add initial set of interfaces for view import.
+
+
+2017-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [1fece02a5f68faaf101b51e8127eecbe07dd0e85]
+
+ Add another sheet for range cursor in split sheet view.
+
+
+2017-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [39dad0ab00a24baf9327bbe6a1834468a30e4e02]
+
+ Add new sheet for range selection.
+
+
+2017-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [ef1886b9a5c1dc8d7ec277e84055ff709d11b114]
+
+ Add another sheet for range selection.
+
+
+2017-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [6f493173e1143a86327a0b93df3bf57a534836d8]
+
+ Add a script to unpack and beautify all zipped XML files.
+
+
+2017-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [a6d9a2bb0b85babcabf237d9ebcd33bb07fd9d4d]
+
+ Add skeleton interface for importing sheet view data.
+
+ Nothing is implemented yet.
+
+2017-06-08 Markus Mohrhard <markus.mohrhard@googlemail.com> [21f82eface013cb34430ffa20f5462c8e44f36a3]
+
+ we no longer need the old API
+
+
+2017-06-08 Markus Mohrhard <markus.mohrhard@googlemail.com> [da91fda87295c6b76ebe62f6688fb7434c42696b]
+
+ update boost.m4
+
+
+2017-04-26 Kohei Yoshida <kohei.yoshida@gmail.com> [0fb8477aaa04de95f2afa51095463dcffc03c21d]
+
+ Add new test files to import some of the view settings.
+
+ As a starter we're gonna handle cursor positions.
+
+2017-03-31 Kohei Yoshida <kohei.yoshida@gmail.com> [8434ea465f85492e6a412570860622e2d69b7f31]
+
+ json: I guess this code path should never hit (in theory).
+
+
+2017-03-29 Kohei Yoshida <kohei.yoshida@gmail.com> [5d958ef330cc65829ef04f55249700543df8c1e8]
+
+ json: support object assignment and a bit of cleanup.
+
+
+2017-03-29 Kohei Yoshida <kohei.yoshida@gmail.com> [58fdcb687939d499d0edb9faaac87c6eb8ee40d9]
+
+ json: perhaps this is a hair bit better than using int...
+
+
+2017-03-29 Kohei Yoshida <kohei.yoshida@gmail.com> [1a52c4afc59d82629f2d18c561a8f4eac2a4a319]
+
+ json: support assignments of true, false, and nullptr.
+
+ Also, direct assignment should work now.
+
+2017-03-29 Kohei Yoshida <kohei.yoshida@gmail.com> [cc64fa2993fa12722d61e1d2a6f9f9f6071eb455]
+
+ json: json_value_ov_placeholder is no longer necessary.
+
+
+2017-03-29 Kohei Yoshida <kohei.yoshida@gmail.com> [6c445f78ec9dc6b0ed158077c2cf01c56f7d6756]
+
+ json: rename value to store.
+
+
+2017-03-29 Kohei Yoshida <kohei.yoshida@gmail.com> [9b978d31f3264505f9d18bc47ac1564056680f00]
+
+ initial sweep on removing class inheritance from json_value.
+
+
+2017-03-28 Kohei Yoshida <kohei.yoshida@gmail.com> [1031afddae06cff6434b3558105af198e05d9d67]
+
+ json: it works fine now.
+
+
+2017-03-27 Kohei Yoshida <kohei.yoshida@gmail.com> [cddef5b938a75bd9b44ebc4552d9c8f60353a481]
+
+ json: assignment of initializer list.
+
+ The parent() call currently fails. Look into this.
+
+2017-03-27 Kohei Yoshida <kohei.yoshida@gmail.com> [12e5a9ce0949012923046014bb1aea724d77543e]
+
+ json: support additions of child nodes to object via [] operator.
+
+ Only for a non-existing key for now.
+
+2017-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [3b13f36bce8ce84dbe9e2045f847c35b08498569]
+
+ xlsx: new test file for autofilter import.
+
+
+2017-03-22 Kohei Yoshida <kohei.yoshida@gmail.com> [b9b5c6439f2af5d909ea289f31f2f966d86219a3]
+
+ typo
+
+
+2017-03-22 Kohei Yoshida <kohei.yoshida@gmail.com> [6651f882343da8a45a5cdabf4e2ded2ec03dcad3]
+
+ xls-xml: add a test for colored text attributes.
+
+
+2017-03-22 Kohei Yoshida <kohei.yoshida@gmail.com> [47de1ae5552e2e2f9442a1a7d1fe0171294310dd]
+
+ xls-xml: add this test file to the list of standard test files.
+
+
+2017-03-22 Kohei Yoshida <kohei.yoshida@gmail.com> [0ef40173dc781830bfedeef2ae23a156a6d2ac29]
+
+ xls-xml: color attribute is a part of the string format attributes.
+
+
+2017-03-21 Kohei Yoshida <kohei.yoshida@gmail.com> [0bd5dfd20103d6d4255842dd1147598f2db30f8a]
+
+ xls-xml: pick up colors for string segments.
+
+ Still the colors aren't getting applied. Need to look into this.
+
+2017-03-20 Kohei Yoshida <kohei.yoshida@gmail.com> [c7ddc06423c7fd4927db487bd5203d9c2044db16]
+
+ xls-xml: pick up color attributes for cell formats.
+
+
+2017-03-19 Kohei Yoshida <kohei.yoshida@gmail.com> [79867b9017d44e531ebe0b8d64683d8b2c7c3335]
+
+ xls-xml: add test for bold and italic test document.
+
+
+2017-03-19 Kohei Yoshida <kohei.yoshida@gmail.com> [7b4975b6e50c67883035741ad0dd32627d1e8e8b]
+
+ xls-xml: move bold-and-italic.xml test file to add it to the list.
+
+
+2017-03-18 Kohei Yoshida <kohei.yoshida@gmail.com> [0f14985286ed380e0eca378f65202a7e2cf8904b]
+
+ xls-xml: correctly handle mixed-format text strings.
+
+
+2017-03-17 Kohei Yoshida <kohei.yoshida@gmail.com> [35bb0226773c4fba87331b517dddfefd4ba7a029]
+
+ xls-xml: some javadoc comments.
+
+
+2017-03-17 Kohei Yoshida <kohei.yoshida@gmail.com> [197715f5152a02349cf1d4cec0eda60253d91cb2]
+
+ xls-xml: prepare for storing string format segments.
+
+
+2017-03-17 Kohei Yoshida <kohei.yoshida@gmail.com> [3c3215cb1fb22271a57aff692f58306f5a49aa17]
+
+ xls-xml: explicit destructor.
+
+
+2017-03-17 Kohei Yoshida <kohei.yoshida@gmail.com> [246b3ea9aeaf414431f73424699da7c583c32b0f]
+
+ xls-xml: use child context for the Data element scope.
+
+
+2017-03-16 Kohei Yoshida <kohei.yoshida@gmail.com> [d54a2922982f7e320ed00f517ef7e521efd1cbf6]
+
+ xls-xml: pick up cell string characters recursively.
+
+ Sometimes a cell string value may not appear immediately under a <ss:Data>
+ element.
+
+2017-03-16 Kohei Yoshida <kohei.yoshida@gmail.com> [5ed0d8acdaeeefb1b84b27b97848f7c6b0d0d7b9]
+
+ xls-xml: add missing tokens and re-generate token values.
+
+
+2017-03-16 Kohei Yoshida <kohei.yoshida@gmail.com> [18baca18765de4d86111f71f57443d1de5aff634]
+
+ xls-xml: use intern() correctly.
+
+
+2017-03-16 Kohei Yoshida <kohei.yoshida@gmail.com> [487a99052672cf28fe0c54404c8a1fb3cd3b13a2]
+
+ xls-xml: apply cell formats to cells for real.
+
+
+2017-03-16 Kohei Yoshida <kohei.yoshida@gmail.com> [b935d08734d56515bee25faa011141624067e43d]
+
+ xls-xml: build a map of style ID strings to numeric xf ID's.
+
+
+2017-03-16 Kohei Yoshida <kohei.yoshida@gmail.com> [1d3e4bcbc33ff9568bd1ee4f5a30ee084e5993c2]
+
+ Let's not forget this structural check.
+
+
+2017-03-15 Kohei Yoshida <kohei.yoshida@gmail.com> [24bc41aa5165128502d84a64d9dd59c7e4d1da1f]
+
+ xls-xml: pick up bold and italic flags in Styles.
+
+
+2017-03-03 Kohei Yoshida <kohei.yoshida@gmail.com> [5fcd660fd7f89533c9558c0261062fa4ce71d244]
+
+ Remove deprecated method interface.
+
+
+2017-03-03 Kohei Yoshida <kohei.yoshida@gmail.com> [0c73285fbb8a407c4bf51562a18b8b364e42f5a3]
+
+ xls-xml: test files for some formatted text strings.
+
+
+2017-03-02 Kohei Yoshida <kohei.yoshida@gmail.com> [678eb01868f0f1953321bc88b0035dbda0099e04]
+
+ xls-xml: test file for autofilter import.
+
+
+2017-03-01 Kohei Yoshida <kohei.yoshida@gmail.com> [aa1fe204ecc88903aef81f79db585a0d9f0d8dae]
+
+ Test file to quickly test flat output with utf-8 strings.
+
+ The second column's right border is not aligned at all.
+
+2017-02-28 Kohei Yoshida <kohei.yoshida@gmail.com> [436d9e1d1374e2eb2137b2d267f18131d9c47b6e]
+
+ Update the changelog.
+
+
+2017-02-28 Kohei Yoshida <kohei.yoshida@gmail.com> [09b8c9b786dc86229d3c49b2fa7518e51e6c9f51]
+
+ Get the test to pass.
+
+
+2017-02-28 Kohei Yoshida <kohei.yoshida@gmail.com> [321c2e1c61fa5cb2aa793d4d31f8a764658ac521]
+
+ Support single-quoted attribute values.
+
+
+2017-02-28 Kohei Yoshida <kohei.yoshida@gmail.com> [09ca1954a700aa4c25aad3f820af3c8a2a3be28c]
+
+ Test XML file for single-quoted attribute values.
+
+
+2017-02-27 Kohei Yoshida <kohei.yoshida@gmail.com> [09ad997a1fdcd9fc79017d5226fd27d5524dabf0]
+
+ More C++11-ness.
+
+
+2017-02-27 Kohei Yoshida <kohei.yoshida@gmail.com> [7a8fb8865fae90e7c38378f7090d81e7b16ea41e]
+
+ Use C++11 features.
+
+
+2017-02-27 Kohei Yoshida <kohei.yoshida@gmail.com> [7a29fcf0b8f40486d5fde146db0b27ab9c5cc443]
+
+ Add the recent bug fix.
+
+
+2017-02-27 Kohei Yoshida <kohei.yoshida@gmail.com> [63cbde920fd309f13142bced6d2bf2c9c11b73eb]
+
+ Don't forget to intern transient strings.
+
+
+2017-02-27 Kohei Yoshida <kohei.yoshida@gmail.com> [2fe6be4978d7c16b4ddc06702b7962ee5a7dc465]
+
+ Make sure the row size gets incremented even with empty first column.
+
+
+2017-02-27 Kohei Yoshida <kohei.yoshida@gmail.com> [04a0ce6c5b9048e4d41ee1b5bf4ddf6fc401ae93]
+
+ Simplify test to make it a bare minimum.
+
+
+2017-02-27 Kohei Yoshida <kohei.yoshida@gmail.com> [786534848ac9dea02cf3baf41a48511e901c7ae5]
+
+ Casing was wrong.
+
+
+2017-02-26 Kohei Yoshida <kohei.yoshida@gmail.com> [6aac40af3cb2d4147e5c268d89e0aa6ffcf74cc2]
+
+ Test file for debugging.
+
+
+2017-02-20 Kohei Yoshida <kohei.yoshida@gmail.com> [5e408b16932d500493f398e28682b32d2c473736]
+
+ json: not meant to be a publicly accessible method.
+
+
+2017-02-20 Kohei Yoshida <kohei.yoshida@gmail.com> [69837e4fdba941bdde50953346f650f7002825de]
+
+ json: javadoc comment.
+
+
+2017-02-20 Kohei Yoshida <kohei.yoshida@gmail.com> [01a785359fdba3f8a7202d3f7ac2827f44cbabe0]
+
+ json: tuck the init namespace inside detail.
+
+ To show that it's an implementation detail.
+
+2017-02-20 Kohei Yoshida <kohei.yoshida@gmail.com> [efd19c6add6a36badc3767cdff8729985cfea6bd]
+
+ json: allow explicit object root initialization.
+
+
+2017-02-20 Kohei Yoshida <kohei.yoshida@gmail.com> [ab98f8bf78be9f77f343db6b93cba986595ca9ec]
+
+ json: test assignment of non-const node to const one.
+
+
+2017-02-20 Kohei Yoshida <kohei.yoshida@gmail.com> [69c0d5eadc4eb0c4261a29fd39f398940210a496]
+
+ json: have const_node and node to separate mutable vs immutable nodes.
+
+
+2017-02-19 Kohei Yoshida <kohei.yoshida@gmail.com> [013005a70430d03485c226a01399a748ac4d416f]
+
+ json: support tree initialization with explicit empty array.
+
+
+2017-02-18 Kohei Yoshida <kohei.yoshida@gmail.com> [4698f1a8323769f80901634024bbc4392e437ca5]
+
+ json: update the method docs.
+
+
+2017-02-18 Kohei Yoshida <kohei.yoshida@gmail.com> [74e29e6c3909545449b6dfdde39d2835ec3dd47c]
+
+ json: add push_back() to json node.
+
+
+2017-02-17 Kohei Yoshida <kohei.yoshida@gmail.com> [72044ebd91930df6cc2b4fa1764e477fcedfaaeb]
+
+ json: support direct assignment of json::array to document_tree.
+
+
+2017-02-16 Kohei Yoshida <kohei.yoshida@gmail.com> [0ffba879b0bb9ce083e87c11725cc983cdb35b05]
+
+ Simplify this a bit.
+
+
+2017-02-16 Kohei Yoshida <kohei.yoshida@gmail.com> [2de4e2f6522c2e2b6ce62213ef5bf9e857a78632]
+
+ Update the example code.
+
+
+2017-02-15 Kohei Yoshida <kohei.yoshida@gmail.com> [2c7ccdf9b3fa0e103d7d31bf149d675d7e842184]
+
+ json: explicit array structure declaration.
+
+
+2017-02-15 Kohei Yoshida <kohei.yoshida@gmail.com> [d07c1b9bc553ff9e4c5ee5198e026f3e763669a8]
+
+ json: test for initializing nested objects.
+
+
+2017-02-15 Kohei Yoshida <kohei.yoshida@gmail.com> [dd1f9e38b06027405f5a6c625eaa55cfd11cc438]
+
+ Attempt to fix the ci build.
+
+
+2017-02-14 Kohei Yoshida <kohei.yoshida@gmail.com> [890b08662d63c541612a4265a9ae53cd46809813]
+
+ json: extra check.
+
+
+2017-02-14 Kohei Yoshida <kohei.yoshida@gmail.com> [cded7573c17db1324ddfe79edfe084b2b323cae0]
+
+ json: let's turn this function object into a normal function.
+
+
+2017-02-14 Kohei Yoshida <kohei.yoshida@gmail.com> [7d44ba13227a28d339b2ce3a6e536bee2f34afc7]
+
+ json: support objects in braced initializer lists.
+
+
+2017-02-14 Kohei Yoshida <kohei.yoshida@gmail.com> [69dfc43e3153d2ab124b8d291558a6292183326b]
+
+ json: refactor it a bit to prepare for object node creation.
+
+
+2017-02-14 Kohei Yoshida <kohei.yoshida@gmail.com> [5d5d11e9db1db44dd9db258ec3f7c3af974f6786]
+
+ json: support nested array values in braced initializer lists.
+
+
+2017-02-13 Kohei Yoshida <kohei.yoshida@gmail.com> [bdcde4f8bf31519a0c32c71653725e442122dd6e]
+
+ json: make it truly non-copyable.
+
+
+2017-02-13 Kohei Yoshida <kohei.yoshida@gmail.com> [6d88a5fa2c081f92ff11d0ac72b9f4ad5f32a94c]
+
+ json: initial work on supporting braced initializer lists.
+
+
+2017-02-13 Kohei Yoshida <kohei.yoshida@gmail.com> [f63569bf6130814a3b6f5a6f93f206d05fb4bd7e]
+
+ json: json_document_tree -> json::document_tree
+
+
+2017-02-13 Kohei Yoshida <kohei.yoshida@gmail.com> [e291e54253cb7ce0f11d66a641d5f92d4b583c06]
+
+ json: json_document_error -> json::document_error.
+
+
+2017-02-13 Kohei Yoshida <kohei.yoshida@gmail.com> [f493c1653264c5ba674532f58e33b90166b0cec5]
+
+ json: remove the detail namespace.
+
+
+2017-02-10 Kohei Yoshida <kohei.yoshida@gmail.com> [26ff3f5301ad00290a5f73ce0080b8d02f87fc5e]
+
+ Update.
+
+
+2017-02-10 Kohei Yoshida <kohei.yoshida@gmail.com> [9029483610d2d9b907db7884f1ea6e5ad8df97db]
+
+ xls-xml: add sheet-local named expression import to the test.
+
+
+2017-02-10 Kohei Yoshida <kohei.yoshida@gmail.com> [912a0bd4520aeab1cc5ef311c5b927b5f29a32a9]
+
+ xls-xml: pass the sheet-local named expressions to the model.
+
+
+2017-02-10 Kohei Yoshida <kohei.yoshida@gmail.com> [8977f24d9d8eaf2364cf470fb2d5494a82543f27]
+
+ xls-xml: pick up sheet-local named expressions during parsing.
+
+ They are not committed to the model just yet.
+
+2017-02-09 Kohei Yoshida <kohei.yoshida@gmail.com> [8d919424d26cdf3d7b5ada8b0f9e220c4b225003]
+
+ xls-xml: add test for global named expression import.
+
+
+2017-02-09 Kohei Yoshida <kohei.yoshida@gmail.com> [45be7c80e05e63e21a977bd29ab97c04ef084a1b]
+
+ xls-xml: import global named expressions.
+
+
+2017-02-09 Kohei Yoshida <kohei.yoshida@gmail.com> [d1187b04f78c51e1c96125a2345a5d801fa07454]
+
+ Get the sheet-local named expressions to finally import for real.
+
+
+2017-02-08 Kohei Yoshida <kohei.yoshida@gmail.com> [4f36977502c1f7c2653909520e423612aa6b7123]
+
+ Create an import sheet wrapper interface for the sheet class.
+
+ To separate the import interface from the actual sheet class. We'll
+ slowly refactor the rest of the import interface out of the sheet
+ class.
+
+2017-02-07 Kohei Yoshida <kohei.yoshida@gmail.com> [bdd007b2e1242094037468ff14c644fae4432832]
+
+ xlsx: pick up sheet-local defined names.
+
+ They are not pushed to the document just yet.
+
+2017-02-07 Kohei Yoshida <kohei.yoshida@gmail.com> [46c6820ea48124733d625e34a6df28aafe45563b]
+
+ Add test files for sheet-local named expressions.
+
+
+2017-02-07 Kohei Yoshida <kohei.yoshida@gmail.com> [791cd9a9ee27005681da8c250faa77fbb459c0be]
+
+ xlsx: get the import of global named expression to finally work.
+
+
+2017-02-07 Kohei Yoshida <kohei.yoshida@gmail.com> [b3cb8fe540668d9fe7165a6d66045201c057b56b]
+
+ xlsx: use lambda to simplify code a bit.
+
+
+2017-02-06 Kohei Yoshida <kohei.yoshida@gmail.com> [6deafd6aeaf4de69a3e4215601419c83bd8b8f1a]
+
+ xlsx: implement the interface for named expression import.
+
+ Only to realize that we need to defer this until the end of the
+ import because no sheets have been created yet.
+
+2017-02-06 Kohei Yoshida <kohei.yoshida@gmail.com> [f97e5847e5f845015ea68cef81b826a206f5a85a]
+
+ xlsx: pick up global named expressions.
+
+
+2017-02-03 Kohei Yoshida <kohei.yoshida@gmail.com> [f24e9f5792dc91dd1acef5084cfd4b64bd184018]
+
+ ixion-0.13 is required now.
+
+
+2017-01-19 Kohei Yoshida <kohei.yoshida@gmail.com> [66a4b33cba7d1a759226f3560f59a69cbb3912e6]
+
+ xlsx: pick up the anchoring positions of drawing objects.
+
+ And dump them to stdout for now.
+
+2017-01-19 Kohei Yoshida <kohei.yoshida@gmail.com> [39f6eb5fbcc3eaca046d4e457da1d2d6b384d2bc]
+
+ xlsx: initial setup for parsing drawing parts.
+
+
+2017-01-19 Kohei Yoshida <kohei.yoshida@gmail.com> [2d12b32bfe68948dd07c2dc7da8122dd1de7c9c8]
+
+ xlsx: add missing relationship type for drawing.
+
+
+2017-01-19 Kohei Yoshida <kohei.yoshida@gmail.com> [8d4d7f2ca036fee3aa75d5bda88e582cb3c88095]
+
+ Add content type for image/png.
+
+
+2017-01-19 Kohei Yoshida <kohei.yoshida@gmail.com> [9690c72dc9de8a1e99e77f9d71213f5f81f0e338]
+
+ opc: split out unknown content type warning only when debug is on.
+
+
+2017-01-13 Kohei Yoshida <kohei.yoshida@gmail.com> [56ad5c85d35fbe4cd6f0cf795b95d3e0a2e8ca61]
+
+ Add new interface for importing named expressions.
+
+
+2017-01-11 Markus Mohrhard <markus.mohrhard@googlemail.com> [4fcf7cc97f17aa692f4ae54b228064c5dcbac2ce]
+
+ print error message if we catch an exception
+
+
+2017-01-11 Markus Mohrhard <markus.mohrhard@googlemail.com> [2a074c647619ed8ec1cb7f3869bd8a55124ac166]
+
+ throw an excecption if the odf styles file is invalid instead of assert
+
+
+2017-01-11 Markus Mohrhard <markus.mohrhard@googlemail.com> [db8842edd0f6847a3d354809e83692f61d762f8d]
+
+ throw exception when the xml stream is invalid
+
+
+2017-01-11 Markus Mohrhard <markus.mohrhard@googlemail.com> [dc9365eb070b5120d8b9ac688d25bff28e64dc99]
+
+ add app for fuzzing the odf styles import
+
+
+2017-01-10 Kohei Yoshida <kohei.yoshida@gmail.com> [1fa13be048b02f7cacd3482a3ea0462060e8800c]
+
+ yaml: handle key value that begins with '-'.
+
+ A sequence requires a ' ' to be present after the '-'.
+
+2017-01-06 Kohei Yoshida <kohei.yoshida@gmail.com> [e4d466ec1d7d42a3c0fbe5068f5aa99e3b241f19]
+
+ yaml: correctly handle invalid sequence.
+
+
+2017-01-06 Kohei Yoshida <kohei.yoshida@gmail.com> [b03d389cb39ef17454a32a7f1375a0d6796822fa]
+
+ yaml: tuck these enum classes under 'detail' namespace.
+
+ Since they are technically implementation details.
+
+2017-01-06 Kohei Yoshida <kohei.yoshida@gmail.com> [378c000c691eba3be5ec7aacf147134f54ebe0eb]
+
+ yaml: handle sequence with two empty elements.
+
+
+2017-01-06 Kohei Yoshida <kohei.yoshida@gmail.com> [ce21551d54c2705c8c400f59384c3815a6efe425]
+
+ yaml: handle sequence with one empty element.
+
+
+2017-01-06 Kohei Yoshida <kohei.yoshida@gmail.com> [573e00d0add795d2fff52924206890a0254ec204]
+
+ yaml: simplify loading of test files.
+
+
+2017-01-06 Kohei Yoshida <kohei.yoshida@gmail.com> [d0efb98b6a07008f997b76429a6674cf87acf7bf]
+
+ yaml: handle map with empty values correctly.
+
+ When a value is not explicitly given, a null value is assumed.
+
+2017-01-05 Kohei Yoshida <kohei.yoshida@gmail.com> [b3c34ebb74d1e9889334f9d3c5ebfa6cb03018d0]
+
+ yaml: add test case to automate parsing of all invalid files.
+
+ And make sure we get yaml::parse_error exception as expected.
+
+2017-01-05 Kohei Yoshida <kohei.yoshida@gmail.com> [1c0d381af238523e64dc3569fd9814ecfc628083]
+
+ yaml: properly handle invalid yaml file 2.
+
+
+2017-01-04 Kohei Yoshida <kohei.yoshida@gmail.com> [d12a21bfde0ba00a729e60f75811d2339a2dedab]
+
+ yaml: another invalid yaml test file.
+
+
+2017-01-04 Kohei Yoshida <kohei.yoshida@gmail.com> [fafaadf90c7a18d137a29301506a05615d678886]
+
+ yaml: handle invalid indentation on first node.
+
+
+2017-01-03 Kohei Yoshida <kohei.yoshida@gmail.com> [c51f467faf1834be2bbee446097b767ef3239014]
+
+ xls-xml: do convert date-time value to fractional days since epoch.
+
+ So that we can test this in our test code.
+
+2017-01-03 Kohei Yoshida <kohei.yoshida@gmail.com> [7fc92a35c4feb956bbefca57f527e418c5680500]
+
+ xlsx: add test case to ensure correct imports of date-time values.
+
+
+2017-01-03 Kohei Yoshida <kohei.yoshida@gmail.com> [74926871e44b7ac11537ccc4f3ddcfc4d1d7f38b]
+
+ Add new test files for importing named expressions.
+
+
+2017-01-03 Kohei Yoshida <kohei.yoshida@gmail.com> [f2609828b61f5ee14a46db53fa62d12ed2fcf1e7]
+
+ Add new test files for date-time value imports.
+
+ For xlsx and xls-xml.
+
+2017-01-03 Kohei Yoshida <kohei.yoshida@gmail.com> [362181569a6ccbbfb47aeae11a32219a22746334]
+
+ Catch XML parse error and output the details of the error.
+
+
+2017-01-03 Kohei Yoshida <kohei.yoshida@gmail.com> [74f570d65b555b984ad5b768e907e9120435325b]
+
+ This was added by mistake.
+
+
+2017-01-03 Kohei Yoshida <kohei.yoshida@gmail.com> [8be5e62519e3f51133cbc377ddb3911e601579e0]
+
+ Test to make sure we are picking up merged cell ranges correctly.
+
+
+2017-01-03 Kohei Yoshida <kohei.yoshida@gmail.com> [8bacfd6549e16e7ea1db1cca8aeae3a4968fc68f]
+
+ Add this file to the test-file list.
+
+
+2017-01-03 Kohei Yoshida <kohei.yoshida@gmail.com> [55188fa0557ab4b51bd429619c457e40341b850c]
+
+ Pick up merged cell ranges, and skip columns as appropriate.
+
+
+2017-01-03 Kohei Yoshida <kohei.yoshida@gmail.com> [1e25a5a6a1aba0588a00979222bd22ca9643b6a3]
+
+ yaml: offset is off by one.
+
+
+2017-01-03 Kohei Yoshida <kohei.yoshida@gmail.com> [df854c7431974362cf0702ef6f9725d2db234995]
+
+ yaml: try to pass correct offset while parsing the line 2nd time.
+
+
+2017-01-03 Kohei Yoshida <kohei.yoshida@gmail.com> [300794ee7f80ddcf302686dc73afd3a02c61bbc9]
+
+ yaml: first of invalid yaml files. More to come.
+
+ We should add a test code that will pick all yaml files in this
+ 'invalids' directory, parse them all and make sure we don't crash
+ and exit gracefully.
+
+2017-01-03 Kohei Yoshida <kohei.yoshida@gmail.com> [61fb9a6a61028f65d124f2cc1a7c440321d7a028]
+
+ yaml: pass stream offset to the exception.
+
+ To allow generating more useful error message when parsing fails.
+ But due to the way the yaml parser works, the current offset position
+ stored in the parser_base does not represent the actual position of
+ error. We need to rework this to pass the correct offset position.
+
+2017-01-04 Markus Mohrhard <markus.mohrhard@googlemail.com> [98414a3569d1fb0807761dfd3c667de9a5316682]
+
+ catch all exceptions before the end of main
+
+
+2017-01-02 Markus Mohrhard <markus.mohrhard@googlemail.com> [f022bbbd52f8bdfa744a7b97fae1f125a6d3d563]
+
+ prevent accessing out of bounds memory
+
+
+2016-12-31 Markus Mohrhard <markus.mohrhard@googlemail.com> [2ab3f6003c35fde26c55600b7d99fa0c0f4478f8]
+
+ add documents from the fuzzer for json
+
+
+2016-12-31 Markus Mohrhard <markus.mohrhard@googlemail.com> [ea51673da4fffa995e334cf012bd972e7b93df33]
+
+ don't try to add the same key twice to the map
+
+
+2016-12-31 Markus Mohrhard <markus.mohrhard@googlemail.com> [c7e6a32aab315d6e984b4d33a53be86019736a1c]
+
+ bail out when we know that the stream is broken
+
+ Otherwise we would call next() at the beginning of the next iteration
+ which would move the pointer past the end of the string.
+
+2016-12-23 Markus Mohrhard <markus.mohrhard@googlemail.com> [91a31b5b1a11e2e184a59ae3aea56a06f27dc1a1]
+
+ start to collect documents found by the fuzzer and caused crashes
+
+
+2016-12-23 Markus Mohrhard <markus.mohrhard@googlemail.com> [bab04c19555feb7a80198f0edbb89f8379e881c3]
+
+ this code can only be reached with has_char ()== false
+
+ We should not operate on the stream anymore as soon as we hit the
+ has_char() == false case. It signals the end of the stream.
+
+2016-12-23 Markus Mohrhard <markus.mohrhard@googlemail.com> [f50b0dba46a086203a2747250dd53bed72778ebc]
+
+ if the offset points at a new line char we need the old row
+
+
+2016-12-23 Markus Mohrhard <markus.mohrhard@googlemail.com> [fa25b534a6c0b6c6ad345b68ab43e28be1dd0054]
+
+ avoid reading past the end of stream if stream ends with delimiter
+
+ an example would be something like "1, 2,"
+ The same could also happen if skipping blanks is enabled with a stream
+ like "1, 2, "
+
+2016-12-23 Markus Mohrhard <markus.mohrhard@googlemail.com> [7d522bf56bb47ba1d3901e594da19622cccac743]
+
+ add assert to find when we run past the array
+
+
+2016-12-23 Markus Mohrhard <markus.mohrhard@googlemail.com> [23ed3de011df402655cdd5281c8f59aaad9539d8]
+
+ fix the ORCUS_DEBUG_CSV build
+
+
+2016-12-23 Markus Mohrhard <markus.mohrhard@googlemail.com> [95b06f91d08b827080f472aefab4399a085feda2]
+
+ fix previous commit
+
+
+2016-12-23 Markus Mohrhard <markus.mohrhard@googlemail.com> [43805da3c4168ff24b0e6b82041fbe58dc8b4e6d]
+
+ throw an exception instead of asserting on invalid input
+
+ This was found by afl.
+
+2016-12-15 Kohei Yoshida <kohei.yoshida@gmail.com> [136b2732d47818cd1ec24162f22629ad1739c07b]
+
+ Add test case for importing merged cell ranges.
+
+
+2016-12-15 Kohei Yoshida <kohei.yoshida@gmail.com> [ead3ea063e6aefb02bc30861f35b74bb6d5d1f67]
+
+ Suppress warnings unless debug flag is turned on.
+
+
+2016-12-15 Kohei Yoshida <kohei.yoshida@gmail.com> [66a79b077ed1db5bdc98b27e0d7e93a730f74772]
+
+ Add a new interface for resolving references.
+
+ And add an implementation that uses ixion's name resolver for orcus'
+ own spreadsheet model implementation. For now, this is used only
+ for resolving merged cell ranges.
+
+2016-12-14 Kohei Yoshida <kohei.yoshida@gmail.com> [75225dce1892279afb4a6c69f24053a371675492]
+
+ Add a new test file with merged cells for xls-xml.
+
+ It has the same content as the xlsx counterpart.
+
+2016-12-14 Kohei Yoshida <kohei.yoshida@gmail.com> [d78c2f32504a7a310d0fcb3a3ae7874a92f64505]
+
+ Add a new test file for importing merged cells.
+
+
+2016-12-14 Kohei Yoshida <kohei.yoshida@gmail.com> [293cc3ffe87fde91fbcf464c4cb93d4c9bd0c8f0]
+
+ Update CHANGELOG.
+
+
+2016-12-14 Kohei Yoshida <kohei.yoshida@gmail.com> [12560dce49d1c0b72ac87264a1cb97f96be46d08]
+
+ Modernize this a bit.
+
+
+2016-12-14 Kohei Yoshida <kohei.yoshida@gmail.com> [006d388528438fa87d598be0e3a8793d50a7b2b9]
+
+ Add the empty-rows test file to the list for testing.
+
+
+2016-12-14 Kohei Yoshida <kohei.yoshida@gmail.com> [1110e0a5d7212e2f93b5b6a27a2e292f63b57dde]
+
+ Pick up formula cells from Excel XML.
+
+ Initial attempt. Needs more testing.
+
+2016-12-13 Kohei Yoshida <kohei.yoshida@gmail.com> [ed67b31898c628052300402c40fbdf34f0b01ace]
+
+ Add a new test file for Excel XML 2003.
+
+
+2016-12-13 Kohei Yoshida <kohei.yoshida@gmail.com> [de95066a32af79913f54736d5beafea75e430cc4]
+
+ Add test for error-values.xlsx and fix the bug it had uncovered.
+
+
+2016-12-12 Kohei Yoshida <kohei.yoshida@gmail.com> [404b0c0ced25f1e9c38a81a0bf34b6a2ff75c2d6]
+
+ Use forward declaration of std::ostream.
+
+
+2016-12-12 Kohei Yoshida <kohei.yoshida@gmail.com> [b207c87bccda578165d83f1ddf6d29f497611502]
+
+ Implement and pick up error values in pivot cache's shared items.
+
+
+2016-12-07 Kohei Yoshida <kohei.yoshida@gmail.com> [a30063119ba5c32cbc2cb0bcad3fe089834d5532]
+
+ Add a test test xlsx file with pivot table with error values.
+
+
+2016-12-07 Kohei Yoshida <kohei.yoshida@gmail.com> [014921a907c87ee18c921717e573a10a4716d8b2]
+
+ Add more test on pivot cache records.
+
+
+2016-12-06 Kohei Yoshida <kohei.yoshida@gmail.com> [6e7d02b50d26b257fc9c2948c1110086e9189186]
+
+ Extra blank line.
+
+
+2016-12-06 Kohei Yoshida <kohei.yoshida@gmail.com> [aeff7302828681771c6600dee7def40a047f09e8]
+
+ Rename datetime to date_time, to be consistent.
+
+
+2016-12-06 Kohei Yoshida <kohei.yoshida@gmail.com> [77ddd653d28a40945fc468a1e57d4ed251bd6a3c]
+
+ Add tests for pivot cache records.
+
+
+2016-12-05 Kohei Yoshida <kohei.yoshida@gmail.com> [5d4d9b9c40fdd2b912dfdeb6dda2d031df1a4a0d]
+
+ Import pivot cache records for real.
+
+ I still need to add tests for this.
+
+2016-12-02 Kohei Yoshida <kohei.yoshida@gmail.com> [db76e54622c2fc087fa802206f4afa91a8e4ee50]
+
+ Implement create_pivot_cache_records().
+
+
+2016-11-28 Kohei Yoshida <kohei.yoshida@gmail.com> [87b5078fcc9c399fe9a8a8c431f12ffde42436e2]
+
+ This will be stored inside the field structure.
+
+
+2016-11-28 Kohei Yoshida <kohei.yoshida@gmail.com> [44a30d875ff8277ba862efcac97ff39878dc3669]
+
+ Rename string to character, to be consistent with pivot_cache_record_value_t.
+
+
+2016-11-28 Kohei Yoshida <kohei.yoshida@gmail.com> [466f0755d99bfc5a6c4409c6b7ff4b2aef4c587b]
+
+ Rename datetime to date_time.
+
+
+2016-11-28 Kohei Yoshida <kohei.yoshida@gmail.com> [29ae32ba1bbfd814e5aab0de03eb69b50d608871]
+
+ New structure to store pivot cache record values.
+
+
+2016-11-23 Kohei Yoshida <kohei.yoshida@gmail.com> [f958047fbd59000d3219571070db9ffd97549610]
+
+ Pass the import interface instance to the pivot cache records handler.
+
+ Still no concrete implementation yet, so nothing happens.
+
+2016-11-23 Kohei Yoshida <kohei.yoshida@gmail.com> [9da789d10a898b1f08f40b62509b86899083d5e6]
+
+ Pass the pivot cache ID's to read_pivot_cache_rec().
+
+
+2016-11-22 Kohei Yoshida <kohei.yoshida@gmail.com> [426f8fd428093e1b91cbc8cd020d11cc1c8a5546]
+
+ Make opc_rel_extras_t moveable.
+
+
+2016-11-22 Kohei Yoshida <kohei.yoshida@gmail.com> [8335b96e8d1b44a735450a75c3e8894f449e475c]
+
+ Use std::unique_ptr in opc_rel_extras_t::map_type.
+
+
+2016-11-21 Kohei Yoshida <kohei.yoshida@gmail.com> [1d00aaa8c8d1d9ea33debc4d9189b0d7915f9775]
+
+ Separate the pivot interface implementation classes into own files.
+
+
+2016-11-21 Kohei Yoshida <kohei.yoshida@gmail.com> [f7c2a91a415623b2c441a8919c53c719f04f8a33]
+
+ Use date_time instead of datetime, to be more consistent.
+
+
+2016-11-21 Kohei Yoshida <kohei.yoshida@gmail.com> [78e8f9f41dcea809bfaad8d38a307933a279d910]
+
+ Add more interface methods to begin with.
+
+ More will be added later.
+
+2016-11-18 Kohei Yoshida <kohei.yoshida@gmail.com> [fa741fa7137116b9598c3e0b3df13c63297c57d4]
+
+ Start defining the interface for importing pivot cache records.
+
+
+2016-11-16 Kohei Yoshida <kohei.yoshida@gmail.com> [b9e137c10c34ff33beb4ec6283f6e0af5f99bbe5]
+
+ Add documentation to the rest of the interface methods.
+
+
+2016-11-15 Kohei Yoshida <kohei.yoshida@gmail.com> [5c327a1b5bff32f27e42a557594fefea2007d0e8]
+
+ Rename range group field setters to start with set_range_...
+
+ In order to make it clear that they are for range group fields.
+
+ Also add some method documentation.
+
+2016-11-15 Kohei Yoshida <kohei.yoshida@gmail.com> [6aae717f0624c5924a4b0c97417e6daa48e65070]
+
+ Up the API version and set the version to 0.12.99.
+
+
+2016-11-14 Kohei Yoshida <kohei.yoshida@gmail.com> [616e16e50615c2cca367987e087331731fbb51a6]
+
+ Supress more debug outputs in non-debug mode.
+
+ Still quite a bit more to go.
+
+2016-11-11 Kohei Yoshida <kohei.yoshida@gmail.com> [73c161e80d262add07d9db971e66f771505df39d]
+
+ Typo.
+
+
+2016-11-11 Kohei Yoshida <kohei.yoshida@gmail.com> [79b80e6ae544ca10aba845b9a9ee99a3cb170194]
+
+ Add the rest of the test.
+
+
+2016-11-09 Kohei Yoshida <kohei.yoshida@gmail.com> [4f824f15f8949c3e93b0469278f6f8cb4a39e8fd]
+
+ More on testing.
+
+
+2016-11-09 Kohei Yoshida <kohei.yoshida@gmail.com> [7c2351d70286cf7ecaf5a61e413d9697494c1de5]
+
+ Just call it set_interval().
+
+ Since the class name contains the term "group" already.
+
+2016-11-09 Kohei Yoshida <kohei.yoshida@gmail.com> [73e12de573bd07c5406d9cd4370b80ddf68b5d9d]
+
+ Pick up the start and end dates from rangePr, and test their values.
+
+
+2016-11-07 Kohei Yoshida <kohei.yoshida@gmail.com> [39da5febea93c27466b124fa9ff6cf2b7391dc76]
+
+ max/min datetime to date.
+
+
+2016-11-05 Kohei Yoshida <kohei.yoshida@gmail.com> [bdb8084a5a877c6e144ccb2e177829b2f0894ce5]
+
+ Call this to_string() for consistency.
+
+
+2016-11-04 Kohei Yoshida <kohei.yoshida@gmail.com> [bfad95ab030df81d4559719e1e5978bc92c559c8]
+
+ Pick up range grouping type.
+
+
+2016-11-01 Kohei Yoshida <kohei.yoshida@gmail.com> [f1e33d6bd34115fce97c139db665f42d214affe1]
+
+ Test the group items.
+
+
+2016-10-31 Kohei Yoshida <kohei.yoshida@gmail.com> [3403470ba7ca77fac24d0faa6a7830f125e59887]
+
+ Pick up date values as cache field items.
+
+
+2016-10-28 Kohei Yoshida <kohei.yoshida@gmail.com> [3afd743e84992bc8892583b2a3141d8c2ef25764]
+
+ Pick up min and max dates of a field.
+
+
+2016-10-25 Kohei Yoshida <kohei.yoshida@gmail.com> [4784901d339fb0c99917bf0385fa073fb9dca1e6]
+
+ Next target is group-by-dates.xlsx.
+
+
+2016-10-25 Kohei Yoshida <kohei.yoshida@gmail.com> [721e08b1684d5f27b03c77dcb1e83d719918605a]
+
+ Test the 2nd field. Now I'm done with this document.
+
+
+2016-10-25 Kohei Yoshida <kohei.yoshida@gmail.com> [e24c81121a11f53892839032ec8f9330cc3c64f2]
+
+ Add a commit() method to commit the field group data to the current field.
+
+ To be consistent with the rest of the orcus interface API design.
+
+2016-10-24 Kohei Yoshida <kohei.yoshida@gmail.com> [dd225ae209bc5bcbdbd8eeb26161dd0bc61e43b8]
+
+ Pass the numericn range properties and add checks for them.
+
+
+2016-10-22 Kohei Yoshida <kohei.yoshida@gmail.com> [dc2a01d63d36573f42d064875414bc10888e79fe]
+
+ Parse the grouping properties for numeric ranges.
+
+
+2016-10-21 Kohei Yoshida <kohei.yoshida@gmail.com> [beadbd4bfd24235e0eec99d81ecc57d54ede5c61]
+
+ More test code.
+
+
+2016-10-17 Kohei Yoshida <kohei.yoshida@gmail.com> [d4c65665e0b357dc1e170234bb1f3930e64d1cdd]
+
+ Add a bit of a test code for numeric grouping.
+
+ Still lots of test code to be written...
+
+2016-10-17 Kohei Yoshida <kohei.yoshida@gmail.com> [5da7642b2ef3d1dd1fbb473a1f86838793a40f97]
+
+ Have the low-level numeric parser support parsing exponents.
+
+
+2016-10-16 Kohei Yoshida <kohei.yoshida@gmail.com> [f396068a778f14677356cd1266ccf3e73f5d90a4]
+
+ Add get_pivot_cache() helper function for test code.
+
+
+2016-10-16 Kohei Yoshida <kohei.yoshida@gmail.com> [08f4dd61001350c66451e5cc41831fec426eeba6]
+
+ Rename set_field_group() to create_field_group().
+
+
+2016-10-15 Kohei Yoshida <kohei.yoshida@gmail.com> [9cff3040b0d8d68c97b42051e6e3573a21d61ae7]
+
+ Pick up group items and add a new test case.
+
+
+2016-10-15 Kohei Yoshida <kohei.yoshida@gmail.com> [02324aeaa29598c609487ffd61c2c18c093963a4]
+
+ Pick up base-to-group index linkages.
+
+
+2016-10-14 Kohei Yoshida <kohei.yoshida@gmail.com> [efb549b15b0d3fb8920e566ad33e9ed3a0d4af5f]
+
+ Getting ready to receive group field data.
+
+
+2016-10-13 Kohei Yoshida <kohei.yoshida@gmail.com> [c5c209e9fda5acdef8cbd773898f11cf6f6ebe8e]
+
+ Define the structure of a group field. Not used yet.
+
+
+2016-10-13 Kohei Yoshida <kohei.yoshida@gmail.com> [0b1544528afbd05d5364b8663c2c98c9af9783ec]
+
+ Parse group field related items. Not passed to the model yet.
+
+
+2016-10-10 Kohei Yoshida <kohei.yoshida@gmail.com> [d93e56db7432fa304b0b07102ca2f236bd2edfdd]
+
+ Add empty group field type, and rename structs for consistency.
+
+
+2016-10-10 Kohei Yoshida <kohei.yoshida@gmail.com> [266c14b2f49b501a39504dab6def235eb7e9c39a]
+
+ Check the 2nd field of cache #2. Nothing eventful.
+
+
+2016-10-09 Kohei Yoshida <kohei.yoshida@gmail.com> [4fb56e6ddfc3c97cab684685f303340c05f12b25]
+
+ Handle unused items.
+
+
+2016-10-09 Kohei Yoshida <kohei.yoshida@gmail.com> [607134465fc5110c57880f6cfbbc2c1acdbaee1b]
+
+ Import field with string and numeric type items mixed.
+
+
+2016-10-09 Kohei Yoshida <kohei.yoshida@gmail.com> [38260f4cf22e10509be36fedd4fe687224632b2c]
+
+ Test the content of the 2nd cache.
+
+
+2016-10-09 Kohei Yoshida <kohei.yoshida@gmail.com> [5d0049a3b30b9c25db896d6c231fc3193fcf5bdb]
+
+ Import min and max values.
+
+
+2016-10-07 Kohei Yoshida <kohei.yoshida@gmail.com> [9d02b357e35bc2483c061d3fea8a517cd8fd4d6c]
+
+ Check the content of field with only string items.
+
+
+2016-10-06 Kohei Yoshida <kohei.yoshida@gmail.com> [511f4173e8ccde182f7a62296a22bbc8b5eb4ec2]
+
+ Test file with pivot chart.
+
+
+2016-10-05 Kohei Yoshida <kohei.yoshida@gmail.com> [363c1cc7d63bb2c201da88e659fb2947f1294564]
+
+ Store cache field string items.
+
+
+2016-10-05 Kohei Yoshida <kohei.yoshida@gmail.com> [42a0f489e7e69dba9b55550695df10699f0073d8]
+
+ Prepare for sending field attributes.
+
+ We'll switch to set-attributes-then-commit style of interface for
+ import cache fields.
+
+2016-10-04 Kohei Yoshida <kohei.yoshida@gmail.com> [c01f923687a33cd179988dbda9dd76a63b03d273]
+
+ Apparently there is "mixed types" and "semi-mixed types".
+
+
+2016-10-04 Kohei Yoshida <kohei.yoshida@gmail.com> [69b0333c55679d732db49dabf890b4ab2f8e83e6]
+
+ Pick up and store attribute values of sharedItems locally.
+
+ They are not yet passed to the interface yet.
+
+2016-10-04 Kohei Yoshida <kohei.yoshida@gmail.com> [7defaf70babe94de0db7e5c8813a6396e671fc8f]
+
+ Add new excel file with pivot cache with mixed type fields.
+
+
+2016-10-04 Kohei Yoshida <kohei.yoshida@gmail.com> [66981f7c1b848d95dbd758605d60736211a50562]
+
+ Check the field names.
+
+
+2016-10-03 Kohei Yoshida <kohei.yoshida@gmail.com> [c2a87a68b771bcbba59bb2bba26b62fd3e20ba45]
+
+ Import pivot cache fields, but no field members yet.
+
+
+2016-09-29 Kohei Yoshida <kohei.yoshida@gmail.com> [bf5843c13e52cfe296aa524f7faf09eb67f3ffe6]
+
+ Start testing the pivot cache import.
+
+
+2016-09-29 Kohei Yoshida <kohei.yoshida@gmail.com> [1f1cef5dc87810ebfd1720c3fa851c15d6052882]
+
+ Add mapping of source range to cache ID to detect duplicate caches.
+
+
+2016-09-28 Kohei Yoshida <kohei.yoshida@gmail.com> [9035df987b1757cf3c10fa09000d97154769463c]
+
+ Introduce pivot_collection to store pivot related models.
+
+
+2016-09-27 Kohei Yoshida <kohei.yoshida@gmail.com> [4cb693c44cb4cb0bda37f6710fc01044c777cb4c]
+
+ Let's create a separate wrapper for pivot cache import.
+
+ Still WIP.
+
+2016-09-26 Kohei Yoshida <kohei.yoshida@gmail.com> [886a6d77f64854f42be3b168c8cc76c5d3c9410e]
+
+ Pass the worksheet info to the pivot interface.
+
+
+2016-09-23 Kohei Yoshida <kohei.yoshida@gmail.com> [a9083ced69137684d00868663c360ab07d08c8fd]
+
+ Create and pass a pivot cache import interface to the context.
+
+
+2016-09-23 Kohei Yoshida <kohei.yoshida@gmail.com> [1372858f2fd0b869dfd575d20056740f8f1b0f71]
+
+ Some renaming of variables to make them more representative.
+
+
+2016-09-22 Kohei Yoshida <kohei.yoshida@gmail.com> [cd60a8e5fb8b010d2c95759f25fc87de7dbc1ac8]
+
+ Use the actual rank values rather than the schema type values.
+
+ Because not all schema types are ranked.
+
+2016-09-22 Kohei Yoshida <kohei.yoshida@gmail.com> [e071b92b8cd495e9c7a613156b7ebd81e1e7ad47]
+
+ Re-order workbook's relations to get shared strings imported first,
+
+ then pivot caches seconds, before the sheets get imported.
+
+2016-09-22 Kohei Yoshida <kohei.yoshida@gmail.com> [3f23a2f92ff2f1a6bc2bc467e7bf23c07d1c4afa]
+
+ Store the pivot cache ID's to relation ID's mapping from workbook.xml.
+
+
+2016-09-22 Kohei Yoshida <kohei.yoshida@gmail.com> [ee665d086b2f043f4c7a3bfdb74f7466b875672d]
+
+ Let's use closure in lieu of a function object.
+
+
+2016-09-22 Kohei Yoshida <kohei.yoshida@gmail.com> [855c1a18fabf89ad6c878b87e23a6d2a24d306bc]
+
+ Instantiate a pivot cache instance. Still not used during the import.
+
+
+2016-09-21 Kohei Yoshida <kohei.yoshida@gmail.com> [0c3761571fa800f11dd5258845f1c8a1740347f4]
+
+ Set up a new interface for pivot cache definition import.
+
+ Still pretty much empty.
+
+2016-09-21 Kohei Yoshida <kohei.yoshida@gmail.com> [89c454860cf7bfd149c7381a697dbcfee6ce56e8]
+
+ Add several new test files with pivot table data.
+
+ Saved by Excel 2013.
+
+2016-09-21 Markus Mohrhard <markus.mohrhard@googlemail.com> [9e928d9f144d78b1302bab3d4b6d87aa1b792e65]
+
+ try to install ixion and build with spreadsheet model
+
+
+2016-09-21 Markus Mohrhard <markus.mohrhard@googlemail.com> [b58480edb261953ef576eea08fef1683f6921f87]
+
+ call make check as well
+
+ We are not using the testing stage right now because I was unable to
+ figure out how to make the testing stage use the binaries built for the
+ build stage.
+
+2016-09-21 Markus Mohrhard <markus.mohrhard@googlemail.com> [9df89a3abb079b061400c277aa7f4eedbb39e5cc]
+
+ autoconfirm the package install questions
+
+
+2016-09-20 Kohei Yoshida <kohei.yoshida@gmail.com> [c31a6614aa94b1642f3f0816c2ce7174c3c03e1a]
+
+ Parse pivot cache information stored in workbook.xml.
+
+
+2016-09-20 Kohei Yoshida <kohei.yoshida@gmail.com> [3be2fdaaa7ab278a6b3424966e0bb1bd5b20955c]
+
+ New test xlsx file for pivot table import.
+
+ It has one sheet that contains 3 pivot tables and 3 data sources.
+ Saved by Excel 2013.
+
+2016-09-20 Stephan Bergmann <sbergman@redhat.com> [05d3e608ce09a9cf34aa085de6180978a03f0f13]
+
+ Allow passed-in CXXFLAGS to override -fvisibility=hidden
+
+ e.g. needed by LibreOffice, see <https://cgit.freedesktop.org/libreoffice/core/
+ commit/?id=ee0a0b840763df64ee8940697dbea69c6cccf5e9> "external/liborcus: Let us
+ override -fvisiblity=hidden"
+
+2016-09-19 Markus Mohrhard <markus.mohrhard@googlemail.com> [1b8354f68585a0c659afb35c8d3f586de88fc702]
+
+ somehow the ci infra tries to start fresh for the tests
+
+ We disable them for now. Without the spreadsheet model they are not that
+ useful anyway.
+
+2016-09-19 Markus Mohrhard <markus.mohrhard@googlemail.com> [9fc5c84f0e5ba6266df3057c80af8279e03b7c04]
+
+ -Wtautological-compare, compare against the 'other' parameter
+
+
+2016-09-19 Markus Mohrhard <markus.mohrhard@googlemail.com> [36e1fdf8225ee6a5c6408a6dea9098f139835802]
+
+ install python3 in CI
+
+
+2016-09-19 Markus Mohrhard <markus.mohrhard@googlemail.com> [1cbe852309e1168297bc6538376755c405ae3632]
+
+ try to be more resilient with downloading packages
+
+ Conflicts:
+ .gitlab-ci.yml
+
+2016-09-19 Markus Mohrhard <markus.mohrhard@googlemail.com> [c2047db5dc7fab008983cf4100a68d728e5b8955]
+
+ try to clone mdds for orcus builds
+
+ Conflicts:
+ .gitlab-ci.yml
+
+2016-09-19 Markus Mohrhard <markus.mohrhard@googlemail.com> [5225b54537d77cdd26140fb0e7c0dcedb660a34c]
+
+ we can't use the mdds packages from the distro
+
+
+2016-09-19 Markus Mohrhard <markus.mohrhard@googlemail.com> [9d08a0b04d64eb982f558ec77c422455a267e6ea]
+
+ we need to use the old ABI for the CI builds
+
+
+2016-09-19 Markus Mohrhard <markus.mohrhard@googlemail.com> [993ecfb7dc27564522a5b406f2c680f61d76b11f]
+
+ the ubuntu documentation about mdds packaging is lacking
+
+
+2016-09-19 Markus Mohrhard <markus.mohrhard@googlemail.com> [9c4f5b7e645b577f34cb3f3c03079f9c5b096d44]
+
+ install pkg-config and mdds
+
+
+2016-09-18 Kohei Yoshida <kohei.yoshida@gmail.com> [1b89a51c097735730fe074fbc599d8b535e4cf8b]
+
+ Punctuation...
+
+
+2016-09-18 Kohei Yoshida <kohei.yoshida@gmail.com> [62430cc05bb5ce1bc3feee483efcc1f3220a25ba]
+
+ Add 0.12.1 packages to the download section.
+
+
+2016-09-18 Markus Mohrhard <markus.mohrhard@googlemail.com> [10ee7ec58fc057f123dac5a89fb3f8a7e830e30f]
+
+ fix the boost install command
+
+
+2016-09-18 Markus Mohrhard <markus.mohrhard@googlemail.com> [ef072309d13894f394f3db076bc23bf3a2ebacd4]
+
+ install all boost development packages
+
+
+2016-09-18 Kohei Yoshida <kohei.yoshida@gmail.com> [9bd4c5459c266fdefa62afb044cb0857f15d6998]
+
+ Add boost-filesystem package for CI.
+
+
+2016-09-18 Kohei Yoshida <kohei.yoshida@gmail.com> [638c70faf2f0e3c07dfa79b70d61ec08e851bc90]
+
+ Update CHANGELOG etc.
+
+
+2016-09-18 Kohei Yoshida <kohei.yoshida@gmail.com> [175d7e743e40e4e10b82d4603f06d54b80d0a584]
+
+ Remove version number from the boost dev package.
+
+
+2016-09-18 Kohei Yoshida <kohei.yoshida@gmail.com> [f4969601e79b37a1e0b63b49b75f3739a1824e35]
+
+ Install more packages for the CI.
+
+
+2016-09-18 Kohei Yoshida <kohei.yoshida@gmail.com> [8eaa932123d99bdfacd17aab692cc02809e6ab92]
+
+ Load stream as binary stream.
+
+ Apparently without this, the stream doesn't load correctly on
+ Windows.
+
+ https://gitlab.com/orcus/orcus/issues/30
+
+2016-09-17 Markus Mohrhard <markus.mohrhard@googlemail.com> [172faa0a99481d84d5bb2f3296261e29aa5e603e]
+
+ Add initial CI support
+
+
+2016-09-16 Kohei Yoshida <kohei.yoshida@gmail.com> [4a0a45f9fed05f0fd8afac1bd4b0ec8a22a7fd70]
+
+ Python's xlsx API implicitly depends on the spreadsheet model.
+
+ When --disable-spreadsheet-model is passed, we should disable Python's
+ xlsx API so that it builds fine without dependency on ixion.
+
+2016-09-08 Kohei Yoshida <kohei.yoshida@gmail.com> [7588097dc08c0692d2287d87ee425cfc61447ae6]
+
+ It's element s, not x.
+
+
+2016-09-08 Kohei Yoshida <kohei.yoshida@gmail.com> [74cfb7010a3385350d8f88d92afc8dc93751d987]
+
+ Improve the parsing of pivot table contents etc.
+
+
+2016-09-08 Kohei Yoshida <kohei.yoshida@gmail.com> [26f28ff6ea4de65337dfc1b40323b0ff1870e900]
+
+ Get the debug flag to work again.
+
+
+2016-08-21 Kohei Yoshida <kohei.yoshida@gmail.com> [78cf3467cd4ff29207d677714e52b81a2346fadc]
+
+ Add download entries to 0.12.0 packages.
+
+
+2016-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [ff4bb90adb4db0ff68e9904c21293724ae9b2356]
+
+ make distclean finally passes.
+
+
+2016-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [5ee9bfc343ec974f292d5aac197535d8f73d9977]
+
+ number-format.xml was missing.
+
+
+2016-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [341ad741c9d1467a820085b30db7413b528ed680]
+
+ Test all python tests to pass under 'make distcheck'.
+
+
+2016-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [5d7872796438baacb46e6859fc330f8d8088b2d8]
+
+ Work toward getting 'make distcheck' to pass.
+
+
+2016-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [b4422e594e60a3351be6fe377062892dd4d8cc77]
+
+ Update doc files.
+
+
+2016-08-18 Kohei Yoshida <kohei.yoshida@gmail.com> [e49518922404a11f16c10b9a832c68bd17cba9b4]
+
+ Use data() here since we don't need a null-terminated string.
+
+
+2016-08-18 Kohei Yoshida <kohei.yoshida@gmail.com> [7719f87f1ac6dcc7ca1cbff7a5b1eda28861ff0a]
+
+ Handling of encoded unicode characters may fail.
+
+
+2016-08-18 Kohei Yoshida <kohei.yoshida@gmail.com> [45d7e7a95a05bbfabe16a7750c9f0a0ed35f5174]
+
+ Extra line.
+
+
+2016-08-18 Kohei Yoshida <kohei.yoshida@gmail.com> [9b01bca0f5202ff38173aa7f5398671473d6deb8]
+
+ Revise the function documentation a bit.
+
+
+2016-08-19 Markus Mohrhard <markus.mohrhard@googlemail.com> [3bc601326e326bcc27b370a2b7b89bb02c4e34d9]
+
+ add items to CHANGELOG
+
+
+2016-08-19 Markus Mohrhard <markus.mohrhard@googlemail.com> [3b1fc92c5e54931d48fc66b57eadb4abf7721970]
+
+ cid#169010, uninitialized members
+
+
+2016-08-19 Markus Mohrhard <markus.mohrhard@googlemail.com> [8321dce1f84aaac2df8d875139540798eda5eb90]
+
+ cid#169009, missing break in switch
+
+
+2016-08-19 Markus Mohrhard <markus.mohrhard@googlemail.com> [011cb56a536f5c092c784d9cec14487701756585]
+
+ remove unnecessary member variables
+
+
+2016-08-19 Markus Mohrhard <markus.mohrhard@googlemail.com> [037e1edc9e62f439a347a2f3d4823da232ac9b03]
+
+ create less temporary objects for unicode decoding
+
+
+2016-08-18 Jaskaran Singh <jvsg1303@gmail.com> [e9fe31aa28dd5a278a60d92b1671f4ec333a6213]
+
+ Add test for decoding a unicode string
+
+
+2016-08-18 Jaskaran Singh <jvsg1303@gmail.com> [9f3de32151e29e3a1523e9ec7fcc13c9c29f2219]
+
+ Add code for character reference in sax parser and re-enable test related to it
+
+
+2016-08-18 Markus Mohrhard <markus.mohrhard@googlemail.com> [06aff1c8a9afd0c99992fb136f2ca7fce7b3af36]
+
+ add initial code for handling escaped unicode characters
+
+
+2016-07-26 Markus Mohrhard <markus.mohrhard@googlemail.com> [36e0e645bd00b5c383ed67ff1554811e10601883]
+
+ fix indentation
+
+
+2016-07-26 Markus Mohrhard <markus.mohrhard@googlemail.com> [f44c39ff0804d7d8b8bea72bb06e6968e85c09ce]
+
+ use the color attr parser instead of own function
+
+
+2016-07-26 Markus Mohrhard <markus.mohrhard@googlemail.com> [4875f8b14b48eabc42cbc4a3736805f2ed6c9cd3]
+
+ remove unnecessary underline type
+
+ solid and single_line should be the same.
+
+2016-07-25 Markus Mohrhard <markus.mohrhard@googlemail.com> [ba1a48655d32df358cb5919af3d61f0f79d41f77]
+
+ we need to intern transient strings if we store a reference to them
+
+
+2016-07-25 Markus Mohrhard <markus.mohrhard@googlemail.com> [51cffeae8d3767a7783b4af29ccb233b78c8137a]
+
+ use nullptr everywhere and remove use of NULL
+
+ The mix of NULL and nullptr became a bit confusing.
+
+2016-07-25 Markus Mohrhard <markus.mohrhard@googlemail.com> [86292ae249b7c56a926d1ae748dae953c8b0acf4]
+
+ fix a huge number of unused parameter warnings
+
+
+2016-07-25 Markus Mohrhard <markus.mohrhard@googlemail.com> [feeca2012005e942aca7c334c69562d400a04f06]
+
+ fix warning: "moving a temporary object prevents copy elision"
+
+
+2016-07-25 Markus Mohrhard <markus.mohrhard@googlemail.com> [43c7455793f8b1741eedcf62ce72351bdb9366db]
+
+ remove unnecessary variable
+
+
+2016-07-25 Markus Mohrhard <markus.mohrhard@googlemail.com> [9f951d8f9e8079e96e28cc7b9bdc9f3a04e8fdac]
+
+ let us use the full namespace prefix in the header
+
+
+2016-07-25 Markus Mohrhard <markus.mohrhard@googlemail.com> [6bf3d7537fa935ec2dbd9700c64535d90ddb7c6a]
+
+ use sorted_string_map instead of own implementation
+
+
+2016-07-25 Markus Mohrhard <markus.mohrhard@googlemail.com> [ad47a630ed2f70522c2ccb1d23ee285317e97575]
+
+ assert correct sort order for sorted_string_map in debug builds
+
+
+2016-07-25 Markus Mohrhard <markus.mohrhard@googlemail.com> [df887008f7bc74ed2d0cc5c0c38841f4a1905beb]
+
+ fix cell style odf test file
+
+
+2016-07-25 Markus Mohrhard <markus.mohrhard@googlemail.com> [8f2498e59c5716be0814bc87bb59198782a67297]
+
+ pretty-print test ods cell style file
+
+
+2016-07-25 Jaskaran Singh <jvsg1303@gmail.com> [3d412381b2274f875f957d477d20aa905a8ebd1c]
+
+ Add test for odf text alignment
+
+
+2016-07-25 Jaskaran Singh <jvsg1303@gmail.com> [5c2e75a4e3e1d4d65b3d95dcaf92a1a3ae8874a1]
+
+ Import odf vertical and horizontal alignment
+
+
+2016-07-25 Jaskaran Singh <jvsg1303@gmail.com> [d524f93c688f1fce1448803ae92a4b4bfc95747c]
+
+ Add paragraph properties parser class
+
+
+2016-07-25 Jaskaran Singh <jvsg1303@gmail.com> [c0c79b2337996868005cf7b4e7f0c4c394f85f22]
+
+ Add case for vertical alignment to the parser and related functions for it
+
+
+2016-07-25 Jaskaran Singh <jvsg1303@gmail.com> [8dc4430364c2cf9e2074c6deefafcf70b327bda0]
+
+ Add extract alignment attributes function to odf helper
+
+
+2016-07-25 Markus Mohrhard <markus.mohrhard@googlemail.com> [c833445c12406b96ddc510d64bb507d4d872a5d8]
+
+ add license header to new file
+
+
+2016-07-25 Markus Mohrhard <markus.mohrhard@googlemail.com> [931b4246b520f59bc554ac1efecec55d891859b6]
+
+ disable that test for now
+
+ Related to issue #27.
+
+2016-07-25 Markus Mohrhard <markus.mohrhard@googlemail.com> [ee292f8edcabf670a7e815183001eb1b123361cf]
+
+ small stylistic improvements
+
+
+2016-07-25 Markus Mohrhard <markus.mohrhard@googlemail.com> [171f5e415fe0e9b908266ec7e59eef33656a6728]
+
+ avoid test failure by reseting character variable in start_element
+
+
+2016-07-25 Markus Mohrhard <markus.mohrhard@googlemail.com> [0efdff8dd9f44e5c9be8968f5701752cc0230d5c]
+
+ correct handling for transient strings in odf number format import
+
+
+2016-07-25 Markus Mohrhard <markus.mohrhard@googlemail.com> [86308d001f62aed98a862fedf6877070342d7b00]
+
+ ithe entries need to be sorted
+
+
+2016-07-25 Markus Mohrhard <markus.mohrhard@googlemail.com> [f6b8b4b772938c18f8813faf5bed4ac644ea88d7]
+
+ add a few missing breaks
+
+
+2016-07-24 Markus Mohrhard <markus.mohrhard@googlemail.com> [e972e936831cd00189e3344458b5e968465a3a3f]
+
+ rename strikeout to strikethrough
+
+
+2016-07-24 Markus Mohrhard <markus.mohrhard@googlemail.com> [a86e5df580efb6bcf354ae025221849c5eb55a83]
+
+ fix number-format style test file for ods
+
+
+2016-07-24 Markus Mohrhard <markus.mohrhard@googlemail.com> [91325818033c0b48f93adde908e50b25192d9920]
+
+ format the cell-styles odf test file
+
+
+2016-07-24 Markus Mohrhard <markus.mohrhard@googlemail.com> [09e11140113fdea975e456157de337a7a3e1b150]
+
+ const for by-value return values makes no sense
+
+
+2016-07-24 Markus Mohrhard <markus.mohrhard@googlemail.com> [3cd1fc8a41dbd416083636373f88e327ea8b2d38]
+
+ add some more strikethrough values from the ODF spec
+
+
+2016-07-24 Jaskaran Singh <jvsg1303@gmail.com> [cdaf4433178a473bc77b3f2e8f942c80bee2ff88]
+
+ Add test for ODF strikeout
+
+
+2016-07-24 Jaskaran Singh <jvsg1303@gmail.com> [4cfa770c5a96c099a196ca70830dd47901d8f4b7]
+
+ Add code for importing ODF strikeout
+
+
+2016-07-24 Jaskaran Singh <jvsg1303@gmail.com> [4d775034aaebd04838f336ba0a452500c0906438]
+
+ Remove un-neccessary entries for odf border style
+
+
+2016-07-24 Jaskaran Singh <jvsg1303@gmail.com> [7e1a44fead65d8631e416ff4271f97433ecb3d41]
+
+ Re-implement Interface for importing border width
+
+
+2016-07-16 Kohei Yoshida <kohei.yoshida@gmail.com> [e2b8c919f7c50e6690e56a62864e373b008cc26a]
+
+ Adding new files to the slickedit project.
+
+
+2016-07-15 Kohei Yoshida <kohei.yoshida@gmail.com> [6da3d8f4922e501f9685761e91e6014ab565835a]
+
+ We now require ixion 0.12.0 (API version 0.12).
+
+
+2016-07-14 Jaskaran Singh <jvsg1303@gmail.com> [703f568dcf5be7dcea58100b754f49f79883a0a1]
+
+ Fix for Coverity report - Fix memory leak
+
+ Resolves the following issue:
+ coverity#164673
+
+ Full report available here:
+ https://scan3.coverity.com/reports.htm#v34198/p10518
+
+2016-07-14 Jaskaran Singh <jvsg1303@gmail.com> [69fd63423e977a78c1210ea2b40965e73ee6d674]
+
+ Fix for Coverity report - Initialize variables
+
+ Resolves these issues :
+ coverity#164683 to coverity#164677,
+ coverity#164675,
+ coverity#164673,
+ coverity#149352
+
+ Full Coverity report available here
+ https://scan3.coverity.com/reports.htm#v34198/p10518
+
+2016-07-13 Jaskaran Singh <jvsg1303@gmail.com> [0e12839333f2cf620c60c0e1dc1227f282930061]
+
+ Change order of function calls in commit_default_style() method
+
+ This commit prevents libreoffice to crash because of wrong order
+ of function call
+
+2016-07-05 Kohei Yoshida <kohei.yoshida@gmail.com> [07dd57cda627dfe0bb32042c64e237d1d5c5a374]
+
+ Rename build-doc-* to just doc-*.
+
+ because *make* *build*-doc sounds redundant.
+
+2016-07-03 Jaskaran Singh <jvsg1303@gmail.com> [f9a8d20b88ec599c703beba78139c3798b8dee9e]
+
+ Make generic classes
+
+
+2016-07-03 Jaskaran Singh <jvsg1303@gmail.com> [ea7d8b75f7aa5c91d6378d937b312871709cf217]
+
+ Restructure ods styles test and test cases for number formatting
+
+
+2016-07-03 Jaskaran Singh <jvsg1303@gmail.com> [4cfccdd5a4e372200a09361a3f4fea4ce88ecad0]
+
+ Add test document for number-format
+
+
+2016-07-03 Jaskaran Singh <jvsg1303@gmail.com> [e45bc8b77a624cace0e1a5c5477eaf8e8f2d05ac]
+
+ Add code for mapping number format styles
+
+
+2016-07-03 Jaskaran Singh <jvsg1303@gmail.com> [dcd22e95a2fa4c881cc0a51ebebd045d8a596cf1]
+
+ Add code for time number formatting import and a few quick fixes
+
+
+2016-07-03 Jaskaran Singh <jvsg1303@gmail.com> [12ec0b17892cfca97739604365dd649dbfcf74ca]
+
+ Add code for date number format import
+
+
+2016-07-03 Jaskaran Singh <jvsg1303@gmail.com> [e6fb2cacaaa0d18aa89e211918482c231cde421f]
+
+ Add code to import boolean number format and fix for fraction parser class`
+
+
+2016-07-03 Jaskaran Singh <jvsg1303@gmail.com> [c17c185d7f0e194ce17a6f90cb1c2103a834778f]
+
+ Add code for text style import
+
+
+2016-07-03 Jaskaran Singh <jvsg1303@gmail.com> [b32d2c0858c4e78e45737b41982d5008fa36a3cf]
+
+ Add code for scientific number formatting import
+
+
+2016-07-03 Jaskaran Singh <jvsg1303@gmail.com> [e3f3ee3c9397922e739a17153e6649c53e92e89a]
+
+ Add code for percentage number format import
+
+
+2016-07-03 Jaskaran Singh <jvsg1303@gmail.com> [ffa92b57b07700ee8e002f92833a135536bb16e5]
+
+ Add code for importing currency styles and its sub-elements
+
+
+2016-07-03 Jaskaran Singh <jvsg1303@gmail.com> [81886cc2b590c3447568f756d0fd08fd0f09e202]
+
+ Add ODF Number formatting as a child context to styles context and parser classes for it
+
+
+2016-07-03 Jaskaran Singh <jvsg1303@gmail.com> [89db6c730ebf8359c4c083e9c3135ddf7ca214ac]
+
+ Switch orcus_import_ods from xml simple stream handler to xml stream handler
+
+
+2016-06-27 Markus Mohrhard <markus.mohrhard@googlemail.com> [54a4b3c761a709989486d6405a9b21de604a9646]
+
+ add license header
+
+
+2016-06-26 Kohei Yoshida <kohei.yoshida@gmail.com> [ddae07284f441519fdfefdafeb5bdacfb5a79ddd]
+
+ Make sure the key references the string instance that just got moved in.
+
+
+2016-06-26 Kohei Yoshida <kohei.yoshida@gmail.com> [21fbfce5e5becfa118c3acdbf410c0ac539d4e1c]
+
+ Properly parse ods' content.xml using threaded parser.
+
+ We need to retrieve the string pool content and merge it with the one in
+ the session context, to make sure all referenced strings remain valid.
+
+2016-06-26 Kohei Yoshida <kohei.yoshida@gmail.com> [463fa41d114555c2a9ac0073d5c783527a94ec41]
+
+ Have both xml_stream_parser and threaded_xml_stream_parser.
+
+ Because we don't want to always use the threaded xml parser across
+ the board. For small-size xml stream, using 2 threads may be slower.
+
+2016-06-26 Kohei Yoshida <kohei.yoshida@gmail.com> [fc74b6fbf2eef5c1b72676bc35a8331df26e6b70]
+
+ Remove exception class that nobody uses.
+
+
+2016-06-26 Kohei Yoshida <kohei.yoshida@gmail.com> [d58bfe104615f533822a037fbc19a12fa8676f95]
+
+ Add swap_string_pool() method to both threaded json and sax parsers.
+
+ To allow the caller to retrieve the string pool used during threaded
+ parsing.
+
+2016-06-26 Kohei Yoshida <kohei.yoshida@gmail.com> [37d2ce78bb074f7a1befd99b217abd7de6b3a57a]
+
+ Support merging of two string_pool instances.
+
+
+2016-06-22 Kohei Yoshida <kohei.yoshida@gmail.com> [26407cdb30fa0f9f8f2854d8007b71173ca2aa1e]
+
+ Add configure option to enable/disable threaded XML parsing.
+
+
+2016-06-22 Kohei Yoshida <kohei.yoshida@gmail.com> [8243b2e6333f8007060a9d98e557ff75a3115e1a]
+
+ Finally pass the element and character values.
+
+ Now the test passes.
+
+2016-06-22 Kohei Yoshida <kohei.yoshida@gmail.com> [a7649d5c9d4c38ca32011c55c9e0b630b64ca191]
+
+ rename sax_token_parser_element to xml_token_element_t.
+
+ To be consistent with xml_token_attr_t.
+
+2016-06-22 Kohei Yoshida <kohei.yoshida@gmail.com> [a758f4b94223932fb7d3e7bede37c06df34147a2]
+
+ Implement constructors for sax_token_parser_element.
+
+
+2016-06-22 Kohei Yoshida <kohei.yoshida@gmail.com> [e1706326ba6ba3715f3820a553922a47abf5fbaf]
+
+ Document how to debug a test program.
+
+
+2016-06-22 Kohei Yoshida <kohei.yoshida@gmail.com> [cede21cd252a90f6b735428a846bf77bbf34f526]
+
+ Actually start parsing.
+
+ We still aren't converting tokens into client callbacks.
+
+2016-06-22 Kohei Yoshida <kohei.yoshida@gmail.com> [e6ca1f6108c7ddb1ed94fa5221ed533ce9174c72]
+
+ Initial setup on threaded sax token parser. Still non-functional.
+
+ And test rightly fails.
+
+2016-06-22 Kohei Yoshida <kohei.yoshida@gmail.com> [8454b85ab963fa0e6f3afc0906d183577b19d0ca]
+
+ Update the help text to add the json output option.
+
+
+2016-06-22 Kohei Yoshida <kohei.yoshida@gmail.com> [e0f83db6d99966bf27191bcee1cda45ea7fedb09]
+
+ Escape json strings properly.
+
+
+2016-06-22 Kohei Yoshida <kohei.yoshida@gmail.com> [f530e91c9a17789eaf3884c828169ef91cdd31a1]
+
+ Handle formula cells in json dumper.
+
+
+2016-06-22 Kohei Yoshida <kohei.yoshida@gmail.com> [ae00044b52255615f2d759c158d1d43379c21bb4]
+
+ Dump cell values, except for formula cells.
+
+ BTW, this change requires mdds 1.2.1 or above, for the handling of boolean
+ element block.
+
+2016-06-22 Kohei Yoshida <kohei.yoshida@gmail.com> [a8bebedb4faba8d7bdf0abbdddd794aeb491f034]
+
+ Use column labels in lieu of column indices.
+
+
+2016-06-22 Kohei Yoshida <kohei.yoshida@gmail.com> [2636a7af9d98223c3d2d764469dc485defdfaa15]
+
+ Iterate through cell data, and dump some json content.
+
+ Still work-in-progress.
+
+2016-06-22 Kohei Yoshida <kohei.yoshida@gmail.com> [b318c95f8254514361aec3dd54dc1c492b78a11d]
+
+ Set up a skeleton for implementing json dumper.
+
+
+2016-06-22 Kohei Yoshida <kohei.yoshida@gmail.com> [1bb896b1136d2d069d9df47d8bcd9a12ac42d89c]
+
+ Use lock_guard for simpler locking needs.
+
+ lock_guard is lesser overhead than unique_lock.
+
+2016-06-22 Kohei Yoshida <kohei.yoshida@gmail.com> [9e9d5515b57546c37d40cde3275f30f077b57dcc]
+
+ No need to have this atomic.
+
+ m_parsing_progress can only be changed by the parser thread while the
+ m_mtx_tokens is locked. So, as long as the access is being made while
+ the lock is held, it's safe.
+
+2016-06-22 Kohei Yoshida <kohei.yoshida@gmail.com> [813533944543aa30896f0fa8b60e29553a7e22b1]
+
+ No need to check on parsing progress ahead of time.
+
+ Even without this it should be the same outcome. And it may be slightly
+ faster since we can skip the branching on every single visit to
+ next_tokens().
+
+2016-06-22 Kohei Yoshida <kohei.yoshida@gmail.com> [704ccfd25481e56883c4f9bd1a6b12598a8c580c]
+
+ Just use one mutex since we are only protecting one data member.
+
+
+2016-06-22 Kohei Yoshida <kohei.yoshida@gmail.com> [f1bc4fef8ac5ec7af5a700526e5618047ae86cbd]
+
+ More fine-grained locking, to avoid holding lock more than necessary.
+
+ Also, change the parer token buffer type from deque to vector + reserve().
+
+2016-06-16 David Tardon <dtardon@redhat.com> [875639f08a3294699dbdb1f57410598b273a2a5a]
+
+ update boost.m4 to fix version detection with gcc 6.1
+
+
+2016-06-15 Jaskaran Singh <jvsg1303@gmail.com> [9b3ebb679d5da6f9b5333c536293d35e8a0125a0]
+
+ Add test for odf font import
+
+
+2016-06-15 Jaskaran Singh <jvsg1303@gmail.com> [88f2c5e369be6d123727773fcf9072832d7c5a97]
+
+ Add code to commit font underline
+
+
+2016-06-15 Jaskaran Singh <jvsg1303@gmail.com> [10d207d3a4c5344e24008c6b9338ab95fbb79235]
+
+ Add code to read odf underline attributes
+
+
+2016-06-15 Jaskaran Singh <jvsg1303@gmail.com> [501d9f76a1ac794c13c0ff622330d3de09a152cb]
+
+ Add helper function for odf underline style
+
+
+2016-06-15 Jaskaran Singh <jvsg1303@gmail.com> [06c668f394633f3b8d3dda8bcef845259c4b18e5]
+
+ Add helper function for odf underline width
+
+
+2016-06-15 Jaskaran Singh <jvsg1303@gmail.com> [4c0dea68535df504b731569104d685b57532d848]
+
+ Add a few functions for underline attributes to import interface
+
+
+2016-06-15 Jaskaran Singh <jvsg1303@gmail.com> [821198cb51a8b786e6a0162b6e4550dc5695c1d6]
+
+ Add enums and entries for various underline attributes
+
+
+2016-06-15 Jaskaran Singh <jvsg1303@gmail.com> [380e2a9a362eaec0755b578b6f7267b71b4464ff]
+
+ Improve test for odf border styles
+
+
+2016-06-15 Jaskaran Singh <jvsg1303@gmail.com> [538219baa9e123918dd27fe88d9040a323bf5486]
+
+ Correct entries for border style(sort them)
+
+
+2016-06-06 Jaskaran Singh <jvsg1303@gmail.com> [74d75eed965adf8e5fe9efdccf171974c17a704c]
+
+ Add test for odf cell protection
+
+
+2016-06-06 Jaskaran Singh <jvsg1303@gmail.com> [90121fd55613937dfc566740f91cccbe98f66196]
+
+ Add code to commit cell protection attributes
+
+
+2016-06-06 Jaskaran Singh <jvsg1303@gmail.com> [9b3565332085b89721d511e1c404fb7ef41dd6aa]
+
+ Add code to read cell protection attributes
+
+
+2016-06-05 Jaskaran Singh <jvsg1303@gmail.com> [0f4e00dcf8b43bdf6e36e8167688ecc0384f958d]
+
+ Add entry for cell protection in a few necessary places
+
+
+2016-06-05 Jaskaran Singh <jvsg1303@gmail.com> [e1173954171171f9bc6dd85e3bba085bd5145197]
+
+ Add option to hide formula cell to existing protection options
+
+
+2016-06-05 Jaskaran Singh <jvsg1303@gmail.com> [fdce38520a5c58453b1d8a5038e84697672063cf]
+
+ Add option to hide cell while printing to existing protection options
+
+
+2016-06-03 Kohei Yoshida <kohei.yoshida@gmail.com> [8d964f02802d80295a781b1a7fa975ec87b83a55]
+
+ NULL->nullptr
+
+
+2016-06-03 Kohei Yoshida <kohei.yoshida@gmail.com> [b2695baf8b0297227e1c8abbaa153a8c435f256b]
+
+ Turn token_type enum into enum class, to remove 'attribute' naming clash.
+
+
+2016-06-03 Kohei Yoshida <kohei.yoshida@gmail.com> [cc18466c32d5b8f378c1f8e28c484ed351e18dd9]
+
+ Add new files to slickedit project.
+
+
+2016-06-03 Kohei Yoshida <kohei.yoshida@gmail.com> [4ce3a5973726c39c8acdb666ba04697c5248eb32]
+
+ Use const where it makes sense.
+
+ Normal getter methods can be const.
+
+ Also made a few style fixes here and there.
+
+2016-06-03 Kohei Yoshida <kohei.yoshida@gmail.com> [2ae32543dd8b8d6deb190b965ef0e4cca2979a6a]
+
+ I tend to use foo_type for class internal types and foo_t for public ones.
+
+ This is just a nitpick, and nothing wrong with it but it's better to be
+ consistent.
+
+2016-06-03 Kohei Yoshida <kohei.yoshida@gmail.com> [a7fddc82d977c041c4c97f29548acdca5c293995]
+
+ Move length_t from measurement.hpp to types.hpp...
+
+ now that it is referenced in the import_interface header. I try to
+ keep all types used in the interfaces in the types header files.
+
+2016-06-03 Kohei Yoshida <kohei.yoshida@gmail.com> [62d126e7b3a3bff1e0b3b6de385acff1b564dd74]
+
+ Fix linkage error for orcus-odf-helper-test.
+
+ You need to link against both liborcus and liborcus-parser.
+
+2016-06-03 Markus Mohrhard <markus.mohrhard@googlemail.com> [8c241cc1a1cae847e8074d3f65d1c4276a300bac]
+
+ cppcheck: initialize member variable in constructor
+
+
+2016-06-03 Markus Mohrhard <markus.mohrhard@googlemail.com> [7610b89b859802014869b95cb40113fcc5cda451]
+
+ cppcheck: initalize variable in constructor
+
+
+2016-06-03 Markus Mohrhard <markus.mohrhard@googlemail.com> [c955ab2d116b1a20b322c3be0f6bc7a22a8cd7b6]
+
+ cppcheck: initialize variables in constructor
+
+
+2016-06-03 Markus Mohrhard <markus.mohrhard@googlemail.com> [eae35e2239c4f8430a997182327c0bdf48fdfbdd]
+
+ cppcheck: reduce scope of variable
+
+
+2016-06-03 Markus Mohrhard <markus.mohrhard@googlemail.com> [c7b2e5d7906a18ca1a650e163b6ff62c52c7afae]
+
+ remove dangerous unused constructor
+
+
+2016-06-03 Markus Mohrhard <markus.mohrhard@googlemail.com> [2c7c9ac527f35244937e3db3f596139b0dbccbf7]
+
+ init all variables in the constructor
+
+
+2016-06-03 Markus Mohrhard <markus.mohrhard@googlemail.com> [a4890b1348924e83e3d46d356349fc9a950ca601]
+
+ cppcheck: remove consecutive break
+
+
+2016-06-03 Markus Mohrhard <markus.mohrhard@googlemail.com> [157d3b22516ac27d56312a85995ab1d2ff271f50]
+
+ code style improvements
+
+
+2016-06-03 Markus Mohrhard <markus.mohrhard@googlemail.com> [ce5d915181d65abf6007e9d58fdd8aafa7cc537a]
+
+ remove unused variables
+
+
+2016-06-02 Jaskaran <jvsg1303@gmail.com> [6cd2fda9c544f73d1496ae766210420e5e7eaafa]
+
+ Add test for diagonal border
+
+
+2016-06-02 Jaskaran <jvsg1303@gmail.com> [0bfcf614a6ec90a4ab5782eb0dfcbcbd7fbf8ec8]
+
+ Add facility to read diagonal border
+
+
+2016-06-02 Jaskaran <jvsg1303@gmail.com> [4b42c4a93b7aec744e41e8d26403d5fa5a6b2535]
+
+ Add test for border import
+
+
+2016-06-02 Jaskaran <jvsg1303@gmail.com> [5b7301c06bb85498f5f1a267d58452ad9b97b0e1]
+
+ Implement facility to parse and commit border
+
+
+2016-06-02 Jaskaran <jvsg1303@gmail.com> [4d4791c8a788dd8f4a112d996089a9011c50b84a]
+
+ Add facility to set border width
+
+
+2016-06-02 Jaskaran <jvsg1303@gmail.com> [b63638e7160bd85631b23cb98f1a1fb7735fe067]
+
+ Add facility to read Border style - solid
+
+
+2016-06-02 Markus Mohrhard <markus.mohrhard@googlemail.com> [1c543d278c9eb5dd7aa603f00018e290b7dc6e1e]
+
+ fix indentation and remove tab
+
+
+2016-06-02 Markus Mohrhard <markus.mohrhard@googlemail.com> [309d378a0cea55d2f72ef23d5cad1a0037800a35]
+
+ don't leave a space between id and comma
+
+
+2016-06-02 Jaskaran <jvsg1303@gmail.com> [e5c0d91c92bc59f6c2f8bea9b575a5e6e51ab462]
+
+ Add facility to extract border details out of xml attributes
+
+
+2016-05-26 Kohei Yoshida <kohei.yoshida@gmail.com> [f0f4e6ea98490536bed2317205e17df538c2c949]
+
+ Remove unprotected asserts.
+
+
+2016-05-26 Kohei Yoshida <kohei.yoshida@gmail.com> [4cf71cb92de1aa06a58c530eef8f23a91d26a811]
+
+ A bit more work on the benchmark & print the final token buffer threshold.
+
+
+2016-05-25 Kohei Yoshida <kohei.yoshida@gmail.com> [ad6fd49ebb33c18e97df1b03e963c4cd17fbe3fc]
+
+ Print file over here too.
+
+
+2016-05-25 Kohei Yoshida <kohei.yoshida@gmail.com> [5657d62b210345b2c0957f691e2548407839dd81]
+
+ Add artificial overhead to the processor thread.
+
+
+2016-05-25 Kohei Yoshida <kohei.yoshida@gmail.com> [86847968cf3a7be82c665a36afdd6b161dafba06]
+
+ Consistent naming style.
+
+
+2016-05-25 Kohei Yoshida <kohei.yoshida@gmail.com> [27c62174a7b26deeb555b59812b985691fdf8223]
+
+ Add simple benchmark test programs.
+
+
+2016-05-25 Kohei Yoshida <kohei.yoshida@gmail.com> [a83d2592f8790b199c3eeec2043a057ae8a45368]
+
+ Sorted string map is no longer in orcus. It's in mdds now.
+
+
+2016-05-25 Kohei Yoshida <kohei.yoshida@gmail.com> [0500d3bbe18a3bb6cf009c7667cd7e9ddba278a1]
+
+ Mention which thread should call which method.
+
+
+2016-05-24 Kohei Yoshida <kohei.yoshida@gmail.com> [290e7d3ec4ec795635d6e2da0eaee560309a849d]
+
+ This has the same effect, and much simpler.
+
+
+2016-05-24 Kohei Yoshida <kohei.yoshida@gmail.com> [f5e88a43226b4462114d66fa86cf9b21985f7d63]
+
+ Add it to slickedit project.
+
+
+2016-05-24 Kohei Yoshida <kohei.yoshida@gmail.com> [a540ce0d643b82ca1668ff1c95e1c752b207f754]
+
+ Clear the client token buffer to ensure it's really empty.
+
+ It's safer this way, than asserting that it's empty and putting the
+ responsibility of emptying it onto the client code.
+
+2016-05-24 Kohei Yoshida <kohei.yoshida@gmail.com> [86dc98fd53af9730cb5a4f9c914e581ecde41b01]
+
+ Avoid next_tokens to wait forever.
+
+ This could happen when parsing was done while no more tokens were added
+ after the last token exchange.
+
+2016-05-24 Kohei Yoshida <kohei.yoshida@gmail.com> [e87e4f49df44c0a53f936a2b81a5e184145b8300]
+
+ Separate the parser client token buffer management code.
+
+ This can be re-used for other multi-threaded parsers in the future.
+
+2016-05-24 Kohei Yoshida <kohei.yoshida@gmail.com> [4ab3330ed5697a1ffa4fd32f239b2836ac73266c]
+
+ Add the ability for the client code to specify max token size.
+
+
+2016-05-23 Kohei Yoshida <kohei.yoshida@gmail.com> [a72abdead195912188ae98bf774dee6360c912a9]
+
+ Make sure the child thread is joined even when the main thread throws.
+
+
+2016-05-23 Kohei Yoshida <kohei.yoshida@gmail.com> [7ff191ff7d2cf169f93ef126e844a636c84a035d]
+
+ Use an array of static test cases.
+
+
+2016-05-23 Kohei Yoshida <kohei.yoshida@gmail.com> [17b9f09ac50d8d890b5f73e23246a73e250098a5]
+
+ Use container initializer to promote readability.
+
+
+2016-05-23 Kohei Yoshida <kohei.yoshida@gmail.com> [1fd1395857af7bd65e64cc1137f9b2edb88c3631]
+
+ We should wait for the client to finish processing the tokens...
+
+ ... if we can't increase the threshold any more.
+
+2016-05-22 Kohei Yoshida <kohei.yoshida@gmail.com> [e4faaf5640ad514ad296ca0434bfd03e6790f3f8]
+
+ These are constexpr.
+
+
+2016-05-22 Kohei Yoshida <kohei.yoshida@gmail.com> [7fc2d8ffb0b7823cbccc5677555a05391866fd3a]
+
+ It's not safe to call m_tokens.empty() without mutex.
+
+
+2016-05-21 Kohei Yoshida <kohei.yoshida@gmail.com> [34c72e9d958f625f081c48b4a91e3cb73425feac]
+
+ Rename the variable.
+
+ It is a minimum token size since the token size can be larger than the
+ size specified by this variable, but should never be smaller than this
+ value unless it's the last token set.
+
+2016-05-21 Kohei Yoshida <kohei.yoshida@gmail.com> [a637417f4ceb873a987b2efefee6d3d76033519a]
+
+ Fix the timing and get it to work.
+
+
+2016-05-21 Kohei Yoshida <kohei.yoshida@gmail.com> [6f4661d198fc8d126cf80478f20aa64cdaecad07]
+
+ Dump token lists (expected vs actual) when they are not equal.
+
+
+2016-05-21 Kohei Yoshida <kohei.yoshida@gmail.com> [3ebbaeefc45a6a907446be002b05a1dfd3dd055c]
+
+ Add the ability to set arbitrary max token size.
+
+
+2016-05-20 Kohei Yoshida <kohei.yoshida@gmail.com> [7015e3626ddbc1554014c759db3ae05169dfad96]
+
+ First real test!
+
+
+2016-05-20 Kohei Yoshida <kohei.yoshida@gmail.com> [815d884d7a9a677fca80777d85bc1ec66b7be60d]
+
+ Make it a little more complete. Still not tested. I'm working on it.
+
+
+2016-05-20 Kohei Yoshida <kohei.yoshida@gmail.com> [fc72cbda06b5d4469a1c73db4f09e23282b4f8e6]
+
+ Add this to the slickedit project.
+
+
+2016-05-17 Kohei Yoshida <kohei.yoshida@gmail.com> [43add758afbd741b2019ca4cf2499aeb9cf0b197]
+
+ First pass on threaded json parser. Still totally untested.
+
+
+2016-05-17 Kohei Yoshida <kohei.yoshida@gmail.com> [bfed38e43eaccde65cb5ed0ee0d6b33dfe26482f]
+
+ Set up a skeleton framework for the new threaded json parser code.
+
+
+2016-05-11 Kohei Yoshida <kohei.yoshida@gmail.com> [67c297cf1088256191fdb5c763fd3bfa40da6fa3]
+
+ Update it.
+
+
+2016-05-11 Kohei Yoshida <kohei.yoshida@gmail.com> [bde5e86ce7634cfe27b53858a256c3482cbbac45]
+
+ Add 0.11.2 source packages.
+
+
+2016-04-17 Kohei Yoshida <kohei.yoshida@gmail.com> [01c314f4f10f0628538ccec98c85271051683974]
+
+ Add other missing symbols.
+
+
+2016-04-15 Kohei Yoshida <kohei.yoshida@gmail.com> [933a70c182625a22a2419c75fea2b09f8bf20f57]
+
+ Add utility classes to the doc.
+
+
+2016-04-15 Kohei Yoshida <kohei.yoshida@gmail.com> [dc68e62c5ac72368bd69eecd83c2c38802f03f1c]
+
+ Fill the XML parser section, and expand macros when generating doxygen.
+
+
+2016-04-15 Kohei Yoshida <kohei.yoshida@gmail.com> [f23c7bce9666c14c53926c7c98443cc17a5148e3]
+
+ Add CLI documentations.
+
+ Pretty much a direct copy of the help outputs.
+
+2016-04-13 Kohei Yoshida <kohei.yoshida@gmail.com> [d41522906f002d34ffe41f3cb046ba0f2705df29]
+
+ Add hook for command-line tools.
+
+
+2016-04-13 Kohei Yoshida <kohei.yoshida@gmail.com> [e7c8dc3943bc82aa6d984eb1bea6f9b2db97da66]
+
+ Add spreadsheet types to the doc.
+
+
+2016-04-13 Kohei Yoshida <kohei.yoshida@gmail.com> [53f90afb5ba60f369a437ce5aa8324790150f514]
+
+ Let's use standard int types.
+
+ This bumps up the API version.
+
+2016-04-12 Kohei Yoshida <kohei.yoshida@gmail.com> [05f3f4da3f185e6fec71804bd5e3ea18e5efbf5a]
+
+ Spell it out.
+
+
+2016-04-12 Kohei Yoshida <kohei.yoshida@gmail.com> [5f11ee030fd4c3f48cb77678594e8ac94702b10b]
+
+ Add orcus interfaces to the doc.
+
+
+2016-04-12 Kohei Yoshida <kohei.yoshida@gmail.com> [c63f3c2cb591877981b6b239a0020a731bd28e2b]
+
+ Fix YAML parser handler test.
+
+
+2016-04-11 Kohei Yoshida <kohei.yoshida@gmail.com> [247dcd6cd472a67a4ec5f44b40576e292031439f]
+
+ Add csv::parser_config to the doc.
+
+
+2016-04-11 Kohei Yoshida <kohei.yoshida@gmail.com> [230cb7c8120a31f4029a8d9a4b36be38068df429]
+
+ Fill the CSV parser page.
+
+
+2016-04-11 Kohei Yoshida <kohei.yoshida@gmail.com> [07cd076be05271c2d2fd22da83c44c9c87798fb1]
+
+ Add YAML API page.
+
+
+2016-04-11 Kohei Yoshida <kohei.yoshida@gmail.com> [4999f7c26bf0fe86e450e23802c7d7620a7bdb99]
+
+ Re-organize the C++ API documentation structure.
+
+ Now it consists of:
+
+ * Overview
+ * C++ API
+ * Python API
+
+ and their respective sub-structures.
+
+2016-04-11 Kohei Yoshida <kohei.yoshida@gmail.com> [fb725c0766ffe06aa4274dcf162b736ee510eff6]
+
+ Put doxygen output into _doxygen directory.
+
+
+2016-04-08 Kohei Yoshida <kohei.yoshida@gmail.com> [0c937e3ee0c3d9a071ebe1da5ebb2cad56881e44]
+
+ Add links to documentations.
+
+
+2016-04-08 Kohei Yoshida <kohei.yoshida@gmail.com> [c486aed857d2440c01bf44271eb19e289c486379]
+
+ Finish up the page & up the version in the doc.
+
+
+2016-04-08 Kohei Yoshida <kohei.yoshida@gmail.com> [38fa9e68711d2705e1bd8fa0d59e6c736852adf1]
+
+ Start writing up on Python API.
+
+
+2016-04-05 Kohei Yoshida <kohei.yoshida@gmail.com> [6729c8540168d179e38353879a8081855e6a8cc7]
+
+ Re-organize the documentation structure.
+
+ And make room for Python API and comman line tools.
+
+2016-04-04 Kohei Yoshida <kohei.yoshida@gmail.com> [ce483317e3a67909eeb4e47cce0a08e6c3d3a5a8]
+
+ Turn xlsx.py into a real unit test file.
+
+
+2016-04-04 Kohei Yoshida <kohei.yoshida@gmail.com> [f974f0de58a2b44f88e6f7b7874e8c4b1daef1ce]
+
+ Prefix a class that represents a python object with 'pyobj_'.
+
+ To make the code a little less confusing.
+
+2016-04-04 Kohei Yoshida <kohei.yoshida@gmail.com> [3a1bb25393aaa81979b8adb009dfd05fab6a27a2]
+
+ Handle formula results for real.
+
+
+2016-04-04 Kohei Yoshida <kohei.yoshida@gmail.com> [aee890f8411e31b9a3ab1bfd5a65190064b3faa5]
+
+ Remove this.
+
+
+2016-04-03 Kohei Yoshida <kohei.yoshida@gmail.com> [f48adaaf737c49c1c3816b6ea4acb2e52ca3d0ff]
+
+ Pick up real cell values.
+
+
+2016-04-02 Kohei Yoshida <kohei.yoshida@gmail.com> [548625a24ea4bbe78bac77f3277c90075da11d70]
+
+ Use mdds::mtv::collection to iterate through rows.
+
+
+2016-04-02 Kohei Yoshida <kohei.yoshida@gmail.com> [e6403513134cf3052cc757bf1ba09ce56d7b0cdf]
+
+ Next version will be 0.12.0, and will require mdds-1.2.
+
+
+2016-03-25 Kohei Yoshida <kohei.yoshida@gmail.com> [92fbe89153135988053f833e2e06103e3a5e106c]
+
+ python: iterate for the number of rows.
+
+ Next step is to fill in the actual row values for each iteration.
+
+2016-03-25 Kohei Yoshida <kohei.yoshida@gmail.com> [42574d851dbfc39bf57da5f9884d01a919f86872]
+
+ python: add get_rows() to orcus.Sheet to return a SheetRows object.
+
+
+2016-03-25 Kohei Yoshida <kohei.yoshida@gmail.com> [0070bc2e274ad3188a94cc1006c5f3ca8674b9c6]
+
+ Add gdb mode to allow debugging with gdb.
+
+
+2016-03-25 Kohei Yoshida <kohei.yoshida@gmail.com> [24d832f472f64d26f83bf5815cd81e28e26d58c7]
+
+ python: add boilerplate for orcus.SheetRows.
+
+ This will be an iterator class that allows iteration of sheet data
+ by rows.
+
+2016-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [1274bb51a10ea6afdc081b70f2b1ed736053dd55]
+
+ Apparently Py_CLEAR is safer than Py_XDECREF.
+
+
+2016-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [e33ebd6eab8ce5b2dc2b2bf14723092d56cade3b]
+
+ We don't need these...
+
+
+2016-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [13e4405bf1dd52420f38b766c53ee9ca8555d5b7]
+
+ This is no longer a TODO.
+
+
+2016-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [08f4ec25c2858a38500a2b148cc7ed867c28295a]
+
+ Add comments.
+
+
+2016-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [e9862fc62e0539a4cbaff2062480e4ca46d8571b]
+
+ python: Sheet to have data_size and sheet_size members.
+
+ data_size is the size of the data on the sheet, while sheet_size is the size
+ of the entire sheet, which is for now almost always 1024 by 1048576.
+
+ Incidentally, spreadsheet::document is not swappable since each sheet instance
+ holds reference to the parent document instance.
+
+2016-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [c265689f6f80ffb6400e24b1f46547269f417d8f]
+
+ Update project file.
+
+
+2016-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [02f8be3c5064a5376ef3487a24bcb36aa7090ecd]
+
+ Remove header project.
+
+
+2016-03-22 Kohei Yoshida <kohei.yoshida@gmail.com> [b993d651fe05fc88535855d9f9aa57cb944b4fdd]
+
+ python: orcus.Sheet object to have a 'name' attribute member.
+
+ It's read-only.
+
+2016-03-22 Kohei Yoshida <kohei.yoshida@gmail.com> [1d49560636de37103b6dfbdd5439fd74e23b640b]
+
+ python: create and store sheet objects in orcus.Document.sheets.
+
+ This is an attribute. It's a tuple to ensure that no sheets are ever
+ inserted externally.
+
+2016-03-22 Kohei Yoshida <kohei.yoshida@gmail.com> [4f63a7f05ad757c28c86873423c4d75e3fda3068]
+
+ python: add Sheet class to orcus module.
+
+
+2016-03-22 Kohei Yoshida <kohei.yoshida@gmail.com> [8c626354240b95fa4f307b854e1220bda114cfc4]
+
+ python: add a skeleton orcus.Sheet class object.
+
+ It's still pretty much empty.
+
+2016-03-21 Kohei Yoshida <kohei.yoshida@gmail.com> [4123bc51b66bdf8f224f7bb12de5f43a2bb47263]
+
+ python: store the document instance in another place.
+
+
+2016-03-21 Kohei Yoshida <kohei.yoshida@gmail.com> [44769818c1cf78f77bf5a1d21d04d50cdf108f0a]
+
+ Store the document data inside orcus.Document object.
+
+ We can't access it just yet.
+
+2016-03-21 Kohei Yoshida <kohei.yoshida@gmail.com> [ea8dd36458b130a005b7abaad1d4b9918b530b8f]
+
+ Add these to slickedit project.
+
+
+2016-03-21 Kohei Yoshida <kohei.yoshida@gmail.com> [018f4e35807ad90ebb95f99d02fed94dc730afd3]
+
+ python: Have read_file() function to return a document instance object.
+
+
+2016-03-21 Kohei Yoshida <kohei.yoshida@gmail.com> [5c50ba2ac431da81f63bbea15b655552639683a0]
+
+ Add an empty orcus.Document skeleton.
+
+
+2016-03-20 Kohei Yoshida <kohei.yoshida@gmail.com> [c088a1002d3ab6c4af4a6bf8cbbe3e7805e4273c]
+
+ python: do load the file for real.
+
+
+2016-03-20 Kohei Yoshida <kohei.yoshida@gmail.com> [121d6ebeef462fe36470ab90f252b3e33c0d8e6c]
+
+ python: xlsx.read_file() to be enabled only when xlsx and sp-model are.
+
+
+2016-03-20 Kohei Yoshida <kohei.yoshida@gmail.com> [818ba50b7df8ea7d415641af2a56d44b53e4ac32]
+
+ python: add empty read_file() function in orcus.xlsx.
+
+ Going forward, we'll just make one python module and manage sub-modules
+ by way of wrapper python scripts in src/python/orcus.
+
+2016-03-20 Kohei Yoshida <kohei.yoshida@gmail.com> [c05ef01413e0f1c2823a643f9125eea533757d2d]
+
+ Move the module root implementation into own set of files.
+
+ From this point on, python.cpp glues all fuctionalities into a single
+ module, and root.* to contain the actual implementations of the module
+ root.
+
+2016-03-11 Kohei Yoshida <kohei.yoshida@gmail.com> [29248b39a04fe03250f02838fb300f5157b60805]
+
+ Add 0.11.1 to the download table.
+
+
+2016-03-11 Kohei Yoshida <kohei.yoshida@gmail.com> [00037fa23178c3876b31272cc2becacbf6b0dc07]
+
+ Up the version to 0.11.1.
+
+
+2016-03-08 David Tardon <dtardon@redhat.com> [821f16a55b7d87a2a5fca1c90221c0ee084ac7a5]
+
+ distribute renamed files again
+
+ They are not distributed automatically anymore because they have
+ non-standard names.
+
+2016-03-08 David Tardon <dtardon@redhat.com> [eac3ccbf24d3b7dcb83d2451361a2eaac1255b0d]
+
+ add new tools to gitignore
+
+
+2016-03-08 David Tardon <dtardon@redhat.com> [d3536f3125507ac1ed7a8d4f81a9450fd0bd32ea]
+
+ Boost.Filesystem is needed uncoditionally
+
+
+2016-03-07 Kohei Yoshida <kohei.yoshida@gmail.com> [c5d7282214727bcc28b6ec7e2b8016b40872cd3b]
+
+ Get it to build on Windows.
+
+
+2016-03-06 Kohei Yoshida <kohei.yoshida@gmail.com> [a1df2d984d527931c6cbbe6547856283bdbf6a9b]
+
+ Fix for OSX build inside LibreOffice.
+
+
+2016-03-03 Kohei Yoshida <kohei.yoshida@gmail.com> [1bc8ff1c677ab5684f633190093f6aebe1b0e861]
+
+ Add API Version column.
+
+
+2016-03-03 Kohei Yoshida <kohei.yoshida@gmail.com> [19ea60f04a273679b2c006645c82899b6c5a61aa]
+
+ Add download links to the 0.11.0 package.
+
+
+2016-03-03 Kohei Yoshida <kohei.yoshida@gmail.com> [5a5f0aa54cd8549255cc020643ae102732c207c1]
+
+ Fix build on OSX.
+
+
+2016-03-01 Kohei Yoshida <kohei.yoshida@gmail.com> [f1bd1601f85c72eb526d0a219e992400c9019ea9]
+
+ Finally python tests pass under 'make distcheck'.
+
+ But this wasn't easy...
+
+2016-03-01 Kohei Yoshida <kohei.yoshida@gmail.com> [aa8976732222f3547c2a07632e5e3a6150800f9b]
+
+ More fixing of make distcheck. Still test/python/run-all.sh fails.
+
+
+2016-03-01 Kohei Yoshida <kohei.yoshida@gmail.com> [eb3528599712898051ac0ea78d8a59f7fb83ee8b]
+
+ Try to get make distcheck to pass. Still with issues.
+
+
+2016-02-14 David Tardon <dtardon@redhat.com> [da946ed8908550cb5fe281055dcff46c1aefebab]
+
+ hash container sel. has been removed in mdds 1.0
+
+
+2016-02-04 Kohei Yoshida <kohei.yoshida@gmail.com> [40f437d1014cf8346bfa3877aee66c0fde7532b0]
+
+ Add new items in 0.11.0.
+
+
+2015-11-22 Maks Naumov <maksqwe1@ukr.net> [e7614d0be63a4d140ae1586f830ff4d3a4ff9766]
+
+ Fix throw malformed_xml_error
+
+
+2015-11-03 Kohei Yoshida <kohei.yoshida@gmail.com> [51b35daab24e973ad2341375fdc823c08835f734]
+
+ Add a rudimentary test case for create_parse_error_output().
+
+
+2015-11-03 Kohei Yoshida <kohei.yoshida@gmail.com> [f19eac2eacf67c6eff87b34df744fd0117ad6bc0]
+
+ Correctly compute line offset for one-liner stream.
+
+
+2015-11-03 Kohei Yoshida <kohei.yoshida@gmail.com> [976c641dd19f77bc341706442c60a5d708328feb]
+
+ Fix JSON parser to properly handle empty objects and arrays.
+
+
+2015-11-03 Kohei Yoshida <kohei.yoshida@gmail.com> [8a55078aaa680074a72c7453d0e559988be1365b]
+
+ mdds 1.0.0 is officially out now & set the API version to 0.11.
+
+ We will depart from the previous API versioning scheme in favor of
+ the same API versioning used by mdds and ixion.
+
+2015-10-27 Kohei Yoshida <kohei.yoshida@gmail.com> [f4482a43109133fe04195654ac61462ddd8ec8c6]
+
+ More code annotation for doxygen.
+
+
+2015-10-27 Kohei Yoshida <kohei.yoshida@gmail.com> [502511a95b18a54239350aba1b9274db318d0753]
+
+ Annotate json_config, to be picked up by doxygen.
+
+
+2015-10-27 Kohei Yoshida <kohei.yoshida@gmail.com> [3fa60e5aa8dfece53da9033baa8717436b5af65c]
+
+ Sync the example code.
+
+
+2015-10-27 Kohei Yoshida <kohei.yoshida@gmail.com> [71a2c7c2e8fded83713ab976958458ea231c3d81]
+
+ More editing of JSON documentation.
+
+
+2015-10-26 Kohei Yoshida <kohei.yoshida@gmail.com> [a23d7d3c74a5bdfc70fe9bc0c774e7f5e5a946ac]
+
+ Update the required ixion API version.
+
+
+2015-10-21 Kohei Yoshida <kohei.yoshida@gmail.com> [aa7e3c69b4d15adb0dc1cd56a0be0dd8b2110de2]
+
+ Another example code.
+
+
+2015-10-21 Kohei Yoshida <kohei.yoshida@gmail.com> [0f0d35f3efdcf00b50d1772468ea7d4c8c441e35]
+
+ More on JSON documentation.
+
+
+2015-10-20 Kohei Yoshida <kohei.yoshida@gmail.com> [30d73bf0fe7fb7b92886e3ea5d5a9d7cd7954580]
+
+ Redundant std:: namespacing.
+
+
+2015-10-20 Kohei Yoshida <kohei.yoshida@gmail.com> [2967ddefecc0b6d33bfad6636db1d78b6b62a50c]
+
+ More on JSON documentation.
+
+
+2015-10-20 Kohei Yoshida <kohei.yoshida@gmail.com> [a0006d387fabbd0c3443085af28b56fb4f8ee670]
+
+ keys should return an ordered key series when available.
+
+
+2015-10-16 Kohei Yoshida <kohei.yoshida@gmail.com> [d8dbcce48e134ca06fe0af9564d8b60a9a45db13]
+
+ Fix wrong syntax.
+
+
+2015-10-16 Kohei Yoshida <kohei.yoshida@gmail.com> [9f83127fedeb35e0b4b11e9afa15e0f1dac37e47]
+
+ Add section about building documentation.
+
+
+2015-10-16 Kohei Yoshida <kohei.yoshida@gmail.com> [4e5a058cb732dd4b13071621630611a635d90360]
+
+ Add more code documentation.
+
+
+2015-10-16 Kohei Yoshida <kohei.yoshida@gmail.com> [d5e3d6b7371b61b923cfe17ae761ed340a7cb16a]
+
+ Add JSON related classes.
+
+
+2015-10-16 Kohei Yoshida <kohei.yoshida@gmail.com> [c94044cd4ec097f553ee453141ec6a28a7f9e373]
+
+ Add empty section files.
+
+
+2015-10-16 Kohei Yoshida <kohei.yoshida@gmail.com> [d1db5c919b9c2e51bad44b981708a0b5e5d5e054]
+
+ Set up some basic documentation building stuff.
+
+
+2015-10-16 Kohei Yoshida <kohei.yoshida@gmail.com> [fab2ee3162e9b793f0dbd129dab6494f01a3b657]
+
+ Move doc into misc/notes.
+
+
+2015-10-13 Kohei Yoshida <kohei.yoshida@gmail.com> [a85191096feb1b19bd0455d86be86ec46e44fe1b]
+
+ Rename some files to get them to show up on GitLab front page.
+
+
+2015-10-13 Kohei Yoshida <kohei.yoshida@gmail.com> [57001b41484678df8539ed13157d7aa52787681d]
+
+ Add build instructions.
+
+
+2015-10-12 Kohei Yoshida <kohei.yoshida@gmail.com> [066a7ad4206907ba8a31ffaacc4122fd0e64d53f]
+
+ Move the zip archive test to the parser module.
+
+ Because the zip archive framework belongs to the parser.
+
+2015-10-12 Markus Mohrhard <markus.mohrhard@googlemail.com> [468e489730081549b90b8f39946d9f7ec6a5660e]
+
+ support passing in the file content to orcus
+
+ This allows to pass in the stream of a file that is not necessarily on
+ the local system.
+
+ This fixes issue #21.
+
+2015-10-12 Kohei Yoshida <kohei.yoshida@gmail.com> [0dc1795eae1bda6ae87851247d852e09711ecf70]
+
+ Get this to compile with clang++ on OSX.
+
+
+2015-10-12 David Tardon <dtardon@redhat.com> [939b136bb17041a5d555cfed2c16db998a40ebba]
+
+ add test for zip_archive_stream_blob
+
+
+2015-10-12 David Tardon <dtardon@redhat.com> [a2a68f7430b8d216274c49dd3983e4b28c92acd0]
+
+ do not allow seeking past the end
+
+
+2015-10-12 Caolán McNamara <caolanm@redhat.com> [bd051c422c37ca2dcad93cdcb0c8f2f2fd691c95]
+
+ fix crash on loading ooo55043-1.odt, etc.
+
+
+2015-10-09 Kohei Yoshida <kohei.yoshida@gmail.com> [0c5b769cd5265f9c3b281acbe282dd74096d4389]
+
+ Show only partial line in case the line is too long to fix in screen.
+
+ This is useful especially with xml parse errors since many xml streams
+ put everything on a single line.
+
+2015-10-09 Kohei Yoshida <kohei.yoshida@gmail.com> [80304e26bd72fe07f9ccef1774a3999604327cf4]
+
+ Generate sensible output on malformed xml error.
+
+
+2015-10-09 Kohei Yoshida <kohei.yoshida@gmail.com> [99bffe909ff5cc6e79e4cea1a53916a9a3bfe8a8]
+
+ sax::malformed_xml_error to be a child class of parse_error.
+
+ To be able to pass offset error position.
+
+2015-10-08 Kohei Yoshida <kohei.yoshida@gmail.com> [74113acce597718af072d87ae1f8e6c4cfb8741b]
+
+ sax: sax::parser_base to be a child class of global parser_base.
+
+ sax's next_char() has been renamed to next_and_char() due to it having
+ different behavior than the global next_char().
+
+2015-10-08 Kohei Yoshida <kohei.yoshida@gmail.com> [b20315c7b055707842fcdc3742ea86a408067abc]
+
+ sax: m_pos is a goner now.
+
+
+2015-10-08 Kohei Yoshida <kohei.yoshida@gmail.com> [c36fe45e7aaf9692c24548e9aa02884c5c7d6a1e]
+
+ sax: and characters_with_encoded_char() too.
+
+
+2015-10-08 Kohei Yoshida <kohei.yoshida@gmail.com> [d26bfbc836fbc6587502193a4398e8b3f80cd119]
+
+ sax: ditto with value_with_encoded_char(), value() and name().
+
+
+2015-10-08 Kohei Yoshida <kohei.yoshida@gmail.com> [cebe98154024a9016af06fc303c5a16847cbc050]
+
+ sax: remove use of m_pos from characters().
+
+
+2015-10-08 Kohei Yoshida <kohei.yoshida@gmail.com> [2a5984e745f64bd458dc982cfe6b4d0ff177116e]
+
+ m_size is not needed. Remove it.
+
+
+2015-10-08 Kohei Yoshida <kohei.yoshida@gmail.com> [eb06c7af075b1bd54e0a155d725b6e8dcaa2dfd2]
+
+ Rename char pointer members and add mp_end.
+
+ To match with the global orcus::parser_base.
+
+2015-10-08 Kohei Yoshida <kohei.yoshida@gmail.com> [44a749b22d8f2c03c41ce6aa35c28ff175e8e42d]
+
+ Typo.
+
+
+2015-10-08 Kohei Yoshida <kohei.yoshida@gmail.com> [f92f7539e19bbc785d21fcf60f5f7d1696fa6381]
+
+ Oops this was not intended.
+
+
+2015-10-08 Kohei Yoshida <kohei.yoshida@gmail.com> [333b7c80bc764e6ad64adc284faf1c2f2ce166bc]
+
+ json: let's not emit this error output directly.
+
+ Let the caller decide what to do with it. We may hit this code path
+ from outside orcus-json too, in which case, emitting an error message
+ right away to stderr may not be desirable.
+
+2015-10-08 Kohei Yoshida <kohei.yoshida@gmail.com> [6d250d7b1e179f6c0119f7b96d05c26eede9bf65]
+
+ Fix build breakage with clang++.
+
+
+2015-10-07 Kohei Yoshida <kohei.yoshida@gmail.com> [741f13e3bc2cc14c55e20207f2e835f69100cdfd]
+
+ json: catch parse_error in the right place for external files.
+
+ We need to spit out the error while the external file stream is still
+ alive.
+
+2015-10-07 Kohei Yoshida <kohei.yoshida@gmail.com> [713a0f3b0209f3fd02d6633e22667b7bfe3c3ed3]
+
+ json: generate nicer error output for parse error.
+
+ The new variant prints out the line where the parser error occurred
+ as well as the offset of the error on that line.
+
+2015-10-02 Kohei Yoshida <kohei.yoshida@gmail.com> [ba1b121770f03e66412f54abf5db5df3bdb0a05c]
+
+ json: Optimize skip_blanks() a bit more.
+
+
+2015-10-02 Kohei Yoshida <kohei.yoshida@gmail.com> [baac12ce7a21e7c2340a479e9141f2a0a4ce0483]
+
+ Remove m_length and m_pos and add real end position.
+
+
+2015-10-02 Kohei Yoshida <kohei.yoshida@gmail.com> [40005e213ea363034a894fe5c124ee19fc8364d5]
+
+ Print the file paths.
+
+
+2015-10-02 Kohei Yoshida <kohei.yoshida@gmail.com> [741fe37e7420bd411a77615b13a7b0b3d40fad34]
+
+ Optimize skip_blanks().
+
+
+2015-10-02 Kohei Yoshida <kohei.yoshida@gmail.com> [f29d137c33a30f8c37316f71d32c26ad2e3f8d60]
+
+ python: Use json_parser directly to for orcus.json.loads().
+
+ This is understandably faster, since we now avoid "loading" the tree
+ twice. Still slower than the built-in json.loads().
+
+2015-10-02 Kohei Yoshida <kohei.yoshida@gmail.com> [9ffaca44545b7f1c34c872916621e722ff89c256]
+
+ Add skeleton handler code to json_parser.
+
+ It's intentionally MIT license to make it free-to-take for all.
+
+2015-10-02 Kohei Yoshida <kohei.yoshida@gmail.com> [92ddb8652ab17ebb5e166245b05acf7ac1686035]
+
+ Test file to measure json parser performance.
+
+
+2015-10-01 Kohei Yoshida <kohei.yoshida@gmail.com> [4cd17b6c38038e32d0a92b940edff0b635de222d]
+
+ Be more specific on caller's responsibility.
+
+
+2015-10-01 Kohei Yoshida <kohei.yoshida@gmail.com> [039208172acf9a216b5b3a4aa10fcf1819ca65b0]
+
+ json: add ability to specify string_pool instance to use for the doc tree.
+
+ And share the same string pool when resolving external json files.
+
+2015-10-01 Kohei Yoshida <kohei.yoshida@gmail.com> [46f1eca49785f18594230ef1c9cd8da40f864bfa]
+
+ python: turn off persistent string values for orcus.json.loads().
+
+ The caller holds the stream instance. No need to allocate memory to
+ copy string values.
+
+2015-10-01 Kohei Yoshida <kohei.yoshida@gmail.com> [7f60d4806aa9b0e868cbb582e6d3053789a42d70]
+
+ json: new configuration flag to control who owns the string values.
+
+
+2015-10-01 Kohei Yoshida <kohei.yoshida@gmail.com> [882c860a4466f6dea9783e504cdb527d376cde85]
+
+ json: have the document tree use string pool and use pstring everywhere.
+
+
+2015-10-01 Kohei Yoshida <kohei.yoshida@gmail.com> [57ca2cda706ce3196efe960e9ad0ff2425607447]
+
+ Record whether the parsed string is transient or not.
+
+ I'll use this information later in the json parser.
+
+2015-09-30 Kohei Yoshida <kohei.yoshida@gmail.com> [5238555ecd4a4df0a921a7933c1cb61f618c4e12]
+
+ License header for these guys too.
+
+
+2015-09-30 Kohei Yoshida <kohei.yoshida@gmail.com> [6b2562056d7b5dc70d1ea00878a9406397f1c4e9]
+
+ python: catch and translate exception into proper python error.
+
+
+2015-09-30 Kohei Yoshida <kohei.yoshida@gmail.com> [51f20597f1cc01ae33c1adfdad7fe83c57a2a2ca]
+
+ json_document_tree to support loading from a char array.
+
+
+2015-09-30 Kohei Yoshida <kohei.yoshida@gmail.com> [266f2fd25f09f44a74de3bdbf27fb35a8b688816]
+
+ Prevent naming clash.
+
+
+2015-09-30 Kohei Yoshida <kohei.yoshida@gmail.com> [fb03713750893c595862502854cdf0e5c1b4ccde]
+
+ python: add unit test for orcus.json.loads().
+
+
+2015-09-30 Kohei Yoshida <kohei.yoshida@gmail.com> [82e67daf7d111a83c1f284346409adfeb4bf93ac]
+
+ python: implement orcus.json.loads() using json_document_tree.
+
+ Intentially similar to the built-in json.loads().
+
+2015-09-30 Kohei Yoshida <kohei.yoshida@gmail.com> [f2000b2c698558bf91d8f4a03ece2d44085c89a4]
+
+ python: add skeleton orcus.json module.
+
+
+2015-09-29 Kohei Yoshida <kohei.yoshida@gmail.com> [ce3e50e0430ad9bd148982ed1703e5d74f95aaa5]
+
+ Add this file to slickedit's project.
+
+
+2015-09-19 Kohei Yoshida <kohei.yoshida@gmail.com> [19aee4b44de1addffc85c40752fd38f57e3a35f6]
+
+ Use a table syntax to store release packages.
+
+
+2015-09-18 Kohei Yoshida <kohei.yoshida@gmail.com> [b7771d458b7b0e229b7afc95b6d64dcc06b67a52]
+
+ coverity#149353: initialize value_number of json_value_number.
+
+
+2015-09-18 Kohei Yoshida <kohei.yoshida@gmail.com> [c35b2564c0c6e1a4316d6c40ea40da27f541d637]
+
+ coverity#149354: initialize 'transient' boolean member.
+
+
+2015-09-18 Kohei Yoshida <kohei.yoshida@gmail.com> [d255ebaa7327e43ad4bb60b4d773d32675c259c5]
+
+ yaml: add a few more methods to yaml's node class.
+
+ Borrowed from JSON's counterpart.
+
+2015-09-18 Kohei Yoshida <kohei.yoshida@gmail.com> [f52510e0061bac41d4e723abc3298523fff20a08]
+
+ json: add some documentation.
+
+
+2015-09-18 Kohei Yoshida <kohei.yoshida@gmail.com> [13ef02e212d82d53be53f23ab7a30401cd40396a]
+
+ json: apply that to all the other tests.
+
+
+2015-09-18 Kohei Yoshida <kohei.yoshida@gmail.com> [dedb609a953f31c62fb857213dd928494ee135cd]
+
+ json: Use closure to re-run the test on dumped JSON string.
+
+
+2015-09-18 Kohei Yoshida <kohei.yoshida@gmail.com> [a745478993aacd3b6c4d26c662198e20fb3577e4]
+
+ json: add test for nested2.
+
+
+2015-09-18 Kohei Yoshida <kohei.yoshida@gmail.com> [5c5f03e598d6a7a532b97f07dc8a31335ae9ea5b]
+
+ json: add test for nested1.
+
+
+2015-09-18 Kohei Yoshida <kohei.yoshida@gmail.com> [0e225dedf7f5564bd5df1e8d1cfd8e44615077b1]
+
+ json: test for basic4.
+
+ Also add keys() and child() that takes a key to the node class.
+
+2015-09-18 Kohei Yoshida <kohei.yoshida@gmail.com> [09192d3c664d5167ae0342052d461b9d376f35e1]
+
+ json: add test for basic3 and fix the bug discovered.
+
+
+2015-09-18 Kohei Yoshida <kohei.yoshida@gmail.com> [32b9862cc8a02d058d15bc319ba86d443188ef38]
+
+ json: start writing unit tests for node traversal.
+
+
+2015-09-18 Kohei Yoshida <kohei.yoshida@gmail.com> [4ece1b6ac05bd31054ecf347b3b3abb5dec94ed8]
+
+ json: copy and adopt YAML's node implementation to JSON's.
+
+ The two are almost identical, with a few minor differences.
+
+2015-09-18 Kohei Yoshida <kohei.yoshida@gmail.com> [0ca6f5e1fa1edbb83f90d52c8dd49c4cb5cfbd2d]
+
+ json: move json_value and json_node_type into the header under json::detail.
+
+
+2015-09-18 Kohei Yoshida <kohei.yoshida@gmail.com> [91818b70b3d06f1c18251547eac976c6f5b1d643]
+
+ Add YAML to the list.
+
+
+2015-09-16 Kohei Yoshida <kohei.yoshida@gmail.com> [e1fabb02cedb1e8603d7398fc098221f4348bd4c]
+
+ yaml: optionally quote strings when dumping in YAML format.
+
+
+2015-09-16 Kohei Yoshida <kohei.yoshida@gmail.com> [f249653f4b628cee55604b824b69280497dc3655]
+
+ yaml: some friendly warning when writing multiple docs to JSON.
+
+
+2015-09-16 Kohei Yoshida <kohei.yoshida@gmail.com> [9430610cbc28d29e21b8886bea073e0e6167d137]
+
+ Share JSON dump string code between json and yaml document trees.
+
+
+2015-09-16 Kohei Yoshida <kohei.yoshida@gmail.com> [06c1dc0e7ed94b029e9761812041f049840f0819]
+
+ json: reformat the help output for better output format list.
+
+
+2015-09-16 Kohei Yoshida <kohei.yoshida@gmail.com> [48450b9acdd35c430ccdd883fabdc60ddc28565d]
+
+ yaml: support output format of JSON.
+
+
+2015-09-16 Markus Mohrhard <markus.mohrhard@googlemail.com> [3d0d7cad7c455029968127093e009791111ba5c4]
+
+ move the odf styles test to src to avoid dependency problems
+
+
+2015-09-15 Kohei Yoshida <kohei.yoshida@gmail.com> [2fbd89523441cf821150423565dbe06e18c4bfed]
+
+ yaml: remove these debug statements.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [9cbc0781e3f461d0193c38b05c9a56ce4d8c4823]
+
+ yaml: add a few more test cases for double-quoted strings.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [73d7445b6ffb700bda7680959397083c0d79950c]
+
+ yaml: do the same with double quotes.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [fb599d84ad2ed3b74245719e8ef4d29224c0a05a]
+
+ yaml: '#' inside single quotes is not the beginning of a comment.
+
+ We need to do the same thing for double quotes.
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [5cc7a1824b5dde5fabe1942aa4ad928c95556151]
+
+ yaml: correctly parse "key: value" vs "key:value".
+
+ The latter is not to be parsed as a key-value pair, but as a string
+ that happens to contain a ':'.
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [17e481430a36c626b2b40b31124f88c1c89d0478]
+
+ yaml: actually parsing of an inline map item can be done this way.
+
+ Thus removing some duplicated code.
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [8c98ee9f581b1c09bce955eb7d41c8dca5bdf500]
+
+ yaml: common function for duplicate code blocks.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [5f3e3e17e11838387b67b1b603ceaf303b864d76]
+
+ yaml: finally handle single-quoted strings correctly.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [f18cc1f04ae2386b7e0faa766588bd0e4d16a8aa]
+
+ yaml: parse_quoted_string_value()->parse_double_quoted_string_value()
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [2990a7d34d567c8993c78314417a7f9335dae98a]
+
+ yaml: update the test case to add single quoted string values.
+
+ This currently fails.
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [a03e4f65d2f4cd1f8a61793e9bf47e3f97af678b]
+
+ yaml: call this parse_double_quoted_string().
+
+ to make it clear that it expects double quotes, not single quotes.
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [951c8cc13d3f1e35fbf46c5af1d25a61367c25a7]
+
+ yaml: these code blocks can go to the base.
+
+ Since they don't interact with the handler.
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [4d452e7607016f3ab11c217a519424a083925c40]
+
+ yaml: handle literal block as a child node of a map.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [988684b030b70024a762caad38a797007f7fc6a6]
+
+ yaml: a little more helpful exception messages.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [3c64f5639099be7b4059bc13ebc8c8506bb17bf5]
+
+ yaml: rename test directory multi-line-3 to literal-block-1.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [c8f69dee0de4627099d322c7d2dddab380b8657c]
+
+ yaml: support literal block as root value.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [8e5f60b098adb9d9017fefd5a6b2c55cfdb6528a]
+
+ yaml: much bigger example yaml file (that is not parsed correctly ATM).
+
+ This one is from http://editor.swagger.io/#/.
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [0b26283b17133414082cf7edbf6462b38c1a9070]
+
+ yaml: add another multi-line string test file that currently is not handled.
+
+ This one defines a multi-line string value where the line breaks need to
+ be preserved.
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [b26fb66ed87b31014250ec08302626f281eff0aa]
+
+ yaml: intentionally omit the document marker to make sure it's still valid.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [ac9a5e4431613f6a93ff534c71d7e65e6474af0e]
+
+ yaml: clean up the test code a bit.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [506f4d5c683f28afea30ab897de004df4c08077a]
+
+ yaml: ensure that when in multi-line mode, we take line strings as-is.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [68faf0726150bce0d78e0a15548720c8fbf46f5a]
+
+ yaml: micro-optimization.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [bdff85edadcd7f1c809c3395b13149b8b6d1f8fa]
+
+ yaml: handle string spanning over multiple lines.
+
+ e.g.
+
+ ---
+ 1
+ 2
+ 3
+
+ is equivalent of
+
+ ---
+ "1 2 3"
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [3238fb9aec5bc2184c8deabe495f4a99e175381e]
+
+ yaml: what comes after the doc marker '---' becomes first node.
+
+ This
+
+ --- foo
+
+ is equivalent of
+
+ ---
+ foo
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [61ffb2dcf5b7098ab28c0671e75df00ec07fa1ed]
+
+ yaml: Add a test case for multi-line string.
+
+ This currently fails because it's not handled correctly yet.
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [114246db0392dd2836dc21256930ed13502b0c91]
+
+ yaml: build fix with g++.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [2f7d868e98f20e016f3d253bb981684caf316d59]
+
+ yaml: add test for basic3.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [a3252c3ff0cf4b710c279249be163f75dae45f7f]
+
+ yaml: parse inline list item as if it's on its own line.
+
+ Then it gets parsed correctly.
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [8a8be6072b3dfc5f2be87343e5e2e6adf269d67c]
+
+ yaml: new test file to parse, which currently is not parsed correctly.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [f9654a325fb314d98539f14e81dd24329117814d]
+
+ yaml: share these string constants.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [54ed0ffaaf475a894edc8c4ee86c5193e0f02d4a]
+
+ yaml: dump yaml document tree in yaml.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [0d84f41df370d74ad8664a895012f50184284103]
+
+ Add wrappers for orcus-json and orcus-yaml.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [527ee5764cabc34bf890376e119041c0775093c6]
+
+ yaml: add new file to slickedit project file.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [9a13900ed75c9d12161dd19f2413a6dac58d45f3]
+
+ yaml: add orcus-yaml command-line executable.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [3b2e6f2ba7bbacba06b06dcf785ffcb7d41bb07a]
+
+ yaml: let's not forget to add this file.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [e18c2ebc693872c78a518b157e62bd8d6570f9c1]
+
+ yaml: test the content of quoted-string/input.yaml.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [6198a23b05580a31d1506141c3342eb7fbac668d]
+
+ yaml: remove duplicated code blocks.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [7e2a4f0b6dbd521f1fe1424830130e798738fb5d]
+
+ yaml: handle quoted string values correctly.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [98cd57c8cf521f948cccb704e82e944f506912af]
+
+ Use the common function in both places.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [e0f5ab6c1c2af7521614496dc2ba8732d1976e54]
+
+ Refactor json_parser's quoted string parser code to make it re-usable.
+
+ I need this for the yaml_parser.
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [4fc780b6991a5027211d7d5a385196d5388441aa]
+
+ yaml: handle boolean keywords and add a test for it.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [950ff89dc0a76fbcc6ea1fd443d4bd4ecd0e1130]
+
+ yaml: Check the content of the list of nulls.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [dbab64a4e44e5622c0dbb80d08f165cab3f845fc]
+
+ yaml: start working on handling null keyword.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [ecf38fb136dff76906b53055efc5d616a6fd4391]
+
+ yaml: test the structure of the second test file.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [3a4653c3fa880a719bca3abed00760e5d7bc6611]
+
+ yaml: remove tree_walker. It no longer makes sense design-wise.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [0ab9b3f9325c4301f16afe2075b4c0d0f780594c]
+
+ yaml: add another test file with missing document start marker.
+
+ Also support line containing only a number.
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [09cd0e380c4a9b4ae70708a8e9bd1c5667dc1193]
+
+ yaml: rename the test function.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [5c12272f7ab25d349c145ab80fced67ca7062c96]
+
+ yaml: add numeric_value() to node class and test the entire tree.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [0499b854d4e50e4000af68968be76b4ba1382f58]
+
+ yaml: Recognize and parse numeric values as appropriate.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [5a77617761c4f7a452c41d5a511750a251ff080a]
+
+ yaml: add parent() to node class and add test for it.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [af6863b77621b98c583507959d62f928c81f4518]
+
+ yaml: store parent node.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [d527d9aa5a33a2de32570f921eb5093a1c35fcc5]
+
+ yaml: Implement node::child() and add more test code.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [663b7e37b20b615533ca96df3d0b6e25023327af]
+
+ yaml: Re-design the tree walker to make it node-based.
+
+ The interface looks better & easier on the implementation.
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [b51ff7f8c25121ff66b7c5f18e4cbd6b2e0919c6]
+
+ yaml: add map_keys class to allow walking into map keys.
+
+ Still work in progress.
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [83f6e0b548fda73ae7ef15e7f2307bb0397b9cf7]
+
+ Add lldb as an option. lldb is the debugger to use on OSX.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [aebc931fa840332be2ea946a8f8bbdd2ad1eea2b]
+
+ yaml: start working on the tree walker class.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [5c0366df3782a7d655036935a9d39d328f57b717]
+
+ Get orcus-test.sh to run on OSX.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [79e483425b7efc6c6246995215e16fddbcbd2cbd]
+
+ yaml: Do actually store the document tree after parsing is done.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [87629a2cdfaba7e13c2f9d43f7de5831efcdfbda]
+
+ yaml: Get the rest of the value types stored & fix a crasher.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [81a0ae30786cdb946cd8a3b4ecb0edef543f5480]
+
+ yaml: start working on filling the document tree.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [61d6aaff430addae2332c3e4bcee1a2bd8eca07d]
+
+ yaml: Add the structures to store node values in the syntax tree.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [354b40c28dbf2ce7857fbb163528e962c3baa143]
+
+ yaml: start pushing tokens to the handler.
+
+ Still lots to do.
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [ada7cc51c20fa439028ccbaa14c8d4d0bfc623c2]
+
+ yaml: add skeleton handler methods.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [4cc1901181772baf6b763b79eba08ebe3bae4632]
+
+ yaml: clean up the debug statements.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [f393dcd1498b8a29964a3c138e7185b5ec3bdf66]
+
+ yaml: parse dictionary keys.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [fadb0fc7a131d5e964faacd85f10dfe9dd2531dc]
+
+ yaml: Handle quasi-scoping for inline list items.
+
+ e.g. Inline list item such as
+
+ - 1
+ - 2
+
+ is (for the purpose of parsing and validating) equivalent of
+
+ -
+ 1
+ -
+ 2
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [f82399423c28d6879c4c73f816d6d3bd4cdd29e9]
+
+ yaml: keep track of scope levels and detect invalid indent levels.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [549e9ebb74239a29c5a2b7326847fb8f5e1c903d]
+
+ yaml: work on parsing each line.
+
+ Not entirely sure if I'm on the right track, but we shall see...
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [3c1fe3db3e920e92b4a6c25f40a450d6427d9f3f]
+
+ yaml: Move these methods up to the base.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [315ffa5f48b02d978a38dc5ff423093501b05c26]
+
+ yaml: I need to catch the return value when trimming.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [ba67baf04bdf91dcd5be48583ec645d697d19361]
+
+ Add a test case for testing pstring::trim() for trimming only the tail.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [d24e058cbce443db43192949ba500cbcf66dc2c2]
+
+ yaml: skip inline comments.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [c1c24857e7fcca424170e581a6c38e17a706a0c1]
+
+ yaml: Parse the indent and the rest in each line.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [e0cd53463349a2159fe653ddb2d364e4c1233093]
+
+ yaml: set up the very first test.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [1c7e440ba644268524ba0b071802666bb4724f5e]
+
+ yaml: add skeleton parser and document tree classes.
+
+
+2015-09-14 Kohei Yoshida <kohei.yoshida@gmail.com> [6e9d2944eccb8b671a50f5e8b9a3f22c887d76cd]
+
+ yaml: very first sample file.
+
+
+2015-09-01 Markus Mohrhard <markus.mohrhard@googlemail.com> [fc6d762611429f956cdc3e7d7bc806e6c1bbf846]
+
+ add a few more tests for orcus::to_length
+
+ They now cover at least all units that are in the sorted_string_map.
+
+2015-09-01 Markus Mohrhard <markus.mohrhard@googlemail.com> [e36431cfb29869105cea9e7d3ed08956a920af6a]
+
+ switch from many if to mdds::sorted_string_map
+
+
+2015-09-01 Markus Mohrhard <markus.mohrhard@googlemail.com> [3b6be3f42c5f994df24df8f8a2b4f20ba2ecffac]
+
+ extract useful string handling code to own file
+
+
+2015-09-01 Markus Mohrhard <markus.mohrhard@googlemail.com> [31840c11421c03472d99f22006ed3f4e3ece43b6]
+
+ add more length units
+
+
+2015-08-30 Markus Mohrhard <markus.mohrhard@googlemail.com> [d96d5b2be3ad353fc95f3f956765b0cd59c328e3]
+
+ sort entries for sorted_string_map
+
+
+2015-08-30 Markus Mohrhard <markus.mohrhard@googlemail.com> [3539e1fdba84e75e1302a8ac6604187eede4d188]
+
+ API Change: import_styles::set_border_style should take an enum
+
+ This removes the requirement for the consumer to know what string might
+ need to be handled. There are no users for the old method anymore.
+
+ Bug#17
+
+2015-08-29 Markus Mohrhard <markus.mohrhard@googlemail.com> [fbdb2b40117e686d7207ae5b6814eb8d9ee97848]
+
+ add test for odf_helper
+
+
+2015-08-29 Markus Mohrhard <markus.mohrhard@googlemail.com> [c93ed7aea9a4ed72fd33f37db2cc3889aa9f1149]
+
+ improve odf cell style import test
+
+
+2015-08-29 Markus Mohrhard <markus.mohrhard@googlemail.com> [add284d0e2301385afad9a24b71fb08c3f90877a]
+
+ fix color conversion functions
+
+
+2015-08-29 Markus Mohrhard <markus.mohrhard@googlemail.com> [27041adc3398c0feecfaa3fcdc10424bec9dd553]
+
+ move more cell style import work into the cell style code
+
+ While we need the xf id for the cell code we should import the styles in
+ the cell style import code and not somewhere else.
+
+ This is a first step to limit the amount of cell style information that
+ we need to transport to other places.
+
+2015-08-28 Markus Mohrhard <markus.mohrhard@googlemail.com> [6b2f5210500b77c859cc4bb795f6838ffd15e499]
+
+ add a few more convenience functions to spreadsheet::import_styles
+
+
+2015-08-28 Markus Mohrhard <markus.mohrhard@googlemail.com> [a429c5d5c69d7bfb91b8f80975c85a0ddf641111]
+
+ provide infrastructure for odf styles import tests
+
+
+2015-08-28 Markus Mohrhard <markus.mohrhard@googlemail.com> [9907f46e9fdddc205e5f2cdb09463e26058acf60]
+
+ prevent double delete in new import_ods::read_styles
+
+
+2015-08-28 Markus Mohrhard <markus.mohrhard@googlemail.com> [e4b12f7ea557b362a60f7efd8b48fe8569583468]
+
+ also accept office:styles as parent of style:style
+
+
+2015-08-28 Markus Mohrhard <markus.mohrhard@googlemail.com> [afeaa6866219d26b1279c13e149762dd7ab76a06]
+
+ it makes more sense to use the import_styles interface directly
+
+
+2015-08-28 Markus Mohrhard <markus.mohrhard@googlemail.com> [1205755863848681070f5318d9fc3a96bd9d0419]
+
+ add way to import styles part of odf file
+
+
+2015-08-28 Markus Mohrhard <markus.mohrhard@googlemail.com> [06b507fb7c0dc580cc957d499a1346cbdc17eb85]
+
+ refactor auto styles code to handle real styles as well
+
+
+2015-08-27 Markus Mohrhard <markus.mohrhard@googlemail.com> [24483fcb096f090bc58421b484724835d64566b5]
+
+ set the fill id to the odf_style struct
+
+
+2015-08-27 Markus Mohrhard <markus.mohrhard@googlemail.com> [0160ffc4f46b0266ebd7d1850b1b741d59c1ccf0]
+
+ import optional parent-style-name to keep hierarchy
+
+
+2015-08-27 Markus Mohrhard <markus.mohrhard@googlemail.com> [4ae0e8e5cc59371e6a11341073f0a6581f79eb94]
+
+ add interface to set parent style name
+
+ That allows us to import the style inheritance correctly.
+
+2015-08-27 Markus Mohrhard <markus.mohrhard@googlemail.com> [fac0f57a5a0eb0279ac7be749795368225c55f0a]
+
+ import coll background color in styles
+
+
+2015-08-27 Markus Mohrhard <markus.mohrhard@googlemail.com> [d91463fc088c8a9a4391c7bfbaab23f9a37bea5c]
+
+ import font color in odf styles import
+
+
+2015-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [e52d0793a4ee1fc987527def70310fa30b5a9e73]
+
+ Make sure we don't use singular iterator here.
+
+ With this fix, 'make check' passes on OSX.
+
+2015-08-22 Kohei Yoshida <kohei.yoshida@gmail.com> [1e40245cce1b5e0da093d78e3ba8fb879f224b85]
+
+ Get the python tests to run on OSX.
+
+ AM_TESTS_ENVIRONMENT is too clever for me to figure out how to use
+ properly. Let's just handle the test environment setup in a separate
+ script for ease of maintenance.
+
+2015-08-22 Kohei Yoshida <kohei.yoshida@gmail.com> [bdd80174f2e574347daa64f603658e27e0aee539]
+
+ Fix incorrectly exported symbol for the python module.
+
+
+2015-08-18 Kohei Yoshida <kohei.yoshida@gmail.com> [678c30e5d2ee145022decb43635dc9cd0db6d1f2]
+
+ Handle --enable-python configure switch properly.
+
+
+2015-08-06 Kohei Yoshida <kohei.yoshida@gmail.com> [55287b9ef56ebc3f6162d46aadef2c533a8f1aea]
+
+ Add these header files to the list.
+
+
+2015-08-06 Kohei Yoshida <kohei.yoshida@gmail.com> [83ddb360f26fb1c5caaffacc59f8a78ba7c83cd3]
+
+ Added JSON parser.
+
+
+2015-08-04 Kohei Yoshida <kohei.yoshida@gmail.com> [6703a8ffa93a7e3f4286da9e072fea3707c6d49a]
+
+ And let's not forget to add these files.
+
+
+2015-08-04 Kohei Yoshida <kohei.yoshida@gmail.com> [0e3689c0bccb745b21b4eab11d8453a87f3dba39]
+
+ Add test case for resolving JSON references.
+
+
+2015-08-04 Kohei Yoshida <kohei.yoshida@gmail.com> [b93424a5a9debbafcf95caf15ef4235e70381975]
+
+ Define default namespace for the XML generated from orcus-json.
+
+ Let's use "http://schemas.kohei.us/orcus/2015/json" as the identifier.
+
+2015-08-03 Kohei Yoshida <kohei.yoshida@gmail.com> [1c89bd04858daa4172f791b6a1f0943fa883fca2]
+
+ Let's not use a global variable here.
+
+
+2015-08-03 Kohei Yoshida <kohei.yoshida@gmail.com> [aefb17247210f67df1b3e2629d1620129a0eb00d]
+
+ json: Correctly throw a parse_error in incorrect root value.
+
+ The root value must be either an array or an object.
+
+2015-08-02 Kohei Yoshida <kohei.yoshida@gmail.com> [0b0767ca64bd3e32416dc19d1b6be0eaa2a97e68]
+
+ Let's all use the variant of load_file_content() that returns a string.
+
+
+2015-08-02 Kohei Yoshida <kohei.yoshida@gmail.com> [4969978041fbd9f0eed02db29657235013f5d1fb]
+
+ json: Re-organize the unit test code and validate the JSON doc contents.
+
+
+2015-08-02 Kohei Yoshida <kohei.yoshida@gmail.com> [4e48cf08a2103079be91516c9b79d95626c5db6b]
+
+ Re-organize the structure of JSON test files.
+
+
+2015-08-02 Kohei Yoshida <kohei.yoshida@gmail.com> [369bdbfdcc0cc2e9dd23307db5bd4eadfaf0db15]
+
+ json: Additional output format for content verification during unit tests.
+
+
+2015-08-02 Kohei Yoshida <kohei.yoshida@gmail.com> [f69da550c8bbd2af65fc3bd91860c3193921c84f]
+
+ Refactor dom_tree to allow it to load from an XML stream directly.
+
+
+2015-08-02 Kohei Yoshida <kohei.yoshida@gmail.com> [e776befeb3f88ea2c84ee35edc56ba15bb44380b]
+
+ Prefer using std::unique_ptr for pimpl.
+
+
+2015-08-02 Kohei Yoshida <kohei.yoshida@gmail.com> [1cd8c4cb5a109867d53825022ed5ade3137dfab8]
+
+ Return std::unique_ptr directly.
+
+
+2015-08-02 Kohei Yoshida <kohei.yoshida@gmail.com> [774d0054bec70952721abe609ceac58634fca030]
+
+ Add a semi-complex example JSON file.
+
+
+2015-07-31 Kohei Yoshida <kohei.yoshida@gmail.com> [d02c9f1d1e0709ca654ed3cd680786032f46d351]
+
+ Remove some duplicated code blocks.
+
+
+2015-07-31 Kohei Yoshida <kohei.yoshida@gmail.com> [ed6f501adfa715c02d03cd8ea2497088d3b293c6]
+
+ Better JSON dump output.
+
+
+2015-07-31 Kohei Yoshida <kohei.yoshida@gmail.com> [eedb2ed13c898b3441fafa6ede62b5cf9db4c801]
+
+ Fix the build error.
+
+
+2015-07-31 Kohei Yoshida <kohei.yoshida@gmail.com> [466ba16fae07a2957f269c0200e6e2a9f07de7e6]
+
+ Add an option to resolve JSON references.
+
+ External files only for now.
+
+2015-07-31 Kohei Yoshida <kohei.yoshida@gmail.com> [893aeecd8b3eca4e28cdc7af9a116ebb16be8502]
+
+ No need to escape a forward-slash when dumping a JSON output.
+
+
+2015-07-30 Kohei Yoshida <kohei.yoshida@gmail.com> [be58de7b1696dce83a44b69ccc2ea66fec0b92e2]
+
+ Do the same when dumping to XML.
+
+
+2015-07-30 Kohei Yoshida <kohei.yoshida@gmail.com> [688aefe33fbffddb44f0e813f52864314fdd5b2c]
+
+ Add option to preserve JSON object's original key ordering.
+
+ It's internally configurable, but the option is not yet exposed to
+ the command line tool yet.
+
+2015-07-30 Kohei Yoshida <kohei.yoshida@gmail.com> [87c828625768284fdf29ead6dffd2d935096b52c]
+
+ Have orcus-json support the JSON output as well.
+
+ That basically parses an input JSON file and generates a "pretty-fied"
+ JSON file of the same content.
+
+2015-07-29 Kohei Yoshida <kohei.yoshida@gmail.com> [0001613070365ef7fec77297eb8ec66bb5e4e38b]
+
+ Dump the JSON content as XML for real.
+
+
+2015-07-29 Kohei Yoshida <kohei.yoshida@gmail.com> [1616f3b331e415ff836ca025e33f8021f6055a2a]
+
+ Add orcus-json executable & handle command-line arg parsing.
+
+
+2015-07-25 Kohei Yoshida <kohei.yoshida@gmail.com> [648a7848692ae4fb78420f313848194dea6684d7]
+
+ json: Add javadoc to its methods.
+
+
+2015-07-25 Kohei Yoshida <kohei.yoshida@gmail.com> [9f0007d083d73631d975c2ae7d1bf7ba3230eeed]
+
+ json: Add dump() to json_document_tree.
+
+ Unlike the method of the same name in css_document_tree, this one
+ returns a string rather than directly dumping it to std::cout.
+
+2015-07-25 Kohei Yoshida <kohei.yoshida@gmail.com> [0bc7dea963977bb85954e53709d6410e5d71aeb8]
+
+ json: Properly dump string values.
+
+
+2015-07-25 Kohei Yoshida <kohei.yoshida@gmail.com> [dd7679164d52b583ea9b3ccb2fac87cdd1351a5e]
+
+ json: remove debug statements.
+
+
+2015-07-25 Kohei Yoshida <kohei.yoshida@gmail.com> [7ff1ea7289e4094cf57785d6ababec0252c1ec18]
+
+ json: Handle nested arrays and objects & re-enable all tests again.
+
+
+2015-07-25 Kohei Yoshida <kohei.yoshida@gmail.com> [7a483f799bcc08e8a08c94d1be702924047b7ea3]
+
+ json: Store object nodes.
+
+
+2015-07-24 Kohei Yoshida <kohei.yoshida@gmail.com> [6dc4c84bd0ef44fe59b1cdf4de609d7ad4d8742b]
+
+ json: the crasher was due to object slicing. Fixed now.
+
+
+2015-07-24 Kohei Yoshida <kohei.yoshida@gmail.com> [b247287ac04e846864db32731da6c25a17ae9742]
+
+ json: work on building the json model as we parse.
+
+ It crashes during the dump wrt string objects. I need to look into
+ it.
+
+2015-07-24 Kohei Yoshida <kohei.yoshida@gmail.com> [05bfc22f7af08e8358561c03cab9c09786327659]
+
+ Support debug commands for the test binaries.
+
+
+2015-07-23 Kohei Yoshida <kohei.yoshida@gmail.com> [ffdda410c22c91cd199421e4265fb9675138bc0a]
+
+ json: Add data structures for housing json elements.
+
+
+2015-07-22 Kohei Yoshida <kohei.yoshida@gmail.com> [0e8f08d888230fd594b662fb184d40c908cd6689]
+
+ json: another invalid JSON example ...
+
+ that doesn't begin with either one of 'f', 't' or 'n'.
+
+2015-07-22 Kohei Yoshida <kohei.yoshida@gmail.com> [89f3dedb6e9d7ad288dc20441e0055537c73a7f5]
+
+ json: 2 more test cases for nested array/object.
+
+ They both happily pass.
+
+2015-07-20 Kohei Yoshida <kohei.yoshida@gmail.com> [349198de3f53cf3870af9f35bd99273eccb74c51]
+
+ json: add test to make sure invalid JSON strings rightly fail.
+
+
+2015-07-20 Kohei Yoshida <kohei.yoshida@gmail.com> [e9fe1046f88000a03ea4079b9609e51d987bba33]
+
+ json: use different callback for object key string.
+
+
+2015-07-20 Kohei Yoshida <kohei.yoshida@gmail.com> [db6653d9d79fcb810ce75e20eaabf71b3c927c39]
+
+ json: hide these methods that are now only used in the impl detail.
+
+
+2015-07-20 Kohei Yoshida <kohei.yoshida@gmail.com> [f99704b2609a19d9a95f4f6186b193119fb8ce91]
+
+ json: refactor string parsing to make it handler-independent.
+
+
+2015-07-20 Kohei Yoshida <kohei.yoshida@gmail.com> [d73fe41145d3f944e77b73a5a8a746e3ad0b04a1]
+
+ json: first stab at parsing objects. I'm not done yet.
+
+
+2015-07-17 Kohei Yoshida <kohei.yoshida@gmail.com> [7ec146f4fbd4c9f866f35e7243954d0de492ce90]
+
+ json: parse null.
+
+
+2015-07-17 Kohei Yoshida <kohei.yoshida@gmail.com> [782e804808c8ee7b70638bb14c726059eb75ef53]
+
+ Don't forget to skip blanks at the end of each handler.
+
+
+2015-07-17 Kohei Yoshida <kohei.yoshida@gmail.com> [1cdbbd8d083386f5175dc72de980b05f23641ddd]
+
+ json: Parse numbers.
+
+
+2015-07-17 Kohei Yoshida <kohei.yoshida@gmail.com> [533953b30526e9a6eb6bc027d880ac98158874b1]
+
+ Move the logic of determining the escape char type to parser_base.
+
+ and use it in two places.
+
+2015-07-17 Kohei Yoshida <kohei.yoshida@gmail.com> [35b32b29c421dd99dc909f30de0cf1c82f527f06]
+
+ Another string pattern to make sure this still works.
+
+
+2015-07-16 Kohei Yoshida <kohei.yoshida@gmail.com> [bfbbf0449a8f0b71b0b53d74ce007265c86dd032]
+
+ json: handle string in the parser.
+
+
+2015-07-10 Kohei Yoshida <kohei.yoshida@gmail.com> [e2b676844a1ad9b2ab42517f734c97bb79824233]
+
+ Each handler should advance to the next non-blank character upon exit.
+
+
+2015-07-10 Kohei Yoshida <kohei.yoshida@gmail.com> [06f99db8b8cb1d322c1d964c3cf2004547928bc0]
+
+ Actually this shouldn't be here.
+
+
+2015-07-10 Kohei Yoshida <kohei.yoshida@gmail.com> [9c8ca5187e41bf5a0dd6e27be1d1db3245f65872]
+
+ Successfully parse basic1.json.
+
+
+2015-07-10 Kohei Yoshida <kohei.yoshida@gmail.com> [899ef2c7caa3db0e9bb78e46e8f0f9678e48b039]
+
+ Set up first JSON test case. For now it doesn't test it for real.
+
+
+2015-07-10 Kohei Yoshida <kohei.yoshida@gmail.com> [417e2bc58494add30280119df15474ba3e70e958]
+
+ More reorganization of all available tests.
+
+ And make them reachable from orcus-test.sh & move one test from
+ src/common to src/parser/common.
+
+2015-07-10 Kohei Yoshida <kohei.yoshida@gmail.com> [7c513c1b335b855e775ac06d9935d54c85ae72db]
+
+ We don't need this anymore.
+
+
+2015-07-10 Kohei Yoshida <kohei.yoshida@gmail.com> [e78d9bbb48a028257c3aa97ba4e242c7f3629761]
+
+ Add parser tests to the mix.
+
+
+2015-07-10 Kohei Yoshida <kohei.yoshida@gmail.com> [85e4a5a4e283817f8a9827776927afe51e1761bb]
+
+ Consolidate all test scripts into orcus-test.sh.
+
+
+2015-07-10 Kohei Yoshida <kohei.yoshida@gmail.com> [63d306f2b761a9bb7f7f26a5efaf69a89dc98f85]
+
+ Add skeleton document tree storage for JSON documents.
+
+ And an empty test file for it.
+
+2015-07-10 Kohei Yoshida <kohei.yoshida@gmail.com> [974c03f063f449f55eb78720088b6f44724f8b29]
+
+ Copy n paste error.
+
+
+2015-07-09 Kohei Yoshida <kohei.yoshida@gmail.com> [b852c13b37e0232455a1a53feead1048326018e6]
+
+ Set up a skeleton json_parser to fill in the blanks later.
+
+
+2015-07-09 Kohei Yoshida <kohei.yoshida@gmail.com> [40f21ffc8b342b40361a7f639c503d9efff21799]
+
+ Simplify a bit.
+
+
+2015-07-09 Kohei Yoshida <kohei.yoshida@gmail.com> [5b46b909c0fb57586ac964eadc9bdb1aacb086c9]
+
+ Share skip_blanks() implementations.
+
+ Here, what is considered a "blank" character differs whether it's a
+ csv or css.
+
+2015-07-09 Kohei Yoshida <kohei.yoshida@gmail.com> [2e4b7ef235d21477523cd49062376c8652f0ac09]
+
+ Update slickedit project file.
+
+
+2015-07-09 Kohei Yoshida <kohei.yoshida@gmail.com> [3d63775509749b7b3151706d7f3f8fc639702f13]
+
+ Add orcus::parser_base as the base for css and csv's parser_base.
+
+ sax::parser_base could in theory use this as its base class, but that
+ would take some amount of reworking since that one does a lot more
+ stuff...
+
+2015-07-09 Kohei Yoshida <kohei.yoshida@gmail.com> [4bc2e8e5a233b14302f2a6e19fc9aab8d919e435]
+
+ Turn databar_axis_t into enum class. This one is not used anywhere yet.
+
+
+2015-07-09 Kohei Yoshida <kohei.yoshida@gmail.com> [07dcbbb132fb7ef0623ff2cc6da971a17bec66c2]
+
+ Turn condition_date_t into enum class.
+
+
+2015-07-09 Kohei Yoshida <kohei.yoshida@gmail.com> [9ddccb082774cc6b65af177b238e8aef0817b901]
+
+ Turn condition_type_t into enum class.
+
+
+2015-07-09 Kohei Yoshida <kohei.yoshida@gmail.com> [a573de373f5c311bf456658b991a510a62be78e7]
+
+ Turn condition_operator_t into enum class.
+
+
+2015-07-09 Kohei Yoshida <kohei.yoshida@gmail.com> [6c47347fc5cf38956ed190573b444506534f8747]
+
+ Turn conditional_format_t into enum class.
+
+
+2015-07-09 Kohei Yoshida <kohei.yoshida@gmail.com> [485b7eedfaf507b26e838ce4ae5497f845da89e5]
+
+ Turn totals_row_function_t into enum class.
+
+
+2015-07-09 Kohei Yoshida <kohei.yoshida@gmail.com> [a31ed954056a3f443bcc2a9aa7fc140e9ce81be1]
+
+ Turn four more enum types into enum class.
+
+
+2015-07-08 Kohei Yoshida <kohei.yoshida@gmail.com> [c7a45ee25d5d211a36f4c885fe17cfd56772c902]
+
+ Turn formula_t into enum class.
+
+
+2015-07-08 Kohei Yoshida <kohei.yoshida@gmail.com> [4bc04f7601d12cc95685a9042227535a8b023a71]
+
+ Turn formula_grammar_t into enum class.
+
+
+2015-07-08 Kohei Yoshida <kohei.yoshida@gmail.com> [62dc806d5defae09e5d88ebeb647d03dc3095e45]
+
+ Turn border_direction_t into enum class.
+
+
+2015-07-08 Kohei Yoshida <kohei.yoshida@gmail.com> [4212671bd019391c3ed2721ec194a18d03581ac9]
+
+ Turn keyword_type into enum class.
+
+
+2015-07-08 Kohei Yoshida <kohei.yoshida@gmail.com> [cc85effc33a789ace0a800f4b8d026df854b4e85]
+
+ Turn dom_tree::node_type into enum class.
+
+
+2015-07-08 Kohei Yoshida <kohei.yoshida@gmail.com> [f7cdfd67c1e25f16f440d451c7f2f3a97a6d5105]
+
+ Turn css::property_value_t into enum class.
+
+
+2015-07-08 Kohei Yoshida <kohei.yoshida@gmail.com> [8bdf5e70b58b1e6b89b46724368649e3a4793146]
+
+ Turn css::property_function_t into enum class.
+
+
+2015-07-08 Kohei Yoshida <kohei.yoshida@gmail.com> [5b87e2b1ea4b4e96803d9bb353167fea32c6c32b]
+
+ Turn css::combinator_t into enum class.
+
+
+2015-07-08 Kohei Yoshida <kohei.yoshida@gmail.com> [1b286b6901cc04dbe9ff93596663a02365b051e9]
+
+ Turn format_t into enum class.
+
+
+2015-07-08 Kohei Yoshida <kohei.yoshida@gmail.com> [3cf0ef74708554642ef159da9c8cb1b5fa25ccb1]
+
+ Turn length_unit_t into enum class.
+
+
+2015-07-07 Kohei Yoshida <kohei.yoshida@gmail.com> [27fdcb786666e19ea147180820f49acbc17bd694]
+
+ Use the master branch of mdds.
+
+
+2015-07-01 Kohei Yoshida <kohei.yoshida@gmail.com> [67494ab53550b483beb25c1aab4c714dcebd42f3]
+
+ master now requires ixion master branch build.
+
+ Mostly the new C++11 stuff.
+
+2015-06-30 Kohei Yoshida <kohei.yoshida@gmail.com> [e66e238235a94fca5642b88c94590daab4ad87eb]
+
+ Polish it a bit.
+
+ Also, Remove orcus specific bits as it will be copied over to ixion
+ later.
+
+2015-06-29 Kohei Yoshida <kohei.yoshida@gmail.com> [938ce2ce065e61db439c85628678b5bc7fe8eacf]
+
+ Use full file path.
+
+
+2015-06-29 Kohei Yoshida <kohei.yoshida@gmail.com> [03d49518d2e97760576d58a000fc7feacbb14b82]
+
+ Update the slickedit project file.
+
+
+2015-06-29 Kohei Yoshida <kohei.yoshida@gmail.com> [a339efd850090a83be026b4f2c42716d224747f4]
+
+ python: implement orcus.info() for real.
+
+
+2015-06-29 Kohei Yoshida <kohei.yoshida@gmail.com> [2cf323993b14c863ac707d80b452962daf11f4cc]
+
+ Add license header.
+
+
+2015-06-25 Kohei Yoshida <kohei.yoshida@gmail.com> [2d9b34de14a1df4192cce8e287211e6b3a863f87]
+
+ Initial minimalist hook for adding python binding.
+
+ We now just need to add more beef to it.
+
+2015-06-23 Kohei Yoshida <kohei.yoshida@gmail.com> [f8b823718fae8ddde6fe1e3173b21336689bed3a]
+
+ Remove the final boost::unordered_map.
+
+ The second one could not be replaced with std::unordered_map due to
+ build error. std::map is fine for now.
+
+2015-06-23 Kohei Yoshida <kohei.yoshida@gmail.com> [1aababca07cab7453e76203fd3e649f3e3414ba9]
+
+ Replace boost::ptr_map with std::map and std::unique_ptr.
+
+
+2015-06-23 Kohei Yoshida <kohei.yoshida@gmail.com> [41e7551b0d136f93f79bd47939c377dcbbbfe2e4]
+
+ Replace boost::ptr_vector with std::vector.
+
+
+2015-06-23 Kohei Yoshida <kohei.yoshida@gmail.com> [eb43d1e81df4f7cf63520b57cbc031aff626c2c5]
+
+ No more boost's smart pointers.
+
+
+2015-06-23 Kohei Yoshida <kohei.yoshida@gmail.com> [040338e03fdca297e06d6a29da8ce9c7187f1a54]
+
+ Replace boost::unordered_* with std ones & remove boost::noncopyable.
+
+
+2015-06-20 Kohei Yoshida <kohei.yoshida@gmail.com> [67697b9e88cb7ebff457c88e5fa82b21880c8516]
+
+ Replace boost::scoped_ptr with std::unique_ptr in liborcus.
+
+
+2015-06-20 Kohei Yoshida <kohei.yoshida@gmail.com> [1f12d182ca0fa4f3f0fd017cce551d8fdc30a1a2]
+
+ Remove use of boost in orcus-spreadsheet-model.
+
+
+2015-06-19 Kohei Yoshida <kohei.yoshida@gmail.com> [f4eda4b4bf7c675494768d3981abeeb9cd4811f5]
+
+ Reduce use of boost containers from orcus-parser.
+
+ The stuff that handles base64 needs to stay because there is no std
+ equivalent for it (that I know of).
+
+2015-06-18 Kohei Yoshida <kohei.yoshida@gmail.com> [ef2b46ff05ed732f714691f5301d8e214b1aed77]
+
+ Add 0.9.2 download links.
+
+
+2015-06-13 Kohei Yoshida <kohei.yoshida@gmail.com> [45f6294f9a167610130142843cd7a578e5da75fe]
+
+ Turns out that nobody uses string_hash and string_equal_to.
+
+
+2015-06-13 Kohei Yoshida <kohei.yoshida@gmail.com> [6d13bf3b04f35fc3231f2543efa4fb2344ce5338]
+
+ Remove boost::ptr_vector usage from the public headers.
+
+
+2015-06-13 Kohei Yoshida <kohei.yoshida@gmail.com> [ef2396f303938e13cdcad1abfef300ed43674a28]
+
+ boost::unordered_* to std::unordered_*.
+
+
+2015-06-11 David Tardon <dtardon@redhat.com> [514e49810afe47b90bf430d2b23b3b22e777cda7]
+
+ add more stuff to .gitignore
+
+
+2015-06-11 David Tardon <dtardon@redhat.com> [0ab64ddae791db1d412c8560e4cf1fa140852c2c]
+
+ remove unused m4 files
+
+
+2015-06-11 David Tardon <dtardon@redhat.com> [9a17647fcb33b96e1d7246ddaf05da91fb2a57c3]
+
+ adapt to boost.m4
+
+
+2015-06-11 David Tardon <dtardon@redhat.com> [f717048ac19c6a4a4c9a1be41ad8b5385ff6c547]
+
+ allow to force-set boost libs
+
+
+2015-06-09 Kohei Yoshida <kohei.yoshida@gmail.com> [e104bb8f01215821650d67d6e9a3776d489a72e5]
+
+ Use pimpl for string_pool and hide boost use from its public header.
+
+
+2015-06-09 Kohei Yoshida <kohei.yoshida@gmail.com> [e78a0562b336364c5450c024c851fe100b2df2b4]
+
+ default_deleter is no longer used.
+
+
+2015-06-09 Kohei Yoshida <kohei.yoshida@gmail.com> [7b079eecfd9f06f5a64d9d1d95ea1e3325ada71b]
+
+ Prefer std::unique_ptr now that we use C++11.
+
+
+2015-06-09 Kohei Yoshida <kohei.yoshida@gmail.com> [f414a2caab0a337aada8b10c55c2591cbb14233f]
+
+ Hide the cell buffer data member (and ptr_vector use) from the header.
+
+ Incidentally, I'm using std::unique_ptr for the pimpl idiom. Due to the
+ way C++11 compilers work, the detail of which are well explained in Item 22
+ of Effective Modern C++, we need to declare (or delete) all special member
+ methods explicitly in the header, else the code wouldn't compile.
+
+2015-06-09 Kohei Yoshida <kohei.yoshida@gmail.com> [270e1c37b5bee48bc8d19dd744bf23f0ccdbee04]
+
+ Set the next minor version to 0.11.0.
+
+
+2015-06-08 David Tardon <dtardon@redhat.com> [2cee53197e98793aee318339efd25529fe883148]
+
+ correctly implement assignment of CSS properties
+
+ This fixes unit test failure on some platforms, e.g., ppc64.
+
+ Sigh, if the union were not anonymous, it would be possible to use std::swap
+ on it...
+
+2015-06-07 Kohei Yoshida <kohei.yoshida@gmail.com> [28c34415a4422611b24ad6c051843682a3852bd6]
+
+ Fix wrapper scripts.
+
+
+2015-06-05 David Tardon <dtardon@redhat.com> [063941c6034f586b894a90f40b9d61a6ffb27d1e]
+
+ disable opt. in debug build
+
+
+2015-06-04 David Tardon <dtardon@redhat.com> [26d33d7cfd93b22e2fa13e6a3e28d133619948cf]
+
+ these functions are implemented in liborcus
+
+
+2015-06-03 David Tardon <dtardon@redhat.com> [9bd36bfb207b5edced90c4e4f5e8fb4fa08ebb19]
+
+ __ORCUS_BUILDING_DLL is set conditionally
+
+
+2015-06-03 David Tardon <dtardon@redhat.com> [718b1adfe9c327e06b1ab796c5cd9805db63c9b3]
+
+ mark more symbols as public
+
+
+2015-06-02 David Tardon <dtardon@redhat.com> [3e08d2264984b8d5227e22c7089f00f8f2e36513]
+
+ fix dllexport decls
+
+
+2015-05-17 Kohei Yoshida <kohei.yoshida@gmail.com> [572a14285bdac90d51e1033d314713333e9734bf]
+
+ Add heading for older releases.
+
+
+2015-05-17 Kohei Yoshida <kohei.yoshida@gmail.com> [e560c45921fd3897f4256698cc60e52f10393b1b]
+
+ Better formatting.
+
+
+2015-05-17 Kohei Yoshida <kohei.yoshida@gmail.com> [d8dfcb519339fc300a5ecd518ab71b4fce56c570]
+
+ Add 0.9.1 to the download section.
+
+
+2015-05-17 Kohei Yoshida <kohei.yoshida@gmail.com> [a305e88024d54a5d02d596694618cb05bb69bb08]
+
+ Up the version to 0.9.1.
+
+
+2015-05-04 David Tardon <dtardon@redhat.com> [da5d99c57ecdf54b40c248a109969021b70f5a38]
+
+ do not let main() throw
+
+
+2015-05-01 Kohei Yoshida <kohei.yoshida@gmail.com> [cb515746761b909052d0d2473f96a3f3570dd3cf]
+
+ Here too.
+
+
+2015-05-01 Kohei Yoshida <kohei.yoshida@gmail.com> [5f88a7a772d792306e7adb45efa44944a5951d41]
+
+ Define these macros to please MSVC.
+
+ Only relevant on Windows, apparently.
+
+2015-04-30 Kohei Yoshida <kohei.yoshida@gmail.com> [5c3078a9d5d78e6d747ddab9625f12d7e4996343]
+
+ These zip related classes are now in orcus-parser.
+
+
+2015-04-26 Kohei Yoshida <kohei.yoshida@gmail.com> [72aa9320317a50fe0a336cf6e10e7f28da4e1285]
+
+ Remove MDDS_CFLAGS from Makefile.am; it is now defined in configure.ac.
+
+
+2015-04-26 Markus Mohrhard <markus.mohrhard@googlemail.com> [002f8278fe44988be4701623d0467874f28ec4a8]
+
+ we need MDDS_CFLAGS as well in the CXXFLAGS
+
+
+2015-04-26 Kohei Yoshida <kohei.yoshida@gmail.com> [7ad405e7438a6f62b4e1f93520c9a493756a8504]
+
+ cell_buffer is now in the orcus-parser.
+
+
+2015-04-23 Kohei Yoshida <kohei.yoshida@gmail.com> [b40624ea24a2b3fe7a09471ae211fde0b78df248]
+
+ Add mdds cflags for the parser for use of mdds/sorted_string_map.hpp.
+
+
+2015-04-18 Kohei Yoshida <kohei.yoshida@gmail.com> [ad2c11d03cb41c8a74f71fadcff65476403e9915]
+
+ Add download URL to 0.9.0.
+
+
+2015-04-18 Kohei Yoshida <kohei.yoshida@gmail.com> [e46ee01f3e03d660de914397e73f2c48acb28c58]
+
+ These test files are not in the repository.
+
+
+2015-04-18 Kohei Yoshida <kohei.yoshida@gmail.com> [d438b16dcafd066626b0d31daeca6e6b2709602f]
+
+ Fix all Makefile.am to get 'make distcheck' to pass.
+
+
+2015-04-11 Kohei Yoshida <kohei.yoshida@gmail.com> [e57d8a860cbd07438cc6fc0653c5fd7b0f35e69a]
+
+ Write test for sax_token_parser's handling of raw element names.
+
+
+2015-04-10 Kohei Yoshida <kohei.yoshida@gmail.com> [53a2b2673b6ab432ee6a5d747901f594d49223f8]
+
+ Rename to sax_token_handler_wrapper_base.
+
+
+2015-04-10 Kohei Yoshida <kohei.yoshida@gmail.com> [e7fa0d8c02cdce11eacb47639fbb11bb5c42fe43]
+
+ No need to keep reference to ns_cxt in the token parser.
+
+
+2015-04-10 Kohei Yoshida <kohei.yoshida@gmail.com> [0e96d65cc7cca308cb559b383dbd61168b9b71b9]
+
+ Remove the _Token template parameter and move some stuff out of template.
+
+
+2015-04-09 Kohei Yoshida <kohei.yoshida@gmail.com> [847501f3d3ec54538a2252ab92e3f747f72314fa]
+
+ Set up test framework for sax_token_parser.
+
+
+2015-04-09 Kohei Yoshida <kohei.yoshida@gmail.com> [312554a4b97602bb8d40bdbe54652fb356a307de]
+
+ Move tokens.cpp in the slickedit project file.
+
+
+2015-04-09 Markus Mohrhard <markus.mohrhard@googlemail.com> [b73f777a45dfe0dc8601016145932c8c4bddf907]
+
+ use c++11 for orcus
+
+ This allows us to use some simple C++11 features.
+
+2015-04-09 Kohei Yoshida <kohei.yoshida@gmail.com> [1f3adc69145e47348d9a6a90239f28f1e5123193]
+
+ Now all sax parser family belongs to orcus-parser.
+
+ This makes more sense.
+
+2015-04-09 Kohei Yoshida <kohei.yoshida@gmail.com> [ae4906773e2b3729236e358d7e04d7f00e8ca631]
+
+ Move tokens.cpp from liborcus to parser.
+
+
+2015-04-09 Kohei Yoshida <kohei.yoshida@gmail.com> [b205d8c8334241c988f179e495e9c6ef0dcee7a5]
+
+ These belong to orcus-parser.
+
+
+2015-04-09 Kohei Yoshida <kohei.yoshida@gmail.com> [9301016cebb58cc4212744fa832fd482226d18fe]
+
+ Store raw element/attribute string pointer along with the token.
+
+ Useful in presence of elements or attributes that are not on the master
+ token list.
+
+2015-04-08 Kohei Yoshida <kohei.yoshida@gmail.com> [08ff1da6575d9c9d07c5f3a0db76198ce7680faa]
+
+ It's <?... ?> not <?... >
+
+
+2015-04-07 Kohei Yoshida <kohei.yoshida@gmail.com> [8d3f0f8f5cf8ea7aa3344b57c2e2fbc2c602d0ca]
+
+ Annotate the skeleton handler for sax_token_parser.
+
+
+2015-04-07 Kohei Yoshida <kohei.yoshida@gmail.com> [7dca7894bddcb721d8560d7911f868763d8e0e67]
+
+ Annotate the sax skeleton handler methods.
+
+
+2015-04-07 Kohei Yoshida <kohei.yoshida@gmail.com> [aa7ede2c6995c9458dfe1c9f5eda6cef092954d7]
+
+ Add skeleton handler for sax_ns_parser.
+
+
+2015-04-07 Kohei Yoshida <kohei.yoshida@gmail.com> [9e740396e74804abb0474c4a5443291ad8a3ae7f]
+
+ Add Download section to README.
+
+
+2015-04-06 Kohei Yoshida <kohei.yoshida@gmail.com> [dc758344d79685a4a60d08875aed7dd079a7755c]
+
+ Add skeleton handler for sax_token_parser.
+
+
+2015-04-06 Kohei Yoshida <kohei.yoshida@gmail.com> [910670f6dd9be9083d27eb1478faf893a69f6bbd]
+
+ Take these example handlers out of orcus namespace.
+
+ Since they are for external code, they shouldn't be in orcus namespace.
+
+2015-04-06 Kohei Yoshida <kohei.yoshida@gmail.com> [4abcca164bdfc2f48346162b2835ff6cc47d87cd]
+
+ Add skeleton handler for sax_parser.
+
+
+2015-04-04 Kohei Yoshida <kohei.yoshida@gmail.com> [e9517a147cb7bf9b768561c47175d4797f1dd0e3]
+
+ Add a csv_parser handler skeleton too (and a test for it).
+
+
+2015-04-04 Kohei Yoshida <kohei.yoshida@gmail.com> [6605f84f9e09a8cbdd02e7e2d571f62ce072b5f3]
+
+ Add css_parser handler skeleton code to copy from.
+
+ This is for the user of css_parser to copy this handler class to use
+ as the starting point for his/her own handler. The test ensures that
+ the handler skeleton is correct and useable.
+
+ This skeleton code is intentionally released under the MIT/X11 license.
+
+2015-04-02 Kohei Yoshida <kohei.yoshida@gmail.com> [fc5d99a02e20e4eb43e25d9318fdd8af207aa44a]
+
+ Update AUTHORS.
+
+
+2015-04-02 Kohei Yoshida <kohei.yoshida@gmail.com> [6e139be58619476890fe1af347ae838eb0dfd6aa]
+
+ Mention about the low-level parsers.
+
+
+2015-04-02 Kohei Yoshida <kohei.yoshida@gmail.com> [b4e61f50356a75a67f7f18b1242f90019dd42ce6]
+
+ Add markup.
+
+
+2015-04-02 Kohei Yoshida <kohei.yoshida@gmail.com> [365c38ba6d95cfbeaa22ffb2ca6c02bf07b6e4e7]
+
+ Rename README to add .md extension.
+
+
+2015-04-02 Kohei Yoshida <kohei.yoshida@gmail.com> [4c8af0a142a2f35bfff0f6de318dd01ffcd8510d]
+
+ Disable debug statements.
+
+
+2015-04-02 Kohei Yoshida <kohei.yoshida@gmail.com> [afe23f3920791d708212448f9ab99c39816b65c0]
+
+ Add test case for HSLA value & fix a related bug.
+
+
+2015-04-02 Kohei Yoshida <kohei.yoshida@gmail.com> [fd0721688839625bacaade1ea11ae521cadc8d45]
+
+ Run the test for real.
+
+
+2015-04-02 Kohei Yoshida <kohei.yoshida@gmail.com> [e3b611fe4e2604b33b18bdd9a10ab706f66e19b5]
+
+ Handle HSL and HSLA color values & test for HSL values.
+
+
+2015-04-01 Kohei Yoshida <kohei.yoshida@gmail.com> [5ec26ec444e1a0bd1c3a6045296c43c6645a8393]
+
+ Handle single quoted or unquoted URL values.
+
+
+2015-04-01 Kohei Yoshida <kohei.yoshida@gmail.com> [63625f6d266613bb2da2ec66aa6614d30cbc071e]
+
+ Prepare for handling single quoted values as well as double quoted ones.
+
+
+2015-03-31 Kohei Yoshida <kohei.yoshida@gmail.com> [e7a04374a816c59e01dac37f29bdc381095850ab]
+
+ Add test case for url property value type.
+
+ Once again, quoted URL value only for now. CSS also support URL
+ value that's not quoted, which is yet to be handled.
+
+2015-03-31 Kohei Yoshida <kohei.yoshida@gmail.com> [a2c00e388cbb29e685c91cfebc854d07d656ebcd]
+
+ Handle and store url property value. Quoted URL only for now.
+
+
+2015-03-30 Kohei Yoshida <kohei.yoshida@gmail.com> [06dce2de90a228af3b0f7ad181596d0acf5d3bc8]
+
+ Fix parse failure on literal of length 0 & test case for it.
+
+
+2015-03-30 Kohei Yoshida <kohei.yoshida@gmail.com> [804c74bed072e724d2748c7a90e1a827a940584e]
+
+ Move these into 'complex' directory.
+
+ These are not to be confused with those that are unit-tested.
+
+2015-03-30 Kohei Yoshida <kohei.yoshida@gmail.com> [863e3fae47c7bb2499ea9737f675e011defe166a]
+
+ Write test case for rgb property values.
+
+
+2015-03-30 Kohei Yoshida <kohei.yoshida@gmail.com> [2f4ab44d64da604977c9960394c290797b140b39]
+
+ Store property value as css_property_value_t instead of pstring.
+
+
+2015-03-30 Kohei Yoshida <kohei.yoshida@gmail.com> [3efb76502843599d1be6f68ce84789205dd31d03]
+
+ Add copy ctor, assignment operator and swap() method.
+
+
+2015-03-29 Kohei Yoshida <kohei.yoshida@gmail.com> [652ae63cbfaf3b060ba28a8b5679723e12d04f6e]
+
+ Alpha value ranges from 0.0 to 1.0 and is not an integer.
+
+
+2015-03-29 Kohei Yoshida <kohei.yoshida@gmail.com> [2fe55a205607676972e14f8e48a461e0a53be374]
+
+ Set up a structure for storing a CSS property value. Not used yet.
+
+
+2015-03-25 Kohei Yoshida <kohei.yoshida@gmail.com> [3e8d725e53fe5fdc38c42c6e442b24c5f2287497]
+
+ Clip the value to max value when exceeding it.
+
+
+2015-03-25 Kohei Yoshida <kohei.yoshida@gmail.com> [383b4b7775beeb927e69909ebd5a86f6aa59c1fd]
+
+ New basic test case. Not tested yet.
+
+
+2015-03-25 Kohei Yoshida <kohei.yoshida@gmail.com> [f387de630ef9a22b3d20d847b96ca70971d0fbb0]
+
+ Parse 'rgb' and 'rgba' color functions. More to come.
+
+ The color values are not stored in the document tree yet.
+
+2015-03-25 Kohei Yoshida <kohei.yoshida@gmail.com> [e63acf3681556eb85751136766fa14420e896442]
+
+ CSS file that the parser currently fails to parse.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [e5959a34cdc9558599183b442583e81460a92d57]
+
+ Another test case for chained selector plus bug fix for it.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [d75066163c0ed121dc836dc9e0ae29b7a79707c4]
+
+ Don't forget to descend to the next level when iterating on the chain.
+
+ Plus some scope reduction opportunity up above.
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [d140c53978bb8cbdbeaf418b3f3492665b446391]
+
+ Add test for first chained selector.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [e487aba7179523de1d500a288f092c548acc56e0]
+
+ Dump properties of chained simple selectors.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [43b97ed1b49b6385f8d30646ff5580ea39e01780]
+
+ Print chained simple selectors and combinators.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [a3c019aab1c2825144ecc7bfcb8b1d6f778fc04f]
+
+ Have the handler store combinators and add insertion_error exception.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [c85176a2eb43181cb4e6fc697d972bd5640df736]
+
+ Re-use orcus::general_error for exception with message.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [10a4115576f7ee28dccce561c40295641e0afa8a]
+
+ Parse and push combinators to the handler.
+
+ Also use common function to throw exceptions to reduce templatized
+ code.
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [6ef7a4c00384d68e16ea93615a8145f8bb569116]
+
+ Finally store properties with pseudo class correctly.
+
+ And write test case for it.
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [fe5f05821be3cc38b5fa5f3dc1b55081f45d6b65]
+
+ More on handling pseudo classes. Not done yet.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [10d0279dce509ffba0215872da88851febeb5fbf]
+
+ pstring actually belongs to orcus-parser.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [0317d817ba6f793701d539d531865e09bb13d55d]
+
+ Add pseudo class types and a function to convert them.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [c264203488f2d5238d2a533370e6aaaa0f8b3788]
+
+ I forgot to add this file.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [aabefd6789e0856694453f874f1cd49bba4c1b42]
+
+ Add a new method to fetch all property sets for given selector.
+
+ This is more efficient in case the caller needs to pull all properties
+ for all pseudo element values for a given selector.
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [cf1efec2c489367567ce055970d67fb92b4bf10a]
+
+ Test for multiple pseudo elements in single selector.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [a2c44b63be78249e77b05c7cfaa4aa71053774b8]
+
+ Add test case for handling pseudo elements.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [baa3a4c0bc43af05c3f5e4ed482a1cfcdc2ea12c]
+
+ Parse and store pseudo elements.
+
+ I still need to write a test for this.
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [f025abe48bb496fe07a8bd8dd9df87810ab44f10]
+
+ Put primitive css types under css namespace.
+
+ No idea what's wrong with slickedit wanting to mess with own project
+ file this bad....
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [4d66d03a70affd2e18aa74981ac9234f73f5ac82]
+
+ Handle pseudo element and class separators in css_parser.
+
+ And separate the css selector structures from css primitive types.
+
+ The css primitive types will be used directly in the parser itself.
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [a667f7b2524691a65b2264b560fc73c2cc778cb1]
+
+ Implement is_in() and remove duplication.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [83bc48d8201db2491295b20394117a16b9a41f37]
+
+ Prepare for storing properties for different pseudo element flags.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [bfc0b43d2f3c9105c3ec22c9751f5216e6bf7311]
+
+ Let's not store this here...
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [61d6a8aab3d4e59a6dda1a8ef0f6fe488d68a8c1]
+
+ Implement hash function for real.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [5eba99af03781dff7021d656fcbc90168b736bf3]
+
+ Mention that this is a bitfield.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [b1aee6d5c3e2d0e3f2ac578a562b4d954d017e04]
+
+ Add CSS pseudo element types. They are not used yet.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [8b148f0667a2f6c2549edadc49f55aa6fa0a3a46]
+
+ Handle selectors with just ID.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [cf8c1cd19de3dd99782e5c77898f7c738977e164]
+
+ Support selector with multiple classes.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [99395ec9ffbce23d0a38387676b707b1252970ff]
+
+ Move more code out of the template.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [e8bcfc5dce27924942e2770f24c954a13c7b286e]
+
+ Re-use identifier() for this.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [36e08473bb2e80c62980e93621894189caa22429]
+
+ Move some code out of the template by creating css::parser_base.
+
+ css::parser_base is a non-template base class that stores code that
+ doesn't need to be templatized.
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [837f35a77ca2d5688494dc9d47f7a40e3f21cc1c]
+
+ Clean this up a bit.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [33aa19cf661ed72fee78bae2acb6ffef111293fd]
+
+ Handle CSS ID's.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [8ad18bdaf69bdf257f7fd5bc42fc06d1194f1233]
+
+ Add test for handling of comments and fix the parser while at it.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [d68f5a4a1bc2cd8294f85449d08a9bc5f008f4fd]
+
+ Add another test case and fix the bug uncovered by it.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [0435c6ad3cab24bcda9b7d4e293758f563960a28]
+
+ Add comment at the top of each test css files.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [a3fcc58851979a95b01382ad4e0638c8906c6a7a]
+
+ Handle inline comments in more locations.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [ed5327d09b25163abb08c2d8ae09455b89a3d8a2]
+
+ Handle inline comments in some locations.
+
+ Not all locations are covered yet.
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [d829bc845968fb450734260c7e67f6d49dd77556]
+
+ Another test case, and fix one bug in css_parser.
+
+ '%' may appear in a property value e.g. 'height: 100%'.
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [36674d0de5ea3d098b45a97ebad0fe1cee260ec0]
+
+ Add test for global class selector.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [3e992f9fdf4712dce5f462f61f771b35198fa507]
+
+ Add this new file to the slickedit project.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [829eda079b2142a6c94ce2c2ecd77c7b97f150a0]
+
+ Test for a property whose value consists of multiple strings.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [a6fc2f6f820bc11f3795015b65b35a3c787cec32]
+
+ Correctly handle property value that consists of multiple values.
+
+ e.g. 'border: solid 1px;' where the value of 'border' consists of
+ 'solid' and '1px'.
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [ce291d1806d124ed6758404c528ef98075b8061c]
+
+ Check the size of returned property container in unit test.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [da678fd2cd9545e006a14368c97c76141cf3d459]
+
+ Check property values in unit test.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [7fe8bef237025cdc055f8d9008ff9f60052eee54]
+
+ Rename to disambiguate these two const and non-const functions.
+
+ Apparently mp_impl->m_root doesn't automatically become const even
+ when mp_impl is a const pointer.
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [c4c87c4093174a5ed1dd590676029828a4183382]
+
+ Add script to execute test binary independently.
+
+ This will makes it easier to debug in case a test fails.
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [7feb8595f7ab6c9e12357620886b13d12f3734e8]
+
+ Test something for real. This currently fails.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [3c9aabbf37cb6866fe2fda69c52c6f9912dd6eb3]
+
+ Set up the basis for testing css parsing.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [cfe008b0e58c7e3140d29bd202a60263e853ec74]
+
+ Header cleanup.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [00e2b3f69fb368317aafb9452f63345ffccec546]
+
+ Move css_parse_error to css::parse_error with non-inlined methods.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [1ab6015e71eb04d02384311913775c947d465112]
+
+ Move the css loading code to css_document_tree.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [8ab05ab9dcdd3534ad78085b5e4361dd2269ff30]
+
+ Implement css_document_tree::get_properties().
+
+ This method is not yet used, but will be used from unit tests later.
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [3239443686b272cfb536df74ac5656104fdc09ff]
+
+ Print selector name only when the property set is not empty.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [379f27383f3f4dcc2604fde07fc9197fdc5e4d85]
+
+ Dump all properties afterwards.
+
+ Properties for chained selectors are not dumped yet.
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [b0c5a2d9477c790961616babced91cb2a5b58bb4]
+
+ Store properties for real.
+
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [beb328f9e87c8237d0c5eefa6cb410ff2450094c]
+
+ Push CSS rules to the document tree instance.
+
+ They are not yet stored for real.
+
+2015-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [9687529eac23fb7e07748ef1334a6e69349cb391]
+
+ Set up skeleton CSS tree class and some associated CSS data types.
+
+
+2015-03-23 Kohei Yoshida <kohei.yoshida@gmail.com> [eba40c57149edbfe34fe2a9c32c31deca5d7582e]
+
+ Change the wording and punctuation a bit.
+
+
+2015-03-23 Kohei Yoshida <kohei.yoshida@gmail.com> [1d60ff3f44d0611c737a860e62b1eafadcbd9a73]
+
+ ORCUS_ASCII->MDDS_ASCII
+
+
+2015-03-23 Markus Mohrhard <markus.mohrhard@googlemail.com> [5c4ad45b64a576683d96a59b49e2465cd463aab8]
+
+ add missing interface methods for iconset import
+
+
+2015-03-23 Markus Mohrhard <markus.mohrhard@googlemail.com> [e014e0bd8e2992d902459dbbc8e788b63d2b6116]
+
+ add more databar import interface methods
+
+
+2015-03-23 Markus Mohrhard <markus.mohrhard@googlemail.com> [2716332a3cfb595cc85331238a080ce46052b4c5]
+
+ add more interface methods for conditional formatting
+
+
+2015-03-23 Markus Mohrhard <markus.mohrhard@googlemail.com> [5762ce3b432bac9f10bd33f4764b708ab6c0f0a6]
+
+ gcc complains despite handling all possible values in the switch
+
+
+2015-03-23 Markus Mohrhard <markus.mohrhard@googlemail.com> [7bbefd72f20be004210161802b0cb45b8d1e9795]
+
+ make sure that colorScale entries don't appear in the unhandled list
+
+
+2015-03-23 Markus Mohrhard <markus.mohrhard@googlemail.com> [e340c8b3d2b62ba5e684dfbcc9cc5b645f508066]
+
+ import icon name
+
+
+2015-03-23 Markus Mohrhard <markus.mohrhard@googlemail.com> [15b0969de46d830864a1ebfdc52ffa747510670d]
+
+ handle cfvo and color for colorScale, iconSet and dataBar
+
+
+2015-03-23 Markus Mohrhard <markus.mohrhard@googlemail.com> [a62acfce324988ae1afb4b6f138c31b5d3e1f268]
+
+ store colors also in container for later consumption
+
+
+2015-03-23 Markus Mohrhard <markus.mohrhard@googlemail.com> [5d5f14d79f75e469c13b67dac48040c16bc252f2]
+
+ import icon set attributes
+
+
+2015-03-23 Markus Mohrhard <markus.mohrhard@googlemail.com> [1880d41b28b3ba70d97ff3bf8833418ff1af49c4]
+
+ import databar attributes
+
+
+2015-03-23 Markus Mohrhard <markus.mohrhard@googlemail.com> [148748694f6224ea11443701524db73e976cffc1]
+
+ store cfvo to map to colors imported later
+
+
+2015-03-23 Markus Mohrhard <markus.mohrhard@googlemail.com> [1e9cff839f566a345d8f1ee92fc9c7b5893b06d3]
+
+ parse cfvo attributes in xlsx conditional format import
+
+
+2015-03-23 Markus Mohrhard <markus.mohrhard@googlemail.com> [d45f22b23ac4870d0c1a8be6097ed3cf810d5c02]
+
+ import rank for xlsx conditional format import
+
+
+2015-03-23 Markus Mohrhard <markus.mohrhard@googlemail.com> [1d895599d7db34733111233e0622a5da374f997e]
+
+ first part for stdDev import in xlsx conditional format import
+
+
+2015-03-23 Markus Mohrhard <markus.mohrhard@googlemail.com> [4f35344386c961078b462a7e68e91ac1ebe001b2]
+
+ first part for dxf id import in xlsx conditional format import
+
+ We still need to import dxf records and translate between dxf and xf
+ ids.
+
+2015-03-23 Markus Mohrhard <markus.mohrhard@googlemail.com> [b61d4754900ab00181dccaf8cd833bc4e6fec253]
+
+ import text for xlsx conditional format import
+
+
+2015-03-23 Markus Mohrhard <markus.mohrhard@googlemail.com> [7fd379ea8ae6eb6f0f60d3c2c91f9378f8c8677e]
+
+ import range for xlsx conditional format import
+
+
+2015-03-23 Markus Mohrhard <markus.mohrhard@googlemail.com> [65d438ad9b635a2a31f06eecaecca325a7e8af9b]
+
+ import date period for xlsx conditional format import
+
+
+2015-03-23 Markus Mohrhard <markus.mohrhard@googlemail.com> [f83603365aa81c2f008a164307b0e8ddb985e059]
+
+ import operator for cellIs in xlsx conditional format import
+
+
+2015-03-23 Markus Mohrhard <markus.mohrhard@googlemail.com> [7cff80490caf102b3a9eb1da6ccf9c7681b44042]
+
+ more work for conditional format import for xlsx
+
+
+2015-03-23 Markus Mohrhard <markus.mohrhard@googlemail.com> [d0c4ce628a78445cf067966df33aa786546b1217]
+
+ add one more condition operator to the enum
+
+
+2015-03-23 Markus Mohrhard <markus.mohrhard@googlemail.com> [cc28a9a4bc17c461cb72ee1d6314c426723aa005]
+
+ first step for implementing conditional formatting for xlsx
+
+
+2015-03-23 Markus Mohrhard <markus.mohrhard@googlemail.com> [77b55e7d230df0507e41811c9bc97215a6b1f9b6]
+
+ extract useful function into own helper file
+
+
+2015-03-23 Markus Mohrhard <markus.mohrhard@googlemail.com> [c8a759f898e8f257c2f635f20959ca59e4f00e88]
+
+ that should have been above_equal_average
+
+
+2015-03-23 Markus Mohrhard <markus.mohrhard@googlemail.com> [4f80dcbefbb5be2f83cd1f198dc03049a8b6ae29]
+
+ prevent hiding virtual method from base class
+
+
+2015-03-23 Markus Mohrhard <markus.mohrhard@googlemail.com> [4637310868250ae447292dc49c309d743f3dc95c]
+
+ import dxf records from xlsx
+
+
+2015-03-23 Markus Mohrhard <markus.mohrhard@googlemail.com> [00bb6782a3f635038ee0e824703fffd33cdf91d7]
+
+ add interface methods for dxf import
+
+
+2015-02-28 Kohei Yoshida <kohei.yoshida@gmail.com> [741bd9454474eba76c2be7928c382db53b26a973]
+
+ Remove this file as it no longer exists.
+
+
+2015-02-28 Kohei Yoshida <kohei.yoshida@gmail.com> [eddd91c119411f9be18a0837940674f470c3819f]
+
+ Create orcus-css-dump utility for debugging & testing the css parser.
+
+
+2015-02-24 Kohei Yoshida <kohei.yoshida@gmail.com> [cc8887655b49ab93b364c9e23c138e4b3cfdade0]
+
+ These are in fact all bash scripts.
+
+
+2015-02-24 Kohei Yoshida <kohei.yoshida@gmail.com> [efe3b05a8d55922e4373a8c144d76f80c724a006]
+
+ Have css_parser use parser_global functions.
+
+ Rather than rolling its own.
+
+2015-02-24 Kohei Yoshida <kohei.yoshida@gmail.com> [da65dfbf6bd099b91c0149687edd0067db40bce6]
+
+ Next version up will be 0.9.0.
+
+
+2015-02-24 Kohei Yoshida <kohei.yoshida@gmail.com> [a0d4159e4f3cf7e232485d80e3721663ec9437e7]
+
+ sorted_string_map.hpp is no longer in orcus.
+
+
+2015-02-24 Kohei Yoshida <kohei.yoshida@gmail.com> [e47d724812596f4e84ab6f53f60b0bcde30e52be]
+
+ Fix test_data.
+
+
+2015-02-23 Kohei Yoshida <kohei.yoshida@gmail.com> [97185665fab60572779596361842ff0a5cc0f6e7]
+
+ main dosn't belong here.
+
+
+2015-02-09 David Tardon <dtardon@redhat.com> [9b8a788334eec08f15c10246a7a504bac51a7ede]
+
+ add compile to .gitignore
+
+
+2015-02-09 David Tardon <dtardon@redhat.com> [a1736425b79689b35bbc4aba450377afa25e1cfe]
+
+ update boost.m4
+
+ The old one breaks on detecting boost version when used with gcc 5.
+
+2015-02-07 Kohei Yoshida <kohei.yoshida@gmail.com> [f5f55b1a8f31bb621c924c50431aeb68ed248674]
+
+ Update slickedit project files for the ixion update.
+
+
+2015-02-07 Kohei Yoshida <kohei.yoshida@gmail.com> [0c9cb1b690fd89c2c63cd1343013cfe82b0fa048]
+
+ Add more file extensions to ignore.
+
+
+2015-02-07 Kohei Yoshida <kohei.yoshida@gmail.com> [72ddbe088709166d425326dc6392fedb352dfa48]
+
+ orcus now requires libixion-0.10.
+
+ And get it to build.
+
+2015-01-30 David Tardon <dtardon@redhat.com> [0eb23341e9a921cac7e97894d31c885896ea4867]
+
+ add missing include
+
+
+2015-01-28 Kohei Yoshida <kohei.yoshida@gmail.com> [9809a9d0f5ccce3d52f056b8e9477db7cb2fe04c]
+
+ Rename condition_date_type -> condition_date_t.
+
+
+2015-01-28 Markus Mohrhard <markus.mohrhard@googlemail.com> [0cebed695e2821105ad44dc46687a9a20af87803]
+
+ implement conditional format import for gnumeric import
+
+
+2015-01-28 Markus Mohrhard <markus.mohrhard@googlemail.com> [7bd52259491f0e660b2da50f44c7b1938fd2f4cb]
+
+ no need to store that in the region data
+
+
+2015-01-28 Markus Mohrhard <markus.mohrhard@googlemail.com> [68e3680e310205524c2ac0586413b0886864898c]
+
+ first part for conditional formatting interface
+
+ The interface is still incomplete but already contains the basic
+ concepts with format, entry, condition split.
+
+2015-01-27 Kohei Yoshida <kohei.yoshida@gmail.com> [fe3d6ae6e2da24d5a3aaafcca6ad9bb093e86f1b]
+
+ Fixed link errors when building on Ubuntu 14.04.
+
+
+2015-01-12 Kohei Yoshida <kohei.yoshida@gmail.com> [5c5d7f00ec1f64b79830f3a4ea813c0bd2e16763]
+
+ Rename set_format_range -> set_format.
+
+ Other interface methods whose names are set_*_range() all tend to take
+ a string value that represents a cell range address. Because of this,
+ the name set_format_range may give the impression that it too expects a
+ range address string. Hence the rename.
+
+2015-01-12 Markus Mohrhard <markus.mohrhard@googlemail.com> [32e092ead98d76e7f5151ebb48ec605cd8887a92]
+
+ gnumeric: foreground color is also the text color
+
+
+2015-01-12 Markus Mohrhard <markus.mohrhard@googlemail.com> [6df38c8ec49f74635cdf9be4f51c4489ef613505]
+
+ add test for gnumeric color conversion
+
+
+2015-01-12 Markus Mohrhard <markus.mohrhard@googlemail.com> [c689f78806cf8e081420fef56fa60bc27777c505]
+
+ fix color conversion for gnumeric
+
+
+2015-01-12 Markus Mohrhard <markus.mohrhard@googlemail.com> [921b3cd98b08bb586954cd631ae6d1cc8f6af898]
+
+ use new interface method for gnumeric style import
+
+
+2015-01-12 Markus Mohrhard <markus.mohrhard@googlemail.com> [f6ced059faa4e5fdcfc454f841f63e349ed5eee6]
+
+ add interface method to import cell format for several cells at once
+
+
+2015-01-12 Markus Mohrhard <markus.mohrhard@googlemail.com> [ea7bd5e3ad607455dead301115a03147a3d97576]
+
+ actually import the cell format in gnumeric
+
+
+2015-01-12 Kohei Yoshida <kohei.yoshida@gmail.com> [9ec5ff5aa5fe103b075104145136fa458741ce82]
+
+ sorted_string_map is now in mdds.
+
+
+2014-11-12 Kohei Yoshida <kohei.yoshida@gmail.com> [8fb916a4ccfcfa0f2b2087e756f03995888033e9]
+
+ Split visibility macros for different shared objects.
+
+
+2014-10-27 Dmitry Roshchin <dmitry@roshchin.org> [34706da0bd20b9872d352e51c74fcaff2f49d3de]
+
+ Fix build with boost 1.56
+
+
+2014-09-25 Caolán McNamara <caolanm@redhat.com> [3ba9bbfe69ce0b66cc0f2689d94224b7e12d5b0d]
+
+ coverity#54449 Uninitialized scalar field
+
+
+2014-09-25 Caolán McNamara <caolanm@redhat.com> [6968ef1a13101375230b390589771953bee96b97]
+
+ coverity#54451 Uninitialized scalar field
+
+
+2014-09-25 Caolán McNamara <caolanm@redhat.com> [8e4727ca850912c5606d7b70321c3b9b986c2c08]
+
+ coverity#54450 Uninitialized scalar field
+
+
+2014-09-25 Caolán McNamara <caolanm@redhat.com> [9ef8ed8bdbe2c9756115c7d3e98c7180bb63fd0f]
+
+ coverity#54448 Uninitialized scalar field
+
+
+2014-09-09 Markus Mohrhard <markus.mohrhard@googlemail.com> [35a7291d93507abe941769f32c23f8d3177eb298]
+
+ coverity#54439 store pointer to local variable after it has been destructed
+
+
+2014-09-09 Markus Mohrhard <markus.mohrhard@googlemail.com> [e3b01b6d864b3634640caf2dfbf7d1a9150e05d0]
+
+ coverity#54426 missing break in switch statement
+
+
+2014-09-09 Markus Mohrhard <markus.mohrhard@googlemail.com> [98342d1d0ff0c7584efa856af10823c688f174fc]
+
+ coverity#54427 missing break in switch statement
+
+
+2014-09-09 Markus Mohrhard <markus.mohrhard@googlemail.com> [24c2fa2247f8a65920fd01ca6ef260ef1b0960d2]
+
+ coverity#54428, missing break in switch statement
+
+
+2014-09-09 Markus Mohrhard <markus.mohrhard@googlemail.com> [bc494f3cc0538b662065183e039a0fbb9dcdf282]
+
+ coverity#54429, missing break in switch statement
+
+
+2014-09-06 Kohei Yoshida <kohei.yoshida@gmail.com> [aee4af3ca04e70004af156c79c9f8fe8a3a849e9]
+
+ Increment row position for skipping header row, not decrement it.
+
+
+2014-09-06 Kohei Yoshida <kohei.yoshida@gmail.com> [69b3e2b95b75435c14157389adbf7d97cdaa752e]
+
+ Add test xlsx document that has table reference with column range.
+
+
+2014-09-06 Kohei Yoshida <kohei.yoshida@gmail.com> [80476580493ec61e99d092200224bf657335807d]
+
+ Handle column ranges in table reference as well.
+
+
+2014-09-06 Kohei Yoshida <kohei.yoshida@gmail.com> [25bbbf2f8dea989335a9131194d9ecf50ffb1e3e]
+
+ Implement ixion::table_handler interface to handle table references.
+
+
+2014-08-29 Kohei Yoshida <kohei.yoshida@gmail.com> [01bb1eb0cdfbb46fde7650f663ca8c965874f542]
+
+ Pick up subtotal attribute from dataField element.
+
+ This defines the function for data field inside pivot table.
+
+2014-08-21 Kohei Yoshida <kohei.yoshida@gmail.com> [ddc9c03fbc81dd4081e696c0273d224692bd3265]
+
+ New test xlsx document containing 2 pivot caches.
+
+
+2014-08-21 Kohei Yoshida <kohei.yoshida@gmail.com> [1ed93c2f2d921a928fb0551ee7b46787edcb10e6]
+
+ Tweaking the output.
+
+
+2014-08-21 Kohei Yoshida <kohei.yoshida@gmail.com> [9445348559914663f9cd54f9fb2c2f2972a448cf]
+
+ Note about the undocumented value of -2 as pivot field index.
+
+
+2014-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [bbbab33fb44fb0439f6d60ba43cef50ae52638a6]
+
+ Direct string entry in pivot cache record.
+
+
+2014-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [e379c11376b9ea41811bdb5c06b8e14b0133ba77]
+
+ More tweaking of the dump output for pivot table data.
+
+
+2014-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [193d83b9377bce118952cb8a16a473f5fece2638]
+
+ Pick up pageField elements and their attributes.
+
+
+2014-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [ae15790d8d91f8620e57514261b04f36705717f1]
+
+ More on parsing pivotTable[n].xml parts.
+
+
+2014-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [55fcbb36200191ccbeb65282a458c01ed4d41022]
+
+ More attributes to pick up.
+
+
+2014-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [b818917670905d6691cce33ed5f2e47fa55cf7ea]
+
+ Another xlsx document with pivot table with many fields.
+
+ Just to see what sort of pivotTable content it generates...
+
+2014-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [e77aa61c36fe27e2edd080df7595a63ee947f15f]
+
+ Some comments. Pivot table structure is really complex...
+
+ And reading the spec adds more confusion.
+
+2014-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [24719150cbf2deb31cc967020c28f3cdfd73b5d9]
+
+ <pivotField> element has 'dataField' boolean attribute.
+
+
+2014-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [d5402243bae27931d464c6cbc70bfea9643f139d]
+
+ Parse pivotTable[n].xml parts fully.
+
+
+2014-08-19 Kohei Yoshida <kohei.yoshida@gmail.com> [47784398fd1885de3fa131188ae089ed06578ccf]
+
+ Parse the attributes of pivotTableDefinition in the pivot table part.
+
+
+2014-08-19 Kohei Yoshida <kohei.yoshida@gmail.com> [b881b6fa33a2062c38bde0fdf2fc2a7975bf8e15]
+
+ Class descriptions.
+
+
+2014-08-19 Kohei Yoshida <kohei.yoshida@gmail.com> [efdba74623b7aebeff3daea0acc6a8d29a36fe28]
+
+ Parse pivot cache record parts & dump content to stdout for now.
+
+
+2014-08-19 Kohei Yoshida <kohei.yoshida@gmail.com> [237564a72b18ec21b425312ad44e89e1de086001]
+
+ Comment unused method arguments.
+
+
+2014-08-19 Kohei Yoshida <kohei.yoshida@gmail.com> [318b0db68ce7a91933e9411a9165e1e31e5078db]
+
+ Add test xlsx document that has pivot tables in it.
+
+
+2014-08-19 Kohei Yoshida <kohei.yoshida@gmail.com> [8a7451d4e725ed18d3a5e682491c482d5915ce8b]
+
+ Parse the pivot cache definition parts for real.
+
+ For now, I'll dump the data to stdout. Later I'll work on designing
+ a public interface for this.
+
+2014-08-19 Kohei Yoshida <kohei.yoshida@gmail.com> [c9c563c9d1fb61eede332e84473802eca099c234]
+
+ Add skeleton code for pivot cache record parts.
+
+
+2014-08-19 Kohei Yoshida <kohei.yoshida@gmail.com> [eafae1d3fc0386b85bc4cc17526de0d9d283f73b]
+
+ No output when the debug flag is not set.
+
+
+2014-08-19 Kohei Yoshida <kohei.yoshida@gmail.com> [132792f3f37bae96ad0eb99fbbbb8760f5cc2f87]
+
+ Store handled part paths to avoid reading the same part twice.
+
+ And follow the relations of pivot cache and pivot table parts.
+
+2014-08-19 Kohei Yoshida <kohei.yoshida@gmail.com> [8d547b1a9eff589a22122e8da50da1d733b010ab]
+
+ Add skeleton handler for pivot cache definition parts.
+
+ One thing to note is that the same pivot cache definition part is
+ referenced multiple times: once from the workbook.xml and twice or
+ more times from the pivotTable#.xml parts. One way to handle this is
+ to have the OPC code to keep track of which parts have already been
+ read, and skip any attempts to read the same part twice.
+
+2014-08-19 Kohei Yoshida <kohei.yoshida@gmail.com> [008ee5e014e01462bc81875a82a2a5bd26a7d822]
+
+ Set up skeleton pivot table xml parts handler.
+
+
+2014-08-19 Kohei Yoshida <kohei.yoshida@gmail.com> [0bc1de66495f586d110a2446c1c7d98448fbde13]
+
+ Set up paths for pivot cache and table parts in the OPC handler.
+
+ They are empty for now.
+
+2014-08-19 Kohei Yoshida <kohei.yoshida@gmail.com> [e2a27ed0abb17d0c37ed72a0c4b346d437a1c612]
+
+ Add new schema types for pivot cache and pivot table relations.
+
+
+2014-08-19 Kohei Yoshida <kohei.yoshida@gmail.com> [1fee3b0a2e13bf43bc7ce27a08a62255361b4355]
+
+ Add new files to slickedit projects & fix header guard.
+
+
+2014-08-19 Kohei Yoshida <kohei.yoshida@gmail.com> [1422ce461c6d061f97ef702b7c858448b5657e39]
+
+ Fix the control file to adjust for a bug fix in ixion.
+
+ Ixion's name resolver would previously print all range references as
+ relative i.e. without the $ signs. That was fixed and we need to change
+ the control file to reflect it.
+
+2014-08-18 Markus Mohrhard <markus.mohrhard@googlemail.com> [24c014b962f3944e8804771e838436f933ed6671]
+
+ allow standalone table import from xlsx
+
+ This allows to use the table import for small parts of an import process
+ without the need to bring in the whole orcus in one big step.
+
+2014-08-18 Markus Mohrhard <markus.mohrhard@googlemail.com> [4b0fe6827eb5a44cd559094c0520dc74a0665fe4]
+
+ by default don't use Werror
+
+
+2014-08-13 Kohei Yoshida <kohei.yoshida@gmail.com> [6816142a974da1fc5f6bef159bbd87542165fe3d]
+
+ This is no longer needed.
+
+
+2014-08-13 Kohei Yoshida <kohei.yoshida@gmail.com> [ae843d439e8396740e16c155f05066d00fb27bb5]
+
+ Fix buffer overflow in sorted_string_map by specifying key length.
+
+ This also (in theory) lifts the restriction that the key must be
+ null-terminated.
+
+2014-08-13 Kohei Yoshida <kohei.yoshida@gmail.com> [709e6e49d4e885ba99f18a2497f9cf3533362788]
+
+ Avoid potential buffer overflow with 'input'.
+
+
+2014-08-13 Markus Mohrhard <markus.mohrhard@googlemail.com> [0bdeb971d905abf71020c198215361a92d75d2b3]
+
+ fix invalid memory access in base64 functions
+
+ Boost expects the input to be a multiple of 3 bytes for the encoding and
+ a multiple of 4 bytes for the decoding. Otherwise it accesses past the
+ end of the input array. Therefore we now pad with '\0' and replace the
+ generated 'A' with '='.
+
+2014-08-09 Kohei Yoshida <kohei.yoshida@gmail.com> [29ebb131b3caa6771dff4feed28dbaf27607749b]
+
+ Hide these debug statements as well.
+
+
+2014-08-09 Kohei Yoshida <kohei.yoshida@gmail.com> [c5d64acb3f43a79b65309ba9868bd34439f4f125]
+
+ Import style info for table.
+
+
+2014-08-09 Kohei Yoshida <kohei.yoshida@gmail.com> [3d6fb5180c696b526df9cf0d3b3c451f904f87a8]
+
+ Turn off debug statement for table context when --debug is not given.
+
+
+2014-08-08 Kohei Yoshida <kohei.yoshida@gmail.com> [0bbf9cab6580ba2961f658bd194f5cfdec5fec65]
+
+ Make it a real swap.
+
+
+2014-08-08 Kohei Yoshida <kohei.yoshida@gmail.com> [2476d9380ee82f4b46f2fc09447a0f3e10f2beb5]
+
+ Extract common code blocks into a shared method.
+
+
+2014-08-08 Kohei Yoshida <kohei.yoshida@gmail.com> [cffcfbc7a250da1b0dc9098ef1324da9cbb1aac9]
+
+ Implement import_auto_filter interface for table, and enable the test.
+
+
+2014-08-08 Kohei Yoshida <kohei.yoshida@gmail.com> [6026f2d00c347eb1db081ee6ccac83e299094dc5]
+
+ Check the contents of table columns in the test code.
+
+
+2014-08-07 Kohei Yoshida <kohei.yoshida@gmail.com> [24085ffc91811e78c632d3d4a3506dd11f7672f7]
+
+ Start writing test for table import.
+
+ Some parts still fail.
+
+2014-08-06 Kohei Yoshida <kohei.yoshida@gmail.com> [ac194ea45f2f9b526e1737f63ba86235ba3e7251]
+
+ Store table data to the document model for real.
+
+
+2014-08-05 Kohei Yoshida <kohei.yoshida@gmail.com> [e710bae2b93a9e889ce6cfbb8caf8edb64ac9d58]
+
+ Add note about spreadsheet's types.hpp header.
+
+
+2014-08-05 Kohei Yoshida <kohei.yoshida@gmail.com> [e2a8af3aead3686392ec5011878fc91517f0ff9d]
+
+ Calling get_auto_filter() should reset its internal state.
+
+ The same with any other getter methods that return a feature interface.
+ Let's make this a rule. With this rule, the filter code needs to call
+ the getter at the beginning only once since calling it will initialize
+ the state of its internal feature data.
+
+2014-08-05 Kohei Yoshida <kohei.yoshida@gmail.com> [655d76767c1649742e19c0d4e00eec37cbbca1b5]
+
+ Pass picked-up table data to the table interface.
+
+
+2014-08-05 Kohei Yoshida <kohei.yoshida@gmail.com> [aa1efe7d4680c05051d682e85abbffd417be5657]
+
+ Common method to push auto filter data to the model via interface.
+
+
+2014-08-05 Kohei Yoshida <kohei.yoshida@gmail.com> [64249d1223a9f4d498962dfdb722ddc765e00158]
+
+ Pass the table interface as reference, not as pointer.
+
+ The pointer has already been checked for NULL-ness earlier in
+ read_table() call.
+
+2014-08-05 Kohei Yoshida <kohei.yoshida@gmail.com> [88044a0431db8f53e4bf4e0d970e4486608ead67]
+
+ Parse tableStyleInfo element inside table.
+
+
+2014-08-05 Kohei Yoshida <kohei.yoshida@gmail.com> [ffdff6d9736aab6ba945c4bd056abe11bb89e9e2]
+
+ Parse tableColumn elements in the table part.
+
+
+2014-08-04 Kohei Yoshida <kohei.yoshida@gmail.com> [6c1a6ca2b4dd54a1b550ce78aa03617f1b9f8c73]
+
+ Work on picking up table data. Not done yet.
+
+
+2014-08-04 Kohei Yoshida <kohei.yoshida@gmail.com> [98d3df7137faedac2089960caf302f1503303757]
+
+ Initial data structure set for storing table data.
+
+ I put them in the same place with the autofilter data, since the two
+ are quite similar in nature and usage.
+
+2014-08-04 Kohei Yoshida <kohei.yoshida@gmail.com> [1ec974b9d963d56a8272f3b958113326dbc4b974]
+
+ Note about ixion dependency in public header files.
+
+
+2014-08-04 Kohei Yoshida <kohei.yoshida@gmail.com> [f06695995995611f8a54837bf5df67a4df77ce90]
+
+ Move table.hpp from public directory to private one.
+
+
+2014-08-03 Kohei Yoshida <kohei.yoshida@gmail.com> [8282d8380046b950c72d8a27de0c4d6af806435c]
+
+ Add class descriptions.
+
+
+2014-08-03 Kohei Yoshida <kohei.yoshida@gmail.com> [5e3a5502773ae4e19133a9e4d745ee45dbee9327]
+
+ Update slickedit project files.
+
+
+2014-08-03 Kohei Yoshida <kohei.yoshida@gmail.com> [ddbdd4b93d84af212b3821a4c57592378e84cd6f]
+
+ Move this from a public header directory.
+
+ We don't need to expose the implementation of an interface.
+
+2014-08-02 Kohei Yoshida <kohei.yoshida@gmail.com> [389bd496efa1b48db6c0a62a0b179270576792b3]
+
+ Test the import of sheet auto filter data for real.
+
+
+2014-08-02 Kohei Yoshida <kohei.yoshida@gmail.com> [54d5225d5aaf2da65a6d6cdbdbad65a71aa8f6c7]
+
+ Implement auto filter sheet storage.
+
+ This is for auto filter stored directly in the sheet only.
+
+2014-07-19 Kohei Yoshida <kohei.yoshida@gmail.com> [29781fb04718e8d4ec958d0e950f054db7fbfa06]
+
+ Pass the config and namespace context objects to child contexts.
+
+ Let's not forget this.
+
+2014-07-19 Kohei Yoshida <kohei.yoshida@gmail.com> [e0c5b0a4b30043e20668b1400357c6d6fcde59b3]
+
+ Set up autofilter test code. No actual test yet.
+
+ I need to first store autofilter content into the document first.
+
+2014-07-19 Kohei Yoshida <kohei.yoshida@gmail.com> [69ce0e632473ae64d9344602328d1d6ed3a3e7eb]
+
+ Another debug statement I overlooked.
+
+
+2014-07-19 Kohei Yoshida <kohei.yoshida@gmail.com> [f97f067d637d78c19e8fd1928038d2a8c8759944]
+
+ Add documentation of the config options.
+
+
+2014-07-19 Kohei Yoshida <kohei.yoshida@gmail.com> [f59024b44f60c35049f1e8358cfe6e92a40a8d95]
+
+ Add structure check config option to replace its compiler macro counterpart.
+
+
+2014-07-19 Kohei Yoshida <kohei.yoshida@gmail.com> [7996e40b0dde1539836a2ab61997d7b4e0747de0]
+
+ More on turning off debug output.
+
+
+2014-07-19 Kohei Yoshida <kohei.yoshida@gmail.com> [06db6b3ab2b5b299d48b4798ae2b994795588abd]
+
+ Move config out of iface namespace, since it's not really an interface.
+
+
+2014-07-19 Kohei Yoshida <kohei.yoshida@gmail.com> [35d99e24cb32f5f8ea431bf5c75b9dff6a9529b2]
+
+ xml_stream_parser now requires config object to be passed.
+
+
+2014-07-19 Kohei Yoshida <kohei.yoshida@gmail.com> [1108e6b79087b3f26bb3de6082a2bb657ebb3c85]
+
+ Stream name parameter is not used. Let's remove it.
+
+
+2014-07-19 Kohei Yoshida <kohei.yoshida@gmail.com> [53c4eb6c2bb9bed568439a6f0a617d0d3363df10]
+
+ Turn on/off debug output in orcus_xlsx.
+
+
+2014-07-19 Kohei Yoshida <kohei.yoshida@gmail.com> [8184dc9b805168569b396bad83ba125e56d0e1dc]
+
+ Use the debug flag to turn on/off debug output in opc_reader.
+
+
+2014-07-19 Kohei Yoshida <kohei.yoshida@gmail.com> [df0aa43bfc4324011457cdb6d9e2d01516b0de44]
+
+ Pass config option to opc_reader.
+
+
+2014-07-19 Kohei Yoshida <kohei.yoshida@gmail.com> [1c816f6d852909bf359f1f92308b9a23d01a3146]
+
+ Add a debug option to turn on / off run-time debug output.
+
+ Not used yet.
+
+2014-07-19 Kohei Yoshida <kohei.yoshida@gmail.com> [2375dab0f97241abdcbe19a16727ffad74ad2f44]
+
+ Output directory should not be needed when specifying "none" format type.
+
+ Because the format type of "none" does not create any output files.
+
+2014-07-15 Kohei Yoshida <kohei.yoshida@gmail.com> [819a60658a9d53b455589968661fd07a3461610c]
+
+ Cleanup.
+
+
+2014-07-15 Kohei Yoshida <kohei.yoshida@gmail.com> [f9e0b84e2e9e071d1efd24675c4cd776bedc655d]
+
+ Print namespace alias values for unhandled element warnings.
+
+ Aliases look easier on the eye than full namespace URI's.
+
+2014-07-15 Kohei Yoshida <kohei.yoshida@gmail.com> [8710cf96ebe9c2c9e3a5396769bc5bb7d6027667]
+
+ Better output.
+
+
+2014-07-15 Kohei Yoshida <kohei.yoshida@gmail.com> [28e441f3a84340b62154fb82df8dd57417e20d23]
+
+ These elements can occur under 'oc' or 'nc'.
+
+
+2014-07-15 Kohei Yoshida <kohei.yoshida@gmail.com> [6e04fedd93dc2511ed92cae3d00309410ad0846d]
+
+ Use xlsx_cell_t for the sheet cells as well.
+
+
+2014-07-15 Kohei Yoshida <kohei.yoshida@gmail.com> [ccea9843e01f4f508520543bb321d6867988a8d9]
+
+ Pick up row column insert delete revisions.
+
+
+2014-07-15 Kohei Yoshida <kohei.yoshida@gmail.com> [fa8db6bce5b8246b71f326c1125a1563922bf6a1]
+
+ Parse cell change revisions.
+
+
+2014-07-15 Kohei Yoshida <kohei.yoshida@gmail.com> [4c36d302761c8cb3c63e0337ac7c94ccf2838d4c]
+
+ Get all revision types.
+
+
+2014-07-15 Kohei Yoshida <kohei.yoshida@gmail.com> [321c893b9412e8c5a0a58c76233cc2e250f58592]
+
+ Parse revision header XML part.
+
+
+2014-07-14 Kohei Yoshida <kohei.yoshida@gmail.com> [37dd03d124fd78e7f75dcd152ed2d261570bde2c]
+
+ Empty context handler for revision log parts.
+
+ Likewise, it doesn't pick up anything yet.
+
+2014-07-14 Kohei Yoshida <kohei.yoshida@gmail.com> [f95fc792cad8b25eb62ffc7b2a042b89199e502c]
+
+ xlsx_revheaders_context.* -> xlsx_revision_context.*
+
+
+2014-07-14 Kohei Yoshida <kohei.yoshida@gmail.com> [f866dc375fb1efb40224c6df1e88baf7240187be]
+
+ Add skeleton handler for revision headers part.
+
+ It doesn't pick up anything yet.
+
+2014-07-14 Kohei Yoshida <kohei.yoshida@gmail.com> [1157c42d9c71715cfb7563dbc5e1d482a5f98022]
+
+ Two more MCE-related schema values.
+
+
+2014-07-14 Kohei Yoshida <kohei.yoshida@gmail.com> [932068afc78e8bd2db4b51d7a3c7d65ce4d3644f]
+
+ Add missing schema types.
+
+
+2014-07-14 Kohei Yoshida <kohei.yoshida@gmail.com> [5cef3bdf41831372dd36bc5f976f7eb7318b02cd]
+
+ These elements can occur under customSheetView element.
+
+
+2014-07-14 Kohei Yoshida <kohei.yoshida@gmail.com> [0f9ba39235cb2cc1c227c587858df6fc7c7ec278]
+
+ Add new content type values needed to parse revision data.
+
+
+2014-07-14 Kohei Yoshida <kohei.yoshida@gmail.com> [efa7aae7c60a517563203b20214fdc74b943a5df]
+
+ New document to test importing of revision logs.
+
+
+2014-07-06 Kohei Yoshida <kohei.yoshida@gmail.com> [bcc9a408855221572b15b922be076df8af34b5cf]
+
+ Add skeleton implementation for table import interface.
+
+
+2014-07-06 Kohei Yoshida <kohei.yoshida@gmail.com> [2780d754b38fe6236f2144864595cd5032240a61]
+
+ Build fix.
+
+
+2014-07-06 Kohei Yoshida <kohei.yoshida@gmail.com> [ed45c182010781cb4a7e87f0acf3db7832adcae4]
+
+ Pass the sheet interface to read_table() to fetch table interface from it.
+
+
+2014-07-06 Kohei Yoshida <kohei.yoshida@gmail.com> [d5465ef16d6dd78cbfb7a5b028b92c83a1f4cb22]
+
+ There is a function object for this.
+
+
+2014-07-06 Kohei Yoshida <kohei.yoshida@gmail.com> [6790a876fee0823e6e1eb22b48c2c52ada1bce9b]
+
+ Throw an exception when appending a sheet instance fails.
+
+
+2014-07-06 Kohei Yoshida <kohei.yoshida@gmail.com> [781ec3be0a049bfb8dce81f45782c011dd105b40]
+
+ Populate the table interface to import basic table data.
+
+ We may add more methods later as needed.
+
+2014-07-05 Kohei Yoshida <kohei.yoshida@gmail.com> [bd3915390f7812e21adb92e1de8f4a0ee97b3216]
+
+ import_table interface to import table data. Empty for now.
+
+ Also fix some spell error.
+
+2014-07-05 Kohei Yoshida <kohei.yoshida@gmail.com> [cc6be7eafbf13c7f7b0530ed3f9fd388e11106dd]
+
+ Fix the description.
+
+
+2014-07-05 Kohei Yoshida <kohei.yoshida@gmail.com> [5689b5e25d075f928f3e4a1df009b3db2ea25bb0]
+
+ Pick up autofilter data from table stream.
+
+
+2014-07-05 Kohei Yoshida <kohei.yoshida@gmail.com> [244299a428f2cab644208b52809504ad782d18ad]
+
+ Fix build breakage.
+
+
+2014-07-05 Kohei Yoshida <kohei.yoshida@gmail.com> [ee0ca2e2a8a44a626690ee09f29593b7d6f0b39b]
+
+ Use xlsx_autofilter_context to parse autoFilter in the sheet stream.
+
+
+2014-07-05 Kohei Yoshida <kohei.yoshida@gmail.com> [79444376514c29708be3022730e468d1dd044274]
+
+ We need to get the ref range too.
+
+
+2014-07-05 Kohei Yoshida <kohei.yoshida@gmail.com> [f962a1c0ff9f1bf9016e3aa38ddb4aeac5143f9d]
+
+ Write separate context for autoFilter scope.
+
+
+2014-07-05 Kohei Yoshida <kohei.yoshida@gmail.com> [b241f0ece5dd904809dc6ede9633f3eb62315783]
+
+ Set up an empty context for handling 'table' parts.
+
+
+2014-07-04 Kohei Yoshida <kohei.yoshida@gmail.com> [fd74fd462f341a5f27886b411581537eb8dab6e2]
+
+ Make this non-copyable for now.
+
+
+2014-07-04 Kohei Yoshida <kohei.yoshida@gmail.com> [de8cdc2c24b0ac9864ccfcb155f046c73496d285]
+
+ Make these interface methods non-abstract.
+
+ So that if the client doesn't want to implement them they can just
+ do nothing.
+
+2014-07-04 Kohei Yoshida <kohei.yoshida@gmail.com> [fc49b22d8f78e94e70658042fa697fc2b5849d7b]
+
+ Fix memory leak.
+
+
+2014-07-04 Kohei Yoshida <kohei.yoshida@gmail.com> [b787951bd6bef675bb23ad7997d6bc15a8a9f131]
+
+ Do the same for the sheet handlers.
+
+
+2014-07-04 Kohei Yoshida <kohei.yoshida@gmail.com> [e6c67585e6923c18c243f662086e78c4f0c61b8d]
+
+ Now we can delete the workbook handler & context before moving on.
+
+ Since all xml parts in an opc package are parsed recursively, it's
+ better to explicitly do cleanup when we finish parsing each part.
+ Otherwise none of these allocated objects would get cleared until
+ the very end of the whole import process.
+
+2014-07-04 Kohei Yoshida <kohei.yoshida@gmail.com> [deec0ffa38fdfdfc0235f552f2d13d880cb4c9b1]
+
+ Have opc_rel_extras_t directly manage the life cycles of opc_rel_extra.
+
+
+2014-07-03 Kohei Yoshida <kohei.yoshida@gmail.com> [7c7a76f6a51af87576aca7ee7c6de29213891955]
+
+ Resolve path containing "..".
+
+
+2014-07-03 Kohei Yoshida <kohei.yoshida@gmail.com> [d65ff070e68c3be8c199b77a067d1dd2653f7a6a]
+
+ Add read_table() method and call it as necessary.
+
+ For now, the zip stream retrieval fails because the path contains
+ unresolved "..".
+
+2014-07-03 Kohei Yoshida <kohei.yoshida@gmail.com> [5da8397af3b470840707b3e38d826f68c3a712a8]
+
+ Add table schema type.
+
+
+2014-06-19 Kohei Yoshida <kohei.yoshida@gmail.com> [c997d334c6929bac7cf49f354a25153c04041689]
+
+ New test file that contains Excel's Table.
+
+ A Table also contains an autofilter definition.
+
+2014-06-16 Kohei Yoshida <kohei.yoshida@gmail.com> [289ab37c253e3f566c6103a0ed370b4c7930df79]
+
+ Use to_long here.
+
+
+2014-06-16 Kohei Yoshida <kohei.yoshida@gmail.com> [6561798cbd1daf2265022fd92af585d8f8a0ecb2]
+
+ "used" sounds better than "selected".
+
+
+2014-06-16 Kohei Yoshida <kohei.yoshida@gmail.com> [d8b63f105072f1ade379893da2d2c226596f3c8d]
+
+ Make dump-check handling a separate function.
+
+
+2014-06-16 Kohei Yoshida <kohei.yoshida@gmail.com> [8fd10365bf4fde250326a97ba2f5d45a5f82eb58]
+
+ Add --dump-check option. Useful when adding new test files to test suite.
+
+
+2014-06-15 Kohei Yoshida <kohei.yoshida@gmail.com> [85baece7d6470c4f3de448bb8bfdf024022f3ec4]
+
+ Test formula import for ods.
+
+
+2014-06-13 Kohei Yoshida <kohei.yoshida@gmail.com> [1bd7235eeeed48ca465a3b7bb8dd43c6f948ee7b]
+
+ Write test for sorted_string_map.
+
+
+2014-06-13 Kohei Yoshida <kohei.yoshida@gmail.com> [fc93b69f441cba2497758eeef4eed7b4b50eb710]
+
+ Use sorted_string_map here. This makes ods import slightly faster.
+
+
+2014-06-12 Kohei Yoshida <kohei.yoshida@gmail.com> [df1ef73333daf25a4b372969a28ca359dbc1ba67]
+
+ Class description.
+
+
+2014-06-12 Kohei Yoshida <kohei.yoshida@gmail.com> [4b3184df34e73097dcc085771959815565f4fe79]
+
+ Add sorted_string_map template class for fast string to integer mapping.
+
+ This is useful when we have a known set of string keys to map to a known
+ set of integer values (or enums). It's 8 times faster than doing the
+ mapping using boost::unordered_map.
+
+2014-06-11 Kohei Yoshida <kohei.yoshida@gmail.com> [9b60ec29dc93bec185c69825a47fba906cdcbba4]
+
+ Buffer formula cells and push them after sheet data has been imported.
+
+ Else sheet name resolution would fail during formula parsing.
+
+2014-06-11 Kohei Yoshida <kohei.yoshida@gmail.com> [be65ba793785ba6f0c8db4472da0c5500f53c7f5]
+
+ Add skeleton ods session data.
+
+ This will be used to later store formula cell data.
+
+2014-06-11 Kohei Yoshida <kohei.yoshida@gmail.com> [04f9126883b2bfcf9e71aaf52a83621b62b49da1]
+
+ Restore the original grammar once the import is done.
+
+
+2014-06-11 Kohei Yoshida <kohei.yoshida@gmail.com> [e233c0e0f0e77c5c735ac2038ccd347a8495616a]
+
+ This doesn't have to be created on the heap.
+
+
+2014-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [2ab4cfaa52973eda117f331eedeef6463c96dbb1]
+
+ Provide a name resolver instance when setting formulas to ixion model.
+
+
+2014-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [184be55b6f79d530622a4cf5716c53f9cb25999d]
+
+ Set default grammar to ods at the beginning of load.
+
+
+2014-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [2e6350e50963d47f65ba24f3beb4d06794e1b5f3]
+
+ Adjust for change in ixion.
+
+ The document now stores formula name resolver instance which is responsible
+ for handling different reference types.
+
+2014-06-07 Kohei Yoshida <kohei.yoshida@gmail.com> [7f59acf19741ea64a29320f63cd20936d4294550]
+
+ Move import_global_settings instance from document to factory.
+
+ Only used by the import filters. Makes no sense to store it in the
+ document.
+
+2014-06-07 Kohei Yoshida <kohei.yoshida@gmail.com> [6857ed25928e21b3dd561f9dcea767c8e02a94d8]
+
+ Allow app to set or get default formula grammar type.
+
+ This will be used when e.g. parsing range strings.
+
+2014-06-07 Kohei Yoshida <kohei.yoshida@gmail.com> [a1ab6f3ed616e35ef891174cbdfc0febd2228cb3]
+
+ We don't need this now.
+
+
+2014-06-07 Kohei Yoshida <kohei.yoshida@gmail.com> [9b0810be6fb3b61f2ea9d8bdb51c6a75fa821bd0]
+
+ Do the same with export_factory.
+
+
+2014-06-07 Kohei Yoshida <kohei.yoshida@gmail.com> [16c377dff6dc06e31cd25731309234050ef721c7]
+
+ import_factory to take a reference to the document instance.
+
+
+2014-06-07 Kohei Yoshida <kohei.yoshida@gmail.com> [28b70ceaaa30d34f2453e9aad7ec921428e1a048]
+
+ No need to use boost::scoped_ptr for these.
+
+
+2014-06-07 Kohei Yoshida <kohei.yoshida@gmail.com> [84873ab565dd1daeda34db03f68689b7ba3158b7]
+
+ Fix memory leak. orcus_foo doesn't delete the factory instance.
+
+
+2014-06-07 Kohei Yoshida <kohei.yoshida@gmail.com> [be47298e952877d0c8318e9ff7170e5d6b900e41]
+
+ Use pimpl for import_factory.
+
+
+2014-06-07 Kohei Yoshida <kohei.yoshida@gmail.com> [f8cb16b5aceaed2350ab37b5f6d5e225e2b4d2ec]
+
+ Prefix formula_grammar_t values with formula_grammar_.
+
+ Just to be consistent.
+
+2014-06-07 Kohei Yoshida <kohei.yoshida@gmail.com> [cd8a3eb7af83f8e1e23866f32ec0e8c04920313e]
+
+ Document set_origin_date().
+
+
+2014-06-07 Kohei Yoshida <kohei.yoshida@gmail.com> [d2aac2554319ad342de541375bf72adbef185fff]
+
+ Don't forget to return a real global settings instance here.
+
+
+2014-06-06 Kohei Yoshida <kohei.yoshida@gmail.com> [fe342b4f0798f43053bf6e2288c34686780e9cdd]
+
+ Pass cached formula results & remove '=' from formula.
+
+ set_formula() interface expects formula expression without a '=' prefix.
+
+2014-06-06 Kohei Yoshida <kohei.yoshida@gmail.com> [dd15fdc468b3d1005279332ee8ada1063d7fc149]
+
+ Pick up formula expressions from ods. Still work in progress.
+
+
+2014-06-06 Kohei Yoshida <kohei.yoshida@gmail.com> [65dfa023b181b6ef5390496004d1cc773bb86b9a]
+
+ Rename this file for consistency.
+
+
+2014-05-06 David Tardon <dtardon@redhat.com> [868a8fe0b53c5d93d3993e6455da132fce1c1e95]
+
+ add support for ppc64le
+
+
+2014-04-21 Markus Mohrhard <markus.mohrhard@googlemail.com> [79f06c21a9c94643e49b6cdd9ea6cbf246c858f6]
+
+ improved filters import from gnumeric
+
+
+2014-04-21 Markus Mohrhard <markus.mohrhard@googlemail.com> [b01db7845019634ffa5540b39fdcceeb6b961d66]
+
+ that forward declaration is not needed anymore
+
+
+2014-04-21 Markus Mohrhard <markus.mohrhard@googlemail.com> [ea12957781328aa6c0cd6919659b38b0072ca7a9]
+
+ import the remaining alignment properties
+
+
+2014-04-19 Markus Mohrhard <markus.mohrhard@googlemail.com> [56d5dba2a359001ac0a994a1153dbe3fb69925fc]
+
+ fix test failure in gnumeric test
+
+
+2014-04-19 Markus Mohrhard <markus.mohrhard@googlemail.com> [f8fc5e46aadc6a614d000a3527b25892f894a38a]
+
+ initial work on gnumeric vertical and horizontal alignment import
+
+
+2014-04-19 Markus Mohrhard <markus.mohrhard@googlemail.com> [5ea98c810ea860a21b33a7bbe583fb7425e9fcad]
+
+ add initial support for auto filter in gnumeric import
+
+
+2014-01-22 David Tardon <dtardon@redhat.com> [0a73f3d6400c1878cb02f2b6e655bcced3e29c8e]
+
+ add build support for aarch64
+
+
+2013-12-14 Kohei Yoshida <kohei.yoshida@gmail.com> [40dd6d86cafb26cb964f9807177d2545087f7c61]
+
+ Update the Visual Studio solution files & get it to build with MSVC.
+
+
+2013-12-13 Kohei Yoshida <kohei.yoshida@gmail.com> [85310451bcf001a6485212faf83b6f6a082bec32]
+
+ Make sure the stream instance is alive during the test.
+
+ Else pstring may be accessing invalid memory location.
+
+2013-12-13 Kohei Yoshida <kohei.yoshida@gmail.com> [e9481933deb09c2e085c2892f5564af26132be73]
+
+ Typo. It needs to be _LIBS, not _LIB.
+
+
+2013-12-13 Kohei Yoshida <kohei.yoshida@gmail.com> [0b07334884efec15b2b228f4919bceac646e1bce]
+
+ Add missing header.
+
+
+2013-12-13 Kohei Yoshida <kohei.yoshida@gmail.com> [4883a40a70be6e77d5fee25c96b841cf423ddb65]
+
+ We need to include iostream header here.
+
+
+2013-12-13 Kohei Yoshida <kohei.yoshida@gmail.com> [4c46a1b5304ddf63c297df0d714cdb5f1247cba3]
+
+ Updated extra file list.
+
+
+2013-12-13 Kohei Yoshida <kohei.yoshida@gmail.com> [8f970b70fab21719457211f65392045617416f50]
+
+ We don't need this anymore. We use 'make dist' these days.
+
+
+2013-11-14 Kohei Yoshida <kohei.yoshida@gmail.com> [8c7ebf5e36ceed6acb25f8effa237e104be7612c]
+
+ Some work toward importing number formats from xlsx. Still WIP.
+
+
+2013-11-06 Kohei Yoshida <kohei.yoshida@gmail.com> [1262e5404c4296847341c27405e60ee28568a599]
+
+ Define auto filter interface, and use it to import auto filter data.
+
+
+2013-11-05 Kohei Yoshida <kohei.yoshida@gmail.com> [1df6eed749f0f1a55234f88cc1b0b2ce801ede80]
+
+ We don't use this any more.
+
+
+2013-11-05 Kohei Yoshida <kohei.yoshida@gmail.com> [78810b225f65a2c2a605d17d6c04780a1cc70eae]
+
+ Use different interface for importing data tables.
+
+
+2013-11-02 Kohei Yoshida <kohei.yoshida@gmail.com> [59a76c4f1c074e74640097837ebb91ae3f36c0c8]
+
+ Started parsing the autoFilter data. Not finished yet.
+
+
+2013-11-02 Kohei Yoshida <kohei.yoshida@gmail.com> [603e901469f873e9e797056381081a3dba252e0a]
+
+ A little cleanup.
+
+
+2013-11-02 Kohei Yoshida <kohei.yoshida@gmail.com> [200d8e39d896fc4daa1a9786865f2a02654c9e41]
+
+ Remove old debug outputs.
+
+
+2013-11-02 Kohei Yoshida <kohei.yoshida@gmail.com> [768a8da0f6bef4bad01c4e34150438202d0e46cc]
+
+ New xlsx test file for importing autofilters.
+
+
+2013-11-02 Kohei Yoshida <kohei.yoshida@gmail.com> [c1c1d5f910eacf9ce82b4f0a2f7328b857b6eefc]
+
+ Move set_data_table() interface to import_sheet.
+
+ It makes more sense to keep it together with the rest of the formula
+ import methods.
+
+2013-11-01 Kohei Yoshida <kohei.yoshida@gmail.com> [88d6c9995af0dcdb2a5c0e8d4dc47b0f5e73992b]
+
+ Fix the one-var data tables.
+
+ The column and row input cell references were flipped.
+
+2013-11-01 Kohei Yoshida <kohei.yoshida@gmail.com> [cbdbc73a84779e4583d9344863257d50b3fbd350]
+
+ Add test xlsx file for importing single-variable data tables.
+
+ Both column and row-oriented tables.
+
+2013-10-31 Kohei Yoshida <kohei.yoshida@gmail.com> [289772ea1d80279dfbb769cdbe070d7c5a7d829c]
+
+ Parse and import data tables from xlsx.
+
+ Data table not yet stored in the spreadsheet model.
+
+2013-10-31 Kohei Yoshida <kohei.yoshida@gmail.com> [24bb41e1c39c919722cdbfc2d7229524021080a7]
+
+ Add xlsx test file for importing 2-variable data table.
+
+
+2013-10-27 Kohei Yoshida <kohei.yoshida@gmail.com> [7a0614043a6f75137d676918eaf7ea9ccf7d4f89]
+
+ Add output format type 'none' which disables writing output files.
+
+ This is useful for benchmarking.
+
+2013-10-27 Kohei Yoshida <kohei.yoshida@gmail.com> [19172fc0ceb4736a4491479acdcb94c504e6fdcc]
+
+ Let's use 'middle' instead of 'center' for vertical alignment.
+
+ Stick with CSS's wording when in doubt.
+
+2013-10-27 Kohei Yoshida <kohei.yoshida@gmail.com> [52a480fe1ae345b58b7209a023a6bca083e0f403]
+
+ Import 'top', 'center', 'bottom' vertical alignment from xlsx.
+
+ And use it in html output. We still need to handle other vertical
+ alignment types.
+
+2013-10-27 Kohei Yoshida <kohei.yoshida@gmail.com> [aafa2f526f8eb0c6ca7848e5cd3231683dbddc33]
+
+ Fix syntax error.
+
+
+2013-10-25 Kohei Yoshida <kohei.yoshida@gmail.com> [32d69dc569919090082b1d8f6b19a0922e8113fd]
+
+ Import horizontal text alignments from xlsx and use them in html output.
+
+
+2013-10-24 Kohei Yoshida <kohei.yoshida@gmail.com> [709a6cd5a48203e7d9e2485d25cee6f26e5d6da7]
+
+ Prevent potential memory leak.
+
+
+2013-10-24 Kohei Yoshida <kohei.yoshida@gmail.com> [27f15785ce9de7f12a162224b9f2f82cee9c9317]
+
+ Skip cells that are overlapped by merged cells in html output.
+
+
+2013-10-22 Kohei Yoshida <kohei.yoshida@gmail.com> [9d76110aff86031985b52d4780d75b34c12cdb49]
+
+ Get 'make check' buildable again.
+
+
+2013-10-21 Kohei Yoshida <kohei.yoshida@gmail.com> [a52a5efa7454f773e0e905c47f27f8be97608382]
+
+ Map merge cell info to html's colspan and rowspan.
+
+ TODO : skip cells that are overlapped.
+
+2013-10-21 Kohei Yoshida <kohei.yoshida@gmail.com> [8eb7476297c7ba8920af62f1946551ba37d97f2e]
+
+ Import merged cell ranges from xlsx.
+
+
+2013-10-21 Kohei Yoshida <kohei.yoshida@gmail.com> [22825152472d7db223119190e17ce78fd85d3dbc]
+
+ Test file for importing standard colors from xlsx.
+
+
+2013-10-21 Kohei Yoshida <kohei.yoshida@gmail.com> [2f280e04959817deb970be7ade7a4985d2b9b8ad]
+
+ Output background colors in html output.
+
+
+2013-10-21 Kohei Yoshida <kohei.yoshida@gmail.com> [666843bd4a37427dc0fb0f9ef8af9d8e4eae9d11]
+
+ The color attribute can occur under 'mruColors' element.
+
+
+2013-10-21 Kohei Yoshida <kohei.yoshida@gmail.com> [e97c7be5761f86dc87a285d6e76350e89c8e6de8]
+
+ This actually breaks cells that don't have borders all around them.
+
+
+2013-10-15 Kohei Yoshida <kohei.yoshida@gmail.com> [80ef5bec76d83fb213b2cb68d742f8121e076307]
+
+ Handle shared formula cells correctly when dumping.
+
+
+2013-10-15 Kohei Yoshida <kohei.yoshida@gmail.com> [2ad306bd18aed428479e6059b43eb47ec29d8240]
+
+ Move this to a separate method.
+
+
+2013-10-15 Kohei Yoshida <kohei.yoshida@gmail.com> [e189d68d9b8e5ba553f4c89b1a54f7cd0718cc46]
+
+ Defer formula cell insertion after the parsing is done.
+
+ So that formula cells get inserted after the shared string table is
+ imported. Tokenization of formulas may add new shared string instances
+ to the table, which may mess up the string ID's if that happens before
+ the string table is imported.
+
+2013-10-14 Kohei Yoshida <kohei.yoshida@gmail.com> [9b56e5c73d72dde1000557e7f8a2b8853c8879e0]
+
+ Reallly append strings when importing shared string table from xlsx.
+
+ Sometimes we encounter strings that are identical character-wise but
+ different in terms of format runs.
+
+2013-10-14 Kohei Yoshida <kohei.yoshida@gmail.com> [886b3b3608e4f38e17257789f6ffe4d77c2ee417]
+
+ Allow session_context to store custom data.
+
+ And have the xlsx import session make use of it. Right now its session
+ data is empty, but I'll start filling it.
+
+2013-10-13 Kohei Yoshida <kohei.yoshida@gmail.com> [ad17d1583b90be0580b68dee02f5f56852d9371f]
+
+ Import font colors and use it in html output.
+
+
+2013-10-13 Kohei Yoshida <kohei.yoshida@gmail.com> [50d7bdb2f5785f952677ebf6039ba455cb808ca8]
+
+ Rename spreadsheet data structures to append _t.
+
+ To be consistent with other data structures in orcus.
+
+2013-10-13 Kohei Yoshida <kohei.yoshida@gmail.com> [0f647fe6be0769d693ddbe080a79de31a1ab2ff7]
+
+ New test file to import colored texts from xlsx.
+
+
+2013-10-13 Kohei Yoshida <kohei.yoshida@gmail.com> [128baf9d7ef185803db14939296f05adc422f078]
+
+ Handle transient string values correctly.
+
+
+2013-10-12 Kohei Yoshida <kohei.yoshida@gmail.com> [fe1db279986d3f1cb17900ee78d19c5c180aaf42]
+
+ Switch back to 'collapse', and remove default gray borders.
+
+
+2013-10-12 Kohei Yoshida <kohei.yoshida@gmail.com> [fe90f9fceda8a56ac595e7aa2ac909d31a2603eb]
+
+ Remove debug statement.
+
+
+2013-10-12 Kohei Yoshida <kohei.yoshida@gmail.com> [1410f0d431792e65edfbe21a8b46641d6f6646c6]
+
+ More complete border mapping from xlsx to html.
+
+
+2013-10-07 Kohei Yoshida <kohei.yoshida@gmail.com> [b39a34d58cf325467c8c09b7e7aac383c9aa6dfb]
+
+ Import border colors and honor them in html output.
+
+
+2013-10-07 Kohei Yoshida <kohei.yoshida@gmail.com> [20963a91012dcad8156c766f41da24e98aa2d9b8]
+
+ Display some border types in html output.
+
+ think, medium and thick border types only for now.
+
+2013-10-07 Kohei Yoshida <kohei.yoshida@gmail.com> [e4ddea30cd73620e2ab5e38c89b6d6bd423989d4]
+
+ Avoid strto* system calls.
+
+ Because they are slow on Windows.
+
+2013-10-07 Kohei Yoshida <kohei.yoshida@gmail.com> [29e0658da6cbef8c89efff8b48d1b3d3833a91d1]
+
+ More test files for border imports.
+
+
+2013-10-06 Kohei Yoshida <kohei.yoshida@gmail.com> [d72200cb18916f56ab77fba982bf8199eee49c58]
+
+ Set custom row height to html output as well.
+
+
+2013-10-06 Kohei Yoshida <kohei.yoshida@gmail.com> [d92f23d51e8b201147e8b68c42f95b7b11d9b059]
+
+ Some cleanup.
+
+
+2013-10-06 Kohei Yoshida <kohei.yoshida@gmail.com> [2245542560ddf3445c52813b61321d9a27c99e2a]
+
+ Use CSS to define styles rather than hard-coded styles for each cell.
+
+
+2013-10-05 Kohei Yoshida <kohei.yoshida@gmail.com> [205e2f66bfbe772dfb61d09018b5d9cf07988555]
+
+ Apply column widths when dumping in html format.
+
+
+2013-10-05 Kohei Yoshida <kohei.yoshida@gmail.com> [c0c6baae528343a44a87d59ec8c4e19e0eb65b4b]
+
+ New test file for importing borders from xlsx.
+
+
+2013-10-05 Kohei Yoshida <kohei.yoshida@gmail.com> [bc6f31223a5ef0d2597f791fcb5331a7e789217d]
+
+ Change the license from MIT to MPL 2.0.
+
+
+2013-09-24 Kohei Yoshida <kohei.yoshida@gmail.com> [69d83847ef596434f65763f8e38a7d957e49cf19]
+
+ Forgot to add this new header.
+
+
+2013-09-23 Kohei Yoshida <kohei.yoshida@gmail.com> [3e013204792d50c9fc103d69ae602688759628ef]
+
+ Do the same for csv, xls-xml and gnumeric command line tools as well.
+
+
+2013-09-23 Kohei Yoshida <kohei.yoshida@gmail.com> [a76bf86d57585b93963d6f309fbc41858dc10f36]
+
+ Use the arg parser for orcus-xlsx.
+
+
+2013-09-23 Kohei Yoshida <kohei.yoshida@gmail.com> [ac81b7bd9758110abb85392f056f63f0351a227a]
+
+ Make the arg parser more generic, by removing the ODS-ness.
+
+
+2013-09-23 Kohei Yoshida <kohei.yoshida@gmail.com> [de0f7dead0483d0e006960b462d0b86384e7b8f8]
+
+ Move command line arg parsing to its own function.
+
+
+2013-09-21 Kohei Yoshida <kohei.yoshida@gmail.com> [3be2f8288300c29a1824650c15ed32a71703c04f]
+
+ Redirect flat dump output to files, one per sheet.
+
+
+2013-09-21 Kohei Yoshida <kohei.yoshida@gmail.com> [ee2b9a629ac0a6a7f4535563ba78c1bfca933ea8]
+
+ Check the output directory presence.
+
+
+2013-09-21 Kohei Yoshida <kohei.yoshida@gmail.com> [44eab74ec432c9dc6f83d9be644c930d86ab41f9]
+
+ boost::program_options required only --with-tools.
+
+
+2013-09-21 Kohei Yoshida <kohei.yoshida@gmail.com> [6a3475ac65b66cf8e17b33eaf63eb95a0af00ae9]
+
+ We don't need this file.
+
+
+2013-09-21 Kohei Yoshida <kohei.yoshida@gmail.com> [3ed0ce110a57bb51b159f36a77e5a79abb1542c0]
+
+ Check the input values, and honer output directory path.
+
+
+2013-09-21 Kohei Yoshida <kohei.yoshida@gmail.com> [cfb1595eb0ceb430e12390b7e89804dcde5930c2]
+
+ Use boost::program_options to handle inputs for orcus-ods.
+
+ Options are not being handled yet.
+
+2013-09-02 Kohei Yoshida <kohei.yoshida@gmail.com> [7f413eeabead88869e5967d83c95065e055d9f41]
+
+ Class description.
+
+
+2013-09-02 Kohei Yoshida <kohei.yoshida@gmail.com> [d891873eb1fce192865dae7d151e65b298462539]
+
+ Add test for gnumeric file format detection.
+
+
+2013-09-02 Kohei Yoshida <kohei.yoshida@gmail.com> [6db06cff35a9f27918e3021687b8b2761759ce23]
+
+ Detect gnumeric file type.
+
+
+2013-09-02 Kohei Yoshida <kohei.yoshida@gmail.com> [509ed74ca1fccffd7b4715bdf0892e9f8c1fae8e]
+
+ Set up detection handler skeleton for orcus-gnumeric.
+
+
+2013-09-02 Kohei Yoshida <kohei.yoshida@gmail.com> [1a6b368673767b4a3cc36604f5d772d01e595fed]
+
+ We don't need this.
+
+
+2013-09-02 Kohei Yoshida <kohei.yoshida@gmail.com> [23f41f806e38adca24e0c55d1215784b33bbb852]
+
+ Remove unused header includes.
+
+
+2013-09-02 Kohei Yoshida <kohei.yoshida@gmail.com> [b3c0e6a295ebd5cb5ed858f634906012a479c16c]
+
+ Use common function to decompress gzipped stream for gnumeric files.
+
+
+2013-09-02 Kohei Yoshida <kohei.yoshida@gmail.com> [3606f0bb396628a2b492ca042458e37999e0201e]
+
+ Use boost::iostreams to decompress gzipped stream in memory.
+
+
+2013-09-02 Kohei Yoshida <kohei.yoshida@gmail.com> [c5e3b74bc36e7f60c99824a9ac1ecc273997091b]
+
+ Use boost.m4 to simplify boost library detection during configure.
+
+
+2013-09-02 Kohei Yoshida <kohei.yoshida@gmail.com> [9e4db7758abef3bb49a76441af3f0aff403744ff]
+
+ Note on using boost iostreams to do in-memory gzip decompression.
+
+
+2013-09-02 Kohei Yoshida <kohei.yoshida@gmail.com> [915e1ff5f1156a03e57189c99c81dc05e57d84a7]
+
+ Notes on how to implement in-memory gzip handling.
+
+
+2013-09-01 Kohei Yoshida <kohei.yoshida@gmail.com> [01181e16807858baa21a511d68d81ad6536b768d]
+
+ Detect Excel XML format for real.
+
+
+2013-09-01 Kohei Yoshida <kohei.yoshida@gmail.com> [b554e16c154b6bf9e64ecc883e134cf5c2301b6f]
+
+ Prevent infinite loop in case the magic number is not found.
+
+
+2013-09-01 Kohei Yoshida <kohei.yoshida@gmail.com> [8d72817ab9c6a6fbe4f6fa276efb104d6478c669]
+
+ Add skeleton code for xls xml detection.
+
+ It still doesn't detect anything yet.
+
+2013-08-09 Kohei Yoshida <kohei.yoshida@gmail.com> [4955af1fd41583200befc433c625b502ef397dc2]
+
+ Add detect method to orcus_gnumeric, and use scope object for gzfile.
+
+ The detection code will come later. Decompressing a gzip in memory
+ needs a bit more work.
+
+2013-08-09 Kohei Yoshida <kohei.yoshida@gmail.com> [a45d443dab9028ffea3d6379e1a5c573e270ec3d]
+
+ Mistake in the comment.
+
+
+2013-08-08 Kohei Yoshida <kohei.yoshida@gmail.com> [9892202225dd7a15b5eb0d36a454ddc7eb2db85e]
+
+ Detect xlsx file type.
+
+
+2013-08-08 Kohei Yoshida <kohei.yoshida@gmail.com> [b991c2e4a72135e5731318741e04aae3246597a7]
+
+ Detect ods type for real.
+
+
+2013-08-08 Kohei Yoshida <kohei.yoshida@gmail.com> [1223ba4947f59661e35b596752ea12a7c96241bd]
+
+ Implement zip_archive_stream_blob.
+
+
+2013-08-08 Kohei Yoshida <kohei.yoshida@gmail.com> [b75e5f9dd9d5e0b473c16eeb922c1f238ddc81de]
+
+ Set up skeleton for orcus-detect.
+
+
+2013-08-04 Kohei Yoshida <kohei.yoshida@gmail.com> [8ac64c5d38a48e245e7b14baead3fe1731d38a75]
+
+ Set up testing for detecting ods format.
+
+ Right now, it doesn't really detect anything.
+
+2013-08-04 Kohei Yoshida <kohei.yoshida@gmail.com> [f5a065ca3cd7df3fbe85ac08ee718e1f1e638ebd]
+
+ Add xlsx, xls-xml and gnumeric there as well.
+
+
+2013-08-03 Kohei Yoshida <kohei.yoshida@gmail.com> [e723a36a778c6e090dc020c11f0d430bed067ed9]
+
+ Start working on format detection code.
+
+ It's just a skeleton for now.
+
+2013-08-01 Kohei Yoshida <kohei.yoshida@gmail.com> [c50c13255e1c0f1dfbe6be92a053238fdee146a8]
+
+ Don't forget to specify mdds flag & fix the build.
+
+
+2013-07-28 Kohei Yoshida <kohei.yoshida@gmail.com> [3efe6aef22cdbb5501b21a2470d5be75e24c60cf]
+
+ Add test for cell formats for ods import.
+
+ Also, rename struct xf to cell_format. It is more intuitive that way.
+
+2013-07-21 Kohei Yoshida <kohei.yoshida@gmail.com> [2afe66133d0427e50fdca035d21ad86d9ad4e584]
+
+ Add test for text format import. Not done yet.
+
+
+2013-07-21 Kohei Yoshida <kohei.yoshida@gmail.com> [0de6d50f8f3cf30b34c16cbfde8801054b21f77d]
+
+ Fix HTML dumping code.
+
+
+2013-07-21 Kohei Yoshida <kohei.yoshida@gmail.com> [6837b6219a55a1e49cfac65964aab76e4914684b]
+
+ Set font for each formatted segment.
+
+
+2013-07-21 Kohei Yoshida <kohei.yoshida@gmail.com> [8bfbc92a711c3ae2d3545cbc2cd2c83f7753d4d4]
+
+ Update copyright years.
+
+
+2013-07-21 Kohei Yoshida <kohei.yoshida@gmail.com> [f649b43c39176dceed328ac123e2be384a71f355]
+
+ Append each segment separately rather all all at once at the end.
+
+
+2013-07-20 Kohei Yoshida <kohei.yoshida@gmail.com> [a0a25089c1ac00f40c5338f69c904600dec72959]
+
+ Handle <text:span> stack inside <text:p> scope.
+
+
+2013-07-20 Kohei Yoshida <kohei.yoshida@gmail.com> [c5fe9fe300e6f8c2cc4a56aa46cd8d4963f7b485]
+
+ Move single_attr_getter to a global location.
+
+
+2013-07-20 Kohei Yoshida <kohei.yoshida@gmail.com> [8fd1c4c558f702fd75644f5ad971c15f7d633341]
+
+ More on handling transient attribute values.
+
+
+2013-07-20 Kohei Yoshida <kohei.yoshida@gmail.com> [30e1a28c3fb00a9b3862adde144d25d89e23ae56]
+
+ Pass the transient state of an attribute value to the callback.
+
+
+2013-07-20 Kohei Yoshida <kohei.yoshida@gmail.com> [6904388f8ec93a512f33b4d3dc9356d596c0e1a7]
+
+ Intern values of transient text contents.
+
+
+2013-07-20 Kohei Yoshida <kohei.yoshida@gmail.com> [71bb2007101a6c85d41a0ff001af51262c867da4]
+
+ Print font ID for text style properties (for debugging).
+
+
+2013-07-05 Kohei Yoshida <kohei.yoshida@gmail.com> [90c3fb3db6ad4ec3634b809ba154aa41a6fcd231]
+
+ Make this a separate method.
+
+
+2013-07-05 Kohei Yoshida <kohei.yoshida@gmail.com> [3c3b7ce815e3b7b0a650c8b9ceb2b96c6c2dd1a3]
+
+ font-size is under fo namespace not style namespace.
+
+
+2013-07-05 Kohei Yoshida <kohei.yoshida@gmail.com> [aebf3b67d4fc315ad4830330c8856b0ec5662d72]
+
+ New test document for importing font styles.
+
+
+2013-07-05 Kohei Yoshida <kohei.yoshida@gmail.com> [e47a5080dfedd2904207eb4c848df79b841df685]
+
+ Set default styles first before importing real styles.
+
+
+2013-07-05 Kohei Yoshida <kohei.yoshida@gmail.com> [77bccd3c1d2558f5f922aac27c8b799273bc6b77]
+
+ Try to pick up font styles for cells during ods import.
+
+
+2013-07-04 Kohei Yoshida <kohei.yoshida@gmail.com> [99326d20fa69696c76a52d5cc46afc35c9c89d99]
+
+ Fix a bug in cell format import.
+
+
+2013-07-04 Kohei Yoshida <kohei.yoshida@gmail.com> [c757be84b499e58e77f8c5a60ef00478b8778db4]
+
+ This doesn't have to be a template.
+
+
+2013-07-04 Kohei Yoshida <kohei.yoshida@gmail.com> [5e2893a4ea0ba4ad04ff36448955b01358cfc499]
+
+ Let's not include headers that the project doesn't use.
+
+
+2013-07-04 Kohei Yoshida <kohei.yoshida@gmail.com> [dcdfde13d18af39bfe4f957193a18dbda9864703]
+
+ Switch from mdds::mixed_type_matrix to mdds::multi_type_matrix.
+
+ The former type is deprecated.
+
+2013-07-04 Kohei Yoshida <kohei.yoshida@gmail.com> [e03a645476b5a8f4b6ae92e85bf162ffae255d8f]
+
+ Another test for parsing text delimiter inside quotes.
+
+
+2013-07-04 Kohei Yoshida <kohei.yoshida@gmail.com> [3b72f291159f389dff8049a70604ac2321bbd109]
+
+ I didn't really need this.
+
+
+2013-07-04 Kohei Yoshida <kohei.yoshida@gmail.com> [97e487f11d5903ecb1075f492c6c7802d428970b]
+
+ Add test for parsing literal double-quotes in csv.
+
+ And fix one bug associated with it.
+
+2013-07-04 Kohei Yoshida <kohei.yoshida@gmail.com> [1cfa6d22b68ee6218ebccef9e281d33e933dbb27]
+
+ Convert normal-quotes test.
+
+
+2013-07-04 Kohei Yoshida <kohei.yoshida@gmail.com> [ea6145d6a9d8a102c3d82f6c893acd974a2551af]
+
+ Escape double quote characters when dumping check content.
+
+
+2013-07-04 Kohei Yoshida <kohei.yoshida@gmail.com> [3bb2a3ead763c3f1ee180cd226dc775543b8d09e]
+
+ Make the csv tests consistent with tests for the other format types.
+
+
+2013-07-04 Kohei Yoshida <kohei.yoshida@gmail.com> [523a7586e7f7e601e66e7cd9aedd3532934e67d4]
+
+ Add test for xls-xml on basic content import.
+
+
+2013-06-30 Kohei Yoshida <kohei.yoshida@gmail.com> [405ef42742d1c5c17da511d44cd8be380c439e12]
+
+ Pass to the handler whether or not a content string is transient.
+
+ It's the same logic as with attribute values.
+
+2013-06-30 Kohei Yoshida <kohei.yoshida@gmail.com> [0452816377fd3ae62cf0f780a9dac2dbd6a59d1c]
+
+ Pass to the caller whether or not attribute value is transient.
+
+ When the attribute value is transient, its value is stored in a temporary
+ buffer and is not expected to survive beyond the scope of the callback.
+
+2013-06-30 Kohei Yoshida <kohei.yoshida@gmail.com> [9b7a697020c76f655fa27c191a3651fadb1de787]
+
+ Import cell data from Excel XML.
+
+
+2013-06-30 Kohei Yoshida <kohei.yoshida@gmail.com> [768a3c628f67d522053e5bbfe3df31dabaab9d2c]
+
+ Add test for parsing multiple attributes with encoded characters.
+
+
+2013-06-30 Kohei Yoshida <kohei.yoshida@gmail.com> [ea7d058d8e21c80b60bd9c29b007fd05e44447c3]
+
+ Allow sax parser to have more than one cell buffer.
+
+ This is to ensure that when multiple attributes of the same element
+ have encoded values the newer value won't overwrite the older one in
+ the temporary buffer.
+
+ This is needed for sax_token_parser as it stores all attributes in
+ std::vector before sending them to the handler.
+
+2013-06-30 Kohei Yoshida <kohei.yoshida@gmail.com> [712bed871814abdecff8942f052dd13789d2efb1]
+
+ Pick up sheet names.
+
+
+2013-06-30 Kohei Yoshida <kohei.yoshida@gmail.com> [e66f5b2253d7c3b8b4915a83962962e29e72da65]
+
+ Parse it down to cell data.
+
+
+2013-06-30 Kohei Yoshida <kohei.yoshida@gmail.com> [7211ca4baa14346898fd265798f0ad4308bbb790]
+
+ Add predefined namespaces for xls xml.
+
+
+2013-06-30 Kohei Yoshida <kohei.yoshida@gmail.com> [b3285b80e90f622ea6f66da362272256b5120f76]
+
+ Set up context stacks for xls xml.
+
+
+2013-06-29 Kohei Yoshida <kohei.yoshida@gmail.com> [189852c9835103657e62777695c736b12fe6ec8a]
+
+ Add csv::parser_base to move non-templatized code for size reduction.
+
+
+2013-06-29 Kohei Yoshida <kohei.yoshida@gmail.com> [e4dd386196bbd20a717987d9204ae5bb21cef1fe]
+
+ Add csv base to move code that doesn't have to be inline.
+
+
+2013-06-29 Kohei Yoshida <kohei.yoshida@gmail.com> [655d838d08d27306bb58ca9bc86361d2af5160c5]
+
+ Move these generic functions to parser global.
+
+
+2013-06-29 Kohei Yoshida <kohei.yoshida@gmail.com> [c0c1259d65fddd63f6325888f70d37a36aec9236]
+
+ Rename sax_parser_global to sax_parser_base.
+
+
+2013-06-29 Kohei Yoshida <kohei.yoshida@gmail.com> [f0f43cbb4fa12779f06ff1bb1bc8a45267fd7b18]
+
+ Move this to base.
+
+
+2013-06-29 Kohei Yoshida <kohei.yoshida@gmail.com> [8c361e0059957a42716d671fab1cfabd5d78afbe]
+
+ Move this to base too.
+
+
+2013-06-29 Kohei Yoshida <kohei.yoshida@gmail.com> [d614bbcafe0f4b7b954d4192fda6c200930cab22]
+
+ Simply this a bit.
+
+
+2013-06-29 Kohei Yoshida <kohei.yoshida@gmail.com> [522744de1e53942543c60290b65a46d3b658bc4b]
+
+ We can move this to global too.
+
+
+2013-06-29 Kohei Yoshida <kohei.yoshida@gmail.com> [76fca2d4893918faf75d2002bbc726442a6a95f6]
+
+ Move sax_parser_element to global.
+
+
+2013-06-29 Kohei Yoshida <kohei.yoshida@gmail.com> [fad3ecf5666390312b011bb1e7089f3b36d41d99]
+
+ Move parts of sax_parser out of its template part.
+
+ To keep the size of template instances smaller.
+
+2013-06-28 Kohei Yoshida <kohei.yoshida@gmail.com> [27c83579e2b96e6c4a3c3c86147facf4c3fffcaa]
+
+ Move this to sax_parser_global.
+
+
+2013-06-28 Kohei Yoshida <kohei.yoshida@gmail.com> [3bb6f01846f7513834fc38539891dd3c63276104]
+
+ Add a test case to catch this.
+
+
+2013-06-28 Kohei Yoshida <kohei.yoshida@gmail.com> [6f06d7b09e5be271159b788fecc1325f26f07d10]
+
+ Remove these incorrect assertions.
+
+ For instance, ';' is a valid content that can trigger these assertions.
+
+2013-06-16 Kohei Yoshida <kohei.yoshida@gmail.com> [59614b60552b3d9334e5f37109467d9f5309ba32]
+
+ A bit more on xls-xml, but not much.
+
+
+2013-06-16 Kohei Yoshida <kohei.yoshida@gmail.com> [0f7bde6b047f3d843a9ade8806cf62d9f3a49f39]
+
+ Bootstrap for orcus-xls-xml.
+
+
+2013-06-16 Kohei Yoshida <kohei.yoshida@gmail.com> [5569c0512222beddda831dadf24be76fa4b698c3]
+
+ Generate token files for Excel XML format.
+
+
+2013-06-16 Kohei Yoshida <kohei.yoshida@gmail.com> [105cbf9072e955e28ac466a186042a94e463f256]
+
+ Add namespace parsing mode.
+
+ It's still rough around the edges, but it's good enough for now.
+
+2013-06-16 Kohei Yoshida <kohei.yoshida@gmail.com> [d1dd367fdc2f590e5277decc5ff4fc005d3135a6]
+
+ Re-organize the python token generator scripts.
+
+
+2013-06-16 Kohei Yoshida <kohei.yoshida@gmail.com> [1139259951736c525b7141ea6ad93235220f3139]
+
+ General-purpose XML Schema key dumper.
+
+
+2013-06-16 Kohei Yoshida <kohei.yoshida@gmail.com> [f23ccdea36406e54aec2c715c175c19082328eed]
+
+ Move these token generator python scripts from bin to misc.
+
+ They are rarely used anyway. They don't deserve to be in the bin
+ directory.
+
+2013-06-15 Kohei Yoshida <kohei.yoshida@gmail.com> [9a0c1a5e1f8183d547a070db4fbb52e0c1a29689]
+
+ Change content of this XML file.
+
+
+2013-06-15 Kohei Yoshida <kohei.yoshida@gmail.com> [45d7d23335d57ceb8a9df215c3c22ffc516f8d8d]
+
+ Rename xls2003 to xls-xml. This format is not specific to Excel 2003.
+
+
+2013-06-15 Kohei Yoshida <kohei.yoshida@gmail.com> [0392d6db4a60807112f3e767353b7d4952b03ec2]
+
+ Remove obsolete forward declarations.
+
+
+2013-06-11 Kohei Yoshida <kohei.yoshida@gmail.com> [11b98ee394192cd92bd28dfb7ad17305a42d6b4d]
+
+ Add a method to simplify check for a sequence of characters.
+
+
+2013-06-11 Kohei Yoshida <kohei.yoshida@gmail.com> [277ab911eeaa2bd92bb5a1241dcbd4f9fe00d04e]
+
+ Prevent possible buffer overflow.
+
+
+2013-06-11 Kohei Yoshida <kohei.yoshida@gmail.com> [8d40f2d7a384cc68530dfdf26f3391be8236c0bb]
+
+ Make sax_parser more secure against buffer overflow.
+
+
+2013-06-10 Kohei Yoshida <kohei.yoshida@gmail.com> [d6c385c9307b42dbfa867b3e4475d412c829cbdc]
+
+ Make it easier to add new dtd tests.
+
+
+2013-06-10 Kohei Yoshida <kohei.yoshida@gmail.com> [66fc6181f460b0154ba324b1b123e032ee2f1457]
+
+ Add test for parsing <!DOCTYPE... >.
+
+
+2013-06-10 Kohei Yoshida <kohei.yoshida@gmail.com> [fcf1fb5af875eba637ea219b8e7b22069dace79a]
+
+ We don't need this.
+
+
+2013-06-10 Kohei Yoshida <kohei.yoshida@gmail.com> [9a1edd96b8009fa85326f11e611caf566404df7c]
+
+ Parse <!DOCTYPE ... > in sax_parser.
+
+
+2013-06-09 Kohei Yoshida <kohei.yoshida@gmail.com> [60706724653013dc882e75188f1230fb8d856ede]
+
+ Test case for parsing CDATA.
+
+
+2013-06-09 Kohei Yoshida <kohei.yoshida@gmail.com> [f3388144fcb939de394d7a25e9ffb7ee4a46bd80]
+
+ On 2nd thought, let's not keep the characters and cdata separate.
+
+ They should both be handled as character data, with the same callback
+ method. Simpler the better.
+
+2013-06-09 Kohei Yoshida <kohei.yoshida@gmail.com> [ec4d03cad4f96b9181366bbbd877391b8443861d]
+
+ Add parse only test for sax_parser. No content check for this file.
+
+
+2013-06-09 Kohei Yoshida <kohei.yoshida@gmail.com> [a77ff705890f7b93374f31efd727348024c0e434]
+
+ Treat cdata and characters identically for tests, skip tabs as blanks.
+
+ Maybe it's okay to route cdata as characters in all cases. But they are
+ separate calls for now.
+
+2013-06-09 Kohei Yoshida <kohei.yoshida@gmail.com> [714645bcaa12155868ea33c55e917ca8e80d60f6]
+
+ Add support for CDATA in sax_parser.
+
+
+2013-06-09 Kohei Yoshida <kohei.yoshida@gmail.com> [3e2701ece5d4cc4ac6d58688b7585061ece1c456]
+
+ Tab character is also a blank character.
+
+
+2013-06-09 Kohei Yoshida <kohei.yoshida@gmail.com> [c39d49c65ccbcee4a860ffd3a65f0e1acdac9bf1]
+
+ Add a bit more debug outputs for sax_parser.
+
+
+2013-06-09 Kohei Yoshida <kohei.yoshida@gmail.com> [895cfed521e4d604c905477dd0faba33122e95e2]
+
+ Test RSS file taken from my own website: http://kohei.us/feed/.
+
+
+2013-06-09 Kohei Yoshida <kohei.yoshida@gmail.com> [c5b017fce8624806e766fe98c19fc8c0c58fe6a5]
+
+ I forgot to remove this.
+
+
+2013-06-09 Kohei Yoshida <kohei.yoshida@gmail.com> [8f46f9231da41a7cd4a6d677c96131e3e0753f27]
+
+ Share the xml parsing part.
+
+
+2013-06-09 Kohei Yoshida <kohei.yoshida@gmail.com> [bb6fbda483d2981dd353f0561b82245c17aac81a]
+
+ Add unit test for parsing the xml declarations.
+
+
+2013-06-09 Kohei Yoshida <kohei.yoshida@gmail.com> [d3c04c3333d4fd58e0c4ad8ba66f6e408c8a245e]
+
+ Have dom_tree store multiple declaration attributes with names as keys.
+
+
+2013-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [6ba3916ca4366f5943de9e63794bcad3f13dfe62]
+
+ Add test for parsing custom declarations.
+
+ The test file is a simple Excel 2003 XML document.
+
+2013-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [f2d3c7c91f4742caf0930c09806336691df87a2e]
+
+ Make sax_parser configurable.
+
+ The first item toggles whether the parser requires every xml stream
+ begins with <?xml...?> or not.
+
+2013-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [69f7412f6bce5e017175a7a8bf4efa69b923d99b]
+
+ No more declaration() handler callback.
+
+ The <?xml ?> declaration is also handled by the start_ and
+ end_declaration() callback pair.
+
+2013-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [a91346a442b8ddacb790a356e4b3a3cfa0ecdc68]
+
+ Declaration may have multiple attributes.
+
+
+2013-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [09b90f1952f7d01bece00eec26b3db0f0fc15828]
+
+ Add mechanism to parse arbitrary xml declarations.
+
+ With this, we can correctly parse <?mso-application ...?> tags.
+
+2013-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [1fbaf3fa79aaeafd3e8cff10e0e45f72bf1f1db8]
+
+ This method is unused.
+
+
+2013-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [ea4dff2dd746ce0011d2083a5c9065741a6545cf]
+
+ Put these global sax functions inside sax namespace.
+
+
+2013-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [54af9b740719630d2ab2a50b58df5d3441b04246]
+
+ These functions don't have to be part of the template.
+
+
+2013-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [73aeac52b8402f1f5e08e78b782f753a39b63dc8]
+
+ First Excel 2003 XML file to play with.
+
+ Currently, parsing this file throws an exception, but we need to at
+ least be able to parse this format without throwing exceptions.
+
+2013-06-08 Kohei Yoshida <kohei.yoshida@gmail.com> [7da44ea1e56ca89fe1709ae3827a67dc504e9b7b]
+
+ Let's not silently exit when exception is thrown. That's not very helpful.
+
+
+2013-06-08 Markus Mohrhard <markus.mohrhard@googlemail.com> [ba43e43600660681c072941d9af350f7fe3c636b]
+
+ use an exception to signal invalid xml files, fdo#63844
+
+
+2013-06-08 Markus Mohrhard <markus.mohrhard@googlemail.com> [49da4b0c745b22318589048a59c5a3133b35fc9a]
+
+ column width is an optional attribute
+
+
+2013-06-08 Markus Mohrhard <markus.mohrhard@googlemail.com> [f1e523e7ab33fcc265905d8b934e1f32dfdc5fd3]
+
+ add test for xlsx hidden row/column import
+
+
+2013-06-08 Markus Mohrhard <markus.mohrhard@googlemail.com> [7b2857db802bb11c4f23b23d480bee2773c0962a]
+
+ add hidden col/row import from XLSX
+
+
+2013-06-08 Markus Mohrhard <markus.mohrhard@googlemail.com> [774eca5e029944d929f0df2f581f0c85af2bacc7]
+
+ add support for hidden col/row import from gnumeric
+
+
+2013-06-08 Markus Mohrhard <markus.mohrhard@googlemail.com> [83dd743f136b979694a05723be9097d5e9fd9903]
+
+ add mock implementation for import_sheet_properties
+
+
+2013-06-08 Markus Mohrhard <markus.mohrhard@googlemail.com> [e2907363d91149cb71bc4f58ea0c55d4b16c2d61]
+
+ add test case for gnumeric col width/row height import
+
+
+2013-06-01 Kohei Yoshida <kohei.yoshida@gmail.com> [1661335a85bead5ff79a54d281bc35956a015c89]
+
+ Export these structs.
+
+
+2013-06-01 Kohei Yoshida <kohei.yoshida@gmail.com> [ac6a9ac26aa09f01b769cb65c490e2c85773efee]
+
+ Move these structs out of import_styles scope.
+
+
+2013-06-01 Kohei Yoshida <kohei.yoshida@gmail.com> [d4038cd9b530a52433452fdf13ef6b9544d63e11]
+
+ Export this struct.
+
+
+2013-06-01 Kohei Yoshida <kohei.yoshida@gmail.com> [3771ee2c93da4d3098361b118d0aab5254b44cf1]
+
+ Make cell format storage column major.
+
+
+2013-06-01 Kohei Yoshida <kohei.yoshida@gmail.com> [2f953961f24e1654ffbde575e50e18817b5d7c8c]
+
+ Make format_run struct a top level item.
+
+
+2013-06-01 Kohei Yoshida <kohei.yoshida@gmail.com> [2a62185bac0de30dca3e993e5b0f8df25db8749a]
+
+ New xlsx document for importing formatted text content.
+
+ Bold and italic text only for now.
+
+2013-06-01 Kohei Yoshida <kohei.yoshida@gmail.com> [ee22a06d46afe3433252359299a3c19395fcac63]
+
+ Add unit test for column width and row height import from ods.
+
+
+2013-05-30 Markus Mohrhard <markus.mohrhard@googlemail.com> [c81da4317b297ccc4acb27d30d77f1b17b167d19]
+
+ r is an optional attribute in row and c
+
+
+2013-05-30 Markus Mohrhard <markus.mohrhard@googlemail.com> [0ea76ebc78080dfb4f462f9ee2cdec3b9fbe82a4]
+
+ import col and row height/width from gnumeric
+
+
+2013-05-30 Kohei Yoshida <kohei.yoshida@gmail.com> [960156ec673a7a2e91ca103dd3cad6fa88fe63e3]
+
+ Add test case for XML byte order mark (BOM).
+
+
+2013-05-29 Markus Mohrhard <markus.mohrhard@googlemail.com> [71d4efba781af4ddb8c5e4e2589ebdac22ff87df]
+
+ skip byte order mark for xml streams
+
+ We only handle UTF-8 streams right now so we can bail out already when
+ we read a wrong byte order mark.
+
+2013-05-29 Fridrich Štrba <fridrich.strba@bluewin.ch> [2ba8c2407be26a7a6c6f0b681567311d5bf15c74]
+
+ Some cleanup of pkg-config file
+
+
+2013-05-23 Fridrich Štrba <fridrich.strba@bluewin.ch> [833caa16d7c5662217f9789f901952f20bf1dca8]
+
+ Fix distcheck errors and allow tests run from build directory
+
+
+2013-05-19 Kohei Yoshida <kohei.yoshida@gmail.com> [0930ef22a9f17db09d3f2cbb6a0b6f5b0cdd770f]
+
+ Add swap() to document.
+
+
+2013-05-19 Kohei Yoshida <kohei.yoshida@gmail.com> [e02676394e2cca319ac3c9df4425a6f0e9943a4e]
+
+ Add sheet_size() to document to return the number of sheets.
+
+
+2013-05-19 Kohei Yoshida <kohei.yoshida@gmail.com> [51c3616cb2cef20674c6f4a96d76a1fba15f0929]
+
+ Sheet now returns its actual row and column sizes via these methods.
+
+
+2013-05-19 Kohei Yoshida <kohei.yoshida@gmail.com> [debe48461edbde7f8484e45381792dc12a5d536b]
+
+ Have the factory implementation store the default column and row sizes.
+
+
+2013-05-19 Kohei Yoshida <kohei.yoshida@gmail.com> [c3058828ff212618e43275586f74f1ea54826cd9]
+
+ Let the caller specify the default row and column sizes for sheets.
+
+
+2013-05-17 Kohei Yoshida <kohei.yoshida@gmail.com> [bf0b31d923ed50c15831b26146d73e3f5987102e]
+
+ Import row heights from xlsx documents.
+
+
+2013-05-16 Kohei Yoshida <kohei.yoshida@gmail.com> [fad8ea5c291bfd9f8ca549947ece034098b7864c]
+
+ Import Excel's column widths.
+
+ But the conversion may not be correct. Find a better way to convert
+ them.
+
+2013-05-14 Kohei Yoshida <kohei.yoshida@gmail.com> [5da5b5558c6a786dd4f3d60f8466c12bd16a0c95]
+
+ Parse column widths in xlsx.
+
+
+2013-05-14 Kohei Yoshida <kohei.yoshida@gmail.com> [17cd3795042d4de1dc6ebe8c65fceda11aa804da]
+
+ Calculate formula cells during finalize() phase.
+
+
+2013-05-13 Kohei Yoshida <kohei.yoshida@gmail.com> [3a5b274e5c25a6f9af68e9f729a801a35403e156]
+
+ Remove these debug statements.
+
+
+2013-05-09 David Tardon <dtardon@redhat.com> [db809c970400142d477f969ced247ce77d91435e]
+
+ catch exception in main
+
+
+2013-05-09 David Tardon <dtardon@redhat.com> [05066b918d31c3e8b4811fe1c42a6c75615225cf]
+
+ drop unused variable
+
+
+2013-05-09 David Tardon <dtardon@redhat.com> [c71a7358d8d5760ca560c0d45d700f1f42dc4561]
+
+ coverity: do not return contents of a local object
+
+
+2013-05-09 David Tardon <dtardon@redhat.com> [786a6a5ff22b9f94bb755936a4be9c8a12276b19]
+
+ coverity: uninitialized members
+
+
+2013-05-09 David Tardon <dtardon@redhat.com> [c644d8793bc5309a798667d4fc07e657c6e2c2ca]
+
+ coverity: missing break
+
+
+2013-05-09 David Tardon <dtardon@redhat.com> [dd8c40155672905f651ce83fb050e7aa58ff080b]
+
+ coverity: add missing throw
+
+
+2013-05-08 Kohei Yoshida <kohei.yoshida@gmail.com> [12a347acf8f340d49c28b91a8c68be0f604730ae]
+
+ Support convertion from cm to twips.
+
+
+2013-05-05 Kohei Yoshida <kohei.yoshida@gmail.com> [1dcc9c1e47c4bcd13a067ab8c01cc028a79c15b3]
+
+ Allow fetching sheet object by index.
+
+
+2013-05-05 Kohei Yoshida <kohei.yoshida@gmail.com> [6750976a35b10ff88d0616cbeacb873afaf4c12a]
+
+ Two new constants for default column width and row height.
+
+
+2013-05-05 Kohei Yoshida <kohei.yoshida@gmail.com> [9aa213e81b45990f493bdd0c51377735ed9334d7]
+
+ Adopt to API change in mdds 0.8.0.
+
+
+2013-05-05 Kohei Yoshida <kohei.yoshida@gmail.com> [df6432ba9a27cd7ac7de6a225a2747a21eb5041b]
+
+ Require mdds 0.8.0 (yet to be released, the lateast on the master branch).
+
+
+2013-05-05 Kohei Yoshida <kohei.yoshida@gmail.com> [eaaa0ffba5183f80fb9b021a9b8f7f0be49b92c5]
+
+ Add getters for column widths and row heights.
+
+
+2013-05-05 Kohei Yoshida <kohei.yoshida@gmail.com> [2647d1ad9126249b09d239f14164158767dc95e6]
+
+ Return the real column and row sizes.
+
+
+2013-05-05 Kohei Yoshida <kohei.yoshida@gmail.com> [14aa0909edab7505cdc3fdf1179ee9a562847054]
+
+ Build tree for column width and row height containers at the end.
+
+
+2013-05-04 Kohei Yoshida <kohei.yoshida@gmail.com> [e69f33a4abd360c459550785c09f560b7ed63c8d]
+
+ Convert row heights and column widths to twips on import.
+
+
+2013-05-02 Kohei Yoshida <kohei.yoshida@gmail.com> [59f75039672165d205475ff14b896e2359e166f7]
+
+ Add methods to set column widths and row heights. Not used yet.
+
+
+2013-05-02 Kohei Yoshida <kohei.yoshida@gmail.com> [40c5f632a9d67053e943370a3c4323d29e29a2d4]
+
+ Some comments.
+
+
+2013-05-02 Markus Mohrhard <markus.mohrhard@googlemail.com> [669598c2378873cdd76bba501b00dfcd428af3e0]
+
+ activate the missing two tests
+
+
+2013-05-02 Markus Mohrhard <markus.mohrhard@googlemail.com> [c8ac4f888455fdfe2fe06c8300af0da5f4388b24]
+
+ this should be an equality check
+
+
+2013-05-02 Fridrich Štrba <fridrich.strba@bluewin.ch> [11f559cb7de6ab84cbb33ec1cbf3075ca2a8581b]
+
+ Sanitize a bit.
+
+
+2013-05-01 Kohei Yoshida <kohei.yoshida@gmail.com> [59a72df2cd50c9da62441925f407a0b88999361f]
+
+ In ptr_map::insert(), the 1st arg must be non-const reference.
+
+ when the 2nd argument is a raw pointer. There is also a variant that
+ takes a const ref as the 1st arg and a auto_ptr wrapped pointer as the
+ 2nd arg.
+
+2013-05-01 Kohei Yoshida <kohei.yoshida@gmail.com> [3ffce11e638ef2a3f1cbcb1faa0fb4b1329e0b9b]
+
+ Remove warning.
+
+
+2013-05-01 Kohei Yoshida <kohei.yoshida@gmail.com> [61625786a4cb510330903ee751603365e11043bc]
+
+ comment
+
+
+2013-05-01 Kohei Yoshida <kohei.yoshida@gmail.com> [b9db29da1ab2d8448618b97e07baa161c37b3b09]
+
+ Pass row heights to sheet properties as well.
+
+
+2013-05-01 Kohei Yoshida <kohei.yoshida@gmail.com> [d8ce5e4fe3b57ff687b4fb0b76b91c36bd30c6dd]
+
+ Pass column widths to the sheet properties interface.
+
+
+2013-05-01 Kohei Yoshida <kohei.yoshida@gmail.com> [aa5ae47e1aef51cdf8c379729a0ab8ed86082a5f]
+
+ A littl cleanup.
+
+
+2013-05-01 Kohei Yoshida <kohei.yoshida@gmail.com> [cf1440d4ea48744167af133ea722b97b86c5dfa4]
+
+ Implement sheet_properties to import & store column widths and row heights.
+
+ For now it's just an empty implementation.
+
+2013-05-01 Kohei Yoshida <kohei.yoshida@gmail.com> [6920d14eb8fc3bb81732025af15ffce9f2a408bb]
+
+ New import interface to import column widths and row heights.
+
+
+2013-05-01 Kohei Yoshida <kohei.yoshida@gmail.com> [06ed5c944cfb8883563d44c29812d5af7f48daed]
+
+ A bit better printout of style data.
+
+
+2013-05-01 Kohei Yoshida <kohei.yoshida@gmail.com> [577728cfa443bd93a4868d690ee0b2115ab2cd78]
+
+ Initialize data with NULL pointer.
+
+
+2013-05-01 Kohei Yoshida <kohei.yoshida@gmail.com> [17d0402e80d69fad9df4e49723c06ad396a7eeea]
+
+ Print styles picked up at the end of the automatic-styles context.
+
+
+2013-04-30 Kohei Yoshida <kohei.yoshida@gmail.com> [c919260e29f2d77e94a6f4eff108666792e30286]
+
+ Insert some asserts (just to be sure...)
+
+
+2013-04-30 Kohei Yoshida <kohei.yoshida@gmail.com> [6d43aa139123caadbe617edee4e0cdd59ec09ca1]
+
+ Pick up column widths and row heights as I parse automatics-styles.
+
+
+2013-04-30 Kohei Yoshida <kohei.yoshida@gmail.com> [94b7f645f21f6ff7fd03613e461b3492bacd4c37]
+
+ Add odf_style struct. Still pretty much empty & not even used.
+
+
+2013-04-30 Kohei Yoshida <kohei.yoshida@gmail.com> [423adb86d57683b1cf9ac0410d8a420c0a339734]
+
+ Test document for import of column widths and row height values.
+
+
+2013-04-29 Kohei Yoshida <kohei.yoshida@gmail.com> [80bf4ea23cd5dd9beae2c7ff81a65c062b3d6de5]
+
+ Simple stream handler needs to have its own element handlers.
+
+ To prevent the only context from being popped from the stack.
+
+2013-04-29 Kohei Yoshida <kohei.yoshida@gmail.com> [e87a267c556f299a7d714143a051181968cc3cf7]
+
+ Fix for werror.
+
+
+2013-04-28 Kohei Yoshida <kohei.yoshida@gmail.com> [05f3048c9ffeb560b33da560de882444da47e409]
+
+ Make ixion's model_context accessor public.
+
+
+2013-04-28 Kohei Yoshida <kohei.yoshida@gmail.com> [9e39d0ed1311bc1c47a8aa0bc05256b0fce38324]
+
+ Require libixion-0.8.
+
+
+2013-04-28 Kohei Yoshida <kohei.yoshida@gmail.com> [15d8931f07cef9ec7420fa00bb2b2dad14aa89a3]
+
+ Fix this whitespace error.
+
+
+2013-04-27 Kohei Yoshida <kohei.yoshida@gmail.com> [36bfc73bb7a3df1c84f6b84c08ac0006163c00ca]
+
+ Add method clear() to document.
+
+
+2013-04-27 Kohei Yoshida <kohei.yoshida@gmail.com> [f165610acb8f21d660425d89848e591052943a7d]
+
+ Typo.
+
+
+2013-04-27 Kohei Yoshida <kohei.yoshida@gmail.com> [d5df9acef4257a6ceedc35d65b477c93d1bf34d4]
+
+ Move the spreadsheet headers to public place.
+
+
+2013-04-26 Kohei Yoshida <kohei.yoshida@gmail.com> [e7830fe7c57fbc8eb31c113cdcc2f3c94103fc56]
+
+ Use mdds's pkg-config file to detect it. Much simpler this way.
+
+
+2013-04-24 Tomas Chvatal <tchvatal@suse.cz> [6d6aeb7d11057b5df774f1425bb49837f13c80c2]
+
+ Better to use AC_CONFIG_HEADERS here.
+
+
+2013-04-24 Tomas Chvatal <tchvatal@suse.cz> [fb81582e3a0366620306efba93741437c049d67c]
+
+ liborcus-parser needs to link to boost.
+
+
+2013-04-21 Kohei Yoshida <kohei.yoshida@gmail.com> [025430a1cf765c9f66e0c352a2d0c0c0fbd9cf22]
+
+ Convert column widths and row heights in ods styles parsing.
+
+
+2013-04-21 Kohei Yoshida <kohei.yoshida@gmail.com> [e350451ddfcb0da0e1a2256f9170cee12bd96ada]
+
+ Add to_double function to convert string to double.
+
+ In the future we'll be using this in lieu of stdtod, which is very
+ slow on Windows.
+
+2013-04-21 Kohei Yoshida <kohei.yoshida@gmail.com> [0d423f1dedc33969fe6fccff501ce72540be6a07]
+
+ Test for 'cm' parsing & fix the decimals handling in the test code.
+
+
+2013-04-21 Kohei Yoshida <kohei.yoshida@gmail.com> [969ad1c22c7aaad124b0bcab7acd729abf2c7901]
+
+ Test for parsing 'in' for inches.
+
+
+2013-04-21 Kohei Yoshida <kohei.yoshida@gmail.com> [7cc9bbc8881c0335c87c427f8d089a7236bc667a]
+
+ Manually convert numeric string into a double.
+
+
+2013-04-20 Kohei Yoshida <kohei.yoshida@gmail.com> [a34c43e9820743d9201de22ceebf096e03bdd04c]
+
+ Just use boost::unordered_map for this, to keep it simple.
+
+
+2013-04-17 Kohei Yoshida <kohei.yoshida@gmail.com> [273694f4d9a567b9c86a57781021b7701cc0bf08]
+
+ Function to convert style family textural value into an enum.
+
+ But I should probably turn this into a more generalized function.
+
+2013-04-16 Kohei Yoshida <kohei.yoshida@gmail.com> [fa31d5502a0b731fa2998c71d66d4e6c3b7a17eb]
+
+ More on parsing automatic styles context.
+
+
+2013-04-16 Kohei Yoshida <kohei.yoshida@gmail.com> [edc4de335634933c7f4bf6b253d8acce178ec0a8]
+
+ ORCUS_ header guard prefix.
+
+
+2013-04-16 Kohei Yoshida <kohei.yoshida@gmail.com> [ca726bad0f052c87da27d58a4061119f2e1c5913]
+
+ Minor formatting oddity.
+
+ Auto-generated from SlickEdit. Apparently the compiler parses it fine...
+
+2013-04-16 Kohei Yoshida <kohei.yoshida@gmail.com> [ceab79d45e5e671f640ef72ade50de82e83811bf]
+
+ Skeleton implementation for handling automatic styles in ods.
+
+
+2013-04-16 Kohei Yoshida <kohei.yoshida@gmail.com> [6618de4dd6792972eddd2db1de3bd13cf0645854]
+
+ New test file with custom column widths and row heights applied.
+
+
+2013-04-16 Kohei Yoshida <kohei.yoshida@gmail.com> [021854d0abdc80d70f33cc902e57d7515574f5fc]
+
+ Make it a concrete data member.
+
+
+2013-04-16 Kohei Yoshida <kohei.yoshida@gmail.com> [aff7bfc51499355d50760626a38ea36be02350ce]
+
+ Re-use the same para_text_context instance, for better efficiency.
+
+
+2013-04-16 Kohei Yoshida <kohei.yoshida@gmail.com> [43453d70e923e6fcf415f201bf97ae04d8d4f6df]
+
+ Move the context stack handling part up to xml_stream_handler.
+
+ It was just a bunch of copy-n-pasted block code blocks.
+
+2013-04-16 Kohei Yoshida <kohei.yoshida@gmail.com> [126348551dff4e1e0a54ce71947b9840fe9a8b52]
+
+ Fix memory leak in orcus-gnumeric.
+
+
+2013-04-16 Kohei Yoshida <kohei.yoshida@gmail.com> [5bea4103aace7ba24bfbec9a5c5d00858ec3743d]
+
+ Have immediate parent context manage the life cycle of its own child contexts.
+
+ The top level context handler now only deletes the root xml context instance.
+ Each individual context class is now responsible for managing the life cycles
+ of its own child contexts that it returns.
+
+ With this, a context can re-use the same instance repeatedly as a child
+ context instead of creating each child context on the heap.
+
+2013-04-16 Kohei Yoshida <kohei.yoshida@gmail.com> [6c495a08fba6d28027ea18c5d4b59b1c08433078]
+
+ Fix memory leak.
+
+
+2013-04-16 Kohei Yoshida <kohei.yoshida@gmail.com> [2bfc90e09d8734de6bc8fce4935646454f106241]
+
+ Disable this.
+
+
+2013-04-16 Kohei Yoshida <kohei.yoshida@gmail.com> [c25a006ed2f7f226f515d66150c44f3eca1a63f8]
+
+ Get liborcus-spreadsheet-model to build when --enable-static.
+
+
+2013-04-16 Kohei Yoshida <kohei.yoshida@gmail.com> [8d59bf1321aa7ccca6cdb8cad95265657192aae7]
+
+ Add --without-tools configure to skip building of binary tools.
+
+
+2013-04-16 Kohei Yoshida <kohei.yoshida@gmail.com> [20cf0da0e4dce431c4705e043c9a11a046117048]
+
+ Keep it consistent in configure.ac & test files updated.
+
+
+2013-04-16 Kohei Yoshida <kohei.yoshida@gmail.com> [d09d7b61b28dcd18495ec8e7cc9a8c2dc3030baf]
+
+ Add documentation on how xlsx and ods handle column widths and row heights.
+
+
+2013-04-14 Kohei Yoshida <kohei.yoshida@gmail.com> [84175ac8aa8e52577dfaf0bd9ed6e1f7b7ddb3b1]
+
+ Up the version to 0.7.0 and the API version to 0.8.
+
+ pstring's exported symbols have changed due to the removal of static
+ intern methods.
+
+2013-04-14 Kohei Yoshida <kohei.yoshida@gmail.com> [0647853c30ac3c54201a0d0fb4e0cfcef1954945]
+
+ No more global pstring intern pool, to make orcus filters re-entrant.
+
+ Now, each orcus_* class stores string_pool instance, and the document
+ has its own string pool.
+
+2013-04-14 Kohei Yoshida <kohei.yoshida@gmail.com> [6c6e4a9b95e7464ed8dafb97b98efbad2f112821]
+
+ Add session_context which stores data shared in each import session.
+
+
+2013-04-14 Kohei Yoshida <kohei.yoshida@gmail.com> [b38bfa1c511da7d98c1a79dfbe41d86dc1e714e8]
+
+ We don't need to do this.
+
+
+2013-04-12 Kohei Yoshida <kohei.yoshida@gmail.com> [363241399191418d057c036cfcc1b11cb2cde677]
+
+ Up the version to 0.5.1 since I need to release a newer version.
+
+
+2013-04-12 Kohei Yoshida <kohei.yoshida@gmail.com> [0b4a9fa900200fc42d5bbc0355e4df4804e34a2e]
+
+ Add BOOST_ALL_NO_LIB compiler macro.
+
+
+2013-04-12 Kohei Yoshida <kohei.yoshida@gmail.com> [05d61a55bd33249e5c5a09c16bf02220f0e0821d]
+
+ Don't forget to list this windows only header file.
+
+
+2013-04-11 Kohei Yoshida <kohei.yoshida@gmail.com> [7ee792804ab45f448058973cb7b03fcc4629d4c9]
+
+ Let's not include these manual test files. They'd make the package too big.
+
+
+2013-04-11 Kohei Yoshida <kohei.yoshida@gmail.com> [926026ce350d161b52f782a25dfd7d4c37ae41a0]
+
+ make dist was still broken. Hopefully fixed it this time.
+
+
+2013-04-11 Kohei Yoshida <kohei.yoshida@gmail.com> [b986729f576ad01b4663c0a47deffcbc0a401e95]
+
+ Rename package name from orcus to liborcus.
+
+
+2013-04-11 Kohei Yoshida <kohei.yoshida@gmail.com> [077d8bbc7581b9d23687280471e902ea78e6492b]
+
+ Up the version number, with a new API version.
+
+
+2013-04-11 Kohei Yoshida <kohei.yoshida@gmail.com> [e4738f083542eb237c3c514643b3648b605bff2b]
+
+ Fix 'make dist'.
+
+
+2013-04-11 Kohei Yoshida <kohei.yoshida@gmail.com> [22f2be74a9fb389c884743c3c3d36d0f251d8ec0]
+
+ Update Visual Studio solution.
+
+
+2013-04-10 Kohei Yoshida <kohei.yoshida@gmail.com> [fc648b4b8688c5cb53f4eaef272a0d5d79af2e02]
+
+ I forgot to add these files.
+
+
+2013-04-10 Kohei Yoshida <kohei.yoshida@gmail.com> [f025ef4f386954d71cdacfbb2db7ddd9ee41bc4a]
+
+ Pick up and set the "origin date" aka epoch during ods import.
+
+ For now, we don't use this information. But later we will.
+
+2013-04-10 Kohei Yoshida <kohei.yoshida@gmail.com> [dba063dbe21ad3a6e3190bec1d405f7bb986c7c5]
+
+ I'll convert date values into string values for now.
+
+
+2013-04-10 Kohei Yoshida <kohei.yoshida@gmail.com> [5a8de96af52e7bdf802ddc9607e639288332f474]
+
+ Found and fixed a bug in to_date_time. Added another test.
+
+
+2013-04-10 Kohei Yoshida <kohei.yoshida@gmail.com> [4e29297c9801a2a169afe7c332f69f1b6dad508a]
+
+ Run the test for real, which fails miserably...
+
+
+2013-04-10 Kohei Yoshida <kohei.yoshida@gmail.com> [a92bc4ba1b501d3dbb27a9b9d32a08b853fdff8b]
+
+ Add framework for common test in liborcus.
+
+ I'll use this to test the date-time conversion function.
+
+2013-04-10 Kohei Yoshida <kohei.yoshida@gmail.com> [9662b62f10f7fc698c4175230c07df6b944e83a4]
+
+ License header.
+
+
+2013-04-09 Kohei Yoshida <kohei.yoshida@gmail.com> [f01f585941fd680529a3694a12d99cb3cbe13375]
+
+ Add set_date to the sheet import interface. ODS needs this.
+
+ ODS treats date values separately whereas xlsx imports them as numeric
+ values.
+
+2013-04-09 Kohei Yoshida <kohei.yoshida@gmail.com> [a42a3e4d0f8bb9e5015494618f05302b787911d0]
+
+ Add finalize() to the import_factory and call it at the end of import.
+
+ This is to give the implementor a chance to do post-processing at the
+ end of each import session.
+
+2013-04-09 Kohei Yoshida <kohei.yoshida@gmail.com> [cfc9950c61d36c3975046fdc5d637171ee2d2754]
+
+ Check whether the client code supports style import.
+
+ And if not, abort reading of styles.
+
+2013-03-25 Kohei Yoshida <kohei.yoshida@gmail.com> [f736b278e566df92a4ea05ac993fd47913e02716]
+
+ These forward declarations are no longer needed.
+
+
+2013-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [25a99aa68364a1c47843fea746cd95a0eeba399e]
+
+ Open file stream in binary mode, else zip archive fails on Windows.
+
+ Windows file stream calls apparently differentiates binary mode and
+ non-binary mode. On Linux the two don't cause little noticeable
+ differences.
+
+2013-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [7e700b93afadb5e3fe8c2a334d6c17e9df3b2319]
+
+ Fix project dependency for orcus-xml.
+
+
+2013-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [e05d04d8d4a7ffe9c9e1400d4a3860601517b0b2]
+
+ Add liborcus-static project to Visual Studio Solution.
+
+ liborcus-static depends on liborcus-parser-static.
+
+2013-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [6119e0ef1409f89c48ba8da513b687d56b495083]
+
+ Get liborcus to build in Visual Studio 2008.
+
+ On Windows, liborcus also includes the libparser part, instead of
+ keeping liborcus and liborcus-parser as two separate libraries.
+
+ This is the only way to build this on Windows, else we would have to
+ define a new set of DLL macros for each separate library.
+
+2013-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [c103556d448c53b26f8f25cacd44027e91ce1c56]
+
+ Some re-organization...
+
+
+2013-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [58d3b85cc896fa71fa4e5f5887803c2ef2f5ff44]
+
+ Hide global constant values.
+
+
+2013-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [8076f58963f8c9b9f77242ed03264b4be757c7da]
+
+ Remove the libzip dependency bits from vs project files.
+
+
+2013-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [94174040b8061ce59c97054d385c39e4b4a9f8df]
+
+ Update the copyright years.
+
+
+2013-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [c9d67f836c36dbdff1b4cccbe474ea9894f08fc2]
+
+ Don't take a reference from for_each.
+
+ Because, by the time for_each call ends, the object that is referenced
+ has been destroyed, and the reference is pointing to a non-existing
+ object.
+
+2013-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [2c42c37fc82a15444e0b6c3b2b1f1fe005910779]
+
+ Add new test for xlsx.
+
+ To make sure we parse empty shared string xml stream correctly.
+
+2013-03-24 Kohei Yoshida <kohei.yoshida@gmail.com> [83225d62da38b05949752f54f70dad75758c13a2]
+
+ Don't call characters() unless we are in xml hierarchy.
+
+ For instance, when we are still in the xml declaration (before the
+ opening root element), we shouldn't call characters.
+
+2013-03-23 Kohei Yoshida <kohei.yoshida@gmail.com> [2ff31d015ce5c59177d37d1af1cfadb0ef2776ca]
+
+ Add new test xlsx file that currently crashes orcus-xlsx.
+
+ It has a sharedStrings.xml stream but the list is empty.
+
+2013-03-23 Kohei Yoshida <kohei.yoshida@gmail.com> [145a129670d70dac59165eb47da8849e8986f8b5]
+
+ Remove the libzip bits. Now orcus no longer depends on libzip.
+
+
+2013-03-23 Kohei Yoshida <kohei.yoshida@gmail.com> [ade634f3e4ca7864a50bc5d23dae3e1d4962f2c2]
+
+ Switch orcus::opc_reader from libzip to using zip_archive.
+
+
+2013-03-21 Markus Mohrhard <markus.mohrhard@googlemail.com> [63b5a2182f07b0b80426a0fbfe360eb955b2f14e]
+
+ fix some linking errors on windows
+
+
+2013-03-21 Markus Mohrhard <markus.mohrhard@googlemail.com> [63f4dbbbb42f2ac08ca8bbec83857973a96f68f6]
+
+ license header
+
+
+2013-03-21 Markus Mohrhard <markus.mohrhard@googlemail.com> [f559085b2483be8400ea8a9951174c52dd360239]
+
+ liborcus project compiles again with visual studio
+
+ still some linker problems
+
+2013-03-21 Markus Mohrhard <markus.mohrhard@googlemail.com> [8530fae41358c5a7c45b7e6d9d8f7dd97e9c5b74]
+
+ use environment variables also for libzip
+
+
+2013-03-21 Markus Mohrhard <markus.mohrhard@googlemail.com> [7cb6e4210f80fd0d82869d8abc4d73f729d42157]
+
+ get the parser projects working again
+
+
+2013-03-21 Markus Mohrhard <markus.mohrhard@googlemail.com> [a3694c0941c7137241e8e160ed7839d64c8f1534]
+
+ visual studio before 2010 does not support stdint.h
+
+ abstract the handling of stdint.h on windows to differentiate between
+ versions supporting C99 and ones that don't
+
+2013-03-21 Markus Mohrhard <markus.mohrhard@googlemail.com> [8b86ed0d148752eaadd6eaeae3f7cdff22236221]
+
+ MSVC does not know fseeko and ftello
+
+ map these functions to the corresponding windows functions on windows
+
+2013-03-21 Markus Mohrhard <markus.mohrhard@googlemail.com> [7dc83bfc43aa8a939a978b57651cb3cd442c0e25]
+
+ fix liborcus-parser* on windows
+
+
+2013-03-17 Kohei Yoshida <kohei.yoshida@gmail.com> [9e34b91627f1d17bd2d48f7a679ab79a5638d49f]
+
+ A bit more cleaning.
+
+
+2013-03-17 Kohei Yoshida <kohei.yoshida@gmail.com> [afc6d1b1ef0b07640419b9fb12e52ba35e4d4493]
+
+ orcus-ods to use our own zip_archive instead of libzip.
+
+
+2013-03-17 Kohei Yoshida <kohei.yoshida@gmail.com> [5954e3044cb4ab7f4e6e3d63122f7b6f2c9c7e45]
+
+ Rename class stream to zip_stream_parser.
+
+
+2013-03-17 Kohei Yoshida <kohei.yoshida@gmail.com> [a0855792f3b791afa5af7d9ebfddcec32b8aa972]
+
+ Add method documentation.
+
+
+2013-03-17 Kohei Yoshida <kohei.yoshida@gmail.com> [74a685b8fbaf37ccc77cf418882f0dad692da828]
+
+ Support dumping by file entry name.
+
+
+2013-03-17 Kohei Yoshida <kohei.yoshida@gmail.com> [70dcea9a487fc3797f96cf614f1357cf7407a3da]
+
+ Turn off debug mode for zip_archive.
+
+
+2013-03-17 Kohei Yoshida <kohei.yoshida@gmail.com> [508bf3b1d7fd95cec23a4d084d8bc89e019afe28]
+
+ A little more cleanup.
+
+
+2013-03-17 Kohei Yoshida <kohei.yoshida@gmail.com> [f2b8f29c374831fe424cb9243b4eedd076e77ed1]
+
+ Clean up read_file_entries wrt debug statements.
+
+
+2013-03-17 Kohei Yoshida <kohei.yoshida@gmail.com> [828e690ca90436796c588f33c253a56733cb23ae]
+
+ Clean up zip_archive_impl::read_central_dir_end().
+
+
+2013-03-16 Kohei Yoshida <kohei.yoshida@gmail.com> [330704d2ea6ece23300012e6efde12d089697595]
+
+ Remove duplicate code.
+
+
+2013-03-16 Kohei Yoshida <kohei.yoshida@gmail.com> [edffd5d5857f94db02973bbaa2bbce096646179e]
+
+ Read zip file entry content by the entry name.
+
+
+2013-03-10 Kohei Yoshida <kohei.yoshida@gmail.com> [6dfc13c8e99d7789d09e6ea88ba49652f1dac3f1]
+
+ Method description.
+
+
+2013-03-10 Kohei Yoshida <kohei.yoshida@gmail.com> [38d7f74c942264691975eca20c6c4a79fba74e2b]
+
+ Reading the file entries should be part of load().
+
+
+2013-03-09 Kohei Yoshida <kohei.yoshida@gmail.com> [f12328d1e173a5d9d2f3a34ec1cfb97281987840]
+
+ Use the abstracted stream access to unzip a stream.
+
+
+2013-03-09 Kohei Yoshida <kohei.yoshida@gmail.com> [1dcb817141b31bc76e5c59210dde08f8aab66e20]
+
+ First step toward abstracting the stream access.
+
+ This change includes file stream on disk via file descriptor.
+
+2013-03-09 Kohei Yoshida <kohei.yoshida@gmail.com> [5d37a9c3479906564ed81d139a2488f93a3748ba]
+
+ Add this file to the slickedit project.
+
+
+2013-03-09 Kohei Yoshida <kohei.yoshida@gmail.com> [1d246ade3fde211ceebbafe51b64f82d04f8d612]
+
+ Do the z_stream initialization in zip_inflater. Looks cleaner that way.
+
+
+2013-03-09 Kohei Yoshida <kohei.yoshida@gmail.com> [897a7ff5c6c3dc9470c460c6c998b30b48d6a968]
+
+ Implement lightweight zip archive support directly in orcus.
+
+ This will eventually replace the use of libzip within orcus, and
+ to remove dependency on libzip.
+
+ With this change, zlib is now a hard requirement. Previously, zlib
+ was required only when the gnumeric filter was enabled.
+
+2013-02-16 Stephan Bergmann <sbergman@redhat.com> [f60d6eecee72349993a392a9a63ddf3383d3b8c8]
+
+ Missing include <boost/noncopyable.hpp>
+
+ (at least when compiling against Boost 1.53.0)
+
+2013-02-16 Stephan Bergmann <sbergman@redhat.com> [b09150fd4374d9f1198c3c843260729cebbd9be5]
+
+ Missing dependency on boost_system lib
+
+ (for boost::system::generic_category(), boost::system::system_category(), at
+ least when building against boost-devel-1.50.0-4.fc18.x86_64)
+
+2013-01-28 Markus Mohrhard <markus.mohrhard@googlemail.com> [beabb3349ee5dd3ea1019fbb207da3e1976e8c65]
+
+ move the xlsx test too
+
+
+2013-01-28 Markus Mohrhard <markus.mohrhard@googlemail.com> [74764e3889cc43e9b601a63d01bbbc455bc9a5f4]
+
+ fix some problems around gnumeric style import
+
+
+2013-01-28 Markus Mohrhard <markus.mohrhard@googlemail.com> [08747f360db6805ac5ea5f760847995594a6c6a9]
+
+ add number format import from gnumeric
+
+
+2013-01-28 Markus Mohrhard <markus.mohrhard@googlemail.com> [51f87949aaea342205c3cb576a4475b41de1e346]
+
+ support number format import
+
+
+2013-01-28 Markus Mohrhard <markus.mohrhard@googlemail.com> [23c91ec14f0c424d2852bba24e65cf9563a2ef8e]
+
+ add boolean cell import from XLSX
+
+
+2013-01-28 Markus Mohrhard <markus.mohrhard@googlemail.com> [1c80404ce2d515603b7142c274ce74b34f5c623d]
+
+ add bool cell import from gnumeric
+
+
+2013-01-28 Markus Mohrhard <markus.mohrhard@googlemail.com> [38921e6f2efa25d9535095ae293931c324976d6f]
+
+ add boolean cell import
+
+
+2013-01-28 Markus Mohrhard <markus.mohrhard@googlemail.com> [99b7f4e1a9e7d1bc12da4a69cdcd710534b10c3b]
+
+ make these names more orcus-like
+
+
+2013-01-28 Markus Mohrhard <markus.mohrhard@googlemail.com> [b456713d31c697fe5044088b99aa4bdcab775032]
+
+ add test for xlsx array formula import
+
+
+2013-01-28 Markus Mohrhard <markus.mohrhard@googlemail.com> [9ebc22a10eaddb8215575afc29a9075d42699058]
+
+ add intial test for xlsx_sheet_context
+
+
+2013-01-28 Markus Mohrhard <markus.mohrhard@googlemail.com> [266f66c2b57ee88a5ff4d2caa330b0a83944095d]
+
+ import array formulas from OOXML
+
+
+2013-01-28 Markus Mohrhard <markus.mohrhard@googlemail.com> [f18e0ed1c77dea3df71eec40fba31ebdcb3c6c4d]
+
+ import array formulas from gnumeric
+
+
+2013-01-28 Markus Mohrhard <markus.mohrhard@googlemail.com> [67646f6cb57f3f6d32b9c5f0ff218875aa569172]
+
+ initial support for array formula import
+
+ However we still need to decide how we want to handle the cells in the
+ range of the array formula. ODF and OOXML write only the top left cell
+ into the document as a formula cell, all other cells are written as
+ normal value cells.
+
+ We have two ways to handle this:
+ * Leave this problem to the implementer of the interface
+ * Store internally all array ranges and decide there whether a value cell
+ is a real value cell or the value represents a formula result.
+
+ The second approach breaks a bit the concept of orcus because we no
+ longer can easily import the content without knowing what has been
+ imported already. The first one however means that we move some of the
+ import problems to the implementer and the mentioned concepts are only
+ found in ODF and OOXML.
+
+2013-01-28 Markus Mohrhard <markus.mohrhard@googlemail.com> [3dc5cd2bb2019704bbd6dee2d833438b7fc4d4e0]
+
+ add tests for gnumeric shared formula import
+
+
+2013-01-23 Kohei Yoshida <kohei.yoshida@gmail.com> [cb66fab7e473a37e011c002f29f72d07ef681c3e]
+
+ Add the new files to slickedit, and remove the mock classes from iface.
+
+ The iface namespace is reserved for the pure interface classes that need
+ to be exported to the external code. Let's keep these mock interface
+ implementations outside this namespace.
+
+2013-01-23 Kohei Yoshida <kohei.yoshida@gmail.com> [34d2ac9af76600d01cebb11613881922fe4ac68b]
+
+ Move the test files into liborcus directory.
+
+ To keep the test file alongside the source file it tests, and its name
+ being the source file name + _test.
+
+2013-01-23 Markus Mohrhard <markus.mohrhard@googlemail.com> [1771dfdb034769a4ba938f954f4473a7e9440892]
+
+ proof of concept for tests
+
+
+2013-01-02 Kohei Yoshida <kohei.yoshida@gmail.com> [f53ff7a4e0ff0ac613e2f4c1cdc1b773a7f8c807]
+
+ Fix header guard.
+
+
+2012-12-26 Kohei Yoshida <kohei.yoshida@gmail.com> [17fe108ba9787465a9f99f0c570cd0f67dd296fa]
+
+ Appropriate copyright holder lines.
+
+
+2012-12-26 Markus Mohrhard <markus.mohrhard@googlemail.com> [2bb52a736d3d9269abc605ba56794af2c013e43e]
+
+ set_auto is not a good idea if you know the content type
+
+ Edited by Kohei: some formatting consistency.
+
+2012-12-26 Markus Mohrhard <markus.mohrhard@googlemail.com> [57c58c90b976dbcffa78e9ebca0e505db6ac9428]
+
+ remove unused include
+
+
+2012-12-21 Kohei Yoshida <kohei.yoshida@gmail.com> [7deffe5a4d1940f15a61a01737d9669b3c29754a]
+
+ Sniff the rest of the encryption info data.
+
+
+2012-12-21 Kohei Yoshida <kohei.yoshida@gmail.com> [0c213ca7402dcc8377911c945d7347f477278959]
+
+ These handlers will not be used for this.
+
+
+2012-12-21 Kohei Yoshida <kohei.yoshida@gmail.com> [96109d7aca098e44c6dc4a3ddb313e9d854c580d]
+
+ Sniff key data from encryption info stream.
+
+
+2012-12-21 Kohei Yoshida <kohei.yoshida@gmail.com> [a307626a62283f5a61eb91274c7c5bbd8d700211]
+
+ liborcus-mso should only against liborcus-parser.
+
+
+2012-12-21 Kohei Yoshida <kohei.yoshida@gmail.com> [4eacef9e61fb93d258098f2f5a3c8df0a5b27164]
+
+ More on bootstrapping orcus-mso-encryption.
+
+ Moved pstring, string_pool and xml_namespace all to liborcus-parser.
+
+2012-12-21 Kohei Yoshida <kohei.yoshida@gmail.com> [7990025b32ecbd7b57122d45a88b8284844a910a]
+
+ Bootstrap orcus-mso-encryption executable.
+
+ In this change, moved load_file_content() from liborcus' global.hpp
+ to parser's stream.hpp, since I need to call it from liborcus-mso
+ which doesn't depend on liborcus proper.
+
+2012-12-21 Kohei Yoshida <kohei.yoshida@gmail.com> [41dfaae47e31048ec66c0b2eecab3732245515b2]
+
+ Wrong header was included. I need string, not ostream.
+
+
+2012-12-21 Kohei Yoshida <kohei.yoshida@gmail.com> [a57ea6cd30f526f37a1e899ab91dcd6311f24d73]
+
+ Formatting consistency.
+
+
+2012-12-21 Kohei Yoshida <kohei.yoshida@gmail.com> [0549ce47877661050b5897b92fbdbf50aaed7b0b]
+
+ Add base64 encoder and decoder functions.
+
+
+2012-12-20 Kohei Yoshida <kohei.yoshida@gmail.com> [011cacf1c03a36abe67895ec9c8032ce1d9920a3]
+
+ Skeleton for parsing MS Office's xml-based encryption info header.
+
+ This will create another library liborcus-mso, which will provide
+ self-contained various msoffice utilities.
+
+2012-12-19 Kohei Yoshida <kohei.yoshida@gmail.com> [6b8a56001950edd8f56eddaa73cc8252aeaf4653]
+
+ Destructors shouldn't throw. Let's use assert() here.
+
+
+2012-12-18 Kohei Yoshida <kohei.yoshida@gmail.com> [3dfc99c59c07d105cc1030d5f3c25f915573c775]
+
+ Test parsing encoded character immediately followed by ';'.
+
+
+2012-12-18 Kohei Yoshida <kohei.yoshida@gmail.com> [6b5f7e821534980baf1955874148873b102f49e4]
+
+ Make it easier to run callgrind.
+
+
+2012-12-18 Kohei Yoshida <kohei.yoshida@gmail.com> [27682800170224433ac03ca10e5060454ef1c7b9]
+
+ A ';' after an encoded character can happen and is still valid.
+
+ Example: &quot;B&quot;; -> "B";
+
+2012-12-18 Kohei Yoshida <kohei.yoshida@gmail.com> [822b2c8f133f0c1205f0274fea6ca8e55102d738]
+
+ Use FNV-1 string hash algorithm.
+
+ It's supposed to be efficient.
+
+2012-12-18 Kohei Yoshida <kohei.yoshida@gmail.com> [2c9cee0f1cf7f318b3e67eccadb1d0b0eb56233d]
+
+ Slightly more efficient string interning.
+
+ This improves the performance just a tiny bit. Not as much as I'd
+ hoped but it's still an improvement.
+
+2012-12-18 Kohei Yoshida <kohei.yoshida@gmail.com> [7042909bc5b6cac95a67e70890ba6087f87ed806]
+
+ Debug statement.
+
+
+2012-12-18 Kohei Yoshida <kohei.yoshida@gmail.com> [6f9d53a960cd20c0d8410fbc2f5d749ad62652b4]
+
+ Fix invalid memory access.
+
+ xmlns_context instance relies on the xml stream being alive for the
+ duration of its life time. We need to hold the stream in memory to
+ avoid invalid memory access.
+
+2012-12-18 Kohei Yoshida <kohei.yoshida@gmail.com> [7a01ec377033a8b6e4bc2083fa8343ac0b42b852]
+
+ Wrapper to execute orcus-test-xml-mapped test alone.
+
+
+2012-12-17 Kohei Yoshida <kohei.yoshida@gmail.com> [ea8282b051aabd8cc9a66b54730bc0bc91b89cdd]
+
+ Removed all traces of xmlns_token_t. We won't be needing this anymore.
+
+ From now on we'll be using xmlns_id_t in its place.
+
+2012-12-17 Kohei Yoshida <kohei.yoshida@gmail.com> [e9ee867ac9c0d50b6e310e9667941cdad96bec7c]
+
+ Let's be consistent in naming a file.
+
+
+2012-12-17 Kohei Yoshida <kohei.yoshida@gmail.com> [84a25bf121c6288bb6fd8338d4afc919ad2118ac]
+
+ Fix header guard.
+
+
+2012-12-17 Kohei Yoshida <kohei.yoshida@gmail.com> [7c7f309740b81de869a2205f90505a50f24ba5f5]
+
+ Follow-up changes to get the test to pass again.
+
+
+2012-12-17 Kohei Yoshida <kohei.yoshida@gmail.com> [1bbff9670fe9bdfdaf85e514344d33c73f4aad47]
+
+ Big change on replacing all uses of xmlns_token_t with xmlns_id_t.
+
+ It compiles but the test fails.
+
+2012-12-17 Kohei Yoshida <kohei.yoshida@gmail.com> [8b8f091548c738ae2bec02b0bd57cf97a7405bbe]
+
+ Add predefined namespace values for orcus_ods, _xlsx and _gnumeric.
+
+
+2012-12-17 Kohei Yoshida <kohei.yoshida@gmail.com> [53d5139563c2e0811c6ca37954823a4ccf8a4ed6]
+
+ Add gnumeric namespace set.
+
+ The list may not be exhaustive. Add new ones as needed.
+
+2012-12-17 Kohei Yoshida <kohei.yoshida@gmail.com> [02b6ba3a36c54e40035888b20eaf7a1b0d8a80db]
+
+ Add test for ODF predefined namespaces.
+
+
+2012-12-17 Kohei Yoshida <kohei.yoshida@gmail.com> [1c1baf1be1629111b8165eefef1869e530f13504]
+
+ Wrong namespacing braces.
+
+
+2012-12-17 Kohei Yoshida <kohei.yoshida@gmail.com> [b1f87ebf8befcd0bd4ed1454f52451df503eff2b]
+
+ Add ODF namespace values.
+
+ Values are auto-generated by script.
+
+2012-12-17 Kohei Yoshida <kohei.yoshida@gmail.com> [e681c51bdacbe3833e5cb360e53f69a4edc8eeac]
+
+ Update token generator script to auto-generate ODF namespace values.
+
+
+2012-12-17 Kohei Yoshida <kohei.yoshida@gmail.com> [a43d7878c2b3dab098c5663d16ddc82dd18ba3dd]
+
+ Use the official v1.2 Relax NG schema file.
+
+
+2012-12-17 Kohei Yoshida <kohei.yoshida@gmail.com> [b1bbc28c45d54f62c54ec529a88b07e4ad7f9852]
+
+ Let's make sure we get the right namespace value....
+
+
+2012-12-17 Kohei Yoshida <kohei.yoshida@gmail.com> [2eafa5ca988da15370edf71631748c209c9bde69]
+
+ A little more test.
+
+
+2012-12-17 Kohei Yoshida <kohei.yoshida@gmail.com> [217f9839fe608eb62376273ad88bf6796ae09be9]
+
+ Support adding predefined namespace values to the repository.
+
+
+2012-12-17 Kohei Yoshida <kohei.yoshida@gmail.com> [d47de10f478c4f9f360d9d063d6d92a78ec20b2b]
+
+ Started working on passing predefined namespace values to the repository.
+
+ Not done yet.
+
+2012-12-17 Kohei Yoshida <kohei.yoshida@gmail.com> [99ea480ee7d634294b12a7407cf891c97f9894c2]
+
+ Pass the xml namespace context to the sax token parser.
+
+
+2012-12-17 Kohei Yoshida <kohei.yoshida@gmail.com> [45604205d1cc8e9bda33a3a1e1b8fdab92d07a5b]
+
+ xml_stream_parser to take xmlns_repository to create ns context.
+
+
+2012-12-17 Kohei Yoshida <kohei.yoshida@gmail.com> [561bd91a243839d5b878fddf77ae410e582f07ad]
+
+ Test XML content for Agile-style EncryptionInfo stream.
+
+ This format is typically used in encrypted Excel 2010 documents.
+
+2012-12-16 David Tardon <dtardon@redhat.com> [1b7e06c0f08f42f49c5d817a53cfd7946d1cd584]
+
+ coverity: uninitialized member(s)
+
+
+2012-12-16 David Tardon <dtardon@redhat.com> [d92bc459f218d873947c1747f386d1465114e126]
+
+ coverity: uninitialized member(s)
+
+
+2012-12-16 David Tardon <dtardon@redhat.com> [0055fa5e4f1debe8d1ddf1ea0ebc791519b7b0ef]
+
+ coverity: uninitialized member(s)
+
+
+2012-12-16 David Tardon <dtardon@redhat.com> [831b598b039aa0c8c58333d705bf94feace1427b]
+
+ coverity: uninitialized member
+
+
+2012-12-16 David Tardon <dtardon@redhat.com> [5fa50940d9d135593e73f63e09ed8329d99eacee]
+
+ coverity: catch all exceptions
+
+
+2012-12-16 David Tardon <dtardon@redhat.com> [c5f77a570eaadb48c4bf0f69d2a4d9b25538b73c]
+
+ coverity: catch all exceptions
+
+
+2012-12-14 Kohei Yoshida <kohei.yoshida@gmail.com> [b38d2ba78a817518b8602158c95872b9de18fc6a]
+
+ Test code for ods import.
+
+
+2012-12-14 Kohei Yoshida <kohei.yoshida@gmail.com> [69fae02dd5f441b834b837056b3c0d791be864b4]
+
+ orcus-ods: import numeric values as numeric values, not as strings.
+
+
+2012-12-13 Kohei Yoshida <kohei.yoshida@gmail.com> [560e99824b2ab8a0525dc3a3b75205de0ff0a6cb]
+
+ Reworking ods filter's cell attribute handling. Still work in progress.
+
+
+2012-12-13 Kohei Yoshida <kohei.yoshida@gmail.com> [83a0777df7f0fabce473f1995896244f0eed8b28]
+
+ New raw value test document for ods import.
+
+ This is basically the same content as xlsx counterpart.
+
+2012-12-13 Kohei Yoshida <kohei.yoshida@gmail.com> [345ac364695e9a8f01bb9f669038f70359061291]
+
+ Finish up the test code for xlsx import.
+
+
+2012-12-11 Kohei Yoshida <kohei.yoshida@gmail.com> [4e9eb9f113ec4c23e02033e853cd560c0a11b3d7]
+
+ Working on setting up a test for xlsx import. I'm not done yet.
+
+
+2012-12-11 Kohei Yoshida <kohei.yoshida@gmail.com> [9c8078f370a4c915a44c1c311df17ed7e8a3fcc9]
+
+ Extra blank line we don't need.
+
+
+2012-12-11 Kohei Yoshida <kohei.yoshida@gmail.com> [cb98b54d94693eb72654a5502251e2969e87cf10]
+
+ Did some debugging in class sheet due to incorrect string cell import.
+
+ Turns out that the problem was on the ixion side. The string ID of 0
+ was reserved for an empty string, which obviously doesn't work with
+ xlsx import.
+
+2012-12-11 Kohei Yoshida <kohei.yoshida@gmail.com> [fda0ae31807e53da320d1e925da044a69ab78652]
+
+ New test file for xlsx import.
+
+ Unfortunately orcus imports this incorrectly.
+
+2012-12-11 Kohei Yoshida <kohei.yoshida@gmail.com> [c161a31edd460a28b8e18fff6a481b702b0a88e9]
+
+ make dist to package tar.bz2 as well.
+
+
+2012-12-11 Kohei Yoshida <kohei.yoshida@gmail.com> [d8847708c7969bf3b50218bc58e76d4e997af22a]
+
+ liborcus-parser to build .dll, and liborcus-parser-static to build .lib.
+
+
+2012-12-11 Kohei Yoshida <kohei.yoshida@gmail.com> [c55d51c2b6e48bdfbaa944ca72d42cb78e7dec1a]
+
+ Fix the liborcus-static-nozip project as well (for MSVS).
+
+
+2012-12-11 Kohei Yoshida <kohei.yoshida@gmail.com> [f9b8ae77061b30613dd8e44b7707035a819f1d02]
+
+ Updated liborcus project in MSVS solution.
+
+ We have yet to fix the -nozip project for the new file organization.
+
+2012-12-11 Kohei Yoshida <kohei.yoshida@gmail.com> [5218c1b875eaf1fc627a6bda665dbba47e76a0b7]
+
+ Add parser lib directory to get the wrapper scripts to run.
+
+
+2012-12-11 Kohei Yoshida <kohei.yoshida@gmail.com> [c7da7a6c422116fd3ed812821fa9e64bca152730]
+
+ Finally, move all the ooxml headers into liborcus.
+
+
+2012-12-11 Kohei Yoshida <kohei.yoshida@gmail.com> [361855da7bf26b1cfe21d4d6951346ee643581bd]
+
+ Move odf related headers into liborcus, to avoid public eyes.
+
+
+2012-12-10 Kohei Yoshida <kohei.yoshida@gmail.com> [61b115698cfecf42a13dcc77c0d4d93ea4cfa563]
+
+ Move gnumeric stream handler files into liborcus.
+
+
+2012-12-10 Kohei Yoshida <kohei.yoshida@gmail.com> [98b36c060d0748dc3d66152622a2fe7cb1d5f368]
+
+ Hide and rename xml_context.* too.
+
+
+2012-12-10 Kohei Yoshida <kohei.yoshida@gmail.com> [380a3da76c6750210b87ce7cc7ec57431fde83f2]
+
+ Rename files to fit their respective class names.
+
+
+2012-12-10 Kohei Yoshida <kohei.yoshida@gmail.com> [a2a907bc5d773d371eeed67591b92169a556ac2e]
+
+ Moved several non-exported headers into liborcus internal.
+
+ For better encapsulation.
+
+2012-12-10 Kohei Yoshida <kohei.yoshida@gmail.com> [5de884eb02c36a0a989ebdedaafeebca52b43cad]
+
+ Add opc namespace values too.
+
+
+2012-12-10 Kohei Yoshida <kohei.yoshida@gmail.com> [6a386b08cf3d860d55b4ac530276796111c0def1]
+
+ Add stock ooxml namespace types.
+
+
+2012-12-10 Kohei Yoshida <kohei.yoshida@gmail.com> [118be886d64966fde4e026e9ea2f3149cd1ceee5]
+
+ Stock content types should be const.
+
+
+2012-12-09 Markus Mohrhard <markus.mohrhard@googlemail.com> [b9d29ee2b8847dd3b53baf1f1560eee408dca757]
+
+ adapt librorcus-parser build on win to latest changes
+
+
+2012-12-08 Kohei Yoshida <kohei.yoshida@gmail.com> [e3019f42ef925b9da842cc6eb17b5b819a9afd2c]
+
+ Link to liborcus-parser in pkgconfig.
+
+
+2012-12-08 Kohei Yoshida <kohei.yoshida@gmail.com> [d0707a6f03cd75421df57db131376966adacb55b]
+
+ Explain that '\0' is returned on failure.
+
+
+2012-12-08 Kohei Yoshida <kohei.yoshida@gmail.com> [de01f469198caf2e900a67b4a5ad5e000b89dfec]
+
+ Move XML encoded character decoding code to liborcus-parser.
+
+
+2012-12-08 Markus Mohrhard <markus.mohrhard@googlemail.com> [5c4838bf2bd420b44d62d82a7dbd7ea76c34b7c4]
+
+ adapt windows build to liborcus-parser lib
+
+
+2012-12-08 Markus Mohrhard <markus.mohrhard@googlemail.com> [6118da82748240c59b4b666db3bc0e5c563831ce]
+
+ fix orcus-gnumeric build on windows
+
+
+2012-12-08 Markus Mohrhard <markus.mohrhard@googlemail.com> [3229ae71a644ff833a3c1439e0bed44cb5dac46a]
+
+ warning C4099: mix of struct and class
+
+
+2012-12-08 Kohei Yoshida <kohei.yoshida@gmail.com> [c6b8fefe80353cf7e3343fe58af9de59d4fc483b]
+
+ liborcus-parser shouldn't link against libixion.
+
+ That was just a simple copy-n-paste mistake.
+
+2012-12-06 Kohei Yoshida <kohei.yoshida@gmail.com> [26c112898484716d5f840c5dc1fce66a0cec1e44]
+
+ Another library instance for low-level parser code.
+
+ From now on, using the low-level parser templates do require linking
+ to liborcus-parser library. This is done to reduce the size of binaries.
+
+2012-11-28 Markus Mohrhard <markus.mohrhard@googlemail.com> [03338097294cb6e667060fa87bfe176f1db90f8c]
+
+ xlsx: import cell protection attributes
+
+
+2012-11-27 Kohei Yoshida <kohei.yoshida@gmail.com> [792c8f4c6dc8c81c12ea1fc7ecf67447c32dee89]
+
+ Remove execution bits from these files too.
+
+
+2012-11-27 Kohei Yoshida <kohei.yoshida@gmail.com> [19a7218b63b154fc74c0326560dd446fcda3078a]
+
+ Remove the execution bit.
+
+
+2012-11-27 Markus Mohrhard <markus.mohrhard@googlemail.com> [551da550bd5b9854184708ceefa141f278c4465a]
+
+ add the new source files to vsproj files
+
+
+2012-11-27 Markus Mohrhard <markus.mohrhard@googlemail.com> [367f560220018bbed627f1d8276a19f961bfe496]
+
+ gnumeric: we need to commit and set style entries
+
+
+2012-11-27 Markus Mohrhard <markus.mohrhard@googlemail.com> [69a82188a4ab2c73ac5446fd6c9151873758ca05]
+
+ gnumeric: import cell hidden and cell locked attributes
+
+
+2012-11-27 Markus Mohrhard <markus.mohrhard@googlemail.com> [ba0ebdec19c96f0577501709cf5e29e8dcdbd062]
+
+ cell protection support
+
+
+2012-11-27 Markus Mohrhard <markus.mohrhard@googlemail.com> [bd472644bfb6b090fcf77e899887cec5db15c93a]
+
+ support cell color in gnumeric import
+
+
+2012-11-27 Kohei Yoshida <kohei.yoshida@gmail.com> [3a7fd7ca0c23d77e7a2f928aea592e632503d92a]
+
+ Remove MSVC warnings. It doesn't like implicit int to bool conversion.
+
+
+2012-11-27 Kohei Yoshida <kohei.yoshida@gmail.com> [586c6c768c182fc6903d0b17dd83eea807071429]
+
+ More editing of MSVS project files.
+
+
+2012-11-26 Kohei Yoshida <kohei.yoshida@gmail.com> [e0ebf9fa480d74e420dbf369d33a6fdfeac1f1ce]
+
+ Fix coding style and indentation.
+
+
+2012-11-26 Kohei Yoshida <kohei.yoshida@gmail.com> [6c860d7d8a99fd05b4c40fc9bd3030c26befd3d1]
+
+ This won't build without ORCUS_DEBUG_XML_NAMESPACE set to 1.
+
+
+2012-11-26 Kohei Yoshida <kohei.yoshida@gmail.com> [e61a143535ea83dfb96075e1b2a424ce0a54451b]
+
+ Add gnumeric files to static-nozip MSVS project.
+
+
+2012-11-26 Kohei Yoshida <kohei.yoshida@gmail.com> [5c1ca7c832395a395e33a335131778702609a01a]
+
+ Update MSVS project file for liborcus-static-nozip.
+
+
+2012-11-26 Kohei Yoshida <kohei.yoshida@gmail.com> [936a96d7ca3502ade661fbce0c45abbdb1f7a811]
+
+ Fixed 'make dist'.
+
+
+2012-11-21 Kohei Yoshida <kohei.yoshida@gmail.com> [392ff85f2aff1ea8760cb63c06b7346b5f2dd4f1]
+
+ Add a means to obtain the short version of an xml namespace name from the walker.
+
+
+2012-11-21 Kohei Yoshida <kohei.yoshida@gmail.com> [8c3f8b1e3c10cd1f47db0bd815e5cece4633d221]
+
+ Quote all string values in the "dump check" format.
+
+ To avoid ambiguity in case the string value contains ':'.
+
+2012-11-21 Kohei Yoshida <kohei.yoshida@gmail.com> [ff1832700e60db050c8326d51ec8a4778184a25f]
+
+ Header label should only the short version of xml namespace name.
+
+ This breaks several tests. I need to adjust those failing test cases.
+
+2012-11-21 Kohei Yoshida <kohei.yoshida@gmail.com> [aeeff94a7755c5174cb9d31db06123a08e1fb23a]
+
+ Be sure to intern the namespace alias strings in xml map tree.
+
+ Because xmlns_context itself doesn't intern the aliases.
+
+2012-11-21 Kohei Yoshida <kohei.yoshida@gmail.com> [a2560876103a79a5e7e1397bca735532e7f653c2]
+
+ Print aliases in the context for debugging.
+
+
+2012-11-21 Kohei Yoshida <kohei.yoshida@gmail.com> [9a54506fbdac4aad0ed34a96f791b6138c690fa0]
+
+ More debug statements.
+
+
+2012-11-21 Kohei Yoshida <kohei.yoshida@gmail.com> [59e7f513f1f17d1a688365dee3fd0b0948249b5b]
+
+ Let's have xml_map_tree to take the ns repo, and keep its context internal.
+
+
+2012-11-21 Kohei Yoshida <kohei.yoshida@gmail.com> [6e53d70703af67abc9dc819d4b9e0a6998732e74]
+
+ More debug statement.
+
+
+2012-11-21 Kohei Yoshida <kohei.yoshida@gmail.com> [cccd1c6c1f5f76d216c910c96219d8b7017e240d]
+
+ Add method to get xmlns identififer from its numerical index.
+
+
+2012-11-21 Kohei Yoshida <kohei.yoshida@gmail.com> [f5b81963a94e2559ca4acaef3a28c1417dfa6bd1]
+
+ Add get_xmlns_index() method to the tree walker.
+
+ This is for convenience.
+
+2012-11-21 Kohei Yoshida <kohei.yoshida@gmail.com> [ccddd488859bd535c37ece6934ce87b571836cac]
+
+ Add another test case to test namespaced linked attributes.
+
+
+2012-11-20 Kohei Yoshida <kohei.yoshida@gmail.com> [4875a787ebf3736aa5fba0aede4c6a826d2b4ff1]
+
+ Intentionally change the namespace aliases in the map file.
+
+ And the test should still pass.
+
+2012-11-20 Kohei Yoshida <kohei.yoshida@gmail.com> [7980ac64fc56e5ead16c09e1251b20561ee18ae6]
+
+ New test case for namespaced xml content for round-tripping.
+
+
+2012-11-20 Kohei Yoshida <kohei.yoshida@gmail.com> [9d50cdcf59ec8137ab27a9c3fb8f5f59dca101b7]
+
+ Set the namespace alias on field-linked elements as well.
+
+ And adjust the test code to allow cases where the input and output
+ xml contents don't match. That can happen when the range linked
+ sub-structure contain foreign element(s) which will not be included
+ in the output content.
+
+2012-11-20 Kohei Yoshida <kohei.yoshida@gmail.com> [b27e68aec1e6d6aaf0eb59ca58b0c9b7e3caddcb]
+
+ Let's not forget to intern these namespace alias strings.
+
+ They need to survive even after the import content stream is destroyed.
+
+2012-11-20 Kohei Yoshida <kohei.yoshida@gmail.com> [64a0ab1e735992ccc9c0703402f4a1c4aed41518]
+
+ Store in the map tree the actual namespace aliases used in the content stream.
+
+ We need this when writing transformed xml content to file.
+
+2012-11-20 Kohei Yoshida <kohei.yoshida@gmail.com> [93d35d3d5d4ea4084c2fd60cb29629ffab26505c]
+
+ More targetted namespace trimming scheme.
+
+
+2012-11-20 Kohei Yoshida <kohei.yoshida@gmail.com> [f42391d21d58fe71a1939363c8b0c002171c99eb]
+
+ Let's not use this in_parse flag. I find it a bit hacky.
+
+ This will make get_all_namespaces() call a little more expensive, but
+ only the test code should call that method anyways...
+
+2012-11-20 Kohei Yoshida <kohei.yoshida@gmail.com> [6d2bc9787f760107b81443722bcd1dccc5388f38]
+
+ Don't forget to call parse()!
+
+
+2012-11-20 Kohei Yoshida <kohei.yoshida@gmail.com> [0464810b61941f7fcc788684b1d6038a1afe933e]
+
+ Correctly keep track of unlinked element stack while traversing the map tree.
+
+
+2012-11-20 Kohei Yoshida <kohei.yoshida@gmail.com> [76ef20cac8b68cede013418460b82d5eaedcd86e]
+
+ Rename xml_attr_t to xml_token_attr_t.
+
+
+2012-11-20 Kohei Yoshida <kohei.yoshida@gmail.com> [3a2327c7eeb1361226b9aaff42bb288a0641265a]
+
+ More debugging and assertions.
+
+
+2012-11-20 Kohei Yoshida <kohei.yoshida@gmail.com> [29b6999c66cd936207d493fb5cbcb0d9044d03dd]
+
+ Added new test for traversing a xml map tree. This currently fails.
+
+
+2012-11-19 Kohei Yoshida <kohei.yoshida@gmail.com> [12bf185249d480062789c5109ff8469f94910b71]
+
+ New test files for handling namespaces during mapped xml import.
+
+ It's disabled as the export is not yet working.
+
+2012-11-19 Kohei Yoshida <kohei.yoshida@gmail.com> [6cde6360ecb31febf46dbc13bc46bf38d4cad18f]
+
+ Turn off debug outputs for orcus_xml.
+
+
+2012-11-19 Kohei Yoshida <kohei.yoshida@gmail.com> [77803d74266ede855a7185a51e3f952620c874fd]
+
+ Finally, handle xml namespaces correctly when parsing the data xml.
+
+
+2012-11-19 Kohei Yoshida <kohei.yoshida@gmail.com> [dc77d35a27b8afc7add1ae2fea8f4462b9b6de89]
+
+ Correctly handle namespaces while building xml map tree.
+
+
+2012-11-19 Kohei Yoshida <kohei.yoshida@gmail.com> [bcb1ebd5eaf056f9e1e822c01201187b93314729]
+
+ Properly process namespaces when parsing mapped xpaths.
+
+
+2012-11-19 Kohei Yoshida <kohei.yoshida@gmail.com> [b23733e1c32d2b02393990c1ecbe13cbf7815301]
+
+ I don't think we'll need this.
+
+
+2012-11-19 Kohei Yoshida <kohei.yoshida@gmail.com> [ca061603398ff4c9d648c33bfefb49d5445694e6]
+
+ orcus_xml to take additional xmlns_context parameter.
+
+
+2012-11-19 Kohei Yoshida <kohei.yoshida@gmail.com> [0a175395901e8b75b5015096978df4914587807f]
+
+ Test for nested default namespaces.
+
+
+2012-11-19 Kohei Yoshida <kohei.yoshida@gmail.com> [f2e8aacbb11fab44d4dc23dda8e62ef2d03533dc]
+
+ New test case for custom namespace handling.
+
+
+2012-11-19 Kohei Yoshida <kohei.yoshida@gmail.com> [23a8c634430cfe44fa7b32d29febc22b97fcd63f]
+
+ Adjusted test files for xml parsing & new test for default namespace handling.
+
+
+2012-11-19 Kohei Yoshida <kohei.yoshida@gmail.com> [7c54dce88eb5d9efec3e8819a1792c47d4240b53]
+
+ get_namespaces() to return namespace list sorted by order of occurrences.
+
+
+2012-11-19 Kohei Yoshida <kohei.yoshida@gmail.com> [212bfe617b9b320cdd16094732dbb36349b57f49]
+
+ Print namespaces aliases instead of namespace values when dumping.
+
+
+2012-11-19 Kohei Yoshida <kohei.yoshida@gmail.com> [462e1f10e40253fea504d0bf38d12b3f82fc6ee8]
+
+ XML structure dumper to use proper namespace management.
+
+
+2012-11-19 Kohei Yoshida <kohei.yoshida@gmail.com> [fbd0e87ada85fa615e1a028c002f271e2f04e4e5]
+
+ Adapt dom_tree to make proper use of xml namespace management.
+
+
+2012-11-19 Kohei Yoshida <kohei.yoshida@gmail.com> [642d5e1fdab355327e1af028d547e6c8109ab7e2]
+
+ Make sure the ns indices represent their order of first occurrences.
+
+
+2012-11-19 Kohei Yoshida <kohei.yoshida@gmail.com> [0b3abc94a364ca23a1c6c2071cea359ef1a8ac85]
+
+ Check the return value of push().
+
+
+2012-11-16 Kohei Yoshida <kohei.yoshida@gmail.com> [ecf118c39b298f51abfdfd62b0a45b7fb5a490c0]
+
+ Correctly dump namespaces, and add check for it.
+
+
+2012-11-16 Kohei Yoshida <kohei.yoshida@gmail.com> [d72f1da6379c18d20595fb55329da922351e86ff]
+
+ Fix the crash in the new test.
+
+
+2012-11-16 Kohei Yoshida <kohei.yoshida@gmail.com> [5a77f10fe793d8cd36b788879c842b232f5893fe]
+
+ I forgot to add these too.
+
+
+2012-11-16 Kohei Yoshida <kohei.yoshida@gmail.com> [4adce0038f7c4e95d5c410a40d4a2fbca1de7847]
+
+ Add new header to the automake file.
+
+
+2012-11-16 Kohei Yoshida <kohei.yoshida@gmail.com> [7b3866863874dfcd074f089dc24edd5da5df765e]
+
+ Add this script too.
+
+
+2012-11-16 Kohei Yoshida <kohei.yoshida@gmail.com> [fc33d6b64d306c3cabadf2050b212bf652d928a8]
+
+ Somehow I forgot to add this header.
+
+
+2012-11-16 Kohei Yoshida <kohei.yoshida@gmail.com> [44e7d1586f8885cf33b99588fe6ae47092bac648]
+
+ Retrieve all used namespaces instead of keys during dump().
+
+ Disable the test as this crashes at the moment.
+
+2012-11-16 Kohei Yoshida <kohei.yoshida@gmail.com> [6a2335d56f15c7295e020af7bca3a2da9ca90102]
+
+ Handle XML namespaces properly at the parser level.
+
+ And use it from xml_structure_tree.
+
+2012-11-15 Kohei Yoshida <kohei.yoshida@gmail.com> [8cb9c4801f696d79b7a1611234ca9b684574c513]
+
+ Support numerical indices for namespace IDs.
+
+ Useful when displaying namespaces canonically.
+
+2012-11-15 Kohei Yoshida <kohei.yoshida@gmail.com> [85d065f7713625d491df3b4caf06cc4ad1799d52]
+
+ Unit test for string_pool.
+
+ For now it only tests a very basic thing.
+
+2012-11-15 Kohei Yoshida <kohei.yoshida@gmail.com> [c29b38ec3618c4715aa5a5c4160b47bace51aea0]
+
+ string_pool::intern() now returns a pair.
+
+ The first is the interned pstring instance and the second is a boolean
+ parameter indicating whether or not the string is a new instance or a
+ re-use of an existing instance. True for the former, and false for the
+ latter.
+
+2012-11-14 Kohei Yoshida <kohei.yoshida@gmail.com> [3c02946f50b88709b3696aeb5702b6d4d8035315]
+
+ Let's handle cases where the temp cell buffer is empty.
+
+
+2012-11-14 Kohei Yoshida <kohei.yoshida@gmail.com> [7b61576ae0d6f42078a30b900cf1681b6157d4bd]
+
+ Check single character case also.
+
+
+2012-11-14 Kohei Yoshida <kohei.yoshida@gmail.com> [982ab62ffd13f94eb3022bca114f04b768bd7aa1]
+
+ Don't forget to delete the root element, else we'd leak.
+
+
+2012-11-14 Kohei Yoshida <kohei.yoshida@gmail.com> [d3b3eb3a9dd2fcc27c52be36332600d7e91158e1]
+
+ Test the same thing for content.
+
+
+2012-11-14 Kohei Yoshida <kohei.yoshida@gmail.com> [0bdd3ea490d0a42bf1bd1ba7d161424275cb216e]
+
+ More correct handling of attribute value with encoded chars.
+
+
+2012-11-14 Kohei Yoshida <kohei.yoshida@gmail.com> [79d92b834a31660cf13e013ae14cb8db335a42e2]
+
+ Handle cases correctly where a string value ends with an encoded char.
+
+
+2012-11-14 Kohei Yoshida <kohei.yoshida@gmail.com> [924a89f1cc27905537a4ef8d7c00910efcf76dde]
+
+ More descriptive exception message.
+
+
+2012-11-14 Kohei Yoshida <kohei.yoshida@gmail.com> [8013b39592f5f29195303580f75dab6dfeaead2c]
+
+ Turn off sax parser debug.
+
+
+2012-11-14 Kohei Yoshida <kohei.yoshida@gmail.com> [199d678e4f0c2b3aff0935512044ff0a9c069bbe]
+
+ Escape certain characters when dumping dom content.
+
+
+2012-11-14 Kohei Yoshida <kohei.yoshida@gmail.com> [3fb2d140119c37dd1e06fa64af7fc01243b6d3fe]
+
+ Convert encoded chars in the attribute values too.
+
+
+2012-11-14 Kohei Yoshida <kohei.yoshida@gmail.com> [0141711f69fbe40b6a6e7ad6c24ced7c26f35707]
+
+ Less indentation is preferred.
+
+
+2012-11-14 Kohei Yoshida <kohei.yoshida@gmail.com> [77300457584d4bf62a6f22ae904d49cb3fe5a69e]
+
+ We don't need to reinterpret_cast anymore.
+
+ This was there when the char type was a template parameter.
+
+2012-11-14 Kohei Yoshida <kohei.yoshida@gmail.com> [eb3f5c76d506208c76fd3bf0e02839f48e68fbad]
+
+ Make sure these strings become persistent before storing them.
+
+
+2012-11-14 Kohei Yoshida <kohei.yoshida@gmail.com> [2888e72181b13c23c5ae9120eeba70cca6f1d38f]
+
+ Use the pimpl idiom for dom_tree.
+
+ Mainly to move the member declarations to the source file to have
+ access to the internal only string_pool class.
+
+2012-11-14 Kohei Yoshida <kohei.yoshida@gmail.com> [ab812e7be73d0bc014027406969da2f835923e7a]
+
+ Detect and convert encoded characters during xml parsing.
+
+
+2012-11-14 Kohei Yoshida <kohei.yoshida@gmail.com> [0775135f2da2734d59100b9b81a2fa54e2e4157f]
+
+ Extracted temporary cell buffer code from csv_parser to make it reusable.
+
+ And added new xml test case for encoded characters. This currently fails
+ since we don't handle encoded characters in sax_parser yet.
+
+2012-11-14 Kohei Yoshida <kohei.yoshida@gmail.com> [93db2ba1de2380ed7453ad6c2e622ae2216792d5]
+
+ Relocate test files for xml parser.
+
+
+2012-11-09 Kohei Yoshida <kohei.yoshida@gmail.com> [bfc3624490ac47b8fb3ccb67498dc8d3aa6bea2e]
+
+ Don't forget to make the sheet name persistent for start_range() too.
+
+
+2012-10-20 Markus Mohrhard <markus.mohrhard@googlemail.com> [4e80be4b18e88187457338e2f7d77d956976dc1a]
+
+ implement underline support for xlsx
+
+
+2012-10-20 Markus Mohrhard <markus.mohrhard@googlemail.com> [c03f477349e1e722851de8b01b5e00f8690e3719]
+
+ implement the font underline for gnumeric
+
+
+2012-10-20 Markus Mohrhard <markus.mohrhard@googlemail.com> [ff7df79f86b4c942eac590e95cd61be20b654dff]
+
+ add support for underlined text
+
+
+2012-10-20 Markus Mohrhard <markus.mohrhard@googlemail.com> [414024c02c6a3d71c13d75437ab8282b3fd26fc4]
+
+ implement basic style import for gnumeric
+
+
+2012-10-20 Kohei Yoshida <kohei.yoshida@gmail.com> [b1ae7ac68a8f9e388e4014416eb079f9f7f0ce65]
+
+ Method description.
+
+
+2012-10-08 David Tardon <dtardon@redhat.com> [4bb99bff6941d72ccf6705ce647c685808c34139]
+
+ link with Boost.System if needed
+
+
+2012-10-06 Kohei Yoshida <kohei.yoshida@gmail.com> [84fd5273a593460a2b5793d2219bba8c0b235f1d]
+
+ More compact dump-check format.
+
+ One cell value per line.
+
+2012-10-06 Kohei Yoshida <kohei.yoshida@gmail.com> [89f317a54f06a1bca2fdd7a94d17986d720d6730]
+
+ Don't take a reference of a deleted object. Make a copy.
+
+ The original pstring value object is gone by the time the for_each
+ scope ends.
+
+2012-10-06 Kohei Yoshida <kohei.yoshida@gmail.com> [033bd08b91dd18afafcf67f86f9eea0ee9803153]
+
+ Remove extra ']' which would show up in the help text.
+
+
+2012-10-06 Kohei Yoshida <kohei.yoshida@gmail.com> [af67c614d6ae6bc30a936080fa7429baffebfed2]
+
+ Fix the makefiles for headers.
+
+ Otherwise the header files won't get installed correctly.
+
+2012-10-05 Kohei Yoshida <kohei.yoshida@gmail.com> [63c771c1aaf42b671c8369a697f08be6503fcc79]
+
+ Another test case to check nested repeat element states.
+
+
+2012-10-05 Kohei Yoshida <kohei.yoshida@gmail.com> [833611cd4d78f1db98e6fad126af75908d75e5ea]
+
+ Set the repeat flag only when the element occurs multiple times in the same scope.
+
+
+2012-10-05 Kohei Yoshida <kohei.yoshida@gmail.com> [3d141d3a8866dc817da2249aa3f8a2a07f3c26f7]
+
+ Sort child elements and attributes in order of appearance, not by name.
+
+
+2012-10-05 Kohei Yoshida <kohei.yoshida@gmail.com> [a46ecebe550bf25534f0d7e0a72081bfc03de54f]
+
+ Put the ods-filter and xlsx-filter bits in the right place.
+
+
+2012-10-05 Kohei Yoshida <kohei.yoshida@gmail.com> [d21fa00bf86b336550f74500b25c5b7d6c4e12c6]
+
+ Get numeric-filter to really build without libzip.
+
+
+2012-10-05 Kohei Yoshida <kohei.yoshida@gmail.com> [a14a1f9a6c2c8eb7694bfc4630ad2f2dad6c9401]
+
+ New test case for traversing attributes from the walker instance.
+
+
+2012-10-05 Kohei Yoshida <kohei.yoshida@gmail.com> [6c38ddf19cac78fec52e052bbb2e94b0fe397f80]
+
+ Remove duplicate typedef.
+
+
+2012-10-05 Kohei Yoshida <kohei.yoshida@gmail.com> [4466024ff73e9cf0370a63f14b5659ef73a88f1e]
+
+ Test attribute detection.
+
+
+2012-10-05 Kohei Yoshida <kohei.yoshida@gmail.com> [2acfab69f94e61807a0490fbdf9d9f0240e25eae]
+
+ Reorganized test files.
+
+
+2012-10-05 Kohei Yoshida <kohei.yoshida@gmail.com> [d0cbfb6416bdcb0a64942c0ab01e29f70e02a146]
+
+ Detect attributes during xml structure detection.
+
+
+2012-10-05 Kohei Yoshida <kohei.yoshida@gmail.com> [f8a479be9b491d220709d324db659f3612f162ad]
+
+ Remove unnecessary copying of entity_name objects.
+
+
+2012-10-05 Kohei Yoshida <kohei.yoshida@gmail.com> [72686f95d5614d13e82b2c045f30424f257934b2]
+
+ Remove the internal elem_name struct and use entity_name instead.
+
+ They were structurally identical.
+
+2012-10-05 Kohei Yoshida <kohei.yoshida@gmail.com> [2b2b502d9441d341fdc66749a5759c8cee9dfe52]
+
+ Add attribute structure.
+
+
+2012-10-05 Kohei Yoshida <kohei.yoshida@gmail.com> [489732f9c0e9ebffde14405e6ab7039caaa58546]
+
+ Rename element_name to entity_name so that I could use for attributes.
+
+
+2012-10-05 Markus Mohrhard <markus.mohrhard@googlemail.com> [a3738fb8b3dcfdc38944faf3048bddef5637d5f6]
+
+ gnumeric import only depends on zlib, not on libzip
+
+
+2012-10-05 Markus Mohrhard <markus.mohrhard@googlemail.com> [d576da5ffc18e3eec8d9c9b821edf42f9f31258f]
+
+ make ods and ooxml filter configurable
+
+ New configure options:
+
+ --without-xlsx-filter
+ --without-ods-filter
+
+2012-10-05 Kohei Yoshida <kohei.yoshida@gmail.com> [553e904220176a5c7f3eb7fdd1af01d43caa62fa]
+
+ Write self-closing elements inside linked ranges correctly.
+
+ Write
+
+ <data>
+ <entry ..../>
+ <entry ..../>
+ </data>
+
+ instead of
+
+ <data>
+ <entry ....></entry>
+ <entry ....></entry>
+ </data>
+
+2012-10-04 Kohei Yoshida <kohei.yoshida@gmail.com> [05e4c585826e6225fb552ab8eb61644b2792550c]
+
+ Another test case and found & fixed bugs and wrong assertions.
+
+
+2012-10-04 Kohei Yoshida <kohei.yoshida@gmail.com> [89b536bc8fb1facd0250f54f07c28edb7ff90594]
+
+ Another test file with single-element case.
+
+ This time the only element has a non-linked content. The round-tripping
+ shouldn't remove the content.
+
+2012-10-04 Kohei Yoshida <kohei.yoshida@gmail.com> [61d3a2dfb9b981b54c15d15dc973ecddcd1bc3e4]
+
+ Write self-closing elements correctly & new test file set.
+
+
+2012-10-04 Kohei Yoshida <kohei.yoshida@gmail.com> [662e68941d138d55257ea7f2671eab674da0e0e4]
+
+ Test the xml export part of orcus-xml.
+
+ For the purpose of this test, the output xml should be structurally
+ identical to the input xml.
+
+2012-10-04 Kohei Yoshida <kohei.yoshida@gmail.com> [9d4829b14724ea42c526b82fc2d3167ccae66bc9]
+
+ Separate the sax handler for dom tree into its own files.
+
+
+2012-10-04 Kohei Yoshida <kohei.yoshida@gmail.com> [0a54445e29309ccd67850b82e7feb6033125c7f0]
+
+ Also write linked attributes anchored to linked elements.
+
+
+2012-10-04 Kohei Yoshida <kohei.yoshida@gmail.com> [6854433228ec9ea4c250d61db2e309d2a018e6ff]
+
+ Write linked attribute values fresh from the document.
+
+
+2012-10-04 Kohei Yoshida <kohei.yoshida@gmail.com> [08d31e959ee38d58080ae70f5f1e962914161114]
+
+ It makes more sense to store element's stream positions with element.
+
+ Now that I also need to handle unlinked elements when linked attributes
+ are present.
+
+2012-10-04 Kohei Yoshida <kohei.yoshida@gmail.com> [bf59ac2a4c50cbf54ddf8a2d6bd80f2282a1132c]
+
+ Add test for linked attribute xml import.
+
+
+2012-10-04 Kohei Yoshida <kohei.yoshida@gmail.com> [62e2c0bc3c4d4f70e1dd36d7b32930d84623fbe7]
+
+ Allow output mode to be specified for orcus-xml.
+
+ In the future we should use boost::program_options for consistent
+ command-line option parsing.
+
+2012-10-04 Kohei Yoshida <kohei.yoshida@gmail.com> [6e4ca7677c1958e8ece49e98960676c2c902d94d]
+
+ Reorganize test file structure for mapped xml import.
+
+
+2012-10-04 Kohei Yoshida <kohei.yoshida@gmail.com> [30a3edf54cf92437ba495c8f32329504eace80b3]
+
+ Write linked attribute content fresh from the document model.
+
+ Round-tripping now works. Yay!
+
+2012-10-04 Kohei Yoshida <kohei.yoshida@gmail.com> [bcf938081312ea8c99c27b94870f108f000feb8d]
+
+ Fix the wrong assertion.
+
+ An element in a scope may be linked, and that's not an error.
+
+2012-10-04 Kohei Yoshida <kohei.yoshida@gmail.com> [f21be9ce7204c1e0144b3e3ba6e7c5e387c4a965]
+
+ Test for late linking of element.
+
+
+2012-10-04 Kohei Yoshida <kohei.yoshida@gmail.com> [9b1d77f1439835402aad1116f642e86ab404906a]
+
+ New test files for linked attribute import.
+
+
+2012-10-04 Kohei Yoshida <kohei.yoshida@gmail.com> [65d2b5a70db8427dbd7dd8628a9ae8150f5d7681]
+
+ Set values for linked attributes into document for real.
+
+ Now the linked attribute values are correctly imported.
+
+2012-10-04 Kohei Yoshida <kohei.yoshida@gmail.com> [83838171766179f1bf943715ba2b44ad3fb67d7a]
+
+ Range reference now stores a list of linkables instead of just elements.
+
+
+2012-10-03 Kohei Yoshida <kohei.yoshida@gmail.com> [10591f2dbbdb0ca5fa00d47231b5ed978fe18b53]
+
+ More fix for linked attribute nodes. Still import fails.
+
+
+2012-10-03 Kohei Yoshida <kohei.yoshida@gmail.com> [79ff3a5b45c3f5fd735927f9c6118fec68b7aa59]
+
+ Rename element_leaf to element_linked, element_non_leaf to element_unlinked.
+
+ Because sometimes a leaf element may be unlinked when linked attributes
+ exist in that element.
+
+2012-10-03 Kohei Yoshida <kohei.yoshida@gmail.com> [e992c892ae4996d5a9384ced4361aecdec7adac5]
+
+ Allow existing element to get linked when the conditions are met.
+
+
+2012-10-03 Kohei Yoshida <kohei.yoshida@gmail.com> [43daa0a85a0a5bcd50d0deddb80983bdff551f7c]
+
+ Correctly insert and retrieve linked attributes.
+
+ The test now passes.
+
+2012-10-03 Kohei Yoshida <kohei.yoshida@gmail.com> [48e722c6b584de8cbf4e00a618b31e9617453e73]
+
+ Spell out 'reference'.
+
+
+2012-10-03 Kohei Yoshida <kohei.yoshida@gmail.com> [ea40c1eebea9a8a6b0b676b27871af6a4364067a]
+
+ Reorganize the element and attribute structures.
+
+ Especially their type flags.
+
+2012-10-03 Kohei Yoshida <kohei.yoshida@gmail.com> [57fd20d1931f09eab4435351ea4ccebc39c5b900]
+
+ XPath parser now returns a state token instead of just an element name.
+
+
+2012-10-03 Kohei Yoshida <kohei.yoshida@gmail.com> [c1eba9423a5e1b125dcce1f2fbd93bc9a13545d9]
+
+ Pass xml namespace context to the xpath parser.
+
+ It's not used yet.
+
+2012-10-03 Kohei Yoshida <kohei.yoshida@gmail.com> [b0e9ad368704ffe3c8973bbdbb97c8be2ba76d51]
+
+ Pass xml namespace context to the map tree in order to handle namespace correctly.
+
+
+2012-10-03 Kohei Yoshida <kohei.yoshida@gmail.com> [f48f96b0462fdfe34905ef106da624888e6a266a]
+
+ Add linkable attribute structure to xml map tree.
+
+
+2012-10-03 Kohei Yoshida <kohei.yoshida@gmail.com> [a5454a05f4001c7b4ba19f328fb4ad619314ed36]
+
+ Rename basic.* test files to content.*.
+
+ To make room for test file set for testing attribute mapping.
+
+2012-10-03 Kohei Yoshida <kohei.yoshida@gmail.com> [05290c2c08b016747ac224dd6b9e4a26bee83de1]
+
+ Fix the naming clashes in pstring.
+
+
+2012-10-02 Kohei Yoshida <kohei.yoshida@gmail.com> [2e1f62a2e3588552c87a0c8e6dc389b8b57e204e]
+
+ Hide the implementations of public classes.
+
+
+2012-10-02 Kohei Yoshida <kohei.yoshida@gmail.com> [2c0b19c00fa824c8ad24f5a8d77ec7a5345cc5dd]
+
+ Reduce header dependency in public header.
+
+
+2012-10-02 Kohei Yoshida <kohei.yoshida@gmail.com> [8f7f4bbeedd2f69e1e1583a6a91fe44abf4efb39]
+
+ Updated slickedit project file.
+
+
+2012-10-02 Kohei Yoshida <kohei.yoshida@gmail.com> [52f2b7dde427fdfaa41315e77cc0f5cf341fc9e5]
+
+ Add a wrapper script for gnumeric (useful for development).
+
+
+2012-10-02 Kohei Yoshida <kohei.yoshida@gmail.com> [eb391a976b345ad045b598153e48e4b162936823]
+
+ We don't need this forward declaration.
+
+
+2012-10-02 Kohei Yoshida <kohei.yoshida@gmail.com> [b46907a804a43e61d6a151269c9c2218c247d84c]
+
+ Fix the coding style to make it consistent.
+
+
+2012-10-02 Markus Mohrhard <markus.mohrhard@googlemail.com> [7c21a41cc3eaf0d93310eece164939a5fe043347]
+
+ Test file for gnumeric import.
+
+
+2012-10-02 Markus Mohrhard <markus.mohrhard@googlemail.com> [9896e61d3efde09b50f66d087afc682430e0db40]
+
+ finally support all kinds of formulas
+
+
+2012-10-02 Markus Mohrhard <markus.mohrhard@googlemail.com> [627973974cb2f252aa2ffab83dc99edae41e4fb9]
+
+ add way to insert shared formula without attached range
+
+
+2012-10-02 Markus Mohrhard <markus.mohrhard@googlemail.com> [59cccd259bff296f5852cc433afc634c39c589cd]
+
+ also dump the shared formulas
+
+
+2012-10-02 Kohei Yoshida <kohei.yoshida@gmail.com> [a8e5f13f8b2ec2ec61bd538e858ee0983b412e58]
+
+ Program name should use '-' instead of '_'.
+
+
+2012-10-02 Markus Mohrhard <markus.mohrhard@googlemail.com> [1a275e1288664b241e247372685da51b508d1e9f]
+
+ add configure option for gnumeric import filter
+
+ --without-gnumeric-filter will disable building the gnumeric filter
+
+2012-10-02 Kohei Yoshida <kohei.yoshida@gmail.com> [876114fa199b98ef8c3e3fcf50add3255f06cc8a]
+
+ Just adding a ';' in the default case should suffice.
+
+
+2012-10-02 Markus Mohrhard <markus.mohrhard@googlemail.com> [4f290fa19341950b967eaf1967f05d5308c6beeb]
+
+ fix some warnings with gcc in the gnumeric import
+
+
+2012-10-02 Markus Mohrhard <markus.mohrhard@googlemail.com> [92f123c2e8223d7f8f8cc68a26e6a286a4a66f11]
+
+ also add the inline files for gnumeric
+
+
+2012-10-02 Markus Mohrhard <markus.mohrhard@googlemail.com> [db799a1fd44c486b729a5128e1c4fa7e0e480104]
+
+ CRLF to LF
+
+
+2012-10-02 Markus Mohrhard <markus.mohrhard@googlemail.com> [752e845580f55047f5dd24f5a81875942d5feaa3]
+
+ adapt to changed shared orcus code
+
+
+2012-10-02 Markus Mohrhard <markus.mohrhard@googlemail.com> [1003dfd6f86a80ef3309858f90986e9b7172c10b]
+
+ first step into gnumeric formula handling
+
+
+2012-10-02 Markus Mohrhard <markus.mohrhard@googlemail.com> [3c95ff05738c9f8ec5466ab86abda61898b38aae]
+
+ tabs to spaces
+
+
+2012-10-02 Markus Mohrhard <markus.mohrhard@googlemail.com> [6f2308780758ad7f1ee3fd7d69a3a796e3fcde79]
+
+ add gnumeric files to liborcus project file
+
+
+2012-10-02 Markus Mohrhard <markus.mohrhard@googlemail.com> [3880eadca31317703d4f6ca484402126ea85a5a7]
+
+ add files for gnumeric parser
+
+
+2012-10-02 Markus Mohrhard <markus.mohrhard@googlemail.com> [47fd025a51a2ca4ed59e7042ad44057257e231ac]
+
+ add orcus-gnumeric project
+
+
+2012-10-02 Markus Mohrhard <markus.mohrhard@googlemail.com> [22474f4179e4fe5c541210fb3e297be5b53cbf98]
+
+ script for generating gnumeric tokens
+
+
+2012-10-02 Kohei Yoshida <kohei.yoshida@gmail.com> [506ad567f28ce2c38abab2caeea1187c56c9a268]
+
+ Converting LF-CR line endings to LF only.
+
+
+2012-10-02 Kohei Yoshida <kohei.yoshida@gmail.com> [3a7adf427884d642ca395cffe6083643dbe26306]
+
+ Converting tabs to spaces.
+
+
+2012-10-02 Markus Mohrhard <markus.mohrhard@googlemail.com> [1e8b5f9c165c1cfef130575232838831381d5631]
+
+ add zLib as dependency to liborcus
+
+
+2012-10-02 Markus Mohrhard <markus.mohrhard@googlemail.com> [760d4b8ec009044b55da6637e0b39080d5abe135]
+
+ add xml_context_base::get_parent_element
+
+
+2012-10-02 Markus Mohrhard <markus.mohrhard@googlemail.com> [3cf3951a9bc1907ae5bc1bca0691120f2fd1427e]
+
+ add gnumeric schema file
+
+
+2012-09-26 Kohei Yoshida <kohei.yoshida@gmail.com> [f0be9d81039bed37dfa1198742b0a6e44e2f6438]
+
+ Merge branch 'xml-structure-detection'
+
+
+2012-09-19 Kohei Yoshida <kohei.yoshida@gmail.com> [85c58d590598d10d12a1af95b4374406bdc564aa]
+
+ Implement xml_structure_tree::walker correctly.
+
+ This at least passes the very first unit test.
+
+2012-09-18 Kohei Yoshida <kohei.yoshida@gmail.com> [fe25ad08bb441160fd96dd7ab22d5b4b25c53725]
+
+ Implement walker::descend().
+
+
+2012-09-18 Kohei Yoshida <kohei.yoshida@gmail.com> [96b1256a06464feda9d83c1a6830b4e764231719]
+
+ More on implementing the walker.
+
+
+2012-09-18 Kohei Yoshida <kohei.yoshida@gmail.com> [45e11d9c00824a2eaa3caf0ccf898a4b60cc6c77]
+
+ Let's use elem_name here.
+
+
+2012-09-18 Kohei Yoshida <kohei.yoshida@gmail.com> [95a0ffde0f65a5533c3dcbef984386c2338796bf]
+
+ Set the basic interfaces for tree walker. Most of its methods are still empty.
+
+
+2012-09-11 Kohei Yoshida <kohei.yoshida@gmail.com> [294514ebe1b8a04399d989f285130f4d5dc73ff3]
+
+ Let's hide these structures.
+
+
+2012-09-11 Kohei Yoshida <kohei.yoshida@gmail.com> [adb32938cb24ab84055e5a43a89f261209453eb4]
+
+ Another test case.
+
+
+2012-09-11 Kohei Yoshida <kohei.yoshida@gmail.com> [bac1022db99c2f5458909b148bd5c3cfca73d61c]
+
+ Test for parsing comment with a single hyphen.
+
+
+2012-09-11 Kohei Yoshida <kohei.yoshida@gmail.com> [82a973ee31e71bd4b182f15ff82a950c58c1b18f]
+
+ Fixed a bug in XML comment parsing in a presence of a hyphen in comment.
+
+
+2012-09-11 Kohei Yoshida <kohei.yoshida@gmail.com> [9834c686e6c3ffa872777e66af4fa25d9c2dea3d]
+
+ Fixed a bug in XML comment parsing in a presence of a hyphen in comment.
+
+
+2012-09-11 Kohei Yoshida <kohei.yoshida@gmail.com> [c4a62b6231b193386826e3999ae0020cb678627b]
+
+ Another basic test case for XML structure detection.
+
+
+2012-09-11 Kohei Yoshida <kohei.yoshida@gmail.com> [c11f0f9fc170da96a3c51dcd6b4163c83c364363]
+
+ Dedicated test file set for xml_structure_tree.
+
+
+2012-09-11 Kohei Yoshida <kohei.yoshida@gmail.com> [fc86674a270775ef627c8b1f57da45e744a37458]
+
+ Next version will be 0.3.0 due to incompatible API change.
+
+ The API version will up from 0.2 to 0.4.
+
+2012-09-11 Markus Mohrhard <markus.mohrhard@googlemail.com> [ee6d56e26d49089c808e34ee2f41abc1e32f51b8]
+
+ commit stlye methods should return index for later usage
+
+
+2012-09-11 Kohei Yoshida <kohei.yoshida@gmail.com> [00af1ff5254f4a3ba814344d049057c41972b363]
+
+ Removed the pre directory.
+
+
+2012-09-11 Kohei Yoshida <kohei.yoshida@gmail.com> [41c49f04ece444dce9ce500dcaab253adac0c70d]
+
+ Let's check in these inline files.
+
+ Dynamically generating them causes issues with vcproj files as well
+ as automake based build. These files are not re-generated too often,
+ so it's probably better to just check them in.
+
+2012-09-11 Kohei Yoshida <kohei.yoshida@gmail.com> [bd72b3d493562c90f0f07f298518906fc78b4be4]
+
+ Set executable bit.
+
+
+2012-09-11 Kohei Yoshida <kohei.yoshida@gmail.com> [9071e67571aec733af9f7cb5fcd5f2064c5c09c5]
+
+ Let's use '[*]' to mark repeated base elements.
+
+
+2012-09-11 Kohei Yoshida <kohei.yoshida@gmail.com> [152a65931a95d21ea6ff8350189f357c67cde351]
+
+ Only set the repeat flag with the base element of repeated structures.
+
+
+2012-09-11 Kohei Yoshida <kohei.yoshida@gmail.com> [c2c6e6e990b02292f61aa99bfa5848a56c4692de]
+
+ Implement dump_compact() for xml_structure_tree.
+
+
+2012-09-11 Kohei Yoshida <kohei.yoshida@gmail.com> [11f0f115c7ed81bb775f0a28086df848cf689612]
+
+ Hide the root element definition.
+
+
+2012-09-11 Kohei Yoshida <kohei.yoshida@gmail.com> [c83d153f4acbde79c4683c2272d5a4e8943bb076]
+
+ Parse xml content and build a structure tree. Not tested yet.
+
+
+2012-09-10 Kohei Yoshida <kohei.yoshida@gmail.com> [0e933d663b783ff241238b38f73c45ba4390ec7f]
+
+ More work on xml element structure class.
+
+
+2012-09-10 Kohei Yoshida <kohei.yoshida@gmail.com> [6bc730dae8bbe077f916a9ae538a9196a416299b]
+
+ Use namespace ID's instead of raw namespace keys.
+
+ But to get it to do the right thing will need a little more coding.
+
+2012-09-10 Kohei Yoshida <kohei.yoshida@gmail.com> [47f3d33a88dde8ee2ebe0c1b50ca06a8c3fcc84d]
+
+ Make this method available only for xmlns_context.
+
+
+2012-09-10 Kohei Yoshida <kohei.yoshida@gmail.com> [601bf82650189ac8f2ab69485047d001b58d1c38]
+
+ Basic test for XML namespace management code.
+
+
+2012-09-10 Kohei Yoshida <kohei.yoshida@gmail.com> [7511bd0dc2daa6336c687bee341b647ab74cb625]
+
+ Initial draft implementation of xml namespace management.
+
+
+2012-09-10 Kohei Yoshida <kohei.yoshida@gmail.com> [a3fdb386fbf9234e173ca72df8dd42a70291af44]
+
+ Started working on xml_structure_tree.
+
+ This tree will be used to detect canonical structure of elements in an
+ arbitrary XML content. In this tree, duplicate elements under the
+ same parent are represented by a single element entry.
+
+2012-09-10 Kohei Yoshida <kohei.yoshida@gmail.com> [941b8ff85f73be941f0dfa98aa9e7ec5bd0317fd]
+
+ Class description.
+
+
+2012-09-10 Kohei Yoshida <kohei.yoshida@gmail.com> [046b43542dd2f2656dbb8e1a0473cb8beeedbd8f]
+
+ Fill package description.
+
+
+2012-09-10 Kohei Yoshida <kohei.yoshida@gmail.com> [7cc9639eeb319bc24f2a850db1bfd75ed4ce9947]
+
+ Revert "Revert "No need to create gen file.""
+
+ This reverts commit df63dac42210d92a16c0c37bcdbf569a39d4f5f7.
+
+ Even with the gen file, the script gets run on every re-build. No
+ idea what's going on here.
+
+2012-09-10 Kohei Yoshida <kohei.yoshida@gmail.com> [df63dac42210d92a16c0c37bcdbf569a39d4f5f7]
+
+ Revert "No need to create gen file."
+
+ This reverts commit 858c81477289966b535fe0fd17870abc4f674322.
+
+ Without gen file, it causes re-compilation of non-modified source
+ files.
+
+2012-09-10 David Tardon <dtardon@redhat.com> [1b39351b33b49d833c90b5881c8a28c5d3f0ad37]
+
+ fix mingw build
+
+
+2012-09-10 Tomas Chvatal <tchvatal@suse.cz> [64d46e779ea123853e2331f9497571458c2ce81c]
+
+ Update the pc files and add also pc file for spreadsheet-model
+
+
+2012-09-10 Tomas Chvatal <tchvatal@suse.cz> [858c81477289966b535fe0fd17870abc4f674322]
+
+ No need to create gen file.
+
+
+2012-09-10 Tomas Chvatal <tchvatal@suse.cz> [d2ddb9f7c7169694225e4c148ce387b45fe8576c]
+
+ Add missing files to the make dist generated tarball
+
+
+2012-09-10 Tomas Chvatal <tchvatal@suse.cz> [fbf69b8393930784a1dc3393a1a26d564aaf3083]
+
+ Fix out-of sourcedir build.
+
+
+2012-09-10 Tomas Chvatal <tchvatal@suse.cz> [f720329ca7efc4c4534540432f19a7f57caff1ba]
+
+ Add missing license file.
+
+
+2012-09-07 Kohei Yoshida <kohei.yoshida@gmail.com> [a9b7ac05b3d07ecd342fd91b1bd1ed7c60d42d84]
+
+ Make --enable/disable-debug to actually work.
+
+ Previously, debug symbols were enabled regardless.
+
+2012-09-07 Kohei Yoshida <kohei.yoshida@gmail.com> [6541759abea6b8d1f233932a3812f5cd085a13de]
+
+ Update the slickedit project file.
+
+
+2012-09-07 Kohei Yoshida <kohei.yoshida@gmail.com> [13b6fc647dd775c46f8fa478c8b8be12876040d9]
+
+ Rename orcus-format-xml to orcus-xml-dump.
+
+ Let's have all xml-related programs begin with orcus-xml- for
+ consistency.
+
+2012-09-07 Kohei Yoshida <kohei.yoshida@gmail.com> [f8056cbbea31319672af12609b5dc2942b0f0bd5]
+
+ Typo.
+
+
+2012-09-07 Kohei Yoshida <kohei.yoshida@gmail.com> [c7765c62679d70d8ef71a9f49180c151e75de032]
+
+ Removed unnecessary linkages to libixion and libzip.
+
+
+2012-09-07 Kohei Yoshida <kohei.yoshida@gmail.com> [0a2bc46d2d164fd82cca421f4df329086583fcc6]
+
+ Hide the implementation of class sheet too.
+
+
+2012-09-07 Kohei Yoshida <kohei.yoshida@gmail.com> [b10646e5a5da9f171919d7c55d93c76b53fca331]
+
+ Hide more implementation details.
+
+
+2012-09-07 Kohei Yoshida <kohei.yoshida@gmail.com> [1e5768ba7b2490c9db78cf23cda9affada8a1692]
+
+ Only friends of document should access these.
+
+
+2012-09-07 Kohei Yoshida <kohei.yoshida@gmail.com> [cf1bcaf6ef9454f08462c577e4a973fcf555c12f]
+
+ Move ixion headers out of here.
+
+
+2012-09-07 Kohei Yoshida <kohei.yoshida@gmail.com> [f0b3fbbe065f230d4c858103d67484c734ed3ba6]
+
+ Unused methods.
+
+
+2012-09-07 Kohei Yoshida <kohei.yoshida@gmail.com> [5b4ebe81494962b32c737f2360d6a2e9f95d4f98]
+
+ Is this how to disable boost's autolink?
+
+
+2012-09-07 Kohei Yoshida <kohei.yoshida@gmail.com> [88139456a50bf82cd163078b47b4423ce26014aa]
+
+ Misc build fix due to the API version change in ixion.
+
+
+2012-09-07 Stephan Bergmann <sbergman@redhat.com> [0101150e04f7e8dde9a32d40085b506ad1f09bd9]
+
+ Fix various compiler warnings.
+
+
+2012-09-07 Kohei Yoshida <kohei.yoshida@gmail.com> [a5d1ad87f27d5167fe496c3124cd3dcd26347138]
+
+ Run make dist when creating a package.
+
+
+2012-09-06 Kohei Yoshida <kohei.yoshida@gmail.com> [ab284e1ef09b3c939f8066ee4980aa92ae6596c7]
+
+ Revert "Modified package script. I don't think we need to pack m4 files."
+
+ This reverts commit 8a86c221a8db1392f4526d5dd1ee604950df0a0f.
+
+ Actually we do need those m4 files.
+
+2012-09-06 Kohei Yoshida <kohei.yoshida@gmail.com> [8a86c221a8db1392f4526d5dd1ee604950df0a0f]
+
+ Modified package script. I don't think we need to pack m4 files.
+
+
+2012-09-06 Kohei Yoshida <kohei.yoshida@gmail.com> [5ce8e8cb1e8ad435fcd6cea2db37adfbc7b753de]
+
+ Stop parsing when the root element is closed.
+
+
+2012-09-06 Kohei Yoshida <kohei.yoshida@gmail.com> [e65bd8af9b102d02a916376cb65500e4aae9ae5a]
+
+ Underscore (_) is also a valid character in xml names.
+
+
+2012-09-06 Kohei Yoshida <kohei.yoshida@gmail.com> [a8cb2e0db01d14cc55a7b76e8abe718a77c93c98]
+
+ Meaningless duplicates. Removed.
+
+
+2012-09-06 Kohei Yoshida <kohei.yoshida@gmail.com> [936177a96666ac528e622852efa1c9d69efed1bc]
+
+ Filled NEWS and README.
+
+
+2012-09-06 Kohei Yoshida <kohei.yoshida@gmail.com> [80326cce838599c1cfe93a4f9d8dcb138e317de5]
+
+ List of authors (from git log).
+
+
+2012-09-06 Kohei Yoshida <kohei.yoshida@gmail.com> [6747b0fd7952e1cc9035e9f884be4d2e83e82f8b]
+
+ Disable assignments too on non-copyable classes.
+
+
+2012-09-06 Kohei Yoshida <kohei.yoshida@gmail.com> [76018dbc96a04e431afed79fdef905d596ae4e5f]
+
+ liborcus-static-nozip project uses DefaultConfig for boost location.
+
+
+2012-09-06 Kohei Yoshida <kohei.yoshida@gmail.com> [3839c76cfbe508018e6cb588c4850eae7132485b]
+
+ Split BOOST_DIR into BOOST_INCLUDE_DIR and BOOST_LIB_DIR.
+
+ LibreOffice build needs this in order to have orcus build internally.
+
+ Also fix the build with MSVC.
+
+2012-09-06 Kohei Yoshida <kohei.yoshida@gmail.com> [6772f28499153467b45aa3559a48ec9257bea2d1]
+
+ Pass sax_token_parser_element struct to handler.
+
+ To future-proof the API. I may extend this later to support passing of
+ non-tokenized elements.
+
+2012-09-06 Kohei Yoshida <kohei.yoshida@gmail.com> [004fcf17433e6ea4c2b72c7f6b0839b798555b15]
+
+ Deleted obsolete files.
+
+
+2012-09-06 Kohei Yoshida <kohei.yoshida@gmail.com> [f6c895afa6b13780cbec5909d54da3e0d6ef62a0]
+
+ Fix the script for a case where no argument is given.
+
+
+2012-09-05 Markus Mohrhard <markus.mohrhard@googlemail.com> [2afd3ac7c1827db080701f49874e159ae1b767c7]
+
+ all paths can be set through user macros now
+
+
+2012-09-05 Kohei Yoshida <kohei.yoshida@gmail.com> [3ae449992984de3c1f24bcc7ba8b3a0f0dbe54a5]
+
+ Move them into ods directory.
+
+
+2012-09-05 Kohei Yoshida <kohei.yoshida@gmail.com> [a35d85028a6d31139f8bb1f2fa35551c3789e43d]
+
+ Isolate large test files and don't package them.
+
+
+2012-09-05 Kohei Yoshida <kohei.yoshida@gmail.com> [d147c8db43dc64263f454260c8b5dd7bd61f5313]
+
+ --enable-libzip is now --with-libzip. Make that option work.
+
+
+2012-09-05 Kohei Yoshida <kohei.yoshida@gmail.com> [f6323faf70fbc5e05c8c8990fc954b3bcd9b9ffe]
+
+ Forgot to change this.
+
+
+2012-09-05 Markus Mohrhard <markus.mohrhard@googlemail.com> [ed41dbdf59aa353ffe111424b1fba756f38502e6]
+
+ all new project files can share the additional libs settings
+
+
+2012-09-04 Markus Mohrhard <markus.mohrhard@googlemail.com> [7b93e34a7b06aeb99d5fbfd36d3f0e6e9115c101]
+
+ use shared property files in new project files
+
+
+2012-09-04 Kohei Yoshida <kohei.yoshida@gmail.com> [25a44baed0da9e90cf9d5aa8c05002a530e5bfb4]
+
+ No debug info in Release config.
+
+
+2012-09-04 Kohei Yoshida <kohei.yoshida@gmail.com> [d2807cfc4cbd6f4901b03a01e7dcb8b76eda0cf1]
+
+ Add missing vs project files.
+
+
+2012-09-04 Kohei Yoshida <kohei.yoshida@gmail.com> [797b74418c600115e89ca4171c337db2ccadec82]
+
+ Don't ignore these.
+
+
+2012-09-04 Markus Mohrhard <markus.mohrhard@googlemail.com> [b79758b35e7941f54a4b764084bd0c7b1b3206ab]
+
+ extract boost dir and make it a user macro is vs project files
+
+
+2012-09-04 Kohei Yoshida <kohei.yoshida@gmail.com> [e822334e7cb8453d903348ab72218f8a0b1ad919]
+
+ Fixed mdds configure check test.
+
+
+2012-09-04 Kohei Yoshida <kohei.yoshida@gmail.com> [a9ccf90cf5acdcbad012219ef2e40fb6135fee50]
+
+ autogen.sh should automatically run configure at the end.
+
+
+2012-09-04 Tomas Chvatal <tchvatal@suse.cz> [9a1c4bd842f4a036792f0f78be1366825eeb740c]
+
+ Fix default cflags line. Copy/pasto.
+
+
+2012-09-04 Tomas Chvatal <tchvatal@suse.cz> [a012ef59cd698e013bb2d7b4149f3cb31c4226e9]
+
+ Update Makefile stuff to include libs and headers where needed properly.
+
+
+2012-09-04 Tomas Chvatal <tchvatal@suse.cz> [d05a89b17bceb46627e3657f6453a7bba9f5212b]
+
+ Update configure.ac to be up par with libvisio/etc libraries.
+
+
+2012-09-04 Tomas Chvatal <tchvatal@suse.cz> [d31db139d3c1cb4f6fcdf3899dd00c123c5e2d66]
+
+ Update gitignore.
+
+
+2012-09-04 Tomas Chvatal <tchvatal@suse.cz> [2699272c0d8ec8cbae85ecf777a48315d876fa0a]
+
+ Update autogen.sh script.
+
+
+2012-09-04 Tomas Chvatal <tchvatal@suse.cz> [94c499d9e9302662827b198fa961d746a5a5114e]
+
+ Simplify the changelog creation
+
+
+2012-09-04 Kohei Yoshida <kohei.yoshida@gmail.com> [017f3c303d4f9716550277fc793e0355d12e3d73]
+
+ Remove orcus-csv-static project. It doesn't even build.
+
+
+2012-09-04 Markus Mohrhard <markus.mohrhard@googlemail.com> [6c1ce741439fd9ba1e090c18989200483dd81789]
+
+ extract common inclued paths into own property files
+
+
+2012-09-03 Markus Mohrhard <markus.mohrhard@googlemail.com> [aa9ba8d71d561d526e3db8541950d7c12c1079e6]
+
+ more absolute path to relative path in vs project files
+
+
+2012-09-02 Kohei Yoshida <kohei.yoshida@gmail.com> [8d41d4a2d4e8a3befa3c947521981bfeda5b9f67]
+
+ Avoid potentially passing NULL pointer to std::string even when len = 0.
+
+ Apparently std::string doesn't like that.
+
+2012-09-02 Kohei Yoshida <kohei.yoshida@gmail.com> [a22d099361b2b1caa213334e6f4fa6d1d7158eeb]
+
+ More Visutal Studio bits.
+
+
+2012-09-02 Markus Mohrhard <markus.mohrhard@googlemail.com> [438324a17d9e88df8f2581f6604775e8db543409]
+
+ use relative path where possible in vs project file
+
+
+2012-09-01 Kohei Yoshida <kohei.yoshida@gmail.com> [a0c97c22b3fc040e15ae5b21afd5b1938c172ba3]
+
+ Building and linking a static library shouldn't use declspec at all.
+
+
+2012-08-31 Kohei Yoshida <kohei.yoshida@gmail.com> [9b33aa3551f0887dfb7ecca5915f2688c1675303]
+
+ More programs to check in configure.
+
+
+2012-08-31 Kohei Yoshida <kohei.yoshida@gmail.com> [1f0600a01f0fa9f60344d76727e1a1c96137c399]
+
+ Set the output library to orcus.lib.
+
+
+2012-08-31 Kohei Yoshida <kohei.yoshida@gmail.com> [e5030bfaf71c8af1a3f8925e2aef60b7636da908]
+
+ More fix in vs project files.
+
+
+2012-08-31 Kohei Yoshida <kohei.yoshida@gmail.com> [f30da77e72ca0a8509cdbc2c28becc1848b68637]
+
+ More VS project bits.
+
+
+2012-08-31 Kohei Yoshida <kohei.yoshida@gmail.com> [74f15d570ae5c502825775f6503d45d047650ee7]
+
+ New VS project, to build liborcus without libzip support.
+
+
+2012-08-31 Kohei Yoshida <kohei.yoshida@gmail.com> [7ec27dda2ed31bc45751caeb935768080b2774e9]
+
+ No manual -fPIC flag. We can use --with-pic configure option.
+
+
+2012-08-31 Kohei Yoshida <kohei.yoshida@gmail.com> [c2668c38d7743d12ecf16c571f9a61334463e5de]
+
+ Improved package script a bit.
+
+
+2012-08-31 Kohei Yoshida <kohei.yoshida@gmail.com> [06e17c019073188f57ab1ace897ca32cc7eb10e9]
+
+ Don't forget -fPIC when compiling shared objects.
+
+
+2012-08-31 Kohei Yoshida <kohei.yoshida@gmail.com> [32ec4e26f2e3becb5c1a6b80e25c73b8b8b90296]
+
+ This is wrong.
+
+
+2012-08-31 Kohei Yoshida <kohei.yoshida@gmail.com> [b41d98e0bed8a3fe7aec7f880f997ebdfa4f229f]
+
+ Cleaned up configure a bit, esp around CXXFLAGS and CPPFLAGS.
+
+
+2012-08-30 Kohei Yoshida <kohei.yoshida@gmail.com> [0921e4431f073c4bff6a437d13735a4696ba057c]
+
+ Package script now optionally supports adding md5sum to its name.
+
+
+2012-08-30 Kohei Yoshida <kohei.yoshida@gmail.com> [2cb3b3d14b97b00d57de83f6fa54bf773f84dff8]
+
+ Move this up a bit.
+
+
+2012-08-30 Kohei Yoshida <kohei.yoshida@gmail.com> [0a52fcd088e4ce07bca7a23cd1df292e37f6ca1a]
+
+ Don't deliver headers for ods and xlsx when libzip is disabled.
+
+
+2012-08-30 Kohei Yoshida <kohei.yoshida@gmail.com> [89107141de61fb3e5a7005d872255259680ad344]
+
+ More vsprojects bits...
+
+
+2012-08-30 Kohei Yoshida <kohei.yoshida@gmail.com> [f0412fa219d32d94910a411d33bdd827ca3a8ef7]
+
+ Add orcus-csv orcus-xml and orcus-xlsx as projects.
+
+
+2012-08-30 Kohei Yoshida <kohei.yoshida@gmail.com> [855de63e551b307cde365129edd2a8a62fab2217]
+
+ Add two more projects, and get orcus-ods.exe to build.
+
+ And it works!
+
+2012-08-29 Kohei Yoshida <kohei.yoshida@gmail.com> [ef95538eea5c2e6a44bc10078a439293590c38fa]
+
+ Make it buildable in Release configuration too.
+
+
+2012-08-29 Kohei Yoshida <kohei.yoshida@gmail.com> [5c41e35b5248b1056ed6e022487725b541c47efa]
+
+ Visual Studio solution file for orcus.
+
+
+2012-08-29 Kohei Yoshida <kohei.yoshida@gmail.com> [15c8e88365f6a1debd82fcf8d67d097124a4c7be]
+
+ Misc Windows build bits, to fix errors and warnings.
+
+
+2012-08-29 Kohei Yoshida <kohei.yoshida@gmail.com> [b6bbbd54f79e2c68c0dea501190a05d52a13bf5e]
+
+ Shell script to manually run token generators.
+
+ This is useful on Windows where we can't run pre-build scripts as
+ part of the build process.
+
+2012-08-29 Kohei Yoshida <kohei.yoshida@gmail.com> [58d7e40bcbfc5cb566640e8f82287d960544c6dd]
+
+ Add --disable-libzip as a configure option.
+
+ Disabling libzip will disable all zip-archive based formats, such as
+ ods and xlsx.
+
+2012-08-29 Kohei Yoshida <kohei.yoshida@gmail.com> [50279f4e571d92222185cc32d60397d5d2ba65e5]
+
+ Common and XML tests don't depend on the spreadsheet model.
+
+
+2012-08-29 Kohei Yoshida <kohei.yoshida@gmail.com> [9751f80eb1405b478ee42b51587e118c66d73e6c]
+
+ Move orcus-format-xml out of BUILD_SPREADSHEET_MODEL.
+
+ orcus-format-xml doesn't require the spreadsheet model part to
+ function.
+
+2012-08-29 Kohei Yoshida <kohei.yoshida@gmail.com> [938fe4d25003f76773aae54324448c11d63a9bca]
+
+ Rename --disable-spreadsheet to --disable-spreadsheet-model.
+
+ In the future we will use --disable-spreadsheet to disable the
+ spreadsheet-related parts of liborcus. The spreadsheet model
+ implementation lives in a separate shared library
+ (liborcus-spreadsheet-model).
+
+2012-08-29 Fridrich Štrba <fridrich.strba@bluewin.ch> [26fd490abe60d664b905642eb572583b015418fc]
+
+ Define __ORCUS_BUILDING_DLL when buildig the DLL
+
+
+2012-08-29 Fridrich Štrba <fridrich.strba@bluewin.ch> [961525e9dd95fb60f235ffa50d4606dda0f5d896]
+
+ Don't fail configure when cross-compiling
+
+
+2012-08-28 Kohei Yoshida <kohei.yoshida@gmail.com> [5c3ab9d38165d38a803ece14a5841d8ce0491248]
+
+ Add or fix inline comments.
+
+
+2012-08-28 Kohei Yoshida <kohei.yoshida@gmail.com> [226954a5a11a8bc6d6274a6de8cf954ed9a59f3a]
+
+ A little cleanup.
+
+
+2012-08-28 Kohei Yoshida <kohei.yoshida@gmail.com> [7b43f928aa7cbeff66638277ea6228b0bdd083b7]
+
+ Get the cell values from the document, and repeat the loop for each record.
+
+ Now we can finally export a series of rows to XML.
+
+2012-08-28 Kohei Yoshida <kohei.yoshida@gmail.com> [fd382527482c3a0e2fb2e2766e0f7cb09e5ba654]
+
+ Write a sub-structure comprising the range reference from the xml map tree.
+
+ Now I need to repeat this for the number of records.
+
+2012-08-28 Kohei Yoshida <kohei.yoshida@gmail.com> [18a8596e60d7f84f033e1058e8059ef07d9ff91a]
+
+ Rename m_root to mp_root since it's a pointer.
+
+
+2012-08-28 Kohei Yoshida <kohei.yoshida@gmail.com> [1778b3e964289662305309e31691c11d8409c5ed]
+
+ Get range data from the sheet. 1st cut.
+
+
+2012-08-27 Kohei Yoshida <kohei.yoshida@gmail.com> [b9410c9742ac8cd90fb4fc2cf1430f23affd963d]
+
+ Check for export_factory instance just in case...
+
+
+2012-08-27 Kohei Yoshida <kohei.yoshida@gmail.com> [58a07d1a1544da7873ac97c5e2bbbf16311ab40c]
+
+ Get single cell link values from the document model.
+
+ String and numeric values only for now.
+
+2012-08-27 Kohei Yoshida <kohei.yoshida@gmail.com> [64836b0c30866f4a7fb9e5972c55c13c1d52c819]
+
+ Rename import_factory.* back to factory.*.
+
+
+2012-08-27 Kohei Yoshida <kohei.yoshida@gmail.com> [a0fbc2367f757d18ecc52111dbbde57305600ec7]
+
+ Removing unused code.
+
+
+2012-08-27 Kohei Yoshida <kohei.yoshida@gmail.com> [3bacddde598126961f1d66d95a78fc0ed024f10a]
+
+ Prefix all import interface implementations with import_.
+
+
+2012-08-27 Kohei Yoshida <kohei.yoshida@gmail.com> [f998ae0e81851a67ac000853b3b75fefa0e43002]
+
+ Rename header guards too.
+
+
+2012-08-27 Kohei Yoshida <kohei.yoshida@gmail.com> [65d9fe4b00887268150eb7dbbcf07c751b0c2502]
+
+ Rename interface.hpp to import_interface.hpp.
+
+
+2012-08-27 Kohei Yoshida <kohei.yoshida@gmail.com> [d24eb53dc0d487f45cd88cf47f6678c67b0c148c]
+
+ Rename factory to import_factory, to make room for export_factory.
+
+
+2012-08-27 Kohei Yoshida <kohei.yoshida@gmail.com> [5300fafdc56322a2cad537dabe21053e04983374]
+
+ Remaining model_ to spreadsheet_ name change.
+
+
+2012-08-27 Kohei Yoshida <kohei.yoshida@gmail.com> [0ff85e3ca3231d9e24f343b0e9076c92a5f6f0dd]
+
+ Preparing for replacing the linked content.
+
+ But first, I need to work on expanding the interface for export.
+
+2012-08-27 Kohei Yoshida <kohei.yoshida@gmail.com> [60e897d41924733af29a0696492cf383bf4039bc]
+
+ Fix this wrapper script.
+
+
+2012-08-27 Kohei Yoshida <kohei.yoshida@gmail.com> [1bfc23ca878fa160c7cf8cc23c9d6ddf681d2cd8]
+
+ Re-construct the XML file using stream position data.
+
+ Next step is to replace the linked segments with content from the
+ document model.
+
+2012-08-27 Kohei Yoshida <kohei.yoshida@gmail.com> [d47a070605ff0e733d7becb052227186a4efd4c7]
+
+ Let's use field links of different depths just to test the logic in my code.
+
+
+2012-08-27 Kohei Yoshida <kohei.yoshida@gmail.com> [b705143a63e9e754e4516143e71d37cced91c309]
+
+ Use the element one level up as the parent element of a range.
+
+ Its immediate child element (it should only have one child element)
+ is to be used to group each record entry.
+
+2012-08-27 Kohei Yoshida <kohei.yoshida@gmail.com> [5b11b8746d712aab53172a924ae88a5a18f44210]
+
+ Pick up the stream positions of range refenreces too.
+
+ But this one has a bug. I need to re-think the logic again.
+
+2012-08-27 Kohei Yoshida <kohei.yoshida@gmail.com> [bddb0894a525422974d44da437e95542d8281287]
+
+ Rename ref to pos.
+
+
+2012-08-27 Kohei Yoshida <kohei.yoshida@gmail.com> [df7d5d98aa39b2695092b8e067c62caaf461d7df]
+
+ range_ref to ref. Short and sweet.
+
+
+2012-08-27 Kohei Yoshida <kohei.yoshida@gmail.com> [73de9ee2988cb014306fd174b91fc778baa2ec46]
+
+ Let's store the cell position just once in range_reference.
+
+ Instead of duplicating it in each field_in_range. This saves memory.
+
+2012-08-27 Kohei Yoshida <kohei.yoshida@gmail.com> [bf0c16d243efd10da937e4d18b2344b5f4fbb0eb]
+
+ Determine the parent element of each range reference.
+
+ Parent element of a range reference is the deepest element that
+ is common among all the field link elements in that range reference.
+
+2012-08-27 Kohei Yoshida <kohei.yoshida@gmail.com> [13f8608d342ce887d97e0e356edd56efcb72fb6e]
+
+ get_element() to get_element_stack().
+
+ I need a full stack for range links in order to determine the common
+ parent element for all range field links.
+
+2012-08-27 Kohei Yoshida <kohei.yoshida@gmail.com> [720e7a3119f9e87ea824b0d069816749c6d003d7]
+
+ Re-organized typedef's and class description.
+
+
+2012-08-25 Kohei Yoshida <kohei.yoshida@gmail.com> [8d45c1b4b71a23695ecaef4730200b2f7b1ab59e]
+
+ Same logic, slightly simpler.
+
+
+2012-08-25 Kohei Yoshida <kohei.yoshida@gmail.com> [03e070e4cfafb7715b7c8902af3b1f9bd927840c]
+
+ Record positions of single linked elements.
+
+ This information will be used during export, to replace them with new
+ data from the linked cells in the document.
+
+2012-08-25 Kohei Yoshida <kohei.yoshida@gmail.com> [4d24ddc48c2e134b30ebfef34f64f41f516c44d9]
+
+ Back to xml. More on writing out transformed xml stream.
+
+
+2012-08-24 Kohei Yoshida <kohei.yoshida@gmail.com> [d9c7277b631077081b57f1a0fda5d54858cf13c3]
+
+ Let's call this open_zip_stream. This pairs better with close_zip_stream.
+
+
+2012-08-24 Kohei Yoshida <kohei.yoshida@gmail.com> [2c802e70414bec3e33f06c9d2f1dbb77176c59dd]
+
+ Some javadoc comments.
+
+
+2012-08-24 Kohei Yoshida <kohei.yoshida@gmail.com> [6a410f7251d5f0045bcf9707f578a426c7bfa343]
+
+ A little cleanup.
+
+
+2012-08-24 Kohei Yoshida <kohei.yoshida@gmail.com> [397858f23a10862a42004a7b6d43fec15f0be6b9]
+
+ Move opc_reader header file under ooxml.
+
+
+2012-08-24 Kohei Yoshida <kohei.yoshida@gmail.com> [e31b0d12fca904470e3a70c1501395248874b444]
+
+ I need to fix it here too.
+
+
+2012-08-24 Kohei Yoshida <kohei.yoshida@gmail.com> [68d719fa23fb1e7587262bb344106f1daf1a61cf]
+
+ Have orcus_xlsx use opc_reader.
+
+
+2012-08-24 Kohei Yoshida <kohei.yoshida@gmail.com> [c32ba3d2473facb0968fb5648b853f21277c5112]
+
+ Oops this is a bad style.
+
+
+2012-08-24 Kohei Yoshida <kohei.yoshida@gmail.com> [6d78ed6cf6cd56321cd6f294e219f9d31cdff672]
+
+ Add opc_reader class which takes care of parsing the opc structure.
+
+ This class is not yet used.
+
+2012-08-24 Kohei Yoshida <kohei.yoshida@gmail.com> [0240264c3afeee0476749904e3589104d1dca657]
+
+ More on renaming model -> spreadsheet.
+
+
+2012-08-24 Kohei Yoshida <kohei.yoshida@gmail.com> [1d0ec7bfe5cebfbfacadd9fb69c6e197d53163b5]
+
+ Rename header guard names appropriately.
+
+
+2012-08-24 Kohei Yoshida <kohei.yoshida@gmail.com> [0dd61aee8c4d11cc8a4fff2fad62d83598cd5553]
+
+ Rename directory model -> spreadsheet.
+
+
+2012-08-24 Kohei Yoshida <kohei.yoshida@gmail.com> [7aa4abc991c2d6683f094bf4fbe7f7217813e920]
+
+ Rename namespce 'model' to 'spreadsheet'.
+
+
+2012-08-24 Kohei Yoshida <kohei.yoshida@gmail.com> [755736b5ac18dd6fdb1a311b13620f9585238036]
+
+ Fix orcus-xlsx.sh and orcus-ods.sh scripts.
+
+
+2012-08-24 Kohei Yoshida <kohei.yoshida@gmail.com> [0844bce541ae99de051100a76d58f72b81d067c4]
+
+ Store the open close element positions for single-linked elements.
+
+ For single-linked elements, storing the positions of their immediate
+ parent element pair is sufficient.
+
+2012-08-24 Kohei Yoshida <kohei.yoshida@gmail.com> [0def57a8dd92a621acb1cc7c2a4c5188d479ed2d]
+
+ cell_reference to store cell_position as its member.
+
+
+2012-08-24 Kohei Yoshida <kohei.yoshida@gmail.com> [bb9c7e429197fbb7bc39a91979d0b2e68df14a8a]
+
+ Rename cell_reference to cell_position.
+
+
+2012-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [23fe265cb87f2b0529720b7b38f8fe641ccca3cd]
+
+ Store begin and end positions of each element and pass them to handler.
+
+
+2012-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [7be1e2c3605d369948a906d08c4360469b0d0d8c]
+
+ Pass element properties in a struct instead of individually.
+
+ This makes it easier to later add more properties if I so decide.
+
+2012-08-23 Kohei Yoshida <kohei.yoshida@gmail.com> [0b843a4827ebe4604220ce86196000bfec41f408]
+
+ Started working on writing transformed xml content.
+
+
+2012-08-22 Kohei Yoshida <kohei.yoshida@gmail.com> [078621c0242a774be45487da6fcc6824369a2d63]
+
+ Rename row_offset to row_size.
+
+ I can re-use this during export to figure out the vertical size of
+ each range reference.
+
+2012-08-22 Kohei Yoshida <kohei.yoshida@gmail.com> [6db706a12aa8adf7df27cbe00f6f92c159faefd9]
+
+ Dump document content after load, and cross-check it against known datum.
+
+
+2012-08-21 Kohei Yoshida <kohei.yoshida@gmail.com> [57ea7a99d7ed7584fa0de3251646717b12991e0f]
+
+ Get the test code for mapped xml to parse the map and data xml files.
+
+
+2012-08-21 Kohei Yoshida <kohei.yoshida@gmail.com> [f88bd1d5dd2f8d1a8fb20f0ee85ad12d5aec074a]
+
+ Added empty unit test framework for mapped XML import.
+
+
+2012-08-21 Kohei Yoshida <kohei.yoshida@gmail.com> [496b7f12c415f14bff32992c054bf9afbfc293fe]
+
+ When calling set_auto(), try to detect numeric value strings.
+
+
+2012-08-21 Kohei Yoshida <kohei.yoshida@gmail.com> [9745212b21f062e619af9d771aa345553877b2ba]
+
+ Add dump_check() method to dump content for use in unit test.
+
+
+2012-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [138f0f80477c4e76420b263248a1bacddd6f0115]
+
+ Fixed memory leak.
+
+
+2012-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [247db5ba59c6e3feb28da577bb23988c722460f5]
+
+ Finally, parse and insert linked range data.
+
+
+2012-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [8815e26185af0e1a935b4241846ccc19d267ba26]
+
+ Insert range header names before parsing the data xml.
+
+
+2012-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [28ce2aa01be472e12566d85a9119203eb8f39fee]
+
+ Let's make the column position implicit.
+
+ This makes it easier to handle range field references.
+
+2012-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [2eaca4b2df431c48ba75dc20c384016ab9b1819e]
+
+ A little bit of this and that.
+
+
+2012-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [dcbbee3f6d1e1bf586fdbdc7cb561b51fef36505]
+
+ Make sure to intern sheet name strings.
+
+
+2012-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [ea7a70ac856deae31cd6cc47328efcbb832405a7]
+
+ Import just the single cell links.
+
+ Sheet names are corrupted. I need to debug that.
+
+2012-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [778015bbdb937c8ab52209065a6bbf5c518d5ea8]
+
+ Also test the descending direction.
+
+
+2012-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [c4a3cb78a475f99a6e4809454ae57f754553a04b]
+
+ Unit test, and found the bug. Yay!
+
+
+2012-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [9e5527b349531f88d532a72220b461248f3ea3a6]
+
+ Try to detect content elements, but it's not working. I need to debug.
+
+
+2012-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [b95738feb694413c7c15e3daa4fdc446869a0e8f]
+
+ Fully implement xml tree walker.
+
+
+2012-08-20 Kohei Yoshida <kohei.yoshida@gmail.com> [0d0c65c0d6c3be1f577cab596fdfa2e375f61748]
+
+ Tree walker to traverse the xml map tree structure.
+
+ Also, for now I ignore namespaces, but in the future I need to write
+ a separate xml namespace manager to correctly handle namespaces in xpath.
+
+2012-08-17 Kohei Yoshida <kohei.yoshida@gmail.com> [cc8a2f70d726496283da91e0cb386ba8383e3ced]
+
+ Move the xml-map parsing code outside of orcus_xml.
+
+
+2012-08-17 Kohei Yoshida <kohei.yoshida@gmail.com> [0deac50efe04421b44613a79dd49af4cb7edffd6]
+
+ Map file needs to explicitly specify sheet names to insert.
+
+
+2012-08-17 Kohei Yoshida <kohei.yoshida@gmail.com> [a2362698a636d1af231cc1038f94b4af142eec9e]
+
+ Remove debug statements.
+
+
+2012-08-17 Kohei Yoshida <kohei.yoshida@gmail.com> [2068d6ab63b6dba6eea02ded6e2537296a6b49db]
+
+ Test for range field link insertion.
+
+
+2012-08-17 Kohei Yoshida <kohei.yoshida@gmail.com> [69f4e5db70dcf945110c9ebe33146e8ff75ba6be]
+
+ Test multiple link insertions.
+
+
+2012-08-17 Kohei Yoshida <kohei.yoshida@gmail.com> [ee66fcc79cc7c1921cbf18e741a4195604065a83]
+
+ Rewrite get_element() to use xpath_parser for simplification.
+
+
+2012-08-17 Kohei Yoshida <kohei.yoshida@gmail.com> [cd23097b35608f95fb89672c58f683d6ddecb462]
+
+ Really fixed the scripts.
+
+ The test executables must be run in their respective working directory.
+
+2012-08-17 Kohei Yoshida <kohei.yoshida@gmail.com> [0a1fbe69a697df1fa375ee83c451b53f14cac5c8]
+
+ Fixed the script.
+
+
+2012-08-17 Kohei Yoshida <kohei.yoshida@gmail.com> [18b4eb776e8978d827ba3be634b53ec260496c6c]
+
+ Test for link insertion.
+
+
+2012-08-17 Kohei Yoshida <kohei.yoshida@gmail.com> [eb3806569638d6cc6cf45d38c614b072e7ce89b2]
+
+ Add construct to unit-test xml_map_tree.
+
+
+2012-08-17 Kohei Yoshida <kohei.yoshida@gmail.com> [631e4b30ff2f0d407ef1673e7cc9fad7d9440127]
+
+ I need to intern name strings, since they must survive after the parsing.
+
+
+2012-08-17 Kohei Yoshida <kohei.yoshida@gmail.com> [afdbf8a5981fc0d611abf347a846b9a01863b25a]
+
+ Finished parsing and constructing the xpath tree.
+
+
+2012-08-16 Kohei Yoshida <kohei.yoshida@gmail.com> [c841d574cfdc1826e69a02db451e19cefb44dabf]
+
+ Get the root element when one doesn't exist yet.
+
+
+2012-08-16 Kohei Yoshida <kohei.yoshida@gmail.com> [ffeaa409dd5555f8535981f6471e3c090cac82d8]
+
+ Parse xpath and split it into names separated by '/'s.
+
+
+2012-08-16 Kohei Yoshida <kohei.yoshida@gmail.com> [b9bf3ab6ca17c21a1783e8bb820885e028829af5]
+
+ element's constructor...
+
+
+2012-08-16 Kohei Yoshida <kohei.yoshida@gmail.com> [3381d05c4150cd7bb1b5c52c9fff9232627a059a]
+
+ A bit more work.
+
+
+2012-08-16 Kohei Yoshida <kohei.yoshida@gmail.com> [2eb675c785e21698b76c9c88e787b05008e60f60]
+
+ Moved internal-only headers out of public include directory.
+
+
+2012-08-16 Kohei Yoshida <kohei.yoshida@gmail.com> [0fe725a3b2088626cb843fff989e35fab28eea53]
+
+ Route the map link calls to xml_map_tree.
+
+
+2012-08-16 Kohei Yoshida <kohei.yoshida@gmail.com> [436a9ca1ad6c6a9fcc6a45b70290e5a08e840b39]
+
+ Added string_pool and xml_map_tree.
+
+ string_pool is the interned string storage part of pstring becoming
+ independent on its own.
+
+2012-08-16 Kohei Yoshida <kohei.yoshida@gmail.com> [2a78afb59f31dc34d6bd673c7d5fe22c9d4bb370]
+
+ Share common bits among launch scripts.
+
+
+2012-08-14 Kohei Yoshida <kohei.yoshida@gmail.com> [0111bec4b7c412c7a76b5904f71ae2a6c9378cd2]
+
+ Parse the map xml file and register the links.
+
+ The filter side is still empty. I'll work on that.
+
+2012-08-13 Kohei Yoshida <kohei.yoshida@gmail.com> [43f70e5369fb9644653caa9e01c43b887124139a]
+
+ Running make check in a prestine state should also run the pre scripts.
+
+ Previously, make check -j<n> would fail unless you've already run make
+ prior to it. This should fix it.
+
+2012-08-13 Kohei Yoshida <kohei.yoshida@gmail.com> [845cf29ae40bd009ee73d3a19c8874cd86d89427]
+
+ A little more progress. Still a bunch of skeletons without meat.
+
+
+2012-08-13 Kohei Yoshida <kohei.yoshida@gmail.com> [b358f37110d413addda5f650231ce0bcdf216ce5]
+
+ Added data xml and its map file (also xml) to use for xml import.
+
+
+2012-08-10 Kohei Yoshida <kohei.yoshida@gmail.com> [c76224b6578c400813a20bff621e7924738e72bd]
+
+ Skeleton files for orcus-xml.
+
+
+2012-08-10 Kohei Yoshida <kohei.yoshida@gmail.com> [97cda21b1492b3a5b4361cf10f77e7c930cfac80]
+
+ Generalize sax parser testing.
+
+ Now I can specify multiple files to test at will.
+
+2012-08-10 Kohei Yoshida <kohei.yoshida@gmail.com> [36b80887c2fa28c884e70f6d7653776af343c96d]
+
+ Added --disable-debug, which defines NDEBUG during the build.
+
+
+2012-08-10 Kohei Yoshida <kohei.yoshida@gmail.com> [14d059bddf293c3f7ef90cda36ce0f4fc3dda98b]
+
+ Cross-check the xml content against known static content.
+
+
+2012-08-10 Kohei Yoshida <kohei.yoshida@gmail.com> [1ddfa92caea271ab5e6e00061ba58d7288662d08]
+
+ Clean up.
+
+
+2012-08-10 Kohei Yoshida <kohei.yoshida@gmail.com> [6be1847b24113a3094eadc6746812894270ee458]
+
+ -O2 seems faster than -Os overall.
+
+
+2012-08-10 Kohei Yoshida <kohei.yoshida@gmail.com> [d66cfd769f7f8f2dfeb33bfc7ae2816dc38d793d]
+
+ New command line tool orcus-format-xml.
+
+
+2012-08-10 Kohei Yoshida <kohei.yoshida@gmail.com> [dfdbec4ed935db5022347d6d0ea666c50835832a]
+
+ Add more patterns.
+
+
+2012-08-10 Kohei Yoshida <kohei.yoshida@gmail.com> [a9b3be192d566f8456e9182aa7bb60153a4d8c97]
+
+ Add test for pstring::trim().
+
+
+2012-08-10 Kohei Yoshida <kohei.yoshida@gmail.com> [ad52531d608ae03ab7ce90ad2e2757f9c7622216]
+
+ Wrapper script for xml testing.
+
+
+2012-08-10 Kohei Yoshida <kohei.yoshida@gmail.com> [7789ffdbd4337d5ac1e071e00bb553e8992c3faf]
+
+ Test file for shared stuff.
+
+
+2012-08-10 Kohei Yoshida <kohei.yoshida@gmail.com> [ec3e43c3e61b9b1f41fd1acabf993f5bc8bd1350]
+
+ Rename orcus-*-test to orcus-test-*.
+
+
+2012-08-10 Kohei Yoshida <kohei.yoshida@gmail.com> [55cbda7d6bcbe3aa735a348f9c6d6995e6376f95]
+
+ Print the attributes too. Now the dump method is complete.
+
+
+2012-08-10 Kohei Yoshida <kohei.yoshida@gmail.com> [ed7183f462ec9b3dd26679b531ca50950f8ad84b]
+
+ Cleaner way to print node contents.
+
+
+2012-08-10 Kohei Yoshida <kohei.yoshida@gmail.com> [180f28d032bb69818ee37646fa4927aeeea2aba3]
+
+ A little cleanup etc.
+
+
+2012-08-10 Kohei Yoshida <kohei.yoshida@gmail.com> [0ddf39c60df3e1d8a6eba6dc79f722fd93cb527c]
+
+ Print content values in the correct position.
+
+
+2012-08-10 Kohei Yoshida <kohei.yoshida@gmail.com> [36c0f8b69d0b1f73555a6b80d227dc1cc2ccfb0c]
+
+ Fixed pstring::trim() method and correctly push trimmed content.
+
+
+2012-08-10 Kohei Yoshida <kohei.yoshida@gmail.com> [070d54a9abc09a206b3988e864e0747272d2e54c]
+
+ Dump the tree content. Elements only for now.
+
+
+2012-08-10 Kohei Yoshida <kohei.yoshida@gmail.com> [82c5206469dc184b24d868d3f82fa9139ed401a7]
+
+ Trim content string before storing it.
+
+
+2012-08-10 Kohei Yoshida <kohei.yoshida@gmail.com> [f4e76b976b956f2bf89760a0eb3fb741b8a372e2]
+
+ Added dom tree structure.
+
+
+2012-08-09 Kohei Yoshida <kohei.yoshida@gmail.com> [03e89f6f4ab855b7aead146df51290e487d226f7]
+
+ We don't need this now.
+
+
+2012-08-09 Kohei Yoshida <kohei.yoshida@gmail.com> [60c2237ba47214e5082bb0beaef9b9fee9a1380f]
+
+ Rename sax.hpp -> sax_token_parser.hpp
+
+
+2012-08-09 Kohei Yoshida <kohei.yoshida@gmail.com> [a60055a5494353d5d7c9c15d8e7a099b0c053c49]
+
+ Class description.
+
+
+2012-08-09 Kohei Yoshida <kohei.yoshida@gmail.com> [5def92d11c917e68262ef8bff4ec0de6d3178cd5]
+
+ Have sax_token_parser use sax_parser internally.
+
+ This finally removes the duplicated parser code.
+
+2012-08-09 Kohei Yoshida <kohei.yoshida@gmail.com> [b9c706b79b9c340743d72f13ea4353d11541ff1c]
+
+ Parse xml comments.
+
+
+2012-08-08 Kohei Yoshida <kohei.yoshida@gmail.com> [576ac1b5f7f9bc147c807be7bbab6fc31be3a14c]
+
+ XML comment currently fails.
+
+
+2012-08-08 Kohei Yoshida <kohei.yoshida@gmail.com> [98fb33549c68eb2ffc37a3f1c0e8962c2921eb94]
+
+ Correct name is xmlns.
+
+
+2012-08-08 Kohei Yoshida <kohei.yoshida@gmail.com> [513e958702e9ef21532a705a3779aae0a67a8863]
+
+ Add test xml document to start parsing.
+
+
+2012-08-08 Kohei Yoshida <kohei.yoshida@gmail.com> [9239f2114687e5bfac011af3d41acbbf27ceac5f]
+
+ Started working on a generic sax xml parser.
+
+ This is necessary when you don't know the token names beforehand.
+
+2012-08-08 Kohei Yoshida <kohei.yoshida@gmail.com> [689d3a8c24005745d8bdd94fd8defec988df4d7b]
+
+ Rename sax_parser to sax_token_parser.
+
+
+2012-08-08 Kohei Yoshida <kohei.yoshida@gmail.com> [b6ed0b79a7154741694b27dfededd5eabfbc1f50]
+
+ Remove the libxml related pieces.
+
+
+2012-08-01 Kohei Yoshida <kohei.yoshida@gmail.com> [033df4a7c1a2ce97ca58113f22cf6b10c893c31d]
+
+ Updated copyright years.
+
+
+2012-08-01 Kohei Yoshida <kohei.yoshida@gmail.com> [f2332196ae741ce54f9cff2fe242beb5b9c50b78]
+
+ Move exception classes into own files.
+
+
+2012-07-31 Kohei Yoshida <kohei.yoshida@gmail.com> [7827df650d34b1e80f5fa26309f2c814ffb1ef33]
+
+ Update copyright years.
+
+
+2012-07-31 Kohei Yoshida <kohei.yoshida@gmail.com> [5a61f56b180f0de3c47da48442600340922a343e]
+
+ Non-inline the destructors of the base interface classes.
+
+
+2012-07-31 Kohei Yoshida <kohei.yoshida@gmail.com> [c46bfba770c82fe54f9bcaebfb92561f1443a9dc]
+
+ Have the client code manage the life cycle of factory.
+
+
+2012-07-31 Kohei Yoshida <kohei.yoshida@gmail.com> [3624ba6f8f9882cea75ebbff97583d22c57741ac]
+
+ Forgot to add this header file.
+
+
+2012-07-31 Kohei Yoshida <kohei.yoshida@gmail.com> [b7101fec89097e82a6114dd3efd4b2645e7fdbc0]
+
+ Add script file for creating a source package.
+
+
+2012-07-31 Kohei Yoshida <kohei.yoshida@gmail.com> [b6f7fb28372eecec45de7c398ce6db362ef9d160]
+
+ Put the pre-build scripts in own subdirectory.
+
+ Parallel build seems to run more reliably with this scheme.
+
+2012-07-31 Kohei Yoshida <kohei.yoshida@gmail.com> [f72f412b0aba74ac41c95bd9918835a48c299b9e]
+
+ Add a VERSION file, which will be used by a package script.
+
+
+2012-07-31 Kohei Yoshida <kohei.yoshida@gmail.com> [426ea0ebc40f327f2d8e0bfdb015b4cd9d6e48aa]
+
+ Limit symbol visibility of shared objects.
+
+
+2012-07-31 Kohei Yoshida <kohei.yoshida@gmail.com> [b0fb169cee60b23bdfa4355725f299c087a08bf5]
+
+ A bit more re-organization.
+
+
+2012-07-31 Kohei Yoshida <kohei.yoshida@gmail.com> [b2fefd067cbfc054144edb1dc65dc2ad5958f935]
+
+ Unindent test code.
+
+
+2012-07-31 Kohei Yoshida <kohei.yoshida@gmail.com> [909654a29e8e85b3e00ae4884425675502f61cd1]
+
+ Add --enable-symbols configure option.
+
+
+2012-07-31 Kohei Yoshida <kohei.yoshida@gmail.com> [b4574d1e43afc4248a6120ecf55799c2ee969723]
+
+ Config option for whether to build the model implementation.
+
+ When this is disabled, orcus won't have link dependency on ixion.
+
+2012-07-30 Kohei Yoshida <kohei.yoshida@gmail.com> [3e0dc6b730f74bb73c7e98bf341ef9632b0b2ec4]
+
+ Split the ixion and libzip dependencies.
+
+
+2012-07-30 Kohei Yoshida <kohei.yoshida@gmail.com> [c3c4c955f75707f02cdafb53182d75a381907f7f]
+
+ Removed dependency on C++11.
+
+ I think we are a bit too early on requiring C++11.
+
+2012-07-30 Kohei Yoshida <kohei.yoshida@gmail.com> [04af44bf2866ce440b8caf73690638e7f863728b]
+
+ Renamed global.hpp -> types.hpp
+
+
+2012-07-30 Kohei Yoshida <kohei.yoshida@gmail.com> [2253a734f7963d1aa51f5e3791dc5232c8ce5f53]
+
+ Remove global dependency on ixion.
+
+
+2012-07-30 Kohei Yoshida <kohei.yoshida@gmail.com> [c2a6d5c626b401fd15259fbb8bcf8de47b962d7c]
+
+ Separated the orcus document model implementation from liborcus.
+
+
+2012-07-23 Kohei Yoshida <kohei.yoshida@gmail.com> [b0eea99a178f09d9b998ef2f9d187c09adf52faf]
+
+ Add skeleton for csv file load testing framework.
+
+
+2012-07-23 Markus Mohrhard <markus.mohrhard@googlemail.com> [018b079252a9b290eaa7a5ce85d9517ec6e884a9]
+
+ Don't trim whitespaces in csv parser if not requested.
+
+ Signed-off-by: Kohei Yoshida <kohei.yoshida@gmail.com>
+
+2012-05-22 Kohei Yoshida <kohei.yoshida@gmail.com> [8b300d7e6ed77832df4f60139d984326a2f16980]
+
+ Disabled debug statement.
+
+
+2012-05-14 Kohei Yoshida <kohei.yoshida@gmail.com> [ea8c4157cf6bd089522e3fc393a400aa3a9074d7]
+
+ Append sheet container to ixion::model_context at start of each sheet.
+
+
+2012-05-13 Kohei Yoshida <kohei.yoshida@gmail.com> [d30398fb842c908e31e83b8d69db347e0051ff80]
+
+ Use ixion::model_context for shared formula token storage.
+
+
+2012-05-13 Kohei Yoshida <kohei.yoshida@gmail.com> [b1f4b0cf972889d10cad6ad697b82fafdebef392]
+
+ Regular formula tokens are now stored in ixion::model_context.
+
+
+2012-05-12 Kohei Yoshida <kohei.yoshida@gmail.com> [729268e3d8cbbad7fe23cf2c0081b0b3e0adcdce]
+
+ I don't need this file either.
+
+
+2012-05-12 Kohei Yoshida <kohei.yoshida@gmail.com> [fd4b39c7a6602914f3e224458f2c1e1c26e4c6be]
+
+ Shell script wrappers for orcus-*.
+
+ Useful during development.
+
+2012-05-12 Kohei Yoshida <kohei.yoshida@gmail.com> [1053af7c54a2f8e6322ea6ec04bbba4ff97e5587]
+
+ Build without libxml-devel installed.
+
+
+2012-05-12 Kohei Yoshida <kohei.yoshida@gmail.com> [8469682e7d8ac878370363b926f937c818cc9c60]
+
+ Disable these once again.
+
+
+2012-05-12 Kohei Yoshida <kohei.yoshida@gmail.com> [3f16368dd483eee72416beafb244180585129ea1]
+
+ Store shared strings to ixion::model_context.
+
+
+2012-05-12 Kohei Yoshida <kohei.yoshida@gmail.com> [ab05976286b57291a32c5c3cc81691f791bdb7d9]
+
+ Re-implemented sheet::dump_html().
+
+
+2012-05-12 Kohei Yoshida <kohei.yoshida@gmail.com> [5517eec9ed4ddda6a4df22d1f07ebe5d63a18942]
+
+ Removed unused methods.
+
+
+2012-05-12 Kohei Yoshida <kohei.yoshida@gmail.com> [e3fa82276c794d79eb308b32e81ae1d7291cf5de]
+
+ I don't need formula_context here any more.
+
+ I use ixion::model_context implementation directly.
+
+2012-05-12 Kohei Yoshida <kohei.yoshida@gmail.com> [4676e9d105f3474e491b300083a3fd41d5bee587]
+
+ Dump the formula cells too.
+
+
+2012-05-12 Kohei Yoshida <kohei.yoshida@gmail.com> [a69e397ee5b802225f9d15c393c71e20ab9fb398]
+
+ Dump sheet content, except for the formula cells.
+
+
+2012-05-12 Kohei Yoshida <kohei.yoshida@gmail.com> [7f6a8e7c0412f30a8bc75760fbf6c4ac6cf7a829]
+
+ Slowly working toward re-implementing sheet::dump().
+
+
+2012-05-12 Kohei Yoshida <kohei.yoshida@gmail.com> [73c8da0c5ddec2a3118458f8eb08c17da67bf517]
+
+ Managed to get it to compile.
+
+
+2012-05-12 Kohei Yoshida <kohei.yoshida@gmail.com> [cefc74d6eb566b379a17d209f72eeab6ff302ba5]
+
+ Started cleaning up the old ixion constructs.
+
+
+2012-05-12 Kohei Yoshida <kohei.yoshida@gmail.com> [f317250751802228694375e745b2dd4cffd7cbde]
+
+ I don't need these slickedit project files.
+
+ All slickedit project files are now under the slickedit directory.
+
+2012-04-16 Eike Rathke <erack@redhat.com> [953d65d4df1f15404b65793aded0417fb1ca4045]
+
+ fix orcus to not fiddle with literal strings
+
+
+2012-04-16 Kohei Yoshida <kohei.yoshida@gmail.com> [ebf6cfe21625117944eebcfb89e2320ad6c3e938]
+
+ csv parser: by default, we shouldn't trim cell values.
+
+
+2012-04-04 Kohei Yoshida <kohei.yoshida@gmail.com> [310cad3e3568ddf5e57c331f381349fa709bed5b]
+
+ Check mdds header usability & in some environments lib64 is used.
+
+
+2012-04-04 Kohei Yoshida <kohei.yoshida@gmail.com> [73d5fdee9d4fa1d1f76ab47f97277bec7bf8b0f1]
+
+ Moved slickedit workspace files.
+
+
+2012-04-04 Kohei Yoshida <kohei.yoshida@gmail.com> [49dd40c4c399236c343c5daac7bead24818c1115]
+
+ Makefiles for headers.
+
+
+2012-04-04 Kohei Yoshida <kohei.yoshida@gmail.com> [ec1954eb7edbd8e9737f553f3820c79c253d0681]
+
+ make clean to remove pre-build-script-generated files.
+
+
+2012-04-04 Kohei Yoshida <kohei.yoshida@gmail.com> [74b9ac44144862b35997131f4022e0f4a79bbe68]
+
+ Converted to automake based build system.
+
+
+2012-03-10 Kohei Yoshida <kohei.yoshida@gmail.com> [42a01082dfd3438e5aa21979dcccd2fa6dc5221e]
+
+ Get orcus to compile again using the latest ixion.
+
+
+2011-11-10 Kohei Yoshida <kohei.yoshida@suse.com> [419e6c00d00ea45de493f58e3d309290e006d73e]
+
+ Renamed namespace interface to iface.
+
+ 'interface' is a keyword with MSVC++ compiler.
+
+2011-11-10 Kohei Yoshida <kohei.yoshida@suse.com> [a987af05a00a292ca647729cb0ae3c300bdf9917]
+
+ ixion-0.4 to libixion-0.4.
+
+
+2011-10-19 Kohei Yoshida <kohei.yoshida@suse.com> [47cc2b2f034604d7f70ee3e5823505a6ff3ebd54]
+
+ More cleanup, added triple literal quote cell.
+
+
+2011-10-19 Kohei Yoshida <kohei.yoshida@suse.com> [2ce52716404fff69bd9ff5ee680892ee6d6602d7]
+
+ Cleaned up a bit.
+
+
+2011-10-19 Kohei Yoshida <kohei.yoshida@suse.com> [f64ba871a18e8094d3340254b80a4f83071125b2]
+
+ Now the csv parser handles double quotes correctly.
+
+
+2011-10-19 Kohei Yoshida <kohei.yoshida@suse.com> [3c47bfed17ea5b03cfc6de7c0682b9e08b479fde]
+
+ More debugging. Something is not quite working.
+
+
+2011-10-19 Kohei Yoshida <kohei.yoshida@suse.com> [b824dcbd3396801e332627374f6ef3f41c298e8e]
+
+ Forgot to use endl.
+
+
+2011-10-19 Kohei Yoshida <kohei.yoshida@suse.com> [d48bca0be96983055c9a59798589846d5b862c1a]
+
+ Resizing std::string invalidates pointer to the old char array.
+
+ We need to obtain a new pointer to the char array after resizing.
+
+2011-10-19 Kohei Yoshida <kohei.yoshida@suse.com> [b9ec7175b2b2bc0e73c8b42d2d0a872da3c29a20]
+
+ Initial work on supporting temp cell buffer for literal quotes.
+
+ It's still work in progress; it doesn't do what it's expected to do.
+
+2011-10-13 Kohei Yoshida <kohei.yoshida@suse.com> [4630620b27a05ac5d182b5bd2a7f3a2ba8dcdd15]
+
+ Added CSV RFC as a reference.
+
+
+2011-10-09 Kohei Yoshida <kohei.yoshida@suse.com> [0a704a313a1f370dd529d7186c6557bd44d18d7f]
+
+ Print formula cells correctly when dumping to html output.
+
+ This is a copy and paste from the dump to stdout code. Clean this
+ up later.
+
+2011-10-09 Kohei Yoshida <kohei.yoshida@suse.com> [8a9d8fe7011ebb879b0684eeb1f5fa822d2cb6cd]
+
+ No debug statement for csv_parser.
+
+
+2011-10-09 Kohei Yoshida <kohei.yoshida@suse.com> [c2150293577920a3560c7fc6bce672dac5d15c94]
+
+ Dump to html output once again.
+
+
+2011-10-06 Kohei Yoshida <kohei.yoshida@suse.com> [713505e2c0429740096a91c32d69a80fbaa2b59d]
+
+ Mark value cells as such when dumping to stdout (to make debugging easier).
+
+
+2011-10-06 Kohei Yoshida <kohei.yoshida@suse.com> [71f219fdd3de3258ecbced6fd26c2844b8e71dbe]
+
+ Fixing out-of-range assignment of values to matrix.
+
+
+2011-10-05 Kohei Yoshida <kohei.yoshida@suse.com> [635e6e082682ac2d933bf22ff96b2f21fff84f45]
+
+ Don't forget to pass the context pointer to the resolver.
+
+ Or else the sheet parsing will fail.
+
+2011-10-05 Kohei Yoshida <kohei.yoshida@suse.com> [b3246feeed4f13d193d175c5ce434030b1716471]
+
+ Implemented interface methods in formula_context for handling sheet names.
+
+
+2011-09-27 Kohei Yoshida <kohei.yoshida@suse.com> [0daa348ba7e938b9df92c72c0da7e86b1c39ac5c]
+
+ Handle shared formula cells correctly during the dump.
+
+
+2011-09-27 Kohei Yoshida <kohei.yoshida@suse.com> [5413b47d7b1e38e62535d10c43ff37bf418a9ef6]
+
+ Make use of the passed shared index number.
+
+
+2011-09-27 Kohei Yoshida <kohei.yoshida@suse.com> [9e6217cef5f335bfb92b1ed9fb384a05875f0d7a]
+
+ Store slave shared formula cells.
+
+
+2011-09-27 Kohei Yoshida <kohei.yoshida@suse.com> [60dc6cf138bee6c0c455cfa02394ed40fbd0389e]
+
+ Parse and store master shared formula cells.
+
+
+2011-09-27 Kohei Yoshida <kohei.yoshida@suse.com> [773c077ea0920a17d78d3eb270871077c8c08abb]
+
+ Pass shared formula range.
+
+
+2011-09-27 Kohei Yoshida <kohei.yoshida@suse.com> [cd9cbf75c74c92e3f094954edf2b5e2424efbfa0]
+
+ Initial work on storing shared formulas.
+
+
+2011-09-26 Kohei Yoshida <kohei.yoshida@suse.com> [6bbebaca2db0eb665a9a1d657098b8d352ce18ab]
+
+ New test document for importing shared formulas.
+
+
+2011-09-26 Kohei Yoshida <kohei.yoshida@suse.com> [9603371e90defacc1c22e22a9a6281b3b5988e1e]
+
+ Added more non-shared formulas.
+
+
+2011-09-26 Kohei Yoshida <kohei.yoshida@suse.com> [8bf07a9d8e95df24c4bc75de7f55cdae96d0fbd7]
+
+ Show what named expression is being passed in the error message.
+
+
+2011-09-25 Kohei Yoshida <kohei.yoshida@suse.com> [10be9e965fd73d681bce1ea372c906195a39ce07]
+
+ Properly implemented get_range_value() in formula_context.
+
+
+2011-09-25 Kohei Yoshida <kohei.yoshida@suse.com> [b5aef4e091d29b820c13aaf466377a95e198e2b4]
+
+ Properly implemented cells_in_range and its const sibling.
+
+
+2011-09-25 Kohei Yoshida <kohei.yoshida@suse.com> [043c4a489dd374fc73bb6c7c6fab668edd020d2c]
+
+ Extracted a common code block into a method.
+
+
+2011-09-25 Kohei Yoshida <kohei.yoshida@suse.com> [6b2120ff04cdb7fcf6fc32e3182286f759ee6977]
+
+ Dump the formula results if available.
+
+ The formula results should be available when called after calc_formulas()
+ is called.
+
+2011-09-25 Kohei Yoshida <kohei.yoshida@suse.com> [baa371e8e6bf05567fd4875244081821351c81e4]
+
+ Properly implemented get_cell_name in formula_context.
+
+ Now document::calc_formulas() completes without throwing exceptions.
+
+2011-09-25 Kohei Yoshida <kohei.yoshida@suse.com> [26620589ec2332d95036ea100763124fec161a98]
+
+ Properly implemented get_cell() methods in formula_context.
+
+
+2011-09-25 Kohei Yoshida <kohei.yoshida@suse.com> [80b88c06634cb4935dd75c03b81f4e10d2afc9df]
+
+ Properly implemented get_cell_position().
+
+
+2011-09-25 Kohei Yoshida <kohei.yoshida@suse.com> [44015989da9e3d546dcc3b7f61e09ac8cc5ddbea]
+
+ Throw an exception on unimplemented context methods.
+
+
+2011-09-25 Kohei Yoshida <kohei.yoshida@suse.com> [d4888a5492e7f25e125585279b03a63f647cd1c6]
+
+ Properly implemented get_formula_tokens() for the context.
+
+
+2011-09-25 Kohei Yoshida <kohei.yoshida@suse.com> [a6e20a991aed6805d120ebae8f019910caf78a13]
+
+ Updated interface for formula_context.
+
+
+2011-09-24 Kohei Yoshida <kohei.yoshida@suse.com> [4d0945a1fd761cacc892cc60c52c97dc8c82701f]
+
+ Collect all formula cells during import and calculate them all at the end.
+
+
+2011-09-23 Kohei Yoshida <kohei.yoshida@suse.com> [347012e0a56776f367140ef98b919bed67f33bba]
+
+ Oops. abs_address_t ctor takes, sheet, row and column in this order.
+
+ I got the order wrong.
+
+2011-09-22 Kohei Yoshida <kohei.yoshida@suse.com> [95cb799248ea486937f638167fbf31a1b2bfdc4e]
+
+ Started working on doing full calculation of formula cells at the end of the import.
+
+
+2011-09-22 Kohei Yoshida <kohei.yoshida@suse.com> [f4550b39dfd95a460fdf9fe37e51613f571dc0d3]
+
+ Store sheet ID with each sheet object.
+
+
+2011-09-21 Kohei Yoshida <kohei.yoshida@suse.com> [be01d3b898773f671aa9e32d0dd87e41e0cf3583]
+
+ Use ixion's cell classes instead of rolling our own.
+
+
+2011-09-21 Kohei Yoshida <kohei.yoshida@suse.com> [1dc6dffb3d3e359c238b82007e39caad174a7a98]
+
+ sheet_type -> rows_type.
+
+
+2011-09-21 Kohei Yoshida <kohei.yoshida@suse.com> [9980cde6494aa14e11aebf538b2edbfd5918a8cd]
+
+ Formula tokens are now stored per sheet in ixion.
+
+
+2011-09-20 Kohei Yoshida <kohei.yoshida@suse.com> [a1a31084a52198767429f5d6cfd99c56f13e2b37]
+
+ Tokenize formula strings using ixion. (Finally!!!)
+
+
+2011-09-20 Kohei Yoshida <kohei.yoshida@suse.com> [d23a18bda1f4fb83a14cfc40afd026c54f9a1d2e]
+
+ Updated formula_context to match the latest interface from ixion.
+
+
+2011-09-20 Kohei Yoshida <kohei.yoshida@suse.com> [f69d27e228fe3b986875b52bd39df676fc63f95d]
+
+ formula_context should be under the model namespace.
+
+
+2011-09-20 Kohei Yoshida <kohei.yoshida@suse.com> [7e3d3240e9f167cb2a7ded02fa4b1cb752f7d9eb]
+
+ Forgot to add this file to the slickedit project.
+
+
+2011-09-17 Kohei Yoshida <kohei.yoshida@suse.com> [baa280b9ea6fd15c38bdb0d1c12b8f2aafdc1f06]
+
+ Forgot to add break.
+
+
+2011-09-17 Kohei Yoshida <kohei.yoshida@suse.com> [f7cd11a2288207fbd70aa1a9a2135bc87d50ec9a]
+
+ Extra check to make sure the ixion headers are usable.
+
+ Also a note about sourcing setenv before running make.
+
+2011-09-13 Kohei Yoshida <kohei.yoshida@suse.com> [98e480faa35c92a6ca45170c1d5ab06573fc7abf]
+
+ Skip whitespace before and after the quoted contents.
+
+
+2011-09-07 Kohei Yoshida <kohei.yoshida@suse.com> [bec5f51672a59d7d20f3cc456f1ac18f8d4bb690]
+
+ Forgot to add ixion-headers project file for slickedit.
+
+
+2011-09-05 Kohei Yoshida <kohei.yoshida@suse.com> [cf8d2e9d224bac05f93551402f402b36c49b57f9]
+
+ Added skeleton for formula_context.
+
+ This is the context instance used in the ixion engine.
+
+2011-09-05 Kohei Yoshida <kohei.yoshida@suse.com> [df0af77f7444c9041701bea52c11193050b86258]
+
+ Initial work on importing formula cells.
+
+ This is being done in parallel with adding useful public functions
+ to ixion.
+
+2011-09-04 Kohei Yoshida <kohei.yoshida@suse.com> [554cd09197c05b7420792c09b814ca73f7d6177d]
+
+ Moved xlsx_workbook_context into its own files.
+
+
+2011-09-04 Kohei Yoshida <kohei.yoshida@suse.com> [b86e5b5fa51f52f64d0090f8c3ec2073a376f0de]
+
+ Move compile-time dependent env variables into setenv.in.
+
+
+2011-09-04 Kohei Yoshida <kohei.yoshida@suse.com> [becb530233ef994182c179b56a484b0f89eeb3b6]
+
+ Some cosmetics.
+
+
+2011-09-03 Kohei Yoshida <kohei.yoshida@suse.com> [10a507f932ed2900a52e1b52141f50ce516883bd]
+
+ Separate xlsx_sheet_context into its own files.
+
+
+2011-09-03 Kohei Yoshida <kohei.yoshida@suse.com> [2d46a09ac3ee25d66de0d7720f5f41216c237c44]
+
+ Very simple document to test formula import.
+
+
+2011-09-03 Kohei Yoshida <kohei.yoshida@suse.com> [4207e1b310a519ff1d380ec26ab1e89bdd6eadbc]
+
+ Prepare for importing formula expressions to the model.
+
+
+2011-09-03 Kohei Yoshida <kohei.yoshida@suse.com> [82d88e2c8fe0315cd2d18d8de482bb692acec7fe]
+
+ Including ostream header is just fine.
+
+
+2011-09-03 Kohei Yoshida <kohei.yoshida@suse.com> [2ccc4e9baf907913994e1342bd99b44e29c23f0f]
+
+ Set LD_RUN_PATH to ensure the executables know where to find libixion.
+
+
+2011-09-03 Kohei Yoshida <kohei.yoshida@suse.com> [342d17a92f00600e12324132f7a7779ef594322b]
+
+ Specify path to ixion library & fixed a build breakage.
+
+
+2011-09-03 Kohei Yoshida <kohei.yoshida@suse.com> [579ef7e378548b836562d50e8c58f2f1adc02fdb]
+
+ Parse formula contents.
+
+
+2011-08-30 Kohei Yoshida <kohei.yoshida@suse.com> [b2193eb16eed17f7b3dc0396ec8a5ac83fa42084]
+
+ New test file to test importing formula expressions.
+
+
+2011-08-28 Kohei Yoshida <kohei.yoshida@suse.com> [af8f5664e80421aec31bfad3a8b2412e4d08208f]
+
+ There is no reason to keep the last context instance.
+
+
+2011-08-28 Kohei Yoshida <kohei.yoshida@suse.com> [a2e9470b8a4521b1c9f3446e4688a16e2e6f42ca]
+
+ Organized test files.
+
+
+2011-08-28 Kohei Yoshida <kohei.yoshida@suse.com> [c29d53c44f4485aa710fd4c014731cdb103e6e97]
+
+ Separated the main function of orcus-xlsx into own file.
+
+
+2011-08-28 Kohei Yoshida <kohei.yoshida@suse.com> [bc55b9274eaa5a85347c914cdda8baa100544ea4]
+
+ No need to increment after parsing of each rule.
+
+
+2011-08-28 Kohei Yoshida <kohei.yoshida@suse.com> [07e2172be4326385abd1d0a0e6f34f51b5d0bf8f]
+
+ Separated the main function of orcus_ods into its own file.
+
+
+2011-08-28 Kohei Yoshida <kohei.yoshida@suse.com> [b0e75826e086aadc18a06ee32425abd93fba3ae6]
+
+ Clean up. Not more output path needed; I dump content from the document.
+
+
+2011-08-27 Kohei Yoshida <kohei.yoshida@suse.com> [321ccfa97d189f46db6e3bb4af6d61e34d80fcfd]
+
+ Clean up.
+
+
+2011-08-27 Kohei Yoshida <kohei.yoshida@suse.com> [575c96675f1b4767f611dc6acfc1f912ac002d56]
+
+ Separated the main part of orcus_csv.
+
+
+2011-08-27 Kohei Yoshida <kohei.yoshida@suse.com> [014826469db2ec83bef78df2585ef614c7451305]
+
+ Conditionally trim cell values before pushing to the handler.
+
+
+2011-08-27 Kohei Yoshida <kohei.yoshida@suse.com> [cb2c1523b56a7d6d83653a59dbd023b968e69090]
+
+ Quoted value must be followed by a delimiter without blanks.
+
+
+2011-08-27 Kohei Yoshida <kohei.yoshida@suse.com> [2aef9ab9e07c8fde3b7b35218fa4e9a843bb38d9]
+
+ Added back the trailing whitespace.
+
+
+2011-08-27 Kohei Yoshida <kohei.yoshida@suse.com> [e038a9edf536799e69bd956c1064076bd57459c5]
+
+ Handle quoted cell contents.
+
+
+2011-08-27 Kohei Yoshida <kyoshida@novell.com> [6ea07e98f972b9058397e6274c89daeee518f93e]
+
+ Handle and import data from csv into document.
+
+
+2011-08-27 Kohei Yoshida <kyoshida@novell.com> [33909d1b078aba5a3a7e5062b7b1d80f766f5d92]
+
+ Dump imported content into ./obj. (For now nothing gets dumped.)
+
+
+2011-08-27 Kohei Yoshida <kyoshida@novell.com> [9e5f3ed3c4207833d3afb1b3c19fb79155ae0854]
+
+ options -> config
+
+
+2011-08-27 Kohei Yoshida <kyoshida@novell.com> [b0bde99dd7e953624a1f6cb386c10f5a852a77a5]
+
+ More on parsing CSV stream.
+
+
+2011-08-21 Kohei Yoshida <kohei.yoshida@suse.com> [9a4dd833e83a8679d9ec0ff5e6617b3d0be03fae]
+
+ I don't use boost::thread in orcus (yet).
+
+
+2011-08-21 Kohei Yoshida <kohei.yoshida@suse.com> [e94d4413dbbe990e3c1b439ba23efd03ee4178e6]
+
+ Pass document instance to the CSV parser.
+
+
+2011-08-21 Kohei Yoshida <kohei.yoshida@suse.com> [13661736290db29ff88555338ba8eec61f82df5a]
+
+ Use interface::<class> instead of <class>_base naming conventions.
+
+
+2011-08-21 Kohei Yoshida <kohei.yoshida@suse.com> [9ec28b05b6bdd6f12b0a7da5c371ac4702fbded5]
+
+ Pass CSV options to the parser.
+
+
+2011-08-21 Kohei Yoshida <kohei.yoshida@suse.com> [91378c5610f84c737ea83975b394f69d9e9809b4]
+
+ CSV, not CSS.
+
+
+2011-08-21 Kohei Yoshida <kohei.yoshida@suse.com> [4d39588b3f53e6f8afde23c5e93153aef969202b]
+
+ Simple test case.
+
+
+2011-08-21 Kohei Yoshida <kohei.yoshida@suse.com> [36e2fb3fe68e8892605ad9df670bcea0f18e6d27]
+
+ Set it up to start working on CSV parser implementation.
+
+
+2011-08-21 Kohei Yoshida <kohei.yoshida@suse.com> [e1be28cd18a852c246687432233b15946cfa92ec]
+
+ ODF to ODS where appropriate.
+
+
+2011-08-21 Kohei Yoshida <kohei.yoshida@suse.com> [755b3a8d86a0c13fc7fae815250e03ebaef0afc6]
+
+ Separated orcus_ods declaration into its own header.
+
+
+2011-08-21 Kohei Yoshida <kohei.yoshida@suse.com> [820bf389ae4243b2f9ee2ea8bce7bb066de8cf55]
+
+ Prefer forward declaration over including header.
+
+
+2011-08-21 Kohei Yoshida <kohei.yoshida@suse.com> [3335f7680237a17046f293f8ee9c491d84ddf959]
+
+ Separated orcus_xlsx declaration into its own header.
+
+
+2011-08-21 Kohei Yoshida <kohei.yoshida@suse.com> [9d2551a9848a11fca65cfb1f6f8745105d1173f5]
+
+ Added autogen.sh script.
+
+
+2011-08-19 Kohei Yoshida <kohei.yoshida@suse.com> [182c2a0461279a530ca3b5b699872477534ed330]
+
+ Now, remove the dependency on libgsf for real.
+
+
+2011-08-19 Kohei Yoshida <kohei.yoshida@suse.com> [51eb85b04fda13a7785ec68236dac8175d1fa5b8]
+
+ Remove the unused code.
+
+
+2011-08-19 Kohei Yoshida <kohei.yoshida@suse.com> [107d6f16d6cddd7951835bd018579be1949a76f2]
+
+ Read the rest of the streams I previously read.
+
+
+2011-08-19 Kohei Yoshida <kohei.yoshida@suse.com> [2134ec6ebc570113584e680f50a0d1fc23b88ce8]
+
+ Method for reading zipped stream from archive.
+
+
+2011-08-19 Kohei Yoshida <kohei.yoshida@suse.com> [c2e6e6f75ef52266cf6b68e6e550bf966e179676]
+
+ Converted more code to using libzip.
+
+
+2011-08-18 Kohei Yoshida <kohei.yoshida@suse.com> [646c01f202232857cb937236bbf2bc48e535bd46]
+
+ Read relation files.
+
+
+2011-08-18 Kohei Yoshida <kohei.yoshida@suse.com> [b8c5a2eb3037ed25db91160b9f5a0d971b055c1b]
+
+ Started migrating orcus_xlsx to using libzip instead of libgsf.
+
+
+2011-08-18 Kohei Yoshida <kohei.yoshida@suse.com> [2b88fdbd4b15e0ff6881967fe24ca7083b35892b]
+
+ Let's not use mmap.
+
+
+2011-08-14 Kohei Yoshida <kyoshida@novell.com> [e53d60339a8ad4b570f4141209aa2be8dfb02f87]
+
+ Let's use uint8_t array instead of char array for xml buffer.
+
+
+2011-08-14 Kohei Yoshida <kyoshida@novell.com> [65a612c676d0e4550d7e291c3c2376b9dad8a841]
+
+ Removed calls to libgsf from orcus-ods.
+
+
+2011-08-14 Kohei Yoshida <kyoshida@novell.com> [5ad2495c66af7a372df814aeb3cc9711de85b309]
+
+ Added configure.ac script, to use autoconf.
+
+
+2011-08-14 Kohei Yoshida <kohei.yoshida@suse.com> [9703404892b9d42e3bb1fafc88bce9d021103c3d]
+
+ Better in-line comments about syntax rules.
+
+
+2011-08-14 Kohei Yoshida <kyoshida@novell.com> [3a19b75532d210843d844615b48c8182ed8ec9c9]
+
+ Test code to read zip archives using libzip instead of libgsf.
+
+
+2011-08-02 Kohei Yoshida <kyoshida@novell.com> [3c8f25299b0f78583818760ee57f7f581d9159b6]
+
+ I don't need to append an extra char for the CSS parser.
+
+
+2011-08-02 Kohei Yoshida <kyoshida@novell.com> [2f0996dfda981f70d71249dc6c5238a264ad0418]
+
+ Differentiate the element and class names in a selector.
+
+
+2011-08-02 Kohei Yoshida <kyoshida@novell.com> [c126c518437f290b3678d878d84765e063a77b09]
+
+ Separate handler for at-rule names.
+
+
+2011-08-02 Kohei Yoshida <kyoshida@novell.com> [fbce4ad01614985d585f5aa6226e42e0966fc662]
+
+ Differentiate at-rule names from regular selector names.
+
+
+2011-08-02 Kohei Yoshida <kyoshida@novell.com> [ff32fb60fe5434e00547cc4bd9561d317bab4d1c]
+
+ Extracted method for parsing identifiers.
+
+
+2011-08-02 Kohei Yoshida <kyoshida@novell.com> [c44ac37931e03a8f459c3122d153a267b94f2f1a]
+
+ Properties -> block, and detect at-rule names.
+
+
+2011-08-02 Kohei Yoshida <kyoshida@novell.com> [d710fcaebe4cdc1be69ce2a75c41389b580067f1]
+
+ Correct terminology per CSS spec.
+
+
+2011-08-02 Kohei Yoshida <kyoshida@novell.com> [9a53442dec2aa7538a16728502411e1850c3204a]
+
+ Provide callbacks for the begin / end of each property item.
+
+
+2011-08-02 Kohei Yoshida <kyoshida@novell.com> [d39606371e42401771cbe4f79ad22028b177436e]
+
+ Separate property names from class names.
+
+
+2011-08-02 Kohei Yoshida <kyoshida@novell.com> [669ab00231b0ef3302030c28cad3984b5a885cd7]
+
+ Real world example CSS content from Excel-generated html.
+
+
+2011-08-02 Kohei Yoshida <kyoshida@novell.com> [66f56f403d38abf076fa582898f4a396a01e5e79]
+
+classname is apparently a valid name. Print multiple values on the same line.
+
+
+2011-08-02 Kohei Yoshida <kyoshida@novell.com> [3bee3c8ab46389efdfb9e532b80f00a8159af225]
+
+ Call handler's methods for callbacks.
+
+
+2011-08-02 Kohei Yoshida <kyoshida@novell.com> [714963a5895d87848cb4f83dbacb298ce42e56d7]
+
+ Safeguard against unclosed quoted values.
+
+
+2011-08-02 Kohei Yoshida <kyoshida@novell.com> [5b7679534a93aa18505c21658d758850937b60e5]
+
+ More on CSS parser. Now the test file gets parsed correctly.
+
+
+2011-08-02 Kohei Yoshida <kyoshida@novell.com> [722298a91207adfcc95727d8d99666f18154cea0]
+
+ More on CSS parser.
+
+
+2011-08-02 Kohei Yoshida <kyoshida@novell.com> [a2ea1c2fbef73aa87f4092998c9fd83368324acd]
+
+ More on CSS parser implementation.
+
+
+2011-08-02 Kohei Yoshida <kyoshida@novell.com> [a57b56b310b5b7f802cbf5c21ff04eedbc46e9c1]
+
+ Extracted methods to share common blocks.
+
+
+2011-08-02 Kohei Yoshida <kyoshida@novell.com> [a1a07e5b84814c649f0fd441dffce1a5f62080eb]
+
+ Load file content and start parsing CSS stream.
+
+ Skip any leading and trailing blanks and comment braces if any.
+
+2011-08-01 Kohei Yoshida <kyoshida@novell.com> [6fd6cf3100a2a543425e4006447fd3e0230b521d]
+
+ Don't forget the test CSS file.
+
+
+2011-08-01 Kohei Yoshida <kyoshida@novell.com> [b8567dbb411831685572bddbdc122df674e0112f]
+
+ Added skeleton for implementing CSS parser.
+
+
+2011-02-01 Kohei Yoshida <kyoshida@novell.com> [10c959f9f36117e004e4e51423af084d10ce2b85]
+
+ Assume that we may get more than one paragraph segments even for the unformatted.
+
+
+2011-02-01 Kohei Yoshida <kyoshida@novell.com> [415d69316f341dd3cb1195dcb118874e9c9cf45a]
+
+ Disable dumping of contents.
+
+
+2011-01-28 Kohei Yoshida <kyoshida@novell.com> [1e1df9710853ee04bf2a6f75ead8136d8839aff6]
+
+ Added a new sheet to import formula cells.
+
+
+2011-01-28 Kohei Yoshida <kyoshida@novell.com> [e2ec65cbd4d717d0092c8c47d1128e36b99f2911]
+
+ Finally process RGB colors for fill attributes correctly.
+
+
+2011-01-28 Kohei Yoshida <kyoshida@novell.com> [f71b077551471fe92ebffbf4d40feef2b5754006]
+
+ Pick up fill colors and apply them to html output.
+
+ The colors are still hard-coded. I still need to convert RGB text
+ into values properly.
+
+2011-01-28 Kohei Yoshida <kyoshida@novell.com> [854a79ec125349b65d068de5a26a7bae784e6a34]
+
+ A little cleanup & append style text instead of replacing it.
+
+
+2011-01-28 Kohei Yoshida <kyoshida@novell.com> [0afb5192ae486879f001cf27614ecaf5a634e780]
+
+ Finally apply correct font attributes to cells.
+
+
+2011-01-28 Kohei Yoshida <kyoshida@novell.com> [4ae7f921d520e51a7dad752fdf4155edec05fc4c]
+
+ Apply cell formats. Turn the text green for now.
+
+
+2011-01-28 Kohei Yoshida <kyoshida@novell.com> [db692b0bfafcfcd92f02316802ab532c54525e9c]
+
+ I need to use sorted map to store cell values.
+
+
+2011-01-27 Kohei Yoshida <kyoshida@novell.com> [23292982092d035c65a95b509029b45c69883dd2]
+
+ Store the cell formats with the sheet object for real.
+
+
+2011-01-27 Kohei Yoshida <kyoshida@novell.com> [c0095f3168c85acdf4ffe25a70e9178596d49dd8]
+
+ Added printer settings schema type, though I don't handle this yet.
+
+ Also, changed the way how the directory is unwinded, to support
+ moving up directories via "..".
+
+2011-01-27 Kohei Yoshida <kyoshida@novell.com> [ff521f59b251bf6a1cd0fa4326262760d3cc2f8c]
+
+ Generalize the check for .rels parts, and read the .rels parts associated with the sheet parts.
+
+
+2011-01-27 Kohei Yoshida <kyoshida@novell.com> [1bb37d54067a6699d2266542030841fe0d6bcc8a]
+
+ The client code should manage the factory object life time, not the filter code.
+
+
+2011-01-27 Kohei Yoshida <kyoshida@novell.com> [2187c37d61a15ccd5a3778adeaf1a28e3c24934c]
+
+ Removed unused output file path.
+
+
+2011-01-27 Kohei Yoshida <kyoshida@novell.com> [b93db69555af831a210bb6723cffd8e85729e640]
+
+ Pick up cell format (xf) index from the c element.
+
+
+2011-01-27 Kohei Yoshida <kyoshida@novell.com> [1e7d26fbd9649a8ffe34ec1ff573ce2fc371f140]
+
+ Renamed xlsx_sheet_xml_context to xlsx_sheet_context.
+
+ We all know that this code is for XML, so let's just skip that in
+ the name.
+
+2011-01-27 Kohei Yoshida <kyoshida@novell.com> [ac2985af65925619c747fad03eff8e00fddcc83b]
+
+ Added set_format to sheet & removed unused methods.
+
+
+2011-01-27 Kohei Yoshida <kyoshida@novell.com> [47b2bc1a61d1adbbb7acb5680783fc1ed7c05611]
+
+ More annotations.
+
+
+2011-01-27 Kohei Yoshida <kyoshida@novell.com> [f67f9741931e79279ec2b2347646d8fbc2e67c14]
+
+ Some annotations.
+
+
+2011-01-27 Kohei Yoshida <kyoshida@novell.com> [ae79af2c762d612a845b82248a839ee1c022c115]
+
+ Let's not separate the API for cell format storage.
+
+
+2011-01-27 Kohei Yoshida <kyoshida@novell.com> [6ab9bf473c50b10ed2d9f07f5770b5e3b750dad0]
+
+ More on parsing cell format attributes.
+
+
+2011-01-27 Kohei Yoshida <kyoshida@novell.com> [e633ae180197d064dba666b5dad89d8a6637ce93]
+
+ More on parsing cell styles and formats.
+
+
+2011-01-27 Kohei Yoshida <kyoshida@novell.com> [1a124835190ea74ef4643f1402a767f57d1f4694]
+
+ Use default ctor to reset member values.
+
+
+2011-01-27 Kohei Yoshida <kyoshida@novell.com> [194c1a0d0cdd0c6ddf12a1ba6ab5737d65cf684e]
+
+ Added skeleton methods for picking up cell format records.
+
+
+2011-01-27 Kohei Yoshida <kyoshida@novell.com> [505f657cf13b21baf273f1a8c2e77155b63d3f3b]
+
+ Parse extra elements in styles.xml.
+
+
+2011-01-27 Kohei Yoshida <kyoshida@novell.com> [39410d5652d903d953045f6786a33fc296a2dcca]
+
+ Forgot to commit the borders.
+
+
+2011-01-27 Kohei Yoshida <kyoshida@novell.com> [fd90a7c74d8cef314afd3c052c95375a841c326f]
+
+ Pick up and store border styles.
+
+
+2011-01-27 Kohei Yoshida <kyoshida@novell.com> [1ccc5b4839047e742b3a9baf8b09c43cbf2ddbd1]
+
+ Cleanup
+
+
+2011-01-27 Kohei Yoshida <kyoshida@novell.com> [066f03cfe7e379ed5cbea680633470e7fd29ce81]
+
+ Pick up and store fill pattern attributes.
+
+
+2011-01-27 Kohei Yoshida <kyoshida@novell.com> [fce901db6cb75c038b8ca0e3fcd933fbdd55bd62]
+
+ Fixed a build breakage.
+
+
+2011-01-27 Kohei Yoshida <kyoshida@novell.com> [988d1837f9a77a7cad2e9226d131cdcdb5e06872]
+
+ Store the font attributes for real.
+
+
+2011-01-27 Kohei Yoshida <kyoshida@novell.com> [3b26cd3888dd129e4a9a8e4e42207484c48d5af9]
+
+ Pick up more font attributes for the styles.
+
+
+2011-01-27 Kohei Yoshida <kyoshida@novell.com> [cc59506a47a2c79549f4ce2e0ceb56dd11d8bba9]
+
+ Pass the styles object to the styles context.
+
+
+2011-01-27 Kohei Yoshida <kyoshida@novell.com> [d99da7ab941805a13d02effce7316515763f8a59]
+
+ Let the document instance manage the styles container.
+
+
+2011-01-27 Kohei Yoshida <kyoshida@novell.com> [1ce36920743ab3377e6c820cd7b4120e66db5295]
+
+ More on parsing the styles.xml part. Also added styles storage impl skeleton.
+
+
+2011-01-27 Kohei Yoshida <kyoshida@novell.com> [224330602e29d69960fdc709c736f4593e6d57eb]
+
+ Wrong template declaration.
+
+
+2011-01-27 Kohei Yoshida <kyoshida@novell.com> [0e55197c04e352c65721f1438567dcfb903ac0a9]
+
+ Moved useful func object to ooxml/global.
+
+
+2011-01-26 Kohei Yoshida <kyoshida@novell.com> [d2d76f0a447e0d9c2c5f609cb43f48a165b607d3]
+
+ Initial skeleton for parsing xl/styles.xml part.
+
+
+2011-01-26 Kohei Yoshida <kyoshida@novell.com> [739c744b0a935387d8329a6970859bb58f550606]
+
+ Removed commented line.
+
+
+2011-01-26 Kohei Yoshida <kyoshida@novell.com> [89ae412851f8d48e2c49f1c8e5c8984a2fee1501]
+
+ Removed debug code.
+
+
+2011-01-26 Kohei Yoshida <kyoshida@novell.com> [5c33d35c3376f1961706fd80f04dee860b1aa914]
+
+ Pick up font names too.
+
+
+2011-01-26 Kohei Yoshida <kyoshida@novell.com> [4b0d8ce73bb25ca877449f5286a66d51c15cf1dd]
+
+ Pick up font size.
+
+
+2011-01-26 Kohei Yoshida <kyoshida@novell.com> [c82387587f9319973344a89745078e4d267a3311]
+
+ Let's use <span> element to apply format to text segments.
+
+
+2011-01-26 Kohei Yoshida <kyoshida@novell.com> [ead1100931da2ca7923ab7156ca27dc5bbd01486]
+
+ Dump document content to html files, one per sheet.
+
+
+2011-01-26 Kohei Yoshida <kyoshida@novell.com> [3247fd4399fd092c2bdb390f9e3591e1df07993b]
+
+ New method to retrieve format runs by string IDs.
+
+
+2011-01-26 Kohei Yoshida <kyoshida@novell.com> [0e42a26ffa530e8bb46a26c8779cba3a8a155fad]
+
+ Renamed segment_format to format_run, to be consistent.
+
+
+2011-01-26 Kohei Yoshida <kyoshida@novell.com> [a80e320e1f0e9cbf42f5188957e02b0a643aa2bb]
+
+ Store format runs for the shared strings.
+
+
+2011-01-26 Kohei Yoshida <kyoshida@novell.com> [c2cc1c3ea5edd71df9f5f8c2006370107c096645]
+
+ Intern the sheet name or else it becomes invalid during the dump.
+
+
+2011-01-26 Kohei Yoshida <kyoshida@novell.com> [99fbd8b3b97a52d8abbbdbfc23326444b729917b]
+
+ Use for_each instead of manual looping.
+
+
+2011-01-25 Kohei Yoshida <kyoshida@novell.com> [c3e1569255066d23c794daf9c4ef206eefe99604]
+
+ Initial work on picking up the rich text format properties.
+
+
+2011-01-25 Kohei Yoshida <kyoshida@novell.com> [517e23ebf442ed5dd87c8387f1c7b6a0e042e6f0]
+
+ XML structure check.
+
+
+2011-01-25 Kohei Yoshida <kyoshida@novell.com> [11878cb2d690d741363e72aa092c5609ea29dd0f]
+
+ Hide the libgsf calls inside orcus_foo.
+
+
+2011-01-25 Kohei Yoshida <kyoshida@novell.com> [be628ee20098365fb0168fcf248d6ba2106db904]
+
+ Forgot to dispose of all the interned strings.
+
+
+2011-01-25 Kohei Yoshida <kyoshida@novell.com> [7b0d9f9ede5c45c86c275559eb26cf1610a53004]
+
+ Fixed a bug wrt repeated columns.
+
+
+2011-01-25 Kohei Yoshida <kyoshida@novell.com> [7984ac18f18b838a372ddb75341548ed47c3065b]
+
+ Little cleanup.
+
+
+2011-01-25 Kohei Yoshida <kyoshida@novell.com> [5cfe8b055700f0fcf26a7939e5066f0fd9f10290]
+
+ ods: Handle formatted paragraphs correctly.
+
+
+2011-01-25 Kohei Yoshida <kyoshida@novell.com> [0b3d43eeb88be245573b6941e97404d7a9e855c5]
+
+ Add string to the shared string record inside the para context.
+
+
+2011-01-25 Kohei Yoshida <kyoshida@novell.com> [beadb2fafb6818af32da9058465e7c055dde0f94]
+
+ String index was off by one in error.
+
+
+2011-01-25 Kohei Yoshida <kyoshida@novell.com> [2bb89f2845c8e9d8df3bebddc5e7a3c6790fee18]
+
+ Removed comment that's no longer true.
+
+
+2011-01-25 Kohei Yoshida <kyoshida@novell.com> [75cf0f76612e02ae7e354b60f37c6388dbfe61f4]
+
+ Now orcus-ods builds and runs once again.
+
+ It also uses the shared string facility to share the same API as
+ the xlsx parser counterpart.
+
+2011-01-25 Kohei Yoshida <kyoshida@novell.com> [8bbf99369ae1fc37aa661c336013131d97aa1325]
+
+ Correct mdds path.
+
+
+2011-01-25 Kohei Yoshida <kyoshida@novell.com> [279d999a3ca1401f307b7b7d760aa7c16223f59d]
+
+ Reflected the file name change.
+
+
+2011-01-25 Kohei Yoshida <kyoshida@novell.com> [0fd54941e9ab96cf5b443ca51db832e3bb483289]
+
+ Renamed a bunch of files.
+
+
+2011-01-25 Kohei Yoshida <kyoshida@novell.com> [c328b82bf4f3f9531904f69d7a9e2e358f5e9b21]
+
+ Store factory instance inside orcus_ods.
+
+
+2011-01-25 Kohei Yoshida <kyoshida@novell.com> [31a3471ccb26d7afe02671783b07536217b80e9e]
+
+ Handle format runs in shared string record.
+
+ For now I'll ignore the format attributes. I'll take care of that
+ later.
+
+2011-01-25 Kohei Yoshida <kyoshida@novell.com> [e1130b5721a3a9a1e52023ab99f09a5b7f6927e6]
+
+ Properly format the sheet grid when printing to stdout.
+
+
+2011-01-25 Kohei Yoshida <kyoshida@novell.com> [7cae0f5fb88d6196f91446e9e7a10a86745f6758]
+
+ Print sheet content to stdout.
+
+
+2011-01-25 Kohei Yoshida <kyoshida@novell.com> [b21d85caa3f6bd23e8cbf52784f22e63b4c00d20]
+
+ unary_function template takes return type as the second argument.
+
+
+2011-01-25 Kohei Yoshida <kyoshida@novell.com> [c7a0d2921111ac9d54133fd62f3f367192953949]
+
+ Refactored sheet internal a bit.
+
+
+2011-01-25 Kohei Yoshida <kyoshida@novell.com> [7eae3ade9f293afd5db8e776a8d4d1b7871d37a9]
+
+ Pick up the value cells too.
+
+
+2011-01-25 Kohei Yoshida <kyoshida@novell.com> [6562e28af9b33b6e36251114014600a2eb95a530]
+
+ Parse the sheet xml parts enough to insert string cells.
+
+
+2011-01-24 Kohei Yoshida <kyoshida@novell.com> [c602cc971a34dcc792b84a046a4fc705f858d922]
+
+ Initial work on printing sheet's content to stdout.
+
+
+2011-01-24 Kohei Yoshida <kyoshida@novell.com> [c57d75b036fbcb136b930a53ba0044fd41baa9ef]
+
+ Instantiate sheet objects from the factory & pass sheet name.
+
+
+2011-01-24 Kohei Yoshida <kyoshida@novell.com> [13903b25951e9c0cfb5e0e3fa40aefb3a0484533]
+
+ More on shared strings.
+
+ Two methods of inserting strings: one for appending without checking
+ for a duplicate, and another for checking for a duplicate before
+ each insertion.
+
+2011-01-24 Kohei Yoshida <kyoshida@novell.com> [a14486d76ed754fbd4dcd45b1d26fbd107535f84]
+
+ Embed a document object inside the factory class.
+
+
+2011-01-24 Kohei Yoshida <kyoshida@novell.com> [a51f551af6da6d4d518ae173f0b41994f280c81f]
+
+ Now I can finally remove the dummy sheet name.
+
+
+2011-01-24 Kohei Yoshida <kyoshida@novell.com> [380e851aaf6410d133c61fcde7b37fa5614084d4]
+
+ New files for document concrete implementation.
+
+
+2011-01-24 Kohei Yoshida <kyoshida@novell.com> [0582f3913e0636ab98e876c44712cff859c6087f]
+
+ Class document_base to allow filters to instantiate concrete class objects.
+
+
+2011-01-24 Kohei Yoshida <kyoshida@novell.com> [cc3c41a48a341883a6216fb3cde9d6c3bdf2359e]
+
+ The sheet instance shouldn't store the sheet name.
+
+
+2011-01-24 Kohei Yoshida <kyoshida@novell.com> [7a410e475697cd4a40ad5822ab98eb50e6ff08e1]
+
+ Started working on creating interface classes.
+
+ The idea is to allow external document models to be constructed via
+ polymorphism.
+
+2011-01-24 Kohei Yoshida <kyoshida@novell.com> [a69a13963a50eb23ffa20c4e464ded7a2c576b27]
+
+ Started re-working the ods parser to make use of shared strings.
+
+
+2011-01-24 Kohei Yoshida <kyoshida@novell.com> [b41c29aa4a4d5a802ad7530c727e292d554e4148]
+
+ Pick up and append strings from sharedStrings.xml part to the internal storage.
+
+
+2011-01-24 Kohei Yoshida <kyoshida@novell.com> [8d90f63126e75ec461f7829a8d54c1c0d17c620c]
+
+ The main class now stored document model data members.
+
+ And pass the shared string instance to the ss handler.
+
+2011-01-24 Kohei Yoshida <kyoshida@novell.com> [ae4600235ec726a93e4ef5f1a97b55c6deb9c2be]
+
+ Added new files for shared string storage in the model.
+
+
+2011-01-02 Kohei Yoshida <kyoshida@novell.com> [2d8d32567d2c0b9e006bceaeacfa016586f481ae]
+
+ Let's not print shared string content.
+
+
+2011-01-02 Kohei Yoshida <kyoshida@novell.com> [1887b602a864b5a9868ff4d066ddc39eaa9908ab]
+
+ Some code to create and destroy mmapped buffer.
+
+
+2011-01-01 Kohei Yoshida <kyoshida@novell.com> [2a4c7acf93d473932c068ee2e2fe11fe784fea9e]
+
+ Added new schema type.
+
+
+2011-01-01 Kohei Yoshida <kyoshida@novell.com> [ea95f7198f59c36df75b014e5ab27a1149f9b35f]
+
+ Don't add relationships of unknown types.
+
+
+2011-01-01 Kohei Yoshida <kyoshida@novell.com> [8d690583aacd5e18c74ab5eb93d32630510db044]
+
+ Added .gitignore.
+
+
+2011-01-01 Kohei Yoshida <kyoshida@novell.com> [202a91823a88203ce5c1166542e4fcf960ebcf04]
+
+ Apparently I didn't add the include directory when I renamed it (?)
+
+
+2010-12-30 Kohei Yoshida <kyoshida@novell.com> [bcfc44a9edaeb8bb33b7ffaeb5d39d6a44a138d0]
+
+ Added back the .inl files accidentally removed.
+
+
+2010-12-30 Kohei Yoshida <kyoshida@novell.com> [7e90cf1141687a6e3e0ebb79ebbe0ef0ef4e7676]
+
+ Put all orcus headers into orcus directory.
+
+
+2010-12-30 Kohei Yoshida <kyoshida@novell.com> [f7512a148a8795a7c20790281847ca17b710dca7]
+
+ Renamed inc to include.
+
+
+2010-12-30 Kohei Yoshida <kyoshida@novell.com> [2762f9fdd4d7b2b65ab40c1ec882e55cfd0b533a]
+
+ opc_rel_t::extra -> opc_rel_extra.
+
+
+2010-12-30 Kohei Yoshida <kyoshida@novell.com> [a85551ab8414cb1d0c56ae37ded80c915f9f45f5]
+
+ Let's not store extra relationship data with opc_rel_t struct.
+
+
+2010-12-30 Kohei Yoshida <kyoshida@novell.com> [bfc29b6c07d306e23ce81c6f42b1b75eedb59df2]
+
+ Managed to pass sheet metadata from workbook.xml to worksheets/sheet*.xml parts.
+
+
+2010-12-30 Kohei Yoshida <kyoshida@novell.com> [5655252f48d9fe588adc85d39d03cd49b12f0d08]
+
+ Initial cut on parsing sharedStrings.xml part.
+
+
+2010-12-28 Kohei Yoshida <kyoshida@novell.com> [f9cf94a8394f2cf7f1e54787f556f3aa01e0ed4e]
+
+ Read the sheet xml parts from the workbook.xml.rels.
+
+
+2010-12-28 Kohei Yoshida <kyoshida@novell.com> [74883080dfdf6200c8484423fde0d17c3d45150a]
+
+ Added more schema types and renamed some.
+
+
+2010-12-28 Kohei Yoshida <kyoshida@novell.com> [2262bb48f477d8e327aea4e3f5fd3673caec4179]
+
+ Read the relationship file associated with xl/workbook.xml.
+
+
+2010-12-27 Kohei Yoshida <kyoshida@novell.com> [d088e18b935c6c1a579d61372ee177eca7de549f]
+
+ Pick up sheet info from workbook.xml and print them out to stdout.
+
+
+2010-12-27 Kohei Yoshida <kyoshida@novell.com> [a960eec4e4e7e6e5ac920ff699099cf0b8a1fcac]
+
+ Re-organized a bit for workbool.xml parsing.
+
+ Re-named ooxml/types.hpp to ooxml/ooxml_types.hpp to avoid header
+ naming clash.
+
+2010-12-27 Kohei Yoshida <kyoshida@novell.com> [f69a61e17783912f7a44a17e5ad3cbfea3d5ccea]
+
+ Removed opc_handler.* files as they are no longer used.
+
+
+2010-12-27 Kohei Yoshida <kyoshida@novell.com> [44fb242995e233d02daf7f4341f2698b60d64a59]
+
+ Simple simple xml handler to handle content types.
+
+
+2010-12-27 Kohei Yoshida <kyoshida@novell.com> [a86d5d379c5a3de5fdc212764b6dfdfd6a9affab]
+
+ Use simple xml handler to handle relationship parts.
+
+
+2010-12-27 Kohei Yoshida <kyoshida@novell.com> [9f558990ac6bd03aea6412b9202d83dfaca45f1b]
+
+ Added new xml handler class for simple parsing needs.
+
+
+2010-12-27 Kohei Yoshida <kyoshida@novell.com> [086c647f56c94cce594cf0bfb4961fe6b3d41ab4]
+
+ Renamed xmlfoo.* to xml_foo.*
+
+
+2010-12-27 Kohei Yoshida <kyoshida@novell.com> [404e602fd9285f7f0e144a4acd9122a0d2ad34c3]
+
+ Handler doesn't use tokens.
+
+
+2010-12-27 Kohei Yoshida <kyoshida@novell.com> [7f0c1da2d0c9b8134e8fd1aafb6dcb96c5b2746f]
+
+ Added hook for workbook.xml parser bootstrapping.
+
+
+2010-12-27 Kohei Yoshida <kyoshida@novell.com> [e62d3d08008d54bbd11a378c79cc0ed43b5df302]
+
+ More on using directory stack to manage package paths.
+
+
+2010-12-27 Kohei Yoshida <kyoshida@novell.com> [84a885dc8f38e45f8afc06d8760721857d641d39]
+
+ Counter for each dumped interned string.
+
+
+2010-12-27 Kohei Yoshida <kyoshida@novell.com> [8a93cdfe20a7c01a968d7ea1fab05b4e3bf07631]
+
+ opc_relations_handler now a data member to allow re-use.
+
+
+2010-12-27 Kohei Yoshida <kyoshida@novell.com> [4eab4c6b9b117a2602c4ff9ab59108f8fa1a0cfb]
+
+ parts and ext_defaults are now data members.
+
+
+2010-12-27 Kohei Yoshida <kyoshida@novell.com> [3130b774aafdd59e5eb9ad107a702514c54b3fc7]
+
+ Put all top-level functions into orcus_xlsx class.
+
+
+2010-12-27 Kohei Yoshida <kyoshida@novell.com> [1b3b1f2203a580c5581306c3b957c697b332a85b]
+
+ Add method to dump interned strings for debugging.
+
+
+2010-12-27 Kohei Yoshida <kyoshida@novell.com> [b25fe979573e6de527ff7814ef865149a8b0ca8d]
+
+ Added global files for ooxml, and fixed relationship attribute parsing.
+
+
+2010-12-26 Kohei Yoshida <kyoshida@novell.com> [406fde6c5a284967678eeeb9f024d836e72943cf]
+
+ Pick up relationships from the context.
+
+
+2010-12-26 Kohei Yoshida <kyoshida@novell.com> [c954c9c6ddd53207abc5321b7ae93697099a1139]
+
+ Method comments.
+
+
+2010-12-26 Kohei Yoshida <kyoshida@novell.com> [3ed17fc8c0af7cf57db7770c764cb486e76e20ae]
+
+ Moved some methods into src file.
+
+
+2010-12-26 Kohei Yoshida <kyoshida@novell.com> [26d63f4c9d2e158c30038bbe080e57ca5557ffe1]
+
+ Moved ooxml types into ooxml/types.hpp.
+
+
+2010-12-25 Kohei Yoshida <kyoshida@novell.com> [502db6530f581e6a485e40c408df3ee0fd29fd29]
+
+ Intern part names and extensions to make them persist in memory.
+
+
+2010-12-25 Kohei Yoshida <kyoshida@novell.com> [2f43425094a02f18ce073ed714a0bf73c8cbf4f2]
+
+ More on interning of pstrings.
+
+
+2010-12-25 Kohei Yoshida <kyoshida@novell.com> [9768bd39d03b6db9a67be8ecf30d32442dcb2ff8]
+
+ Add assert statements to the test code.
+
+
+2010-12-25 Kohei Yoshida <kyoshida@novell.com> [22846daeafbb78dceb956e1cdadd977748568f4f]
+
+ Removed unused class.
+
+
+2010-12-25 Kohei Yoshida <kyoshida@novell.com> [cc04470574215b7a57527a935458991db24965ee]
+
+ Fixed pstring test build.
+
+
+2010-12-25 Kohei Yoshida <kyoshida@novell.com> [0b9656ac01cf2114242bc3226fba6869af586dfa]
+
+ More testing...
+
+
+2010-12-25 Kohei Yoshida <kyoshida@novell.com> [3d63a1c6c320371defc86869fec6307dd2a2158a]
+
+ More on pstring intern, with a test code.
+
+
+2010-12-25 Kohei Yoshida <kyoshida@novell.com> [8f4acc3f7522b02eeeb18af6f44fd3546bf1c6b3]
+
+ Added empty methods for interning strings.
+
+
+2010-12-25 Kohei Yoshida <kyoshida@novell.com> [dc3c99a313ab105dac9086a8a825196f81c1e24d]
+
+ Moved pstring::hash into src file.
+
+
+2010-12-25 Kohei Yoshida <kyoshida@novell.com> [8069ca28021a15e88b64c8377caf243a467740c3]
+
+ Added pstring source file and organized Makefile.
+
+
+2010-12-24 Kohei Yoshida <kyoshida@novell.com> [db765482939e5b49cb00bd6becf779681e08a7f8]
+
+ More on schema types.
+
+
+2010-12-24 Kohei Yoshida <kyoshida@novell.com> [57d821bfc047e696794e405b6ed306b829011b9e]
+
+ Start using schema constants.
+
+
+2010-12-24 Kohei Yoshida <kyoshida@novell.com> [c59a609dbbbbf6f40bb5a2fd6c22003e46ffe69c]
+
+ New files for pre-defined schema types.
+
+
+2010-12-24 Kohei Yoshida <kyoshida@novell.com> [fa2d5485e915174c87f446dfbc93146d8b8def9f]
+
+ Parse Relationship elements.
+
+
+2010-12-24 Kohei Yoshida <kyoshida@novell.com> [3ea5d80265a0454a5a243b94cb824fa617af44ee]
+
+ Parse xmlns from Relationships and set the default namespace.
+
+
+2010-12-24 Kohei Yoshida <kyoshida@novell.com> [b3043daa4b04faf19b18be6a401412efbd7d6ff0]
+
+ Handlers don't need to store the token set.
+
+
+2010-12-24 Kohei Yoshida <kyoshida@novell.com> [f85a319869b10c6c868f1148dd2e41ee6576804b]
+
+ Set up skeleton context and handler for relations parts.
+
+
+2010-12-12 Kohei Yoshida <kyoshida@novell.com> [643d2f1f2c7dd28fcbe2bb2786d5121a2c53f0fd]
+
+ More content types discovered.
+
+
+2010-12-12 Kohei Yoshida <kyoshida@novell.com> [cbf162a4c1105572ce454cef96ca119afb734f32]
+
+ Print unknown content types.
+
+
+2010-12-12 Kohei Yoshida <kyoshida@novell.com> [93845689ddc06be56b97675291cc39dc3dfc4f6d]
+
+ More content types added.
+
+
+2010-12-12 Kohei Yoshida <kyoshida@novell.com> [4d6a5cc2294ec3281a283a208fed639c0d141185]
+
+ Preparing to parse the .rels parts.
+
+
+2010-12-12 Kohei Yoshida <kyoshida@novell.com> [f92cc57fef52babeb5f030869dca05d8238b9ea4]
+
+ More helpful error message containing the name of the stream.
+
+
+2010-12-12 Kohei Yoshida <kyoshida@novell.com> [aecf58e796a73f878c5c0a161e3625147bb04567]
+
+ A little cleanup.
+
+
+2010-12-12 Kohei Yoshida <kyoshida@novell.com> [2cda55281f87811ccbfb77d56367edf0c0b5a2e9]
+
+ Error checking in guard's constructor.
+
+
+2010-12-12 Kohei Yoshida <kyoshida@novell.com> [41022afa16b4a2783f7778aa6a98dd61b74f46e2]
+
+ Use infile context guard for safer infile object handling.
+
+
+2010-12-12 Kohei Yoshida <kyoshida@novell.com> [f816743db945a087441c24c303b1ebac513edc32]
+
+ Print partitions.
+
+
+2010-12-12 Kohei Yoshida <kyoshida@novell.com> [f9ddeba678abe14b7a398048a055b816a04abec9]
+
+ Added new content type for spreadsheet's printer settings.
+
+
+2010-12-12 Kohei Yoshida <kyoshida@novell.com> [641c1c9a7afbcc36f6eeec05b02880cd91e533b4]
+
+ Pick up extension default content types from [Content_Types].xml.
+
+
+2010-12-11 Kohei Yoshida <kyoshida@novell.com> [bfece0ea2ce16e64051bcb473d3a2cb0cf73d5b9]
+
+ Added comments.
+
+
+2010-12-11 Kohei Yoshida <kyoshida@novell.com> [737ac8747978b9cbf129dc03eb96665ebadf9cb8]
+
+ Put everything but main() in anonymous namespace.
+
+
+2010-12-11 Kohei Yoshida <kyoshida@novell.com> [44c5b2a19461778a2854e0c3522096c019918e9a]
+
+ Added two new content types.
+
+ Also re-arranged content type definitions to make it easier to add
+ new ones in the future.
+
+2010-12-11 Kohei Yoshida <kyoshida@novell.com> [d3bb8e2d2df886edeedf020c7e2fea530047ba5e]
+
+ Don't print content type when it's NULL.
+
+
+2010-12-11 Kohei Yoshida <kyoshida@novell.com> [6290a38a1be3b678e2e9d9ac9ab5c6e8ef0ea1ab]
+
+ This should be content_type_t.
+
+
+2010-12-11 Kohei Yoshida <kyoshida@novell.com> [36921572338c365324f342317df29a72beabf08a]
+
+ Better output for part names.
+
+
+2010-12-11 Kohei Yoshida <kyoshida@novell.com> [f3f0b4900182a05261720faa9ff05750e1380077]
+
+ Pop the part info out of the handler and print them.
+
+
+2010-12-11 Kohei Yoshida <kyoshida@novell.com> [f24442f5ce8b43a1d655a5397d8002671a6cdd47]
+
+ Parse and store the xml parts info from the [Content_Types].xml.
+
+
+2010-12-11 Kohei Yoshida <kyoshida@novell.com> [6aa6f0b43792a116a8c38861836ed4d769a74780]
+
+ Moreon content type parsing & moved hash code for pstring.
+
+
+2010-12-11 Kohei Yoshida <kyoshida@novell.com> [f5fb3c55b950e10afaf05f5f0ea12fa4f1ad8380]
+
+ Added content types files to the project.
+
+
+2010-12-11 Kohei Yoshida <kyoshida@novell.com> [9275862a4d9d05eb53b1b2c447de5bd6240a2cf0]
+
+ Added content types constants for (mostly) ooxml parsing.
+
+
+2010-12-11 Kohei Yoshida <kyoshida@novell.com> [05b5b59b67569f5ba0c89bc09f8ea6bbb3f54e24]
+
+ Typo
+
+
+2010-12-11 Kohei Yoshida <kyoshida@novell.com> [b2ccd2aa9702e8a09aa5a3642e394f118db1bda0]
+
+ More on parsing [Content_Types].xml part.
+
+
+2010-12-11 Kohei Yoshida <kyoshida@novell.com> [35b9464eac2bca18a753a2caec5addd215610b9c]
+
+ Moved the handling of default namespace up to xml_context_base.
+
+
+2010-12-11 Kohei Yoshida <kyoshida@novell.com> [c0610429cf66d0c3f4e2deb1da518fe04cfe9401]
+
+ Two more namespaces for opc content types and opc relations.
+
+
+2010-12-11 Kohei Yoshida <kyoshida@novell.com> [84bb4eb42c6ad2cccd68ed7771e66c61f2d898aa]
+
+ Removed - no longer used.
+
+
+2010-12-09 Kohei Yoshida <kyoshida@novell.com> [4da3a6a4eafa9afba7acab1fe4a7c33c78e6ec89]
+
+ Added main context class for the OPC content types part.
+
+
+2010-12-09 Kohei Yoshida <kyoshida@novell.com> [871f4a9b84c670840d11e2059a490ced723a72b3]
+
+ Removed 'xml' from opc_content_types_xml_handler; it's redundant.
+
+
+2010-12-09 Kohei Yoshida <kyoshida@novell.com> [85c1fd2a74dfe90589eade6bb2d8cbd531e8455d]
+
+ Finally start parsing [Content_Types].xml part.
+
+
+2010-12-09 Kohei Yoshida <kyoshida@novell.com> [a352861d2715b0569bd95c316b10c19a3c840c64]
+
+ Renamed tokens_base.* files to tokens.*.
+
+
+2010-12-09 Kohei Yoshida <kyoshida@novell.com> [c097fa7612186f4664d3d3a511d39443d2045587]
+
+ Renamed tokens_base -> tokens.
+
+
+2010-12-09 Kohei Yoshida <kyoshida@novell.com> [bbaf110baaad72853c98f38148893734708ef2a3]
+
+ Removed them from the project also.
+
+
+2010-12-09 Kohei Yoshida <kyoshida@novell.com> [ff9392275783c95c7525aa396cfc7ee3bccb9007]
+
+ Removed files for the old tokens class.
+
+
+2010-12-09 Kohei Yoshida <kyoshida@novell.com> [343f97505efaf555275083f9788b546b0663a5ee]
+
+ Adapted orcus-xlsx to use non-static token map instance.
+
+
+2010-12-08 Kohei Yoshida <kyoshida@novell.com> [2b8a79fa5f9eafce6f8f7bee00a95f613294813e]
+
+ More on using non-static token map instance.
+
+
+2010-12-08 Kohei Yoshida <kyoshida@novell.com> [5df15e114b1aef872f0ba217e92bc58c83d0d619]
+
+ Adapted orcus-ods to use non-static token map instance.
+
+
+2010-12-08 Kohei Yoshida <kyoshida@novell.com> [1120c8ebc1919ab316b78d1b877ec3ec2a9fdbf8]
+
+ Added non-static tokens_base class which as a replacement for the static tokens class.
+
+
+2010-12-08 Kohei Yoshida <kyoshida@novell.com> [da6feda946a60194a977e29f808aa80ee96e873f]
+
+ More on preparing to parse OPC parts. Not finished yet.
+
+
+2010-12-08 Kohei Yoshida <kyoshida@novell.com> [a7787b32180620c6894912b3a5604bec761e7588]
+
+ Added the new file to the wrong project. Fixed.
+
+
+2010-12-08 Kohei Yoshida <kyoshida@novell.com> [ab2be962f02b88b0f61fe143f640418ea69230d0]
+
+ Added OPC token source files to the project.
+
+
+2010-12-08 Kohei Yoshida <kyoshida@novell.com> [d8e504397815cbe28efab8114d640932aa527239]
+
+ Reduce namespace token count for OPC.
+
+ OPC only needs 'xmlns' namespace token.
+
+2010-12-08 Kohei Yoshida <kyoshida@novell.com> [2fe2bb5d5a6196c0d7e90d32672ea87a08411a07]
+
+ Added schema type parameter to the ooxml token parser script.
+
+
+2010-12-08 Kohei Yoshida <kyoshida@novell.com> [7c233698c4efdf513bf0f9d6f717b15fb1c38c95]
+
+ Generate OPC token list as well.
+
+
+2010-12-08 Kohei Yoshida <kyoshida@novell.com> [ddb39b052b01ca08941fcc9874564cb85d5e0c57]
+
+ Added xml schema for ooxml open package convention.
+
+
+2010-12-05 Kohei Yoshida <kyoshida@novell.com> [bfc901c615a98990eaaf0ac679a2ac5ed056d13e]
+
+ Added cases for row, c and v elements.
+
+
+2010-12-05 Kohei Yoshida <kyoshida@novell.com> [b5f7fd359bb17259925a6a5711811b2cc73f90a0]
+
+ Creat an internal sheet instance at the start of parsing the sheet xml fragments.
+
+
+2010-12-05 Kohei Yoshida <kyoshida@novell.com> [da799e27a35008e6602659f65ad31b9a1851837d]
+
+ Added class diagram.
+
+
+2010-12-05 Kohei Yoshida <kyoshida@novell.com> [e67e20c3ad6ae057b86383c9706e1bdea472b74a]
+
+ More content parsing on xlsx sheet.xml.
+
+
+2010-12-05 Kohei Yoshida <kyoshida@novell.com> [bcf2f3f4cbe746c8bb50777ab75ba3828d4439c2]
+
+ Rename spreadsheetML namespace to xlsx for the sake of brevity.
+
+
+2010-12-05 Kohei Yoshida <kyoshida@novell.com> [3789b6c3ee888084eb6d393ed5557bead34a6491]
+
+ More overloaded operators.
+
+
+2010-12-05 Kohei Yoshida <kyoshida@novell.com> [13b766bd8c0e67f955e287d61e2e61efa6ab9681]
+
+ Make pstring usable with ostream object.
+
+
+2010-12-05 Kohei Yoshida <kyoshida@novell.com> [05fe612894eab420029dedf06a390be9dd97eb17]
+
+ Hard-code xmlns token name; we need this for default namespace attribute.
+
+
+2010-12-04 Kohei Yoshida <kyoshida@novell.com> [d068e63d6ceafda24eda7c392d07ea2eb58a1efd]
+
+ Renamed odstable.* to sheet.* to reflect the class name change.
+
+
+2010-12-04 Kohei Yoshida <kyoshida@novell.com> [1672489129cb408b2e3115c9a427485531fea159]
+
+ Added comments.
+
+
+2010-12-04 Kohei Yoshida <kyoshida@novell.com> [ccaf838d24b64d1eb7be30018d9174a02909fe8d]
+
+ Renamed model::ods_table to model::sheet.
+
+ I'm gonna use this class as an internal generic sheet object, for
+ both ods and xlsx parser. So the name ods_ was not appropriate.
+
+2010-05-08 Kohei Yoshida <kyoshida@novell.com> [7ffb5fa6a24df608d1add329fdf48c8a839d9860]
+
+ Cleaning
+
+
+2010-05-08 Kohei Yoshida <kyoshida@novell.com> [f4e120f75f6ff305487a46fefcd6b9e27fcbbff5]
+
+ Removed _Char type name from the sax parser template.
+
+ Let's always use char as the char type.
+
+2010-05-08 Kohei Yoshida <kyoshida@novell.com> [201ba6f295a835aa70581ccf1ba2075afbd084e1]
+
+ Use char pointer to keep track of current position & return current char.
+
+ Doing this is slightly faster than array-type access via [] operator.
+
+2010-05-08 Kohei Yoshida <kyoshida@novell.com> [db31009de400fe72324f5437f55464515898ca33]
+
+ Generate a flat list of tokens in addition to C++ code.
+
+
+2010-05-08 Kohei Yoshida <kyoshida@novell.com> [b362ea4ec28e8ae9849d7983b80ec6927ba4a9e6]
+
+ Slightly better string hash algorithm.
+
+
+2010-05-08 Kohei Yoshida <kyoshida@novell.com> [31fef6f5d27b84b9a72f9197bfc0611d4e069f76]
+
+ Modify the rest of the handler/context classes to use the new sax parser.
+
+
+2010-05-08 Kohei Yoshida <kyoshida@novell.com> [208904d0e88e74fd051f6cb40001affbb5aa2371]
+
+ Removed unnecessary using namespace std statements.
+
+
+2010-05-08 Kohei Yoshida <kyoshida@novell.com> [1a365b08fa6770ffa0dd4767ff46e66b404c8bf1]
+
+ Store attributes for later processing in the handler class.
+
+
+2010-05-08 Kohei Yoshida <kyoshida@novell.com> [4a9b9de6f137143288cccf8d4ea0fa4174e99feb]
+
+ Remove extra indent from the closing '>' of opening elements.
+
+
+2010-05-05 Kohei Yoshida <kyoshida@novell.com> [047e593bf97e334343df4852b77f1cbf12b3f9ff]
+
+ Put raw token strings and its associated classes into anonymous namespace once again.
+
+
+2010-05-05 Kohei Yoshida <kyoshida@novell.com> [9c8ab07867f044aafcec1a2b9de8c2585ef0045b]
+
+ Integrate token generator into the sax parser, and convert strings into tokens as we parse the stream.
+
+
+2010-05-04 Kohei Yoshida <kyoshida@novell.com> [4cbd65ed5e63f3f526de337ccb0c86ce7185c62b]
+
+ Let's use char as char_type in the sax_parser.
+
+
+2010-05-04 Kohei Yoshida <kyoshida@novell.com> [e45581da81d333ecf166d14fa6843abdfc7591fb]
+
+ Disable string processing in libxml handler, which cuts a lot from the parsing performance.
+
+
+2010-05-04 Kohei Yoshida <kyoshida@novell.com> [efa5cc2bf8914077113449ab3ae3b61e3ca7bb67]
+
+ Separated common tokens implementation code into tokens.inl.
+
+
+2010-05-04 Kohei Yoshida <kyoshida@novell.com> [64f7e1b712352445a29180f58c9e176c94b5899d]
+
+ Use pstring to store element names, attribute names and values in the sax parser.
+
+ Doing so is much much cheater than using std::string to store those strings. There
+ is very little overhead for doing this, in fact.
+
+2010-05-04 Kohei Yoshida <kyoshida@novell.com> [849924f679b33b8aed003fcea0f848a0b28492fb]
+
+ Added c_str() to pstring class.
+
+
+2010-05-04 Kohei Yoshida <kyoshida@novell.com> [c71827bb0926537e1ca586acd3c8f01b1e839fb9]
+
+ Use pstring for the xlsx parser as well.
+
+
+2010-05-04 Kohei Yoshida <kyoshida@novell.com> [83d1228bcebc6285b2030101bbe289394e93b5c4]
+
+ Code cleanup.
+
+
+2010-05-04 Kohei Yoshida <kyoshida@novell.com> [4619f791a787987db1783aaf393b69902963a443]
+
+ Implemented pstring, which acts like std::string but doesn't store a char array of its own.
+
+
+2010-05-02 Kohei Yoshida <kyoshida@novell.com> [d26aac7df0d2ce745f381784a7e0f2857d2e4db1]
+
+ Comment out all that is very costly, for now.
+
+
+2010-05-02 Kohei Yoshida <kyoshida@novell.com> [bab3fd31c1dc003155f595002f87fa27231859df]
+
+ Disable debug output for the new sax parser.
+
+
+2010-05-02 Kohei Yoshida <kyoshida@novell.com> [8d306c1234e3f8986fba71afd33ab7fc043dd5ec]
+
+ Parse closing elements.
+
+
+2010-05-02 Kohei Yoshida <kyoshida@novell.com> [5713d4706a115079731afdc937e9c1f62d241a8f]
+
+ Better debug output.
+
+
+2010-05-02 Kohei Yoshida <kyoshida@novell.com> [15df55bdc56e2991022a0ebe229216e579ed308d]
+
+ Parsing elements.
+
+
+2010-05-02 Kohei Yoshida <kyoshida@novell.com> [df8c92a448d47527aed37fd2aaee01ea0b558474]
+
+ More on parsing blank chars.
+
+
+2010-05-02 Kohei Yoshida <kyoshida@novell.com> [4efb520a5d345811036347af15689e637e3ca4cf]
+
+ Code cleanup.
+
+
+2010-05-02 Kohei Yoshida <kyoshida@novell.com> [a1627a061a37bd3041c0ee57e05e6c7c89b13ca2]
+
+ Parse XML header.
+
+
+2010-05-02 Kohei Yoshida <kyoshida@novell.com> [fa909e4a2e17a143526f92deee2fac8206999b0c]
+
+ Added hook for a template-based sax parser.
+
+
+2010-05-01 Kohei Yoshida <kyoshida@novell.com> [c7e7c19399d18dfc8541a996371a2cc87f3bb559]
+
+ Added slickedit workspace files.
+
+
+2010-05-01 Kohei Yoshida <kyoshida@novell.com> [af7691a179676a8ccca571dc16d2e92472404a9c]
+
+ Fixed build so that both orcus-ods and orcus-xlsx can be built without altering compiler switch.
+
+
+2010-05-01 Kohei Yoshida <kyoshida@novell.com> [b9e1b10bae53c7fd19d3171fbc13b0c4703d5991]
+
+ Added license header.
+
+
+2010-05-01 Kohei Yoshida <kyoshida@novell.com> [ac2254445cf8a9538f1ef75086c76f6edb194d38]
+
+ Fixed parallel build issue wrt token file generation.
+
+
+2010-04-30 Kohei Yoshida <kyoshida@novell.com> [96de136d20c3edf1eae034b4d1855790b2143712]
+
+ More on xlsx parsing.
+
+
+2010-04-30 Kohei Yoshida <kyoshida@novell.com> [bdade14ef7bef5193c83d5818695a54ea15d2f01]
+
+ More file for the xlsx parser.
+
+
+2010-04-30 Kohei Yoshida <kyoshida@novell.com> [f8b117284dda2a00fa8cf68925c9ac162803fc79]
+
+ New files for xlsx parser.
+
+
+2010-04-30 Kohei Yoshida <kyoshida@novell.com> [df3fb072b7744f1b81ae1bf628b0ad93cb69af60]
+
+ Finally got the ooxml parser to build. But I need to resolve the token name clash somehow...
+
+
+2010-04-30 Kohei Yoshida <kyoshida@novell.com> [dbbefc90440aab2bc75144db4c8b3324e522c725]
+
+ Read content of sheet1.xml.
+
+
+2010-04-30 Kohei Yoshida <kyoshida@novell.com> [6a4b8ada498ceeadc1669a3a3ad5881992709e26]
+
+ More on xlsx parser.
+
+
+2010-04-30 Kohei Yoshida <kyoshida@novell.com> [41963fffe853a16de723095dfb68212c0f209370]
+
+ More on ooxml xlsx parser.
+
+
+2010-04-30 Kohei Yoshida <kyoshida@novell.com> [7265b82750199d6fd46a60b23bb9ced8ea346d9c]
+
+ Extract xml tokens from ooxml schema files.
+
+
+2010-04-30 Kohei Yoshida <kyoshida@novell.com> [4dd1f602ca4fc359814fb33c5b1e144790d2c817]
+
+ Moved ODF handling files into odf directory.
+
+
+2010-04-30 Kohei Yoshida <kyoshida@novell.com> [e83f4e0fe926ffd1106dc9482fea74d3271c7686]
+
+ model object files into obj/model/*.o.
+
+
+2010-04-30 Kohei Yoshida <kyoshida@novell.com> [6eeeadc94fc3f6210b1a47d6501d9d6ad137e104]
+
+ Totally removed $(EXEC) with orcus-ods.
+
+
+2010-04-30 Kohei Yoshida <kyoshida@novell.com> [e293f3d72b42eab00c7f9f89678022744c16e533]
+
+ Renamed main.cpp to orcus_ods.cpp.
+
+
+2010-04-30 Kohei Yoshida <kyoshida@novell.com> [29e3a868455841e64156f9ea0c11b9bffd0a6f0b]
+
+ Renamed executable to orcus-ods.
+
+
+2010-04-30 Kohei Yoshida <kyoshida@novell.com> [1d0f1c4733cd9f95345b74a0a18dcf2e9891ba17]
+
+ Renamed a bunch of token-related files with a odf_ prefix.
+
+
+2010-04-09 Kohei Yoshida <kyoshida@novell.com> [c752aaa0f94f63554d600443147ed529034ad629]
+
+ Use ::std::string instead of const char* when converting to tokens.
+
+ This speeds up the performance of name_to_token somewhat.
+
+2010-04-09 Kohei Yoshida <kyoshida@novell.com> [89ebb184c3d547fcaad6f56e28f1137b801db22b]
+
+ Reserve only 15 chars instead of 100. This improves performance.
+
+
+2010-04-09 Kohei Yoshida <kyoshida@novell.com> [55ef441c3cb86cd41de1a1bbd37641dd147f0824]
+
+ Added new header to store global items for the model namespace.
+
+
+2010-04-09 Kohei Yoshida <kyoshida@novell.com> [0d27cef39f5b38f762bdc5a19bbbfda43f439087]
+
+ Put cell values into ods_table instances, and print cell contents to html.
+
+
+2010-04-08 Kohei Yoshida <kyoshida@novell.com> [faa73697982189be1458577812ad7380b6af3cd3]
+
+ Made a header guard longer and more complex.
+
+
+2010-04-08 Kohei Yoshida <kyoshida@novell.com> [39bd8a62ae30d1a1050b4feec15fdda7b657e097]
+
+ Return a const ref of string.
+
+
+2010-04-08 Kohei Yoshida <kyoshida@novell.com> [d65221299b39f33d73d4202442cde867ea27b14f]
+
+ Store the content of <text:p> and set it as a cell value to the table model.
+
+
+2010-04-08 Kohei Yoshida <kyoshida@novell.com> [7fca80b1580575ea52f98284aa1f382dd81f8a48]
+
+ Added end_child_context() as a means for the child context to talk to its parent.
+
+
+2010-04-08 Kohei Yoshida <kyoshida@novell.com> [abad8782ca7fbe4494b1e052400597582c6fb528]
+
+ Use unordered_map instead of hash_map. hash_map is deprecated.
+
+
+2010-04-05 Kohei Yoshida <kyoshida@novell.com> [79d9404ffb3a445c1c8f1863877bc0637055c5f5]
+
+ More on processing <text:p> content.
+
+
+2010-04-05 Kohei Yoshida <kyoshida@novell.com> [ff09014c936e44534f9fb27999bc3d60d77295e4]
+
+ Removed start_context() and end_context(). I can use constructor and destructor instead.
+
+
+2010-04-05 Kohei Yoshida <kyoshida@novell.com> [e14c0bcc0d23d472cc053221c0f923ad55c8596a]
+
+ Use text_para_context to pick up <text:p> contents.
+
+
+2010-04-05 Kohei Yoshida <kyoshida@novell.com> [19dbbe2103b3934fee06e06ab8afdf0ada40cc6b]
+
+ Added text_para_context to handle <text:p> element structure.
+
+
+2010-04-05 Kohei Yoshida <kyoshida@novell.com> [8910a9357f288d8689b1110dc6642c42f8edf731]
+
+ Renamed files.
+
+
+2010-04-05 Kohei Yoshida <kyoshida@novell.com> [fc379a822621b37ceab9aa48902c75c219f3c63b]
+
+ Renamed ods_context_base to xml_context_base, since that class is not ods specific.
+
+
+2010-04-04 Kohei Yoshida <kyoshida@novell.com> [fec27490da1ecafe89bb616436f89cbd30c67521]
+
+ Handle stacking of multiple contexts in the xml stream handler.
+
+
+2010-04-04 Kohei Yoshida <kyoshida@novell.com> [00e6bbc74327d192d2aaddf46360cce5b6c5863e]
+
+ Add new virtual methods to query whether or not to create a child context.
+
+
+2010-04-04 Kohei Yoshida <kyoshida@novell.com> [57219a7768bc59e8da784cb1d18f03802a6a533f]
+
+ Move the element stack handling to the base class.
+
+
+2010-04-04 Kohei Yoshida <kyoshida@novell.com> [6ab7a6b5e4906dcf872e408a6b31fcb8f6fc5e14]
+
+ Handle characters in the context classes.
+
+
+2010-04-04 Kohei Yoshida <kyoshida@novell.com> [e28699c2f184a8cde17ac88b60b6a8a3d9903f1b]
+
+ Implemented stacked contexts in the handler class.
+
+
+2010-04-04 Kohei Yoshida <kyoshida@novell.com> [ccbf0f9f851ca4f04739bc1e7ec0e03505c2af70]
+
+ Moved ods_context_base into its own files.
+
+
+2010-04-04 Kohei Yoshida <kyoshida@novell.com> [8e5fe9aa27b1ea85b57f1fe6b85da39a97ad8c3b]
+
+ Make certain methods private.
+
+
+2010-04-04 Kohei Yoshida <kyoshida@novell.com> [f7637bd7deefe371b5c1924cb3ecd1e7aeec4cb1]
+
+ Moved all the xml stack handling to the context class from the handler class.
+
+
+2010-04-04 Kohei Yoshida <kyoshida@novell.com> [a97a44b8176ede1391978a4396d536954ed1c133]
+
+ Debug output for repetition of rows and cells.
+
+
+2010-04-04 Kohei Yoshida <kyoshida@novell.com> [27986d4f9003c5c473614c8aa7116c3e39fb2876]
+
+ Pick up table-cell attributes, especially the table:number-columns-repeated attribute.
+
+
+2010-04-04 Kohei Yoshida <kyoshida@novell.com> [28cb599d0741b349670b55af47d62a676fbdcef4]
+
+ Added test document that loads slow in OOo due to too many cell styles.
+
+
+2010-04-03 Kohei Yoshida <kyoshida@novell.com> [81f26ffcc48f58c0810e647fd6dddbafcaf2236c]
+
+ Pick up table-row attributes, especially number-rows-repeated.
+
+
+2010-04-03 Kohei Yoshida <kyoshida@novell.com> [99000b9c2715f5437ab774ede9507c1964a96161]
+
+ Added a test file with Japanese content.
+
+
+2010-04-03 Kohei Yoshida <kyoshida@novell.com> [e3dd6a4408aa8dcd2b257f695e7d7ffcc71874e1]
+
+ Write html table for each sheet imported, and display their names.
+
+
+2010-04-03 Kohei Yoshida <kyoshida@novell.com> [5cee489db52b46e7a3c51a3a1831564932082c6b]
+
+ Pick up table name from the table:name attribute.
+
+
+2010-04-03 Kohei Yoshida <kyoshida@novell.com> [73cb4551100a3a3120f14db9e7e2edff74a21567]
+
+ Added skeleton files for ods_table class, under namespace 'model'.
+
+
+2010-04-03 Kohei Yoshida <kyoshida@novell.com> [0cba348bdceffad4ee443c59a67442a25132780d]
+
+ More on content.xml parsing.
+
+
+2010-04-03 Kohei Yoshida <kyoshida@novell.com> [706f014d5ec3b74aa4f5fd1f9dc28b21849f0e5c]
+
+ Pass parent element to the element handlers.
+
+
+2010-04-03 Kohei Yoshida <kyoshida@novell.com> [82862adfa556cff1e7f7bb63ed19ec972bd1d095]
+
+ Print parsed content of content.xml to html for debugging.
+
+
+2010-04-03 Kohei Yoshida <kyoshida@novell.com> [a14f7e526726f84846a137fe24c19bf343baa0c6]
+
+ Get parent xml element to branch element handling.
+
+
+2010-04-03 Kohei Yoshida <kyoshida@novell.com> [0305d3cf4c215d260b222cdc2c3f3d2bb94f7e0b]
+
+ Print warnings on unhandled elements.
+
+
+2010-04-03 Kohei Yoshida <kyoshida@novell.com> [4b19defe8290aa2f70756fa1919eba4ff6b7dc61]
+
+ More on parsing ods content.xml.
+
+
+2010-04-03 Kohei Yoshida <kyoshida@novell.com> [9d3ffe93d09dcdf19915ba7f07f617f7c0444be8]
+
+ Code cleanup.
+
+
+2010-04-03 Kohei Yoshida <kyoshida@novell.com> [562cee1b83ad4ee19df14bf5be01fad82166341d]
+
+ Renamed ods_context_base to ods_content_xml_context. We should have one context class for each xml stream.
+
+
+2010-04-03 Kohei Yoshida <kyoshida@novell.com> [9fc15c5ca2850233b9153876ac0e8fae83a777af]
+
+ More on ods' context.xml parsing.
+
+
+2010-04-02 Kohei Yoshida <kyoshida@novell.com> [f2de245b887204ba50703dd63b81b2e917b0e1c8]
+
+ Instantiate ods context class and pass it to each ods handler.
+
+
+2010-04-02 Kohei Yoshida <kyoshida@novell.com> [4ae4af692e6a91b59f340b2e4aa39eb0c1298aed]
+
+ Added skeleton files for ods_context_test.
+
+ Class ods_context_test is a test implementation of ods_context_base,
+ used only for testing.
+
+2010-04-02 Kohei Yoshida <kyoshida@novell.com> [e22cbc92a2a7ff123fe3ccca0a3f7f50f12d655a]
+
+ Added ods_context_base skeleton files.
+
+
+2010-04-02 Kohei Yoshida <kyoshida@novell.com> [b8d7724b28594372cb3980333ff2b2ea914c1d14]
+
+ Separated ods handler class into own files.
+
+
+2010-04-01 Kohei Yoshida <kyoshida@novell.com> [f2b45129d3c448c81ee1128022beb67391ad3226]
+
+ Pass elements etc from the parser to the handler.
+
+
+2010-04-01 Kohei Yoshida <kyoshida@novell.com> [269c6ded4221886071b1796db8b6030920e4c8cc]
+
+ Have gen-token script generate constants into a .inl file.
+
+
+2010-03-31 Kohei Yoshida <kyoshida@novell.com> [920fb5038fe72d8fc200cf1c480899bad3b46d3e]
+
+ Add class for handling content.xml of ods document, and pass that to the parser.
+
+
+2010-03-31 Kohei Yoshida <kyoshida@novell.com> [f14186df62e85609b3ae0b806cf1aace4581c37c]
+
+ XML handler class to handle specific XML structures. It's still a skeleton class.
+
+
+2010-03-28 Kohei Yoshida <kyoshida@novell.com> [195b1e1b603afef1c57d696cb050318b5c5d0054]
+
+ Added test document from George Ou, which is probably one of the worst case scenarios.
+
+
+2010-03-28 Kohei Yoshida <kyoshida@novell.com> [c7dc98128c0a8637ba65aa05e78153542eb9c9fc]
+
+ Some string hash optimization.
+
+ Reversing the bits of the string size as the initial hash value makes the query
+ speed a bit faster.
+
+2010-03-28 Kohei Yoshida <kyoshida@novell.com> [9f72f38fc252ce30ddb49667bd9546f22ff7b776]
+
+ Run gen-tokens script before the headers, since one of the headers get generated by the script.
+
+
+2010-03-28 Kohei Yoshida <kyoshida@novell.com> [0f94026cbe7fa6f352ff63c1b7b21a07bcf69357]
+
+ Forgot to add this file...
+
+
+2010-03-27 Kohei Yoshida <kyoshida@novell.com> [3c4d7badaebd7c25f957b74cf55b588ca58d7e32]
+
+ Convert textural element names into a pair of tokens during the parse.
+
+
+2010-03-27 Kohei Yoshida <kyoshida@novell.com> [d554ddb9927df7d95fa4e49990738f25f69a43eb]
+
+ Add methods for namespace tokens in the 'tokens' class.
+
+
+2010-03-27 Kohei Yoshida <kyoshida@novell.com> [6f500f99cf700fb7cc04ead4cbed2897d08be9ab]
+
+ Generate name array for the namespace tokens as well.
+
+
+2010-03-27 Kohei Yoshida <kyoshida@novell.com> [6b3e59d16cf2e70123666d18ee2b4d3be1e97264]
+
+ Separate namespace tokens from the normal tokens.
+
+
+2010-03-27 Kohei Yoshida <kyoshida@novell.com> [e33a00f1ca7375ec0acd8e2999ef249df5e4a58b]
+
+ Return XML_UNKNOWN_TOKEN when the token name is not found.
+
+
+2010-03-27 Kohei Yoshida <kyoshida@novell.com> [0fe3445cc4a179692e1b0cdb28bd8a14d4600712]
+
+ Split the main() method code.
+
+
+2010-03-27 Kohei Yoshida <kyoshida@novell.com> [b79c09fa2bc0258e3064c59277342ce39404407d]
+
+ Make token generation part of the build dependency.
+
+
+2010-03-27 Kohei Yoshida <kyoshida@novell.com> [10677294ed6f10f3f5a7363b59786ffb7ff573f5]
+
+ Use mutex guard class for exception safety.
+
+
+2010-03-27 Kohei Yoshida <kyoshida@novell.com> [d1e2d86d4cb4cd5b404143efb1ddb7249661b265]
+
+ Finished up the tokens class definition. The class should be usable now.
+
+
+2010-03-27 Kohei Yoshida <kyoshida@novell.com> [79def6dab0febc67e729d9a57f59d91db22861ef]
+
+ More on token generation & added token handler class.
+
+ The whole thing now compiles.
+
+2010-03-27 Kohei Yoshida <kyoshida@novell.com> [4519855aec9790d0b645b6ac65d7d06676af8b13]
+
+ More on token generation.
+
+
+2010-03-27 Kohei Yoshida <kyoshida@novell.com> [a0e93d2881223f5e05ff5747e17e379c3b98273d]
+
+ More on token generation script.
+
+
+2010-03-27 Kohei Yoshida <kyoshida@novell.com> [29c5a42b04de4275f5884e776f4c601b5dfbd5e1]
+
+ Add script to parse the ODF schema and pick up a set of unique tokens.
+
+
+2010-03-27 Kohei Yoshida <kyoshida@novell.com> [56670c4285613785dd07fae0304539cce511ca45]
+
+ Added latest ODF schema file.
+
+
+2010-03-27 Kohei Yoshida <kyoshida@novell.com> [f6aca50f1ebb666bc3eaa21ae5b47bf1acf7e7bf]
+
+ Code cleanup.
+
+
+2010-03-27 Kohei Yoshida <kyoshida@novell.com> [0af98d42ef39f1a46b998985cb24b946218cb9b9]
+
+ Start and end document sax handlers.
+
+
+2010-03-27 Kohei Yoshida <kyoshida@novell.com> [6e0d313bc8e205754862c35c8b0e181bd9b04bc6]
+
+ Initial skeleton code for implementing libxml's sax interface.
+
+
+2010-03-27 Kohei Yoshida <kyoshida@novell.com> [036c5fe8dbd6c15bf6944f4310a9130b2c3d82ca]
+
+ Use libxml to read and build xml doc tree from xml in-memory stream.
+
+
+2010-03-27 Kohei Yoshida <kyoshida@novell.com> [c6d606319bce0918afff69a3496917c69f09ea1e]
+
+ dump content to stdout during parsing of content.xml.
+
+
+2010-03-27 Kohei Yoshida <kyoshida@novell.com> [7d98a2b678a1f2dca9bd3eeeae42caffc9488382]
+
+ added xmlparser skeleton files.
+
+
+2010-03-27 Kohei Yoshida <kyoshida@novell.com> [3293e58a5d8db727b6e5ea3e5af0b477b83218d8]
+
+ only read content.xml for now.
+
+
+2010-03-27 Kohei Yoshida <kyoshida@novell.com> [8e26709a93431e8341e30363f00d248bb3a10aaa]
+
+ Turn off parts that are specific to libgsf's own ODF support.
+
+
+2010-03-27 Kohei Yoshida <kyoshida@novell.com> [949d70fe8467d204342e97b9fab93e163d57f1fa]
+
+ Fixed makefile header dependency.
+
+
+2010-03-25 Kohei Yoshida <kyoshida@novell.com> [ad3158ec9bc9378d91f3e49d6c7af0a910d0c05b]
+
+ Use get_gsf_ooo_ns() instead as the header says.
+
+
+2010-03-25 Kohei Yoshida <kyoshida@novell.com> [4aa74be86dd6ea998c2a0bc1c047575f51c997e5]
+
+ Initial code on parsing xml sub-stream.
+
+
+2010-03-25 Kohei Yoshida <kyoshida@novell.com> [4acc83c58b66e107701fc220002633194c77edc1]
+
+ Squashed tabs.
+
+
+2010-03-25 Kohei Yoshida <kyoshida@novell.com> [a5ee2d7f26b133170a1c0a180d63c7b008162880]
+
+ Initial commit.
+
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..a612ad9
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,373 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+ means each individual or legal entity that creates, contributes to
+ the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+ means the combination of the Contributions of others (if any) used
+ by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+ means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+ means Source Code Form to which the initial Contributor has attached
+ the notice in Exhibit A, the Executable Form of such Source Code
+ Form, and Modifications of such Source Code Form, in each case
+ including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+ means
+
+ (a) that the initial Contributor has attached the notice described
+ in Exhibit B to the Covered Software; or
+
+ (b) that the Covered Software was made available under the terms of
+ version 1.1 or earlier of the License, but not also under the
+ terms of a Secondary License.
+
+1.6. "Executable Form"
+ means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+ means a work that combines Covered Software with other material, in
+ a separate file or files, that is not Covered Software.
+
+1.8. "License"
+ means this document.
+
+1.9. "Licensable"
+ means having the right to grant, to the maximum extent possible,
+ whether at the time of the initial grant or subsequently, any and
+ all of the rights conveyed by this License.
+
+1.10. "Modifications"
+ means any of the following:
+
+ (a) any file in Source Code Form that results from an addition to,
+ deletion from, or modification of the contents of Covered
+ Software; or
+
+ (b) any new file in Source Code Form that contains any Covered
+ Software.
+
+1.11. "Patent Claims" of a Contributor
+ means any patent claim(s), including without limitation, method,
+ process, and apparatus claims, in any patent Licensable by such
+ Contributor that would be infringed, but for the grant of the
+ License, by the making, using, selling, offering for sale, having
+ made, import, or transfer of either its Contributions or its
+ Contributor Version.
+
+1.12. "Secondary License"
+ means either the GNU General Public License, Version 2.0, the GNU
+ Lesser General Public License, Version 2.1, the GNU Affero General
+ Public License, Version 3.0, or any later versions of those
+ licenses.
+
+1.13. "Source Code Form"
+ means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+ means an individual or a legal entity exercising rights under this
+ License. For legal entities, "You" includes any entity that
+ controls, is controlled by, or is under common control with You. For
+ purposes of this definition, "control" means (a) the power, direct
+ or indirect, to cause the direction or management of such entity,
+ whether by contract or otherwise, or (b) ownership of more than
+ fifty percent (50%) of the outstanding shares or beneficial
+ ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+ Licensable by such Contributor to use, reproduce, make available,
+ modify, display, perform, distribute, and otherwise exploit its
+ Contributions, either on an unmodified basis, with Modifications, or
+ as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+ for sale, have made, import, and otherwise transfer either its
+ Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+ or
+
+(b) for infringements caused by: (i) Your and any other third party's
+ modifications of Covered Software, or (ii) the combination of its
+ Contributions with other software (except as part of its Contributor
+ Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+ its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+ Form, as described in Section 3.1, and You must inform recipients of
+ the Executable Form how they can obtain a copy of such Source Code
+ Form by reasonable means in a timely manner, at a charge no more
+ than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+ License, or sublicense it under different terms, provided that the
+ license for the Executable Form does not attempt to limit or alter
+ the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+* *
+* 6. Disclaimer of Warranty *
+* ------------------------- *
+* *
+* Covered Software is provided under this License on an "as is" *
+* basis, without warranty of any kind, either expressed, implied, or *
+* statutory, including, without limitation, warranties that the *
+* Covered Software is free of defects, merchantable, fit for a *
+* particular purpose or non-infringing. The entire risk as to the *
+* quality and performance of the Covered Software is with You. *
+* Should any Covered Software prove defective in any respect, You *
+* (not any Contributor) assume the cost of any necessary servicing, *
+* repair, or correction. This disclaimer of warranty constitutes an *
+* essential part of this License. No use of any Covered Software is *
+* authorized under this License except under this disclaimer. *
+* *
+************************************************************************
+
+************************************************************************
+* *
+* 7. Limitation of Liability *
+* -------------------------- *
+* *
+* Under no circumstances and under no legal theory, whether tort *
+* (including negligence), contract, or otherwise, shall any *
+* Contributor, or anyone who distributes Covered Software as *
+* permitted above, be liable to You for any direct, indirect, *
+* special, incidental, or consequential damages of any character *
+* including, without limitation, damages for lost profits, loss of *
+* goodwill, work stoppage, computer failure or malfunction, or any *
+* and all other commercial damages or losses, even if such party *
+* shall have been informed of the possibility of such damages. This *
+* limitation of liability shall not apply to liability for death or *
+* personal injury resulting from such party's negligence to the *
+* extent applicable law prohibits such limitation. Some *
+* jurisdictions do not allow the exclusion or limitation of *
+* incidental or consequential damages, so this exclusion and *
+* limitation may not apply to You. *
+* *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+ This Source Code Form is subject to the terms of the Mozilla Public
+ License, v. 2.0. If a copy of the MPL was not distributed with this
+ file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+---------------------------------------------------------
+
+ This Source Code Form is "Incompatible With Secondary Licenses", as
+ defined by the Mozilla Public License, v. 2.0.
diff --git a/Makefile.am b/Makefile.am
new file mode 100644
index 0000000..3e9fb39
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1,987 @@
+SUBDIRS = src include
+
+if WITH_BENCHMARK
+
+SUBDIRS += benchmark
+
+endif
+
+if WITH_DOC_EXAMPLE
+
+SUBDIRS += doc_example
+
+endif
+
+ACLOCAL_AMFLAGS = -I m4
+
+pcfiles = liborcus-@ORCUS_API_VERSION@.pc
+if BUILD_SPREADSHEET_MODEL
+pcfiles += liborcus-spreadsheet-model-@ORCUS_API_VERSION@.pc
+endif
+
+pkgconfig_DATA = $(pcfiles)
+pkgconfigdir = $(libdir)/pkgconfig
+
+doc_data = \
+ doc/_static/images/overview/doc-content.png \
+ doc/_static/images/overview/multi-sheets-sheet1.png \
+ doc/_static/images/overview/multi-sheets-sheet2.png \
+ doc/cli/index.rst \
+ doc/cli/orcus_csv.rst \
+ doc/cli/orcus_gnumeric.rst \
+ doc/cli/orcus_json.rst \
+ doc/cli/orcus_ods.rst \
+ doc/cli/orcus_parquet.rst \
+ doc/cli/orcus_xls_xml.rst \
+ doc/cli/orcus_xlsx.rst \
+ doc/cli/orcus_xml.rst \
+ doc/cli/orcus_yaml.rst \
+ doc/conf.py \
+ doc/cpp/core/config.rst \
+ doc/cpp/core/import-filter/csv.rst \
+ doc/cpp/core/import-filter/detect.rst \
+ doc/cpp/core/import-filter/gnumeric.rst \
+ doc/cpp/core/import-filter/index.rst \
+ doc/cpp/core/import-filter/json.rst \
+ doc/cpp/core/import-filter/ods.rst \
+ doc/cpp/core/import-filter/xls_xml.rst \
+ doc/cpp/core/import-filter/xlsx.rst \
+ doc/cpp/core/import-filter/xml.rst \
+ doc/cpp/core/index.rst \
+ doc/cpp/core/interface/global.rst \
+ doc/cpp/core/interface/index.rst \
+ doc/cpp/core/interface/spreadsheet/document.rst \
+ doc/cpp/core/interface/spreadsheet/document_export.rst \
+ doc/cpp/core/interface/spreadsheet/index.rst \
+ doc/cpp/core/interface/spreadsheet/pivot.rst \
+ doc/cpp/core/interface/spreadsheet/sheet.rst \
+ doc/cpp/core/interface/spreadsheet/styles.rst \
+ doc/cpp/core/interface/spreadsheet/view.rst \
+ doc/cpp/core/tree-doc/index.rst \
+ doc/cpp/core/tree-doc/json.rst \
+ doc/cpp/core/tree-doc/yaml.rst \
+ doc/cpp/core/types/core.rst \
+ doc/cpp/core/types/index.rst \
+ doc/cpp/core/types/view.rst \
+ doc/cpp/core/utils.rst \
+ doc/cpp/index.rst \
+ doc/cpp/parser/archive.rst \
+ doc/cpp/parser/base64.rst \
+ doc/cpp/parser/css.rst \
+ doc/cpp/parser/csv.rst \
+ doc/cpp/parser/exception.rst \
+ doc/cpp/parser/index.rst \
+ doc/cpp/parser/json.rst \
+ doc/cpp/parser/stream.rst \
+ doc/cpp/parser/types.rst \
+ doc/cpp/parser/util.rst \
+ doc/cpp/parser/xml.rst \
+ doc/cpp/parser/xml_writer.rst \
+ doc/cpp/parser/yaml.rst \
+ doc/cpp/spreadsheet-doc/document.rst \
+ doc/cpp/spreadsheet-doc/import-export.rst \
+ doc/cpp/spreadsheet-doc/index.rst \
+ doc/cpp/spreadsheet-doc/pivot.rst \
+ doc/cpp/spreadsheet-doc/shared-strings.rst \
+ doc/cpp/spreadsheet-doc/sheet.rst \
+ doc/cpp/spreadsheet-doc/styles.rst \
+ doc/cpp/spreadsheet-doc/table.rst \
+ doc/cpp/spreadsheet-doc/types.rst \
+ doc/cpp/spreadsheet-doc/view.rst \
+ doc/doxygen.conf \
+ doc/environment.yml \
+ doc/index.rst \
+ doc/notes/index.rst \
+ doc/notes/json_map/example.json \
+ doc/notes/json_map/index.rst \
+ doc/notes/xml_map/example.xml \
+ doc/notes/xml_map/index.rst \
+ doc/overview/doc-orcus.rst \
+ doc/overview/doc-user.rst \
+ doc/overview/index.rst \
+ doc/overview/json.rst \
+ doc/overview/yaml.rst \
+ doc/python/index.rst \
+ doc/python/orcus/cell.rst \
+ doc/python/orcus/cell_type.rst \
+ doc/python/orcus/csv/index.rst \
+ doc/python/orcus/document.rst \
+ doc/python/orcus/format_type.rst \
+ doc/python/orcus/formula_token.rst \
+ doc/python/orcus/formula_token_op.rst \
+ doc/python/orcus/formula_token_type.rst \
+ doc/python/orcus/formula_tokens.rst \
+ doc/python/orcus/gnumeric/index.rst \
+ doc/python/orcus/index.rst \
+ doc/python/orcus/named_expressions.rst \
+ doc/python/orcus/ods/index.rst \
+ doc/python/orcus/sheet.rst \
+ doc/python/orcus/sheet_rows.rst \
+ doc/python/orcus/tools/bugzilla.rst \
+ doc/python/orcus/tools/file_processor.rst \
+ doc/python/orcus/tools/index.rst \
+ doc/python/orcus/xls_xml/index.rst \
+ doc/python/orcus/xlsx/index.rst \
+ doc/requirements.txt
+
+doc_example_data = \
+ doc_example/Makefile.am \
+ doc_example/files/document.ods \
+ doc_example/files/multi-sheets.ods \
+ doc_example/json_doc_1.cpp \
+ doc_example/json_doc_2.cpp \
+ doc_example/json_parser_1.cpp \
+ doc_example/spreadsheet_doc_1.cpp \
+ doc_example/spreadsheet_doc_1_num_and_formula.cpp \
+ doc_example/spreadsheet_doc_2.cpp \
+ doc_example/spreadsheet_doc_2_sheets_no_string_pool.cpp \
+ doc_example/spreadsheet_doc_2_sheets_with_formula.cpp \
+ doc_example/spreadsheet_doc_2_sheets_with_string_pool.cpp \
+ doc_example/xml_mapping_1.cpp
+
+bin_data = \
+ bin/build-extra-dist.sh \
+ bin/env-osx.sh \
+ bin/gen-cli-docs.py \
+ bin/gen-files.py \
+ bin/gen-gfm-release-table.sh \
+ bin/gen-test-json-structure-outputs.sh \
+ bin/gen-test-xml-outputs.sh \
+ bin/run-bulk-tests.py \
+ bin/run-python.sh \
+ bin/unpack-zipped-xml.sh
+
+misc_data = \
+ misc/arrow-parquet/arrow-test.cpp \
+ misc/arrow-parquet/dump-parquet.py \
+ misc/arrow-parquet/gen-parquet-test-files.py \
+ misc/character-set/data.csv \
+ misc/character-set/gen-enum.py \
+ misc/file-processor-modules/preview.py \
+ misc/notes/column-width-and-row-height.txt \
+ misc/notes/zlib-in-memory-gzip.txt \
+ misc/xml-tokens/dump-xsd-keys.py \
+ misc/xml-tokens/gen-gnumeric-tokens.py \
+ misc/xml-tokens/gen-odf-tokens.py \
+ misc/xml-tokens/gen-ooxml-tokens.py \
+ misc/xml-tokens/gen-tokens.py \
+ misc/xml-tokens/gnumeric.xsd \
+ misc/xml-tokens/ooxml-extra-tokens.txt \
+ misc/xml-tokens/token_util.py \
+ misc/xml-tokens/xls-xml-tokens.txt
+
+slickedit_data = \
+ slickedit/cmake.vpj \
+ slickedit/cpp.vpj \
+ slickedit/doc.vpj \
+ slickedit/orcus.vpw \
+ slickedit/orcus_cpp.h \
+ slickedit/python.vpj \
+ slickedit/sh.vpj \
+ slickedit/token-gen.vpj
+
+test_data = \
+ test/css/basic1.css \
+ test/css/basic10.css \
+ test/css/basic11.css \
+ test/css/basic12.css \
+ test/css/basic13.css \
+ test/css/basic14.css \
+ test/css/basic2.css \
+ test/css/basic3.css \
+ test/css/basic4.css \
+ test/css/basic5.css \
+ test/css/basic6.css \
+ test/css/basic7.css \
+ test/css/basic8.css \
+ test/css/basic9.css \
+ test/css/chained1.css \
+ test/css/chained2.css \
+ test/css/complex/callout.css \
+ test/css/complex/excel-html.css \
+ test/css/empty.css \
+ test/css/invalids/1.css \
+ test/css/test.css \
+ test/css/utf8-1.css \
+ test/csv/double-quotes/check.txt \
+ test/csv/double-quotes/input.csv \
+ test/csv/normal-quotes/check.txt \
+ test/csv/normal-quotes/input.csv \
+ test/csv/quoted-with-delim/check.txt \
+ test/csv/quoted-with-delim/input.csv \
+ test/csv/simple-numbers/check.txt \
+ test/csv/simple-numbers/input.csv \
+ test/csv/split-sheet/check-1.txt \
+ test/csv/split-sheet/check-2.txt \
+ test/csv/split-sheet/check-3.txt \
+ test/csv/split-sheet/input.csv \
+ test/gnumeric/background-color/standard.gnumeric \
+ test/gnumeric/borders/colors.gnumeric \
+ test/gnumeric/borders/directions.gnumeric \
+ test/gnumeric/borders/grid-box.gnumeric \
+ test/gnumeric/borders/single-cells.gnumeric \
+ test/gnumeric/cell-properties/wrap-and-shrink.gnumeric \
+ test/gnumeric/cell-value-types/check.txt \
+ test/gnumeric/cell-value-types/input.gnumeric \
+ test/gnumeric/colored-text/input.gnumeric \
+ test/gnumeric/column-width-row-height/input.gnumeric \
+ test/gnumeric/formula-cells/check.txt \
+ test/gnumeric/formula-cells/input.gnumeric \
+ test/gnumeric/hidden-rows-columns/input.gnumeric \
+ test/gnumeric/merged-cells/input.gnumeric \
+ test/gnumeric/named-expression-sheet-local/check.txt \
+ test/gnumeric/named-expression-sheet-local/input.gnumeric \
+ test/gnumeric/named-expression/check.txt \
+ test/gnumeric/named-expression/input.gnumeric \
+ test/gnumeric/number-formats/input.gnumeric \
+ test/gnumeric/raw-values-1/check.txt \
+ test/gnumeric/raw-values-1/input.gnumeric \
+ test/gnumeric/table/autofilter.gnumeric \
+ test/gnumeric/test.gnumeric \
+ test/gnumeric/text-alignment/input.gnumeric \
+ test/gnumeric/text-formats/input.gnumeric \
+ test/json-mapped/array-of-arrays-basic/check.txt \
+ test/json-mapped/array-of-arrays-basic/input.json \
+ test/json-mapped/array-of-arrays-basic/map.json \
+ test/json-mapped/array-of-arrays-header/check.txt \
+ test/json-mapped/array-of-arrays-header/input.json \
+ test/json-mapped/array-of-arrays-header/map.json \
+ test/json-mapped/array-of-objects-basic/check.txt \
+ test/json-mapped/array-of-objects-basic/input.json \
+ test/json-mapped/array-of-objects-basic/map.json \
+ test/json-mapped/array-of-objects-header/check.txt \
+ test/json-mapped/array-of-objects-header/input.json \
+ test/json-mapped/array-of-objects-header/map.json \
+ test/json-mapped/nested-repeats-2/check.txt \
+ test/json-mapped/nested-repeats-2/input.json \
+ test/json-mapped/nested-repeats-2/map.json \
+ test/json-mapped/nested-repeats/check.txt \
+ test/json-mapped/nested-repeats/input.json \
+ test/json-mapped/nested-repeats/map.json \
+ test/json-structure/arrays-in-object/check.txt \
+ test/json-structure/arrays-in-object/input.json \
+ test/json-structure/multiple-ranges/check.txt \
+ test/json-structure/multiple-ranges/input.json \
+ test/json-structure/nested-arrays-mixed-2/check.txt \
+ test/json-structure/nested-arrays-mixed-2/input.json \
+ test/json-structure/nested-arrays-mixed/check.txt \
+ test/json-structure/nested-arrays-mixed/input.json \
+ test/json-structure/nested-arrays/check.txt \
+ test/json-structure/nested-arrays/input.json \
+ test/json-structure/no-value-nodes/01.json \
+ test/json-structure/no-value-nodes/02.json \
+ test/json-structure/no-value-nodes/03.json \
+ test/json-structure/no-value-nodes/04.json \
+ test/json-structure/repeat-objects-2/check.txt \
+ test/json-structure/repeat-objects-2/input.json \
+ test/json-structure/repeat-objects/check.txt \
+ test/json-structure/repeat-objects/input.json \
+ test/json/basic1/check.txt \
+ test/json/basic1/input.json \
+ test/json/basic1/output.yaml \
+ test/json/basic2/check.txt \
+ test/json/basic2/input.json \
+ test/json/basic2/output.yaml \
+ test/json/basic3/check.txt \
+ test/json/basic3/input.json \
+ test/json/basic3/output.yaml \
+ test/json/basic4/check.txt \
+ test/json/basic4/input.json \
+ test/json/basic4/output.yaml \
+ test/json/empty-array-1/check.txt \
+ test/json/empty-array-1/input.json \
+ test/json/empty-array-2/check.txt \
+ test/json/empty-array-2/input.json \
+ test/json/empty-array-3/check.txt \
+ test/json/empty-array-3/input.json \
+ test/json/nested1/check.txt \
+ test/json/nested1/input.json \
+ test/json/nested1/output.yaml \
+ test/json/nested2/check.txt \
+ test/json/nested2/input.json \
+ test/json/nested2/output.yaml \
+ test/json/refs1/check.txt \
+ test/json/refs1/input.json \
+ test/json/refs1/ref.json \
+ test/json/swagger/check.txt \
+ test/json/swagger/input.json \
+ test/json/swagger/output.yaml \
+ test/json/to-yaml-1/check.txt \
+ test/json/to-yaml-1/input.json \
+ test/json/to-yaml-1/output.yaml \
+ test/json/validation/LICENSE \
+ test/json/validation/README \
+ test/json/validation/i_number_double_huge_neg_exp.json \
+ test/json/validation/i_number_huge_exp.json \
+ test/json/validation/i_number_neg_int_huge_exp.json \
+ test/json/validation/i_number_pos_double_huge_exp.json \
+ test/json/validation/i_number_real_neg_overflow.json \
+ test/json/validation/i_number_real_pos_overflow.json \
+ test/json/validation/i_number_real_underflow.json \
+ test/json/validation/i_number_too_big_neg_int.json \
+ test/json/validation/i_number_too_big_pos_int.json \
+ test/json/validation/i_number_very_big_negative_int.json \
+ test/json/validation/i_object_key_lone_2nd_surrogate.json \
+ test/json/validation/i_string_1st_surrogate_but_2nd_missing.json \
+ test/json/validation/i_string_1st_valid_surrogate_2nd_invalid.json \
+ test/json/validation/i_string_UTF-16LE_with_BOM.json \
+ test/json/validation/i_string_UTF-8_invalid_sequence.json \
+ test/json/validation/i_string_UTF8_surrogate_U+D800.json \
+ test/json/validation/i_string_incomplete_surrogate_and_escape_valid.json \
+ test/json/validation/i_string_incomplete_surrogate_pair.json \
+ test/json/validation/i_string_incomplete_surrogates_escape_valid.json \
+ test/json/validation/i_string_invalid_lonely_surrogate.json \
+ test/json/validation/i_string_invalid_surrogate.json \
+ test/json/validation/i_string_invalid_utf-8.json \
+ test/json/validation/i_string_inverted_surrogates_U+1D11E.json \
+ test/json/validation/i_string_iso_latin_1.json \
+ test/json/validation/i_string_lone_second_surrogate.json \
+ test/json/validation/i_string_lone_utf8_continuation_byte.json \
+ test/json/validation/i_string_not_in_unicode_range.json \
+ test/json/validation/i_string_overlong_sequence_2_bytes.json \
+ test/json/validation/i_string_overlong_sequence_6_bytes.json \
+ test/json/validation/i_string_overlong_sequence_6_bytes_null.json \
+ test/json/validation/i_string_truncated-utf-8.json \
+ test/json/validation/i_string_utf16BE_no_BOM.json \
+ test/json/validation/i_string_utf16LE_no_BOM.json \
+ test/json/validation/i_structure_500_nested_arrays.json \
+ test/json/validation/i_structure_UTF-8_BOM_empty_object.json \
+ test/json/validation/n_array_1_true_without_comma.json \
+ test/json/validation/n_array_a_invalid_utf8.json \
+ test/json/validation/n_array_colon_instead_of_comma.json \
+ test/json/validation/n_array_comma_after_close.json \
+ test/json/validation/n_array_comma_and_number.json \
+ test/json/validation/n_array_double_comma.json \
+ test/json/validation/n_array_double_extra_comma.json \
+ test/json/validation/n_array_extra_close.json \
+ test/json/validation/n_array_extra_comma.json \
+ test/json/validation/n_array_incomplete.json \
+ test/json/validation/n_array_incomplete_invalid_value.json \
+ test/json/validation/n_array_inner_array_no_comma.json \
+ test/json/validation/n_array_invalid_utf8.json \
+ test/json/validation/n_array_items_separated_by_semicolon.json \
+ test/json/validation/n_array_just_comma.json \
+ test/json/validation/n_array_just_minus.json \
+ test/json/validation/n_array_missing_value.json \
+ test/json/validation/n_array_newlines_unclosed.json \
+ test/json/validation/n_array_number_and_comma.json \
+ test/json/validation/n_array_number_and_several_commas.json \
+ test/json/validation/n_array_spaces_vertical_tab_formfeed.json \
+ test/json/validation/n_array_star_inside.json \
+ test/json/validation/n_array_unclosed.json \
+ test/json/validation/n_array_unclosed_trailing_comma.json \
+ test/json/validation/n_array_unclosed_with_new_lines.json \
+ test/json/validation/n_array_unclosed_with_object_inside.json \
+ test/json/validation/n_incomplete_false.json \
+ test/json/validation/n_incomplete_null.json \
+ test/json/validation/n_incomplete_true.json \
+ test/json/validation/n_multidigit_number_then_00.json \
+ test/json/validation/n_number_++.json \
+ test/json/validation/n_number_+1.json \
+ test/json/validation/n_number_+Inf.json \
+ test/json/validation/n_number_-01.json \
+ test/json/validation/n_number_-1.0..json \
+ test/json/validation/n_number_-2..json \
+ test/json/validation/n_number_-NaN.json \
+ test/json/validation/n_number_.-1.json \
+ test/json/validation/n_number_.2e-3.json \
+ test/json/validation/n_number_0.1.2.json \
+ test/json/validation/n_number_0.3e+.json \
+ test/json/validation/n_number_0.3e.json \
+ test/json/validation/n_number_0.e1.json \
+ test/json/validation/n_number_0_capital_E+.json \
+ test/json/validation/n_number_0_capital_E.json \
+ test/json/validation/n_number_0e+.json \
+ test/json/validation/n_number_0e.json \
+ test/json/validation/n_number_1.0e+.json \
+ test/json/validation/n_number_1.0e-.json \
+ test/json/validation/n_number_1.0e.json \
+ test/json/validation/n_number_1_000.json \
+ test/json/validation/n_number_1eE2.json \
+ test/json/validation/n_number_2.e+3.json \
+ test/json/validation/n_number_2.e-3.json \
+ test/json/validation/n_number_2.e3.json \
+ test/json/validation/n_number_9.e+.json \
+ test/json/validation/n_number_Inf.json \
+ test/json/validation/n_number_NaN.json \
+ test/json/validation/n_number_U+FF11_fullwidth_digit_one.json \
+ test/json/validation/n_number_expression.json \
+ test/json/validation/n_number_hex_1_digit.json \
+ test/json/validation/n_number_hex_2_digits.json \
+ test/json/validation/n_number_infinity.json \
+ test/json/validation/n_number_invalid+-.json \
+ test/json/validation/n_number_invalid-negative-real.json \
+ test/json/validation/n_number_invalid-utf-8-in-bigger-int.json \
+ test/json/validation/n_number_invalid-utf-8-in-exponent.json \
+ test/json/validation/n_number_invalid-utf-8-in-int.json \
+ test/json/validation/n_number_minus_infinity.json \
+ test/json/validation/n_number_minus_sign_with_trailing_garbage.json \
+ test/json/validation/n_number_minus_space_1.json \
+ test/json/validation/n_number_neg_int_starting_with_zero.json \
+ test/json/validation/n_number_neg_real_without_int_part.json \
+ test/json/validation/n_number_neg_with_garbage_at_end.json \
+ test/json/validation/n_number_real_garbage_after_e.json \
+ test/json/validation/n_number_real_with_invalid_utf8_after_e.json \
+ test/json/validation/n_number_real_without_fractional_part.json \
+ test/json/validation/n_number_starting_with_dot.json \
+ test/json/validation/n_number_with_alpha.json \
+ test/json/validation/n_number_with_alpha_char.json \
+ test/json/validation/n_number_with_leading_zero.json \
+ test/json/validation/n_object_bad_value.json \
+ test/json/validation/n_object_bracket_key.json \
+ test/json/validation/n_object_comma_instead_of_colon.json \
+ test/json/validation/n_object_double_colon.json \
+ test/json/validation/n_object_emoji.json \
+ test/json/validation/n_object_garbage_at_end.json \
+ test/json/validation/n_object_key_with_single_quotes.json \
+ test/json/validation/n_object_lone_continuation_byte_in_key_and_trailing_comma.json \
+ test/json/validation/n_object_missing_colon.json \
+ test/json/validation/n_object_missing_key.json \
+ test/json/validation/n_object_missing_semicolon.json \
+ test/json/validation/n_object_missing_value.json \
+ test/json/validation/n_object_no-colon.json \
+ test/json/validation/n_object_non_string_key.json \
+ test/json/validation/n_object_non_string_key_but_huge_number_instead.json \
+ test/json/validation/n_object_repeated_null_null.json \
+ test/json/validation/n_object_several_trailing_commas.json \
+ test/json/validation/n_object_single_quote.json \
+ test/json/validation/n_object_trailing_comma.json \
+ test/json/validation/n_object_trailing_comment.json \
+ test/json/validation/n_object_trailing_comment_open.json \
+ test/json/validation/n_object_trailing_comment_slash_open.json \
+ test/json/validation/n_object_trailing_comment_slash_open_incomplete.json \
+ test/json/validation/n_object_two_commas_in_a_row.json \
+ test/json/validation/n_object_unquoted_key.json \
+ test/json/validation/n_object_unterminated-value.json \
+ test/json/validation/n_object_with_single_string.json \
+ test/json/validation/n_object_with_trailing_garbage.json \
+ test/json/validation/n_single_space.json \
+ test/json/validation/n_string_1_surrogate_then_escape.json \
+ test/json/validation/n_string_1_surrogate_then_escape_u.json \
+ test/json/validation/n_string_1_surrogate_then_escape_u1.json \
+ test/json/validation/n_string_1_surrogate_then_escape_u1x.json \
+ test/json/validation/n_string_accentuated_char_no_quotes.json \
+ test/json/validation/n_string_backslash_00.json \
+ test/json/validation/n_string_escape_x.json \
+ test/json/validation/n_string_escaped_backslash_bad.json \
+ test/json/validation/n_string_escaped_ctrl_char_tab.json \
+ test/json/validation/n_string_escaped_emoji.json \
+ test/json/validation/n_string_incomplete_escape.json \
+ test/json/validation/n_string_incomplete_escaped_character.json \
+ test/json/validation/n_string_incomplete_surrogate.json \
+ test/json/validation/n_string_incomplete_surrogate_escape_invalid.json \
+ test/json/validation/n_string_invalid-utf-8-in-escape.json \
+ test/json/validation/n_string_invalid_backslash_esc.json \
+ test/json/validation/n_string_invalid_unicode_escape.json \
+ test/json/validation/n_string_invalid_utf8_after_escape.json \
+ test/json/validation/n_string_leading_uescaped_thinspace.json \
+ test/json/validation/n_string_no_quotes_with_bad_escape.json \
+ test/json/validation/n_string_single_doublequote.json \
+ test/json/validation/n_string_single_quote.json \
+ test/json/validation/n_string_single_string_no_double_quotes.json \
+ test/json/validation/n_string_start_escape_unclosed.json \
+ test/json/validation/n_string_unescaped_crtl_char.json \
+ test/json/validation/n_string_unescaped_newline.json \
+ test/json/validation/n_string_unescaped_tab.json \
+ test/json/validation/n_string_unicode_CapitalU.json \
+ test/json/validation/n_string_with_trailing_garbage.json \
+ test/json/validation/n_structure_100000_opening_arrays.json \
+ test/json/validation/n_structure_U+2060_word_joined.json \
+ test/json/validation/n_structure_UTF8_BOM_no_data.json \
+ test/json/validation/n_structure_angle_bracket_..json \
+ test/json/validation/n_structure_angle_bracket_null.json \
+ test/json/validation/n_structure_array_trailing_garbage.json \
+ test/json/validation/n_structure_array_with_extra_array_close.json \
+ test/json/validation/n_structure_array_with_unclosed_string.json \
+ test/json/validation/n_structure_ascii-unicode-identifier.json \
+ test/json/validation/n_structure_capitalized_True.json \
+ test/json/validation/n_structure_close_unopened_array.json \
+ test/json/validation/n_structure_comma_instead_of_closing_brace.json \
+ test/json/validation/n_structure_double_array.json \
+ test/json/validation/n_structure_end_array.json \
+ test/json/validation/n_structure_incomplete_UTF8_BOM.json \
+ test/json/validation/n_structure_lone-invalid-utf-8.json \
+ test/json/validation/n_structure_lone-open-bracket.json \
+ test/json/validation/n_structure_no_data.json \
+ test/json/validation/n_structure_null-byte-outside-string.json \
+ test/json/validation/n_structure_number_with_trailing_garbage.json \
+ test/json/validation/n_structure_object_followed_by_closing_object.json \
+ test/json/validation/n_structure_object_unclosed_no_value.json \
+ test/json/validation/n_structure_object_with_comment.json \
+ test/json/validation/n_structure_object_with_trailing_garbage.json \
+ test/json/validation/n_structure_open_array_apostrophe.json \
+ test/json/validation/n_structure_open_array_comma.json \
+ test/json/validation/n_structure_open_array_object.json \
+ test/json/validation/n_structure_open_array_open_object.json \
+ test/json/validation/n_structure_open_array_open_string.json \
+ test/json/validation/n_structure_open_array_string.json \
+ test/json/validation/n_structure_open_object.json \
+ test/json/validation/n_structure_open_object_close_array.json \
+ test/json/validation/n_structure_open_object_comma.json \
+ test/json/validation/n_structure_open_object_open_array.json \
+ test/json/validation/n_structure_open_object_open_string.json \
+ test/json/validation/n_structure_open_object_string_with_apostrophes.json \
+ test/json/validation/n_structure_open_open.json \
+ test/json/validation/n_structure_single_eacute.json \
+ test/json/validation/n_structure_single_star.json \
+ test/json/validation/n_structure_trailing_\#.json \
+ test/json/validation/n_structure_uescaped_LF_before_string.json \
+ test/json/validation/n_structure_unclosed_array.json \
+ test/json/validation/n_structure_unclosed_array_partial_null.json \
+ test/json/validation/n_structure_unclosed_array_unfinished_false.json \
+ test/json/validation/n_structure_unclosed_array_unfinished_true.json \
+ test/json/validation/n_structure_unclosed_object.json \
+ test/json/validation/n_structure_unicode-identifier.json \
+ test/json/validation/n_structure_whitespace_U+2060_word_joiner.json \
+ test/json/validation/n_structure_whitespace_formfeed.json \
+ test/json/validation/y_array_arraysWithSpaces.json \
+ test/json/validation/y_array_empty-string.json \
+ test/json/validation/y_array_empty.json \
+ test/json/validation/y_array_ending_with_newline.json \
+ test/json/validation/y_array_false.json \
+ test/json/validation/y_array_heterogeneous.json \
+ test/json/validation/y_array_null.json \
+ test/json/validation/y_array_with_1_and_newline.json \
+ test/json/validation/y_array_with_leading_space.json \
+ test/json/validation/y_array_with_several_null.json \
+ test/json/validation/y_array_with_trailing_space.json \
+ test/json/validation/y_number.json \
+ test/json/validation/y_number_0e+1.json \
+ test/json/validation/y_number_0e1.json \
+ test/json/validation/y_number_after_space.json \
+ test/json/validation/y_number_double_close_to_zero.json \
+ test/json/validation/y_number_int_with_exp.json \
+ test/json/validation/y_number_minus_zero.json \
+ test/json/validation/y_number_negative_int.json \
+ test/json/validation/y_number_negative_one.json \
+ test/json/validation/y_number_negative_zero.json \
+ test/json/validation/y_number_real_capital_e.json \
+ test/json/validation/y_number_real_capital_e_neg_exp.json \
+ test/json/validation/y_number_real_capital_e_pos_exp.json \
+ test/json/validation/y_number_real_exponent.json \
+ test/json/validation/y_number_real_fraction_exponent.json \
+ test/json/validation/y_number_real_neg_exp.json \
+ test/json/validation/y_number_real_pos_exponent.json \
+ test/json/validation/y_number_simple_int.json \
+ test/json/validation/y_number_simple_real.json \
+ test/json/validation/y_object.json \
+ test/json/validation/y_object_basic.json \
+ test/json/validation/y_object_duplicated_key.json \
+ test/json/validation/y_object_duplicated_key_and_value.json \
+ test/json/validation/y_object_empty.json \
+ test/json/validation/y_object_empty_key.json \
+ test/json/validation/y_object_escaped_null_in_key.json \
+ test/json/validation/y_object_extreme_numbers.json \
+ test/json/validation/y_object_long_strings.json \
+ test/json/validation/y_object_simple.json \
+ test/json/validation/y_object_string_unicode.json \
+ test/json/validation/y_object_with_newlines.json \
+ test/json/validation/y_string_1_2_3_bytes_UTF-8_sequences.json \
+ test/json/validation/y_string_accepted_surrogate_pair.json \
+ test/json/validation/y_string_accepted_surrogate_pairs.json \
+ test/json/validation/y_string_allowed_escapes.json \
+ test/json/validation/y_string_backslash_and_u_escaped_zero.json \
+ test/json/validation/y_string_backslash_doublequotes.json \
+ test/json/validation/y_string_comments.json \
+ test/json/validation/y_string_double_escape_a.json \
+ test/json/validation/y_string_double_escape_n.json \
+ test/json/validation/y_string_escaped_control_character.json \
+ test/json/validation/y_string_escaped_noncharacter.json \
+ test/json/validation/y_string_in_array.json \
+ test/json/validation/y_string_in_array_with_leading_space.json \
+ test/json/validation/y_string_last_surrogates_1_and_2.json \
+ test/json/validation/y_string_nbsp_uescaped.json \
+ test/json/validation/y_string_nonCharacterInUTF-8_U+10FFFF.json \
+ test/json/validation/y_string_nonCharacterInUTF-8_U+FFFF.json \
+ test/json/validation/y_string_null_escape.json \
+ test/json/validation/y_string_one-byte-utf-8.json \
+ test/json/validation/y_string_pi.json \
+ test/json/validation/y_string_reservedCharacterInUTF-8_U+1BFFF.json \
+ test/json/validation/y_string_simple_ascii.json \
+ test/json/validation/y_string_space.json \
+ test/json/validation/y_string_surrogates_U+1D11E_MUSICAL_SYMBOL_G_CLEF.json \
+ test/json/validation/y_string_three-byte-utf-8.json \
+ test/json/validation/y_string_two-byte-utf-8.json \
+ test/json/validation/y_string_u+2028_line_sep.json \
+ test/json/validation/y_string_u+2029_par_sep.json \
+ test/json/validation/y_string_uEscape.json \
+ test/json/validation/y_string_uescaped_newline.json \
+ test/json/validation/y_string_unescaped_char_delete.json \
+ test/json/validation/y_string_unicode.json \
+ test/json/validation/y_string_unicodeEscapedBackslash.json \
+ test/json/validation/y_string_unicode_2.json \
+ test/json/validation/y_string_unicode_U+10FFFE_nonchar.json \
+ test/json/validation/y_string_unicode_U+1FFFE_nonchar.json \
+ test/json/validation/y_string_unicode_U+200B_ZERO_WIDTH_SPACE.json \
+ test/json/validation/y_string_unicode_U+2064_invisible_plus.json \
+ test/json/validation/y_string_unicode_U+FDD0_nonchar.json \
+ test/json/validation/y_string_unicode_U+FFFE_nonchar.json \
+ test/json/validation/y_string_unicode_escaped_double_quote.json \
+ test/json/validation/y_string_utf8.json \
+ test/json/validation/y_string_with_del_character.json \
+ test/json/validation/y_structure_lonely_false.json \
+ test/json/validation/y_structure_lonely_int.json \
+ test/json/validation/y_structure_lonely_negative_real.json \
+ test/json/validation/y_structure_lonely_null.json \
+ test/json/validation/y_structure_lonely_string.json \
+ test/json/validation/y_structure_lonely_true.json \
+ test/json/validation/y_structure_string_empty.json \
+ test/json/validation/y_structure_trailing_newline.json \
+ test/json/validation/y_structure_true_in_array.json \
+ test/json/validation/y_structure_whitespace_array.json \
+ test/ods/borders/grid-box.ods \
+ test/ods/borders/single-cells.ods \
+ test/ods/cell-properties/wrap-and-shrink.ods \
+ test/ods/column-width-row-height/input.ods \
+ test/ods/date-cell/input.ods \
+ test/ods/formatted-text/bold-and-italic.ods \
+ test/ods/formula-1/check.txt \
+ test/ods/formula-1/input.ods \
+ test/ods/formula-2/check.txt \
+ test/ods/formula-2/input.ods \
+ test/ods/import-styles/cell-protection.xml \
+ test/ods/import-styles/cell-styles.xml \
+ test/ods/import-styles/standard-styles.xml \
+ test/ods/japanese.ods \
+ test/ods/named-expression-sheet-local/check.txt \
+ test/ods/named-expression-sheet-local/input.ods \
+ test/ods/named-expression/check.txt \
+ test/ods/named-expression/input.ods \
+ test/ods/named-range/check.txt \
+ test/ods/named-range/input.ods \
+ test/ods/number-format/basic-set.ods \
+ test/ods/raw-values-1/check.txt \
+ test/ods/raw-values-1/input.ods \
+ test/ods/styles/asian-complex.ods \
+ test/ods/styles/column-styles.ods \
+ test/ods/styles/direct-format.ods \
+ test/ods/styles/text-underlines.ods \
+ test/ods/test.ods \
+ test/parquet/basic/basic-gzip.parquet \
+ test/parquet/basic/basic-gzip.parquet.check \
+ test/parquet/basic/basic-nocomp.parquet \
+ test/parquet/basic/basic-nocomp.parquet.check \
+ test/parquet/basic/basic-snappy.parquet \
+ test/parquet/basic/basic-snappy.parquet.check \
+ test/parquet/basic/basic-zstd.parquet \
+ test/parquet/basic/basic-zstd.parquet.check \
+ test/parquet/basic/float-with-nan.parquet \
+ test/parquet/basic/float-with-nan.parquet.check \
+ test/python/env.json.in \
+ test/python/file_load_common.py \
+ test/python/perf/test_json.py \
+ test/python/test_csv.py \
+ test/python/test_csv_export.py \
+ test/python/test_gnumeric.py \
+ test/python/test_json.py \
+ test/python/test_module.py \
+ test/python/test_ods.py \
+ test/python/test_xls_xml.py \
+ test/python/test_xlsx.py \
+ test/xls-xml/background-color/standard.xml \
+ test/xls-xml/basic-utf-16-be/check.txt \
+ test/xls-xml/basic-utf-16-be/input.xml \
+ test/xls-xml/basic-utf-16-le/check.txt \
+ test/xls-xml/basic-utf-16-le/input.xml \
+ test/xls-xml/basic/check.txt \
+ test/xls-xml/basic/input.xml \
+ test/xls-xml/bold-and-italic/check.txt \
+ test/xls-xml/bold-and-italic/input.xml \
+ test/xls-xml/borders/colors.xml \
+ test/xls-xml/borders/directions.xml \
+ test/xls-xml/borders/grid-box.xml \
+ test/xls-xml/borders/single-cells.xml \
+ test/xls-xml/cell-properties/default-style.xml \
+ test/xls-xml/cell-properties/locked-and-hidden.xml \
+ test/xls-xml/cell-properties/wrap-and-shrink.xml \
+ test/xls-xml/character-set/input.xml \
+ test/xls-xml/colored-text/check.txt \
+ test/xls-xml/colored-text/input.xml \
+ test/xls-xml/column-width-row-height/input.xml \
+ test/xls-xml/date-time/input.xml \
+ test/xls-xml/double-bom/input.xml \
+ test/xls-xml/empty-rows/check.txt \
+ test/xls-xml/empty-rows/input.xml \
+ test/xls-xml/formatted-text/basic.xml \
+ test/xls-xml/formula-array-1/check.txt \
+ test/xls-xml/formula-array-1/input.xml \
+ test/xls-xml/formula-cells-1/check.txt \
+ test/xls-xml/formula-cells-1/input.xml \
+ test/xls-xml/formula-cells-2/check.txt \
+ test/xls-xml/formula-cells-2/config.yaml \
+ test/xls-xml/formula-cells-2/input.xml \
+ test/xls-xml/formula-cells-3/check.txt \
+ test/xls-xml/formula-cells-3/input.xml \
+ test/xls-xml/formula-cells-parse-error/input.xml \
+ test/xls-xml/hidden-rows-columns/input.xml \
+ test/xls-xml/invalid-sub-structure/check.txt \
+ test/xls-xml/invalid-sub-structure/input.xml \
+ test/xls-xml/leading-whitespace/check.txt \
+ test/xls-xml/leading-whitespace/input.xml \
+ test/xls-xml/matrix-results/input.xml \
+ test/xls-xml/merged-cells/check.txt \
+ test/xls-xml/merged-cells/input.xml \
+ test/xls-xml/named-colors/check.txt \
+ test/xls-xml/named-colors/input-upper.xml \
+ test/xls-xml/named-colors/input.xml \
+ test/xls-xml/named-colors/run.py \
+ test/xls-xml/named-colors/saved-by-excel.xml \
+ test/xls-xml/named-expression-sheet-local/check.txt \
+ test/xls-xml/named-expression-sheet-local/input.xml \
+ test/xls-xml/named-expression/check.txt \
+ test/xls-xml/named-expression/input.xml \
+ test/xls-xml/number-format/date-time.xml \
+ test/xls-xml/raw-values-1/check.txt \
+ test/xls-xml/raw-values-1/input.xml \
+ test/xls-xml/styles/column-styles.xml \
+ test/xls-xml/styles/data-offset.xml \
+ test/xls-xml/styles/direct-format.xml \
+ test/xls-xml/table-offset/check.txt \
+ test/xls-xml/table-offset/input.xml \
+ test/xls-xml/table/autofilter.xml \
+ test/xls-xml/text-alignment/input.xml \
+ test/xls-xml/unnamed-parent-styles/input.xml \
+ test/xls-xml/unnamed-parent-styles/check.txt \
+ test/xls-xml/view/cursor-per-sheet.xml \
+ test/xls-xml/view/cursor-split-pane.xml \
+ test/xls-xml/view/frozen-pane.xml \
+ test/xlsx/background-color/standard.xlsx \
+ test/xlsx/boolean-values/check.txt \
+ test/xlsx/boolean-values/input.xlsx \
+ test/xlsx/borders/colors.xlsx \
+ test/xlsx/borders/directions.xlsx \
+ test/xlsx/borders/grid-box.xlsx \
+ test/xlsx/borders/single-cells.xlsx \
+ test/xlsx/cell-properties/wrap-and-shrink.xlsx \
+ test/xlsx/column-width-row-height/input.xlsx \
+ test/xlsx/conditional-format/basic.xlsx \
+ test/xlsx/conditional-format/data-bars.xlsx \
+ test/xlsx/data-table/multi-table.xlsx \
+ test/xlsx/data-table/one-variable.xlsx \
+ test/xlsx/date-cell/input.xlsx \
+ test/xlsx/date-time/input.xlsx \
+ test/xlsx/doc-structure/unordered-sheet-positions.xlsx \
+ test/xlsx/empty-shared-strings/check.txt \
+ test/xlsx/empty-shared-strings/input.xlsx \
+ test/xlsx/formatted-text/basic.xlsx \
+ test/xlsx/formatted-text/bold-and-italic.xlsx \
+ test/xlsx/formatted-text/colored-text.xlsx \
+ test/xlsx/formula-array-1/check.txt \
+ test/xlsx/formula-array-1/input.xlsx \
+ test/xlsx/formula-cells/check.txt \
+ test/xlsx/formula-cells/input.xlsx \
+ test/xlsx/formula-shared/check.txt \
+ test/xlsx/formula-shared/input.xlsx \
+ test/xlsx/formula-simple.xlsx \
+ test/xlsx/formula-with-string-results/check.txt \
+ test/xlsx/formula-with-string-results/input.xlsx \
+ test/xlsx/hidden-rows-columns/input.xlsx \
+ test/xlsx/matrix-results/input.xlsx \
+ test/xlsx/merged-cells/simple.xlsx \
+ test/xlsx/named-expression-relative/input.xlsx \
+ test/xlsx/named-expression-sheet-local/check.txt \
+ test/xlsx/named-expression-sheet-local/input.xlsx \
+ test/xlsx/named-expression/check.txt \
+ test/xlsx/named-expression/input.xlsx \
+ test/xlsx/number-format/date-time.xlsx \
+ test/xlsx/pivot-table/chart-simple.xlsx \
+ test/xlsx/pivot-table/error-values.xlsx \
+ test/xlsx/pivot-table/group-by-dates.xlsx \
+ test/xlsx/pivot-table/group-by-numbers.xlsx \
+ test/xlsx/pivot-table/group-field.xlsx \
+ test/xlsx/pivot-table/many-fields.xlsx \
+ test/xlsx/pivot-table/mixed-type-field.xlsx \
+ test/xlsx/pivot-table/three-pivot-tables-on-one-sheet.xlsx \
+ test/xlsx/pivot-table/two-pivot-caches.xlsx \
+ test/xlsx/pivot-table/two-tables-one-source.xlsx \
+ test/xlsx/raw-values-1/check.txt \
+ test/xlsx/raw-values-1/input.xlsx \
+ test/xlsx/revision/cell-change-basic.xlsx \
+ test/xlsx/styles/column-styles.xlsx \
+ test/xlsx/styles/direct-format.xlsx \
+ test/xlsx/table/autofilter-text-filter-1.xlsx \
+ test/xlsx/table/autofilter.xlsx \
+ test/xlsx/table/table-1.xlsx \
+ test/xlsx/table/table-2.xlsx \
+ test/xlsx/test.xlsx \
+ test/xlsx/text-alignment/input.xlsx \
+ test/xlsx/view/cursor-per-sheet.xlsx \
+ test/xlsx/view/cursor-split-pane.xlsx \
+ test/xlsx/view/frozen-pane.xlsx \
+ test/xml-mapped/attribute-basic/check-nomap.txt \
+ test/xml-mapped/attribute-basic/check.txt \
+ test/xml-mapped/attribute-basic/input.xml \
+ test/xml-mapped/attribute-basic/map.xml \
+ test/xml-mapped/attribute-namespace-2/check-nomap.txt \
+ test/xml-mapped/attribute-namespace-2/check.txt \
+ test/xml-mapped/attribute-namespace-2/input.xml \
+ test/xml-mapped/attribute-namespace-2/map.xml \
+ test/xml-mapped/attribute-namespace/check-nomap.txt \
+ test/xml-mapped/attribute-namespace/check.txt \
+ test/xml-mapped/attribute-namespace/input.xml \
+ test/xml-mapped/attribute-namespace/map.xml \
+ test/xml-mapped/attribute-range-self-close/check-nomap.txt \
+ test/xml-mapped/attribute-range-self-close/check.txt \
+ test/xml-mapped/attribute-range-self-close/input.xml \
+ test/xml-mapped/attribute-range-self-close/map.xml \
+ test/xml-mapped/attribute-single-element-2/check.txt \
+ test/xml-mapped/attribute-single-element-2/input.xml \
+ test/xml-mapped/attribute-single-element-2/map.xml \
+ test/xml-mapped/attribute-single-element/check.txt \
+ test/xml-mapped/attribute-single-element/input.xml \
+ test/xml-mapped/attribute-single-element/map.xml \
+ test/xml-mapped/content-basic/check-nomap.txt \
+ test/xml-mapped/content-basic/check.txt \
+ test/xml-mapped/content-basic/input.xml \
+ test/xml-mapped/content-basic/map.xml \
+ test/xml-mapped/content-namespace-2/check-nomap.txt \
+ test/xml-mapped/content-namespace-2/check.txt \
+ test/xml-mapped/content-namespace-2/input.xml \
+ test/xml-mapped/content-namespace-2/map.xml \
+ test/xml-mapped/content-namespace-3/check-nomap.txt \
+ test/xml-mapped/content-namespace-3/check.txt \
+ test/xml-mapped/content-namespace-3/input.xml \
+ test/xml-mapped/content-namespace-3/map.xml \
+ test/xml-mapped/content-namespace/check-nomap.txt \
+ test/xml-mapped/content-namespace/check.txt \
+ test/xml-mapped/content-namespace/input.xml \
+ test/xml-mapped/content-namespace/map.xml \
+ test/xml-mapped/content-one-column/check-nomap.txt \
+ test/xml-mapped/content-one-column/input.xml \
+ test/xml-mapped/custom-labels-2/check.txt \
+ test/xml-mapped/custom-labels-2/input.xml \
+ test/xml-mapped/custom-labels-2/map.xml \
+ test/xml-mapped/custom-labels/check.txt \
+ test/xml-mapped/custom-labels/input.xml \
+ test/xml-mapped/custom-labels/map.xml \
+ test/xml-mapped/encoding/euc-jp.xml \
+ test/xml-mapped/encoding/gbk.xml \
+ test/xml-mapped/encoding/utf-8.xml \
+ test/xml-mapped/fuel-economy/check-nomap.txt \
+ test/xml-mapped/fuel-economy/check.txt \
+ test/xml-mapped/fuel-economy/input.xml \
+ test/xml-mapped/fuel-economy/map.xml \
+ test/xml-mapped/invalids/map-defs/non-leaf-element-linked.xml \
+ test/xml-mapped/invalids/map-defs/not-xml.xml \
+ test/xml-mapped/nested-repeats-2/check-nomap.txt \
+ test/xml-mapped/nested-repeats-2/check.txt \
+ test/xml-mapped/nested-repeats-2/input.xml \
+ test/xml-mapped/nested-repeats-2/map.xml \
+ test/xml-mapped/nested-repeats-3/check-nomap.txt \
+ test/xml-mapped/nested-repeats-3/check.txt \
+ test/xml-mapped/nested-repeats-3/input.xml \
+ test/xml-mapped/nested-repeats-3/map.xml \
+ test/xml-mapped/nested-repeats-4/check-nomap.txt \
+ test/xml-mapped/nested-repeats-4/check.txt \
+ test/xml-mapped/nested-repeats-4/input.xml \
+ test/xml-mapped/nested-repeats-4/map.xml \
+ test/xml-mapped/nested-repeats/check-nomap.txt \
+ test/xml-mapped/nested-repeats/check.txt \
+ test/xml-mapped/nested-repeats/input.xml \
+ test/xml-mapped/nested-repeats/map.xml \
+ test/xml-structure/attribute-1/check.txt \
+ test/xml-structure/attribute-1/input.xml \
+ test/xml-structure/basic-1/check.txt \
+ test/xml-structure/basic-1/input.xml \
+ test/xml-structure/basic-2/check.txt \
+ test/xml-structure/basic-2/input.xml \
+ test/xml-structure/basic-3/check.txt \
+ test/xml-structure/basic-3/input.xml \
+ test/xml-structure/namespace-default/check.txt \
+ test/xml-structure/namespace-default/input.xml \
+ test/xml-structure/nested-repeat-1/check.txt \
+ test/xml-structure/nested-repeat-1/input.xml \
+ test/xml/bom/check.txt \
+ test/xml/bom/input.xml \
+ test/xml/cdata-1/check.txt \
+ test/xml/cdata-1/input.xml \
+ test/xml/custom-decl-1/check.txt \
+ test/xml/custom-decl-1/input.xml \
+ test/xml/default-ns/check.txt \
+ test/xml/default-ns/input.xml \
+ test/xml/doctype/html.xml \
+ test/xml/encoded-attrs/test1.xml \
+ test/xml/encoded-char/check.txt \
+ test/xml/encoded-char/input.xml \
+ test/xml/invalids/double-boms-and-invalid-byte.xml \
+ test/xml/invalids/only-bom.xml \
+ test/xml/invalids/only-double-boms.xml \
+ test/xml/invalids/partial-attr-value-with-encoding-char.xml \
+ test/xml/invalids/partial-open-element.xml \
+ test/xml/no-decl-1/check.txt \
+ test/xml/no-decl-1/input.xml \
+ test/xml/ns-alias-1/check.txt \
+ test/xml/ns-alias-1/input.xml \
+ test/xml/osm/street-in-aizu.osm \
+ test/xml/parse-only/rss/input.xml \
+ test/xml/self-closing-root/check.txt \
+ test/xml/self-closing-root/input.xml \
+ test/xml/simple/check.txt \
+ test/xml/simple/input.xml \
+ test/xml/single-quote/check.txt \
+ test/xml/single-quote/input.xml \
+ test/xml/underscore-identifier/check.txt \
+ test/xml/underscore-identifier/input.xml \
+ test/xml/utf8-1/check.txt \
+ test/xml/utf8-1/input.xml \
+ test/xml/utf8-2/check.txt \
+ test/xml/utf8-2/input.xml \
+ test/xml/valids/double-boms.xml \
+ test/yaml/basic1/input.yaml \
+ test/yaml/basic2/input.yaml \
+ test/yaml/basic3/input.yaml \
+ test/yaml/boolean/input.yaml \
+ test/yaml/empty-value-map-1/input.yaml \
+ test/yaml/empty-value-map-2/input.yaml \
+ test/yaml/empty-value-sequence-1/input.yaml \
+ test/yaml/empty-value-sequence-2/input.yaml \
+ test/yaml/invalids/1.yaml \
+ test/yaml/invalids/2.yaml \
+ test/yaml/invalids/3.yaml \
+ test/yaml/literal-block-1/input.yaml \
+ test/yaml/literal-block-2/input.yaml \
+ test/yaml/map-key-1/input.yaml \
+ test/yaml/multi-line-1/input.yaml \
+ test/yaml/multi-line-2/input.yaml \
+ test/yaml/null/input.yaml \
+ test/yaml/quoted-string/input.yaml \
+ test/yaml/swagger/input.yaml \
+ test/yaml/url/input.yaml
+
+EXTRA_DIST = \
+ CHANGELOG \
+ LICENSE \
+ README.md \
+ liborcus.pc.in \
+ autogen.sh \
+ $(bin_data) \
+ $(doc_data) \
+ $(doc_example_data) \
+ $(misc_data) \
+ $(slickedit_data) \
+ $(test_data)
+
+.PHONY: distclean-local dist-hook doc-doxygen doc-sphinx doc
+
+distclean-local:
+ rm -rf *.pc
+
+dist-hook:
+ git log --date=short --pretty="format:@%cd %an <%ae> [%H]%n%n%s%n%n%e%b" | sed -e "s|^\([^@]\)|\t\1|" -e "s|^@||" >$(distdir)/ChangeLog
+
+
+doc-doxygen:
+ @echo "Building documentation by doxygen..."
+ @cd doc && doxygen doxygen.conf
+
+doc-sphinx:
+ @echo "Building documentation by sphinx..."
+ @sphinx-build -b html ./doc/ ./doc/_build
+
+doc: doc-doxygen doc-sphinx
+
+doc-clean:
+ @rm -rf ./doc/_build ./doc/_doxygen
+
+
+
diff --git a/Makefile.in b/Makefile.in
new file mode 100644
index 0000000..606a2f6
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,1946 @@
+# Makefile.in generated by automake 1.16.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2021 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.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+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@
+@WITH_BENCHMARK_TRUE@am__append_1 = benchmark
+@WITH_DOC_EXAMPLE_TRUE@am__append_2 = doc_example
+@BUILD_SPREADSHEET_MODEL_TRUE@am__append_3 = liborcus-spreadsheet-model-@ORCUS_API_VERSION@.pc
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
+ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_17.m4 \
+ $(top_srcdir)/m4/boost.m4 $(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)/m4/m4_ax_valgrind_check.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
+ $(am__configure_deps) $(am__DIST_COMMON)
+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 = test/python/env.json
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+ ctags-recursive dvi-recursive html-recursive info-recursive \
+ install-data-recursive install-dvi-recursive \
+ install-exec-recursive install-html-recursive \
+ install-info-recursive install-pdf-recursive \
+ install-ps-recursive install-recursive installcheck-recursive \
+ installdirs-recursive pdf-recursive ps-recursive \
+ tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+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)$(pkgconfigdir)"
+DATA = $(pkgconfig_DATA)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
+ distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+ $(RECURSIVE_TARGETS) \
+ $(RECURSIVE_CLEAN_TARGETS) \
+ $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+ cscope distdir distdir-am dist dist-all distcheck
+am__extra_recursive_targets = check-valgrind-recursive \
+ check-valgrind-memcheck-recursive \
+ check-valgrind-helgrind-recursive check-valgrind-drd-recursive \
+ check-valgrind-sgcheck-recursive
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) \
+ config.h.in
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+DIST_SUBDIRS = src include benchmark doc_example
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \
+ $(srcdir)/liborcus-spreadsheet-model.pc.in \
+ $(srcdir)/liborcus.pc.in $(top_srcdir)/test/python/env.json.in \
+ AUTHORS README.md compile config.guess config.sub depcomp \
+ install-sh ltmain.sh missing
+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
+am__post_remove_distdir = $(am__remove_distdir)
+am__relativize = \
+ dir0=`pwd`; \
+ sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+ sed_rest='s,^[^/]*/*,,'; \
+ sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+ sed_butlast='s,/*[^/]*$$,,'; \
+ while test -n "$$dir1"; do \
+ first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+ if test "$$first" != "."; then \
+ if test "$$first" = ".."; then \
+ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+ else \
+ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+ if test "$$first2" = "$$first"; then \
+ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+ else \
+ dir2="../$$dir2"; \
+ fi; \
+ dir0="$$dir0"/"$$first"; \
+ fi; \
+ fi; \
+ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+ done; \
+ reldir="$$dir2"
+DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 $(distdir).tar.xz
+GZIP_ENV = --best
+DIST_TARGETS = dist-xz dist-bzip2 dist-gzip
+# Exists only to be overridden by the user if desired.
+AM_DISTCHECK_DVI_TARGET = dvi
+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@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BOOST_CPPFLAGS = @BOOST_CPPFLAGS@
+BOOST_DATE_TIME_LDFLAGS = @BOOST_DATE_TIME_LDFLAGS@
+BOOST_DATE_TIME_LDPATH = @BOOST_DATE_TIME_LDPATH@
+BOOST_DATE_TIME_LIBS = @BOOST_DATE_TIME_LIBS@
+BOOST_FILESYSTEM_LDFLAGS = @BOOST_FILESYSTEM_LDFLAGS@
+BOOST_FILESYSTEM_LDPATH = @BOOST_FILESYSTEM_LDPATH@
+BOOST_FILESYSTEM_LIBS = @BOOST_FILESYSTEM_LIBS@
+BOOST_IOSTREAMS_LDFLAGS = @BOOST_IOSTREAMS_LDFLAGS@
+BOOST_IOSTREAMS_LDPATH = @BOOST_IOSTREAMS_LDPATH@
+BOOST_IOSTREAMS_LIBS = @BOOST_IOSTREAMS_LIBS@
+BOOST_LDPATH = @BOOST_LDPATH@
+BOOST_PROGRAM_OPTIONS_LDFLAGS = @BOOST_PROGRAM_OPTIONS_LDFLAGS@
+BOOST_PROGRAM_OPTIONS_LDPATH = @BOOST_PROGRAM_OPTIONS_LDPATH@
+BOOST_PROGRAM_OPTIONS_LIBS = @BOOST_PROGRAM_OPTIONS_LIBS@
+BOOST_ROOT = @BOOST_ROOT@
+BOOST_SYSTEM_LDFLAGS = @BOOST_SYSTEM_LDFLAGS@
+BOOST_SYSTEM_LDPATH = @BOOST_SYSTEM_LDPATH@
+BOOST_SYSTEM_LIBS = @BOOST_SYSTEM_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CSCOPE = @CSCOPE@
+CTAGS = @CTAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_VALGRIND_drd = @ENABLE_VALGRIND_drd@
+ENABLE_VALGRIND_helgrind = @ENABLE_VALGRIND_helgrind@
+ENABLE_VALGRIND_memcheck = @ENABLE_VALGRIND_memcheck@
+ENABLE_VALGRIND_sgcheck = @ENABLE_VALGRIND_sgcheck@
+ETAGS = @ETAGS@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+HAVE_CXX17 = @HAVE_CXX17@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+IXION_REQUIRED_API_VERSION = @IXION_REQUIRED_API_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBIXION_CFLAGS = @LIBIXION_CFLAGS@
+LIBIXION_LIBS = @LIBIXION_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MDDS_CFLAGS = @MDDS_CFLAGS@
+MDDS_LIBS = @MDDS_LIBS@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+ORCUS_API_VERSION = @ORCUS_API_VERSION@
+ORCUS_MAJOR_VERSION = @ORCUS_MAJOR_VERSION@
+ORCUS_MICRO_VERSION = @ORCUS_MICRO_VERSION@
+ORCUS_MINOR_VERSION = @ORCUS_MINOR_VERSION@
+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@
+PARQUET_CFLAGS = @PARQUET_CFLAGS@
+PARQUET_LIBS = @PARQUET_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POW_LIB = @POW_LIB@
+PYTHON = @PYTHON@
+PYTHON_CFLAGS = @PYTHON_CFLAGS@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VALGRIND = @VALGRIND@
+VALGRIND_ENABLED = @VALGRIND_ENABLED@
+VERSION = @VERSION@
+ZLIB_CFLAGS = @ZLIB_CFLAGS@
+ZLIB_LIBS = @ZLIB_LIBS@
+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@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+runstatedir = @runstatedir@
+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@
+valgrind_enabled_tools = @valgrind_enabled_tools@
+valgrind_tools = @valgrind_tools@
+SUBDIRS = src include $(am__append_1) $(am__append_2)
+ACLOCAL_AMFLAGS = -I m4
+pcfiles = liborcus-@ORCUS_API_VERSION@.pc $(am__append_3)
+pkgconfig_DATA = $(pcfiles)
+pkgconfigdir = $(libdir)/pkgconfig
+doc_data = \
+ doc/_static/images/overview/doc-content.png \
+ doc/_static/images/overview/multi-sheets-sheet1.png \
+ doc/_static/images/overview/multi-sheets-sheet2.png \
+ doc/cli/index.rst \
+ doc/cli/orcus_csv.rst \
+ doc/cli/orcus_gnumeric.rst \
+ doc/cli/orcus_json.rst \
+ doc/cli/orcus_ods.rst \
+ doc/cli/orcus_parquet.rst \
+ doc/cli/orcus_xls_xml.rst \
+ doc/cli/orcus_xlsx.rst \
+ doc/cli/orcus_xml.rst \
+ doc/cli/orcus_yaml.rst \
+ doc/conf.py \
+ doc/cpp/core/config.rst \
+ doc/cpp/core/import-filter/csv.rst \
+ doc/cpp/core/import-filter/detect.rst \
+ doc/cpp/core/import-filter/gnumeric.rst \
+ doc/cpp/core/import-filter/index.rst \
+ doc/cpp/core/import-filter/json.rst \
+ doc/cpp/core/import-filter/ods.rst \
+ doc/cpp/core/import-filter/xls_xml.rst \
+ doc/cpp/core/import-filter/xlsx.rst \
+ doc/cpp/core/import-filter/xml.rst \
+ doc/cpp/core/index.rst \
+ doc/cpp/core/interface/global.rst \
+ doc/cpp/core/interface/index.rst \
+ doc/cpp/core/interface/spreadsheet/document.rst \
+ doc/cpp/core/interface/spreadsheet/document_export.rst \
+ doc/cpp/core/interface/spreadsheet/index.rst \
+ doc/cpp/core/interface/spreadsheet/pivot.rst \
+ doc/cpp/core/interface/spreadsheet/sheet.rst \
+ doc/cpp/core/interface/spreadsheet/styles.rst \
+ doc/cpp/core/interface/spreadsheet/view.rst \
+ doc/cpp/core/tree-doc/index.rst \
+ doc/cpp/core/tree-doc/json.rst \
+ doc/cpp/core/tree-doc/yaml.rst \
+ doc/cpp/core/types/core.rst \
+ doc/cpp/core/types/index.rst \
+ doc/cpp/core/types/view.rst \
+ doc/cpp/core/utils.rst \
+ doc/cpp/index.rst \
+ doc/cpp/parser/archive.rst \
+ doc/cpp/parser/base64.rst \
+ doc/cpp/parser/css.rst \
+ doc/cpp/parser/csv.rst \
+ doc/cpp/parser/exception.rst \
+ doc/cpp/parser/index.rst \
+ doc/cpp/parser/json.rst \
+ doc/cpp/parser/stream.rst \
+ doc/cpp/parser/types.rst \
+ doc/cpp/parser/util.rst \
+ doc/cpp/parser/xml.rst \
+ doc/cpp/parser/xml_writer.rst \
+ doc/cpp/parser/yaml.rst \
+ doc/cpp/spreadsheet-doc/document.rst \
+ doc/cpp/spreadsheet-doc/import-export.rst \
+ doc/cpp/spreadsheet-doc/index.rst \
+ doc/cpp/spreadsheet-doc/pivot.rst \
+ doc/cpp/spreadsheet-doc/shared-strings.rst \
+ doc/cpp/spreadsheet-doc/sheet.rst \
+ doc/cpp/spreadsheet-doc/styles.rst \
+ doc/cpp/spreadsheet-doc/table.rst \
+ doc/cpp/spreadsheet-doc/types.rst \
+ doc/cpp/spreadsheet-doc/view.rst \
+ doc/doxygen.conf \
+ doc/environment.yml \
+ doc/index.rst \
+ doc/notes/index.rst \
+ doc/notes/json_map/example.json \
+ doc/notes/json_map/index.rst \
+ doc/notes/xml_map/example.xml \
+ doc/notes/xml_map/index.rst \
+ doc/overview/doc-orcus.rst \
+ doc/overview/doc-user.rst \
+ doc/overview/index.rst \
+ doc/overview/json.rst \
+ doc/overview/yaml.rst \
+ doc/python/index.rst \
+ doc/python/orcus/cell.rst \
+ doc/python/orcus/cell_type.rst \
+ doc/python/orcus/csv/index.rst \
+ doc/python/orcus/document.rst \
+ doc/python/orcus/format_type.rst \
+ doc/python/orcus/formula_token.rst \
+ doc/python/orcus/formula_token_op.rst \
+ doc/python/orcus/formula_token_type.rst \
+ doc/python/orcus/formula_tokens.rst \
+ doc/python/orcus/gnumeric/index.rst \
+ doc/python/orcus/index.rst \
+ doc/python/orcus/named_expressions.rst \
+ doc/python/orcus/ods/index.rst \
+ doc/python/orcus/sheet.rst \
+ doc/python/orcus/sheet_rows.rst \
+ doc/python/orcus/tools/bugzilla.rst \
+ doc/python/orcus/tools/file_processor.rst \
+ doc/python/orcus/tools/index.rst \
+ doc/python/orcus/xls_xml/index.rst \
+ doc/python/orcus/xlsx/index.rst \
+ doc/requirements.txt
+
+doc_example_data = \
+ doc_example/Makefile.am \
+ doc_example/files/document.ods \
+ doc_example/files/multi-sheets.ods \
+ doc_example/json_doc_1.cpp \
+ doc_example/json_doc_2.cpp \
+ doc_example/json_parser_1.cpp \
+ doc_example/spreadsheet_doc_1.cpp \
+ doc_example/spreadsheet_doc_1_num_and_formula.cpp \
+ doc_example/spreadsheet_doc_2.cpp \
+ doc_example/spreadsheet_doc_2_sheets_no_string_pool.cpp \
+ doc_example/spreadsheet_doc_2_sheets_with_formula.cpp \
+ doc_example/spreadsheet_doc_2_sheets_with_string_pool.cpp \
+ doc_example/xml_mapping_1.cpp
+
+bin_data = \
+ bin/build-extra-dist.sh \
+ bin/env-osx.sh \
+ bin/gen-cli-docs.py \
+ bin/gen-files.py \
+ bin/gen-gfm-release-table.sh \
+ bin/gen-test-json-structure-outputs.sh \
+ bin/gen-test-xml-outputs.sh \
+ bin/run-bulk-tests.py \
+ bin/run-python.sh \
+ bin/unpack-zipped-xml.sh
+
+misc_data = \
+ misc/arrow-parquet/arrow-test.cpp \
+ misc/arrow-parquet/dump-parquet.py \
+ misc/arrow-parquet/gen-parquet-test-files.py \
+ misc/character-set/data.csv \
+ misc/character-set/gen-enum.py \
+ misc/file-processor-modules/preview.py \
+ misc/notes/column-width-and-row-height.txt \
+ misc/notes/zlib-in-memory-gzip.txt \
+ misc/xml-tokens/dump-xsd-keys.py \
+ misc/xml-tokens/gen-gnumeric-tokens.py \
+ misc/xml-tokens/gen-odf-tokens.py \
+ misc/xml-tokens/gen-ooxml-tokens.py \
+ misc/xml-tokens/gen-tokens.py \
+ misc/xml-tokens/gnumeric.xsd \
+ misc/xml-tokens/ooxml-extra-tokens.txt \
+ misc/xml-tokens/token_util.py \
+ misc/xml-tokens/xls-xml-tokens.txt
+
+slickedit_data = \
+ slickedit/cmake.vpj \
+ slickedit/cpp.vpj \
+ slickedit/doc.vpj \
+ slickedit/orcus.vpw \
+ slickedit/orcus_cpp.h \
+ slickedit/python.vpj \
+ slickedit/sh.vpj \
+ slickedit/token-gen.vpj
+
+test_data = \
+ test/css/basic1.css \
+ test/css/basic10.css \
+ test/css/basic11.css \
+ test/css/basic12.css \
+ test/css/basic13.css \
+ test/css/basic14.css \
+ test/css/basic2.css \
+ test/css/basic3.css \
+ test/css/basic4.css \
+ test/css/basic5.css \
+ test/css/basic6.css \
+ test/css/basic7.css \
+ test/css/basic8.css \
+ test/css/basic9.css \
+ test/css/chained1.css \
+ test/css/chained2.css \
+ test/css/complex/callout.css \
+ test/css/complex/excel-html.css \
+ test/css/empty.css \
+ test/css/invalids/1.css \
+ test/css/test.css \
+ test/css/utf8-1.css \
+ test/csv/double-quotes/check.txt \
+ test/csv/double-quotes/input.csv \
+ test/csv/normal-quotes/check.txt \
+ test/csv/normal-quotes/input.csv \
+ test/csv/quoted-with-delim/check.txt \
+ test/csv/quoted-with-delim/input.csv \
+ test/csv/simple-numbers/check.txt \
+ test/csv/simple-numbers/input.csv \
+ test/csv/split-sheet/check-1.txt \
+ test/csv/split-sheet/check-2.txt \
+ test/csv/split-sheet/check-3.txt \
+ test/csv/split-sheet/input.csv \
+ test/gnumeric/background-color/standard.gnumeric \
+ test/gnumeric/borders/colors.gnumeric \
+ test/gnumeric/borders/directions.gnumeric \
+ test/gnumeric/borders/grid-box.gnumeric \
+ test/gnumeric/borders/single-cells.gnumeric \
+ test/gnumeric/cell-properties/wrap-and-shrink.gnumeric \
+ test/gnumeric/cell-value-types/check.txt \
+ test/gnumeric/cell-value-types/input.gnumeric \
+ test/gnumeric/colored-text/input.gnumeric \
+ test/gnumeric/column-width-row-height/input.gnumeric \
+ test/gnumeric/formula-cells/check.txt \
+ test/gnumeric/formula-cells/input.gnumeric \
+ test/gnumeric/hidden-rows-columns/input.gnumeric \
+ test/gnumeric/merged-cells/input.gnumeric \
+ test/gnumeric/named-expression-sheet-local/check.txt \
+ test/gnumeric/named-expression-sheet-local/input.gnumeric \
+ test/gnumeric/named-expression/check.txt \
+ test/gnumeric/named-expression/input.gnumeric \
+ test/gnumeric/number-formats/input.gnumeric \
+ test/gnumeric/raw-values-1/check.txt \
+ test/gnumeric/raw-values-1/input.gnumeric \
+ test/gnumeric/table/autofilter.gnumeric \
+ test/gnumeric/test.gnumeric \
+ test/gnumeric/text-alignment/input.gnumeric \
+ test/gnumeric/text-formats/input.gnumeric \
+ test/json-mapped/array-of-arrays-basic/check.txt \
+ test/json-mapped/array-of-arrays-basic/input.json \
+ test/json-mapped/array-of-arrays-basic/map.json \
+ test/json-mapped/array-of-arrays-header/check.txt \
+ test/json-mapped/array-of-arrays-header/input.json \
+ test/json-mapped/array-of-arrays-header/map.json \
+ test/json-mapped/array-of-objects-basic/check.txt \
+ test/json-mapped/array-of-objects-basic/input.json \
+ test/json-mapped/array-of-objects-basic/map.json \
+ test/json-mapped/array-of-objects-header/check.txt \
+ test/json-mapped/array-of-objects-header/input.json \
+ test/json-mapped/array-of-objects-header/map.json \
+ test/json-mapped/nested-repeats-2/check.txt \
+ test/json-mapped/nested-repeats-2/input.json \
+ test/json-mapped/nested-repeats-2/map.json \
+ test/json-mapped/nested-repeats/check.txt \
+ test/json-mapped/nested-repeats/input.json \
+ test/json-mapped/nested-repeats/map.json \
+ test/json-structure/arrays-in-object/check.txt \
+ test/json-structure/arrays-in-object/input.json \
+ test/json-structure/multiple-ranges/check.txt \
+ test/json-structure/multiple-ranges/input.json \
+ test/json-structure/nested-arrays-mixed-2/check.txt \
+ test/json-structure/nested-arrays-mixed-2/input.json \
+ test/json-structure/nested-arrays-mixed/check.txt \
+ test/json-structure/nested-arrays-mixed/input.json \
+ test/json-structure/nested-arrays/check.txt \
+ test/json-structure/nested-arrays/input.json \
+ test/json-structure/no-value-nodes/01.json \
+ test/json-structure/no-value-nodes/02.json \
+ test/json-structure/no-value-nodes/03.json \
+ test/json-structure/no-value-nodes/04.json \
+ test/json-structure/repeat-objects-2/check.txt \
+ test/json-structure/repeat-objects-2/input.json \
+ test/json-structure/repeat-objects/check.txt \
+ test/json-structure/repeat-objects/input.json \
+ test/json/basic1/check.txt \
+ test/json/basic1/input.json \
+ test/json/basic1/output.yaml \
+ test/json/basic2/check.txt \
+ test/json/basic2/input.json \
+ test/json/basic2/output.yaml \
+ test/json/basic3/check.txt \
+ test/json/basic3/input.json \
+ test/json/basic3/output.yaml \
+ test/json/basic4/check.txt \
+ test/json/basic4/input.json \
+ test/json/basic4/output.yaml \
+ test/json/empty-array-1/check.txt \
+ test/json/empty-array-1/input.json \
+ test/json/empty-array-2/check.txt \
+ test/json/empty-array-2/input.json \
+ test/json/empty-array-3/check.txt \
+ test/json/empty-array-3/input.json \
+ test/json/nested1/check.txt \
+ test/json/nested1/input.json \
+ test/json/nested1/output.yaml \
+ test/json/nested2/check.txt \
+ test/json/nested2/input.json \
+ test/json/nested2/output.yaml \
+ test/json/refs1/check.txt \
+ test/json/refs1/input.json \
+ test/json/refs1/ref.json \
+ test/json/swagger/check.txt \
+ test/json/swagger/input.json \
+ test/json/swagger/output.yaml \
+ test/json/to-yaml-1/check.txt \
+ test/json/to-yaml-1/input.json \
+ test/json/to-yaml-1/output.yaml \
+ test/json/validation/LICENSE \
+ test/json/validation/README \
+ test/json/validation/i_number_double_huge_neg_exp.json \
+ test/json/validation/i_number_huge_exp.json \
+ test/json/validation/i_number_neg_int_huge_exp.json \
+ test/json/validation/i_number_pos_double_huge_exp.json \
+ test/json/validation/i_number_real_neg_overflow.json \
+ test/json/validation/i_number_real_pos_overflow.json \
+ test/json/validation/i_number_real_underflow.json \
+ test/json/validation/i_number_too_big_neg_int.json \
+ test/json/validation/i_number_too_big_pos_int.json \
+ test/json/validation/i_number_very_big_negative_int.json \
+ test/json/validation/i_object_key_lone_2nd_surrogate.json \
+ test/json/validation/i_string_1st_surrogate_but_2nd_missing.json \
+ test/json/validation/i_string_1st_valid_surrogate_2nd_invalid.json \
+ test/json/validation/i_string_UTF-16LE_with_BOM.json \
+ test/json/validation/i_string_UTF-8_invalid_sequence.json \
+ test/json/validation/i_string_UTF8_surrogate_U+D800.json \
+ test/json/validation/i_string_incomplete_surrogate_and_escape_valid.json \
+ test/json/validation/i_string_incomplete_surrogate_pair.json \
+ test/json/validation/i_string_incomplete_surrogates_escape_valid.json \
+ test/json/validation/i_string_invalid_lonely_surrogate.json \
+ test/json/validation/i_string_invalid_surrogate.json \
+ test/json/validation/i_string_invalid_utf-8.json \
+ test/json/validation/i_string_inverted_surrogates_U+1D11E.json \
+ test/json/validation/i_string_iso_latin_1.json \
+ test/json/validation/i_string_lone_second_surrogate.json \
+ test/json/validation/i_string_lone_utf8_continuation_byte.json \
+ test/json/validation/i_string_not_in_unicode_range.json \
+ test/json/validation/i_string_overlong_sequence_2_bytes.json \
+ test/json/validation/i_string_overlong_sequence_6_bytes.json \
+ test/json/validation/i_string_overlong_sequence_6_bytes_null.json \
+ test/json/validation/i_string_truncated-utf-8.json \
+ test/json/validation/i_string_utf16BE_no_BOM.json \
+ test/json/validation/i_string_utf16LE_no_BOM.json \
+ test/json/validation/i_structure_500_nested_arrays.json \
+ test/json/validation/i_structure_UTF-8_BOM_empty_object.json \
+ test/json/validation/n_array_1_true_without_comma.json \
+ test/json/validation/n_array_a_invalid_utf8.json \
+ test/json/validation/n_array_colon_instead_of_comma.json \
+ test/json/validation/n_array_comma_after_close.json \
+ test/json/validation/n_array_comma_and_number.json \
+ test/json/validation/n_array_double_comma.json \
+ test/json/validation/n_array_double_extra_comma.json \
+ test/json/validation/n_array_extra_close.json \
+ test/json/validation/n_array_extra_comma.json \
+ test/json/validation/n_array_incomplete.json \
+ test/json/validation/n_array_incomplete_invalid_value.json \
+ test/json/validation/n_array_inner_array_no_comma.json \
+ test/json/validation/n_array_invalid_utf8.json \
+ test/json/validation/n_array_items_separated_by_semicolon.json \
+ test/json/validation/n_array_just_comma.json \
+ test/json/validation/n_array_just_minus.json \
+ test/json/validation/n_array_missing_value.json \
+ test/json/validation/n_array_newlines_unclosed.json \
+ test/json/validation/n_array_number_and_comma.json \
+ test/json/validation/n_array_number_and_several_commas.json \
+ test/json/validation/n_array_spaces_vertical_tab_formfeed.json \
+ test/json/validation/n_array_star_inside.json \
+ test/json/validation/n_array_unclosed.json \
+ test/json/validation/n_array_unclosed_trailing_comma.json \
+ test/json/validation/n_array_unclosed_with_new_lines.json \
+ test/json/validation/n_array_unclosed_with_object_inside.json \
+ test/json/validation/n_incomplete_false.json \
+ test/json/validation/n_incomplete_null.json \
+ test/json/validation/n_incomplete_true.json \
+ test/json/validation/n_multidigit_number_then_00.json \
+ test/json/validation/n_number_++.json \
+ test/json/validation/n_number_+1.json \
+ test/json/validation/n_number_+Inf.json \
+ test/json/validation/n_number_-01.json \
+ test/json/validation/n_number_-1.0..json \
+ test/json/validation/n_number_-2..json \
+ test/json/validation/n_number_-NaN.json \
+ test/json/validation/n_number_.-1.json \
+ test/json/validation/n_number_.2e-3.json \
+ test/json/validation/n_number_0.1.2.json \
+ test/json/validation/n_number_0.3e+.json \
+ test/json/validation/n_number_0.3e.json \
+ test/json/validation/n_number_0.e1.json \
+ test/json/validation/n_number_0_capital_E+.json \
+ test/json/validation/n_number_0_capital_E.json \
+ test/json/validation/n_number_0e+.json \
+ test/json/validation/n_number_0e.json \
+ test/json/validation/n_number_1.0e+.json \
+ test/json/validation/n_number_1.0e-.json \
+ test/json/validation/n_number_1.0e.json \
+ test/json/validation/n_number_1_000.json \
+ test/json/validation/n_number_1eE2.json \
+ test/json/validation/n_number_2.e+3.json \
+ test/json/validation/n_number_2.e-3.json \
+ test/json/validation/n_number_2.e3.json \
+ test/json/validation/n_number_9.e+.json \
+ test/json/validation/n_number_Inf.json \
+ test/json/validation/n_number_NaN.json \
+ test/json/validation/n_number_U+FF11_fullwidth_digit_one.json \
+ test/json/validation/n_number_expression.json \
+ test/json/validation/n_number_hex_1_digit.json \
+ test/json/validation/n_number_hex_2_digits.json \
+ test/json/validation/n_number_infinity.json \
+ test/json/validation/n_number_invalid+-.json \
+ test/json/validation/n_number_invalid-negative-real.json \
+ test/json/validation/n_number_invalid-utf-8-in-bigger-int.json \
+ test/json/validation/n_number_invalid-utf-8-in-exponent.json \
+ test/json/validation/n_number_invalid-utf-8-in-int.json \
+ test/json/validation/n_number_minus_infinity.json \
+ test/json/validation/n_number_minus_sign_with_trailing_garbage.json \
+ test/json/validation/n_number_minus_space_1.json \
+ test/json/validation/n_number_neg_int_starting_with_zero.json \
+ test/json/validation/n_number_neg_real_without_int_part.json \
+ test/json/validation/n_number_neg_with_garbage_at_end.json \
+ test/json/validation/n_number_real_garbage_after_e.json \
+ test/json/validation/n_number_real_with_invalid_utf8_after_e.json \
+ test/json/validation/n_number_real_without_fractional_part.json \
+ test/json/validation/n_number_starting_with_dot.json \
+ test/json/validation/n_number_with_alpha.json \
+ test/json/validation/n_number_with_alpha_char.json \
+ test/json/validation/n_number_with_leading_zero.json \
+ test/json/validation/n_object_bad_value.json \
+ test/json/validation/n_object_bracket_key.json \
+ test/json/validation/n_object_comma_instead_of_colon.json \
+ test/json/validation/n_object_double_colon.json \
+ test/json/validation/n_object_emoji.json \
+ test/json/validation/n_object_garbage_at_end.json \
+ test/json/validation/n_object_key_with_single_quotes.json \
+ test/json/validation/n_object_lone_continuation_byte_in_key_and_trailing_comma.json \
+ test/json/validation/n_object_missing_colon.json \
+ test/json/validation/n_object_missing_key.json \
+ test/json/validation/n_object_missing_semicolon.json \
+ test/json/validation/n_object_missing_value.json \
+ test/json/validation/n_object_no-colon.json \
+ test/json/validation/n_object_non_string_key.json \
+ test/json/validation/n_object_non_string_key_but_huge_number_instead.json \
+ test/json/validation/n_object_repeated_null_null.json \
+ test/json/validation/n_object_several_trailing_commas.json \
+ test/json/validation/n_object_single_quote.json \
+ test/json/validation/n_object_trailing_comma.json \
+ test/json/validation/n_object_trailing_comment.json \
+ test/json/validation/n_object_trailing_comment_open.json \
+ test/json/validation/n_object_trailing_comment_slash_open.json \
+ test/json/validation/n_object_trailing_comment_slash_open_incomplete.json \
+ test/json/validation/n_object_two_commas_in_a_row.json \
+ test/json/validation/n_object_unquoted_key.json \
+ test/json/validation/n_object_unterminated-value.json \
+ test/json/validation/n_object_with_single_string.json \
+ test/json/validation/n_object_with_trailing_garbage.json \
+ test/json/validation/n_single_space.json \
+ test/json/validation/n_string_1_surrogate_then_escape.json \
+ test/json/validation/n_string_1_surrogate_then_escape_u.json \
+ test/json/validation/n_string_1_surrogate_then_escape_u1.json \
+ test/json/validation/n_string_1_surrogate_then_escape_u1x.json \
+ test/json/validation/n_string_accentuated_char_no_quotes.json \
+ test/json/validation/n_string_backslash_00.json \
+ test/json/validation/n_string_escape_x.json \
+ test/json/validation/n_string_escaped_backslash_bad.json \
+ test/json/validation/n_string_escaped_ctrl_char_tab.json \
+ test/json/validation/n_string_escaped_emoji.json \
+ test/json/validation/n_string_incomplete_escape.json \
+ test/json/validation/n_string_incomplete_escaped_character.json \
+ test/json/validation/n_string_incomplete_surrogate.json \
+ test/json/validation/n_string_incomplete_surrogate_escape_invalid.json \
+ test/json/validation/n_string_invalid-utf-8-in-escape.json \
+ test/json/validation/n_string_invalid_backslash_esc.json \
+ test/json/validation/n_string_invalid_unicode_escape.json \
+ test/json/validation/n_string_invalid_utf8_after_escape.json \
+ test/json/validation/n_string_leading_uescaped_thinspace.json \
+ test/json/validation/n_string_no_quotes_with_bad_escape.json \
+ test/json/validation/n_string_single_doublequote.json \
+ test/json/validation/n_string_single_quote.json \
+ test/json/validation/n_string_single_string_no_double_quotes.json \
+ test/json/validation/n_string_start_escape_unclosed.json \
+ test/json/validation/n_string_unescaped_crtl_char.json \
+ test/json/validation/n_string_unescaped_newline.json \
+ test/json/validation/n_string_unescaped_tab.json \
+ test/json/validation/n_string_unicode_CapitalU.json \
+ test/json/validation/n_string_with_trailing_garbage.json \
+ test/json/validation/n_structure_100000_opening_arrays.json \
+ test/json/validation/n_structure_U+2060_word_joined.json \
+ test/json/validation/n_structure_UTF8_BOM_no_data.json \
+ test/json/validation/n_structure_angle_bracket_..json \
+ test/json/validation/n_structure_angle_bracket_null.json \
+ test/json/validation/n_structure_array_trailing_garbage.json \
+ test/json/validation/n_structure_array_with_extra_array_close.json \
+ test/json/validation/n_structure_array_with_unclosed_string.json \
+ test/json/validation/n_structure_ascii-unicode-identifier.json \
+ test/json/validation/n_structure_capitalized_True.json \
+ test/json/validation/n_structure_close_unopened_array.json \
+ test/json/validation/n_structure_comma_instead_of_closing_brace.json \
+ test/json/validation/n_structure_double_array.json \
+ test/json/validation/n_structure_end_array.json \
+ test/json/validation/n_structure_incomplete_UTF8_BOM.json \
+ test/json/validation/n_structure_lone-invalid-utf-8.json \
+ test/json/validation/n_structure_lone-open-bracket.json \
+ test/json/validation/n_structure_no_data.json \
+ test/json/validation/n_structure_null-byte-outside-string.json \
+ test/json/validation/n_structure_number_with_trailing_garbage.json \
+ test/json/validation/n_structure_object_followed_by_closing_object.json \
+ test/json/validation/n_structure_object_unclosed_no_value.json \
+ test/json/validation/n_structure_object_with_comment.json \
+ test/json/validation/n_structure_object_with_trailing_garbage.json \
+ test/json/validation/n_structure_open_array_apostrophe.json \
+ test/json/validation/n_structure_open_array_comma.json \
+ test/json/validation/n_structure_open_array_object.json \
+ test/json/validation/n_structure_open_array_open_object.json \
+ test/json/validation/n_structure_open_array_open_string.json \
+ test/json/validation/n_structure_open_array_string.json \
+ test/json/validation/n_structure_open_object.json \
+ test/json/validation/n_structure_open_object_close_array.json \
+ test/json/validation/n_structure_open_object_comma.json \
+ test/json/validation/n_structure_open_object_open_array.json \
+ test/json/validation/n_structure_open_object_open_string.json \
+ test/json/validation/n_structure_open_object_string_with_apostrophes.json \
+ test/json/validation/n_structure_open_open.json \
+ test/json/validation/n_structure_single_eacute.json \
+ test/json/validation/n_structure_single_star.json \
+ test/json/validation/n_structure_trailing_\#.json \
+ test/json/validation/n_structure_uescaped_LF_before_string.json \
+ test/json/validation/n_structure_unclosed_array.json \
+ test/json/validation/n_structure_unclosed_array_partial_null.json \
+ test/json/validation/n_structure_unclosed_array_unfinished_false.json \
+ test/json/validation/n_structure_unclosed_array_unfinished_true.json \
+ test/json/validation/n_structure_unclosed_object.json \
+ test/json/validation/n_structure_unicode-identifier.json \
+ test/json/validation/n_structure_whitespace_U+2060_word_joiner.json \
+ test/json/validation/n_structure_whitespace_formfeed.json \
+ test/json/validation/y_array_arraysWithSpaces.json \
+ test/json/validation/y_array_empty-string.json \
+ test/json/validation/y_array_empty.json \
+ test/json/validation/y_array_ending_with_newline.json \
+ test/json/validation/y_array_false.json \
+ test/json/validation/y_array_heterogeneous.json \
+ test/json/validation/y_array_null.json \
+ test/json/validation/y_array_with_1_and_newline.json \
+ test/json/validation/y_array_with_leading_space.json \
+ test/json/validation/y_array_with_several_null.json \
+ test/json/validation/y_array_with_trailing_space.json \
+ test/json/validation/y_number.json \
+ test/json/validation/y_number_0e+1.json \
+ test/json/validation/y_number_0e1.json \
+ test/json/validation/y_number_after_space.json \
+ test/json/validation/y_number_double_close_to_zero.json \
+ test/json/validation/y_number_int_with_exp.json \
+ test/json/validation/y_number_minus_zero.json \
+ test/json/validation/y_number_negative_int.json \
+ test/json/validation/y_number_negative_one.json \
+ test/json/validation/y_number_negative_zero.json \
+ test/json/validation/y_number_real_capital_e.json \
+ test/json/validation/y_number_real_capital_e_neg_exp.json \
+ test/json/validation/y_number_real_capital_e_pos_exp.json \
+ test/json/validation/y_number_real_exponent.json \
+ test/json/validation/y_number_real_fraction_exponent.json \
+ test/json/validation/y_number_real_neg_exp.json \
+ test/json/validation/y_number_real_pos_exponent.json \
+ test/json/validation/y_number_simple_int.json \
+ test/json/validation/y_number_simple_real.json \
+ test/json/validation/y_object.json \
+ test/json/validation/y_object_basic.json \
+ test/json/validation/y_object_duplicated_key.json \
+ test/json/validation/y_object_duplicated_key_and_value.json \
+ test/json/validation/y_object_empty.json \
+ test/json/validation/y_object_empty_key.json \
+ test/json/validation/y_object_escaped_null_in_key.json \
+ test/json/validation/y_object_extreme_numbers.json \
+ test/json/validation/y_object_long_strings.json \
+ test/json/validation/y_object_simple.json \
+ test/json/validation/y_object_string_unicode.json \
+ test/json/validation/y_object_with_newlines.json \
+ test/json/validation/y_string_1_2_3_bytes_UTF-8_sequences.json \
+ test/json/validation/y_string_accepted_surrogate_pair.json \
+ test/json/validation/y_string_accepted_surrogate_pairs.json \
+ test/json/validation/y_string_allowed_escapes.json \
+ test/json/validation/y_string_backslash_and_u_escaped_zero.json \
+ test/json/validation/y_string_backslash_doublequotes.json \
+ test/json/validation/y_string_comments.json \
+ test/json/validation/y_string_double_escape_a.json \
+ test/json/validation/y_string_double_escape_n.json \
+ test/json/validation/y_string_escaped_control_character.json \
+ test/json/validation/y_string_escaped_noncharacter.json \
+ test/json/validation/y_string_in_array.json \
+ test/json/validation/y_string_in_array_with_leading_space.json \
+ test/json/validation/y_string_last_surrogates_1_and_2.json \
+ test/json/validation/y_string_nbsp_uescaped.json \
+ test/json/validation/y_string_nonCharacterInUTF-8_U+10FFFF.json \
+ test/json/validation/y_string_nonCharacterInUTF-8_U+FFFF.json \
+ test/json/validation/y_string_null_escape.json \
+ test/json/validation/y_string_one-byte-utf-8.json \
+ test/json/validation/y_string_pi.json \
+ test/json/validation/y_string_reservedCharacterInUTF-8_U+1BFFF.json \
+ test/json/validation/y_string_simple_ascii.json \
+ test/json/validation/y_string_space.json \
+ test/json/validation/y_string_surrogates_U+1D11E_MUSICAL_SYMBOL_G_CLEF.json \
+ test/json/validation/y_string_three-byte-utf-8.json \
+ test/json/validation/y_string_two-byte-utf-8.json \
+ test/json/validation/y_string_u+2028_line_sep.json \
+ test/json/validation/y_string_u+2029_par_sep.json \
+ test/json/validation/y_string_uEscape.json \
+ test/json/validation/y_string_uescaped_newline.json \
+ test/json/validation/y_string_unescaped_char_delete.json \
+ test/json/validation/y_string_unicode.json \
+ test/json/validation/y_string_unicodeEscapedBackslash.json \
+ test/json/validation/y_string_unicode_2.json \
+ test/json/validation/y_string_unicode_U+10FFFE_nonchar.json \
+ test/json/validation/y_string_unicode_U+1FFFE_nonchar.json \
+ test/json/validation/y_string_unicode_U+200B_ZERO_WIDTH_SPACE.json \
+ test/json/validation/y_string_unicode_U+2064_invisible_plus.json \
+ test/json/validation/y_string_unicode_U+FDD0_nonchar.json \
+ test/json/validation/y_string_unicode_U+FFFE_nonchar.json \
+ test/json/validation/y_string_unicode_escaped_double_quote.json \
+ test/json/validation/y_string_utf8.json \
+ test/json/validation/y_string_with_del_character.json \
+ test/json/validation/y_structure_lonely_false.json \
+ test/json/validation/y_structure_lonely_int.json \
+ test/json/validation/y_structure_lonely_negative_real.json \
+ test/json/validation/y_structure_lonely_null.json \
+ test/json/validation/y_structure_lonely_string.json \
+ test/json/validation/y_structure_lonely_true.json \
+ test/json/validation/y_structure_string_empty.json \
+ test/json/validation/y_structure_trailing_newline.json \
+ test/json/validation/y_structure_true_in_array.json \
+ test/json/validation/y_structure_whitespace_array.json \
+ test/ods/borders/grid-box.ods \
+ test/ods/borders/single-cells.ods \
+ test/ods/cell-properties/wrap-and-shrink.ods \
+ test/ods/column-width-row-height/input.ods \
+ test/ods/date-cell/input.ods \
+ test/ods/formatted-text/bold-and-italic.ods \
+ test/ods/formula-1/check.txt \
+ test/ods/formula-1/input.ods \
+ test/ods/formula-2/check.txt \
+ test/ods/formula-2/input.ods \
+ test/ods/import-styles/cell-protection.xml \
+ test/ods/import-styles/cell-styles.xml \
+ test/ods/import-styles/standard-styles.xml \
+ test/ods/japanese.ods \
+ test/ods/named-expression-sheet-local/check.txt \
+ test/ods/named-expression-sheet-local/input.ods \
+ test/ods/named-expression/check.txt \
+ test/ods/named-expression/input.ods \
+ test/ods/named-range/check.txt \
+ test/ods/named-range/input.ods \
+ test/ods/number-format/basic-set.ods \
+ test/ods/raw-values-1/check.txt \
+ test/ods/raw-values-1/input.ods \
+ test/ods/styles/asian-complex.ods \
+ test/ods/styles/column-styles.ods \
+ test/ods/styles/direct-format.ods \
+ test/ods/styles/text-underlines.ods \
+ test/ods/test.ods \
+ test/parquet/basic/basic-gzip.parquet \
+ test/parquet/basic/basic-gzip.parquet.check \
+ test/parquet/basic/basic-nocomp.parquet \
+ test/parquet/basic/basic-nocomp.parquet.check \
+ test/parquet/basic/basic-snappy.parquet \
+ test/parquet/basic/basic-snappy.parquet.check \
+ test/parquet/basic/basic-zstd.parquet \
+ test/parquet/basic/basic-zstd.parquet.check \
+ test/parquet/basic/float-with-nan.parquet \
+ test/parquet/basic/float-with-nan.parquet.check \
+ test/python/env.json.in \
+ test/python/file_load_common.py \
+ test/python/perf/test_json.py \
+ test/python/test_csv.py \
+ test/python/test_csv_export.py \
+ test/python/test_gnumeric.py \
+ test/python/test_json.py \
+ test/python/test_module.py \
+ test/python/test_ods.py \
+ test/python/test_xls_xml.py \
+ test/python/test_xlsx.py \
+ test/xls-xml/background-color/standard.xml \
+ test/xls-xml/basic-utf-16-be/check.txt \
+ test/xls-xml/basic-utf-16-be/input.xml \
+ test/xls-xml/basic-utf-16-le/check.txt \
+ test/xls-xml/basic-utf-16-le/input.xml \
+ test/xls-xml/basic/check.txt \
+ test/xls-xml/basic/input.xml \
+ test/xls-xml/bold-and-italic/check.txt \
+ test/xls-xml/bold-and-italic/input.xml \
+ test/xls-xml/borders/colors.xml \
+ test/xls-xml/borders/directions.xml \
+ test/xls-xml/borders/grid-box.xml \
+ test/xls-xml/borders/single-cells.xml \
+ test/xls-xml/cell-properties/default-style.xml \
+ test/xls-xml/cell-properties/locked-and-hidden.xml \
+ test/xls-xml/cell-properties/wrap-and-shrink.xml \
+ test/xls-xml/character-set/input.xml \
+ test/xls-xml/colored-text/check.txt \
+ test/xls-xml/colored-text/input.xml \
+ test/xls-xml/column-width-row-height/input.xml \
+ test/xls-xml/date-time/input.xml \
+ test/xls-xml/double-bom/input.xml \
+ test/xls-xml/empty-rows/check.txt \
+ test/xls-xml/empty-rows/input.xml \
+ test/xls-xml/formatted-text/basic.xml \
+ test/xls-xml/formula-array-1/check.txt \
+ test/xls-xml/formula-array-1/input.xml \
+ test/xls-xml/formula-cells-1/check.txt \
+ test/xls-xml/formula-cells-1/input.xml \
+ test/xls-xml/formula-cells-2/check.txt \
+ test/xls-xml/formula-cells-2/config.yaml \
+ test/xls-xml/formula-cells-2/input.xml \
+ test/xls-xml/formula-cells-3/check.txt \
+ test/xls-xml/formula-cells-3/input.xml \
+ test/xls-xml/formula-cells-parse-error/input.xml \
+ test/xls-xml/hidden-rows-columns/input.xml \
+ test/xls-xml/invalid-sub-structure/check.txt \
+ test/xls-xml/invalid-sub-structure/input.xml \
+ test/xls-xml/leading-whitespace/check.txt \
+ test/xls-xml/leading-whitespace/input.xml \
+ test/xls-xml/matrix-results/input.xml \
+ test/xls-xml/merged-cells/check.txt \
+ test/xls-xml/merged-cells/input.xml \
+ test/xls-xml/named-colors/check.txt \
+ test/xls-xml/named-colors/input-upper.xml \
+ test/xls-xml/named-colors/input.xml \
+ test/xls-xml/named-colors/run.py \
+ test/xls-xml/named-colors/saved-by-excel.xml \
+ test/xls-xml/named-expression-sheet-local/check.txt \
+ test/xls-xml/named-expression-sheet-local/input.xml \
+ test/xls-xml/named-expression/check.txt \
+ test/xls-xml/named-expression/input.xml \
+ test/xls-xml/number-format/date-time.xml \
+ test/xls-xml/raw-values-1/check.txt \
+ test/xls-xml/raw-values-1/input.xml \
+ test/xls-xml/styles/column-styles.xml \
+ test/xls-xml/styles/data-offset.xml \
+ test/xls-xml/styles/direct-format.xml \
+ test/xls-xml/table-offset/check.txt \
+ test/xls-xml/table-offset/input.xml \
+ test/xls-xml/table/autofilter.xml \
+ test/xls-xml/text-alignment/input.xml \
+ test/xls-xml/unnamed-parent-styles/input.xml \
+ test/xls-xml/unnamed-parent-styles/check.txt \
+ test/xls-xml/view/cursor-per-sheet.xml \
+ test/xls-xml/view/cursor-split-pane.xml \
+ test/xls-xml/view/frozen-pane.xml \
+ test/xlsx/background-color/standard.xlsx \
+ test/xlsx/boolean-values/check.txt \
+ test/xlsx/boolean-values/input.xlsx \
+ test/xlsx/borders/colors.xlsx \
+ test/xlsx/borders/directions.xlsx \
+ test/xlsx/borders/grid-box.xlsx \
+ test/xlsx/borders/single-cells.xlsx \
+ test/xlsx/cell-properties/wrap-and-shrink.xlsx \
+ test/xlsx/column-width-row-height/input.xlsx \
+ test/xlsx/conditional-format/basic.xlsx \
+ test/xlsx/conditional-format/data-bars.xlsx \
+ test/xlsx/data-table/multi-table.xlsx \
+ test/xlsx/data-table/one-variable.xlsx \
+ test/xlsx/date-cell/input.xlsx \
+ test/xlsx/date-time/input.xlsx \
+ test/xlsx/doc-structure/unordered-sheet-positions.xlsx \
+ test/xlsx/empty-shared-strings/check.txt \
+ test/xlsx/empty-shared-strings/input.xlsx \
+ test/xlsx/formatted-text/basic.xlsx \
+ test/xlsx/formatted-text/bold-and-italic.xlsx \
+ test/xlsx/formatted-text/colored-text.xlsx \
+ test/xlsx/formula-array-1/check.txt \
+ test/xlsx/formula-array-1/input.xlsx \
+ test/xlsx/formula-cells/check.txt \
+ test/xlsx/formula-cells/input.xlsx \
+ test/xlsx/formula-shared/check.txt \
+ test/xlsx/formula-shared/input.xlsx \
+ test/xlsx/formula-simple.xlsx \
+ test/xlsx/formula-with-string-results/check.txt \
+ test/xlsx/formula-with-string-results/input.xlsx \
+ test/xlsx/hidden-rows-columns/input.xlsx \
+ test/xlsx/matrix-results/input.xlsx \
+ test/xlsx/merged-cells/simple.xlsx \
+ test/xlsx/named-expression-relative/input.xlsx \
+ test/xlsx/named-expression-sheet-local/check.txt \
+ test/xlsx/named-expression-sheet-local/input.xlsx \
+ test/xlsx/named-expression/check.txt \
+ test/xlsx/named-expression/input.xlsx \
+ test/xlsx/number-format/date-time.xlsx \
+ test/xlsx/pivot-table/chart-simple.xlsx \
+ test/xlsx/pivot-table/error-values.xlsx \
+ test/xlsx/pivot-table/group-by-dates.xlsx \
+ test/xlsx/pivot-table/group-by-numbers.xlsx \
+ test/xlsx/pivot-table/group-field.xlsx \
+ test/xlsx/pivot-table/many-fields.xlsx \
+ test/xlsx/pivot-table/mixed-type-field.xlsx \
+ test/xlsx/pivot-table/three-pivot-tables-on-one-sheet.xlsx \
+ test/xlsx/pivot-table/two-pivot-caches.xlsx \
+ test/xlsx/pivot-table/two-tables-one-source.xlsx \
+ test/xlsx/raw-values-1/check.txt \
+ test/xlsx/raw-values-1/input.xlsx \
+ test/xlsx/revision/cell-change-basic.xlsx \
+ test/xlsx/styles/column-styles.xlsx \
+ test/xlsx/styles/direct-format.xlsx \
+ test/xlsx/table/autofilter-text-filter-1.xlsx \
+ test/xlsx/table/autofilter.xlsx \
+ test/xlsx/table/table-1.xlsx \
+ test/xlsx/table/table-2.xlsx \
+ test/xlsx/test.xlsx \
+ test/xlsx/text-alignment/input.xlsx \
+ test/xlsx/view/cursor-per-sheet.xlsx \
+ test/xlsx/view/cursor-split-pane.xlsx \
+ test/xlsx/view/frozen-pane.xlsx \
+ test/xml-mapped/attribute-basic/check-nomap.txt \
+ test/xml-mapped/attribute-basic/check.txt \
+ test/xml-mapped/attribute-basic/input.xml \
+ test/xml-mapped/attribute-basic/map.xml \
+ test/xml-mapped/attribute-namespace-2/check-nomap.txt \
+ test/xml-mapped/attribute-namespace-2/check.txt \
+ test/xml-mapped/attribute-namespace-2/input.xml \
+ test/xml-mapped/attribute-namespace-2/map.xml \
+ test/xml-mapped/attribute-namespace/check-nomap.txt \
+ test/xml-mapped/attribute-namespace/check.txt \
+ test/xml-mapped/attribute-namespace/input.xml \
+ test/xml-mapped/attribute-namespace/map.xml \
+ test/xml-mapped/attribute-range-self-close/check-nomap.txt \
+ test/xml-mapped/attribute-range-self-close/check.txt \
+ test/xml-mapped/attribute-range-self-close/input.xml \
+ test/xml-mapped/attribute-range-self-close/map.xml \
+ test/xml-mapped/attribute-single-element-2/check.txt \
+ test/xml-mapped/attribute-single-element-2/input.xml \
+ test/xml-mapped/attribute-single-element-2/map.xml \
+ test/xml-mapped/attribute-single-element/check.txt \
+ test/xml-mapped/attribute-single-element/input.xml \
+ test/xml-mapped/attribute-single-element/map.xml \
+ test/xml-mapped/content-basic/check-nomap.txt \
+ test/xml-mapped/content-basic/check.txt \
+ test/xml-mapped/content-basic/input.xml \
+ test/xml-mapped/content-basic/map.xml \
+ test/xml-mapped/content-namespace-2/check-nomap.txt \
+ test/xml-mapped/content-namespace-2/check.txt \
+ test/xml-mapped/content-namespace-2/input.xml \
+ test/xml-mapped/content-namespace-2/map.xml \
+ test/xml-mapped/content-namespace-3/check-nomap.txt \
+ test/xml-mapped/content-namespace-3/check.txt \
+ test/xml-mapped/content-namespace-3/input.xml \
+ test/xml-mapped/content-namespace-3/map.xml \
+ test/xml-mapped/content-namespace/check-nomap.txt \
+ test/xml-mapped/content-namespace/check.txt \
+ test/xml-mapped/content-namespace/input.xml \
+ test/xml-mapped/content-namespace/map.xml \
+ test/xml-mapped/content-one-column/check-nomap.txt \
+ test/xml-mapped/content-one-column/input.xml \
+ test/xml-mapped/custom-labels-2/check.txt \
+ test/xml-mapped/custom-labels-2/input.xml \
+ test/xml-mapped/custom-labels-2/map.xml \
+ test/xml-mapped/custom-labels/check.txt \
+ test/xml-mapped/custom-labels/input.xml \
+ test/xml-mapped/custom-labels/map.xml \
+ test/xml-mapped/encoding/euc-jp.xml \
+ test/xml-mapped/encoding/gbk.xml \
+ test/xml-mapped/encoding/utf-8.xml \
+ test/xml-mapped/fuel-economy/check-nomap.txt \
+ test/xml-mapped/fuel-economy/check.txt \
+ test/xml-mapped/fuel-economy/input.xml \
+ test/xml-mapped/fuel-economy/map.xml \
+ test/xml-mapped/invalids/map-defs/non-leaf-element-linked.xml \
+ test/xml-mapped/invalids/map-defs/not-xml.xml \
+ test/xml-mapped/nested-repeats-2/check-nomap.txt \
+ test/xml-mapped/nested-repeats-2/check.txt \
+ test/xml-mapped/nested-repeats-2/input.xml \
+ test/xml-mapped/nested-repeats-2/map.xml \
+ test/xml-mapped/nested-repeats-3/check-nomap.txt \
+ test/xml-mapped/nested-repeats-3/check.txt \
+ test/xml-mapped/nested-repeats-3/input.xml \
+ test/xml-mapped/nested-repeats-3/map.xml \
+ test/xml-mapped/nested-repeats-4/check-nomap.txt \
+ test/xml-mapped/nested-repeats-4/check.txt \
+ test/xml-mapped/nested-repeats-4/input.xml \
+ test/xml-mapped/nested-repeats-4/map.xml \
+ test/xml-mapped/nested-repeats/check-nomap.txt \
+ test/xml-mapped/nested-repeats/check.txt \
+ test/xml-mapped/nested-repeats/input.xml \
+ test/xml-mapped/nested-repeats/map.xml \
+ test/xml-structure/attribute-1/check.txt \
+ test/xml-structure/attribute-1/input.xml \
+ test/xml-structure/basic-1/check.txt \
+ test/xml-structure/basic-1/input.xml \
+ test/xml-structure/basic-2/check.txt \
+ test/xml-structure/basic-2/input.xml \
+ test/xml-structure/basic-3/check.txt \
+ test/xml-structure/basic-3/input.xml \
+ test/xml-structure/namespace-default/check.txt \
+ test/xml-structure/namespace-default/input.xml \
+ test/xml-structure/nested-repeat-1/check.txt \
+ test/xml-structure/nested-repeat-1/input.xml \
+ test/xml/bom/check.txt \
+ test/xml/bom/input.xml \
+ test/xml/cdata-1/check.txt \
+ test/xml/cdata-1/input.xml \
+ test/xml/custom-decl-1/check.txt \
+ test/xml/custom-decl-1/input.xml \
+ test/xml/default-ns/check.txt \
+ test/xml/default-ns/input.xml \
+ test/xml/doctype/html.xml \
+ test/xml/encoded-attrs/test1.xml \
+ test/xml/encoded-char/check.txt \
+ test/xml/encoded-char/input.xml \
+ test/xml/invalids/double-boms-and-invalid-byte.xml \
+ test/xml/invalids/only-bom.xml \
+ test/xml/invalids/only-double-boms.xml \
+ test/xml/invalids/partial-attr-value-with-encoding-char.xml \
+ test/xml/invalids/partial-open-element.xml \
+ test/xml/no-decl-1/check.txt \
+ test/xml/no-decl-1/input.xml \
+ test/xml/ns-alias-1/check.txt \
+ test/xml/ns-alias-1/input.xml \
+ test/xml/osm/street-in-aizu.osm \
+ test/xml/parse-only/rss/input.xml \
+ test/xml/self-closing-root/check.txt \
+ test/xml/self-closing-root/input.xml \
+ test/xml/simple/check.txt \
+ test/xml/simple/input.xml \
+ test/xml/single-quote/check.txt \
+ test/xml/single-quote/input.xml \
+ test/xml/underscore-identifier/check.txt \
+ test/xml/underscore-identifier/input.xml \
+ test/xml/utf8-1/check.txt \
+ test/xml/utf8-1/input.xml \
+ test/xml/utf8-2/check.txt \
+ test/xml/utf8-2/input.xml \
+ test/xml/valids/double-boms.xml \
+ test/yaml/basic1/input.yaml \
+ test/yaml/basic2/input.yaml \
+ test/yaml/basic3/input.yaml \
+ test/yaml/boolean/input.yaml \
+ test/yaml/empty-value-map-1/input.yaml \
+ test/yaml/empty-value-map-2/input.yaml \
+ test/yaml/empty-value-sequence-1/input.yaml \
+ test/yaml/empty-value-sequence-2/input.yaml \
+ test/yaml/invalids/1.yaml \
+ test/yaml/invalids/2.yaml \
+ test/yaml/invalids/3.yaml \
+ test/yaml/literal-block-1/input.yaml \
+ test/yaml/literal-block-2/input.yaml \
+ test/yaml/map-key-1/input.yaml \
+ test/yaml/multi-line-1/input.yaml \
+ test/yaml/multi-line-2/input.yaml \
+ test/yaml/null/input.yaml \
+ test/yaml/quoted-string/input.yaml \
+ test/yaml/swagger/input.yaml \
+ test/yaml/url/input.yaml
+
+EXTRA_DIST = \
+ CHANGELOG \
+ LICENSE \
+ README.md \
+ liborcus.pc.in \
+ autogen.sh \
+ $(bin_data) \
+ $(doc_data) \
+ $(doc_example_data) \
+ $(misc_data) \
+ $(slickedit_data) \
+ $(test_data)
+
+all: config.h
+ $(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+am--refresh: Makefile
+ @:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(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
+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__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(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
+ @test -f $@ || rm -f stamp-h1
+ @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1
+
+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
+test/python/env.json: $(top_builddir)/config.status $(top_srcdir)/test/python/env.json.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool config.lt
+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)
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+# (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+ @fail=; \
+ if $(am__make_keepgoing); then \
+ failcom='fail=yes'; \
+ else \
+ failcom='exit 1'; \
+ fi; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+check-valgrind-local:
+check-valgrind-memcheck-local:
+check-valgrind-helgrind-local:
+check-valgrind-drd-local:
+check-valgrind-sgcheck-local:
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ $(am__define_uniq_tagged_files); \
+ 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-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ 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"
+cscope: cscope.files
+ test ! -s cscope.files \
+ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
+clean-cscope:
+ -rm -f cscope.files
+cscope.files: clean-cscope cscopelist
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+ -rm -f cscope.out cscope.in.out cscope.po.out cscope.files
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ $(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
+ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ $(am__make_dryrun) \
+ || test -d "$(distdir)/$$subdir" \
+ || $(MKDIR_P) "$(distdir)/$$subdir" \
+ || exit 1; \
+ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+ $(am__relativize); \
+ new_distdir=$$reldir; \
+ dir1=$$subdir; dir2="$(top_distdir)"; \
+ $(am__relativize); \
+ new_top_distdir=$$reldir; \
+ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+ ($(am__cd) $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$new_top_distdir" \
+ distdir="$$new_distdir" \
+ am__remove_distdir=: \
+ am__skip_length_check=: \
+ am__skip_mode_fix=: \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$(top_distdir)" distdir="$(distdir)" \
+ dist-hook
+ -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) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz
+ $(am__post_remove_distdir)
+dist-bzip2: distdir
+ tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
+ $(am__post_remove_distdir)
+
+dist-lzip: distdir
+ tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
+ $(am__post_remove_distdir)
+dist-xz: distdir
+ tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
+ $(am__post_remove_distdir)
+
+dist-zstd: distdir
+ tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst
+ $(am__post_remove_distdir)
+
+dist-tarZ: distdir
+ @echo WARNING: "Support for distribution archives compressed with" \
+ "legacy program 'compress' is deprecated." >&2
+ @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+ tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+ $(am__post_remove_distdir)
+
+dist-shar: distdir
+ @echo WARNING: "Support for shar distribution archives is" \
+ "deprecated." >&2
+ @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+ shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz
+ $(am__post_remove_distdir)
+
+dist-zip: distdir
+ -rm -f $(distdir).zip
+ zip -rq $(distdir).zip $(distdir)
+ $(am__post_remove_distdir)
+
+dist dist-all:
+ $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
+ $(am__post_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*) \
+ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\
+ *.tar.bz2*) \
+ bzip2 -dc $(distdir).tar.bz2 | $(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*) \
+ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
+ *.zip*) \
+ unzip $(distdir).zip ;;\
+ *.tar.zst*) \
+ zstd -dc $(distdir).tar.zst | $(am__untar) ;;\
+ esac
+ chmod -R a-w $(distdir)
+ chmod u+w $(distdir)
+ mkdir $(distdir)/_build $(distdir)/_build/sub $(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/sub \
+ && ../../configure \
+ $(AM_DISTCHECK_CONFIGURE_FLAGS) \
+ $(DISTCHECK_CONFIGURE_FLAGS) \
+ --srcdir=../.. --prefix="$$dc_install_base" \
+ && $(MAKE) $(AM_MAKEFLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \
+ && $(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__post_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
+check: check-recursive
+all-am: Makefile $(DATA) config.h
+installdirs: installdirs-recursive
+installdirs-am:
+ for dir in "$(DESTDIR)$(pkgconfigdir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+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:
+
+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)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+check-valgrind: check-valgrind-recursive
+
+check-valgrind-am: check-valgrind-local
+
+check-valgrind-drd: check-valgrind-drd-recursive
+
+check-valgrind-drd-am: check-valgrind-drd-local
+
+check-valgrind-helgrind: check-valgrind-helgrind-recursive
+
+check-valgrind-helgrind-am: check-valgrind-helgrind-local
+
+check-valgrind-memcheck: check-valgrind-memcheck-recursive
+
+check-valgrind-memcheck-am: check-valgrind-memcheck-local
+
+check-valgrind-sgcheck: check-valgrind-sgcheck-recursive
+
+check-valgrind-sgcheck-am: check-valgrind-sgcheck-local
+
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-hdr \
+ distclean-libtool distclean-local distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-pkgconfigDATA
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -rf $(top_srcdir)/autom4te.cache
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-pkgconfigDATA
+
+.MAKE: $(am__recursive_targets) all install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
+ am--refresh check check-am check-valgrind-am \
+ check-valgrind-drd-am check-valgrind-drd-local \
+ check-valgrind-helgrind-am check-valgrind-helgrind-local \
+ check-valgrind-local check-valgrind-memcheck-am \
+ check-valgrind-memcheck-local check-valgrind-sgcheck-am \
+ check-valgrind-sgcheck-local clean clean-cscope clean-generic \
+ clean-libtool cscope cscopelist-am ctags ctags-am dist \
+ dist-all dist-bzip2 dist-gzip dist-hook dist-lzip dist-shar \
+ dist-tarZ dist-xz dist-zip dist-zstd distcheck distclean \
+ distclean-generic distclean-hdr distclean-libtool \
+ distclean-local distclean-tags distcleancheck distdir \
+ distuninstallcheck dvi dvi-am html html-am info info-am \
+ install install-am 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-man \
+ install-pdf install-pdf-am install-pkgconfigDATA install-ps \
+ install-ps-am install-strip installcheck installcheck-am \
+ installdirs installdirs-am maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-generic \
+ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
+ uninstall-am uninstall-pkgconfigDATA
+
+.PRECIOUS: Makefile
+
+
+.PHONY: distclean-local dist-hook doc-doxygen doc-sphinx doc
+
+distclean-local:
+ rm -rf *.pc
+
+dist-hook:
+ git log --date=short --pretty="format:@%cd %an <%ae> [%H]%n%n%s%n%n%e%b" | sed -e "s|^\([^@]\)|\t\1|" -e "s|^@||" >$(distdir)/ChangeLog
+
+doc-doxygen:
+ @echo "Building documentation by doxygen..."
+ @cd doc && doxygen doxygen.conf
+
+doc-sphinx:
+ @echo "Building documentation by sphinx..."
+ @sphinx-build -b html ./doc/ ./doc/_build
+
+doc: doc-doxygen doc-sphinx
+
+doc-clean:
+ @rm -rf ./doc/_build ./doc/_doxygen
+
+# 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/README.md b/README.md
new file mode 100644
index 0000000..1a7b044
--- /dev/null
+++ b/README.md
@@ -0,0 +1,37 @@
+Orcus - library for processing spreadsheet documents.
+=====================================================
+
+Orcus is a library that provides a collection of standalone file processing
+filters. It is focused primarily on providing filters for spreadsheet documents.
+
+The library currently includes the following import filters:
+
+* Microsoft Excel 2007 XML
+* Microsoft Excel 2003 XML
+* Open Document Spreadsheet
+* Plain Text
+* Gnumeric XML
+* Generic XML
+* Apache Parquet (via Apache Arrow library)
+
+The library also includes low-level parsers for the following:
+
+* CSV
+* CSS
+* XML
+* JSON
+* YAML (experimental)
+
+These parsers are all implemented as C++ templates and require a handler class
+passed as a template argument so that the handler class receives various
+callbacks from the parser as the file is being parsed.
+
+## API Documentation
+
+* [Official API documentation](https://orcus.readthedocs.io/en/latest/) for
+ general users of the library.
+
+## Pages
+
+* [Old packages](OLD-DOWNLOADS.md)
+* [For contributors](CONTRIBUTING.md)
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644
index 0000000..363a90c
--- /dev/null
+++ b/aclocal.m4
@@ -0,0 +1,1811 @@
+# generated automatically by aclocal 1.16.5 -*- Autoconf -*-
+
+# Copyright (C) 1996-2021 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_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
+m4_ifndef([AC_AUTOCONF_VERSION],
+ [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.71],,
+[m4_warning([this file was generated for autoconf 2.71.
+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'.])])
+
+# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
+# serial 12 (pkg-config-0.29.2)
+
+dnl Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
+dnl Copyright © 2012-2015 Dan Nicholson <dbn.lists@gmail.com>
+dnl
+dnl This program is free software; you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation; either version 2 of the License, or
+dnl (at your option) any later version.
+dnl
+dnl This program is distributed in the hope that it will be useful, but
+dnl WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+dnl General Public License for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software
+dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+dnl 02111-1307, USA.
+dnl
+dnl As a special exception to the GNU General Public License, if you
+dnl distribute this file as part of a program that contains a
+dnl configuration script generated by Autoconf, you may include it under
+dnl the same distribution terms that you use for the rest of that
+dnl program.
+
+dnl PKG_PREREQ(MIN-VERSION)
+dnl -----------------------
+dnl Since: 0.29
+dnl
+dnl Verify that the version of the pkg-config macros are at least
+dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's
+dnl installed version of pkg-config, this checks the developer's version
+dnl of pkg.m4 when generating configure.
+dnl
+dnl To ensure that this macro is defined, also add:
+dnl m4_ifndef([PKG_PREREQ],
+dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])])
+dnl
+dnl See the "Since" comment for each macro you use to see what version
+dnl of the macros you require.
+m4_defun([PKG_PREREQ],
+[m4_define([PKG_MACROS_VERSION], [0.29.2])
+m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1,
+ [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])])
+])dnl PKG_PREREQ
+
+dnl PKG_PROG_PKG_CONFIG([MIN-VERSION])
+dnl ----------------------------------
+dnl Since: 0.16
+dnl
+dnl Search for the pkg-config tool and set the PKG_CONFIG variable to
+dnl first found in the path. Checks that the version of pkg-config found
+dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is
+dnl used since that's the first version where most current features of
+dnl pkg-config existed.
+AC_DEFUN([PKG_PROG_PKG_CONFIG],
+[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
+m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$])
+m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$])
+AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])
+AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path])
+AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path])
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+ AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
+fi
+if test -n "$PKG_CONFIG"; then
+ _pkg_min_version=m4_default([$1], [0.9.0])
+ AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
+ if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ PKG_CONFIG=""
+ fi
+fi[]dnl
+])dnl PKG_PROG_PKG_CONFIG
+
+dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+dnl -------------------------------------------------------------------
+dnl Since: 0.18
+dnl
+dnl Check to see whether a particular set of modules exists. Similar to
+dnl PKG_CHECK_MODULES(), but does not set variables or print errors.
+dnl
+dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+dnl only at the first occurence in configure.ac, so if the first place
+dnl it's called might be skipped (such as if it is within an "if", you
+dnl have to call PKG_CHECK_EXISTS manually
+AC_DEFUN([PKG_CHECK_EXISTS],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+if test -n "$PKG_CONFIG" && \
+ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
+ m4_default([$2], [:])
+m4_ifvaln([$3], [else
+ $3])dnl
+fi])
+
+dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
+dnl ---------------------------------------------
+dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting
+dnl pkg_failed based on the result.
+m4_define([_PKG_CONFIG],
+[if test -n "$$1"; then
+ pkg_cv_[]$1="$$1"
+ elif test -n "$PKG_CONFIG"; then
+ PKG_CHECK_EXISTS([$3],
+ [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes ],
+ [pkg_failed=yes])
+ else
+ pkg_failed=untried
+fi[]dnl
+])dnl _PKG_CONFIG
+
+dnl _PKG_SHORT_ERRORS_SUPPORTED
+dnl ---------------------------
+dnl Internal check to see if pkg-config supports short errors.
+AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ _pkg_short_errors_supported=yes
+else
+ _pkg_short_errors_supported=no
+fi[]dnl
+])dnl _PKG_SHORT_ERRORS_SUPPORTED
+
+
+dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
+dnl [ACTION-IF-NOT-FOUND])
+dnl --------------------------------------------------------------
+dnl Since: 0.4.0
+dnl
+dnl Note that if there is a possibility the first call to
+dnl PKG_CHECK_MODULES might not happen, you should be sure to include an
+dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
+AC_DEFUN([PKG_CHECK_MODULES],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
+AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
+
+pkg_failed=no
+AC_MSG_CHECKING([for $2])
+
+_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
+_PKG_CONFIG([$1][_LIBS], [libs], [$2])
+
+m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
+and $1[]_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.])
+
+if test $pkg_failed = yes; then
+ AC_MSG_RESULT([no])
+ _PKG_SHORT_ERRORS_SUPPORTED
+ if test $_pkg_short_errors_supported = yes; then
+ $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1`
+ else
+ $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
+
+ m4_default([$4], [AC_MSG_ERROR(
+[Package requirements ($2) were not met:
+
+$$1_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+_PKG_TEXT])[]dnl
+ ])
+elif test $pkg_failed = untried; then
+ AC_MSG_RESULT([no])
+ m4_default([$4], [AC_MSG_FAILURE(
+[The pkg-config script could not be found or is too old. Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+_PKG_TEXT
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.])[]dnl
+ ])
+else
+ $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
+ $1[]_LIBS=$pkg_cv_[]$1[]_LIBS
+ AC_MSG_RESULT([yes])
+ $3
+fi[]dnl
+])dnl PKG_CHECK_MODULES
+
+
+dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
+dnl [ACTION-IF-NOT-FOUND])
+dnl ---------------------------------------------------------------------
+dnl Since: 0.29
+dnl
+dnl Checks for existence of MODULES and gathers its build flags with
+dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags
+dnl and VARIABLE-PREFIX_LIBS from --libs.
+dnl
+dnl Note that if there is a possibility the first call to
+dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to
+dnl include an explicit call to PKG_PROG_PKG_CONFIG in your
+dnl configure.ac.
+AC_DEFUN([PKG_CHECK_MODULES_STATIC],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+_save_PKG_CONFIG=$PKG_CONFIG
+PKG_CONFIG="$PKG_CONFIG --static"
+PKG_CHECK_MODULES($@)
+PKG_CONFIG=$_save_PKG_CONFIG[]dnl
+])dnl PKG_CHECK_MODULES_STATIC
+
+
+dnl PKG_INSTALLDIR([DIRECTORY])
+dnl -------------------------
+dnl Since: 0.27
+dnl
+dnl Substitutes the variable pkgconfigdir as the location where a module
+dnl should install pkg-config .pc files. By default the directory is
+dnl $libdir/pkgconfig, but the default can be changed by passing
+dnl DIRECTORY. The user can override through the --with-pkgconfigdir
+dnl parameter.
+AC_DEFUN([PKG_INSTALLDIR],
+[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])])
+m4_pushdef([pkg_description],
+ [pkg-config installation directory @<:@]pkg_default[@:>@])
+AC_ARG_WITH([pkgconfigdir],
+ [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],,
+ [with_pkgconfigdir=]pkg_default)
+AC_SUBST([pkgconfigdir], [$with_pkgconfigdir])
+m4_popdef([pkg_default])
+m4_popdef([pkg_description])
+])dnl PKG_INSTALLDIR
+
+
+dnl PKG_NOARCH_INSTALLDIR([DIRECTORY])
+dnl --------------------------------
+dnl Since: 0.27
+dnl
+dnl Substitutes the variable noarch_pkgconfigdir as the location where a
+dnl module should install arch-independent pkg-config .pc files. By
+dnl default the directory is $datadir/pkgconfig, but the default can be
+dnl changed by passing DIRECTORY. The user can override through the
+dnl --with-noarch-pkgconfigdir parameter.
+AC_DEFUN([PKG_NOARCH_INSTALLDIR],
+[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])])
+m4_pushdef([pkg_description],
+ [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@])
+AC_ARG_WITH([noarch-pkgconfigdir],
+ [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],,
+ [with_noarch_pkgconfigdir=]pkg_default)
+AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir])
+m4_popdef([pkg_default])
+m4_popdef([pkg_description])
+])dnl PKG_NOARCH_INSTALLDIR
+
+
+dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE,
+dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+dnl -------------------------------------------
+dnl Since: 0.28
+dnl
+dnl Retrieves the value of the pkg-config variable for the given module.
+AC_DEFUN([PKG_CHECK_VAR],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl
+
+_PKG_CONFIG([$1], [variable="][$3]["], [$2])
+AS_VAR_COPY([$1], [pkg_cv_][$1])
+
+AS_VAR_IF([$1], [""], [$5], [$4])dnl
+])dnl PKG_CHECK_VAR
+
+# Copyright (C) 2002-2021 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.
+
+# 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.16'
+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.16.5], [],
+ [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.16.5])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-2021 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.
+
+# 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],
+[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+])
+
+# AM_CONDITIONAL -*- Autoconf -*-
+
+# Copyright (C) 1997-2021 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.
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ([2.52])dnl
+ m4_if([$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-2021 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.
+
+
+# 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", "OBJC", "OBJCXX", "UPC", or "GJC".
+# 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
+
+m4_if([$1], [CC], [depcc="$CC" am_compiler_list=],
+ [$1], [CXX], [depcc="$CXX" am_compiler_list=],
+ [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+ [$1], [OBJCXX], [depcc="$OBJCXX" 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 10 /bin/sh.
+ echo '/* dummy */' > 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], [dnl
+AS_HELP_STRING(
+ [--enable-dependency-tracking],
+ [do not reject slow dependency extractors])
+AS_HELP_STRING(
+ [--disable-dependency-tracking],
+ [speeds up one-time build])])
+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-2021 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.
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[{
+ # Older Autoconf 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.
+ # TODO: see whether this extra hack can be removed once we start
+ # requiring Autoconf 2.70 or later.
+ AS_CASE([$CONFIG_FILES],
+ [*\'*], [eval set x "$CONFIG_FILES"],
+ [*], [set x $CONFIG_FILES])
+ shift
+ # Used to flag and report bootstrapping failures.
+ am_rc=0
+ for am_mf
+ do
+ # Strip MF so we end up with the name of the file.
+ am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile which includes
+ # dependency-tracking related rules and includes.
+ # Grep'ing the whole file directly is not great: AIX grep has a line
+ # limit of 2048, but all sed's we know have understand at least 4000.
+ sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
+ || continue
+ am_dirpart=`AS_DIRNAME(["$am_mf"])`
+ am_filepart=`AS_BASENAME(["$am_mf"])`
+ AM_RUN_LOG([cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles]) || am_rc=$?
+ done
+ if test $am_rc -ne 0; then
+ AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments
+ for automatic dependency tracking. If GNU make was not used, consider
+ re-running the configure script with MAKE="gmake" (or whatever is
+ necessary). You can also try re-running configure with the
+ '--disable-dependency-tracking' option to at least be able to build
+ the package (albeit without support for automatic dependency tracking).])
+ fi
+ AS_UNSET([am_dirpart])
+ AS_UNSET([am_filepart])
+ AS_UNSET([am_mf])
+ AS_UNSET([am_rc])
+ rm -f conftest-deps.mk
+}
+])# _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.
+# This creates each '.Po' and '.Plo' makefile fragment that we'll 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" MAKE="${MAKE-make}"])])
+
+# AM_EXTRA_RECURSIVE_TARGETS -*- Autoconf -*-
+
+# Copyright (C) 2012-2021 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.
+
+# AM_EXTRA_RECURSIVE_TARGETS
+# --------------------------
+# Define the list of user recursive targets. This macro exists only to
+# be traced by Automake, which will ensure that a proper definition of
+# user-defined recursive targets (and associated rules) is propagated
+# into all the generated Makefiles.
+# TODO: We should really reject non-literal arguments here...
+AC_DEFUN([AM_EXTRA_RECURSIVE_TARGETS], [])
+
+# Do all the work for Automake. -*- Autoconf -*-
+
+# Copyright (C) 1996-2021 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 macro actually does too much. Some checks are only needed if
+# your package does certain things. But this isn't really a big deal.
+
+dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O.
+m4_define([AC_PROG_CC],
+m4_defn([AC_PROG_CC])
+[_AM_PROG_CC_C_O
+])
+
+# 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.65])dnl
+m4_ifdef([_$0_ALREADY_INIT],
+ [m4_fatal([$0 expanded multiple times
+]m4_defn([_$0_ALREADY_INIT]))],
+ [m4_define([_$0_ALREADY_INIT], m4_expansion_stack)])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],
+[AC_DIAGNOSE([obsolete],
+ [$0: two- and three-arguments forms are deprecated.])
+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_ifset([AC_PACKAGE_NAME], [ok]):m4_ifset([AC_PACKAGE_VERSION], [ok]),
+ [ok:ok],,
+ [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([AC_PROG_MKDIR_P])dnl
+# For better backward compatibility. To be removed once Automake 1.9.x
+# dies out for good. For more background, see:
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
+# We need awk for the "check" target (and possibly the TAP driver). 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])],
+ [m4_define([AC_PROG_CC],
+ m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [_AM_DEPENDENCIES([CXX])],
+ [m4_define([AC_PROG_CXX],
+ m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+ [_AM_DEPENDENCIES([OBJC])],
+ [m4_define([AC_PROG_OBJC],
+ m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJCXX],
+ [_AM_DEPENDENCIES([OBJCXX])],
+ [m4_define([AC_PROG_OBJCXX],
+ m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl
+])
+# Variables for tags utilities; see am/tags.am
+if test -z "$CTAGS"; then
+ CTAGS=ctags
+fi
+AC_SUBST([CTAGS])
+if test -z "$ETAGS"; then
+ ETAGS=etags
+fi
+AC_SUBST([ETAGS])
+if test -z "$CSCOPE"; then
+ CSCOPE=cscope
+fi
+AC_SUBST([CSCOPE])
+
+AC_REQUIRE([AM_SILENT_RULES])dnl
+dnl The testsuite driver may need to know about EXEEXT, so add the
+dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This
+dnl macro 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
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes. So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+ cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present. This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message. This
+can help us improve future automake versions.
+
+END
+ if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+ echo 'Configuration will proceed anyway, since you have set the' >&2
+ echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+ echo >&2
+ else
+ cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <https://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+ AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
+ fi
+fi
+dnl The trailing newline in this macro's definition is deliberate, for
+dnl backward compatibility and to allow trailing 'dnl'-style comments
+dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841.
+])
+
+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-2021 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.
+
+# 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+set}" != 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-2021 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.
+
+# 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-2021 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.
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check whether make has an 'include' directive that can support all
+# the idioms we need for our automatic dependency tracking code.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive])
+cat > confinc.mk << 'END'
+am__doit:
+ @echo this is the am__doit target >confinc.out
+.PHONY: am__doit
+END
+am__include="#"
+am__quote=
+# BSD make does it like this.
+echo '.include "confinc.mk" # ignored' > confmf.BSD
+# Other make implementations (GNU, Solaris 10, AIX) do it like this.
+echo 'include confinc.mk # ignored' > confmf.GNU
+_am_result=no
+for s in GNU BSD; do
+ AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out])
+ AS_CASE([$?:`cat confinc.out 2>/dev/null`],
+ ['0:this is the am__doit target'],
+ [AS_CASE([$s],
+ [BSD], [am__include='.include' am__quote='"'],
+ [am__include='include' am__quote=''])])
+ if test "$am__include" != "#"; then
+ _am_result="yes ($s style)"
+ break
+ fi
+done
+rm -f confinc.* confmf.*
+AC_MSG_RESULT([${_am_result}])
+AC_SUBST([am__include])])
+AC_SUBST([am__quote])])
+
+# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
+
+# Copyright (C) 1997-2021 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.
+
+# 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 is modern enough.
+# If it is, 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
+ MISSING="\${SHELL} '$am_aux_dir/missing'"
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+ am_missing_run="$MISSING "
+else
+ am_missing_run=
+ AC_MSG_WARN(['missing' script is too old or missing])
+fi
+])
+
+# Helper functions for option handling. -*- Autoconf -*-
+
+# Copyright (C) 2001-2021 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.
+
+# _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])])
+
+# Copyright (C) 1999-2021 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.
+
+# _AM_PROG_CC_C_O
+# ---------------
+# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC
+# to automatically call this.
+AC_DEFUN([_AM_PROG_CC_C_O],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([compile])dnl
+AC_LANG_PUSH([C])dnl
+AC_CACHE_CHECK(
+ [whether $CC understands -c and -o together],
+ [am_cv_prog_cc_c_o],
+ [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])])
+ # Make sure it works both with $CC and with simple cc.
+ # Following AC_PROG_CC_C_O, we do the test twice because some
+ # compilers refuse to overwrite an existing .o file with -o,
+ # though they will create one.
+ am_cv_prog_cc_c_o=yes
+ for am_i in 1 2; do
+ if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \
+ && test -f conftest2.$ac_objext; then
+ : OK
+ else
+ am_cv_prog_cc_c_o=no
+ break
+ fi
+ done
+ rm -f core conftest*
+ unset am_i])
+if test "$am_cv_prog_cc_c_o" != yes; then
+ # Losing compiler, so override with the script.
+ # FIXME: It is wrong to rewrite CC.
+ # But if we don't then we get into trouble of one sort or another.
+ # A longer-term fix would be to have automake use am__CC in this case,
+ # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+ CC="$am_aux_dir/compile $CC"
+fi
+AC_LANG_POP([C])])
+
+# For backward compatibility.
+AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
+
+# Copyright (C) 1999-2021 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.
+
+
+# AM_PATH_PYTHON([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+# ---------------------------------------------------------------------------
+# Adds support for distributing Python modules and packages. To
+# install modules, copy them to $(pythondir), using the python_PYTHON
+# automake variable. To install a package with the same name as the
+# automake package, install to $(pkgpythondir), or use the
+# pkgpython_PYTHON automake variable.
+#
+# The variables $(pyexecdir) and $(pkgpyexecdir) are provided as
+# locations to install python extension modules (shared libraries).
+# Another macro is required to find the appropriate flags to compile
+# extension modules.
+#
+# If your package is configured with a different prefix to python,
+# users will have to add the install directory to the PYTHONPATH
+# environment variable, or create a .pth file (see the python
+# documentation for details).
+#
+# If the MINIMUM-VERSION argument is passed, AM_PATH_PYTHON will
+# cause an error if the version of python installed on the system
+# doesn't meet the requirement. MINIMUM-VERSION should consist of
+# numbers and dots only.
+AC_DEFUN([AM_PATH_PYTHON],
+ [
+ dnl Find a Python interpreter. Python versions prior to 2.0 are not
+ dnl supported. (2.0 was released on October 16, 2000).
+ m4_define_default([_AM_PYTHON_INTERPRETER_LIST],
+[python python2 python3 dnl
+ python3.11 python3.10 dnl
+ python3.9 python3.8 python3.7 python3.6 python3.5 python3.4 python3.3 dnl
+ python3.2 python3.1 python3.0 dnl
+ python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 dnl
+ python2.0])
+
+ AC_ARG_VAR([PYTHON], [the Python interpreter])
+
+ m4_if([$1],[],[
+ dnl No version check is needed.
+ # Find any Python interpreter.
+ if test -z "$PYTHON"; then
+ AC_PATH_PROGS([PYTHON], _AM_PYTHON_INTERPRETER_LIST, :)
+ fi
+ am_display_PYTHON=python
+ ], [
+ dnl A version check is needed.
+ if test -n "$PYTHON"; then
+ # If the user set $PYTHON, use it and don't search something else.
+ AC_MSG_CHECKING([whether $PYTHON version is >= $1])
+ AM_PYTHON_CHECK_VERSION([$PYTHON], [$1],
+ [AC_MSG_RESULT([yes])],
+ [AC_MSG_RESULT([no])
+ AC_MSG_ERROR([Python interpreter is too old])])
+ am_display_PYTHON=$PYTHON
+ else
+ # Otherwise, try each interpreter until we find one that satisfies
+ # VERSION.
+ AC_CACHE_CHECK([for a Python interpreter with version >= $1],
+ [am_cv_pathless_PYTHON],[
+ for am_cv_pathless_PYTHON in _AM_PYTHON_INTERPRETER_LIST none; do
+ test "$am_cv_pathless_PYTHON" = none && break
+ AM_PYTHON_CHECK_VERSION([$am_cv_pathless_PYTHON], [$1], [break])
+ done])
+ # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON.
+ if test "$am_cv_pathless_PYTHON" = none; then
+ PYTHON=:
+ else
+ AC_PATH_PROG([PYTHON], [$am_cv_pathless_PYTHON])
+ fi
+ am_display_PYTHON=$am_cv_pathless_PYTHON
+ fi
+ ])
+
+ if test "$PYTHON" = :; then
+ dnl Run any user-specified action, or abort.
+ m4_default([$3], [AC_MSG_ERROR([no suitable Python interpreter found])])
+ else
+
+ dnl Query Python for its version number. Although site.py simply uses
+ dnl sys.version[:3], printing that failed with Python 3.10, since the
+ dnl trailing zero was eliminated. So now we output just the major
+ dnl and minor version numbers, as numbers. Apparently the tertiary
+ dnl version is not of interest.
+ dnl
+ AC_CACHE_CHECK([for $am_display_PYTHON version], [am_cv_python_version],
+ [am_cv_python_version=`$PYTHON -c "import sys; print ('%u.%u' % sys.version_info[[:2]])"`])
+ AC_SUBST([PYTHON_VERSION], [$am_cv_python_version])
+
+ dnl At times, e.g., when building shared libraries, you may want
+ dnl to know which OS platform Python thinks this is.
+ dnl
+ AC_CACHE_CHECK([for $am_display_PYTHON platform], [am_cv_python_platform],
+ [am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"`])
+ AC_SUBST([PYTHON_PLATFORM], [$am_cv_python_platform])
+
+ dnl emacs-page
+ dnl If --with-python-sys-prefix is given, use the values of sys.prefix
+ dnl and sys.exec_prefix for the corresponding values of PYTHON_PREFIX
+ dnl and PYTHON_EXEC_PREFIX. Otherwise, use the GNU ${prefix} and
+ dnl ${exec_prefix} variables.
+ dnl
+ dnl The two are made distinct variables so they can be overridden if
+ dnl need be, although general consensus is that you shouldn't need
+ dnl this separation.
+ dnl
+ dnl Also allow directly setting the prefixes via configure options,
+ dnl overriding any default.
+ dnl
+ if test "x$prefix" = xNONE; then
+ am__usable_prefix=$ac_default_prefix
+ else
+ am__usable_prefix=$prefix
+ fi
+
+ # Allow user to request using sys.* values from Python,
+ # instead of the GNU $prefix values.
+ AC_ARG_WITH([python-sys-prefix],
+ [AS_HELP_STRING([--with-python-sys-prefix],
+ [use Python's sys.prefix and sys.exec_prefix values])],
+ [am_use_python_sys=:],
+ [am_use_python_sys=false])
+
+ # Allow user to override whatever the default Python prefix is.
+ AC_ARG_WITH([python_prefix],
+ [AS_HELP_STRING([--with-python_prefix],
+ [override the default PYTHON_PREFIX])],
+ [am_python_prefix_subst=$withval
+ am_cv_python_prefix=$withval
+ AC_MSG_CHECKING([for explicit $am_display_PYTHON prefix])
+ AC_MSG_RESULT([$am_cv_python_prefix])],
+ [
+ if $am_use_python_sys; then
+ # using python sys.prefix value, not GNU
+ AC_CACHE_CHECK([for python default $am_display_PYTHON prefix],
+ [am_cv_python_prefix],
+ [am_cv_python_prefix=`$PYTHON -c "import sys; sys.stdout.write(sys.prefix)"`])
+
+ dnl If sys.prefix is a subdir of $prefix, replace the literal value of
+ dnl $prefix with a variable reference so it can be overridden.
+ case $am_cv_python_prefix in
+ $am__usable_prefix*)
+ am__strip_prefix=`echo "$am__usable_prefix" | sed 's|.|.|g'`
+ am_python_prefix_subst=`echo "$am_cv_python_prefix" | sed "s,^$am__strip_prefix,\\${prefix},"`
+ ;;
+ *)
+ am_python_prefix_subst=$am_cv_python_prefix
+ ;;
+ esac
+ else # using GNU prefix value, not python sys.prefix
+ am_python_prefix_subst='${prefix}'
+ am_python_prefix=$am_python_prefix_subst
+ AC_MSG_CHECKING([for GNU default $am_display_PYTHON prefix])
+ AC_MSG_RESULT([$am_python_prefix])
+ fi])
+ # Substituting python_prefix_subst value.
+ AC_SUBST([PYTHON_PREFIX], [$am_python_prefix_subst])
+
+ # emacs-page Now do it all over again for Python exec_prefix, but with yet
+ # another conditional: fall back to regular prefix if that was specified.
+ AC_ARG_WITH([python_exec_prefix],
+ [AS_HELP_STRING([--with-python_exec_prefix],
+ [override the default PYTHON_EXEC_PREFIX])],
+ [am_python_exec_prefix_subst=$withval
+ am_cv_python_exec_prefix=$withval
+ AC_MSG_CHECKING([for explicit $am_display_PYTHON exec_prefix])
+ AC_MSG_RESULT([$am_cv_python_exec_prefix])],
+ [
+ # no explicit --with-python_exec_prefix, but if
+ # --with-python_prefix was given, use its value for python_exec_prefix too.
+ AS_IF([test -n "$with_python_prefix"],
+ [am_python_exec_prefix_subst=$with_python_prefix
+ am_cv_python_exec_prefix=$with_python_prefix
+ AC_MSG_CHECKING([for python_prefix-given $am_display_PYTHON exec_prefix])
+ AC_MSG_RESULT([$am_cv_python_exec_prefix])],
+ [
+ # Set am__usable_exec_prefix whether using GNU or Python values,
+ # since we use that variable for pyexecdir.
+ if test "x$exec_prefix" = xNONE; then
+ am__usable_exec_prefix=$am__usable_prefix
+ else
+ am__usable_exec_prefix=$exec_prefix
+ fi
+ #
+ if $am_use_python_sys; then # using python sys.exec_prefix, not GNU
+ AC_CACHE_CHECK([for python default $am_display_PYTHON exec_prefix],
+ [am_cv_python_exec_prefix],
+ [am_cv_python_exec_prefix=`$PYTHON -c "import sys; sys.stdout.write(sys.exec_prefix)"`])
+ dnl If sys.exec_prefix is a subdir of $exec_prefix, replace the
+ dnl literal value of $exec_prefix with a variable reference so it can
+ dnl be overridden.
+ case $am_cv_python_exec_prefix in
+ $am__usable_exec_prefix*)
+ am__strip_prefix=`echo "$am__usable_exec_prefix" | sed 's|.|.|g'`
+ am_python_exec_prefix_subst=`echo "$am_cv_python_exec_prefix" | sed "s,^$am__strip_prefix,\\${exec_prefix},"`
+ ;;
+ *)
+ am_python_exec_prefix_subst=$am_cv_python_exec_prefix
+ ;;
+ esac
+ else # using GNU $exec_prefix, not python sys.exec_prefix
+ am_python_exec_prefix_subst='${exec_prefix}'
+ am_python_exec_prefix=$am_python_exec_prefix_subst
+ AC_MSG_CHECKING([for GNU default $am_display_PYTHON exec_prefix])
+ AC_MSG_RESULT([$am_python_exec_prefix])
+ fi])])
+ # Substituting python_exec_prefix_subst.
+ AC_SUBST([PYTHON_EXEC_PREFIX], [$am_python_exec_prefix_subst])
+
+ # Factor out some code duplication into this shell variable.
+ am_python_setup_sysconfig="\
+import sys
+# Prefer sysconfig over distutils.sysconfig, for better compatibility
+# with python 3.x. See automake bug#10227.
+try:
+ import sysconfig
+except ImportError:
+ can_use_sysconfig = 0
+else:
+ can_use_sysconfig = 1
+# Can't use sysconfig in CPython 2.7, since it's broken in virtualenvs:
+# <https://github.com/pypa/virtualenv/issues/118>
+try:
+ from platform import python_implementation
+ if python_implementation() == 'CPython' and sys.version[[:3]] == '2.7':
+ can_use_sysconfig = 0
+except ImportError:
+ pass"
+
+ dnl emacs-page Set up 4 directories:
+
+ dnl 1. pythondir: where to install python scripts. This is the
+ dnl site-packages directory, not the python standard library
+ dnl directory like in previous automake betas. This behavior
+ dnl is more consistent with lispdir.m4 for example.
+ dnl Query distutils for this directory.
+ dnl
+ AC_CACHE_CHECK([for $am_display_PYTHON script directory (pythondir)],
+ [am_cv_python_pythondir],
+ [if test "x$am_cv_python_prefix" = x; then
+ am_py_prefix=$am__usable_prefix
+ else
+ am_py_prefix=$am_cv_python_prefix
+ fi
+ am_cv_python_pythondir=`$PYTHON -c "
+$am_python_setup_sysconfig
+if can_use_sysconfig:
+ if hasattr(sysconfig, 'get_default_scheme'):
+ scheme = sysconfig.get_default_scheme()
+ else:
+ scheme = sysconfig._get_default_scheme()
+ if scheme == 'posix_local':
+ # Debian's default scheme installs to /usr/local/ but we want to find headers in /usr/
+ scheme = 'posix_prefix'
+ sitedir = sysconfig.get_path('purelib', scheme, vars={'base':'$am_py_prefix'})
+else:
+ from distutils import sysconfig
+ sitedir = sysconfig.get_python_lib(0, 0, prefix='$am_py_prefix')
+sys.stdout.write(sitedir)"`
+ #
+ case $am_cv_python_pythondir in
+ $am_py_prefix*)
+ am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'`
+ am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,\\${PYTHON_PREFIX},"`
+ ;;
+ *)
+ case $am_py_prefix in
+ /usr|/System*) ;;
+ *) am_cv_python_pythondir="\${PYTHON_PREFIX}/lib/python$PYTHON_VERSION/site-packages"
+ ;;
+ esac
+ ;;
+ esac
+ ])
+ AC_SUBST([pythondir], [$am_cv_python_pythondir])
+
+ dnl 2. pkgpythondir: $PACKAGE directory under pythondir. Was
+ dnl PYTHON_SITE_PACKAGE in previous betas, but this naming is
+ dnl more consistent with the rest of automake.
+ dnl
+ AC_SUBST([pkgpythondir], [\${pythondir}/$PACKAGE])
+
+ dnl 3. pyexecdir: directory for installing python extension modules
+ dnl (shared libraries).
+ dnl Query distutils for this directory.
+ dnl
+ AC_CACHE_CHECK([for $am_display_PYTHON extension module directory (pyexecdir)],
+ [am_cv_python_pyexecdir],
+ [if test "x$am_cv_python_exec_prefix" = x; then
+ am_py_exec_prefix=$am__usable_exec_prefix
+ else
+ am_py_exec_prefix=$am_cv_python_exec_prefix
+ fi
+ am_cv_python_pyexecdir=`$PYTHON -c "
+$am_python_setup_sysconfig
+if can_use_sysconfig:
+ if hasattr(sysconfig, 'get_default_scheme'):
+ scheme = sysconfig.get_default_scheme()
+ else:
+ scheme = sysconfig._get_default_scheme()
+ if scheme == 'posix_local':
+ # Debian's default scheme installs to /usr/local/ but we want to find headers in /usr/
+ scheme = 'posix_prefix'
+ sitedir = sysconfig.get_path('platlib', scheme, vars={'platbase':'$am_py_exec_prefix'})
+else:
+ from distutils import sysconfig
+ sitedir = sysconfig.get_python_lib(1, 0, prefix='$am_py_exec_prefix')
+sys.stdout.write(sitedir)"`
+ #
+ case $am_cv_python_pyexecdir in
+ $am_py_exec_prefix*)
+ am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'`
+ am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,\\${PYTHON_EXEC_PREFIX},"`
+ ;;
+ *)
+ case $am_py_exec_prefix in
+ /usr|/System*) ;;
+ *) am_cv_python_pyexecdir="\${PYTHON_EXEC_PREFIX}/lib/python$PYTHON_VERSION/site-packages"
+ ;;
+ esac
+ ;;
+ esac
+ ])
+ AC_SUBST([pyexecdir], [$am_cv_python_pyexecdir])
+
+ dnl 4. pkgpyexecdir: $(pyexecdir)/$(PACKAGE)
+ dnl
+ AC_SUBST([pkgpyexecdir], [\${pyexecdir}/$PACKAGE])
+
+ dnl Run any user-specified action.
+ $2
+ fi
+])
+
+
+# AM_PYTHON_CHECK_VERSION(PROG, VERSION, [ACTION-IF-TRUE], [ACTION-IF-FALSE])
+# ---------------------------------------------------------------------------
+# Run ACTION-IF-TRUE if the Python interpreter PROG has version >= VERSION.
+# Run ACTION-IF-FALSE otherwise.
+# This test uses sys.hexversion instead of the string equivalent (first
+# word of sys.version), in order to cope with versions such as 2.2c1.
+# This supports Python 2.0 or higher. (2.0 was released on October 16, 2000).
+AC_DEFUN([AM_PYTHON_CHECK_VERSION],
+ [prog="import sys
+# split strings by '.' and convert to numeric. Append some zeros
+# because we need at least 4 digits for the hex conversion.
+# map returns an iterator in Python 3.0 and a list in 2.x
+minver = list(map(int, '$2'.split('.'))) + [[0, 0, 0]]
+minverhex = 0
+# xrange is not present in Python 3.0 and range returns an iterator
+for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[[i]]
+sys.exit(sys.hexversion < minverhex)"
+ AS_IF([AM_RUN_LOG([$1 -c "$prog"])], [$3], [$4])])
+
+# Copyright (C) 2001-2021 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.
+
+# AM_RUN_LOG(COMMAND)
+# -------------------
+# Run COMMAND, save the exit status in ac_status, and log it.
+# (This has been adapted from Autoconf's _AC_RUN_LOG macro.)
+AC_DEFUN([AM_RUN_LOG],
+[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD
+ ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+ (exit $ac_status); }])
+
+# Check to make sure that the build environment is sane. -*- Autoconf -*-
+
+# Copyright (C) 1996-2021 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.
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# 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 (
+ am_has_slept=no
+ for am_try in 1 2; do
+ echo "timestamp, slept: $am_has_slept" > conftest.file
+ 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
+ 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
+ if test "$[2]" = conftest.file || test $am_try -eq 2; then
+ break
+ fi
+ # Just in case.
+ sleep 1
+ am_has_slept=yes
+ done
+ 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])
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+ ( sleep 1 ) &
+ am_sleep_pid=$!
+fi
+AC_CONFIG_COMMANDS_PRE(
+ [AC_MSG_CHECKING([that generated files are newer than configure])
+ if test -n "$am_sleep_pid"; then
+ # Hide warnings about reused PIDs.
+ wait $am_sleep_pid 2>/dev/null
+ fi
+ AC_MSG_RESULT([done])])
+rm -f conftest.file
+])
+
+# Copyright (C) 2009-2021 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.
+
+# 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], [dnl
+AS_HELP_STRING(
+ [--enable-silent-rules],
+ [less verbose build output (undo: "make V=1")])
+AS_HELP_STRING(
+ [--disable-silent-rules],
+ [verbose build output (undo: "make V=0")])dnl
+])
+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-2021 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.
+
+# 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-2021 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.
+
+# _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-2021 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.
+
+# _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}'])
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+
+m4_if([$1], [v7],
+ [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
+
+ [m4_case([$1],
+ [ustar],
+ [# The POSIX 1988 'ustar' format is defined with fixed-size fields.
+ # There is notably a 21 bits limit for the UID and the GID. In fact,
+ # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343
+ # and bug#13588).
+ am_max_uid=2097151 # 2^21 - 1
+ am_max_gid=$am_max_uid
+ # The $UID and $GID variables are not portable, so we need to resort
+ # to the POSIX-mandated id(1) utility. Errors in the 'id' calls
+ # below are definitely unexpected, so allow the users to see them
+ # (that is, avoid stderr redirection).
+ am_uid=`id -u || echo unknown`
+ am_gid=`id -g || echo unknown`
+ AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format])
+ if test $am_uid -le $am_max_uid; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ _am_tools=none
+ fi
+ AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format])
+ if test $am_gid -le $am_max_gid; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ _am_tools=none
+ fi],
+
+ [pax],
+ [],
+
+ [m4_fatal([Unknown tar format])])
+
+ AC_MSG_CHECKING([how to create a $1 tar archive])
+
+ # Go ahead even if we have the value already cached. We do so because we
+ # need to set the values for the 'am__tar' and 'am__untar' variables.
+ _am_tools=${am_cv_prog_tar_$1-$_am_tools}
+
+ 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])
+ AM_RUN_LOG([cat conftest.dir/file])
+ 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/ax_cxx_compile_stdcxx.m4])
+m4_include([m4/ax_cxx_compile_stdcxx_17.m4])
+m4_include([m4/boost.m4])
+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])
+m4_include([m4/m4_ax_valgrind_check.m4])
diff --git a/autogen.sh b/autogen.sh
new file mode 100755
index 0000000..f31e951
--- /dev/null
+++ b/autogen.sh
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+srcdir=`dirname $0`
+test -z "$srcdir" && srcdir=.
+
+olddir=`pwd`
+cd $srcdir
+
+autoreconf -i || {
+ echo "error: autoreconf failed"
+ exit 1
+}
+
+if test x$NOCONFIGURE = x; then
+ ./configure $@
+fi
diff --git a/benchmark/Makefile.am b/benchmark/Makefile.am
new file mode 100644
index 0000000..a2f81eb
--- /dev/null
+++ b/benchmark/Makefile.am
@@ -0,0 +1,30 @@
+
+AM_CPPFLAGS = -I$(top_srcdir)/include
+
+EXTRA_PROGRAMS = \
+ json-parser-test \
+ threaded-json-parser-test
+
+json_parser_test_SOURCES = \
+ json_parser.cpp
+
+json_parser_test_LDADD = \
+ ../src/parser/liborcus-parser-@ORCUS_API_VERSION@.la
+
+json_parser_test_CPPFLAGS = $(AM_CPPFLAGS)
+
+
+threaded_json_parser_test_SOURCES = \
+ threaded_json_parser.cpp
+
+threaded_json_parser_test_LDADD = \
+ ../src/parser/liborcus-parser-@ORCUS_API_VERSION@.la
+
+threaded_json_parser_test_CPPFLAGS = $(AM_CPPFLAGS)
+
+CLEANFILES = $(EXTRA_PROGRAMS)
+
+.PHONY: all
+
+all: $(EXTRA_PROGRAMS)
+
diff --git a/benchmark/Makefile.in b/benchmark/Makefile.in
new file mode 100644
index 0000000..5d29dd5
--- /dev/null
+++ b/benchmark/Makefile.in
@@ -0,0 +1,745 @@
+# Makefile.in generated by automake 1.16.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2021 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.
+
+@SET_MAKE@
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+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@
+EXTRA_PROGRAMS = json-parser-test$(EXEEXT) \
+ threaded-json-parser-test$(EXEEXT)
+subdir = benchmark
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
+ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_17.m4 \
+ $(top_srcdir)/m4/boost.m4 $(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)/m4/m4_ax_valgrind_check.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am_json_parser_test_OBJECTS = json_parser_test-json_parser.$(OBJEXT)
+json_parser_test_OBJECTS = $(am_json_parser_test_OBJECTS)
+json_parser_test_DEPENDENCIES = \
+ ../src/parser/liborcus-parser-@ORCUS_API_VERSION@.la
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+am_threaded_json_parser_test_OBJECTS = \
+ threaded_json_parser_test-threaded_json_parser.$(OBJEXT)
+threaded_json_parser_test_OBJECTS = \
+ $(am_threaded_json_parser_test_OBJECTS)
+threaded_json_parser_test_DEPENDENCIES = \
+ ../src/parser/liborcus-parser-@ORCUS_API_VERSION@.la
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/json_parser_test-json_parser.Po \
+ ./$(DEPDIR)/threaded_json_parser_test-threaded_json_parser.Po
+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_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+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_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(json_parser_test_SOURCES) \
+ $(threaded_json_parser_test_SOURCES)
+DIST_SOURCES = $(json_parser_test_SOURCES) \
+ $(threaded_json_parser_test_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__extra_recursive_targets = check-valgrind-recursive \
+ check-valgrind-memcheck-recursive \
+ check-valgrind-helgrind-recursive check-valgrind-drd-recursive \
+ check-valgrind-sgcheck-recursive
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BOOST_CPPFLAGS = @BOOST_CPPFLAGS@
+BOOST_DATE_TIME_LDFLAGS = @BOOST_DATE_TIME_LDFLAGS@
+BOOST_DATE_TIME_LDPATH = @BOOST_DATE_TIME_LDPATH@
+BOOST_DATE_TIME_LIBS = @BOOST_DATE_TIME_LIBS@
+BOOST_FILESYSTEM_LDFLAGS = @BOOST_FILESYSTEM_LDFLAGS@
+BOOST_FILESYSTEM_LDPATH = @BOOST_FILESYSTEM_LDPATH@
+BOOST_FILESYSTEM_LIBS = @BOOST_FILESYSTEM_LIBS@
+BOOST_IOSTREAMS_LDFLAGS = @BOOST_IOSTREAMS_LDFLAGS@
+BOOST_IOSTREAMS_LDPATH = @BOOST_IOSTREAMS_LDPATH@
+BOOST_IOSTREAMS_LIBS = @BOOST_IOSTREAMS_LIBS@
+BOOST_LDPATH = @BOOST_LDPATH@
+BOOST_PROGRAM_OPTIONS_LDFLAGS = @BOOST_PROGRAM_OPTIONS_LDFLAGS@
+BOOST_PROGRAM_OPTIONS_LDPATH = @BOOST_PROGRAM_OPTIONS_LDPATH@
+BOOST_PROGRAM_OPTIONS_LIBS = @BOOST_PROGRAM_OPTIONS_LIBS@
+BOOST_ROOT = @BOOST_ROOT@
+BOOST_SYSTEM_LDFLAGS = @BOOST_SYSTEM_LDFLAGS@
+BOOST_SYSTEM_LDPATH = @BOOST_SYSTEM_LDPATH@
+BOOST_SYSTEM_LIBS = @BOOST_SYSTEM_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CSCOPE = @CSCOPE@
+CTAGS = @CTAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_VALGRIND_drd = @ENABLE_VALGRIND_drd@
+ENABLE_VALGRIND_helgrind = @ENABLE_VALGRIND_helgrind@
+ENABLE_VALGRIND_memcheck = @ENABLE_VALGRIND_memcheck@
+ENABLE_VALGRIND_sgcheck = @ENABLE_VALGRIND_sgcheck@
+ETAGS = @ETAGS@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+HAVE_CXX17 = @HAVE_CXX17@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+IXION_REQUIRED_API_VERSION = @IXION_REQUIRED_API_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBIXION_CFLAGS = @LIBIXION_CFLAGS@
+LIBIXION_LIBS = @LIBIXION_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MDDS_CFLAGS = @MDDS_CFLAGS@
+MDDS_LIBS = @MDDS_LIBS@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+ORCUS_API_VERSION = @ORCUS_API_VERSION@
+ORCUS_MAJOR_VERSION = @ORCUS_MAJOR_VERSION@
+ORCUS_MICRO_VERSION = @ORCUS_MICRO_VERSION@
+ORCUS_MINOR_VERSION = @ORCUS_MINOR_VERSION@
+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@
+PARQUET_CFLAGS = @PARQUET_CFLAGS@
+PARQUET_LIBS = @PARQUET_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POW_LIB = @POW_LIB@
+PYTHON = @PYTHON@
+PYTHON_CFLAGS = @PYTHON_CFLAGS@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VALGRIND = @VALGRIND@
+VALGRIND_ENABLED = @VALGRIND_ENABLED@
+VERSION = @VERSION@
+ZLIB_CFLAGS = @ZLIB_CFLAGS@
+ZLIB_LIBS = @ZLIB_LIBS@
+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@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+runstatedir = @runstatedir@
+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@
+valgrind_enabled_tools = @valgrind_enabled_tools@
+valgrind_tools = @valgrind_tools@
+AM_CPPFLAGS = -I$(top_srcdir)/include
+json_parser_test_SOURCES = \
+ json_parser.cpp
+
+json_parser_test_LDADD = \
+ ../src/parser/liborcus-parser-@ORCUS_API_VERSION@.la
+
+json_parser_test_CPPFLAGS = $(AM_CPPFLAGS)
+threaded_json_parser_test_SOURCES = \
+ threaded_json_parser.cpp
+
+threaded_json_parser_test_LDADD = \
+ ../src/parser/liborcus-parser-@ORCUS_API_VERSION@.la
+
+threaded_json_parser_test_CPPFLAGS = $(AM_CPPFLAGS)
+CLEANFILES = $(EXTRA_PROGRAMS)
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cpp .lo .o .obj
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign benchmark/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign benchmark/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+json-parser-test$(EXEEXT): $(json_parser_test_OBJECTS) $(json_parser_test_DEPENDENCIES) $(EXTRA_json_parser_test_DEPENDENCIES)
+ @rm -f json-parser-test$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(json_parser_test_OBJECTS) $(json_parser_test_LDADD) $(LIBS)
+
+threaded-json-parser-test$(EXEEXT): $(threaded_json_parser_test_OBJECTS) $(threaded_json_parser_test_DEPENDENCIES) $(EXTRA_threaded_json_parser_test_DEPENDENCIES)
+ @rm -f threaded-json-parser-test$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(threaded_json_parser_test_OBJECTS) $(threaded_json_parser_test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json_parser_test-json_parser.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/threaded_json_parser_test-threaded_json_parser.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.cpp.o:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cpp.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cpp.lo:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+json_parser_test-json_parser.o: json_parser.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_parser_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT json_parser_test-json_parser.o -MD -MP -MF $(DEPDIR)/json_parser_test-json_parser.Tpo -c -o json_parser_test-json_parser.o `test -f 'json_parser.cpp' || echo '$(srcdir)/'`json_parser.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/json_parser_test-json_parser.Tpo $(DEPDIR)/json_parser_test-json_parser.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='json_parser.cpp' object='json_parser_test-json_parser.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_parser_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o json_parser_test-json_parser.o `test -f 'json_parser.cpp' || echo '$(srcdir)/'`json_parser.cpp
+
+json_parser_test-json_parser.obj: json_parser.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_parser_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT json_parser_test-json_parser.obj -MD -MP -MF $(DEPDIR)/json_parser_test-json_parser.Tpo -c -o json_parser_test-json_parser.obj `if test -f 'json_parser.cpp'; then $(CYGPATH_W) 'json_parser.cpp'; else $(CYGPATH_W) '$(srcdir)/json_parser.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/json_parser_test-json_parser.Tpo $(DEPDIR)/json_parser_test-json_parser.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='json_parser.cpp' object='json_parser_test-json_parser.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_parser_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o json_parser_test-json_parser.obj `if test -f 'json_parser.cpp'; then $(CYGPATH_W) 'json_parser.cpp'; else $(CYGPATH_W) '$(srcdir)/json_parser.cpp'; fi`
+
+threaded_json_parser_test-threaded_json_parser.o: threaded_json_parser.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(threaded_json_parser_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT threaded_json_parser_test-threaded_json_parser.o -MD -MP -MF $(DEPDIR)/threaded_json_parser_test-threaded_json_parser.Tpo -c -o threaded_json_parser_test-threaded_json_parser.o `test -f 'threaded_json_parser.cpp' || echo '$(srcdir)/'`threaded_json_parser.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/threaded_json_parser_test-threaded_json_parser.Tpo $(DEPDIR)/threaded_json_parser_test-threaded_json_parser.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='threaded_json_parser.cpp' object='threaded_json_parser_test-threaded_json_parser.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(threaded_json_parser_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o threaded_json_parser_test-threaded_json_parser.o `test -f 'threaded_json_parser.cpp' || echo '$(srcdir)/'`threaded_json_parser.cpp
+
+threaded_json_parser_test-threaded_json_parser.obj: threaded_json_parser.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(threaded_json_parser_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT threaded_json_parser_test-threaded_json_parser.obj -MD -MP -MF $(DEPDIR)/threaded_json_parser_test-threaded_json_parser.Tpo -c -o threaded_json_parser_test-threaded_json_parser.obj `if test -f 'threaded_json_parser.cpp'; then $(CYGPATH_W) 'threaded_json_parser.cpp'; else $(CYGPATH_W) '$(srcdir)/threaded_json_parser.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/threaded_json_parser_test-threaded_json_parser.Tpo $(DEPDIR)/threaded_json_parser_test-threaded_json_parser.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='threaded_json_parser.cpp' object='threaded_json_parser_test-threaded_json_parser.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(threaded_json_parser_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o threaded_json_parser_test-threaded_json_parser.obj `if test -f 'threaded_json_parser.cpp'; then $(CYGPATH_W) 'threaded_json_parser.cpp'; else $(CYGPATH_W) '$(srcdir)/threaded_json_parser.cpp'; fi`
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+check-valgrind-local:
+check-valgrind-memcheck-local:
+check-valgrind-helgrind-local:
+check-valgrind-drd-local:
+check-valgrind-sgcheck-local:
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ 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-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ 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"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @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
+check-am: all-am
+check: check-am
+all-am: Makefile
+installdirs:
+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:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+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)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+check-valgrind: check-valgrind-am
+
+check-valgrind-am: check-valgrind-local
+
+check-valgrind-drd: check-valgrind-drd-am
+
+check-valgrind-drd-am: check-valgrind-drd-local
+
+check-valgrind-helgrind: check-valgrind-helgrind-am
+
+check-valgrind-helgrind-am: check-valgrind-helgrind-local
+
+check-valgrind-memcheck: check-valgrind-memcheck-am
+
+check-valgrind-memcheck-am: check-valgrind-memcheck-local
+
+check-valgrind-sgcheck: check-valgrind-sgcheck-am
+
+check-valgrind-sgcheck-am: check-valgrind-sgcheck-local
+
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -f ./$(DEPDIR)/json_parser_test-json_parser.Po
+ -rm -f ./$(DEPDIR)/threaded_json_parser_test-threaded_json_parser.Po
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+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 ./$(DEPDIR)/json_parser_test-json_parser.Po
+ -rm -f ./$(DEPDIR)/threaded_json_parser_test-threaded_json_parser.Po
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am \
+ check-valgrind-am check-valgrind-drd-am \
+ check-valgrind-drd-local check-valgrind-helgrind-am \
+ check-valgrind-helgrind-local check-valgrind-local \
+ check-valgrind-memcheck-am check-valgrind-memcheck-local \
+ check-valgrind-sgcheck-am check-valgrind-sgcheck-local clean \
+ clean-generic clean-libtool cscopelist-am ctags ctags-am \
+ distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am 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-man install-pdf install-pdf-am \
+ 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 \
+ tags tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+.PHONY: all
+
+all: $(EXTRA_PROGRAMS)
+
+# 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/benchmark/json_parser.cpp b/benchmark/json_parser.cpp
new file mode 100644
index 0000000..509c9b8
--- /dev/null
+++ b/benchmark/json_parser.cpp
@@ -0,0 +1,187 @@
+
+#include <orcus/stream.hpp>
+#include <orcus/json_parser.hpp>
+#include <orcus/json_parser_thread.hpp>
+#include <orcus/string_pool.hpp>
+
+#include <vector>
+#include <iostream>
+#include <stdio.h>
+#include <string>
+#include <sys/time.h>
+
+#define SIMULATE_PROCESSING_OVERHEAD 0
+
+using namespace std;
+using namespace orcus;
+
+namespace {
+
+class stack_printer
+{
+public:
+ explicit stack_printer(const char* msg) :
+ m_msg(msg)
+ {
+ fprintf(stdout, "%s: --begin\n", m_msg.c_str());
+ m_start_time = get_time();
+ }
+
+ ~stack_printer()
+ {
+ double end_time = get_time();
+ fprintf(stdout, "%s: --end (duration: %g sec)\n", m_msg.c_str(), (end_time-m_start_time));
+ }
+
+private:
+ double get_time() const
+ {
+ timeval tv;
+ gettimeofday(&tv, NULL);
+ return tv.tv_sec + tv.tv_usec / 1000000.0;
+ }
+
+ ::std::string m_msg;
+ double m_start_time;
+};
+
+}
+
+class handler
+{
+ string_pool m_pool;
+ json::parse_tokens_t m_tokens;
+ std::vector<double> m_results;
+
+ void do_work()
+ {
+#if SIMULATE_PROCESSING_OVERHEAD
+ double f = m_results.empty() ? 0.0 : m_results.back();
+
+ for (size_t i = 0; i < 1000; ++i)
+ f += 0.1;
+
+ m_results.push_back(f);
+#endif
+ }
+
+public:
+ void begin_parse()
+ {
+ m_tokens.emplace_back(json::parse_token_t::begin_parse);
+ do_work();
+ }
+
+ void end_parse()
+ {
+ m_tokens.emplace_back(json::parse_token_t::end_parse);
+ do_work();
+ }
+
+ void begin_array()
+ {
+ m_tokens.emplace_back(json::parse_token_t::begin_array);
+ do_work();
+ }
+
+ void end_array()
+ {
+ m_tokens.emplace_back(json::parse_token_t::end_array);
+ do_work();
+ }
+
+ void begin_object()
+ {
+ m_tokens.emplace_back(json::parse_token_t::begin_object);
+ do_work();
+ }
+
+ void object_key(std::string_view s, bool transient)
+ {
+ if (transient)
+ s = m_pool.intern(s).first;
+
+ m_tokens.emplace_back(json::parse_token_t::object_key, s);
+ do_work();
+ }
+
+ void end_object()
+ {
+ m_tokens.emplace_back(json::parse_token_t::end_object);
+ do_work();
+ }
+
+ void boolean_true()
+ {
+ m_tokens.emplace_back(json::parse_token_t::boolean_true);
+ do_work();
+ }
+
+ void boolean_false()
+ {
+ m_tokens.emplace_back(json::parse_token_t::boolean_false);
+ do_work();
+ }
+
+ void null()
+ {
+ m_tokens.emplace_back(json::parse_token_t::null);
+ do_work();
+ }
+
+ void string(std::string_view s, bool transient)
+ {
+ if (transient)
+ s = m_pool.intern(s).first;
+
+ m_tokens.emplace_back(json::parse_token_t::string, s);
+ do_work();
+ }
+
+ void number(double val)
+ {
+ m_tokens.emplace_back(val);
+ do_work();
+ }
+
+ size_t token_size() const
+ {
+ return m_tokens.size();
+ }
+
+ double work_value() const
+ {
+ return m_results.back();
+ }
+};
+
+int main(int argc, char** argv) try
+{
+ if (argc < 2)
+ return EXIT_FAILURE;
+
+ const char* filepath = argv[1];
+ orcus::file_content content(filepath);
+
+ cout << "file: " << filepath << endl;
+
+ handler hdl;
+
+ {
+ stack_printer __stack_printer__("parsing");
+ orcus::json_parser<handler> parser(content.str(), hdl);
+ parser.parse();
+ }
+
+ cout << "parsed token count: " << hdl.token_size() << endl;
+#if SIMULATE_PROCESSING_OVERHEAD
+ cout << "work value: " << hdl.work_value() << endl;
+#endif
+
+ return EXIT_SUCCESS;
+}
+catch (const std::exception& e)
+{
+ cerr << e.what() << endl;
+ return EXIT_FAILURE;
+}
diff --git a/benchmark/threaded_json_parser.cpp b/benchmark/threaded_json_parser.cpp
new file mode 100644
index 0000000..f2e94fa
--- /dev/null
+++ b/benchmark/threaded_json_parser.cpp
@@ -0,0 +1,209 @@
+
+#include <orcus/stream.hpp>
+#include <orcus/threaded_json_parser.hpp>
+#include <orcus/string_pool.hpp>
+
+#include <vector>
+#include <iostream>
+#include <stdio.h>
+#include <string>
+#include <sys/time.h>
+
+#define SIMULATE_PROCESSING_OVERHEAD 0
+
+using namespace std;
+using namespace orcus;
+
+namespace {
+
+class stack_printer
+{
+public:
+ explicit stack_printer(const char* msg) :
+ m_msg(msg)
+ {
+ fprintf(stdout, "%s: --begin\n", m_msg.c_str());
+ m_start_time = get_time();
+ }
+
+ ~stack_printer()
+ {
+ double end_time = get_time();
+ fprintf(stdout, "%s: --end (duration: %g sec)\n", m_msg.c_str(), (end_time-m_start_time));
+ }
+
+private:
+ double get_time() const
+ {
+ timeval tv;
+ gettimeofday(&tv, NULL);
+ return tv.tv_sec + tv.tv_usec / 1000000.0;
+ }
+
+ ::std::string m_msg;
+ double m_start_time;
+};
+
+}
+
+class handler
+{
+ string_pool m_pool;
+ json::parse_tokens_t m_tokens;
+ std::vector<double> m_results;
+
+ void do_work()
+ {
+#if SIMULATE_PROCESSING_OVERHEAD
+ double f = m_results.empty() ? 0.0 : m_results.back();
+
+ for (size_t i = 0; i < 1000; ++i)
+ f += 0.1;
+
+ m_results.push_back(f);
+#endif
+ }
+
+public:
+ void begin_parse()
+ {
+ m_tokens.emplace_back(json::parse_token_t::begin_parse);
+ do_work();
+ }
+
+ void end_parse()
+ {
+ m_tokens.emplace_back(json::parse_token_t::end_parse);
+ do_work();
+ }
+
+ void begin_array()
+ {
+ m_tokens.emplace_back(json::parse_token_t::begin_array);
+ do_work();
+ }
+
+ void end_array()
+ {
+ m_tokens.emplace_back(json::parse_token_t::end_array);
+ do_work();
+ }
+
+ void begin_object()
+ {
+ m_tokens.emplace_back(json::parse_token_t::begin_object);
+ do_work();
+ }
+
+ void object_key(const char* p, size_t len, bool transient)
+ {
+ std::string_view s{p, len};
+ if (transient)
+ s = m_pool.intern(s).first;
+
+ m_tokens.emplace_back(json::parse_token_t::object_key, s);
+ do_work();
+ }
+
+ void end_object()
+ {
+ m_tokens.emplace_back(json::parse_token_t::end_object);
+ do_work();
+ }
+
+ void boolean_true()
+ {
+ m_tokens.emplace_back(json::parse_token_t::boolean_true);
+ do_work();
+ }
+
+ void boolean_false()
+ {
+ m_tokens.emplace_back(json::parse_token_t::boolean_false);
+ do_work();
+ }
+
+ void null()
+ {
+ m_tokens.emplace_back(json::parse_token_t::null);
+ do_work();
+ }
+
+ void string(const char* p, size_t len, bool transient)
+ {
+ std::string_view s{p, len};
+ if (transient)
+ s = m_pool.intern(s).first;
+
+ m_tokens.emplace_back(json::parse_token_t::string, s);
+ do_work();
+ }
+
+ void number(double val)
+ {
+ m_tokens.emplace_back(val);
+ do_work();
+ }
+
+ size_t token_size() const
+ {
+ return m_tokens.size();
+ }
+
+ double work_value() const
+ {
+ return m_results.back();
+ }
+};
+
+int main(int argc, char** argv) try
+{
+ if (argc < 2)
+ return EXIT_FAILURE;
+
+ const char* filepath = argv[1];
+ orcus::file_content content(filepath);
+
+ size_t min_token_size = 0;
+ size_t max_token_size = 0;
+
+ if (argc >= 3)
+ {
+ const char* p = argv[2];
+ min_token_size = strtol(p, nullptr, 10);
+ }
+
+ if (argc >= 4)
+ {
+ const char* p = argv[3];
+ max_token_size = strtol(p, nullptr, 10);
+ }
+
+ cout << "file: " << filepath << endl;
+ cout << "min token size: " << min_token_size << endl;
+ cout << "max token size: " << max_token_size << endl;
+
+ handler hdl;
+ orcus::json::parser_stats stats;
+ {
+ stack_printer __stack_printer__("parsing");
+ orcus::threaded_json_parser<handler> parser(content.data(), content.size(), hdl, min_token_size, max_token_size);
+ parser.parse();
+
+ stats = parser.get_stats();
+ }
+
+ cout << "final token buffer size threshold: " << stats.token_buffer_size_threshold << endl;
+
+ cout << "parsed token count: " << hdl.token_size() << endl;
+#if SIMULATE_PROCESSING_OVERHEAD
+ cout << "work value: " << hdl.work_value() << endl;
+#endif
+
+ return EXIT_SUCCESS;
+}
+catch (const std::exception& e)
+{
+ cerr << e.what() << endl;
+ return EXIT_FAILURE;
+}
diff --git a/bin/build-extra-dist.sh b/bin/build-extra-dist.sh
new file mode 100755
index 0000000..3c76312
--- /dev/null
+++ b/bin/build-extra-dist.sh
@@ -0,0 +1,26 @@
+#!/usr/bin/env bash
+#
+# Script to build lists of extra dist files by category.
+# Output of this script should go into Makefile.am at the project root.
+
+function print_list()
+{
+ local _DIR=$1
+ local _NAME=$_DIR"_data"
+
+ echo "$_NAME = \\"
+ local _BASE_CMD="git ls-tree --full-tree --name-only -r HEAD -- $_DIR"
+ $_BASE_CMD | sed -e 's/\#/\\\#/g' | head -n -1 | sed -e 's/^/\t/g' -e 's/$/\ \\/g'
+ $_BASE_CMD | sed -e 's/\#/\\\#/g' | tail -n 1 | sed -e 's/^/\t/g'
+ echo ""
+}
+
+PROGDIR=`dirname $0`
+cd "../$PROGDIR"
+
+print_list doc
+print_list doc_example
+print_list bin
+print_list misc
+print_list slickedit
+print_list test
diff --git a/bin/env-osx.sh b/bin/env-osx.sh
new file mode 100644
index 0000000..a7c2e8e
--- /dev/null
+++ b/bin/env-osx.sh
@@ -0,0 +1,16 @@
+
+# Source this to set the debug environment for OSX.
+
+PROGDIR=`dirname $0`
+ROOTDIR="$PROGDIR/.."
+
+PARSER_DIR="$ROOTDIR/src/parser/.libs"
+LIBORCUS_DIR="$ROOTDIR/src/liborcus/.libs"
+SPREADSHEET_DIR="$ROOTDIR/src/spreadsheet/.libs"
+
+LD_PATH="$PARSER_DIR:$LIBORCUS_DIR:$SPREADSHEET_DIR"
+
+export DYLD_LIBRARY_PATH="$LD_PATH"
+
+
+
diff --git a/bin/gen-cli-docs.py b/bin/gen-cli-docs.py
new file mode 100755
index 0000000..39e8a72
--- /dev/null
+++ b/bin/gen-cli-docs.py
@@ -0,0 +1,173 @@
+#!/usr/bin/env python3
+
+import argparse
+import subprocess
+import io
+import os
+import copy
+from pathlib import Path
+
+
+def _print_option(writable, option, description):
+ line = ' '.join(option)
+ print(f"- ``{line}``", file=writable)
+ print(file=writable)
+
+ line_buf = list()
+ description_cleaned = list()
+ for line in description:
+ if not line_buf:
+ line_buf = copy.deepcopy(line)
+ continue
+
+ if not line:
+ # empty line
+ if line_buf:
+ description_cleaned.append(line_buf)
+ description_cleaned.append(line)
+ line_buf = list()
+ continue
+
+ if line[0] == '*':
+ description_cleaned.append(line_buf)
+ line_buf = list()
+
+ line_buf.extend(line)
+
+ if line_buf:
+ description_cleaned.append(line_buf)
+
+ for line in description_cleaned:
+ if line and line[0] == '*':
+ line[0] = '-'
+ line = " " + ' '.join(line)
+ print(f" {line}", file=writable)
+ continue
+
+ print(" " + ' '.join(line), file=writable)
+
+ print(file=writable)
+
+
+def _parse_and_print(writable, cmd_name, lines):
+ print(cmd_name, file=writable)
+ print('=' * len(cmd_name), file=writable)
+ print(file=writable)
+
+ # Usage (1st line)
+ line = lines[0]
+ prefix = "Usage: "
+ if not line.startswith(prefix):
+ raise RuntimeError("invalid output")
+
+ cmd = line[len(prefix):]
+ print("Usage", file=writable)
+ print("-----", file=writable)
+ print(file=writable)
+ print(".. code-block::", file=writable)
+ print(file=writable)
+ print(f" {cmd}", file=writable)
+ print(file=writable)
+
+ # Description (sentence block right below usage)
+ for i, line in enumerate(lines[2:]):
+ if line == "Options:":
+ break
+ print(line, file=writable)
+
+ # Allowed option title
+ lineno = i + 2
+ line = lines[lineno]
+ if not line or line[-1] != ':':
+ print(lines)
+ raise RuntimeError("invalid section title")
+
+ line = line[:-1]
+ print(line, file=writable)
+ print('-' * len(line), file=writable)
+ print(file=writable)
+
+ # Options
+ lineno += 1
+
+ # determine the first indent length from the first line.
+ indent = 0
+ while lines[lineno][indent] == ' ':
+ indent += 1
+
+ # determine the column position of the option description.
+ desc_pos = lines[lineno].find("Print this help.")
+ if desc_pos < 0:
+ raise RuntimeError("failed to parse the --help option line.")
+
+ option_buf = list()
+ desc_buf = list()
+ for line in lines[lineno:]:
+ if not line:
+ continue
+
+ option_s = line[indent:desc_pos]
+ desc_s = line[desc_pos:]
+
+ if option_s and option_s[0] == '-':
+ # start a new option. if the current buffer is not empty, flush it first.
+ if option_buf:
+ _print_option(writable, option_buf, desc_buf)
+
+ option_buf = option_s.split()
+ desc_buf = list()
+
+ desc_buf.append(desc_s.split())
+
+ if option_buf:
+ _print_option(writable, option_buf, desc_buf)
+
+
+def parse(cmd_dir, output_dir, cmd_name):
+ os.makedirs(output_dir, exist_ok=True)
+ cmd_path = cmd_dir / cmd_name
+ s = cmd_name.replace('-', '_')
+ output_path = output_dir / f"{s}.rst"
+ if not cmd_path.is_file():
+ raise RuntimeError(f"command not found: {cmd_path}")
+
+ output = subprocess.run([cmd_path, "-h"], stdout=subprocess.PIPE).stdout
+ output = output.decode("utf-8")
+ lines = output.split('\n')
+
+ with open(output_path, "w") as f:
+ _parse_and_print(f, cmd_name, lines)
+
+
+def main():
+ parser = argparse.ArgumentParser(
+ description="Parse the output from the cli help, and convert it to rst output.")
+ parser.add_argument(
+ "--cmd-dir", "-c", type=Path, required=True,
+ help="path to the directory where the orcus commands are.")
+ parser.add_argument(
+ "--output-dir", "-o", type=Path, required=True,
+ help="path to the output directory.")
+ args = parser.parse_args()
+
+ if not args.cmd_dir.is_dir():
+ raise RuntimeError(f"invalid command directory: {args.cmd_dir}")
+
+ cmds = (
+ "orcus-csv",
+ "orcus-ods",
+ "orcus-xlsx",
+ "orcus-gnumeric",
+ "orcus-json",
+ "orcus-xml",
+ "orcus-xls-xml",
+ "orcus-yaml",
+ "orcus-parquet",
+ )
+ for cmd in cmds:
+ parse(args.cmd_dir, args.output_dir, cmd)
+
+
+if __name__ == "__main__":
+ main()
+
diff --git a/bin/gen-files.py b/bin/gen-files.py
new file mode 100644
index 0000000..5684277
--- /dev/null
+++ b/bin/gen-files.py
@@ -0,0 +1,83 @@
+#!/usr/bin/env python3
+"""Script to generate files from the .in files the same way autoconf does.
+
+It is to be used only when autoconf is not used to do the build.
+"""
+
+import argparse
+import os.path
+import sys
+
+
+class FileGenerator(object):
+
+ @staticmethod
+ def parse_properties(props):
+ d = dict()
+ for kv in props:
+ key, value = kv.split('=')
+ d[key] = value
+ return d
+
+ def __init__(self, props, outfiles):
+ self.__props = FileGenerator.parse_properties(props)
+ self.__outfiles = outfiles
+
+ def run(self):
+ for outfile in self.__outfiles:
+ infile = "{}.in".format(outfile)
+ print(infile)
+ print(outfile)
+ with open(infile, 'r') as f:
+ content = f.read()
+ self.__write_file(outfile, content)
+
+ def __write_file(self, outfile, src_content):
+ with open(outfile, 'w') as f:
+ keyword_pos = None
+ content_pos = 0
+ for i, c in enumerate(src_content):
+ if c != '@':
+ continue
+
+ if keyword_pos is None:
+ # new keyword detected.
+ keyword_pos = i
+ # flush content to the destination file.
+ f.write(src_content[content_pos:i])
+ else:
+ # keyword span has just ended.
+ key = src_content[keyword_pos+1:i]
+ keyword_pos = None
+ # perform keyword substitution.
+ if key not in self.__props:
+ raise RuntimeError("value for {} not defined!".format(key))
+ f.write(self.__props[key])
+ content_pos = i + 1
+
+ if keyword_pos is not None:
+ raise RuntimeError("malformed template file!")
+
+ # flush the rest of the content to the destination file.
+ f.write(src_content[content_pos:])
+
+
+def main():
+ parser = argparse.ArgumentParser(description="Generate files from the .in files.")
+ parser.add_argument(
+ "--properties", type=str, nargs="+",
+ required=True,
+ help="Comma-separated strings representing multiple key-value pairs.")
+ parser.add_argument(
+ "--files", type=str, nargs="+",
+ help="""Source template files from which to generate final files. Each
+ file is expected to end with '.in' but you should not include the '.in'
+ suffix in the argument to this script.""")
+
+ args = parser.parse_args()
+ generator = FileGenerator(args.properties, args.files)
+ generator.run()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/bin/gen-gfm-release-table.sh b/bin/gen-gfm-release-table.sh
new file mode 100755
index 0000000..306c9a9
--- /dev/null
+++ b/bin/gen-gfm-release-table.sh
@@ -0,0 +1,30 @@
+#!/usr/bin/env bash
+
+PROJ_PREFIX=orcus
+PKG_PREFIX=lib$PROJ_PREFIX
+
+# Pick up the version number string from configure.ac.
+VER_MAJOR=$(cat ./configure.ac | grep -E $PROJ_PREFIX"_major_version.*[0-9]" | sed -e "s/.*\[\([0-9][0-9]*\).*/\1/g")
+VER_MINOR=$(cat ./configure.ac | grep -E $PROJ_PREFIX"_minor_version.*[0-9]" | sed -e "s/.*\[\([0-9][0-9]*\).*/\1/g")
+VER_MICRO=$(cat ./configure.ac | grep -E $PROJ_PREFIX"_micro_version.*[0-9]" | sed -e "s/.*\[\([0-9][0-9]*\).*/\1/g")
+VER="$VER_MAJOR.$VER_MINOR.$VER_MICRO"
+
+PKGS=$(ls $PKG_PREFIX-$VER.tar.*)
+
+echo "## Release Notes"
+echo ""
+echo "* add item"
+echo ""
+echo "## Source packages for distribution"
+echo ""
+
+echo "| URL | sha256sum | size |"
+echo "|-----|-----------|------|"
+
+for _PKG in $PKGS; do
+ _URL="[$_PKG](https://kohei.us/files/$PROJ_PREFIX/src/$_PKG)"
+ _HASH=$(sha256sum $_PKG | sed -e "s/^\(.*\)$PKG_PREFIX.*/\1/g" | tr -d "[:space:]")
+ _SIZE=$(stat -c "%s" $_PKG)
+ echo "| $_URL | $_HASH | $_SIZE |"
+done
+
diff --git a/bin/gen-test-json-structure-outputs.sh b/bin/gen-test-json-structure-outputs.sh
new file mode 100755
index 0000000..afe0181
--- /dev/null
+++ b/bin/gen-test-json-structure-outputs.sh
@@ -0,0 +1,14 @@
+#!/usr/bin/env bash
+
+PROGDIR=`dirname $0`
+TESTDIR="$PROGDIR/../test/json-structure"
+ORCUS_JSON_EXEC="$PROGDIR/../src/orcus-json"
+
+for _DIR in $(ls $TESTDIR); do
+ echo "processing $_DIR..."
+ _DIR="$TESTDIR/$_DIR"
+ _INPUT="$_DIR/input.json"
+ _OUTPUT="$_DIR/check.txt"
+ $ORCUS_JSON_EXEC --mode structure -o "$_OUTPUT" "$_INPUT"
+done
+
diff --git a/bin/gen-test-xml-outputs.sh b/bin/gen-test-xml-outputs.sh
new file mode 100755
index 0000000..137b20c
--- /dev/null
+++ b/bin/gen-test-xml-outputs.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+
+PROGDIR=`dirname $0`
+TESTDIR="$PROGDIR/../test/xml"
+ORCUS_XML_EXEC="$PROGDIR/../src/orcus-xml"
+
+for _DIR in $(ls $TESTDIR); do
+ _DIR="$TESTDIR/$_DIR"
+ _INPUT="$_DIR/input.xml"
+ _OUTPUT="$_DIR/check.txt"
+
+ if [ ! -f "$_INPUT" ]; then
+ continue
+ fi
+
+ echo "processing $_DIR..."
+ $ORCUS_XML_EXEC --mode dump -o "$_OUTPUT" "$_INPUT"
+done
+
diff --git a/bin/run-bulk-tests.py b/bin/run-bulk-tests.py
new file mode 100755
index 0000000..a2dd6b1
--- /dev/null
+++ b/bin/run-bulk-tests.py
@@ -0,0 +1,63 @@
+#!/usr/bin/env python3
+########################################################################
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+########################################################################
+
+import argparse
+import io
+import os
+import subprocess
+from pathlib import Path
+
+
+def main():
+ desc = """Tool to bulk-test a number of files and collect all their results
+ into a single output directory."""
+
+ parser = argparse.ArgumentParser(description=desc)
+ parser.add_argument("--args", type=str, required=True)
+ parser.add_argument("--ext", "-e", type=str, required=True, help="File extension to use.")
+ parser.add_argument("--outdir", "-o", type=Path, required=True, help="Output directory to put the run results in.")
+ parser.add_argument("dirs", nargs='*', type=Path)
+ args = parser.parse_args()
+
+ args.outdir.joinpath("good").mkdir(parents=True, exist_ok=True)
+ args.outdir.joinpath("bad").mkdir(parents=True, exist_ok=True)
+
+ ext = args.ext
+ if ext and ext[0] != '.':
+ ext = f".{ext}"
+
+ count = 0
+ for parent_dir in args.dirs:
+ for rootdir, _, files in os.walk(parent_dir):
+ for f in files:
+ filepath = Path(rootdir) / f
+ if filepath.suffix != ext:
+ continue
+
+ buf = io.StringIO()
+ cmd = args.args.split()
+ cmd.append(str(filepath))
+ res = subprocess.run(cmd, capture_output=True)
+ outpath = args.outdir
+ outpath /= "good" if res.returncode == 0 else "bad"
+ outpath /= f"{count:04d}.txt"
+ print("-- command --", file=buf)
+ print(" ".join(cmd), file=buf)
+ print("-- return-code --", file=buf)
+ print(res.returncode, file=buf)
+ print("-- stdout --", file=buf)
+ print(res.stdout.decode("utf-8"), file=buf)
+ print("-- stderr --", file=buf)
+ print(res.stderr.decode("utf-8"), file=buf)
+ outpath.write_text(buf.getvalue())
+ count += 1
+
+
+if __name__ == "__main__":
+ main()
diff --git a/bin/run-python.sh b/bin/run-python.sh
new file mode 100755
index 0000000..f3d314a
--- /dev/null
+++ b/bin/run-python.sh
@@ -0,0 +1,47 @@
+#!/usr/bin/env bash
+
+PYTHON=$(which python3)
+PROGDIR=$(dirname $0)
+_PYTHONPATH="$PROGDIR/../src/python/.libs:$PROGDIR/../src/python"
+
+export PYTHONPATH=$_PYTHONPATH:$PYTHONPATH
+export LD_LIBRARY_PATH="$PROGDIR/../src/liborcus/.libs:$PROGDIR/../src/parser/.libs"
+export DYLD_LIBRARY_PATH=$LD_LIBRARY_PATH
+
+if [ "$1" == "" ]; then
+ # No input file. Just invoke the interpreter.
+ $PYTHON
+ exit 0
+fi
+
+RUNMODE=
+
+if [ "$1" == "gdb" ]; then
+ RUNMODE=gdb
+ shift
+elif [ "$1" == "valgrind" ]; then
+ RUNMODE=valgrind
+ shift
+fi
+
+if [ ! -e "$1" ]; then
+ echo "file '$1' does not exist"
+ exit 1
+fi
+
+EXEC="$1"
+shift
+
+case $RUNMODE in
+ gdb)
+ gdb --args $PYTHON "$PWD/$EXEC" "$@"
+ ;;
+ valgrind)
+ valgrind --tool=memcheck --leak-check=full --show-leak-kinds=all --track-origins=yes $PYTHON "$PWD/$EXEC" "$@"
+ ;;
+ *)
+ exec "$PWD/$EXEC" "$@"
+ ;;
+esac
+
+
diff --git a/bin/unpack-zipped-xml.sh b/bin/unpack-zipped-xml.sh
new file mode 100755
index 0000000..ac22fe9
--- /dev/null
+++ b/bin/unpack-zipped-xml.sh
@@ -0,0 +1,49 @@
+#!/usr/bin/env bash
+
+# global constants
+outdir=xml
+
+function abort()
+{
+ (>&2 echo "$1") # output to stderr
+ exit 1
+}
+
+filepath="$1"
+
+if [ -z "$filepath" ]; then
+ abort "file path is not given."
+fi
+
+shift
+
+# convert the file path to absolute path.
+filepath=`realpath "$filepath"`
+
+# remove existing output directory if one exists.
+if [ -d $outdir ]; then
+ rm -rf $outdir || abort "failed to remove the existing output directory '$outdir'."
+fi
+
+mkdir $outdir || abort "failed to create an output directory '$outdir'."
+
+# unzip all inside the output directory.
+cd $outdir
+unzip "$filepath" > /dev/null || abort "failed to unzip $filepath."
+
+# temporarily replace bash's internal field separators to handle file names with spaces.
+_IFS="$IFS"
+IFS=$'\n'
+
+for _file in $(find . -type f); do
+ _mimetype=`file --mime-type --brief "$_file"` || abort "failed to determine the mime type of $_file."
+ if [ $_mimetype = "application/xml" ] || [ $_mimetype = "text/xml" ]; then
+ # beautify the XML file content.
+ _temp=$(mktemp) || abort "failed to create a temporary file."
+ xmllint --format $_file > $_temp || abort "failed to run xmllint on $_file."
+ mv $_temp $_file || abort "failed to update $_file."
+ fi
+done
+
+# restore the original separators.
+IFS="$_IFS"
diff --git a/compile b/compile
new file mode 100755
index 0000000..df363c8
--- /dev/null
+++ b/compile
@@ -0,0 +1,348 @@
+#! /bin/sh
+# Wrapper for compilers which do not understand '-c -o'.
+
+scriptversion=2018-03-07.03; # UTC
+
+# Copyright (C) 1999-2021 Free Software Foundation, Inc.
+# Written by Tom Tromey <tromey@cygnus.com>.
+#
+# 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 <https://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.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+nl='
+'
+
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent tools from complaining about whitespace usage.
+IFS=" "" $nl"
+
+file_conv=
+
+# func_file_conv build_file lazy
+# Convert a $build file to $host form and store it in $file
+# Currently only supports Windows hosts. If the determined conversion
+# type is listed in (the comma separated) LAZY, no conversion will
+# take place.
+func_file_conv ()
+{
+ file=$1
+ case $file in
+ / | /[!/]*) # absolute file, and not a UNC file
+ if test -z "$file_conv"; then
+ # lazily determine how to convert abs files
+ case `uname -s` in
+ MINGW*)
+ file_conv=mingw
+ ;;
+ CYGWIN* | MSYS*)
+ file_conv=cygwin
+ ;;
+ *)
+ file_conv=wine
+ ;;
+ esac
+ fi
+ case $file_conv/,$2, in
+ *,$file_conv,*)
+ ;;
+ mingw/*)
+ file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
+ ;;
+ cygwin/* | msys/*)
+ file=`cygpath -m "$file" || echo "$file"`
+ ;;
+ wine/*)
+ file=`winepath -w "$file" || echo "$file"`
+ ;;
+ esac
+ ;;
+ esac
+}
+
+# func_cl_dashL linkdir
+# Make cl look for libraries in LINKDIR
+func_cl_dashL ()
+{
+ func_file_conv "$1"
+ if test -z "$lib_path"; then
+ lib_path=$file
+ else
+ lib_path="$lib_path;$file"
+ fi
+ linker_opts="$linker_opts -LIBPATH:$file"
+}
+
+# func_cl_dashl library
+# Do a library search-path lookup for cl
+func_cl_dashl ()
+{
+ lib=$1
+ found=no
+ save_IFS=$IFS
+ IFS=';'
+ for dir in $lib_path $LIB
+ do
+ IFS=$save_IFS
+ if $shared && test -f "$dir/$lib.dll.lib"; then
+ found=yes
+ lib=$dir/$lib.dll.lib
+ break
+ fi
+ if test -f "$dir/$lib.lib"; then
+ found=yes
+ lib=$dir/$lib.lib
+ break
+ fi
+ if test -f "$dir/lib$lib.a"; then
+ found=yes
+ lib=$dir/lib$lib.a
+ break
+ fi
+ done
+ IFS=$save_IFS
+
+ if test "$found" != yes; then
+ lib=$lib.lib
+ fi
+}
+
+# func_cl_wrapper cl arg...
+# Adjust compile command to suit cl
+func_cl_wrapper ()
+{
+ # Assume a capable shell
+ lib_path=
+ shared=:
+ linker_opts=
+ for arg
+ do
+ if test -n "$eat"; then
+ eat=
+ else
+ case $1 in
+ -o)
+ # configure might choose to run compile as 'compile cc -o foo foo.c'.
+ eat=1
+ case $2 in
+ *.o | *.[oO][bB][jJ])
+ func_file_conv "$2"
+ set x "$@" -Fo"$file"
+ shift
+ ;;
+ *)
+ func_file_conv "$2"
+ set x "$@" -Fe"$file"
+ shift
+ ;;
+ esac
+ ;;
+ -I)
+ eat=1
+ func_file_conv "$2" mingw
+ set x "$@" -I"$file"
+ shift
+ ;;
+ -I*)
+ func_file_conv "${1#-I}" mingw
+ set x "$@" -I"$file"
+ shift
+ ;;
+ -l)
+ eat=1
+ func_cl_dashl "$2"
+ set x "$@" "$lib"
+ shift
+ ;;
+ -l*)
+ func_cl_dashl "${1#-l}"
+ set x "$@" "$lib"
+ shift
+ ;;
+ -L)
+ eat=1
+ func_cl_dashL "$2"
+ ;;
+ -L*)
+ func_cl_dashL "${1#-L}"
+ ;;
+ -static)
+ shared=false
+ ;;
+ -Wl,*)
+ arg=${1#-Wl,}
+ save_ifs="$IFS"; IFS=','
+ for flag in $arg; do
+ IFS="$save_ifs"
+ linker_opts="$linker_opts $flag"
+ done
+ IFS="$save_ifs"
+ ;;
+ -Xlinker)
+ eat=1
+ linker_opts="$linker_opts $2"
+ ;;
+ -*)
+ set x "$@" "$1"
+ shift
+ ;;
+ *.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
+ func_file_conv "$1"
+ set x "$@" -Tp"$file"
+ shift
+ ;;
+ *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
+ func_file_conv "$1" mingw
+ set x "$@" "$file"
+ shift
+ ;;
+ *)
+ set x "$@" "$1"
+ shift
+ ;;
+ esac
+ fi
+ shift
+ done
+ if test -n "$linker_opts"; then
+ linker_opts="-link$linker_opts"
+ fi
+ exec "$@" $linker_opts
+ exit 1
+}
+
+eat=
+
+case $1 in
+ '')
+ echo "$0: No command. Try '$0 --help' for more information." 1>&2
+ exit 1;
+ ;;
+ -h | --h*)
+ cat <<\EOF
+Usage: compile [--help] [--version] PROGRAM [ARGS]
+
+Wrapper for compilers which do not understand '-c -o'.
+Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
+arguments, and rename the output as expected.
+
+If you are trying to build a whole package this is not the
+right script to run: please start by reading the file 'INSTALL'.
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+ exit $?
+ ;;
+ -v | --v*)
+ echo "compile $scriptversion"
+ exit $?
+ ;;
+ cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \
+ icl | *[/\\]icl | icl.exe | *[/\\]icl.exe )
+ func_cl_wrapper "$@" # Doesn't return...
+ ;;
+esac
+
+ofile=
+cfile=
+
+for arg
+do
+ if test -n "$eat"; then
+ eat=
+ else
+ case $1 in
+ -o)
+ # configure might choose to run compile as 'compile cc -o foo foo.c'.
+ # So we strip '-o arg' only if arg is an object.
+ eat=1
+ case $2 in
+ *.o | *.obj)
+ ofile=$2
+ ;;
+ *)
+ set x "$@" -o "$2"
+ shift
+ ;;
+ esac
+ ;;
+ *.c)
+ cfile=$1
+ set x "$@" "$1"
+ shift
+ ;;
+ *)
+ set x "$@" "$1"
+ shift
+ ;;
+ esac
+ fi
+ shift
+done
+
+if test -z "$ofile" || test -z "$cfile"; then
+ # If no '-o' option was seen then we might have been invoked from a
+ # pattern rule where we don't need one. That is ok -- this is a
+ # normal compilation that the losing compiler can handle. If no
+ # '.c' file was seen then we are probably linking. That is also
+ # ok.
+ exec "$@"
+fi
+
+# Name of file we expect compiler to create.
+cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
+
+# Create the lock directory.
+# Note: use '[/\\:.-]' here to ensure that we don't use the same name
+# that we are using for the .o file. Also, base the name on the expected
+# object file name, since that is what matters with a parallel build.
+lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
+while true; do
+ if mkdir "$lockdir" >/dev/null 2>&1; then
+ break
+ fi
+ sleep 1
+done
+# FIXME: race condition here if user kills between mkdir and trap.
+trap "rmdir '$lockdir'; exit 1" 1 2 15
+
+# Run the compile.
+"$@"
+ret=$?
+
+if test -f "$cofile"; then
+ test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
+elif test -f "${cofile}bj"; then
+ test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
+fi
+
+rmdir "$lockdir"
+exit $ret
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/config.guess b/config.guess
new file mode 100755
index 0000000..7f76b62
--- /dev/null
+++ b/config.guess
@@ -0,0 +1,1754 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+# Copyright 1992-2022 Free Software Foundation, Inc.
+
+# shellcheck disable=SC2006,SC2268 # see below for rationale
+
+timestamp='2022-01-09'
+
+# 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 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 <https://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. This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+#
+# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
+#
+# You can get the latest version of this script from:
+# https://git.savannah.gnu.org/cgit/config.git/plain/config.guess
+#
+# Please send patches to <config-patches@gnu.org>.
+
+
+# The "shellcheck disable" line above the timestamp inhibits complaints
+# about features and limitations of the classic Bourne shell that were
+# superseded or lifted in POSIX. However, this script identifies a wide
+# variety of pre-POSIX systems that do not have POSIX shells at all, and
+# even some reasonably current systems (Solaris 10 as case-in-point) still
+# have a pre-POSIX /bin/sh.
+
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Options:
+ -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@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright 1992-2022 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
+
+# Just in case it came from the environment.
+GUESS=
+
+# 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.
+
+tmp=
+# shellcheck disable=SC2172
+trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15
+
+set_cc_for_build() {
+ # prevent multiple calls if $tmp is already set
+ test "$tmp" && return 0
+ : "${TMPDIR=/tmp}"
+ # shellcheck disable=SC2039,SC3028
+ { 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" 2>/dev/null) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; }
+ dummy=$tmp/dummy
+ case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in
+ ,,) echo "int x;" > "$dummy.c"
+ for driver in cc gcc c89 c99 ; do
+ if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then
+ CC_FOR_BUILD=$driver
+ 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
+}
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if test -f /.attbin/uname ; 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
+
+case $UNAME_SYSTEM in
+Linux|GNU|GNU/*)
+ LIBC=unknown
+
+ set_cc_for_build
+ cat <<-EOF > "$dummy.c"
+ #include <features.h>
+ #if defined(__UCLIBC__)
+ LIBC=uclibc
+ #elif defined(__dietlibc__)
+ LIBC=dietlibc
+ #elif defined(__GLIBC__)
+ LIBC=gnu
+ #else
+ #include <stdarg.h>
+ /* First heuristic to detect musl libc. */
+ #ifdef __DEFINED_va_list
+ LIBC=musl
+ #endif
+ #endif
+ EOF
+ cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
+ eval "$cc_set_libc"
+
+ # Second heuristic to detect musl libc.
+ if [ "$LIBC" = unknown ] &&
+ command -v ldd >/dev/null &&
+ ldd --version 2>&1 | grep -q ^musl; then
+ LIBC=musl
+ fi
+
+ # If the system lacks a compiler, then just pick glibc.
+ # We could probably try harder.
+ if [ "$LIBC" = unknown ]; then
+ LIBC=gnu
+ fi
+ ;;
+esac
+
+# 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".
+ UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
+ /sbin/sysctl -n hw.machine_arch 2>/dev/null || \
+ /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \
+ echo unknown)`
+ case $UNAME_MACHINE_ARCH in
+ aarch64eb) machine=aarch64_be-unknown ;;
+ armeb) machine=armeb-unknown ;;
+ arm*) machine=arm-unknown ;;
+ sh3el) machine=shl-unknown ;;
+ sh3eb) machine=sh-unknown ;;
+ sh5el) machine=sh5le-unknown ;;
+ earmv*)
+ arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
+ endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'`
+ machine=${arch}${endian}-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) and ABI.
+ case $UNAME_MACHINE_ARCH in
+ earm*)
+ os=netbsdelf
+ ;;
+ arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+ 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
+ # Determine ABI tags.
+ case $UNAME_MACHINE_ARCH in
+ earm*)
+ expr='s/^earmv[0-9]/-eabi/;s/eb$//'
+ abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"`
+ ;;
+ 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/[-_].*//' | cut -d. -f1,2`
+ ;;
+ esac
+ # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+ # contains redundant information, the shorter form:
+ # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+ GUESS=$machine-${os}${release}${abi-}
+ ;;
+ *:Bitrig:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
+ GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE
+ ;;
+ *:OpenBSD:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+ GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE
+ ;;
+ *:SecBSD:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'`
+ GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE
+ ;;
+ *:LibertyBSD:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'`
+ GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE
+ ;;
+ *:MidnightBSD:*:*)
+ GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE
+ ;;
+ *:ekkoBSD:*:*)
+ GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE
+ ;;
+ *:SolidBSD:*:*)
+ GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE
+ ;;
+ *:OS108:*:*)
+ GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE
+ ;;
+ macppc:MirBSD:*:*)
+ GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE
+ ;;
+ *:MirBSD:*:*)
+ GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE
+ ;;
+ *:Sortix:*:*)
+ GUESS=$UNAME_MACHINE-unknown-sortix
+ ;;
+ *:Twizzler:*:*)
+ GUESS=$UNAME_MACHINE-unknown-twizzler
+ ;;
+ *:Redox:*:*)
+ GUESS=$UNAME_MACHINE-unknown-redox
+ ;;
+ mips:OSF1:*.*)
+ GUESS=mips-dec-osf1
+ ;;
+ alpha:OSF1:*:*)
+ # Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+ trap '' 0
+ 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.
+ OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+ GUESS=$UNAME_MACHINE-dec-osf$OSF_REL
+ ;;
+ Amiga*:UNIX_System_V:4.0:*)
+ GUESS=m68k-unknown-sysv4
+ ;;
+ *:[Aa]miga[Oo][Ss]:*:*)
+ GUESS=$UNAME_MACHINE-unknown-amigaos
+ ;;
+ *:[Mm]orph[Oo][Ss]:*:*)
+ GUESS=$UNAME_MACHINE-unknown-morphos
+ ;;
+ *:OS/390:*:*)
+ GUESS=i370-ibm-openedition
+ ;;
+ *:z/VM:*:*)
+ GUESS=s390-ibm-zvmoe
+ ;;
+ *:OS400:*:*)
+ GUESS=powerpc-ibm-os400
+ ;;
+ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ GUESS=arm-acorn-riscix$UNAME_RELEASE
+ ;;
+ arm*:riscos:*:*|arm*:RISCOS:*:*)
+ GUESS=arm-unknown-riscos
+ ;;
+ SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+ GUESS=hppa1.1-hitachi-hiuxmpp
+ ;;
+ Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+ # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+ case `(/bin/universe) 2>/dev/null` in
+ att) GUESS=pyramid-pyramid-sysv3 ;;
+ *) GUESS=pyramid-pyramid-bsd ;;
+ esac
+ ;;
+ NILE*:*:*:dcosx)
+ GUESS=pyramid-pyramid-svr4
+ ;;
+ DRS?6000:unix:4.0:6*)
+ GUESS=sparc-icl-nx6
+ ;;
+ DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+ case `/usr/bin/uname -p` in
+ sparc) GUESS=sparc-icl-nx7 ;;
+ esac
+ ;;
+ s390x:SunOS:*:*)
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL
+ ;;
+ sun4H:SunOS:5.*:*)
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=sparc-hal-solaris2$SUN_REL
+ ;;
+ sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=sparc-sun-solaris2$SUN_REL
+ ;;
+ i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+ GUESS=i386-pc-auroraux$UNAME_RELEASE
+ ;;
+ i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+ 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 test "$CC_FOR_BUILD" != no_compiler_found; then
+ if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+ (CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \
+ grep IS_64BIT_ARCH >/dev/null
+ then
+ SUN_ARCH=x86_64
+ fi
+ fi
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=$SUN_ARCH-pc-solaris2$SUN_REL
+ ;;
+ 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.
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=sparc-sun-solaris3$SUN_REL
+ ;;
+ 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'.
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'`
+ GUESS=sparc-sun-sunos$SUN_REL
+ ;;
+ sun3*:SunOS:*:*)
+ GUESS=m68k-sun-sunos$UNAME_RELEASE
+ ;;
+ 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)
+ GUESS=m68k-sun-sunos$UNAME_RELEASE
+ ;;
+ sun4)
+ GUESS=sparc-sun-sunos$UNAME_RELEASE
+ ;;
+ esac
+ ;;
+ aushp:SunOS:*:*)
+ GUESS=sparc-auspex-sunos$UNAME_RELEASE
+ ;;
+ # 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:*:*)
+ GUESS=m68k-atari-mint$UNAME_RELEASE
+ ;;
+ atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+ GUESS=m68k-atari-mint$UNAME_RELEASE
+ ;;
+ *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+ GUESS=m68k-atari-mint$UNAME_RELEASE
+ ;;
+ milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+ GUESS=m68k-milan-mint$UNAME_RELEASE
+ ;;
+ hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+ GUESS=m68k-hades-mint$UNAME_RELEASE
+ ;;
+ *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+ GUESS=m68k-unknown-mint$UNAME_RELEASE
+ ;;
+ m68k:machten:*:*)
+ GUESS=m68k-apple-machten$UNAME_RELEASE
+ ;;
+ powerpc:machten:*:*)
+ GUESS=powerpc-apple-machten$UNAME_RELEASE
+ ;;
+ RISC*:Mach:*:*)
+ GUESS=mips-dec-mach_bsd4.3
+ ;;
+ RISC*:ULTRIX:*:*)
+ GUESS=mips-dec-ultrix$UNAME_RELEASE
+ ;;
+ VAX*:ULTRIX*:*:*)
+ GUESS=vax-dec-ultrix$UNAME_RELEASE
+ ;;
+ 2020:CLIX:*:* | 2430:CLIX:*:*)
+ GUESS=clipper-intergraph-clix$UNAME_RELEASE
+ ;;
+ mips:*:*:UMIPS | mips:*:*:RISCos)
+ 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; }
+ GUESS=mips-mips-riscos$UNAME_RELEASE
+ ;;
+ Motorola:PowerMAX_OS:*:*)
+ GUESS=powerpc-motorola-powermax
+ ;;
+ Motorola:*:4.3:PL8-*)
+ GUESS=powerpc-harris-powermax
+ ;;
+ Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+ GUESS=powerpc-harris-powermax
+ ;;
+ Night_Hawk:Power_UNIX:*:*)
+ GUESS=powerpc-harris-powerunix
+ ;;
+ m88k:CX/UX:7*:*)
+ GUESS=m88k-harris-cxux7
+ ;;
+ m88k:*:4*:R4*)
+ GUESS=m88k-motorola-sysv4
+ ;;
+ m88k:*:3*:R3*)
+ GUESS=m88k-motorola-sysv3
+ ;;
+ AViiON:dgux:*:*)
+ # DG/UX returns AViiON for all architectures
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110
+ then
+ if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \
+ test "$TARGET_BINARY_INTERFACE"x = x
+ then
+ GUESS=m88k-dg-dgux$UNAME_RELEASE
+ else
+ GUESS=m88k-dg-dguxbcs$UNAME_RELEASE
+ fi
+ else
+ GUESS=i586-dg-dgux$UNAME_RELEASE
+ fi
+ ;;
+ M88*:DolphinOS:*:*) # DolphinOS (SVR3)
+ GUESS=m88k-dolphin-sysv3
+ ;;
+ M88*:*:R3*:*)
+ # Delta 88k system running SVR3
+ GUESS=m88k-motorola-sysv3
+ ;;
+ XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+ GUESS=m88k-tektronix-sysv3
+ ;;
+ Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+ GUESS=m68k-tektronix-bsd
+ ;;
+ *:IRIX*:*:*)
+ IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'`
+ GUESS=mips-sgi-irix$IRIX_REL
+ ;;
+ ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+ GUESS=romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+ ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+ i*86:AIX:*:*)
+ GUESS=i386-ibm-aix
+ ;;
+ ia64:AIX:*:*)
+ if test -x /usr/bin/oslevel ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=$UNAME_VERSION.$UNAME_RELEASE
+ fi
+ GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV
+ ;;
+ *:AIX:2:3)
+ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+ 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
+ GUESS=$SYSTEM_NAME
+ else
+ GUESS=rs6000-ibm-aix3.2.5
+ fi
+ elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+ GUESS=rs6000-ibm-aix3.2.4
+ else
+ GUESS=rs6000-ibm-aix3.2
+ fi
+ ;;
+ *: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 test -x /usr/bin/lslpp ; then
+ IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \
+ awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
+ else
+ IBM_REV=$UNAME_VERSION.$UNAME_RELEASE
+ fi
+ GUESS=$IBM_ARCH-ibm-aix$IBM_REV
+ ;;
+ *:AIX:*:*)
+ GUESS=rs6000-ibm-aix
+ ;;
+ ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*)
+ GUESS=romp-ibm-bsd4.4
+ ;;
+ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
+ GUESS=romp-ibm-bsd$UNAME_RELEASE # 4.3 with uname added to
+ ;; # report: romp-ibm BSD 4.3
+ *:BOSX:*:*)
+ GUESS=rs6000-bull-bosx
+ ;;
+ DPX/2?00:B.O.S.:*:*)
+ GUESS=m68k-bull-sysv3
+ ;;
+ 9000/[34]??:4.3bsd:1.*:*)
+ GUESS=m68k-hp-bsd
+ ;;
+ hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+ GUESS=m68k-hp-bsd4.4
+ ;;
+ 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 test -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 test "$HP_ARCH" = ""; then
+ 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 test "$HP_ARCH" = hppa2.0w
+ then
+ 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
+ GUESS=$HP_ARCH-hp-hpux$HPUX_REV
+ ;;
+ ia64:HP-UX:*:*)
+ HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'`
+ GUESS=ia64-hp-hpux$HPUX_REV
+ ;;
+ 3050*:HI-UX:*:*)
+ 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; }
+ GUESS=unknown-hitachi-hiuxwe2
+ ;;
+ 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*)
+ GUESS=hppa1.1-hp-bsd
+ ;;
+ 9000/8??:4.3bsd:*:*)
+ GUESS=hppa1.0-hp-bsd
+ ;;
+ *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+ GUESS=hppa1.0-hp-mpeix
+ ;;
+ hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*)
+ GUESS=hppa1.1-hp-osf
+ ;;
+ hp8??:OSF1:*:*)
+ GUESS=hppa1.0-hp-osf
+ ;;
+ i*86:OSF1:*:*)
+ if test -x /usr/sbin/sysversion ; then
+ GUESS=$UNAME_MACHINE-unknown-osf1mk
+ else
+ GUESS=$UNAME_MACHINE-unknown-osf1
+ fi
+ ;;
+ parisc*:Lites*:*:*)
+ GUESS=hppa1.1-hp-lites
+ ;;
+ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+ GUESS=c1-convex-bsd
+ ;;
+ 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*:*)
+ GUESS=c34-convex-bsd
+ ;;
+ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+ GUESS=c38-convex-bsd
+ ;;
+ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+ GUESS=c4-convex-bsd
+ ;;
+ CRAY*Y-MP:*:*:*)
+ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+ GUESS=ymp-cray-unicos$CRAY_REL
+ ;;
+ 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:*:*:*)
+ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+ GUESS=t90-cray-unicos$CRAY_REL
+ ;;
+ CRAY*T3E:*:*:*)
+ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+ GUESS=alphaev5-cray-unicosmk$CRAY_REL
+ ;;
+ CRAY*SV1:*:*:*)
+ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+ GUESS=sv1-cray-unicos$CRAY_REL
+ ;;
+ *:UNICOS/mp:*:*)
+ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+ GUESS=craynv-cray-unicosmp$CRAY_REL
+ ;;
+ 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/ /_/'`
+ GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}
+ ;;
+ 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/ /_/'`
+ GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}
+ ;;
+ i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+ GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE
+ ;;
+ sparc*:BSD/OS:*:*)
+ GUESS=sparc-unknown-bsdi$UNAME_RELEASE
+ ;;
+ *:BSD/OS:*:*)
+ GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE
+ ;;
+ arm:FreeBSD:*:*)
+ UNAME_PROCESSOR=`uname -p`
+ set_cc_for_build
+ if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ARM_PCS_VFP
+ then
+ FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+ GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi
+ else
+ FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+ GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf
+ fi
+ ;;
+ *:FreeBSD:*:*)
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ case $UNAME_PROCESSOR in
+ amd64)
+ UNAME_PROCESSOR=x86_64 ;;
+ i386)
+ UNAME_PROCESSOR=i586 ;;
+ esac
+ FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+ GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL
+ ;;
+ i*:CYGWIN*:*)
+ GUESS=$UNAME_MACHINE-pc-cygwin
+ ;;
+ *:MINGW64*:*)
+ GUESS=$UNAME_MACHINE-pc-mingw64
+ ;;
+ *:MINGW*:*)
+ GUESS=$UNAME_MACHINE-pc-mingw32
+ ;;
+ *:MSYS*:*)
+ GUESS=$UNAME_MACHINE-pc-msys
+ ;;
+ i*:PW*:*)
+ GUESS=$UNAME_MACHINE-pc-pw32
+ ;;
+ *:SerenityOS:*:*)
+ GUESS=$UNAME_MACHINE-pc-serenity
+ ;;
+ *:Interix*:*)
+ case $UNAME_MACHINE in
+ x86)
+ GUESS=i586-pc-interix$UNAME_RELEASE
+ ;;
+ authenticamd | genuineintel | EM64T)
+ GUESS=x86_64-unknown-interix$UNAME_RELEASE
+ ;;
+ IA64)
+ GUESS=ia64-unknown-interix$UNAME_RELEASE
+ ;;
+ esac ;;
+ i*:UWIN*:*)
+ GUESS=$UNAME_MACHINE-pc-uwin
+ ;;
+ amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+ GUESS=x86_64-pc-cygwin
+ ;;
+ prep*:SunOS:5.*:*)
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=powerpcle-unknown-solaris2$SUN_REL
+ ;;
+ *:GNU:*:*)
+ # the GNU system
+ GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'`
+ GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'`
+ GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL
+ ;;
+ *:GNU/*:*:*)
+ # other systems with GNU libc and userland
+ GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"`
+ GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+ GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC
+ ;;
+ *:Minix:*:*)
+ GUESS=$UNAME_MACHINE-unknown-minix
+ ;;
+ aarch64:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ aarch64_be:Linux:*:*)
+ UNAME_MACHINE=aarch64_be
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ alpha:Linux:*:*)
+ case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` 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=gnulibc1 ; fi
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ arm*:Linux:*:*)
+ set_cc_for_build
+ if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ARM_EABI__
+ then
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ else
+ if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ARM_PCS_VFP
+ then
+ GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi
+ else
+ GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf
+ fi
+ fi
+ ;;
+ avr32*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ cris:Linux:*:*)
+ GUESS=$UNAME_MACHINE-axis-linux-$LIBC
+ ;;
+ crisv32:Linux:*:*)
+ GUESS=$UNAME_MACHINE-axis-linux-$LIBC
+ ;;
+ e2k:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ frv:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ hexagon:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ i*86:Linux:*:*)
+ GUESS=$UNAME_MACHINE-pc-linux-$LIBC
+ ;;
+ ia64:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ k1om:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ m32r*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ m68*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ mips:Linux:*:* | mips64:Linux:*:*)
+ set_cc_for_build
+ IS_GLIBC=0
+ test x"${LIBC}" = xgnu && IS_GLIBC=1
+ sed 's/^ //' << EOF > "$dummy.c"
+ #undef CPU
+ #undef mips
+ #undef mipsel
+ #undef mips64
+ #undef mips64el
+ #if ${IS_GLIBC} && defined(_ABI64)
+ LIBCABI=gnuabi64
+ #else
+ #if ${IS_GLIBC} && defined(_ABIN32)
+ LIBCABI=gnuabin32
+ #else
+ LIBCABI=${LIBC}
+ #endif
+ #endif
+
+ #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
+ CPU=mipsisa64r6
+ #else
+ #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
+ CPU=mipsisa32r6
+ #else
+ #if defined(__mips64)
+ CPU=mips64
+ #else
+ CPU=mips
+ #endif
+ #endif
+ #endif
+
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ MIPS_ENDIAN=el
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ MIPS_ENDIAN=
+ #else
+ MIPS_ENDIAN=
+ #endif
+ #endif
+EOF
+ cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'`
+ eval "$cc_set_vars"
+ test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; }
+ ;;
+ mips64el:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ openrisc*:Linux:*:*)
+ GUESS=or1k-unknown-linux-$LIBC
+ ;;
+ or32:Linux:*:* | or1k*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ padre:Linux:*:*)
+ GUESS=sparc-unknown-linux-$LIBC
+ ;;
+ parisc64:Linux:*:* | hppa64:Linux:*:*)
+ GUESS=hppa64-unknown-linux-$LIBC
+ ;;
+ parisc:Linux:*:* | hppa:Linux:*:*)
+ # Look for CPU level
+ case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+ PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;;
+ PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;;
+ *) GUESS=hppa-unknown-linux-$LIBC ;;
+ esac
+ ;;
+ ppc64:Linux:*:*)
+ GUESS=powerpc64-unknown-linux-$LIBC
+ ;;
+ ppc:Linux:*:*)
+ GUESS=powerpc-unknown-linux-$LIBC
+ ;;
+ ppc64le:Linux:*:*)
+ GUESS=powerpc64le-unknown-linux-$LIBC
+ ;;
+ ppcle:Linux:*:*)
+ GUESS=powerpcle-unknown-linux-$LIBC
+ ;;
+ riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ s390:Linux:*:* | s390x:Linux:*:*)
+ GUESS=$UNAME_MACHINE-ibm-linux-$LIBC
+ ;;
+ sh64*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ sh*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ sparc:Linux:*:* | sparc64:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ tile*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ vax:Linux:*:*)
+ GUESS=$UNAME_MACHINE-dec-linux-$LIBC
+ ;;
+ x86_64:Linux:*:*)
+ set_cc_for_build
+ LIBCABI=$LIBC
+ if test "$CC_FOR_BUILD" != no_compiler_found; then
+ if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \
+ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+ grep IS_X32 >/dev/null
+ then
+ LIBCABI=${LIBC}x32
+ fi
+ fi
+ GUESS=$UNAME_MACHINE-pc-linux-$LIBCABI
+ ;;
+ xtensa*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ 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.
+ GUESS=i386-sequent-sysv4
+ ;;
+ 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.
+ GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION
+ ;;
+ i*86:OS/2:*:*)
+ # If we were able to find `uname', then EMX Unix compatibility
+ # is probably installed.
+ GUESS=$UNAME_MACHINE-pc-os2-emx
+ ;;
+ i*86:XTS-300:*:STOP)
+ GUESS=$UNAME_MACHINE-unknown-stop
+ ;;
+ i*86:atheos:*:*)
+ GUESS=$UNAME_MACHINE-unknown-atheos
+ ;;
+ i*86:syllable:*:*)
+ GUESS=$UNAME_MACHINE-pc-syllable
+ ;;
+ i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+ GUESS=i386-unknown-lynxos$UNAME_RELEASE
+ ;;
+ i*86:*DOS:*:*)
+ GUESS=$UNAME_MACHINE-pc-msdosdjgpp
+ ;;
+ i*86:*:4.*:*)
+ UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'`
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+ GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL
+ else
+ GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL
+ fi
+ ;;
+ 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
+ GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+ ;;
+ i*86:*:3.2:*)
+ if test -f /usr/options/cb.name; then
+ UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+ GUESS=$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
+ GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL
+ else
+ GUESS=$UNAME_MACHINE-pc-sysv32
+ fi
+ ;;
+ 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 configure will decide that
+ # this is a cross-build.
+ GUESS=i586-pc-msdosdjgpp
+ ;;
+ Intel:Mach:3*:*)
+ GUESS=i386-pc-mach3
+ ;;
+ paragon:*:*:*)
+ GUESS=i860-intel-osf1
+ ;;
+ i860:*:4.*:*) # i860-SVR4
+ if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+ GUESS=i860-stardent-sysv$UNAME_RELEASE # Stardent Vistra i860-SVR4
+ else # Add other i860-SVR4 vendors below as they are discovered.
+ GUESS=i860-unknown-sysv$UNAME_RELEASE # Unknown i860-SVR4
+ fi
+ ;;
+ mini*:CTIX:SYS*5:*)
+ # "miniframe"
+ GUESS=m68010-convergent-sysv
+ ;;
+ mc68k:UNIX:SYSTEM5:3.51m)
+ GUESS=m68k-convergent-sysv
+ ;;
+ M680?0:D-NIX:5.3:*)
+ GUESS=m68k-diab-dnix
+ ;;
+ 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*:*)
+ GUESS=m68k-unknown-lynxos$UNAME_RELEASE
+ ;;
+ mc68030:UNIX_System_V:4.*:*)
+ GUESS=m68k-atari-sysv4
+ ;;
+ TSUNAMI:LynxOS:2.*:*)
+ GUESS=sparc-unknown-lynxos$UNAME_RELEASE
+ ;;
+ rs6000:LynxOS:2.*:*)
+ GUESS=rs6000-unknown-lynxos$UNAME_RELEASE
+ ;;
+ PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+ GUESS=powerpc-unknown-lynxos$UNAME_RELEASE
+ ;;
+ SM[BE]S:UNIX_SV:*:*)
+ GUESS=mips-dde-sysv$UNAME_RELEASE
+ ;;
+ RM*:ReliantUNIX-*:*:*)
+ GUESS=mips-sni-sysv4
+ ;;
+ RM*:SINIX-*:*:*)
+ GUESS=mips-sni-sysv4
+ ;;
+ *:SINIX-*:*:*)
+ if uname -p 2>/dev/null >/dev/null ; then
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ GUESS=$UNAME_MACHINE-sni-sysv4
+ else
+ GUESS=ns32k-sni-sysv
+ fi
+ ;;
+ PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+ # says <Richard.M.Bartel@ccMail.Census.GOV>
+ GUESS=i586-unisys-sysv4
+ ;;
+ *:UNIX_System_V:4*:FTX*)
+ # From Gerald Hewes <hewes@openmarket.com>.
+ # How about differentiating between stratus architectures? -djm
+ GUESS=hppa1.1-stratus-sysv4
+ ;;
+ *:*:*:FTX*)
+ # From seanf@swdc.stratus.com.
+ GUESS=i860-stratus-sysv4
+ ;;
+ i*86:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ GUESS=$UNAME_MACHINE-stratus-vos
+ ;;
+ *:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ GUESS=hppa1.1-stratus-vos
+ ;;
+ mc68*:A/UX:*:*)
+ GUESS=m68k-apple-aux$UNAME_RELEASE
+ ;;
+ news*:NEWS-OS:6*:*)
+ GUESS=mips-sony-newsos6
+ ;;
+ R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+ if test -d /usr/nec; then
+ GUESS=mips-nec-sysv$UNAME_RELEASE
+ else
+ GUESS=mips-unknown-sysv$UNAME_RELEASE
+ fi
+ ;;
+ BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
+ GUESS=powerpc-be-beos
+ ;;
+ BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
+ GUESS=powerpc-apple-beos
+ ;;
+ BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
+ GUESS=i586-pc-beos
+ ;;
+ BePC:Haiku:*:*) # Haiku running on Intel PC compatible.
+ GUESS=i586-pc-haiku
+ ;;
+ x86_64:Haiku:*:*)
+ GUESS=x86_64-unknown-haiku
+ ;;
+ SX-4:SUPER-UX:*:*)
+ GUESS=sx4-nec-superux$UNAME_RELEASE
+ ;;
+ SX-5:SUPER-UX:*:*)
+ GUESS=sx5-nec-superux$UNAME_RELEASE
+ ;;
+ SX-6:SUPER-UX:*:*)
+ GUESS=sx6-nec-superux$UNAME_RELEASE
+ ;;
+ SX-7:SUPER-UX:*:*)
+ GUESS=sx7-nec-superux$UNAME_RELEASE
+ ;;
+ SX-8:SUPER-UX:*:*)
+ GUESS=sx8-nec-superux$UNAME_RELEASE
+ ;;
+ SX-8R:SUPER-UX:*:*)
+ GUESS=sx8r-nec-superux$UNAME_RELEASE
+ ;;
+ SX-ACE:SUPER-UX:*:*)
+ GUESS=sxace-nec-superux$UNAME_RELEASE
+ ;;
+ Power*:Rhapsody:*:*)
+ GUESS=powerpc-apple-rhapsody$UNAME_RELEASE
+ ;;
+ *:Rhapsody:*:*)
+ GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE
+ ;;
+ arm64:Darwin:*:*)
+ GUESS=aarch64-apple-darwin$UNAME_RELEASE
+ ;;
+ *:Darwin:*:*)
+ UNAME_PROCESSOR=`uname -p`
+ case $UNAME_PROCESSOR in
+ unknown) UNAME_PROCESSOR=powerpc ;;
+ esac
+ if command -v xcode-select > /dev/null 2> /dev/null && \
+ ! xcode-select --print-path > /dev/null 2> /dev/null ; then
+ # Avoid executing cc if there is no toolchain installed as
+ # cc will be a stub that puts up a graphical alert
+ # prompting the user to install developer tools.
+ CC_FOR_BUILD=no_compiler_found
+ else
+ set_cc_for_build
+ fi
+ if test "$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
+ case $UNAME_PROCESSOR in
+ i386) UNAME_PROCESSOR=x86_64 ;;
+ powerpc) UNAME_PROCESSOR=powerpc64 ;;
+ esac
+ fi
+ # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc
+ if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \
+ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+ grep IS_PPC >/dev/null
+ then
+ UNAME_PROCESSOR=powerpc
+ fi
+ elif test "$UNAME_PROCESSOR" = i386 ; then
+ # uname -m returns i386 or x86_64
+ UNAME_PROCESSOR=$UNAME_MACHINE
+ fi
+ GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE
+ ;;
+ *:procnto*:*:* | *:QNX:[0123456789]*:*)
+ UNAME_PROCESSOR=`uname -p`
+ if test "$UNAME_PROCESSOR" = x86; then
+ UNAME_PROCESSOR=i386
+ UNAME_MACHINE=pc
+ fi
+ GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE
+ ;;
+ *:QNX:*:4*)
+ GUESS=i386-pc-qnx
+ ;;
+ NEO-*:NONSTOP_KERNEL:*:*)
+ GUESS=neo-tandem-nsk$UNAME_RELEASE
+ ;;
+ NSE-*:NONSTOP_KERNEL:*:*)
+ GUESS=nse-tandem-nsk$UNAME_RELEASE
+ ;;
+ NSR-*:NONSTOP_KERNEL:*:*)
+ GUESS=nsr-tandem-nsk$UNAME_RELEASE
+ ;;
+ NSV-*:NONSTOP_KERNEL:*:*)
+ GUESS=nsv-tandem-nsk$UNAME_RELEASE
+ ;;
+ NSX-*:NONSTOP_KERNEL:*:*)
+ GUESS=nsx-tandem-nsk$UNAME_RELEASE
+ ;;
+ *:NonStop-UX:*:*)
+ GUESS=mips-compaq-nonstopux
+ ;;
+ BS2000:POSIX*:*:*)
+ GUESS=bs2000-siemens-sysv
+ ;;
+ DS/*:UNIX_System_V:*:*)
+ GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE
+ ;;
+ *: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
+ elif test "x${cputype-}" != x; then
+ UNAME_MACHINE=$cputype
+ fi
+ GUESS=$UNAME_MACHINE-unknown-plan9
+ ;;
+ *:TOPS-10:*:*)
+ GUESS=pdp10-unknown-tops10
+ ;;
+ *:TENEX:*:*)
+ GUESS=pdp10-unknown-tenex
+ ;;
+ KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+ GUESS=pdp10-dec-tops20
+ ;;
+ XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+ GUESS=pdp10-xkl-tops20
+ ;;
+ *:TOPS-20:*:*)
+ GUESS=pdp10-unknown-tops20
+ ;;
+ *:ITS:*:*)
+ GUESS=pdp10-unknown-its
+ ;;
+ SEI:*:*:SEIUX)
+ GUESS=mips-sei-seiux$UNAME_RELEASE
+ ;;
+ *:DragonFly:*:*)
+ DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+ GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL
+ ;;
+ *:*VMS:*:*)
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ case $UNAME_MACHINE in
+ A*) GUESS=alpha-dec-vms ;;
+ I*) GUESS=ia64-dec-vms ;;
+ V*) GUESS=vax-dec-vms ;;
+ esac ;;
+ *:XENIX:*:SysV)
+ GUESS=i386-pc-xenix
+ ;;
+ i*86:skyos:*:*)
+ SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`
+ GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL
+ ;;
+ i*86:rdos:*:*)
+ GUESS=$UNAME_MACHINE-pc-rdos
+ ;;
+ i*86:Fiwix:*:*)
+ GUESS=$UNAME_MACHINE-pc-fiwix
+ ;;
+ *:AROS:*:*)
+ GUESS=$UNAME_MACHINE-unknown-aros
+ ;;
+ x86_64:VMkernel:*:*)
+ GUESS=$UNAME_MACHINE-unknown-esx
+ ;;
+ amd64:Isilon\ OneFS:*:*)
+ GUESS=x86_64-unknown-onefs
+ ;;
+ *:Unleashed:*:*)
+ GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE
+ ;;
+esac
+
+# Do we have a guess based on uname results?
+if test "x$GUESS" != x; then
+ echo "$GUESS"
+ exit
+fi
+
+# No uname command or uname output not recognized.
+set_cc_for_build
+cat > "$dummy.c" <<EOF
+#ifdef _SEQUENT_
+#include <sys/types.h>
+#include <sys/utsname.h>
+#endif
+#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
+#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
+#include <signal.h>
+#if defined(_SIZE_T_) || defined(SIGLOST)
+#include <sys/utsname.h>
+#endif
+#endif
+#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 (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
+#if defined(_SIZE_T_) || defined(SIGLOST)
+ struct utsname un;
+ uname (&un);
+ printf ("vax-dec-ultrix%s\n", un.release); exit (0);
+#else
+ printf ("vax-dec-ultrix\n"); exit (0);
+#endif
+#endif
+#endif
+#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
+#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
+#if defined(_SIZE_T_) || defined(SIGLOST)
+ struct utsname *un;
+ uname (&un);
+ printf ("mips-dec-ultrix%s\n", un.release); exit (0);
+#else
+ printf ("mips-dec-ultrix\n"); exit (0);
+#endif
+#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; }
+
+echo "$0: unable to guess system type" >&2
+
+case $UNAME_MACHINE:$UNAME_SYSTEM in
+ mips:Linux | mips64:Linux)
+ # If we got here on MIPS GNU/Linux, output extra information.
+ cat >&2 <<EOF
+
+NOTE: MIPS GNU/Linux systems require a C compiler to fully recognize
+the system type. Please install a C compiler and try again.
+EOF
+ ;;
+esac
+
+cat >&2 <<EOF
+
+This script (version $timestamp), has failed to recognize the
+operating system you are using. If your script is old, overwrite *all*
+copies of config.guess and config.sub with the latest versions from:
+
+ https://git.savannah.gnu.org/cgit/config.git/plain/config.guess
+and
+ https://git.savannah.gnu.org/cgit/config.git/plain/config.sub
+EOF
+
+our_year=`echo $timestamp | sed 's,-.*,,'`
+thisyear=`date +%Y`
+# shellcheck disable=SC2003
+script_age=`expr "$thisyear" - "$our_year"`
+if test "$script_age" -lt 3 ; then
+ cat >&2 <<EOF
+
+If $0 has already been updated, send the following data and any
+information you think might be pertinent to config-patches@gnu.org to
+provide the necessary 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
+fi
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'before-save-hook '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
new file mode 100644
index 0000000..ffe05e5
--- /dev/null
+++ b/config.h.in
@@ -0,0 +1,135 @@
+/* config.h.in. Generated from configure.ac by autoheader. */
+
+/* Disable boost's evil autolink. */
+#undef BOOST_ALL_NO_LIB
+
+/* Defined if the requested minimum BOOST version is satisfied */
+#undef HAVE_BOOST
+
+/* Defined if the Boost date_time library is available */
+#undef HAVE_BOOST_DATE_TIME
+
+/* Define to 1 if you have <boost/date_time/posix_time/posix_time.hpp> */
+#undef HAVE_BOOST_DATE_TIME_POSIX_TIME_POSIX_TIME_HPP
+
+/* Defined if the Boost filesystem library is available */
+#undef HAVE_BOOST_FILESYSTEM
+
+/* Define to 1 if you have <boost/filesystem/path.hpp> */
+#undef HAVE_BOOST_FILESYSTEM_PATH_HPP
+
+/* Defined if the Boost iostreams library is available */
+#undef HAVE_BOOST_IOSTREAMS
+
+/* Define to 1 if you have <boost/iostreams/device/file_descriptor.hpp> */
+#undef HAVE_BOOST_IOSTREAMS_DEVICE_FILE_DESCRIPTOR_HPP
+
+/* Defined if the Boost program_options library is available */
+#undef HAVE_BOOST_PROGRAM_OPTIONS
+
+/* Define to 1 if you have <boost/program_options.hpp> */
+#undef HAVE_BOOST_PROGRAM_OPTIONS_HPP
+
+/* Defined if the Boost system library is available */
+#undef HAVE_BOOST_SYSTEM
+
+/* Define to 1 if you have <boost/system/error_code.hpp> */
+#undef HAVE_BOOST_SYSTEM_ERROR_CODE_HPP
+
+/* define if the compiler supports basic C++17 syntax */
+#undef HAVE_CXX17
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you have the `gettimeofday' function. */
+#undef HAVE_GETTIMEOFDAY
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if stdbool.h conforms to C99. */
+#undef HAVE_STDBOOL_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdio.h> header file. */
+#undef HAVE_STDIO_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* 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/time.h> header file. */
+#undef HAVE_SYS_TIME_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 1 if the system has the type `_Bool'. */
+#undef HAVE__BOOL
+
+/* Define to the sub-directory where libtool stores uninstalled libraries. */
+#undef LT_OBJDIR
+
+/* Disable debugging information */
+#undef NDEBUG
+
+/* 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
+
+/* The size of `void *', as computed by sizeof. */
+#undef SIZEOF_VOID_P
+
+/* Define to 1 if all of the C90 standard headers exist (not just the ones
+ required in a freestanding environment). This macro is provided for
+ backward compatibility; new code need not use it. */
+#undef STDC_HEADERS
+
+/* Version number of package */
+#undef VERSION
+
+/* Enable reentrant. */
+#undef _REENTRANT
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+ calls it, or to nothing if 'inline' is not supported under any name. */
+#ifndef __cplusplus
+#undef inline
+#endif
+
+/* Define to `int' if <sys/types.h> does not define. */
+#undef mode_t
+
+/* Define to `unsigned int' if <sys/types.h> does not define. */
+#undef size_t
diff --git a/config.sub b/config.sub
new file mode 100755
index 0000000..dba16e8
--- /dev/null
+++ b/config.sub
@@ -0,0 +1,1890 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+# Copyright 1992-2022 Free Software Foundation, Inc.
+
+# shellcheck disable=SC2006,SC2268 # see below for rationale
+
+timestamp='2022-01-03'
+
+# 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 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 <https://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. This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+
+
+# Please send patches to <config-patches@gnu.org>.
+#
+# 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:
+# https://git.savannah.gnu.org/cgit/config.git/plain/config.sub
+
+# 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.
+
+# The "shellcheck disable" line above the timestamp inhibits complaints
+# about features and limitations of the classic Bourne shell that were
+# superseded or lifted in POSIX. However, this script identifies a wide
+# variety of pre-POSIX systems that do not have POSIX shells at all, and
+# even some reasonably current systems (Solaris 10 as case-in-point) still
+# have a pre-POSIX /bin/sh.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
+
+Canonicalize a configuration name.
+
+Options:
+ -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@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright 1992-2022 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 ;;
+
+ *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
+
+# Split fields of configuration type
+# shellcheck disable=SC2162
+saved_IFS=$IFS
+IFS="-" read field1 field2 field3 field4 <<EOF
+$1
+EOF
+IFS=$saved_IFS
+
+# Separate into logical components for further validation
+case $1 in
+ *-*-*-*-*)
+ echo Invalid configuration \`"$1"\': more than four components >&2
+ exit 1
+ ;;
+ *-*-*-*)
+ basic_machine=$field1-$field2
+ basic_os=$field3-$field4
+ ;;
+ *-*-*)
+ # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two
+ # parts
+ maybe_os=$field2-$field3
+ case $maybe_os in
+ nto-qnx* | linux-* | uclinux-uclibc* \
+ | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \
+ | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \
+ | storm-chaos* | os2-emx* | rtmk-nova*)
+ basic_machine=$field1
+ basic_os=$maybe_os
+ ;;
+ android-linux)
+ basic_machine=$field1-unknown
+ basic_os=linux-android
+ ;;
+ *)
+ basic_machine=$field1-$field2
+ basic_os=$field3
+ ;;
+ esac
+ ;;
+ *-*)
+ # A lone config we happen to match not fitting any pattern
+ case $field1-$field2 in
+ decstation-3100)
+ basic_machine=mips-dec
+ basic_os=
+ ;;
+ *-*)
+ # Second component is usually, but not always the OS
+ case $field2 in
+ # Prevent following clause from handling this valid os
+ sun*os*)
+ basic_machine=$field1
+ basic_os=$field2
+ ;;
+ zephyr*)
+ basic_machine=$field1-unknown
+ basic_os=$field2
+ ;;
+ # Manufacturers
+ dec* | mips* | sequent* | encore* | pc533* | 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* | sim | cisco \
+ | oki | wec | wrs | winbond)
+ basic_machine=$field1-$field2
+ basic_os=
+ ;;
+ *)
+ basic_machine=$field1
+ basic_os=$field2
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ *)
+ # Convert single-component short-hands not valid as part of
+ # multi-component configurations.
+ case $field1 in
+ 386bsd)
+ basic_machine=i386-pc
+ basic_os=bsd
+ ;;
+ a29khif)
+ basic_machine=a29k-amd
+ basic_os=udi
+ ;;
+ adobe68k)
+ basic_machine=m68010-adobe
+ basic_os=scout
+ ;;
+ alliant)
+ basic_machine=fx80-alliant
+ basic_os=
+ ;;
+ altos | altos3068)
+ basic_machine=m68k-altos
+ basic_os=
+ ;;
+ am29k)
+ basic_machine=a29k-none
+ basic_os=bsd
+ ;;
+ amdahl)
+ basic_machine=580-amdahl
+ basic_os=sysv
+ ;;
+ amiga)
+ basic_machine=m68k-unknown
+ basic_os=
+ ;;
+ amigaos | amigados)
+ basic_machine=m68k-unknown
+ basic_os=amigaos
+ ;;
+ amigaunix | amix)
+ basic_machine=m68k-unknown
+ basic_os=sysv4
+ ;;
+ apollo68)
+ basic_machine=m68k-apollo
+ basic_os=sysv
+ ;;
+ apollo68bsd)
+ basic_machine=m68k-apollo
+ basic_os=bsd
+ ;;
+ aros)
+ basic_machine=i386-pc
+ basic_os=aros
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ basic_os=aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ basic_os=dynix
+ ;;
+ blackfin)
+ basic_machine=bfin-unknown
+ basic_os=linux
+ ;;
+ cegcc)
+ basic_machine=arm-unknown
+ basic_os=cegcc
+ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ basic_os=bsd
+ ;;
+ convex-c2)
+ basic_machine=c2-convex
+ basic_os=bsd
+ ;;
+ convex-c32)
+ basic_machine=c32-convex
+ basic_os=bsd
+ ;;
+ convex-c34)
+ basic_machine=c34-convex
+ basic_os=bsd
+ ;;
+ convex-c38)
+ basic_machine=c38-convex
+ basic_os=bsd
+ ;;
+ cray)
+ basic_machine=j90-cray
+ basic_os=unicos
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ basic_os=
+ ;;
+ da30)
+ basic_machine=m68k-da30
+ basic_os=
+ ;;
+ decstation | pmax | pmin | dec3100 | decstatn)
+ basic_machine=mips-dec
+ basic_os=
+ ;;
+ delta88)
+ basic_machine=m88k-motorola
+ basic_os=sysv3
+ ;;
+ dicos)
+ basic_machine=i686-pc
+ basic_os=dicos
+ ;;
+ djgpp)
+ basic_machine=i586-pc
+ basic_os=msdosdjgpp
+ ;;
+ ebmon29k)
+ basic_machine=a29k-amd
+ basic_os=ebmon
+ ;;
+ es1800 | OSE68k | ose68k | ose | OSE)
+ basic_machine=m68k-ericsson
+ basic_os=ose
+ ;;
+ gmicro)
+ basic_machine=tron-gmicro
+ basic_os=sysv
+ ;;
+ go32)
+ basic_machine=i386-pc
+ basic_os=go32
+ ;;
+ h8300hms)
+ basic_machine=h8300-hitachi
+ basic_os=hms
+ ;;
+ h8300xray)
+ basic_machine=h8300-hitachi
+ basic_os=xray
+ ;;
+ h8500hms)
+ basic_machine=h8500-hitachi
+ basic_os=hms
+ ;;
+ harris)
+ basic_machine=m88k-harris
+ basic_os=sysv3
+ ;;
+ hp300 | hp300hpux)
+ basic_machine=m68k-hp
+ basic_os=hpux
+ ;;
+ hp300bsd)
+ basic_machine=m68k-hp
+ basic_os=bsd
+ ;;
+ hppaosf)
+ basic_machine=hppa1.1-hp
+ basic_os=osf
+ ;;
+ hppro)
+ basic_machine=hppa1.1-hp
+ basic_os=proelf
+ ;;
+ i386mach)
+ basic_machine=i386-mach
+ basic_os=mach
+ ;;
+ isi68 | isi)
+ basic_machine=m68k-isi
+ basic_os=sysv
+ ;;
+ m68knommu)
+ basic_machine=m68k-unknown
+ basic_os=linux
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ basic_os=sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ basic_os=sysv
+ ;;
+ mingw64)
+ basic_machine=x86_64-pc
+ basic_os=mingw64
+ ;;
+ mingw32)
+ basic_machine=i686-pc
+ basic_os=mingw32
+ ;;
+ mingw32ce)
+ basic_machine=arm-unknown
+ basic_os=mingw32ce
+ ;;
+ monitor)
+ basic_machine=m68k-rom68k
+ basic_os=coff
+ ;;
+ morphos)
+ basic_machine=powerpc-unknown
+ basic_os=morphos
+ ;;
+ moxiebox)
+ basic_machine=moxie-unknown
+ basic_os=moxiebox
+ ;;
+ msdos)
+ basic_machine=i386-pc
+ basic_os=msdos
+ ;;
+ msys)
+ basic_machine=i686-pc
+ basic_os=msys
+ ;;
+ mvs)
+ basic_machine=i370-ibm
+ basic_os=mvs
+ ;;
+ nacl)
+ basic_machine=le32-unknown
+ basic_os=nacl
+ ;;
+ ncr3000)
+ basic_machine=i486-ncr
+ basic_os=sysv4
+ ;;
+ netbsd386)
+ basic_machine=i386-pc
+ basic_os=netbsd
+ ;;
+ netwinder)
+ basic_machine=armv4l-rebel
+ basic_os=linux
+ ;;
+ news | news700 | news800 | news900)
+ basic_machine=m68k-sony
+ basic_os=newsos
+ ;;
+ news1000)
+ basic_machine=m68030-sony
+ basic_os=newsos
+ ;;
+ necv70)
+ basic_machine=v70-nec
+ basic_os=sysv
+ ;;
+ nh3000)
+ basic_machine=m68k-harris
+ basic_os=cxux
+ ;;
+ nh[45]000)
+ basic_machine=m88k-harris
+ basic_os=cxux
+ ;;
+ nindy960)
+ basic_machine=i960-intel
+ basic_os=nindy
+ ;;
+ mon960)
+ basic_machine=i960-intel
+ basic_os=mon960
+ ;;
+ nonstopux)
+ basic_machine=mips-compaq
+ basic_os=nonstopux
+ ;;
+ os400)
+ basic_machine=powerpc-ibm
+ basic_os=os400
+ ;;
+ OSE68000 | ose68000)
+ basic_machine=m68000-ericsson
+ basic_os=ose
+ ;;
+ os68k)
+ basic_machine=m68k-none
+ basic_os=os68k
+ ;;
+ paragon)
+ basic_machine=i860-intel
+ basic_os=osf
+ ;;
+ parisc)
+ basic_machine=hppa-unknown
+ basic_os=linux
+ ;;
+ psp)
+ basic_machine=mipsallegrexel-sony
+ basic_os=psp
+ ;;
+ pw32)
+ basic_machine=i586-unknown
+ basic_os=pw32
+ ;;
+ rdos | rdos64)
+ basic_machine=x86_64-pc
+ basic_os=rdos
+ ;;
+ rdos32)
+ basic_machine=i386-pc
+ basic_os=rdos
+ ;;
+ rom68k)
+ basic_machine=m68k-rom68k
+ basic_os=coff
+ ;;
+ sa29200)
+ basic_machine=a29k-amd
+ basic_os=udi
+ ;;
+ sei)
+ basic_machine=mips-sei
+ basic_os=seiux
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ basic_os=
+ ;;
+ sps7)
+ basic_machine=m68k-bull
+ basic_os=sysv2
+ ;;
+ st2000)
+ basic_machine=m68k-tandem
+ basic_os=
+ ;;
+ stratus)
+ basic_machine=i860-stratus
+ basic_os=sysv4
+ ;;
+ sun2)
+ basic_machine=m68000-sun
+ basic_os=
+ ;;
+ sun2os3)
+ basic_machine=m68000-sun
+ basic_os=sunos3
+ ;;
+ sun2os4)
+ basic_machine=m68000-sun
+ basic_os=sunos4
+ ;;
+ sun3)
+ basic_machine=m68k-sun
+ basic_os=
+ ;;
+ sun3os3)
+ basic_machine=m68k-sun
+ basic_os=sunos3
+ ;;
+ sun3os4)
+ basic_machine=m68k-sun
+ basic_os=sunos4
+ ;;
+ sun4)
+ basic_machine=sparc-sun
+ basic_os=
+ ;;
+ sun4os3)
+ basic_machine=sparc-sun
+ basic_os=sunos3
+ ;;
+ sun4os4)
+ basic_machine=sparc-sun
+ basic_os=sunos4
+ ;;
+ sun4sol2)
+ basic_machine=sparc-sun
+ basic_os=solaris2
+ ;;
+ sun386 | sun386i | roadrunner)
+ basic_machine=i386-sun
+ basic_os=
+ ;;
+ sv1)
+ basic_machine=sv1-cray
+ basic_os=unicos
+ ;;
+ symmetry)
+ basic_machine=i386-sequent
+ basic_os=dynix
+ ;;
+ t3e)
+ basic_machine=alphaev5-cray
+ basic_os=unicos
+ ;;
+ t90)
+ basic_machine=t90-cray
+ basic_os=unicos
+ ;;
+ toad1)
+ basic_machine=pdp10-xkl
+ basic_os=tops20
+ ;;
+ tpf)
+ basic_machine=s390x-ibm
+ basic_os=tpf
+ ;;
+ udi29k)
+ basic_machine=a29k-amd
+ basic_os=udi
+ ;;
+ ultra3)
+ basic_machine=a29k-nyu
+ basic_os=sym1
+ ;;
+ v810 | necv810)
+ basic_machine=v810-nec
+ basic_os=none
+ ;;
+ vaxv)
+ basic_machine=vax-dec
+ basic_os=sysv
+ ;;
+ vms)
+ basic_machine=vax-dec
+ basic_os=vms
+ ;;
+ vsta)
+ basic_machine=i386-pc
+ basic_os=vsta
+ ;;
+ vxworks960)
+ basic_machine=i960-wrs
+ basic_os=vxworks
+ ;;
+ vxworks68)
+ basic_machine=m68k-wrs
+ basic_os=vxworks
+ ;;
+ vxworks29k)
+ basic_machine=a29k-wrs
+ basic_os=vxworks
+ ;;
+ xbox)
+ basic_machine=i686-pc
+ basic_os=mingw32
+ ;;
+ ymp)
+ basic_machine=ymp-cray
+ basic_os=unicos
+ ;;
+ *)
+ basic_machine=$1
+ basic_os=
+ ;;
+ esac
+ ;;
+esac
+
+# Decode 1-component or ad-hoc basic machines
+case $basic_machine in
+ # 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)
+ cpu=hppa1.1
+ vendor=winbond
+ ;;
+ op50n)
+ cpu=hppa1.1
+ vendor=oki
+ ;;
+ op60c)
+ cpu=hppa1.1
+ vendor=oki
+ ;;
+ ibm*)
+ cpu=i370
+ vendor=ibm
+ ;;
+ orion105)
+ cpu=clipper
+ vendor=highlevel
+ ;;
+ mac | mpw | mac-mpw)
+ cpu=m68k
+ vendor=apple
+ ;;
+ pmac | pmac-mpw)
+ cpu=powerpc
+ vendor=apple
+ ;;
+
+ # Recognize the various machine names and aliases which stand
+ # for a CPU type and a company and sometimes even an OS.
+ 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+ cpu=m68000
+ vendor=att
+ ;;
+ 3b*)
+ cpu=we32k
+ vendor=att
+ ;;
+ bluegene*)
+ cpu=powerpc
+ vendor=ibm
+ basic_os=cnk
+ ;;
+ decsystem10* | dec10*)
+ cpu=pdp10
+ vendor=dec
+ basic_os=tops10
+ ;;
+ decsystem20* | dec20*)
+ cpu=pdp10
+ vendor=dec
+ basic_os=tops20
+ ;;
+ delta | 3300 | motorola-3300 | motorola-delta \
+ | 3300-motorola | delta-motorola)
+ cpu=m68k
+ vendor=motorola
+ ;;
+ dpx2*)
+ cpu=m68k
+ vendor=bull
+ basic_os=sysv3
+ ;;
+ encore | umax | mmax)
+ cpu=ns32k
+ vendor=encore
+ ;;
+ elxsi)
+ cpu=elxsi
+ vendor=elxsi
+ basic_os=${basic_os:-bsd}
+ ;;
+ fx2800)
+ cpu=i860
+ vendor=alliant
+ ;;
+ genix)
+ cpu=ns32k
+ vendor=ns
+ ;;
+ h3050r* | hiux*)
+ cpu=hppa1.1
+ vendor=hitachi
+ basic_os=hiuxwe2
+ ;;
+ hp3k9[0-9][0-9] | hp9[0-9][0-9])
+ cpu=hppa1.0
+ vendor=hp
+ ;;
+ hp9k2[0-9][0-9] | hp9k31[0-9])
+ cpu=m68000
+ vendor=hp
+ ;;
+ hp9k3[2-9][0-9])
+ cpu=m68k
+ vendor=hp
+ ;;
+ hp9k6[0-9][0-9] | hp6[0-9][0-9])
+ cpu=hppa1.0
+ vendor=hp
+ ;;
+ hp9k7[0-79][0-9] | hp7[0-79][0-9])
+ cpu=hppa1.1
+ vendor=hp
+ ;;
+ hp9k78[0-9] | hp78[0-9])
+ # FIXME: really hppa2.0-hp
+ cpu=hppa1.1
+ vendor=hp
+ ;;
+ hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+ # FIXME: really hppa2.0-hp
+ cpu=hppa1.1
+ vendor=hp
+ ;;
+ hp9k8[0-9][13679] | hp8[0-9][13679])
+ cpu=hppa1.1
+ vendor=hp
+ ;;
+ hp9k8[0-9][0-9] | hp8[0-9][0-9])
+ cpu=hppa1.0
+ vendor=hp
+ ;;
+ i*86v32)
+ cpu=`echo "$1" | sed -e 's/86.*/86/'`
+ vendor=pc
+ basic_os=sysv32
+ ;;
+ i*86v4*)
+ cpu=`echo "$1" | sed -e 's/86.*/86/'`
+ vendor=pc
+ basic_os=sysv4
+ ;;
+ i*86v)
+ cpu=`echo "$1" | sed -e 's/86.*/86/'`
+ vendor=pc
+ basic_os=sysv
+ ;;
+ i*86sol2)
+ cpu=`echo "$1" | sed -e 's/86.*/86/'`
+ vendor=pc
+ basic_os=solaris2
+ ;;
+ j90 | j90-cray)
+ cpu=j90
+ vendor=cray
+ basic_os=${basic_os:-unicos}
+ ;;
+ iris | iris4d)
+ cpu=mips
+ vendor=sgi
+ case $basic_os in
+ irix*)
+ ;;
+ *)
+ basic_os=irix4
+ ;;
+ esac
+ ;;
+ miniframe)
+ cpu=m68000
+ vendor=convergent
+ ;;
+ *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*)
+ cpu=m68k
+ vendor=atari
+ basic_os=mint
+ ;;
+ news-3600 | risc-news)
+ cpu=mips
+ vendor=sony
+ basic_os=newsos
+ ;;
+ next | m*-next)
+ cpu=m68k
+ vendor=next
+ case $basic_os in
+ openstep*)
+ ;;
+ nextstep*)
+ ;;
+ ns2*)
+ basic_os=nextstep2
+ ;;
+ *)
+ basic_os=nextstep3
+ ;;
+ esac
+ ;;
+ np1)
+ cpu=np1
+ vendor=gould
+ ;;
+ op50n-* | op60c-*)
+ cpu=hppa1.1
+ vendor=oki
+ basic_os=proelf
+ ;;
+ pa-hitachi)
+ cpu=hppa1.1
+ vendor=hitachi
+ basic_os=hiuxwe2
+ ;;
+ pbd)
+ cpu=sparc
+ vendor=tti
+ ;;
+ pbb)
+ cpu=m68k
+ vendor=tti
+ ;;
+ pc532)
+ cpu=ns32k
+ vendor=pc532
+ ;;
+ pn)
+ cpu=pn
+ vendor=gould
+ ;;
+ power)
+ cpu=power
+ vendor=ibm
+ ;;
+ ps2)
+ cpu=i386
+ vendor=ibm
+ ;;
+ rm[46]00)
+ cpu=mips
+ vendor=siemens
+ ;;
+ rtpc | rtpc-*)
+ cpu=romp
+ vendor=ibm
+ ;;
+ sde)
+ cpu=mipsisa32
+ vendor=sde
+ basic_os=${basic_os:-elf}
+ ;;
+ simso-wrs)
+ cpu=sparclite
+ vendor=wrs
+ basic_os=vxworks
+ ;;
+ tower | tower-32)
+ cpu=m68k
+ vendor=ncr
+ ;;
+ vpp*|vx|vx-*)
+ cpu=f301
+ vendor=fujitsu
+ ;;
+ w65)
+ cpu=w65
+ vendor=wdc
+ ;;
+ w89k-*)
+ cpu=hppa1.1
+ vendor=winbond
+ basic_os=proelf
+ ;;
+ none)
+ cpu=none
+ vendor=none
+ ;;
+ leon|leon[3-9])
+ cpu=sparc
+ vendor=$basic_machine
+ ;;
+ leon-*|leon[3-9]-*)
+ cpu=sparc
+ vendor=`echo "$basic_machine" | sed 's/-.*//'`
+ ;;
+
+ *-*)
+ # shellcheck disable=SC2162
+ saved_IFS=$IFS
+ IFS="-" read cpu vendor <<EOF
+$basic_machine
+EOF
+ IFS=$saved_IFS
+ ;;
+ # 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)
+ cpu=$basic_machine
+ vendor=pc
+ ;;
+ # These rules are duplicated from below for sake of the special case above;
+ # i.e. things that normalized to x86 arches should also default to "pc"
+ pc98)
+ cpu=i386
+ vendor=pc
+ ;;
+ x64 | amd64)
+ cpu=x86_64
+ vendor=pc
+ ;;
+ # Recognize the basic CPU types without company name.
+ *)
+ cpu=$basic_machine
+ vendor=unknown
+ ;;
+esac
+
+unset -v basic_machine
+
+# Decode basic machines in the full and proper CPU-Company form.
+case $cpu-$vendor in
+ # Here we handle the default manufacturer of certain CPU types in canonical form. It is in
+ # some cases the only manufacturer, in others, it is the most popular.
+ craynv-unknown)
+ vendor=cray
+ basic_os=${basic_os:-unicosmp}
+ ;;
+ c90-unknown | c90-cray)
+ vendor=cray
+ basic_os=${Basic_os:-unicos}
+ ;;
+ fx80-unknown)
+ vendor=alliant
+ ;;
+ romp-unknown)
+ vendor=ibm
+ ;;
+ mmix-unknown)
+ vendor=knuth
+ ;;
+ microblaze-unknown | microblazeel-unknown)
+ vendor=xilinx
+ ;;
+ rs6000-unknown)
+ vendor=ibm
+ ;;
+ vax-unknown)
+ vendor=dec
+ ;;
+ pdp11-unknown)
+ vendor=dec
+ ;;
+ we32k-unknown)
+ vendor=att
+ ;;
+ cydra-unknown)
+ vendor=cydrome
+ ;;
+ i370-ibm*)
+ vendor=ibm
+ ;;
+ orion-unknown)
+ vendor=highlevel
+ ;;
+ xps-unknown | xps100-unknown)
+ cpu=xps100
+ vendor=honeywell
+ ;;
+
+ # Here we normalize CPU types with a missing or matching vendor
+ armh-unknown | armh-alt)
+ cpu=armv7l
+ vendor=alt
+ basic_os=${basic_os:-linux-gnueabihf}
+ ;;
+ dpx20-unknown | dpx20-bull)
+ cpu=rs6000
+ vendor=bull
+ basic_os=${basic_os:-bosx}
+ ;;
+
+ # Here we normalize CPU types irrespective of the vendor
+ amd64-*)
+ cpu=x86_64
+ ;;
+ blackfin-*)
+ cpu=bfin
+ basic_os=linux
+ ;;
+ c54x-*)
+ cpu=tic54x
+ ;;
+ c55x-*)
+ cpu=tic55x
+ ;;
+ c6x-*)
+ cpu=tic6x
+ ;;
+ e500v[12]-*)
+ cpu=powerpc
+ basic_os=${basic_os}"spe"
+ ;;
+ mips3*-*)
+ cpu=mips64
+ ;;
+ ms1-*)
+ cpu=mt
+ ;;
+ m68knommu-*)
+ cpu=m68k
+ basic_os=linux
+ ;;
+ m9s12z-* | m68hcs12z-* | hcs12z-* | s12z-*)
+ cpu=s12z
+ ;;
+ openrisc-*)
+ cpu=or32
+ ;;
+ parisc-*)
+ cpu=hppa
+ basic_os=linux
+ ;;
+ pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+ cpu=i586
+ ;;
+ pentiumpro-* | p6-* | 6x86-* | athlon-* | athalon_*-*)
+ cpu=i686
+ ;;
+ pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+ cpu=i686
+ ;;
+ pentium4-*)
+ cpu=i786
+ ;;
+ pc98-*)
+ cpu=i386
+ ;;
+ ppc-* | ppcbe-*)
+ cpu=powerpc
+ ;;
+ ppcle-* | powerpclittle-*)
+ cpu=powerpcle
+ ;;
+ ppc64-*)
+ cpu=powerpc64
+ ;;
+ ppc64le-* | powerpc64little-*)
+ cpu=powerpc64le
+ ;;
+ sb1-*)
+ cpu=mipsisa64sb1
+ ;;
+ sb1el-*)
+ cpu=mipsisa64sb1el
+ ;;
+ sh5e[lb]-*)
+ cpu=`echo "$cpu" | sed 's/^\(sh.\)e\(.\)$/\1\2e/'`
+ ;;
+ spur-*)
+ cpu=spur
+ ;;
+ strongarm-* | thumb-*)
+ cpu=arm
+ ;;
+ tx39-*)
+ cpu=mipstx39
+ ;;
+ tx39el-*)
+ cpu=mipstx39el
+ ;;
+ x64-*)
+ cpu=x86_64
+ ;;
+ xscale-* | xscalee[bl]-*)
+ cpu=`echo "$cpu" | sed 's/^xscale/arm/'`
+ ;;
+ arm64-* | aarch64le-*)
+ cpu=aarch64
+ ;;
+
+ # Recognize the canonical CPU Types that limit and/or modify the
+ # company names they are paired with.
+ cr16-*)
+ basic_os=${basic_os:-elf}
+ ;;
+ crisv32-* | etraxfs*-*)
+ cpu=crisv32
+ vendor=axis
+ ;;
+ cris-* | etrax*-*)
+ cpu=cris
+ vendor=axis
+ ;;
+ crx-*)
+ basic_os=${basic_os:-elf}
+ ;;
+ neo-tandem)
+ cpu=neo
+ vendor=tandem
+ ;;
+ nse-tandem)
+ cpu=nse
+ vendor=tandem
+ ;;
+ nsr-tandem)
+ cpu=nsr
+ vendor=tandem
+ ;;
+ nsv-tandem)
+ cpu=nsv
+ vendor=tandem
+ ;;
+ nsx-tandem)
+ cpu=nsx
+ vendor=tandem
+ ;;
+ mipsallegrexel-sony)
+ cpu=mipsallegrexel
+ vendor=sony
+ ;;
+ tile*-*)
+ basic_os=${basic_os:-linux-gnu}
+ ;;
+
+ *)
+ # Recognize the canonical CPU types that are allowed with any
+ # company name.
+ case $cpu in
+ 1750a | 580 \
+ | a29k \
+ | aarch64 | aarch64_be \
+ | abacus \
+ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \
+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \
+ | alphapca5[67] | alpha64pca5[67] \
+ | am33_2.0 \
+ | amdgcn \
+ | arc | arceb | arc32 | arc64 \
+ | arm | arm[lb]e | arme[lb] | armv* \
+ | avr | avr32 \
+ | asmjs \
+ | ba \
+ | be32 | be64 \
+ | bfin | bpf | bs2000 \
+ | c[123]* | c30 | [cjt]90 | c4x \
+ | c8051 | clipper | craynv | csky | cydra \
+ | d10v | d30v | dlx | dsp16xx \
+ | e2k | elxsi | epiphany \
+ | f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \
+ | h8300 | h8500 \
+ | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+ | hexagon \
+ | i370 | i*86 | i860 | i960 | ia16 | ia64 \
+ | ip2k | iq2000 \
+ | k1om \
+ | le32 | le64 \
+ | lm32 \
+ | loongarch32 | loongarch64 | loongarchx32 \
+ | m32c | m32r | m32rle \
+ | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
+ | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \
+ | m88110 | m88k | maxq | mb | mcore | mep | metag \
+ | microblaze | microblazeel \
+ | mips | mipsbe | mipseb | mipsel | mipsle \
+ | mips16 \
+ | mips64 | mips64eb | mips64el \
+ | mips64octeon | mips64octeonel \
+ | mips64orion | mips64orionel \
+ | mips64r5900 | mips64r5900el \
+ | mips64vr | mips64vrel \
+ | mips64vr4100 | mips64vr4100el \
+ | mips64vr4300 | mips64vr4300el \
+ | mips64vr5000 | mips64vr5000el \
+ | mips64vr5900 | mips64vr5900el \
+ | mipsisa32 | mipsisa32el \
+ | mipsisa32r2 | mipsisa32r2el \
+ | mipsisa32r3 | mipsisa32r3el \
+ | mipsisa32r5 | mipsisa32r5el \
+ | mipsisa32r6 | mipsisa32r6el \
+ | mipsisa64 | mipsisa64el \
+ | mipsisa64r2 | mipsisa64r2el \
+ | mipsisa64r3 | mipsisa64r3el \
+ | mipsisa64r5 | mipsisa64r5el \
+ | mipsisa64r6 | mipsisa64r6el \
+ | mipsisa64sb1 | mipsisa64sb1el \
+ | mipsisa64sr71k | mipsisa64sr71kel \
+ | mipsr5900 | mipsr5900el \
+ | mipstx39 | mipstx39el \
+ | mmix \
+ | mn10200 | mn10300 \
+ | moxie \
+ | mt \
+ | msp430 \
+ | nds32 | nds32le | nds32be \
+ | nfp \
+ | nios | nios2 | nios2eb | nios2el \
+ | none | np1 | ns16k | ns32k | nvptx \
+ | open8 \
+ | or1k* \
+ | or32 \
+ | orion \
+ | picochip \
+ | pdp10 | pdp11 | pj | pjl | pn | power \
+ | powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \
+ | pru \
+ | pyramid \
+ | riscv | riscv32 | riscv32be | riscv64 | riscv64be \
+ | rl78 | romp | rs6000 | rx \
+ | s390 | s390x \
+ | score \
+ | sh | shl \
+ | sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \
+ | sh[1234]e[lb] | sh[12345][lb]e | sh[23]ele | sh64 | sh64le \
+ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet \
+ | sparclite \
+ | sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \
+ | spu \
+ | tahoe \
+ | thumbv7* \
+ | tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \
+ | tron \
+ | ubicom32 \
+ | v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \
+ | vax \
+ | visium \
+ | w65 \
+ | wasm32 | wasm64 \
+ | we32k \
+ | x86 | x86_64 | xc16x | xgate | xps100 \
+ | xstormy16 | xtensa* \
+ | ymp \
+ | z8k | z80)
+ ;;
+
+ *)
+ echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2
+ exit 1
+ ;;
+ esac
+ ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $vendor in
+ digital*)
+ vendor=dec
+ ;;
+ commodore*)
+ vendor=cbm
+ ;;
+ *)
+ ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if test x$basic_os != x
+then
+
+# First recognize some ad-hoc cases, or perhaps split kernel-os, or else just
+# set os.
+case $basic_os in
+ gnu/linux*)
+ kernel=linux
+ os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'`
+ ;;
+ os2-emx)
+ kernel=os2
+ os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'`
+ ;;
+ nto-qnx*)
+ kernel=nto
+ os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'`
+ ;;
+ *-*)
+ # shellcheck disable=SC2162
+ saved_IFS=$IFS
+ IFS="-" read kernel os <<EOF
+$basic_os
+EOF
+ IFS=$saved_IFS
+ ;;
+ # Default OS when just kernel was specified
+ nto*)
+ kernel=nto
+ os=`echo "$basic_os" | sed -e 's|nto|qnx|'`
+ ;;
+ linux*)
+ kernel=linux
+ os=`echo "$basic_os" | sed -e 's|linux|gnu|'`
+ ;;
+ *)
+ kernel=
+ os=$basic_os
+ ;;
+esac
+
+# Now, normalize the OS (knowing we just have one component, it's not a kernel,
+# etc.)
+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
+ ;;
+ bluegene*)
+ os=cnk
+ ;;
+ solaris1 | solaris1.*)
+ os=`echo "$os" | sed -e 's|solaris1|sunos4|'`
+ ;;
+ solaris)
+ os=solaris2
+ ;;
+ unixware*)
+ os=sysv4.2uw
+ ;;
+ # es1800 is here to avoid being matched by es* (a different OS)
+ es1800*)
+ os=ose
+ ;;
+ # Some version numbers need modification
+ chorusos*)
+ os=chorusos
+ ;;
+ isc)
+ os=isc2.2
+ ;;
+ sco6)
+ os=sco5v6
+ ;;
+ sco5)
+ os=sco3.2v5
+ ;;
+ sco4)
+ os=sco3.2v4
+ ;;
+ sco3.2.[4-9]*)
+ os=`echo "$os" | sed -e 's/sco3.2./sco3.2v/'`
+ ;;
+ sco*v* | scout)
+ # Don't match below
+ ;;
+ sco*)
+ os=sco3.2v2
+ ;;
+ psos*)
+ os=psos
+ ;;
+ qnx*)
+ os=qnx
+ ;;
+ hiux*)
+ os=hiuxwe2
+ ;;
+ lynx*178)
+ os=lynxos178
+ ;;
+ lynx*5)
+ os=lynxos5
+ ;;
+ lynxos*)
+ # don't get caught up in next wildcard
+ ;;
+ lynx*)
+ os=lynxos
+ ;;
+ mac[0-9]*)
+ os=`echo "$os" | sed -e 's|mac|macos|'`
+ ;;
+ opened*)
+ os=openedition
+ ;;
+ os400*)
+ os=os400
+ ;;
+ sunos5*)
+ os=`echo "$os" | sed -e 's|sunos5|solaris2|'`
+ ;;
+ sunos6*)
+ os=`echo "$os" | sed -e 's|sunos6|solaris3|'`
+ ;;
+ wince*)
+ os=wince
+ ;;
+ 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
+ ;;
+ # 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
+ ;;
+ ose*)
+ os=ose
+ ;;
+ *mint | mint[0-9]* | *MiNT | MiNT[0-9]*)
+ os=mint
+ ;;
+ dicos*)
+ os=dicos
+ ;;
+ pikeos*)
+ # Until real need of OS specific support for
+ # particular features comes up, bare metal
+ # configurations are quite functional.
+ case $cpu in
+ arm*)
+ os=eabi
+ ;;
+ *)
+ os=elf
+ ;;
+ esac
+ ;;
+ *)
+ # No normalization, but not necessarily accepted, that comes below.
+ ;;
+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.
+
+kernel=
+case $cpu-$vendor in
+ score-*)
+ os=elf
+ ;;
+ spu-*)
+ os=elf
+ ;;
+ *-acorn)
+ os=riscix1.2
+ ;;
+ arm*-rebel)
+ kernel=linux
+ os=gnu
+ ;;
+ arm*-semi)
+ os=aout
+ ;;
+ c4x-* | tic4x-*)
+ os=coff
+ ;;
+ c8051-*)
+ os=elf
+ ;;
+ clipper-intergraph)
+ os=clix
+ ;;
+ hexagon-*)
+ os=elf
+ ;;
+ 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
+ ;;
+ pru-*)
+ os=elf
+ ;;
+ *-be)
+ os=beos
+ ;;
+ *-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
+ ;;
+ *-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
+ ;;
+ *-wrs)
+ os=vxworks
+ ;;
+ *)
+ os=none
+ ;;
+esac
+
+fi
+
+# Now, validate our (potentially fixed-up) OS.
+case $os in
+ # Sometimes we do "kernel-libc", so those need to count as OSes.
+ musl* | newlib* | relibc* | uclibc*)
+ ;;
+ # Likewise for "kernel-abi"
+ eabi* | gnueabi*)
+ ;;
+ # VxWorks passes extra cpu info in the 4th filed.
+ simlinux | simwindows | spe)
+ ;;
+ # Now accept the basic system types.
+ # The portable systems comes first.
+ # Each alternative MUST end in a * to match a version number.
+ gnu* | android* | bsd* | mach* | minix* | genix* | ultrix* | irix* \
+ | *vms* | esix* | aix* | cnk* | sunos | sunos[34]* \
+ | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \
+ | sym* | plan9* | psp* | sim* | xray* | os68k* | v88r* \
+ | hiux* | abug | nacl* | netware* | windows* \
+ | os9* | macos* | osx* | ios* \
+ | mpw* | magic* | mmixware* | mon960* | lnews* \
+ | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \
+ | aos* | aros* | cloudabi* | sortix* | twizzler* \
+ | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \
+ | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \
+ | mirbsd* | netbsd* | dicos* | openedition* | ose* \
+ | bitrig* | openbsd* | secbsd* | solidbsd* | libertybsd* | os108* \
+ | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \
+ | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \
+ | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \
+ | udi* | lites* | ieee* | go32* | aux* | hcos* \
+ | chorusrdb* | cegcc* | glidix* | serenity* \
+ | cygwin* | msys* | pe* | moss* | proelf* | rtems* \
+ | midipix* | mingw32* | mingw64* | mint* \
+ | uxpv* | beos* | mpeix* | udk* | moxiebox* \
+ | interix* | uwin* | mks* | rhapsody* | darwin* \
+ | openstep* | oskit* | conix* | pw32* | nonstopux* \
+ | storm-chaos* | tops10* | tenex* | tops20* | its* \
+ | os2* | vos* | palmos* | uclinux* | nucleus* | morphos* \
+ | scout* | superux* | sysv* | rtmk* | tpf* | windiss* \
+ | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \
+ | skyos* | haiku* | rdos* | toppers* | drops* | es* \
+ | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
+ | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \
+ | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \
+ | fiwix* )
+ ;;
+ # This one is extra strict with allowed versions
+ sco3.2v2 | sco3.2v[4-9]* | sco5v6*)
+ # Don't forget version if it is 3.2v4 or newer.
+ ;;
+ none)
+ ;;
+ *)
+ echo Invalid configuration \`"$1"\': OS \`"$os"\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+
+# As a final step for OS-related things, validate the OS-kernel combination
+# (given a valid OS), if there is a kernel.
+case $kernel-$os in
+ linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \
+ | linux-musl* | linux-relibc* | linux-uclibc* )
+ ;;
+ uclinux-uclibc* )
+ ;;
+ -dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* )
+ # These are just libc implementations, not actual OSes, and thus
+ # require a kernel.
+ echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2
+ exit 1
+ ;;
+ kfreebsd*-gnu* | kopensolaris*-gnu*)
+ ;;
+ vxworks-simlinux | vxworks-simwindows | vxworks-spe)
+ ;;
+ nto-qnx*)
+ ;;
+ os2-emx)
+ ;;
+ *-eabi* | *-gnueabi*)
+ ;;
+ -*)
+ # Blank kernel with real OS is always fine.
+ ;;
+ *-*)
+ echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2
+ exit 1
+ ;;
+esac
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer. We pick the logical manufacturer.
+case $vendor in
+ unknown)
+ case $cpu-$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
+ ;;
+ *-clix*)
+ vendor=intergraph
+ ;;
+ *-mvs* | *-opened*)
+ vendor=ibm
+ ;;
+ *-os400*)
+ vendor=ibm
+ ;;
+ s390-* | s390x-*)
+ 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
+ ;;
+esac
+
+echo "$cpu-$vendor-${kernel:+$kernel-}$os"
+exit
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/configure b/configure
new file mode 100755
index 0000000..4af66c2
--- /dev/null
+++ b/configure
@@ -0,0 +1,26793 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.71 for liborcus 0.19.2.
+#
+#
+# Copyright (C) 1992-1996, 1998-2017, 2020-2021 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
+as_nop=:
+if test ${ZSH_VERSION+y} && (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 $as_nop
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
+as_nl='
+'
+export as_nl
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
+
+# The user is always right.
+if ${PATH_SEPARATOR+false} :; 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
+
+
+# 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ 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
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+
+# Use a proper internal environment variable to ensure we don't fall
+ # into an infinite loop, continuously re-executing ourselves.
+ if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+ _as_can_reexec=no; export _as_can_reexec;
+ # 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
+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+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+ fi
+ # We don't want this to propagate to other subprocesses.
+ { _as_can_reexec=; unset _as_can_reexec;}
+if test "x$CONFIG_SHELL" = x; then
+ as_bourne_compatible="as_nop=:
+if test \${ZSH_VERSION+y} && (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 \$as_nop
+ 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 \$as_nop
+ exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+blah=\$(echo \$(echo blah))
+test x\"\$blah\" = xblah || exit 1
+test -x / || 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_nop
+ as_have_required=no
+fi
+ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null
+then :
+
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ 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_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
+ CONFIG_SHELL=$as_shell as_have_required=yes
+ if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null
+then :
+ break 2
+fi
+fi
+ done;;
+ esac
+ as_found=false
+done
+IFS=$as_save_IFS
+if $as_found
+then :
+
+else $as_nop
+ if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+ as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
+ CONFIG_SHELL=$SHELL as_have_required=yes
+fi
+fi
+
+
+ if test "x$CONFIG_SHELL" != x
+then :
+ export CONFIG_SHELL
+ # 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
+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+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+ if test x$as_have_required = xno
+then :
+ printf "%s\n" "$0: This script requires a shell more modern than all"
+ printf "%s\n" "$0: the shells that I found on your system."
+ if test ${ZSH_VERSION+y} ; then
+ printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+ printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later."
+ else
+ printf "%s\n" "$0: Please tell bug-autoconf@gnu.org about your system,
+$0: including any error possibly output before this
+$0: message. Then install a modern shell, or manually run
+$0: the script under such a shell if you do 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_nop
+# ---------
+# Do nothing but, unlike ":", preserve the value of $?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
+
+# 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=`printf "%s\n" "$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 ||
+printf "%s\n" 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_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_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_nop
+ 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_nop
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+# as_fn_nop
+# ---------
+# Do nothing but, unlike ":", preserve the value of $?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
+
+# 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
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ printf "%s\n" "$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 ||
+printf "%s\n" 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" ||
+ { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+ # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+ # already done that, so ensure we don't try to do so again and fall
+ # in an infinite loop. This has already happened in practice.
+ _as_can_reexec=no; export _as_can_reexec
+ # 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
+}
+
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
+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
+
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_echo='printf %s\n'
+as_echo_n='printf %s'
+
+
+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 -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+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
+
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# 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='liborcus'
+PACKAGE_TARNAME='liborcus'
+PACKAGE_VERSION='0.19.2'
+PACKAGE_STRING='liborcus 0.19.2'
+PACKAGE_BUGREPORT=''
+PACKAGE_URL=''
+
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stddef.h>
+#ifdef HAVE_STDIO_H
+# include <stdio.h>
+#endif
+#ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+#endif
+#ifdef HAVE_STRING_H
+# include <string.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_header_c_list=
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+VALGRIND_CHECK_RULES
+valgrind_enabled_tools
+valgrind_tools
+ENABLE_VALGRIND_sgcheck
+ENABLE_VALGRIND_drd
+ENABLE_VALGRIND_helgrind
+ENABLE_VALGRIND_memcheck
+VALGRIND_ENABLED
+VALGRIND_ENABLED_FALSE
+VALGRIND_ENABLED_TRUE
+VALGRIND
+WITH_PYTHON_GNUMERIC_FALSE
+WITH_PYTHON_GNUMERIC_TRUE
+WITH_PYTHON_XLS_XML_FALSE
+WITH_PYTHON_XLS_XML_TRUE
+WITH_PYTHON_CSV_FALSE
+WITH_PYTHON_CSV_TRUE
+WITH_PYTHON_ODS_FALSE
+WITH_PYTHON_ODS_TRUE
+WITH_PYTHON_XLSX_FALSE
+WITH_PYTHON_XLSX_TRUE
+BUILD_PYTHON_FALSE
+BUILD_PYTHON_TRUE
+PYTHON_LIBS
+PYTHON_CFLAGS
+pkgpyexecdir
+pyexecdir
+pkgpythondir
+pythondir
+PYTHON_EXEC_PREFIX
+PYTHON_PREFIX
+PYTHON_PLATFORM
+PYTHON_VERSION
+PYTHON
+BUILD_SPREADSHEET_MODEL_FALSE
+BUILD_SPREADSHEET_MODEL_TRUE
+BOOST_DATE_TIME_LIBS
+BOOST_DATE_TIME_LDPATH
+BOOST_DATE_TIME_LDFLAGS
+LIBIXION_LIBS
+LIBIXION_CFLAGS
+MDDS_LIBS
+MDDS_CFLAGS
+BOOST_PROGRAM_OPTIONS_LIBS
+BOOST_PROGRAM_OPTIONS_LDPATH
+BOOST_PROGRAM_OPTIONS_LDFLAGS
+PARQUET_LIBS
+PARQUET_CFLAGS
+BOOST_IOSTREAMS_LIBS
+BOOST_IOSTREAMS_LDPATH
+BOOST_IOSTREAMS_LDFLAGS
+WITH_DOC_EXAMPLE_FALSE
+WITH_DOC_EXAMPLE_TRUE
+WITH_BENCHMARK_FALSE
+WITH_BENCHMARK_TRUE
+WITH_TOOLS_FALSE
+WITH_TOOLS_TRUE
+WITH_PARQUET_FILTER_FALSE
+WITH_PARQUET_FILTER_TRUE
+WITH_GNUMERIC_FILTER_FALSE
+WITH_GNUMERIC_FILTER_TRUE
+WITH_XLS_XML_FILTER_FALSE
+WITH_XLS_XML_FILTER_TRUE
+WITH_XLSX_FILTER_FALSE
+WITH_XLSX_FILTER_TRUE
+WITH_ODS_FILTER_FALSE
+WITH_ODS_FILTER_TRUE
+ZLIB_LIBS
+ZLIB_CFLAGS
+HAVE_STATIC_LIB_FALSE
+HAVE_STATIC_LIB_TRUE
+BOOST_FILESYSTEM_LIBS
+BOOST_FILESYSTEM_LDPATH
+BOOST_FILESYSTEM_LDFLAGS
+BOOST_SYSTEM_LIBS
+BOOST_LDPATH
+BOOST_SYSTEM_LDPATH
+BOOST_SYSTEM_LDFLAGS
+BOOST_CPPFLAGS
+DISTCHECK_CONFIGURE_FLAGS
+BOOST_ROOT
+ORCUS_MICRO_VERSION
+ORCUS_MINOR_VERSION
+ORCUS_MAJOR_VERSION
+ORCUS_API_VERSION
+IXION_REQUIRED_API_VERSION
+LIBOBJS
+POW_LIB
+HAVE_EXPERIMENTAL_FILESYSTEM_FALSE
+HAVE_EXPERIMENTAL_FILESYSTEM_TRUE
+HAVE_FILESYSTEM_FALSE
+HAVE_FILESYSTEM_TRUE
+PKG_CONFIG_LIBDIR
+PKG_CONFIG_PATH
+PKG_CONFIG
+CXXCPP
+LT_SYS_LIBRARY_PATH
+OTOOL64
+OTOOL
+LIPO
+NMEDIT
+DSYMUTIL
+MANIFEST_TOOL
+RANLIB
+ac_ct_AR
+AR
+LN_S
+NM
+ac_ct_DUMPBIN
+DUMPBIN
+LD
+FGREP
+EGREP
+GREP
+SED
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+LIBTOOL
+OBJDUMP
+DLLTOOL
+AS
+CPP
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+ac_ct_CC
+CFLAGS
+CC
+HAVE_CXX17
+am__fastdepCXX_FALSE
+am__fastdepCXX_TRUE
+CXXDEPMODE
+am__nodep
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CXX
+CPPFLAGS
+LDFLAGS
+CXXFLAGS
+CXX
+AM_BACKSLASH
+AM_DEFAULT_VERBOSITY
+AM_DEFAULT_V
+AM_V
+CSCOPE
+ETAGS
+CTAGS
+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
+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
+runstatedir
+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
+am__quote'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_silent_rules
+enable_dependency_tracking
+enable_static
+with_pic
+enable_shared
+enable_fast_install
+with_aix_soname
+with_gnu_ld
+with_sysroot
+enable_libtool_lock
+with_boost
+enable_static_boost
+enable_debug_utils
+enable_debug
+with_tools
+with_ods_filter
+with_xlsx_filter
+with_xls_xml_filter
+with_gnumeric_filter
+with_parquet_filter
+with_cpu_features
+with_benchmark
+with_doc_example
+enable_spreadsheet_model
+enable_python
+with_python_sys_prefix
+with_python_prefix
+with_python_exec_prefix
+enable_werror
+enable_valgrind
+enable_valgrind_memcheck
+enable_valgrind_helgrind
+enable_valgrind_drd
+enable_valgrind_sgcheck
+'
+ ac_precious_vars='build_alias
+host_alias
+target_alias
+CXX
+CXXFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CCC
+CC
+CFLAGS
+CPP
+LT_SYS_LIBRARY_PATH
+CXXCPP
+PKG_CONFIG
+PKG_CONFIG_PATH
+PKG_CONFIG_LIBDIR
+BOOST_ROOT
+ZLIB_CFLAGS
+ZLIB_LIBS
+PARQUET_CFLAGS
+PARQUET_LIBS
+MDDS_CFLAGS
+MDDS_LIBS
+LIBIXION_CFLAGS
+LIBIXION_LIBS
+PYTHON
+PYTHON_CFLAGS
+PYTHON_LIBS'
+
+
+# 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'
+runstatedir='${localstatedir}/run'
+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
+
+ 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=`printf "%s\n" "$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=`printf "%s\n" "$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 ;;
+
+ -runstatedir | --runstatedir | --runstatedi | --runstated \
+ | --runstate | --runstat | --runsta | --runst | --runs \
+ | --run | --ru | --r)
+ ac_prev=runstatedir ;;
+ -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
+ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
+ | --run=* | --ru=* | --r=*)
+ runstatedir=$ac_optarg ;;
+
+ -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=`printf "%s\n" "$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=`printf "%s\n" "$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.
+ printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ printf "%s\n" "$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" ;;
+ *) printf "%s\n" "$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 runstatedir
+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
+ 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 ||
+printf "%s\n" 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 liborcus 0.19.2 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]
+ --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run]
+ --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/liborcus]
+ --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 liborcus 0.19.2:";;
+ 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-dependency-tracking
+ do not reject slow dependency extractors
+ --disable-dependency-tracking
+ speeds up one-time build
+ --enable-static[=PKGS] build static libraries [default=no]
+ --enable-shared[=PKGS] build shared libraries [default=yes]
+ --enable-fast-install[=PKGS]
+ optimize for fast installation [default=yes]
+ --disable-libtool-lock avoid locking (might break parallel builds)
+ --enable-static-boost Prefer the static boost libraries over the shared
+ ones [no]
+ --enable-debug-utils Build with extra checks useful during development.
+ --enable-debug Build with debug features in mind.
+ --disable-spreadsheet-model
+ Disable the spreadsheet model implementation in
+ orcus. Note that the spreadsheet-specific command
+ line utilities will not be built when this is
+ disabled.
+ --disable-python Disable python bindings
+ --enable-werror Treat all warnings as errors, useful for development
+ --enable-valgrind Whether to enable Valgrind on the unit tests
+ --disable-valgrind-memcheck
+ Whether to skip memcheck during the Valgrind tests
+ --disable-valgrind-helgrind
+ Whether to skip helgrind during the Valgrind tests
+ --disable-valgrind-drd Whether to skip drd during the Valgrind tests
+ --disable-valgrind-sgcheck
+ Whether to skip sgcheck during the Valgrind tests
+
+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-aix-soname=aix|svr4|both
+ shared library versioning (aka "SONAME") variant to
+ provide on AIX, [default=aix].
+ --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-boost=DIR prefix of Boost 1.36 [guess]
+ --without-tools Disables building of binary executable tools.
+ --without-ods-filter Disables the OpenDocument Format spreadsheet import
+ filter.
+ --without-xlsx-filter Disables the Microsoft Excel OOXML import filter.
+ --without-xls-xml-filter
+ Disables the Microsoft Excel XML import filter.
+ --without-gnumeric-filter
+ Disables the gnumeric import filter. The gnumeric
+ import filter depends on zLib.
+ --with-parquet-filter Disables the parquet import filter. The parquet
+ import filter depends on Apache Arrow.
+ --with-cpu-features Enables custom CPU features.
+ --without-benchmark Disables building of benchmark testing programs.
+ --with-doc-example Enables building of example code used in
+ documentation.
+ --with-python-sys-prefix
+ use Python's sys.prefix and sys.exec_prefix values
+ --with-python_prefix override the default PYTHON_PREFIX
+ --with-python_exec_prefix
+ override the default PYTHON_EXEC_PREFIX
+
+Some influential environment variables:
+ CXX C++ compiler command
+ CXXFLAGS 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>
+ CC C compiler command
+ CFLAGS C compiler flags
+ CPP C preprocessor
+ LT_SYS_LIBRARY_PATH
+ User-defined run-time library search path.
+ CXXCPP C++ preprocessor
+ PKG_CONFIG path to pkg-config utility
+ PKG_CONFIG_PATH
+ directories to add to pkg-config's search path
+ PKG_CONFIG_LIBDIR
+ path overriding pkg-config's built-in search path
+ BOOST_ROOT Location of Boost installation
+ ZLIB_CFLAGS C compiler flags for ZLIB, overriding pkg-config
+ ZLIB_LIBS linker flags for ZLIB, overriding pkg-config
+ PARQUET_CFLAGS
+ C compiler flags for PARQUET, overriding pkg-config
+ PARQUET_LIBS
+ linker flags for PARQUET, overriding pkg-config
+ MDDS_CFLAGS C compiler flags for MDDS, overriding pkg-config
+ MDDS_LIBS linker flags for MDDS, overriding pkg-config
+ LIBIXION_CFLAGS
+ C compiler flags for LIBIXION, overriding pkg-config
+ LIBIXION_LIBS
+ linker flags for LIBIXION, overriding pkg-config
+ PYTHON the Python interpreter
+ PYTHON_CFLAGS
+ C compiler flags for PYTHON, overriding pkg-config
+ PYTHON_LIBS linker flags for PYTHON, overriding pkg-config
+
+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 the package provider.
+_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=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`printf "%s\n" "$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 configure.gnu first; this name is used for a wrapper for
+ # Metaconfig's "Configure" on case-insensitive file systems.
+ 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
+ printf "%s\n" "$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
+liborcus configure 0.19.2
+generated by GNU Autoconf 2.71
+
+Copyright (C) 2021 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_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 conftest.beam
+ 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\""
+printf "%s\n" "$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
+ printf "%s\n" "$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_nop
+ printf "%s\n" "$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_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 conftest.beam
+ 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\""
+printf "%s\n" "$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
+ printf "%s\n" "$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_nop
+ printf "%s\n" "$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_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\""
+printf "%s\n" "$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
+ printf "%s\n" "$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_nop
+ printf "%s\n" "$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_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.beam 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\""
+printf "%s\n" "$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
+ printf "%s\n" "$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 ||
+ test -x conftest$ac_exeext
+ }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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 $as_nop
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_compile
+
+# 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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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. */
+
+#include <limits.h>
+#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 (void)
+{
+return $2 ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ eval "$3=yes"
+else $as_nop
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_func
+
+# 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\""
+printf "%s\n" "$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
+ printf "%s\n" "$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_nop
+ printf "%s\n" "$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.beam 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\""
+printf "%s\n" "$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
+ printf "%s\n" "$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 ||
+ test -x conftest$ac_exeext
+ }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$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_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_cxx_check_header_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ eval "$3=yes"
+else $as_nop
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_cxx_check_header_compile
+
+# 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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ eval "$3=no"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main (void)
+{
+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 (void)
+{
+if (sizeof (($2)))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+
+else $as_nop
+ eval "$3=yes"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_cxx_check_type
+
+# ac_fn_cxx_try_run LINENO
+# ------------------------
+# Try to run 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\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ printf "%s\n" "$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\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: program exited with status $ac_status" >&5
+ printf "%s\n" "$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_compute_int LINENO EXPR VAR INCLUDES
+# ----------------------------------------------
+# Tries to find the compile-time value of EXPR in a program that includes
+# INCLUDES, setting VAR accordingly. Returns whether the value could be
+# computed
+ac_fn_cxx_compute_int ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main (void)
+{
+static int test_array [1 - 2 * !(($2) >= 0)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main (void)
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_hi=$ac_mid; break
+else $as_nop
+ as_fn_arith $ac_mid + 1 && ac_lo=$as_val
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ done
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main (void)
+{
+static int test_array [1 - 2 * !(($2) < 0)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main (void)
+{
+static int test_array [1 - 2 * !(($2) >= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_lo=$ac_mid; break
+else $as_nop
+ as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ done
+else $as_nop
+ ac_lo= ac_hi=
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main (void)
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_hi=$ac_mid
+else $as_nop
+ as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+done
+case $ac_lo in #((
+?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
+'') ac_retval=1 ;;
+esac
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+static long int longval (void) { return $2; }
+static unsigned long int ulongval (void) { return $2; }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main (void)
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ return 1;
+ if (($2) < 0)
+ {
+ long int i = longval ();
+ if (i != ($2))
+ return 1;
+ fprintf (f, "%ld", i);
+ }
+ else
+ {
+ unsigned long int i = ulongval ();
+ if (i != ($2))
+ return 1;
+ fprintf (f, "%lu", i);
+ }
+ /* Do not output a trailing newline, as this causes \r\n confusion
+ on some platforms. */
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"
+then :
+ echo >>conftest.val; read $3 <conftest.val; ac_retval=0
+else $as_nop
+ ac_retval=1
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f conftest.val
+
+ fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_compute_int
+
+# 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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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. */
+
+#include <limits.h>
+#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 (void)
+{
+return $2 ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+ eval "$3=yes"
+else $as_nop
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_cxx_check_func
+ac_configure_args_raw=
+for ac_arg
+do
+ case $ac_arg in
+ *\'*)
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append ac_configure_args_raw " '$ac_arg'"
+done
+
+case $ac_configure_args_raw in
+ *$as_nl*)
+ ac_safe_unquote= ;;
+ *)
+ ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab.
+ ac_unsafe_a="$ac_unsafe_z#~"
+ ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g"
+ ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;;
+esac
+
+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 liborcus $as_me 0.19.2, which was
+generated by GNU Autoconf 2.71. Invocation command line was
+
+ $ $0$ac_configure_args_raw
+
+_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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ printf "%s\n" "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=`printf "%s\n" "$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=$?
+ # Sanitize IFS.
+ IFS=" "" $as_nl"
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ printf "%s\n" "## ---------------- ##
+## 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_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$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
+
+ printf "%s\n" "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ printf "%s\n" "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ printf "%s\n" "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+ echo
+ cat confdefs.h
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ printf "%s\n" "$as_me: caught signal $ac_signal"
+ printf "%s\n" "$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
+
+printf "%s\n" "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h
+
+printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h
+
+printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h
+
+printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h
+
+printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h
+
+printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+if test -n "$CONFIG_SITE"; then
+ ac_site_files="$CONFIG_SITE"
+elif test "x$prefix" != xNONE; then
+ ac_site_files="$prefix/share/config.site $prefix/etc/config.site"
+else
+ ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+fi
+
+for ac_site_file in $ac_site_files
+do
+ case $ac_site_file in #(
+ */*) :
+ ;; #(
+ *) :
+ ac_site_file=./$ac_site_file ;;
+esac
+ if test -f "$ac_site_file" && test -r "$ac_site_file"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file" \
+ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+printf "%s\n" "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . "$cache_file";;
+ *) . "./$cache_file";;
+ esac
+ fi
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+printf "%s\n" "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Test code for whether the C++ compiler supports C++98 (global declarations)
+ac_cxx_conftest_cxx98_globals='
+// Does the compiler advertise C++98 conformance?
+#if !defined __cplusplus || __cplusplus < 199711L
+# error "Compiler does not advertise C++98 conformance"
+#endif
+
+// These inclusions are to reject old compilers that
+// lack the unsuffixed header files.
+#include <cstdlib>
+#include <exception>
+
+// <cassert> and <cstring> are *not* freestanding headers in C++98.
+extern void assert (int);
+namespace std {
+ extern int strcmp (const char *, const char *);
+}
+
+// Namespaces, exceptions, and templates were all added after "C++ 2.0".
+using std::exception;
+using std::strcmp;
+
+namespace {
+
+void test_exception_syntax()
+{
+ try {
+ throw "test";
+ } catch (const char *s) {
+ // Extra parentheses suppress a warning when building autoconf itself,
+ // due to lint rules shared with more typical C programs.
+ assert (!(strcmp) (s, "test"));
+ }
+}
+
+template <typename T> struct test_template
+{
+ T const val;
+ explicit test_template(T t) : val(t) {}
+ template <typename U> T add(U u) { return static_cast<T>(u) + val; }
+};
+
+} // anonymous namespace
+'
+
+# Test code for whether the C++ compiler supports C++98 (body of main)
+ac_cxx_conftest_cxx98_main='
+ assert (argc);
+ assert (! argv[0]);
+{
+ test_exception_syntax ();
+ test_template<double> tt (2.0);
+ assert (tt.add (4) == 6.0);
+ assert (true && !false);
+}
+'
+
+# Test code for whether the C++ compiler supports C++11 (global declarations)
+ac_cxx_conftest_cxx11_globals='
+// Does the compiler advertise C++ 2011 conformance?
+#if !defined __cplusplus || __cplusplus < 201103L
+# error "Compiler does not advertise C++11 conformance"
+#endif
+
+namespace cxx11test
+{
+ constexpr int get_val() { return 20; }
+
+ struct testinit
+ {
+ int i;
+ double d;
+ };
+
+ class delegate
+ {
+ public:
+ delegate(int n) : n(n) {}
+ delegate(): delegate(2354) {}
+
+ virtual int getval() { return this->n; };
+ protected:
+ int n;
+ };
+
+ class overridden : public delegate
+ {
+ public:
+ overridden(int n): delegate(n) {}
+ virtual int getval() override final { return this->n * 2; }
+ };
+
+ class nocopy
+ {
+ public:
+ nocopy(int i): i(i) {}
+ nocopy() = default;
+ nocopy(const nocopy&) = delete;
+ nocopy & operator=(const nocopy&) = delete;
+ private:
+ int i;
+ };
+
+ // for testing lambda expressions
+ template <typename Ret, typename Fn> Ret eval(Fn f, Ret v)
+ {
+ return f(v);
+ }
+
+ // for testing variadic templates and trailing return types
+ template <typename V> auto sum(V first) -> V
+ {
+ return first;
+ }
+ template <typename V, typename... Args> auto sum(V first, Args... rest) -> V
+ {
+ return first + sum(rest...);
+ }
+}
+'
+
+# Test code for whether the C++ compiler supports C++11 (body of main)
+ac_cxx_conftest_cxx11_main='
+{
+ // Test auto and decltype
+ auto a1 = 6538;
+ auto a2 = 48573953.4;
+ auto a3 = "String literal";
+
+ int total = 0;
+ for (auto i = a3; *i; ++i) { total += *i; }
+
+ decltype(a2) a4 = 34895.034;
+}
+{
+ // Test constexpr
+ short sa[cxx11test::get_val()] = { 0 };
+}
+{
+ // Test initializer lists
+ cxx11test::testinit il = { 4323, 435234.23544 };
+}
+{
+ // Test range-based for
+ int array[] = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3,
+ 14, 19, 17, 8, 6, 20, 16, 2, 11, 1};
+ for (auto &x : array) { x += 23; }
+}
+{
+ // Test lambda expressions
+ using cxx11test::eval;
+ assert (eval ([](int x) { return x*2; }, 21) == 42);
+ double d = 2.0;
+ assert (eval ([&](double x) { return d += x; }, 3.0) == 5.0);
+ assert (d == 5.0);
+ assert (eval ([=](double x) mutable { return d += x; }, 4.0) == 9.0);
+ assert (d == 5.0);
+}
+{
+ // Test use of variadic templates
+ using cxx11test::sum;
+ auto a = sum(1);
+ auto b = sum(1, 2);
+ auto c = sum(1.0, 2.0, 3.0);
+}
+{
+ // Test constructor delegation
+ cxx11test::delegate d1;
+ cxx11test::delegate d2();
+ cxx11test::delegate d3(45);
+}
+{
+ // Test override and final
+ cxx11test::overridden o1(55464);
+}
+{
+ // Test nullptr
+ char *c = nullptr;
+}
+{
+ // Test template brackets
+ test_template<::test_template<int>> v(test_template<int>(12));
+}
+{
+ // Unicode literals
+ char const *utf8 = u8"UTF-8 string \u2500";
+ char16_t const *utf16 = u"UTF-8 string \u2500";
+ char32_t const *utf32 = U"UTF-32 string \u2500";
+}
+'
+
+# Test code for whether the C compiler supports C++11 (complete).
+ac_cxx_conftest_cxx11_program="${ac_cxx_conftest_cxx98_globals}
+${ac_cxx_conftest_cxx11_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_cxx_conftest_cxx98_main}
+ ${ac_cxx_conftest_cxx11_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C++98 (complete).
+ac_cxx_conftest_cxx98_program="${ac_cxx_conftest_cxx98_globals}
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_cxx_conftest_cxx98_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C89 (global declarations)
+ac_c_conftest_c89_globals='
+/* Does the compiler advertise C89 conformance?
+ Do not test the value of __STDC__, because some compilers set it to 0
+ while being otherwise adequately conformant. */
+#if !defined __STDC__
+# error "Compiler does not advertise C89 conformance"
+#endif
+
+#include <stddef.h>
+#include <stdarg.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */
+struct buf { int x; };
+struct buf * (*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 do not provoke an error unfortunately, instead are silently treated
+ as an "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 is necessary to write \x00 == 0 to get something
+ that is 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 **, int *(*)(struct buf *, struct stat *, int),
+ int, int);'
+
+# Test code for whether the C compiler supports C89 (body of main).
+ac_c_conftest_c89_main='
+ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]);
+'
+
+# Test code for whether the C compiler supports C99 (global declarations)
+ac_c_conftest_c99_globals='
+// Does the compiler advertise C99 conformance?
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L
+# error "Compiler does not advertise C99 conformance"
+#endif
+
+#include <stdbool.h>
+extern int puts (const char *);
+extern int printf (const char *, ...);
+extern int dprintf (int, const char *, ...);
+extern void *malloc (size_t);
+
+// Check varargs macros. These examples are taken from C99 6.10.3.5.
+// dprintf is used instead of fprintf to avoid needing to declare
+// FILE and stderr.
+#define debug(...) dprintf (2, __VA_ARGS__)
+#define showlist(...) puts (#__VA_ARGS__)
+#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
+static void
+test_varargs_macros (void)
+{
+ int x = 1234;
+ int y = 5678;
+ debug ("Flag");
+ debug ("X = %d\n", x);
+ showlist (The first, second, and third items.);
+ report (x>y, "x is %d but y is %d", x, y);
+}
+
+// Check long long types.
+#define BIG64 18446744073709551615ull
+#define BIG32 4294967295ul
+#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
+#if !BIG_OK
+ #error "your preprocessor is broken"
+#endif
+#if BIG_OK
+#else
+ #error "your preprocessor is broken"
+#endif
+static long long int bignum = -9223372036854775807LL;
+static unsigned long long int ubignum = BIG64;
+
+struct incomplete_array
+{
+ int datasize;
+ double data[];
+};
+
+struct named_init {
+ int number;
+ const wchar_t *name;
+ double average;
+};
+
+typedef const char *ccp;
+
+static inline int
+test_restrict (ccp restrict text)
+{
+ // See if C++-style comments work.
+ // Iterate through items via the restricted pointer.
+ // Also check for declarations in for loops.
+ for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i)
+ continue;
+ return 0;
+}
+
+// Check varargs and va_copy.
+static bool
+test_varargs (const char *format, ...)
+{
+ va_list args;
+ va_start (args, format);
+ va_list args_copy;
+ va_copy (args_copy, args);
+
+ const char *str = "";
+ int number = 0;
+ float fnumber = 0;
+
+ while (*format)
+ {
+ switch (*format++)
+ {
+ case '\''s'\'': // string
+ str = va_arg (args_copy, const char *);
+ break;
+ case '\''d'\'': // int
+ number = va_arg (args_copy, int);
+ break;
+ case '\''f'\'': // float
+ fnumber = va_arg (args_copy, double);
+ break;
+ default:
+ break;
+ }
+ }
+ va_end (args_copy);
+ va_end (args);
+
+ return *str && number && fnumber;
+}
+'
+
+# Test code for whether the C compiler supports C99 (body of main).
+ac_c_conftest_c99_main='
+ // Check bool.
+ _Bool success = false;
+ success |= (argc != 0);
+
+ // Check restrict.
+ if (test_restrict ("String literal") == 0)
+ success = true;
+ char *restrict newvar = "Another string";
+
+ // Check varargs.
+ success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234);
+ test_varargs_macros ();
+
+ // Check flexible array members.
+ struct incomplete_array *ia =
+ malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
+ ia->datasize = 10;
+ for (int i = 0; i < ia->datasize; ++i)
+ ia->data[i] = i * 1.234;
+
+ // Check named initializers.
+ struct named_init ni = {
+ .number = 34,
+ .name = L"Test wide string",
+ .average = 543.34343,
+ };
+
+ ni.number = 58;
+
+ int dynamic_array[ni.number];
+ dynamic_array[0] = argv[0][0];
+ dynamic_array[ni.number - 1] = 543;
+
+ // work around unused variable warnings
+ ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\''
+ || dynamic_array[ni.number - 1] != 543);
+'
+
+# Test code for whether the C compiler supports C11 (global declarations)
+ac_c_conftest_c11_globals='
+// Does the compiler advertise C11 conformance?
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L
+# error "Compiler does not advertise C11 conformance"
+#endif
+
+// Check _Alignas.
+char _Alignas (double) aligned_as_double;
+char _Alignas (0) no_special_alignment;
+extern char aligned_as_int;
+char _Alignas (0) _Alignas (int) aligned_as_int;
+
+// Check _Alignof.
+enum
+{
+ int_alignment = _Alignof (int),
+ int_array_alignment = _Alignof (int[100]),
+ char_alignment = _Alignof (char)
+};
+_Static_assert (0 < -_Alignof (int), "_Alignof is signed");
+
+// Check _Noreturn.
+int _Noreturn does_not_return (void) { for (;;) continue; }
+
+// Check _Static_assert.
+struct test_static_assert
+{
+ int x;
+ _Static_assert (sizeof (int) <= sizeof (long int),
+ "_Static_assert does not work in struct");
+ long int y;
+};
+
+// Check UTF-8 literals.
+#define u8 syntax error!
+char const utf8_literal[] = u8"happens to be ASCII" "another string";
+
+// Check duplicate typedefs.
+typedef long *long_ptr;
+typedef long int *long_ptr;
+typedef long_ptr long_ptr;
+
+// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1.
+struct anonymous
+{
+ union {
+ struct { int i; int j; };
+ struct { int k; long int l; } w;
+ };
+ int m;
+} v1;
+'
+
+# Test code for whether the C compiler supports C11 (body of main).
+ac_c_conftest_c11_main='
+ _Static_assert ((offsetof (struct anonymous, i)
+ == offsetof (struct anonymous, w.k)),
+ "Anonymous union alignment botch");
+ v1.i = 2;
+ v1.w.k = 5;
+ ok |= v1.i != 5;
+'
+
+# Test code for whether the C compiler supports C11 (complete).
+ac_c_conftest_c11_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+${ac_c_conftest_c11_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ ${ac_c_conftest_c99_main}
+ ${ac_c_conftest_c11_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C99 (complete).
+ac_c_conftest_c99_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ ${ac_c_conftest_c99_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C89 (complete).
+ac_c_conftest_c89_program="${ac_c_conftest_c89_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ return ok;
+}
+"
+
+as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H"
+as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H"
+as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H"
+as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H"
+as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H"
+as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H"
+as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H"
+as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H"
+as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H"
+
+# Auxiliary files required by this configure script.
+ac_aux_files="config.guess config.sub ltmain.sh compile missing install-sh"
+
+# Locations in which to look for auxiliary files.
+ac_aux_dir_candidates="${srcdir}${PATH_SEPARATOR}${srcdir}/..${PATH_SEPARATOR}${srcdir}/../.."
+
+# Search for a directory containing all of the required auxiliary files,
+# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates.
+# If we don't find one directory that contains all the files we need,
+# we report the set of missing files from the *first* directory in
+# $ac_aux_dir_candidates and give up.
+ac_missing_aux_files=""
+ac_first_candidate=:
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in $ac_aux_dir_candidates
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ as_found=:
+
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5
+ ac_aux_dir_found=yes
+ ac_install_sh=
+ for ac_aux in $ac_aux_files
+ do
+ # As a special case, if "install-sh" is required, that requirement
+ # can be satisfied by any of "install-sh", "install.sh", or "shtool",
+ # and $ac_install_sh is set appropriately for whichever one is found.
+ if test x"$ac_aux" = x"install-sh"
+ then
+ if test -f "${as_dir}install-sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5
+ ac_install_sh="${as_dir}install-sh -c"
+ elif test -f "${as_dir}install.sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5
+ ac_install_sh="${as_dir}install.sh -c"
+ elif test -f "${as_dir}shtool"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5
+ ac_install_sh="${as_dir}shtool install -c"
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} install-sh"
+ else
+ break
+ fi
+ fi
+ else
+ if test -f "${as_dir}${ac_aux}"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}"
+ else
+ break
+ fi
+ fi
+ fi
+ done
+ if test "$ac_aux_dir_found" = yes; then
+ ac_aux_dir="$as_dir"
+ break
+ fi
+ ac_first_candidate=false
+
+ as_found=false
+done
+IFS=$as_save_IFS
+if $as_found
+then :
+
+else $as_nop
+ as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$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.
+if test -f "${ac_aux_dir}config.guess"; then
+ ac_config_guess="$SHELL ${ac_aux_dir}config.guess"
+fi
+if test -f "${ac_aux_dir}config.sub"; then
+ ac_config_sub="$SHELL ${ac_aux_dir}config.sub"
+fi
+if test -f "$ac_aux_dir/configure"; then
+ ac_configure="$SHELL ${ac_aux_dir}configure"
+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,)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ ac_cache_corrupted=:
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ eval $ac_var=\$ac_old_val
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
+printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
+printf "%s\n" "$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=`printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;}
+ as_fn_error $? "run \`${MAKE-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_config_headers="$ac_config_headers config.h"
+
+am__api_version='1.16'
+
+
+
+ # 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.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+printf %s "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if test ${ac_cv_path_install+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ # Account for fact that we put trailing slashes in our PATH walk.
+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 as_fn_executable_p "$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+y}; 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+printf "%s\n" "$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'
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+printf %s "checking whether build environment is sane... " >&6; }
+# 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 (
+ am_has_slept=no
+ for am_try in 1 2; do
+ echo "timestamp, slept: $am_has_slept" > conftest.file
+ 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
+ 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
+ if test "$2" = conftest.file || test $am_try -eq 2; then
+ break
+ fi
+ # Just in case.
+ sleep 1
+ am_has_slept=yes
+ done
+ 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+ ( sleep 1 ) &
+ am_sleep_pid=$!
+fi
+
+rm -f conftest.file
+
+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=`printf "%s\n" "$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
+ MISSING="\${SHELL} '$am_aux_dir/missing'"
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+ am_missing_run="$MISSING "
+else
+ am_missing_run=
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5
+printf "%s\n" "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh+set}" != 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_STRIP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+printf "%s\n" "$STRIP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_STRIP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+printf "%s\n" "$ac_ct_STRIP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_STRIP" = x; then
+ STRIP=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$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"
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p" >&5
+printf %s "checking for a race-free mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+ if test ${ac_cv_path_mkdir+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in mkdir gmkdir; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext" || continue
+ case `"$as_dir$ac_prog$ac_exec_ext" --version 2>&1` in #(
+ 'mkdir ('*'coreutils) '* | \
+ 'BusyBox '* | \
+ '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+y}; 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+printf "%s\n" "$MKDIR_P" >&6; }
+
+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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_AWK+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AWK="$ac_prog"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+printf "%s\n" "$AWK" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$AWK" && break
+done
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval test \${ac_cv_prog_make_${ac_make}_set+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ SET_MAKE=
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "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
+
+# Check whether --enable-silent-rules was given.
+if test ${enable_silent_rules+y}
+then :
+ enableval=$enable_silent_rules;
+fi
+
+case $enable_silent_rules in # (((
+ yes) AM_DEFAULT_VERBOSITY=0;;
+ no) AM_DEFAULT_VERBOSITY=1;;
+ *) AM_DEFAULT_VERBOSITY=1;;
+esac
+am_make=${MAKE-make}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+printf %s "checking whether $am_make supports nested variables... " >&6; }
+if test ${am_cv_make_support_nested_variables+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if printf "%s\n" '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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+printf "%s\n" "$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='\'
+
+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='liborcus'
+ VERSION='0.19.2'
+
+
+printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h
+
+
+printf "%s\n" "#define VERSION \"$VERSION\"" >>confdefs.h
+
+# 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"}
+
+# For better backward compatibility. To be removed once Automake 1.9.x
+# dies out for good. For more background, see:
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+mkdir_p='$(MKDIR_P)'
+
+# We need awk for the "check" target (and possibly the TAP driver). 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}'
+
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar pax cpio none'
+
+am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
+
+
+
+
+
+# Variables for tags utilities; see am/tags.am
+if test -z "$CTAGS"; then
+ CTAGS=ctags
+fi
+
+if test -z "$ETAGS"; then
+ ETAGS=etags
+fi
+
+if test -z "$CSCOPE"; then
+ CSCOPE=cscope
+fi
+
+
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes. So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+ cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present. This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message. This
+can help us improve future automake versions.
+
+END
+ if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+ echo 'Configuration will proceed anyway, since you have set the' >&2
+ echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+ echo >&2
+ else
+ cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <https://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+ as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5
+ fi
+fi
+
+# Check whether --enable-silent-rules was given.
+if test ${enable_silent_rules+y}
+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}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+printf %s "checking whether $am_make supports nested variables... " >&6; }
+if test ${am_cv_make_support_nested_variables+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if printf "%s\n" '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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+printf "%s\n" "$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_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
+
+
+
+
+
+
+
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5
+printf %s "checking whether ${MAKE-make} supports the include directive... " >&6; }
+cat > confinc.mk << 'END'
+am__doit:
+ @echo this is the am__doit target >confinc.out
+.PHONY: am__doit
+END
+am__include="#"
+am__quote=
+# BSD make does it like this.
+echo '.include "confinc.mk" # ignored' > confmf.BSD
+# Other make implementations (GNU, Solaris 10, AIX) do it like this.
+echo 'include confinc.mk # ignored' > confmf.GNU
+_am_result=no
+for s in GNU BSD; do
+ { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5
+ (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ case $?:`cat confinc.out 2>/dev/null` in #(
+ '0:this is the am__doit target') :
+ case $s in #(
+ BSD) :
+ am__include='.include' am__quote='"' ;; #(
+ *) :
+ am__include='include' am__quote='' ;;
+esac ;; #(
+ *) :
+ ;;
+esac
+ if test "$am__include" != "#"; then
+ _am_result="yes ($s style)"
+ break
+ fi
+done
+rm -f confinc.* confmf.*
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5
+printf "%s\n" "${_am_result}" >&6; }
+
+# Check whether --enable-dependency-tracking was given.
+if test ${enable_dependency_tracking+y}
+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=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 clang++
+ 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
+printf "%s\n" "$CXX" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "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 clang++
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CXX="$ac_prog"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
+printf "%s\n" "$ac_ct_CXX" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "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:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$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.
+printf "%s\n" "$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\""
+printf "%s\n" "$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
+ printf "%s\n" "$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 (void)
+{
+
+ ;
+ 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.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5
+printf %s "checking whether the C++ compiler works... " >&6; }
+ac_link_default=`printf "%s\n" "$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\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link_default") 2>&5
+ ac_status=$?
+ printf "%s\n" "$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+y} && 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 $as_nop
+ ac_file=''
+fi
+if test -z "$ac_file"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$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_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5
+printf %s "checking for C++ compiler default output file name... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+printf "%s\n" "$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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+printf %s "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\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ printf "%s\n" "$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_nop
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+printf "%s\n" "$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 (void)
+{
+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.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+printf %s "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\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ printf "%s\n" "$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\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ printf "%s\n" "$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
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot run C++ compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+printf "%s\n" "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+printf %s "checking for suffix of object files... " >&6; }
+if test ${ac_cv_objext+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ 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\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>&5
+ ac_status=$?
+ printf "%s\n" "$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_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+printf "%s\n" "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C++" >&5
+printf %s "checking whether the compiler supports GNU C++... " >&6; }
+if test ${ac_cv_cxx_compiler_gnu+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_compiler_gnu=yes
+else $as_nop
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
+printf "%s\n" "$ac_cv_cxx_compiler_gnu" >&6; }
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+if test $ac_compiler_gnu = yes; then
+ GXX=yes
+else
+ GXX=
+fi
+ac_test_CXXFLAGS=${CXXFLAGS+y}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
+printf %s "checking whether $CXX accepts -g... " >&6; }
+if test ${ac_cv_prog_cxx_g+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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 (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_prog_cxx_g=yes
+else $as_nop
+ CXXFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+
+else $as_nop
+ ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+ CXXFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ 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.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
+printf "%s\n" "$ac_cv_prog_cxx_g" >&6; }
+if test $ac_test_CXXFLAGS; 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_prog_cxx_stdcxx=no
+if test x$ac_prog_cxx_stdcxx = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5
+printf %s "checking for $CXX option to enable C++11 features... " >&6; }
+if test ${ac_cv_prog_cxx_11+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cxx_11=no
+ac_save_CXX=$CXX
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_cxx_conftest_cxx11_program
+_ACEOF
+for ac_arg in '' -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x -qlanglvl=extended0x -AA
+do
+ CXX="$ac_save_CXX $ac_arg"
+ if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_prog_cxx_cxx11=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cxx_cxx11" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CXX=$ac_save_CXX
+fi
+
+if test "x$ac_cv_prog_cxx_cxx11" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cxx_cxx11" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx11" >&5
+printf "%s\n" "$ac_cv_prog_cxx_cxx11" >&6; }
+ CXX="$CXX $ac_cv_prog_cxx_cxx11"
+fi
+ ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11
+ ac_prog_cxx_stdcxx=cxx11
+fi
+fi
+if test x$ac_prog_cxx_stdcxx = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5
+printf %s "checking for $CXX option to enable C++98 features... " >&6; }
+if test ${ac_cv_prog_cxx_98+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cxx_98=no
+ac_save_CXX=$CXX
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_cxx_conftest_cxx98_program
+_ACEOF
+for ac_arg in '' -std=gnu++98 -std=c++98 -qlanglvl=extended -AA
+do
+ CXX="$ac_save_CXX $ac_arg"
+ if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_prog_cxx_cxx98=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cxx_cxx98" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CXX=$ac_save_CXX
+fi
+
+if test "x$ac_cv_prog_cxx_cxx98" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cxx_cxx98" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx98" >&5
+printf "%s\n" "$ac_cv_prog_cxx_cxx98" >&6; }
+ CXX="$CXX $ac_cv_prog_cxx_cxx98"
+fi
+ ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98
+ ac_prog_cxx_stdcxx=cxx98
+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=
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+printf %s "checking dependency style of $depcc... " >&6; }
+if test ${am_cv_CXX_dependencies_compiler_type+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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 10 /bin/sh.
+ echo '/* dummy */' > 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
+printf "%s\n" "$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
+
+
+
+ ax_cxx_compile_alternatives="17 1z" ax_cxx_compile_cxx17_required=true
+ 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_success=no
+
+
+
+ if test x$ac_success = xno; then
+ for alternative in ${ax_cxx_compile_alternatives}; do
+ for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}"; do
+ cachevar=`printf "%s\n" "ax_cv_cxx_compile_cxx17_$switch" | $as_tr_sh`
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++17 features with $switch" >&5
+printf %s "checking whether $CXX supports C++17 features with $switch... " >&6; }
+if eval test \${$cachevar+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_save_CXX="$CXX"
+ CXX="$CXX $switch"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+// If the compiler admits that it is not ready for C++11, why torture it?
+// Hopefully, this will speed up the test.
+
+#ifndef __cplusplus
+
+#error "This is not a C++ compiler"
+
+#elif __cplusplus < 201103L
+
+#error "This is not a C++11 compiler"
+
+#else
+
+namespace cxx11
+{
+
+ namespace test_static_assert
+ {
+
+ template <typename T>
+ struct check
+ {
+ static_assert(sizeof(int) <= sizeof(T), "not big enough");
+ };
+
+ }
+
+ namespace test_final_override
+ {
+
+ struct Base
+ {
+ virtual ~Base() {}
+ virtual void f() {}
+ };
+
+ struct Derived : public Base
+ {
+ virtual ~Derived() override {}
+ virtual void f() override {}
+ };
+
+ }
+
+ namespace test_double_right_angle_brackets
+ {
+
+ template < typename T >
+ struct check {};
+
+ typedef check<void> single_type;
+ typedef check<check<void>> double_type;
+ typedef check<check<check<void>>> triple_type;
+ typedef check<check<check<check<void>>>> quadruple_type;
+
+ }
+
+ namespace test_decltype
+ {
+
+ int
+ f()
+ {
+ int a = 1;
+ decltype(a) b = 2;
+ return a + b;
+ }
+
+ }
+
+ namespace test_type_deduction
+ {
+
+ template < typename T1, typename T2 >
+ struct is_same
+ {
+ static const bool value = false;
+ };
+
+ template < typename T >
+ struct is_same<T, T>
+ {
+ static const bool value = true;
+ };
+
+ template < typename T1, typename T2 >
+ auto
+ add(T1 a1, T2 a2) -> decltype(a1 + a2)
+ {
+ return a1 + a2;
+ }
+
+ int
+ test(const int c, volatile int v)
+ {
+ static_assert(is_same<int, decltype(0)>::value == true, "");
+ static_assert(is_same<int, decltype(c)>::value == false, "");
+ static_assert(is_same<int, decltype(v)>::value == false, "");
+ auto ac = c;
+ auto av = v;
+ auto sumi = ac + av + 'x';
+ auto sumf = ac + av + 1.0;
+ static_assert(is_same<int, decltype(ac)>::value == true, "");
+ static_assert(is_same<int, decltype(av)>::value == true, "");
+ static_assert(is_same<int, decltype(sumi)>::value == true, "");
+ static_assert(is_same<int, decltype(sumf)>::value == false, "");
+ static_assert(is_same<int, decltype(add(c, v))>::value == true, "");
+ return (sumf > 0.0) ? sumi : add(c, v);
+ }
+
+ }
+
+ namespace test_noexcept
+ {
+
+ int f() { return 0; }
+ int g() noexcept { return 0; }
+
+ static_assert(noexcept(f()) == false, "");
+ static_assert(noexcept(g()) == true, "");
+
+ }
+
+ namespace test_constexpr
+ {
+
+ template < typename CharT >
+ unsigned long constexpr
+ strlen_c_r(const CharT *const s, const unsigned long acc) noexcept
+ {
+ return *s ? strlen_c_r(s + 1, acc + 1) : acc;
+ }
+
+ template < typename CharT >
+ unsigned long constexpr
+ strlen_c(const CharT *const s) noexcept
+ {
+ return strlen_c_r(s, 0UL);
+ }
+
+ static_assert(strlen_c("") == 0UL, "");
+ static_assert(strlen_c("1") == 1UL, "");
+ static_assert(strlen_c("example") == 7UL, "");
+ static_assert(strlen_c("another\0example") == 7UL, "");
+
+ }
+
+ namespace test_rvalue_references
+ {
+
+ template < int N >
+ struct answer
+ {
+ static constexpr int value = N;
+ };
+
+ answer<1> f(int&) { return answer<1>(); }
+ answer<2> f(const int&) { return answer<2>(); }
+ answer<3> f(int&&) { return answer<3>(); }
+
+ void
+ test()
+ {
+ int i = 0;
+ const int c = 0;
+ static_assert(decltype(f(i))::value == 1, "");
+ static_assert(decltype(f(c))::value == 2, "");
+ static_assert(decltype(f(0))::value == 3, "");
+ }
+
+ }
+
+ namespace test_uniform_initialization
+ {
+
+ struct test
+ {
+ static const int zero {};
+ static const int one {1};
+ };
+
+ static_assert(test::zero == 0, "");
+ static_assert(test::one == 1, "");
+
+ }
+
+ namespace test_lambdas
+ {
+
+ void
+ test1()
+ {
+ auto lambda1 = [](){};
+ auto lambda2 = lambda1;
+ lambda1();
+ lambda2();
+ }
+
+ int
+ test2()
+ {
+ auto a = [](int i, int j){ return i + j; }(1, 2);
+ auto b = []() -> int { return '0'; }();
+ auto c = [=](){ return a + b; }();
+ auto d = [&](){ return c; }();
+ auto e = [a, &b](int x) mutable {
+ const auto identity = [](int y){ return y; };
+ for (auto i = 0; i < a; ++i)
+ a += b--;
+ return x + identity(a + b);
+ }(0);
+ return a + b + c + d + e;
+ }
+
+ int
+ test3()
+ {
+ const auto nullary = [](){ return 0; };
+ const auto unary = [](int x){ return x; };
+ using nullary_t = decltype(nullary);
+ using unary_t = decltype(unary);
+ const auto higher1st = [](nullary_t f){ return f(); };
+ const auto higher2nd = [unary](nullary_t f1){
+ return [unary, f1](unary_t f2){ return f2(unary(f1())); };
+ };
+ return higher1st(nullary) + higher2nd(nullary)(unary);
+ }
+
+ }
+
+ namespace test_variadic_templates
+ {
+
+ template <int...>
+ struct sum;
+
+ template <int N0, int... N1toN>
+ struct sum<N0, N1toN...>
+ {
+ static constexpr auto value = N0 + sum<N1toN...>::value;
+ };
+
+ template <>
+ struct sum<>
+ {
+ static constexpr auto value = 0;
+ };
+
+ static_assert(sum<>::value == 0, "");
+ static_assert(sum<1>::value == 1, "");
+ static_assert(sum<23>::value == 23, "");
+ static_assert(sum<1, 2>::value == 3, "");
+ static_assert(sum<5, 5, 11>::value == 21, "");
+ static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, "");
+
+ }
+
+ // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae
+ // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function
+ // because of this.
+ namespace test_template_alias_sfinae
+ {
+
+ struct foo {};
+
+ template<typename T>
+ using member = typename T::member_type;
+
+ template<typename T>
+ void func(...) {}
+
+ template<typename T>
+ void func(member<T>*) {}
+
+ void test();
+
+ void test() { func<foo>(0); }
+
+ }
+
+} // namespace cxx11
+
+#endif // __cplusplus >= 201103L
+
+
+
+
+// If the compiler admits that it is not ready for C++14, why torture it?
+// Hopefully, this will speed up the test.
+
+#ifndef __cplusplus
+
+#error "This is not a C++ compiler"
+
+#elif __cplusplus < 201402L
+
+#error "This is not a C++14 compiler"
+
+#else
+
+namespace cxx14
+{
+
+ namespace test_polymorphic_lambdas
+ {
+
+ int
+ test()
+ {
+ const auto lambda = [](auto&&... args){
+ const auto istiny = [](auto x){
+ return (sizeof(x) == 1UL) ? 1 : 0;
+ };
+ const int aretiny[] = { istiny(args)... };
+ return aretiny[0];
+ };
+ return lambda(1, 1L, 1.0f, '1');
+ }
+
+ }
+
+ namespace test_binary_literals
+ {
+
+ constexpr auto ivii = 0b0000000000101010;
+ static_assert(ivii == 42, "wrong value");
+
+ }
+
+ namespace test_generalized_constexpr
+ {
+
+ template < typename CharT >
+ constexpr unsigned long
+ strlen_c(const CharT *const s) noexcept
+ {
+ auto length = 0UL;
+ for (auto p = s; *p; ++p)
+ ++length;
+ return length;
+ }
+
+ static_assert(strlen_c("") == 0UL, "");
+ static_assert(strlen_c("x") == 1UL, "");
+ static_assert(strlen_c("test") == 4UL, "");
+ static_assert(strlen_c("another\0test") == 7UL, "");
+
+ }
+
+ namespace test_lambda_init_capture
+ {
+
+ int
+ test()
+ {
+ auto x = 0;
+ const auto lambda1 = [a = x](int b){ return a + b; };
+ const auto lambda2 = [a = lambda1(x)](){ return a; };
+ return lambda2();
+ }
+
+ }
+
+ namespace test_digit_separators
+ {
+
+ constexpr auto ten_million = 100'000'000;
+ static_assert(ten_million == 100000000, "");
+
+ }
+
+ namespace test_return_type_deduction
+ {
+
+ auto f(int& x) { return x; }
+ decltype(auto) g(int& x) { return x; }
+
+ template < typename T1, typename T2 >
+ struct is_same
+ {
+ static constexpr auto value = false;
+ };
+
+ template < typename T >
+ struct is_same<T, T>
+ {
+ static constexpr auto value = true;
+ };
+
+ int
+ test()
+ {
+ auto x = 0;
+ static_assert(is_same<int, decltype(f(x))>::value, "");
+ static_assert(is_same<int&, decltype(g(x))>::value, "");
+ return x;
+ }
+
+ }
+
+} // namespace cxx14
+
+#endif // __cplusplus >= 201402L
+
+
+
+
+// If the compiler admits that it is not ready for C++17, why torture it?
+// Hopefully, this will speed up the test.
+
+#ifndef __cplusplus
+
+#error "This is not a C++ compiler"
+
+#elif __cplusplus < 201703L
+
+#error "This is not a C++17 compiler"
+
+#else
+
+#include <initializer_list>
+#include <utility>
+#include <type_traits>
+
+namespace cxx17
+{
+
+ namespace test_constexpr_lambdas
+ {
+
+ constexpr int foo = [](){return 42;}();
+
+ }
+
+ namespace test::nested_namespace::definitions
+ {
+
+ }
+
+ namespace test_fold_expression
+ {
+
+ template<typename... Args>
+ int multiply(Args... args)
+ {
+ return (args * ... * 1);
+ }
+
+ template<typename... Args>
+ bool all(Args... args)
+ {
+ return (args && ...);
+ }
+
+ }
+
+ namespace test_extended_static_assert
+ {
+
+ static_assert (true);
+
+ }
+
+ namespace test_auto_brace_init_list
+ {
+
+ auto foo = {5};
+ auto bar {5};
+
+ static_assert(std::is_same<std::initializer_list<int>, decltype(foo)>::value);
+ static_assert(std::is_same<int, decltype(bar)>::value);
+ }
+
+ namespace test_typename_in_template_template_parameter
+ {
+
+ template<template<typename> typename X> struct D;
+
+ }
+
+ namespace test_fallthrough_nodiscard_maybe_unused_attributes
+ {
+
+ int f1()
+ {
+ return 42;
+ }
+
+ [[nodiscard]] int f2()
+ {
+ [[maybe_unused]] auto unused = f1();
+
+ switch (f1())
+ {
+ case 17:
+ f1();
+ [[fallthrough]];
+ case 42:
+ f1();
+ }
+ return f1();
+ }
+
+ }
+
+ namespace test_extended_aggregate_initialization
+ {
+
+ struct base1
+ {
+ int b1, b2 = 42;
+ };
+
+ struct base2
+ {
+ base2() {
+ b3 = 42;
+ }
+ int b3;
+ };
+
+ struct derived : base1, base2
+ {
+ int d;
+ };
+
+ derived d1 {{1, 2}, {}, 4}; // full initialization
+ derived d2 {{}, {}, 4}; // value-initialized bases
+
+ }
+
+ namespace test_general_range_based_for_loop
+ {
+
+ struct iter
+ {
+ int i;
+
+ int& operator* ()
+ {
+ return i;
+ }
+
+ const int& operator* () const
+ {
+ return i;
+ }
+
+ iter& operator++()
+ {
+ ++i;
+ return *this;
+ }
+ };
+
+ struct sentinel
+ {
+ int i;
+ };
+
+ bool operator== (const iter& i, const sentinel& s)
+ {
+ return i.i == s.i;
+ }
+
+ bool operator!= (const iter& i, const sentinel& s)
+ {
+ return !(i == s);
+ }
+
+ struct range
+ {
+ iter begin() const
+ {
+ return {0};
+ }
+
+ sentinel end() const
+ {
+ return {5};
+ }
+ };
+
+ void f()
+ {
+ range r {};
+
+ for (auto i : r)
+ {
+ [[maybe_unused]] auto v = i;
+ }
+ }
+
+ }
+
+ namespace test_lambda_capture_asterisk_this_by_value
+ {
+
+ struct t
+ {
+ int i;
+ int foo()
+ {
+ return [*this]()
+ {
+ return i;
+ }();
+ }
+ };
+
+ }
+
+ namespace test_enum_class_construction
+ {
+
+ enum class byte : unsigned char
+ {};
+
+ byte foo {42};
+
+ }
+
+ namespace test_constexpr_if
+ {
+
+ template <bool cond>
+ int f ()
+ {
+ if constexpr(cond)
+ {
+ return 13;
+ }
+ else
+ {
+ return 42;
+ }
+ }
+
+ }
+
+ namespace test_selection_statement_with_initializer
+ {
+
+ int f()
+ {
+ return 13;
+ }
+
+ int f2()
+ {
+ if (auto i = f(); i > 0)
+ {
+ return 3;
+ }
+
+ switch (auto i = f(); i + 4)
+ {
+ case 17:
+ return 2;
+
+ default:
+ return 1;
+ }
+ }
+
+ }
+
+ namespace test_template_argument_deduction_for_class_templates
+ {
+
+ template <typename T1, typename T2>
+ struct pair
+ {
+ pair (T1 p1, T2 p2)
+ : m1 {p1},
+ m2 {p2}
+ {}
+
+ T1 m1;
+ T2 m2;
+ };
+
+ void f()
+ {
+ [[maybe_unused]] auto p = pair{13, 42u};
+ }
+
+ }
+
+ namespace test_non_type_auto_template_parameters
+ {
+
+ template <auto n>
+ struct B
+ {};
+
+ B<5> b1;
+ B<'a'> b2;
+
+ }
+
+ namespace test_structured_bindings
+ {
+
+ int arr[2] = { 1, 2 };
+ std::pair<int, int> pr = { 1, 2 };
+
+ auto f1() -> int(&)[2]
+ {
+ return arr;
+ }
+
+ auto f2() -> std::pair<int, int>&
+ {
+ return pr;
+ }
+
+ struct S
+ {
+ int x1 : 2;
+ volatile double y1;
+ };
+
+ S f3()
+ {
+ return {};
+ }
+
+ auto [ x1, y1 ] = f1();
+ auto& [ xr1, yr1 ] = f1();
+ auto [ x2, y2 ] = f2();
+ auto& [ xr2, yr2 ] = f2();
+ const auto [ x3, y3 ] = f3();
+
+ }
+
+ namespace test_exception_spec_type_system
+ {
+
+ struct Good {};
+ struct Bad {};
+
+ void g1() noexcept;
+ void g2();
+
+ template<typename T>
+ Bad
+ f(T*, T*);
+
+ template<typename T1, typename T2>
+ Good
+ f(T1*, T2*);
+
+ static_assert (std::is_same_v<Good, decltype(f(g1, g2))>);
+
+ }
+
+ namespace test_inline_variables
+ {
+
+ template<class T> void f(T)
+ {}
+
+ template<class T> inline T g(T)
+ {
+ return T{};
+ }
+
+ template<> inline void f<>(int)
+ {}
+
+ template<> int g<>(int)
+ {
+ return 5;
+ }
+
+ }
+
+} // namespace cxx17
+
+#endif // __cplusplus < 201703L
+
+
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ eval $cachevar=yes
+else $as_nop
+ eval $cachevar=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CXX="$ac_save_CXX"
+fi
+eval ac_res=\$$cachevar
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ if eval test x\$$cachevar = xyes; then
+ CXX="$CXX $switch"
+ if test -n "$CXXCPP" ; then
+ CXXCPP="$CXXCPP $switch"
+ fi
+ ac_success=yes
+ break
+ fi
+ done
+ if test x$ac_success = xyes; then
+ break
+ fi
+ done
+ 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
+
+ if test x$ax_cxx_compile_cxx17_required = xtrue; then
+ if test x$ac_success = xno; then
+ as_fn_error $? "*** A compiler with support for C++17 language features is required." "$LINENO" 5
+ fi
+ fi
+ if test x$ac_success = xno; then
+ HAVE_CXX17=0
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: No compiler with C++17 support was found" >&5
+printf "%s\n" "$as_me: No compiler with C++17 support was found" >&6;}
+ else
+ HAVE_CXX17=1
+
+printf "%s\n" "#define HAVE_CXX17 1" >>confdefs.h
+
+ fi
+
+
+CXXFLAGS="-fvisibility=hidden $CXXFLAGS -Wall -pthread -Wshadow"
+
+# ===========================
+# Find required base packages
+# ===========================
+
+
+
+
+
+
+
+
+
+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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$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"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "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:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+fi
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args.
+set dummy ${ac_tool_prefix}clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}clang"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "clang", so it can be a program name with args.
+set dummy clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="clang"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$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
+
+fi
+
+
+test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$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.
+printf "%s\n" "$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 -version; 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\""
+printf "%s\n" "$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
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5
+printf %s "checking whether the compiler supports GNU C... " >&6; }
+if test ${ac_cv_c_compiler_gnu+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_compiler_gnu=yes
+else $as_nop
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; }
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+if test $ac_compiler_gnu = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+y}
+ac_save_CFLAGS=$CFLAGS
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+printf %s "checking whether $CC accepts -g... " >&6; }
+if test ${ac_cv_prog_cc_g+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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 (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_g=yes
+else $as_nop
+ CFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+else $as_nop
+ ac_c_werror_flag=$ac_save_c_werror_flag
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ 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.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+printf "%s\n" "$ac_cv_prog_cc_g" >&6; }
+if test $ac_test_CFLAGS; 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
+ac_prog_cc_stdc=no
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5
+printf %s "checking for $CC option to enable C11 features... " >&6; }
+if test ${ac_cv_prog_cc_c11+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c11=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c11_program
+_ACEOF
+for ac_arg in '' -std=gnu11
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c11=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c11" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
+
+if test "x$ac_cv_prog_cc_c11" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c11" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5
+printf "%s\n" "$ac_cv_prog_cc_c11" >&6; }
+ CC="$CC $ac_cv_prog_cc_c11"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11
+ ac_prog_cc_stdc=c11
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5
+printf %s "checking for $CC option to enable C99 features... " >&6; }
+if test ${ac_cv_prog_cc_c99+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c99=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c99_program
+_ACEOF
+for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99=
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c99=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c99" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
+
+if test "x$ac_cv_prog_cc_c99" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c99" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
+printf "%s\n" "$ac_cv_prog_cc_c99" >&6; }
+ CC="$CC $ac_cv_prog_cc_c99"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99
+ ac_prog_cc_stdc=c99
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5
+printf %s "checking for $CC option to enable C89 features... " >&6; }
+if test ${ac_cv_prog_cc_c89+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c89_program
+_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 conftest.beam
+ test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
+
+if test "x$ac_cv_prog_cc_c89" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c89" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+printf "%s\n" "$ac_cv_prog_cc_c89" >&6; }
+ CC="$CC $ac_cv_prog_cc_c89"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89
+ ac_prog_cc_stdc=c89
+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
+
+
+ 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+printf %s "checking whether $CC understands -c and -o together... " >&6; }
+if test ${am_cv_prog_cc_c_o+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ # Make sure it works both with $CC and with simple cc.
+ # Following AC_PROG_CC_C_O, we do the test twice because some
+ # compilers refuse to overwrite an existing .o file with -o,
+ # though they will create one.
+ am_cv_prog_cc_c_o=yes
+ for am_i in 1 2; do
+ if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
+ ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } \
+ && test -f conftest2.$ac_objext; then
+ : OK
+ else
+ am_cv_prog_cc_c_o=no
+ break
+ fi
+ done
+ rm -f core conftest*
+ unset am_i
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+printf "%s\n" "$am_cv_prog_cc_c_o" >&6; }
+if test "$am_cv_prog_cc_c_o" != yes; then
+ # Losing compiler, so override with the script.
+ # FIXME: It is wrong to rewrite CC.
+ # But if we don't then we get into trouble of one sort or another.
+ # A longer-term fix would be to have automake use am__CC in this case,
+ # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+ CC="$am_aux_dir/compile $CC"
+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="$CC" am_compiler_list=
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+printf %s "checking dependency style of $depcc... " >&6; }
+if test ${am_cv_CC_dependencies_compiler_type+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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 10 /bin/sh.
+ echo '/* dummy */' > 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+printf "%s\n" "$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
+
+
+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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+printf %s "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 test ${ac_cv_prog_CPP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # Double quotes because $CC needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" 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.
+ # 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. */
+#include <limits.h>
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"
+then :
+
+else $as_nop
+ # 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 $as_nop
+ # 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+printf "%s\n" "$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.
+ # 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. */
+#include <limits.h>
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"
+then :
+
+else $as_nop
+ # 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 $as_nop
+ # 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_nop
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$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=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 clang++
+ 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
+printf "%s\n" "$CXX" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "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 clang++
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CXX="$ac_prog"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
+printf "%s\n" "$ac_ct_CXX" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "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:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$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.
+printf "%s\n" "$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\""
+printf "%s\n" "$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
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C++" >&5
+printf %s "checking whether the compiler supports GNU C++... " >&6; }
+if test ${ac_cv_cxx_compiler_gnu+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_compiler_gnu=yes
+else $as_nop
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
+printf "%s\n" "$ac_cv_cxx_compiler_gnu" >&6; }
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+if test $ac_compiler_gnu = yes; then
+ GXX=yes
+else
+ GXX=
+fi
+ac_test_CXXFLAGS=${CXXFLAGS+y}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
+printf %s "checking whether $CXX accepts -g... " >&6; }
+if test ${ac_cv_prog_cxx_g+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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 (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_prog_cxx_g=yes
+else $as_nop
+ CXXFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+
+else $as_nop
+ ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+ CXXFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ 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.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
+printf "%s\n" "$ac_cv_prog_cxx_g" >&6; }
+if test $ac_test_CXXFLAGS; 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_prog_cxx_stdcxx=no
+if test x$ac_prog_cxx_stdcxx = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5
+printf %s "checking for $CXX option to enable C++11 features... " >&6; }
+if test ${ac_cv_prog_cxx_11+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cxx_11=no
+ac_save_CXX=$CXX
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_cxx_conftest_cxx11_program
+_ACEOF
+for ac_arg in '' -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x -qlanglvl=extended0x -AA
+do
+ CXX="$ac_save_CXX $ac_arg"
+ if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_prog_cxx_cxx11=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cxx_cxx11" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CXX=$ac_save_CXX
+fi
+
+if test "x$ac_cv_prog_cxx_cxx11" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cxx_cxx11" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx11" >&5
+printf "%s\n" "$ac_cv_prog_cxx_cxx11" >&6; }
+ CXX="$CXX $ac_cv_prog_cxx_cxx11"
+fi
+ ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11
+ ac_prog_cxx_stdcxx=cxx11
+fi
+fi
+if test x$ac_prog_cxx_stdcxx = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5
+printf %s "checking for $CXX option to enable C++98 features... " >&6; }
+if test ${ac_cv_prog_cxx_98+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cxx_98=no
+ac_save_CXX=$CXX
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_cxx_conftest_cxx98_program
+_ACEOF
+for ac_arg in '' -std=gnu++98 -std=c++98 -qlanglvl=extended -AA
+do
+ CXX="$ac_save_CXX $ac_arg"
+ if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_prog_cxx_cxx98=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cxx_cxx98" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CXX=$ac_save_CXX
+fi
+
+if test "x$ac_cv_prog_cxx_cxx98" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cxx_cxx98" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx98" >&5
+printf "%s\n" "$ac_cv_prog_cxx_cxx98" >&6; }
+ CXX="$CXX $ac_cv_prog_cxx_cxx98"
+fi
+ ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98
+ ac_prog_cxx_stdcxx=cxx98
+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=
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+printf %s "checking dependency style of $depcc... " >&6; }
+if test ${am_cv_CXX_dependencies_compiler_type+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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 10 /bin/sh.
+ echo '/* dummy */' > 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
+printf "%s\n" "$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
+
+
+case `pwd` in
+ *\ * | *\ *)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
+printf "%s\n" "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
+esac
+
+
+
+macro_version='2.4.6'
+macro_revision='2.4.6'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ltmain=$ac_aux_dir/ltmain.sh
+
+
+
+ # 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
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+printf %s "checking build system type... " >&6; }
+if test ${ac_cv_build+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+printf "%s\n" "$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
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+printf %s "checking host system type... " >&6; }
+if test ${ac_cv_host+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+printf "%s\n" "$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
+
+
+# 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
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
+printf %s "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*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: printf" >&5
+printf "%s\n" "printf" >&6; } ;;
+ print*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
+printf "%s\n" "print -r" >&6; } ;;
+ *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cat" >&5
+printf "%s\n" "cat" >&6; } ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+printf %s "checking for a sed that does not truncate output... " >&6; }
+if test ${ac_cv_path_SED+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ 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"
+ as_fn_executable_p "$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
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" '' >> "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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+printf "%s\n" "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+ rm -f conftest.sed
+
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+
+
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+printf %s "checking for grep that handles long lines and -e... " >&6; }
+if test ${ac_cv_path_GREP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ 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"
+ as_fn_executable_p "$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
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" '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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+printf "%s\n" "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+printf %s "checking for egrep... " >&6; }
+if test ${ac_cv_path_EGREP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ 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"
+ as_fn_executable_p "$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
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" '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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+printf "%s\n" "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
+printf %s "checking for fgrep... " >&6; }
+if test ${ac_cv_path_FGREP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ 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"
+ as_fn_executable_p "$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
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" '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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
+printf "%s\n" "$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+y}
+then :
+ withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
+else $as_nop
+ with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test yes = "$GCC"; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+printf %s "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 yes = "$with_gnu_ld"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+printf %s "checking for GNU ld... " >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+printf %s "checking for non-GNU ld... " >&6; }
+fi
+if test ${lt_cv_path_LD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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 no != "$with_gnu_ld" && break
+ ;;
+ *)
+ test yes != "$with_gnu_ld" && 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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+printf "%s\n" "$LD" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+printf %s "checking if the linker ($LD) is GNU ld... " >&6; }
+if test ${lt_cv_prog_gnu_ld+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
+printf %s "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
+if test ${lt_cv_path_NM+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
+ case $build_os in
+ mingw*) lt_bad_file=conftest.nm/nofile ;;
+ *) lt_bad_file=/dev/null ;;
+ esac
+ case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in
+ *$lt_bad_file* | *'Invalid file or object type'*)
+ lt_cv_path_NM="$tmp_nm -B"
+ break 2
+ ;;
+ *)
+ case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+ */dev/null*)
+ lt_cv_path_NM="$tmp_nm -p"
+ break 2
+ ;;
+ *)
+ 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
+printf "%s\n" "$lt_cv_path_NM" >&6; }
+if test no != "$lt_cv_path_NM"; 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_DUMPBIN+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
+printf "%s\n" "$DUMPBIN" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_DUMPBIN+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
+printf "%s\n" "$ac_ct_DUMPBIN" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "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:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$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 -headers /dev/null 2>&1 | sed '1q'` in
+ *COFF*)
+ DUMPBIN="$DUMPBIN -symbols -headers"
+ ;;
+ *)
+ DUMPBIN=:
+ ;;
+ esac
+ fi
+
+ if test : != "$DUMPBIN"; then
+ NM=$DUMPBIN
+ fi
+fi
+test -z "$NM" && NM=nm
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
+printf %s "checking the name lister ($NM) interface... " >&6; }
+if test ${lt_cv_nm_interface+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
+printf "%s\n" "$lt_cv_nm_interface" >&6; }
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
+printf %s "checking whether ln -s works... " >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
+printf "%s\n" "no, using $LN_S" >&6; }
+fi
+
+# find the maximum length of command line arguments
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
+printf %s "checking the maximum length of command line arguments... " >&6; }
+if test ${lt_cv_sys_max_cmd_len+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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;
+ ;;
+
+ bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*)
+ # 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" && \
+ test undefined != "$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 17 != "$i" # 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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
+printf "%s\n" "$lt_cv_sys_max_cmd_len" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5
+printf "%s\n" "none" >&6; }
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+
+
+
+
+
+: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+
+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
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5
+printf %s "checking how to convert $build file names to $host format... " >&6; }
+if test ${lt_cv_to_host_file_cmd+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5
+printf "%s\n" "$lt_cv_to_host_file_cmd" >&6; }
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5
+printf %s "checking how to convert $build file names to toolchain format... " >&6; }
+if test ${lt_cv_to_tool_file_cmd+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ #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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5
+printf "%s\n" "$lt_cv_to_tool_file_cmd" >&6; }
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
+printf %s "checking for $LD option to reload object files... " >&6; }
+if test ${lt_cv_ld_reload_flag+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_ld_reload_flag='-r'
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
+printf "%s\n" "$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 yes != "$GCC"; then
+ reload_cmds=false
+ fi
+ ;;
+ darwin*)
+ if test yes = "$GCC"; 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_OBJDUMP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
+printf "%s\n" "$OBJDUMP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_OBJDUMP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OBJDUMP="objdump"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
+printf "%s\n" "$ac_ct_OBJDUMP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_OBJDUMP" = x; then
+ OBJDUMP="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$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
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
+printf %s "checking how to recognize dependent libraries... " >&6; }
+if test ${lt_cv_deplibs_check_method+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+# that 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.
+ if ( 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
+ ;;
+
+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 | gnu*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+netbsd* | netbsdelf*-gnu)
+ 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* | bitrig*)
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; 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
+ ;;
+os2*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
+printf "%s\n" "$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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_DLLTOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
+printf "%s\n" "$DLLTOOL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_DLLTOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_DLLTOOL="dlltool"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
+printf "%s\n" "$ac_ct_DLLTOOL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_DLLTOOL" = x; then
+ DLLTOOL="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$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
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5
+printf %s "checking how to associate runtime and link libraries... " >&6; }
+if test ${lt_cv_sharedlib_from_linklib_cmd+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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 one 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5
+printf "%s\n" "$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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_AR+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+printf "%s\n" "$AR" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_AR+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_AR="$ac_prog"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+printf "%s\n" "$ac_ct_AR" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "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:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$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=cr}
+
+
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5
+printf %s "checking for archiver @FILE support... " >&6; }
+if test ${lt_cv_ar_at_file+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_ar_at_file=no
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_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=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if test 0 -eq "$ac_status"; 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=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if test 0 -ne "$ac_status"; then
+ lt_cv_ar_at_file=@
+ fi
+ fi
+ rm -f conftest.* libconftest.a
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
+printf "%s\n" "$lt_cv_ar_at_file" >&6; }
+
+if test no = "$lt_cv_ar_at_file"; 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_STRIP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+printf "%s\n" "$STRIP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_STRIP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+printf "%s\n" "$ac_ct_STRIP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_STRIP" = x; then
+ STRIP=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_RANLIB+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+printf "%s\n" "$RANLIB" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_RANLIB+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_RANLIB="ranlib"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+printf "%s\n" "$ac_ct_RANLIB" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_RANLIB" = x; then
+ RANLIB=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$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
+ bitrig* | 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.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
+printf %s "checking command to parse $NM output from $compiler object... " >&6; }
+if test ${lt_cv_sys_global_symbol_pipe+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+# 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 ia64 = "$host_cpu"; 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
+
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+ # Gets list of data symbols to import.
+ lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'"
+ # Adjust the below global symbol transforms to fixup imported variables.
+ lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
+ lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'"
+ lt_c_name_lib_hook="\
+ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\
+ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'"
+else
+ # Disable hooks by default.
+ lt_cv_sys_global_symbol_to_import=
+ lt_cdecl_hook=
+ lt_c_name_hook=
+ lt_c_name_lib_hook=
+fi
+
+# 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"\
+$lt_cdecl_hook\
+" -e 's/^T .* \(.*\)$/extern int \1();/p'"\
+" -e 's/^$symcode$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"\
+$lt_c_name_hook\
+" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'"
+
+# Transform an extracted symbol line into symbol name with lib prefix and
+# symbol address.
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\
+$lt_c_name_lib_hook\
+" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/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,
+ # D for any global variable and I for any imported 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};"\
+" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\
+" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\
+" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\
+" \$ 0!~/External *\|/{next};"\
+" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+" {if(hide[section]) next};"\
+" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\
+" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\
+" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\
+" s[1]~prfx {split(s[1],t,\"@\"); print f,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=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ # Now try to grab the symbols.
+ nlist=conftest.nm
+ $ECHO "$as_me:$LINENO: $NM conftest.$ac_objext | $lt_cv_sys_global_symbol_pipe > $nlist" >&5
+ if eval "$NM" conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist 2>&5 && 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 can'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* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$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=$?
+ printf "%s\n" "$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 yes = "$pipe_works"; 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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: failed" >&5
+printf "%s\n" "failed" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ok" >&5
+printf "%s\n" "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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
+printf %s "checking for sysroot... " >&6; }
+
+# Check whether --with-sysroot was given.
+if test ${with_sysroot+y}
+then :
+ withval=$with_sysroot;
+else $as_nop
+ with_sysroot=no
+fi
+
+
+lt_sysroot=
+case $with_sysroot in #(
+ yes)
+ if test yes = "$GCC"; then
+ lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+ fi
+ ;; #(
+ /*)
+ lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+ ;; #(
+ no|'')
+ ;; #(
+ *)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5
+printf "%s\n" "$with_sysroot" >&6; }
+ as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
+ ;;
+esac
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5
+printf "%s\n" "${lt_sysroot:-no}" >&6; }
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5
+printf %s "checking for a working dd... " >&6; }
+if test ${ac_cv_path_lt_DD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+: ${lt_DD:=$DD}
+if test -z "$lt_DD"; then
+ ac_path_lt_DD_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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in dd
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_lt_DD="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_lt_DD" || continue
+if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+ cmp -s conftest.i conftest.out \
+ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=:
+fi
+ $ac_path_lt_DD_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_lt_DD"; then
+ :
+ fi
+else
+ ac_cv_path_lt_DD=$lt_DD
+fi
+
+rm -f conftest.i conftest2.i conftest.out
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5
+printf "%s\n" "$ac_cv_path_lt_DD" >&6; }
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5
+printf %s "checking how to truncate binary pipes... " >&6; }
+if test ${lt_cv_truncate_bin+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+lt_cv_truncate_bin=
+if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+ cmp -s conftest.i conftest.out \
+ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1"
+fi
+rm -f conftest.i conftest2.i conftest.out
+test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5
+printf "%s\n" "$lt_cv_truncate_bin" >&6; }
+
+
+
+
+
+
+
+# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+ for cc_temp in $*""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+ done
+ func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+
+# Check whether --enable-libtool-lock was given.
+if test ${enable_libtool_lock+y}
+then :
+ enableval=$enable_libtool_lock;
+fi
+
+test no = "$enable_libtool_lock" || 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 what ABI is being produced by ac_compile, and set mode
+ # options accordingly.
+ echo 'int i;' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$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 what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
+ 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=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ if test yes = "$lt_cv_prog_gnu_ld"; 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*
+ ;;
+
+mips64*-*linux*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
+ 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=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ emul=elf
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ emul="${emul}32"
+ ;;
+ *64-bit*)
+ emul="${emul}64"
+ ;;
+ esac
+ case `/usr/bin/file conftest.$ac_objext` in
+ *MSB*)
+ emul="${emul}btsmip"
+ ;;
+ *LSB*)
+ emul="${emul}ltsmip"
+ ;;
+ esac
+ case `/usr/bin/file conftest.$ac_objext` in
+ *N32*)
+ emul="${emul}n32"
+ ;;
+ esac
+ LD="${LD-ld} -m $emul"
+ fi
+ rm -rf conftest*
+ ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly. Note that the listed cases only cover the
+ # situations where additional linker options are needed (such as when
+ # doing 32-bit compilation for a host where ld defaults to 64-bit, or
+ # vice versa); the common cases where no linker options are needed do
+ # not appear in the list.
+ echo 'int i;' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$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*)
+ case `/usr/bin/file conftest.o` in
+ *x86-64*)
+ LD="${LD-ld} -m elf32_x86_64"
+ ;;
+ *)
+ LD="${LD-ld} -m elf_i386"
+ ;;
+ esac
+ ;;
+ powerpc64le-*linux*)
+ LD="${LD-ld} -m elf32lppclinux"
+ ;;
+ 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"
+ ;;
+ powerpcle-*linux*)
+ LD="${LD-ld} -m elf64lppc"
+ ;;
+ 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"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
+printf %s "checking whether the C compiler needs -belf... " >&6; }
+if test ${lt_cv_cc_needs_belf+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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 (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ lt_cv_cc_needs_belf=yes
+else $as_nop
+ lt_cv_cc_needs_belf=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
+printf "%s\n" "$lt_cv_cc_needs_belf" >&6; }
+ if test yes != "$lt_cv_cc_needs_belf"; then
+ # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+ CFLAGS=$SAVE_CFLAGS
+ fi
+ ;;
+*-*solaris*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
+ echo 'int i;' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$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*|x86_64-*-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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_MANIFEST_TOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5
+printf "%s\n" "$MANIFEST_TOOL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_MANIFEST_TOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_MANIFEST_TOOL="mt"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5
+printf "%s\n" "$ac_ct_MANIFEST_TOOL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_MANIFEST_TOOL" = x; then
+ MANIFEST_TOOL=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5
+printf %s "checking if $MANIFEST_TOOL is a manifest tool... " >&6; }
+if test ${lt_cv_path_mainfest_tool+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
+printf "%s\n" "$lt_cv_path_mainfest_tool" >&6; }
+if test yes != "$lt_cv_path_mainfest_tool"; 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_DSYMUTIL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
+printf "%s\n" "$DSYMUTIL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_DSYMUTIL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
+printf "%s\n" "$ac_ct_DSYMUTIL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_DSYMUTIL" = x; then
+ DSYMUTIL=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_NMEDIT+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
+printf "%s\n" "$NMEDIT" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_NMEDIT+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_NMEDIT="nmedit"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
+printf "%s\n" "$ac_ct_NMEDIT" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_NMEDIT" = x; then
+ NMEDIT=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_LIPO+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
+printf "%s\n" "$LIPO" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_LIPO+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_LIPO="lipo"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
+printf "%s\n" "$ac_ct_LIPO" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_LIPO" = x; then
+ LIPO=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_OTOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
+printf "%s\n" "$OTOOL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_OTOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OTOOL="otool"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
+printf "%s\n" "$ac_ct_OTOOL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_OTOOL" = x; then
+ OTOOL=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_OTOOL64+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
+printf "%s\n" "$OTOOL64" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_OTOOL64+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OTOOL64="otool64"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
+printf "%s\n" "$ac_ct_OTOOL64" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_OTOOL64" = x; then
+ OTOOL64=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
+printf %s "checking for -single_module linker flag... " >&6; }
+if test ${lt_cv_apple_cc_single_mod+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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 0 = "$_lt_result"; then
+ lt_cv_apple_cc_single_mod=yes
+ else
+ cat conftest.err >&5
+ fi
+ rm -rf libconftest.dylib*
+ rm -f conftest.*
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
+printf "%s\n" "$lt_cv_apple_cc_single_mod" >&6; }
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
+printf %s "checking for -exported_symbols_list linker flag... " >&6; }
+if test ${lt_cv_ld_exported_symbols_list+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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 (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ lt_cv_ld_exported_symbols_list=yes
+else $as_nop
+ lt_cv_ld_exported_symbols_list=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS=$save_LDFLAGS
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
+printf "%s\n" "$lt_cv_ld_exported_symbols_list" >&6; }
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
+printf %s "checking for -force_load linker flag... " >&6; }
+if test ${lt_cv_ld_force_load+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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 cr libconftest.a conftest.o" >&5
+ $AR cr 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 0 = "$_lt_result" && $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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
+printf "%s\n" "$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[912]*)
+ _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+ 10.[012][,.]*)
+ _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+ 10.*|11.*)
+ _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+ esac
+ ;;
+ esac
+ if test yes = "$lt_cv_apple_cc_single_mod"; then
+ _lt_dar_single_mod='$single_module'
+ fi
+ if test yes = "$lt_cv_ld_exported_symbols_list"; 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 no = "$lt_cv_ld_force_load"; then
+ _lt_dsymutil='~$DSYMUTIL $lib || :'
+ else
+ _lt_dsymutil=
+ fi
+ ;;
+ esac
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+# string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+# string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+# string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+# "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+# VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+ case x$2 in
+ x)
+ ;;
+ *:)
+ eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
+ ;;
+ x:*)
+ eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
+ ;;
+ *::*)
+ eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+ eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
+ ;;
+ *)
+ eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
+ ;;
+ esac
+}
+
+ac_header= ac_cache=
+for ac_item in $ac_header_c_list
+do
+ if test $ac_cache; then
+ ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default"
+ if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then
+ printf "%s\n" "#define $ac_item 1" >> confdefs.h
+ fi
+ ac_header= ac_cache=
+ elif test $ac_header; then
+ ac_cache=$ac_item
+ else
+ ac_header=$ac_item
+ fi
+done
+
+
+
+
+
+
+
+
+if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes
+then :
+
+printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+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 :
+ printf "%s\n" "#define HAVE_DLFCN_H 1" >>confdefs.h
+
+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
+
+
+
+
+
+# Set options
+enable_win32_dll=yes
+
+case $host in
+*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args.
+set dummy ${ac_tool_prefix}as; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_AS+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$AS"; then
+ ac_cv_prog_AS="$AS" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AS="${ac_tool_prefix}as"
+ printf "%s\n" "$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
+AS=$ac_cv_prog_AS
+if test -n "$AS"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AS" >&5
+printf "%s\n" "$AS" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_AS"; then
+ ac_ct_AS=$AS
+ # Extract the first word of "as", so it can be a program name with args.
+set dummy as; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_AS+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_AS"; then
+ ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_AS="as"
+ printf "%s\n" "$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_AS=$ac_cv_prog_ac_ct_AS
+if test -n "$ac_ct_AS"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5
+printf "%s\n" "$ac_ct_AS" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_AS" = x; then
+ AS="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ AS=$ac_ct_AS
+ fi
+else
+ AS="$ac_cv_prog_AS"
+fi
+
+ 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_DLLTOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
+printf "%s\n" "$DLLTOOL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_DLLTOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_DLLTOOL="dlltool"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
+printf "%s\n" "$ac_ct_DLLTOOL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_DLLTOOL" = x; then
+ DLLTOOL="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$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
+
+ 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_OBJDUMP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
+printf "%s\n" "$OBJDUMP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_OBJDUMP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OBJDUMP="objdump"
+ printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
+printf "%s\n" "$ac_ct_OBJDUMP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_OBJDUMP" = x; then
+ OBJDUMP="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$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
+
+ ;;
+esac
+
+test -z "$AS" && AS=as
+
+
+
+
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+
+
+
+
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+
+
+
+
+# Check whether --enable-static was given.
+if test ${enable_static+y}
+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 $as_nop
+ enable_static=no
+fi
+
+
+
+
+
+
+
+
+# Check whether --with-pic was given.
+if test ${with_pic+y}
+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 $as_nop
+ pic_mode=yes
+fi
+
+
+
+
+
+
+
+
+
+ enable_dlopen=no
+
+
+
+ # Check whether --enable-shared was given.
+if test ${enable_shared+y}
+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 $as_nop
+ enable_shared=yes
+fi
+
+
+
+
+
+
+
+
+
+
+
+ # Check whether --enable-fast-install was given.
+if test ${enable_fast_install+y}
+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 $as_nop
+ enable_fast_install=yes
+fi
+
+
+
+
+
+
+
+
+ shared_archive_member_spec=
+case $host,$enable_shared in
+power*-*-aix[5-9]*,yes)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5
+printf %s "checking which variant of shared library versioning to provide... " >&6; }
+
+# Check whether --with-aix-soname was given.
+if test ${with_aix_soname+y}
+then :
+ withval=$with_aix_soname; case $withval in
+ aix|svr4|both)
+ ;;
+ *)
+ as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5
+ ;;
+ esac
+ lt_cv_with_aix_soname=$with_aix_soname
+else $as_nop
+ if test ${lt_cv_with_aix_soname+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_with_aix_soname=aix
+fi
+
+ with_aix_soname=$lt_cv_with_aix_soname
+fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5
+printf "%s\n" "$with_aix_soname" >&6; }
+ if test aix != "$with_aix_soname"; then
+ # For the AIX way of multilib, we name the shared archive member
+ # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',
+ # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File.
+ # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag,
+ # the AIX toolchain works better with OBJECT_MODE set (default 32).
+ if test 64 = "${OBJECT_MODE-32}"; then
+ shared_archive_member_spec=shr_64
+ else
+ shared_archive_member_spec=shr
+ fi
+ fi
+ ;;
+*)
+ with_aix_soname=aix
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+
+# 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
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
+printf %s "checking for objdir... " >&6; }
+if test ${lt_cv_objdir+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
+printf "%s\n" "$lt_cv_objdir" >&6; }
+objdir=$lt_cv_objdir
+
+
+
+
+
+printf "%s\n" "#define LT_OBJDIR \"$lt_cv_objdir/\"" >>confdefs.h
+
+
+
+
+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 set != "${COLLECT_NAMES+set}"; 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
+
+func_cc_basename $compiler
+cc_basename=$func_cc_basename_result
+
+
+# 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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
+printf %s "checking for ${ac_tool_prefix}file... " >&6; }
+if test ${lt_cv_path_MAGIC_CMD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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@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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+printf "%s\n" "$MAGIC_CMD" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+
+
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+ if test -n "$ac_tool_prefix"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for file" >&5
+printf %s "checking for file... " >&6; }
+if test ${lt_cv_path_MAGIC_CMD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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@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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+printf "%s\n" "$MAGIC_CMD" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "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 yes = "$GCC"; then
+ case $cc_basename in
+ nvcc*)
+ lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
+ *)
+ lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
+ esac
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+printf %s "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
+if test ${lt_cv_prog_compiler_rtti_exceptions+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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" ## exclude from sc_useless_quotes_in_assignment
+ # 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+printf "%s\n" "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; 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 yes = "$GCC"; then
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_static='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static='-Bstatic'
+ fi
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+
+ 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'
+ case $host_os in
+ os2*)
+ lt_prog_compiler_static='$wl-static'
+ ;;
+ esac
+ ;;
+
+ 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 ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static='-Bstatic'
+ else
+ lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic='-fno-common'
+ case $cc_basename in
+ nagfor*)
+ # NAG Fortran compiler
+ lt_prog_compiler_wl='-Wl,-Wl,,'
+ lt_prog_compiler_pic='-PIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ esac
+ ;;
+
+ 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'
+ case $host_os in
+ os2*)
+ lt_prog_compiler_static='$wl-static'
+ ;;
+ esac
+ ;;
+
+ 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 | 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'
+ ;;
+ # flang / f18. f95 an alias for gfortran or flang on Debian
+ flang* | f18* | f95*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ 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'
+ ;;
+ tcc*)
+ # Fabrice Bellard et al's Tiny C Compiler
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ 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 that do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ lt_prog_compiler_pic=
+ ;;
+ *)
+ lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
+ ;;
+esac
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+printf %s "checking for $compiler option to produce PIC... " >&6; }
+if test ${lt_cv_prog_compiler_pic+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_pic=$lt_prog_compiler_pic
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5
+printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
+if test ${lt_cv_prog_compiler_pic_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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" ## exclude from sc_useless_quotes_in_assignment
+ # 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
+printf "%s\n" "$lt_cv_prog_compiler_pic_works" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_pic_works"; 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\"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if test ${lt_cv_prog_compiler_static_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
+printf "%s\n" "$lt_cv_prog_compiler_static_works" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_static_works"; then
+ :
+else
+ lt_prog_compiler_static=
+fi
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test ${lt_cv_prog_compiler_c_o+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test ${lt_cv_prog_compiler_c_o+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+hard_links=nottested
+if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then
+ # do not overwrite the value of need_locks provided by the user
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+printf %s "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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+printf "%s\n" "$hard_links" >&6; }
+ if test no = "$hard_links"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
+printf "%s\n" "$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
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+printf %s "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 yes != "$GCC"; then
+ with_gnu_ld=no
+ fi
+ ;;
+ interix*)
+ # we just hope/assume this is gcc and not c89 (= MSVC++)
+ with_gnu_ld=yes
+ ;;
+ openbsd* | bitrig*)
+ with_gnu_ld=no
+ ;;
+ linux* | k*bsd*-gnu | gnu*)
+ link_all_deplibs=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 yes = "$with_gnu_ld"; 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 yes = "$lt_use_gnu_ld_interface"; 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 | $SED -e 's/(^)\+)\s\+//' 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 ia64 != "$host_cpu"; 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@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, use it as
+ # is; otherwise, prepend EXPORTS...
+ archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; 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
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ allow_undefined_flag=unsupported
+ shrext_cmds=.dll
+ archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ prefix_cmds="$SED"~
+ if test EXPORTS = "`$SED 1q $export_symbols`"; then
+ prefix_cmds="$prefix_cmds -e 1d";
+ fi~
+ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ enable_shared_with_static_runtimes=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 linux-dietlibc = "$host_os"; 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 no = "$tmp_diet"
+ 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' ;;
+ nagfor*) # NAGFOR 5.3
+ tmp_sharedflag='-Wl,-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 yes = "$supports_anon_versioning"; 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
+ tcc*)
+ export_dynamic_flag_spec='-rdynamic'
+ ;;
+ 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 yes = "$supports_anon_versioning"; 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* | netbsdelf*-gnu)
+ 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 cannot
+*** 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 no = "$ld_shlibs"; 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 yes = "$GCC" && 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 ia64 = "$host_cpu"; 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 GNU nm, but means don't demangle to AIX nm.
+ # Without the "-l" option, or with the "-B" option, AIX nm treats
+ # weak defined symbols like other global defined symbols, whereas
+ # GNU nm marks them as "W".
+ # While the 'weak' keyword is ignored in the Export File, we need
+ # it in the Import File for the 'aix-soname' feature, so we have
+ # to replace the "-B" option with "-P" for AIX nm.
+ 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) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
+ else
+ export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | 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
+ # have runtime linking enabled, and use it for executables.
+ # For shared libraries, we enable/disable runtime linking
+ # depending on the kind of the shared library created -
+ # when "with_aix_soname,aix_use_runtimelinking" is:
+ # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables
+ # "aix,yes" lib.so shared, rtl:yes, for executables
+ # lib.a static archive
+ # "both,no" lib.so.V(shr.o) shared, rtl:yes
+ # lib.a(lib.so.V) shared, rtl:no, for executables
+ # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a(lib.so.V) shared, rtl:no
+ # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a static archive
+ case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+ for ld_flag in $LDFLAGS; do
+ if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then
+ aix_use_runtimelinking=yes
+ break
+ fi
+ done
+ if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # With aix-soname=svr4, we create the lib.so.V shared archives only,
+ # so we don't have lib.a shared libs to link our executables.
+ # We have to force runtime linking in this case.
+ aix_use_runtimelinking=yes
+ LDFLAGS="$LDFLAGS -Wl,-brtl"
+ fi
+ ;;
+ 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,'
+ case $with_aix_soname,$aix_use_runtimelinking in
+ aix,*) ;; # traditional, no import file
+ svr4,* | *,yes) # use import file
+ # The Import File defines what to hardcode.
+ hardcode_direct=no
+ hardcode_direct_absolute=no
+ ;;
+ esac
+
+ if test yes = "$GCC"; 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 yes = "$aix_use_runtimelinking"; then
+ shared_flag="$shared_flag "'$wl-G'
+ fi
+ # Need to ensure runtime linking is disabled for the traditional
+ # shared library, or the linker may eventually find shared libraries
+ # /with/ Import File - we do not want to mix them.
+ shared_flag_aix='-shared'
+ shared_flag_svr4='-shared $wl-G'
+ else
+ # not using gcc
+ if test ia64 = "$host_cpu"; 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 yes = "$aix_use_runtimelinking"; then
+ shared_flag='$wl-G'
+ else
+ shared_flag='$wl-bM:SRE'
+ fi
+ shared_flag_aix='$wl-bM:SRE'
+ shared_flag_svr4='$wl-G'
+ 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,yes = "$with_aix_soname,$aix_use_runtimelinking"; 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 set = "${lt_cv_aix_libpath+set}"; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ if test ${lt_cv_aix_libpath_+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ 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.beam \
+ 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 -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
+ else
+ if test ia64 = "$host_cpu"; 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 set = "${lt_cv_aix_libpath+set}"; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ if test ${lt_cv_aix_libpath_+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ 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.beam \
+ 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 yes = "$with_gnu_ld"; 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
+ archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+ # -brtl affects multiple linker settings, -berok does not and is overridden later
+ compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
+ if test svr4 != "$with_aix_soname"; then
+ # This is similar to how AIX traditionally builds its shared libraries.
+ archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+ fi
+ if test aix != "$with_aix_soname"; then
+ archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+ else
+ # used by -dlpreopen to get the symbols
+ archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir'
+ fi
+ archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d'
+ 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,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+ archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then
+ cp "$export_symbols" "$output_objdir/$soname.def";
+ echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+ else
+ $SED -e '\''s/^/-link -EXPORT:/'\'' < $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 yes = "$lt_cv_ld_force_load"; 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*|nagfor*) _lt_dar_can_shared=yes ;;
+ *) _lt_dar_can_shared=$GCC ;;
+ esac
+ if test yes = "$_lt_dar_can_shared"; 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 yes = "$GCC"; 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 "x$output_objdir/$soname" = "x$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 "x$output_objdir/$soname" = "x$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 yes,no = "$GCC,$with_gnu_ld"; 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 no = "$with_gnu_ld"; 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 yes,no = "$GCC,$with_gnu_ld"; 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)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
+printf %s "checking if $CC understands -b... " >&6; }
+if test ${lt_cv_prog_compiler__b+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
+printf "%s\n" "$lt_cv_prog_compiler__b" >&6; }
+
+if test yes = "$lt_cv_prog_compiler__b"; 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 no = "$with_gnu_ld"; 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 yes = "$GCC"; 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.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
+printf %s "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
+if test ${lt_cv_irix_exported_symbol+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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 $as_nop
+ lt_cv_irix_exported_symbol=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS=$save_LDFLAGS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
+printf "%s\n" "$lt_cv_irix_exported_symbol" >&6; }
+ if test yes = "$lt_cv_irix_exported_symbol"; 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
+ link_all_deplibs=no
+ 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
+ ;;
+
+ linux*)
+ case $cc_basename in
+ tcc*)
+ # Fabrice Bellard et al's Tiny C Compiler
+ ld_shlibs=yes
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+
+ netbsd* | netbsdelf*-gnu)
+ 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* | bitrig*)
+ 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__`"; 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
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+ fi
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ allow_undefined_flag=unsupported
+ shrext_cmds=.dll
+ archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ prefix_cmds="$SED"~
+ if test EXPORTS = "`$SED 1q $export_symbols`"; then
+ prefix_cmds="$prefix_cmds -e 1d";
+ fi~
+ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ enable_shared_with_static_runtimes=yes
+ ;;
+
+ osf3*)
+ if test yes = "$GCC"; 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 yes = "$GCC"; 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 yes = "$GCC"; 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 yes = "$GCC"; 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 sequent = "$host_vendor"; 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 yes = "$GCC"; 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 CANNOT 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 yes = "$GCC"; 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 sni = "$host_vendor"; then
+ case $host in
+ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ export_dynamic_flag_spec='$wl-Blargedynsym'
+ ;;
+ esac
+ fi
+ fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
+printf "%s\n" "$ld_shlibs" >&6; }
+test no = "$ld_shlibs" && 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 yes,yes = "$GCC,$enable_shared"; 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.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+printf %s "checking whether -lc should be explicitly linked in... " >&6; }
+if test ${lt_cv_archive_cmds_need_lc+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ $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=$?
+ printf "%s\n" "$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=$?
+ printf "%s\n" "$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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
+printf "%s\n" "$lt_cv_archive_cmds_need_lc" >&6; }
+ archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+printf %s "checking dynamic linker characteristics... " >&6; }
+
+if test yes = "$GCC"; 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`
+ # ...but if some path component already ends with the multilib dir we assume
+ # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer).
+ case "$lt_multi_os_dir; $lt_search_path_spec " in
+ "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*)
+ lt_multi_os_dir=
+ ;;
+ esac
+ 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"
+ elif test -n "$lt_multi_os_dir"; then
+ 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 ia64 = "$host_cpu"; 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
+ # Using Import Files as archive members, it is possible to support
+ # filename-based versioning of shared library archives on AIX. While
+ # this would work for both with and without runtime linking, it will
+ # prevent static linking of such archives. So we do filename-based
+ # shared library versioning with .so extension only, which is used
+ # when both runtime linking and shared linking is enabled.
+ # Unfortunately, runtime linking may impact performance, so we do
+ # not want this to be the default eventually. Also, we use the
+ # versioned .so libs for executables only if there is the -brtl
+ # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+ # To allow for filename-based versioning support, we need to create
+ # libNAME.so.V as an archive file, containing:
+ # *) an Import File, referring to the versioned filename of the
+ # archive as well as the shared archive member, telling the
+ # bitwidth (32 or 64) of that shared object, and providing the
+ # list of exported symbols of that shared object, eventually
+ # decorated with the 'weak' keyword
+ # *) the shared object with the F_LOADONLY flag set, to really avoid
+ # it being seen by the linker.
+ # At run time we better use the real file rather than another symlink,
+ # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+ case $with_aix_soname,$aix_use_runtimelinking in
+ # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ aix,yes) # traditional libtool
+ dynamic_linker='AIX unversionable lib.so'
+ # 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'
+ ;;
+ aix,no) # traditional AIX only
+ dynamic_linker='AIX lib.a(lib.so.V)'
+ # 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'
+ ;;
+ svr4,*) # full svr4 only
+ dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,yes) # both, prefer svr4
+ dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # unpreferred sharedlib libNAME.a needs extra handling
+ postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+ postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,no) # both, prefer aix
+ dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
+ library_names_spec='$libname$release.a $libname.a'
+ soname_spec='$libname$release$shared_ext$major'
+ # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+ postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+ postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+ ;;
+ esac
+ 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%'\''`; $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$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ 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
+ ;;
+
+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=no
+ 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 32 = "$HPUX_IA64_MODE"; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux32
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux64
+ fi
+ ;;
+ 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 yes = "$lt_cv_prog_gnu_ld"; 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
+ ;;
+
+linux*android*)
+ version_type=none # Android doesn't support versioned libraries.
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext'
+ soname_spec='$libname$release$shared_ext'
+ finish_cmds=
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+
+ # 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
+
+ dynamic_linker='Android linker'
+ # Don't embed -rpath directories since the linker doesn't support them.
+ hardcode_libdir_flag_spec='-L$libdir'
+ ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | 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 test ${lt_cv_shlibpath_overrides_runpath+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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 (void)
+{
+
+ ;
+ 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.beam \
+ 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
+
+ # Ideally, we could use ldconfig to report *all* directores which are
+ # searched for libraries, however this is still not possible. Aside from not
+ # being certain /sbin/ldconfig is available, command
+ # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+ # even though it is searched at run-time. Try to do the best guess by
+ # appending ld.so.conf contents (and includes) 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="/lib /usr/lib $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'
+ ;;
+
+netbsdelf*-gnu)
+ version_type=linux
+ 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='NetBSD ld.elf_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* | bitrig*)
+ version_type=sunos
+ sys_lib_dlsearch_path_spec=/usr/lib
+ need_lib_prefix=no
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+ need_version=no
+ else
+ need_version=yes
+ fi
+ 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
+ shlibpath_overrides_runpath=yes
+ ;;
+
+os2*)
+ libname_spec='$name'
+ version_type=windows
+ shrext_cmds=.dll
+ need_version=no
+ need_lib_prefix=no
+ # OS/2 can only load a DLL with a base name of 8 characters or less.
+ soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+ v=$($ECHO $release$versuffix | tr -d .-);
+ n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+ $ECHO $n$v`$shared_ext'
+ library_names_spec='${libname}_dll.$libext'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=BEGINLIBPATH
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ 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'
+ ;;
+
+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 yes = "$with_gnu_ld"; 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=sco
+ 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 yes = "$with_gnu_ld"; 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+printf "%s\n" "$dynamic_linker" >&6; }
+test no = "$dynamic_linker" && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test yes = "$GCC"; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+ sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
+fi
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+ sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
+fi
+
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+printf %s "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" ||
+ test -n "$runpath_var" ||
+ test yes = "$hardcode_automatic"; then
+
+ # We can hardcode non-existent directories.
+ if test no != "$hardcode_direct" &&
+ # 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 no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" &&
+ test no != "$hardcode_minus_L"; 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
+printf "%s\n" "$hardcode_action" >&6; }
+
+if test relink = "$hardcode_action" ||
+ test yes = "$inherit_rpath"; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test yes = "$shlibpath_overrides_runpath" ||
+ test no = "$enable_shared"; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+
+
+
+
+
+
+ if test yes != "$enable_dlopen"; 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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+printf %s "checking for dlopen in -ldl... " >&6; }
+if test ${ac_cv_lib_dl_dlopen+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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. */
+char dlopen ();
+int
+main (void)
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_dl_dlopen=yes
+else $as_nop
+ ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+printf "%s\n" "$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_nop
+
+ lt_cv_dlopen=dyld
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+
+fi
+
+ ;;
+
+ tpf*)
+ # Don't try to run any link tests for TPF. We know it's impossible
+ # because TPF is a cross-compiler, and we know how we open DSOs.
+ lt_cv_dlopen=dlopen
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=no
+ ;;
+
+ *)
+ 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_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
+printf %s "checking for shl_load in -ldld... " >&6; }
+if test ${ac_cv_lib_dld_shl_load+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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. */
+char shl_load ();
+int
+main (void)
+{
+return shl_load ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_dld_shl_load=yes
+else $as_nop
+ ac_cv_lib_dld_shl_load=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
+printf "%s\n" "$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 $as_nop
+ 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_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+printf %s "checking for dlopen in -ldl... " >&6; }
+if test ${ac_cv_lib_dl_dlopen+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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. */
+char dlopen ();
+int
+main (void)
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_dl_dlopen=yes
+else $as_nop
+ ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+printf "%s\n" "$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_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
+printf %s "checking for dlopen in -lsvld... " >&6; }
+if test ${ac_cv_lib_svld_dlopen+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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. */
+char dlopen ();
+int
+main (void)
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_svld_dlopen=yes
+else $as_nop
+ ac_cv_lib_svld_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
+printf "%s\n" "$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_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
+printf %s "checking for dld_link in -ldld... " >&6; }
+if test ${ac_cv_lib_dld_dld_link+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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. */
+char dld_link ();
+int
+main (void)
+{
+return dld_link ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_dld_dld_link=yes
+else $as_nop
+ ac_cv_lib_dld_dld_link=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
+printf "%s\n" "$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 no = "$lt_cv_dlopen"; then
+ enable_dlopen=no
+ else
+ enable_dlopen=yes
+ fi
+
+ case $lt_cv_dlopen in
+ dlopen)
+ save_CPPFLAGS=$CPPFLAGS
+ test yes = "$ac_cv_header_dlfcn_h" && 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"
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
+printf %s "checking whether a program can dlopen itself... " >&6; }
+if test ${lt_cv_dlopen_self+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test yes = "$cross_compiling"; 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 -fvisibility=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=$?
+ printf "%s\n" "$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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
+printf "%s\n" "$lt_cv_dlopen_self" >&6; }
+
+ if test yes = "$lt_cv_dlopen_self"; then
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
+printf %s "checking whether a statically linked program can dlopen itself... " >&6; }
+if test ${lt_cv_dlopen_self_static+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test yes = "$cross_compiling"; 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 -fvisibility=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=$?
+ printf "%s\n" "$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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
+printf "%s\n" "$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=
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
+printf %s "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"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "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"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ fi
+ ;;
+ *)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ ;;
+ esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+ # Report what library types will actually be built
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
+printf %s "checking if libtool supports shared libraries... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
+printf "%s\n" "$can_build_shared" >&6; }
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+printf %s "checking whether to build shared libraries... " >&6; }
+ test no = "$can_build_shared" && 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 yes = "$enable_shared" && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+
+ aix[4-9]*)
+ if test ia64 != "$host_cpu"; then
+ case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+ yes,aix,yes) ;; # shared object as lib.so file only
+ yes,svr4,*) ;; # shared object as lib.so archive member only
+ yes,*) enable_static=no ;; # shared object in lib.a archive as well
+ esac
+ fi
+ ;;
+ esac
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+printf "%s\n" "$enable_shared" >&6; }
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
+printf %s "checking whether to build static libraries... " >&6; }
+ # Make sure either enable_shared or enable_static is yes.
+ test yes = "$enable_shared" || enable_static=yes
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
+printf "%s\n" "$enable_static" >&6; }
+
+
+
+
+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
+
+CC=$lt_save_CC
+
+ if test -n "$CXX" && ( test no != "$CXX" &&
+ ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) ||
+ (test g++ != "$CXX"))); 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
+printf %s "checking how to run the C++ preprocessor... " >&6; }
+if test -z "$CXXCPP"; then
+ if test ${ac_cv_prog_CXXCPP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # Double quotes because $CXX needs to be expanded
+ for CXXCPP in "$CXX -E" cpp /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.
+ # 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. */
+#include <limits.h>
+ Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"
+then :
+
+else $as_nop
+ # 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 $as_nop
+ # 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
+printf "%s\n" "$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.
+ # 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. */
+#include <limits.h>
+ Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"
+then :
+
+else $as_nop
+ # 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 $as_nop
+ # 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_nop
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$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 yes != "$_lt_caught_CXX_error"; 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
+ func_cc_basename $compiler
+cc_basename=$func_cc_basename_result
+
+
+ if test -n "$compiler"; then
+ # We don't want -fno-exception when compiling C++ code, so set the
+ # no_builtin_flag separately
+ if test yes = "$GXX"; then
+ lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
+ else
+ lt_prog_compiler_no_builtin_flag_CXX=
+ fi
+
+ if test yes = "$GXX"; then
+ # Set up default GNU C++ configuration
+
+
+
+# Check whether --with-gnu-ld was given.
+if test ${with_gnu_ld+y}
+then :
+ withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
+else $as_nop
+ with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test yes = "$GCC"; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+printf %s "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 yes = "$with_gnu_ld"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+printf %s "checking for GNU ld... " >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+printf %s "checking for non-GNU ld... " >&6; }
+fi
+if test ${lt_cv_path_LD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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 no != "$with_gnu_ld" && break
+ ;;
+ *)
+ test yes != "$with_gnu_ld" && 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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+printf "%s\n" "$LD" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+printf %s "checking if the linker ($LD) is GNU ld... " >&6; }
+if test ${lt_cv_prog_gnu_ld+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+printf "%s\n" "$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 yes = "$with_gnu_ld"; 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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+printf %s "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 ia64 = "$host_cpu"; 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
+ # have runtime linking enabled, and use it for executables.
+ # For shared libraries, we enable/disable runtime linking
+ # depending on the kind of the shared library created -
+ # when "with_aix_soname,aix_use_runtimelinking" is:
+ # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables
+ # "aix,yes" lib.so shared, rtl:yes, for executables
+ # lib.a static archive
+ # "both,no" lib.so.V(shr.o) shared, rtl:yes
+ # lib.a(lib.so.V) shared, rtl:no, for executables
+ # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a(lib.so.V) shared, rtl:no
+ # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a static archive
+ 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
+ if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # With aix-soname=svr4, we create the lib.so.V shared archives only,
+ # so we don't have lib.a shared libs to link our executables.
+ # We have to force runtime linking in this case.
+ aix_use_runtimelinking=yes
+ LDFLAGS="$LDFLAGS -Wl,-brtl"
+ fi
+ ;;
+ 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,'
+ case $with_aix_soname,$aix_use_runtimelinking in
+ aix,*) ;; # no import file
+ svr4,* | *,yes) # use import file
+ # The Import File defines what to hardcode.
+ hardcode_direct_CXX=no
+ hardcode_direct_absolute_CXX=no
+ ;;
+ esac
+
+ if test yes = "$GXX"; 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 yes = "$aix_use_runtimelinking"; then
+ shared_flag=$shared_flag' $wl-G'
+ fi
+ # Need to ensure runtime linking is disabled for the traditional
+ # shared library, or the linker may eventually find shared libraries
+ # /with/ Import File - we do not want to mix them.
+ shared_flag_aix='-shared'
+ shared_flag_svr4='-shared $wl-G'
+ else
+ # not using gcc
+ if test ia64 = "$host_cpu"; 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 yes = "$aix_use_runtimelinking"; then
+ shared_flag='$wl-G'
+ else
+ shared_flag='$wl-bM:SRE'
+ fi
+ shared_flag_aix='$wl-bM:SRE'
+ shared_flag_svr4='$wl-G'
+ 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,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ # The "-G" linker flag allows undefined symbols.
+ no_undefined_flag_CXX='-bernotok'
+ # Determine the default libpath from the value encoded in an empty
+ # executable.
+ if test set = "${lt_cv_aix_libpath+set}"; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ if test ${lt_cv_aix_libpath__CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ 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.beam \
+ 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 -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
+ else
+ if test ia64 = "$host_cpu"; 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 set = "${lt_cv_aix_libpath+set}"; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ if test ${lt_cv_aix_libpath__CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ 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.beam \
+ 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 yes = "$with_gnu_ld"; 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
+ archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+ # -brtl affects multiple linker settings, -berok does not and is overridden later
+ compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
+ if test svr4 != "$with_aix_soname"; then
+ # This is similar to how AIX traditionally builds its shared
+ # libraries. Need -bnortl late, we may have -brtl in LDFLAGS.
+ archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+ fi
+ if test aix != "$with_aix_soname"; then
+ archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+ else
+ # used by -dlpreopen to get the symbols
+ archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV $output_objdir/$realname.d/$soname $output_objdir'
+ fi
+ archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d'
+ fi
+ fi
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ allow_undefined_flag_CXX=unsupported
+ # Joseph Beckenbach <jrb3@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,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+ archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then
+ cp "$export_symbols" "$output_objdir/$soname.def";
+ echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+ else
+ $SED -e '\''s/^/-link -EXPORT:/'\'' < $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, use it as
+ # is; otherwise, prepend EXPORTS...
+ archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; 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 yes = "$lt_cv_ld_force_load"; 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*|nagfor*) _lt_dar_can_shared=yes ;;
+ *) _lt_dar_can_shared=$GCC ;;
+ esac
+ if test yes = "$_lt_dar_can_shared"; 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 yes != "$lt_cv_apple_cc_single_mod"; 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
+
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec_CXX='-L$libdir'
+ hardcode_minus_L_CXX=yes
+ allow_undefined_flag_CXX=unsupported
+ shrext_cmds=.dll
+ archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ prefix_cmds="$SED"~
+ if test EXPORTS = "`$SED 1q $export_symbols`"; then
+ prefix_cmds="$prefix_cmds -e 1d";
+ fi~
+ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ enable_shared_with_static_runtimes_CXX=yes
+ ;;
+
+ 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
+ ;;
+
+ 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 "x$output_objdir/$soname" = "x$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 yes = "$GXX"; 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 "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+ else
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+
+ hpux10*|hpux11*)
+ if test no = "$with_gnu_ld"; 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 yes = "$GXX"; then
+ if test no = "$with_gnu_ld"; 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 yes = "$GXX"; then
+ if test no = "$with_gnu_ld"; 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 | 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 yes = "$supports_anon_versioning"; 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
+ ;;
+
+ openbsd* | bitrig*)
+ 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__`"; 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 yes,no = "$GXX,$with_gnu_ld"; 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 yes,no = "$GXX,$with_gnu_ld"; 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 $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 $wl-h $wl$soname -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 $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 $wl-h $wl$soname -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 CANNOT 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
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
+printf "%s\n" "$ld_shlibs_CXX" >&6; }
+ test no = "$ld_shlibs_CXX" && 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=$?
+ printf "%s\n" "$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 x-L = "$p" ||
+ test x-R = "$p"; 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 no = "$pre_test_object_deps_done"; 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 no = "$pre_test_object_deps_done"; 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=
+ ;;
+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 yes = "$GXX"; 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 ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_CXX='-Bstatic'
+ fi
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+
+ 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'
+ case $host_os in
+ os2*)
+ lt_prog_compiler_static_CXX='$wl-static'
+ ;;
+ esac
+ ;;
+ 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 ia64 = "$host_cpu"; 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 ia64 != "$host_cpu"; 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 | 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* | netbsdelf*-gnu)
+ ;;
+ *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 that 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
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+printf %s "checking for $compiler option to produce PIC... " >&6; }
+if test ${lt_cv_prog_compiler_pic_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5
+printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
+printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; }
+if test ${lt_cv_prog_compiler_pic_works_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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" ## exclude from sc_useless_quotes_in_assignment
+ # 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
+printf "%s\n" "$lt_cv_prog_compiler_pic_works_CXX" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; 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\"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if test ${lt_cv_prog_compiler_static_works_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5
+printf "%s\n" "$lt_cv_prog_compiler_static_works_CXX" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then
+ :
+else
+ lt_prog_compiler_static_CXX=
+fi
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test ${lt_cv_prog_compiler_c_o_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+printf "%s\n" "$lt_cv_prog_compiler_c_o_CXX" >&6; }
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test ${lt_cv_prog_compiler_c_o_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+printf "%s\n" "$lt_cv_prog_compiler_c_o_CXX" >&6; }
+
+
+
+
+hard_links=nottested
+if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then
+ # do not overwrite the value of need_locks provided by the user
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+printf %s "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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+printf "%s\n" "$hard_links" >&6; }
+ if test no = "$hard_links"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
+printf "%s\n" "$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
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+printf %s "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 GNU nm, but means don't demangle to AIX nm.
+ # Without the "-l" option, or with the "-B" option, AIX nm treats
+ # weak defined symbols like other global defined symbols, whereas
+ # GNU nm marks them as "W".
+ # While the 'weak' keyword is ignored in the Export File, we need
+ # it in the Import File for the 'aix-soname' feature, so we have
+ # to replace the "-B" option with "-P" for AIX nm.
+ 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) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
+ else
+ export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | 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
+ ;;
+ linux* | k*bsd*-gnu | gnu*)
+ link_all_deplibs_CXX=no
+ ;;
+ *)
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ ;;
+ esac
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
+printf "%s\n" "$ld_shlibs_CXX" >&6; }
+test no = "$ld_shlibs_CXX" && 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 yes,yes = "$GCC,$enable_shared"; 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.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+printf %s "checking whether -lc should be explicitly linked in... " >&6; }
+if test ${lt_cv_archive_cmds_need_lc_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ $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=$?
+ printf "%s\n" "$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=$?
+ printf "%s\n" "$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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5
+printf "%s\n" "$lt_cv_archive_cmds_need_lc_CXX" >&6; }
+ archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+printf %s "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 ia64 = "$host_cpu"; 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
+ # Using Import Files as archive members, it is possible to support
+ # filename-based versioning of shared library archives on AIX. While
+ # this would work for both with and without runtime linking, it will
+ # prevent static linking of such archives. So we do filename-based
+ # shared library versioning with .so extension only, which is used
+ # when both runtime linking and shared linking is enabled.
+ # Unfortunately, runtime linking may impact performance, so we do
+ # not want this to be the default eventually. Also, we use the
+ # versioned .so libs for executables only if there is the -brtl
+ # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+ # To allow for filename-based versioning support, we need to create
+ # libNAME.so.V as an archive file, containing:
+ # *) an Import File, referring to the versioned filename of the
+ # archive as well as the shared archive member, telling the
+ # bitwidth (32 or 64) of that shared object, and providing the
+ # list of exported symbols of that shared object, eventually
+ # decorated with the 'weak' keyword
+ # *) the shared object with the F_LOADONLY flag set, to really avoid
+ # it being seen by the linker.
+ # At run time we better use the real file rather than another symlink,
+ # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+ case $with_aix_soname,$aix_use_runtimelinking in
+ # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ aix,yes) # traditional libtool
+ dynamic_linker='AIX unversionable lib.so'
+ # 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'
+ ;;
+ aix,no) # traditional AIX only
+ dynamic_linker='AIX lib.a(lib.so.V)'
+ # 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'
+ ;;
+ svr4,*) # full svr4 only
+ dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,yes) # both, prefer svr4
+ dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # unpreferred sharedlib libNAME.a needs extra handling
+ postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+ postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,no) # both, prefer aix
+ dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
+ library_names_spec='$libname$release.a $libname.a'
+ soname_spec='$libname$release$shared_ext$major'
+ # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+ postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+ postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+ ;;
+ esac
+ 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%'\''`; $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$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ 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
+ ;;
+
+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=no
+ 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 32 = "$HPUX_IA64_MODE"; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux32
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux64
+ fi
+ ;;
+ 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 yes = "$lt_cv_prog_gnu_ld"; 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
+ ;;
+
+linux*android*)
+ version_type=none # Android doesn't support versioned libraries.
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext'
+ soname_spec='$libname$release$shared_ext'
+ finish_cmds=
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+
+ # 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
+
+ dynamic_linker='Android linker'
+ # Don't embed -rpath directories since the linker doesn't support them.
+ hardcode_libdir_flag_spec_CXX='-L$libdir'
+ ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | 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 test ${lt_cv_shlibpath_overrides_runpath+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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 (void)
+{
+
+ ;
+ 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.beam \
+ 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
+
+ # Ideally, we could use ldconfig to report *all* directores which are
+ # searched for libraries, however this is still not possible. Aside from not
+ # being certain /sbin/ldconfig is available, command
+ # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+ # even though it is searched at run-time. Try to do the best guess by
+ # appending ld.so.conf contents (and includes) 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="/lib /usr/lib $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'
+ ;;
+
+netbsdelf*-gnu)
+ version_type=linux
+ 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='NetBSD ld.elf_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* | bitrig*)
+ version_type=sunos
+ sys_lib_dlsearch_path_spec=/usr/lib
+ need_lib_prefix=no
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+ need_version=no
+ else
+ need_version=yes
+ fi
+ 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
+ shlibpath_overrides_runpath=yes
+ ;;
+
+os2*)
+ libname_spec='$name'
+ version_type=windows
+ shrext_cmds=.dll
+ need_version=no
+ need_lib_prefix=no
+ # OS/2 can only load a DLL with a base name of 8 characters or less.
+ soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+ v=$($ECHO $release$versuffix | tr -d .-);
+ n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+ $ECHO $n$v`$shared_ext'
+ library_names_spec='${libname}_dll.$libext'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=BEGINLIBPATH
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ 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'
+ ;;
+
+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 yes = "$with_gnu_ld"; 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=sco
+ 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 yes = "$with_gnu_ld"; 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+printf "%s\n" "$dynamic_linker" >&6; }
+test no = "$dynamic_linker" && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test yes = "$GCC"; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+ sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
+fi
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+ sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
+fi
+
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+printf %s "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 yes = "$hardcode_automatic_CXX"; then
+
+ # We can hardcode non-existent directories.
+ if test no != "$hardcode_direct_CXX" &&
+ # 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 no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" &&
+ test no != "$hardcode_minus_L_CXX"; 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5
+printf "%s\n" "$hardcode_action_CXX" >&6; }
+
+if test relink = "$hardcode_action_CXX" ||
+ test yes = "$inherit_rpath_CXX"; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test yes = "$shlibpath_overrides_runpath" ||
+ test no = "$enable_shared"; 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 yes != "$_lt_caught_CXX_error"
+
+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_commands="$ac_config_commands libtool"
+
+
+
+
+# Only expand once:
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
+printf %s "checking whether ln -s works... " >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
+printf "%s\n" "no, using $LN_S" >&6; }
+fi
+
+
+
+
+
+
+
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_PKG_CONFIG+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case $PKG_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_PKG_CONFIG="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
+printf "%s\n" "$PKG_CONFIG" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+ ac_pt_PKG_CONFIG=$PKG_CONFIG
+ # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_ac_pt_PKG_CONFIG+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case $ac_pt_PKG_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_ac_pt_PKG_CONFIG="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+if test -n "$ac_pt_PKG_CONFIG"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5
+printf "%s\n" "$ac_pt_PKG_CONFIG" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_pt_PKG_CONFIG" = x; then
+ PKG_CONFIG=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ PKG_CONFIG=$ac_pt_PKG_CONFIG
+ fi
+else
+ PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
+fi
+
+fi
+if test -n "$PKG_CONFIG"; then
+ _pkg_min_version=0.20
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5
+printf %s "checking pkg-config is at least version $_pkg_min_version... " >&6; }
+ if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ PKG_CONFIG=""
+ fi
+fi
+
+# =====================
+# Find required headers
+# =====================
+ac_fn_cxx_check_header_compile "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default"
+if test "x$ac_cv_header_stdlib_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_STDLIB_H 1" >>confdefs.h
+
+fi
+ac_fn_cxx_check_header_compile "$LINENO" "sys/time.h" "ac_cv_header_sys_time_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_time_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_SYS_TIME_H 1" >>confdefs.h
+
+fi
+ac_fn_cxx_check_header_compile "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default"
+if test "x$ac_cv_header_unistd_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_UNISTD_H 1" >>confdefs.h
+
+fi
+
+
+# ===================================
+# Check for filesystem implementation
+# ===================================
+ac_fn_cxx_check_header_compile "$LINENO" "filesystem" "ac_cv_header_filesystem" "$ac_includes_default"
+if test "x$ac_cv_header_filesystem" = xyes
+then :
+ have_filesystem=yes
+else $as_nop
+ have_filesystem=no
+fi
+
+
+ac_fn_cxx_check_header_compile "$LINENO" "experimental/filesystem" "ac_cv_header_experimental_filesystem" "$ac_includes_default"
+if test "x$ac_cv_header_experimental_filesystem" = xyes
+then :
+ have_experimental_filesystem=yes
+else $as_nop
+ have_experimental_filesystem=no
+fi
+
+
+ if test "x$have_filesystem" = "xyes"; then
+ HAVE_FILESYSTEM_TRUE=
+ HAVE_FILESYSTEM_FALSE='#'
+else
+ HAVE_FILESYSTEM_TRUE='#'
+ HAVE_FILESYSTEM_FALSE=
+fi
+
+ if test "x$have_experimental_filesystem" = "xyes"; then
+ HAVE_EXPERIMENTAL_FILESYSTEM_TRUE=
+ HAVE_EXPERIMENTAL_FILESYSTEM_FALSE='#'
+else
+ HAVE_EXPERIMENTAL_FILESYSTEM_TRUE='#'
+ HAVE_EXPERIMENTAL_FILESYSTEM_FALSE=
+fi
+
+
+# =============================================================
+# Checks for typedefs, structures, and compiler characteristics
+# =============================================================
+ac_fn_cxx_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default"
+if test "x$ac_cv_type__Bool" = xyes
+then :
+
+printf "%s\n" "#define HAVE__BOOL 1" >>confdefs.h
+
+
+fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5
+printf %s "checking for stdbool.h that conforms to C99... " >&6; }
+if test ${ac_cv_header_stdbool_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdbool.h>
+
+ #ifndef __bool_true_false_are_defined
+ #error "__bool_true_false_are_defined is not defined"
+ #endif
+ char a[__bool_true_false_are_defined == 1 ? 1 : -1];
+
+ /* Regardless of whether this is C++ or "_Bool" is a
+ valid type name, "true" and "false" should be usable
+ in #if expressions and integer constant expressions,
+ and "bool" should be a valid type name. */
+
+ #if !true
+ #error "'true' is not true"
+ #endif
+ #if true != 1
+ #error "'true' is not equal to 1"
+ #endif
+ char b[true == 1 ? 1 : -1];
+ char c[true];
+
+ #if false
+ #error "'false' is not false"
+ #endif
+ #if false != 0
+ #error "'false' is not equal to 0"
+ #endif
+ char d[false == 0 ? 1 : -1];
+
+ enum { e = false, f = true, g = false * true, h = true * 256 };
+
+ char i[(bool) 0.5 == true ? 1 : -1];
+ char j[(bool) 0.0 == false ? 1 : -1];
+ char k[sizeof (bool) > 0 ? 1 : -1];
+
+ struct sb { bool s: 1; bool t; } s;
+ char l[sizeof s.t > 0 ? 1 : -1];
+
+ /* The following fails for
+ HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */
+ bool m[h];
+ char n[sizeof m == h * sizeof m[0] ? 1 : -1];
+ char o[-1 - (bool) 0 < 0 ? 1 : -1];
+ /* Catch a bug in an HP-UX C compiler. See
+ https://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
+ https://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html
+ */
+ bool p = true;
+ bool *pp = &p;
+
+ /* C 1999 specifies that bool, true, and false are to be
+ macros, but C++ 2011 and later overrule this. */
+ #if __cplusplus < 201103
+ #ifndef bool
+ #error "bool is not defined"
+ #endif
+ #ifndef false
+ #error "false is not defined"
+ #endif
+ #ifndef true
+ #error "true is not defined"
+ #endif
+ #endif
+
+ /* If _Bool is available, repeat with it all the tests
+ above that used bool. */
+ #ifdef HAVE__BOOL
+ struct sB { _Bool s: 1; _Bool t; } t;
+
+ char q[(_Bool) 0.5 == true ? 1 : -1];
+ char r[(_Bool) 0.0 == false ? 1 : -1];
+ char u[sizeof (_Bool) > 0 ? 1 : -1];
+ char v[sizeof t.t > 0 ? 1 : -1];
+
+ _Bool w[h];
+ char x[sizeof m == h * sizeof m[0] ? 1 : -1];
+ char y[-1 - (_Bool) 0 < 0 ? 1 : -1];
+ _Bool z = true;
+ _Bool *pz = &p;
+ #endif
+
+int
+main (void)
+{
+
+ bool ps = &s;
+ *pp |= p;
+ *pp |= ! p;
+
+ #ifdef HAVE__BOOL
+ _Bool pt = &t;
+ *pz |= z;
+ *pz |= ! z;
+ #endif
+
+ /* Refer to every declared value, so they cannot be
+ discarded as unused. */
+ return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !j + !k
+ + !l + !m + !n + !o + !p + !pp + !ps
+ #ifdef HAVE__BOOL
+ + !q + !r + !u + !v + !w + !x + !y + !z + !pt
+ #endif
+ );
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_header_stdbool_h=yes
+else $as_nop
+ ac_cv_header_stdbool_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5
+printf "%s\n" "$ac_cv_header_stdbool_h" >&6; }
+
+if test $ac_cv_header_stdbool_h = yes; then
+
+printf "%s\n" "#define HAVE_STDBOOL_H 1" >>confdefs.h
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inline" >&5
+printf %s "checking for inline... " >&6; }
+if test ${ac_cv_c_inline+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifndef __cplusplus
+typedef int foo_t;
+static $ac_kw foo_t static_foo (void) {return 0; }
+$ac_kw foo_t foo (void) {return 0; }
+#endif
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_c_inline=$ac_kw
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ test "$ac_cv_c_inline" != no && break
+done
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5
+printf "%s\n" "$ac_cv_c_inline" >&6; }
+
+case $ac_cv_c_inline in
+ inline | yes) ;;
+ *)
+ case $ac_cv_c_inline in
+ no) ac_val=;;
+ *) ac_val=$ac_cv_c_inline;;
+ esac
+ cat >>confdefs.h <<_ACEOF
+#ifndef __cplusplus
+#define inline $ac_val
+#endif
+_ACEOF
+ ;;
+esac
+
+ac_fn_cxx_check_type "$LINENO" "mode_t" "ac_cv_type_mode_t" "$ac_includes_default"
+if test "x$ac_cv_type_mode_t" = xyes
+then :
+
+else $as_nop
+
+printf "%s\n" "#define mode_t int" >>confdefs.h
+
+fi
+
+ac_fn_cxx_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
+if test "x$ac_cv_type_size_t" = xyes
+then :
+
+else $as_nop
+
+printf "%s\n" "#define size_t unsigned int" >>confdefs.h
+
+fi
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5
+printf %s "checking size of void *... " >&6; }
+if test ${ac_cv_sizeof_void_p+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if ac_fn_cxx_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" "$ac_includes_default"
+then :
+
+else $as_nop
+ if test "$ac_cv_type_void_p" = yes; then
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (void *)
+See \`config.log' for more details" "$LINENO" 5; }
+ else
+ ac_cv_sizeof_void_p=0
+ fi
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5
+printf "%s\n" "$ac_cv_sizeof_void_p" >&6; }
+
+
+
+printf "%s\n" "#define SIZEOF_VOID_P $ac_cv_sizeof_void_p" >>confdefs.h
+
+
+CXXFLAGS="$CXXFLAGS -DSIZEOF_VOID_P=$ac_cv_sizeof_void_p"
+
+# ============================
+# Checks for library functions
+# ============================
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working strtod" >&5
+printf %s "checking for working strtod... " >&6; }
+if test ${ac_cv_func_strtod+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ ac_cv_func_strtod=no
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+$ac_includes_default
+#ifndef strtod
+double strtod ();
+#endif
+int
+main (void)
+{
+ {
+ /* Some versions of Linux strtod mis-parse strings with leading '+'. */
+ char *string = " +69";
+ char *term;
+ double value;
+ value = strtod (string, &term);
+ if (value != 69 || term != (string + 4))
+ return 1;
+ }
+
+ {
+ /* Under Solaris 2.4, strtod returns the wrong value for the
+ terminating character under some conditions. */
+ char *string = "NaN";
+ char *term;
+ strtod (string, &term);
+ if (term != string && *(term - 1) == 0)
+ return 1;
+ }
+ return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"
+then :
+ ac_cv_func_strtod=yes
+else $as_nop
+ ac_cv_func_strtod=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strtod" >&5
+printf "%s\n" "$ac_cv_func_strtod" >&6; }
+if test $ac_cv_func_strtod = no; then
+ case " $LIBOBJS " in
+ *" strtod.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS strtod.$ac_objext"
+ ;;
+esac
+
+ac_fn_cxx_check_func "$LINENO" "pow" "ac_cv_func_pow"
+if test "x$ac_cv_func_pow" = xyes
+then :
+
+fi
+
+if test $ac_cv_func_pow = no; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pow in -lm" >&5
+printf %s "checking for pow in -lm... " >&6; }
+if test ${ac_cv_lib_m_pow+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lm $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+namespace conftest {
+ extern "C" int pow ();
+}
+int
+main (void)
+{
+return conftest::pow ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+ ac_cv_lib_m_pow=yes
+else $as_nop
+ ac_cv_lib_m_pow=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_pow" >&5
+printf "%s\n" "$ac_cv_lib_m_pow" >&6; }
+if test "x$ac_cv_lib_m_pow" = xyes
+then :
+ POW_LIB=-lm
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cannot find library containing definition of pow" >&5
+printf "%s\n" "$as_me: WARNING: cannot find library containing definition of pow" >&2;}
+fi
+
+fi
+
+fi
+
+ac_fn_cxx_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday"
+if test "x$ac_cv_func_gettimeofday" = xyes
+then :
+ printf "%s\n" "#define HAVE_GETTIMEOFDAY 1" >>confdefs.h
+
+fi
+
+
+printf "%s\n" "#define _REENTRANT /**/" >>confdefs.h
+
+
+printf "%s\n" "#define BOOST_ALL_NO_LIB /**/" >>confdefs.h
+
+
+# ======================
+# Set required ixion api
+# ======================
+IXION_REQUIRED_API_VERSION=0.18
+
+
+# =============
+# Set orcus api
+# =============
+ORCUS_API_VERSION=0.18
+ORCUS_MAJOR_VERSION=0
+ORCUS_MINOR_VERSION=19
+ORCUS_MICRO_VERSION=2
+
+
+
+
+
+
+echo "$as_me: this is boost.m4 serial 27" >&5
+boost_save_IFS=$IFS
+boost_version_req=1.36
+IFS=.
+set x $boost_version_req 0 0 0
+IFS=$boost_save_IFS
+shift
+boost_version_req=`expr "$1" '*' 100000 + "$2" '*' 100 + "$3"`
+boost_version_req_string=$1.$2.$3
+
+# Check whether --with-boost was given.
+if test ${with_boost+y}
+then :
+ withval=$with_boost;
+fi
+# If BOOST_ROOT is set and the user has not provided a value to
+# --with-boost, then treat BOOST_ROOT as if it the user supplied it.
+if test x"$BOOST_ROOT" != x; then
+ if test x"$with_boost" = x; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Detected BOOST_ROOT; continuing with --with-boost=$BOOST_ROOT" >&5
+printf "%s\n" "$as_me: Detected BOOST_ROOT; continuing with --with-boost=$BOOST_ROOT" >&6;}
+ with_boost=$BOOST_ROOT
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Detected BOOST_ROOT=$BOOST_ROOT, but overridden by --with-boost=$with_boost" >&5
+printf "%s\n" "$as_me: Detected BOOST_ROOT=$BOOST_ROOT, but overridden by --with-boost=$with_boost" >&6;}
+ fi
+fi
+DISTCHECK_CONFIGURE_FLAGS="$DISTCHECK_CONFIGURE_FLAGS '--with-boost=$with_boost'"
+boost_save_CPPFLAGS=$CPPFLAGS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Boost headers version >= $boost_version_req_string" >&5
+printf %s "checking for Boost headers version >= $boost_version_req_string... " >&6; }
+if test ${boost_cv_inc_path+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ boost_cv_inc_path=no
+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
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <boost/version.hpp>
+#if !defined BOOST_VERSION
+# error BOOST_VERSION is not defined
+#elif BOOST_VERSION < $boost_version_req
+# error Boost headers version < $boost_version_req
+#endif
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ # If the user provided a value to --with-boost, use it and only it.
+ case $with_boost in #(
+ ''|yes) set x '' /opt/local/include /usr/local/include /opt/include \
+ /usr/include C:/Boost/include;; #(
+ *) set x "$with_boost/include" "$with_boost";;
+ esac
+ shift
+ for boost_dir
+ do
+ # Without --layout=system, Boost (or at least some versions) installs
+ # itself in <prefix>/include/boost-<version>. This inner loop helps to
+ # find headers in such directories.
+ #
+ # Any ${boost_dir}/boost-x_xx directories are searched in reverse version
+ # order followed by ${boost_dir}. The final '.' is a sentinel for
+ # searching $boost_dir" itself. Entries are whitespace separated.
+ #
+ # I didn't indent this loop on purpose (to avoid over-indented code)
+ boost_layout_system_search_list=`cd "$boost_dir" 2>/dev/null \
+ && ls -1 | "${GREP}" '^boost-' | sort -rn -t- -k2 \
+ && echo .`
+ for boost_inc in $boost_layout_system_search_list
+ do
+ if test x"$boost_inc" != x.; then
+ boost_inc="$boost_dir/$boost_inc"
+ else
+ boost_inc="$boost_dir" # Uses sentinel in boost_layout_system_search_list
+ fi
+ if test x"$boost_inc" != x; then
+ # We are going to check whether the version of Boost installed
+ # in $boost_inc is usable by running a compilation that
+ # #includes it. But if we pass a -I/some/path in which Boost
+ # is not installed, the compiler will just skip this -I and
+ # use other locations (either from CPPFLAGS, or from its list
+ # of system include directories). As a result we would use
+ # header installed on the machine instead of the /some/path
+ # specified by the user. So in that precise case (trying
+ # $boost_inc), make sure the version.hpp exists.
+ #
+ # Use test -e as there can be symlinks.
+ test -e "$boost_inc/boost/version.hpp" || continue
+ CPPFLAGS="$CPPFLAGS -I$boost_inc"
+ fi
+ if ac_fn_cxx_try_compile "$LINENO"
+then :
+ boost_cv_inc_path=yes
+else $as_nop
+ boost_cv_version=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ if test x"$boost_cv_inc_path" = xyes; then
+ if test x"$boost_inc" != x; then
+ boost_cv_inc_path=$boost_inc
+ fi
+ break 2
+ fi
+ done
+ done
+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
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $boost_cv_inc_path" >&5
+printf "%s\n" "$boost_cv_inc_path" >&6; }
+ case $boost_cv_inc_path in #(
+ no)
+ boost_errmsg="cannot find Boost headers version >= $boost_version_req_string"
+ as_fn_error $? "$boost_errmsg" "$LINENO" 5
+
+ ;;#(
+ yes)
+ BOOST_CPPFLAGS=
+ ;;#(
+ *)
+ BOOST_CPPFLAGS="-I$boost_cv_inc_path"
+ ;;
+ esac
+ if test x"$boost_cv_inc_path" != xno; then
+
+printf "%s\n" "#define HAVE_BOOST 1" >>confdefs.h
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Boost's header version" >&5
+printf %s "checking for Boost's header version... " >&6; }
+if test ${boost_cv_lib_version+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <boost/version.hpp>
+boost-lib-version = BOOST_LIB_VERSION
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ grep -v '#' |
+ grep -v '^[[:space:]]*$' |
+ tr -d '\r' |
+ tr -s '\n' ' ' |
+ $SED -n -e "/^boost-lib-version = /{s///;s/[\" ]//g;p;q;}" >conftest.i 2>&1
+then :
+ boost_cv_lib_version=`cat conftest.i`
+fi
+rm -rf conftest*
+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
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $boost_cv_lib_version" >&5
+printf "%s\n" "$boost_cv_lib_version" >&6; }
+ # e.g. "134" for 1_34_1 or "135" for 1_35
+ boost_major_version=`echo "$boost_cv_lib_version" | sed 's/_//;s/_.*//'`
+ case $boost_major_version in #(
+ '' | *[!0-9]*)
+ as_fn_error $? "invalid value: boost_major_version='$boost_major_version'" "$LINENO" 5
+ ;;
+ esac
+fi
+CPPFLAGS=$boost_save_CPPFLAGS
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the toolset name used by Boost for $CXX" >&5
+printf %s "checking for the toolset name used by Boost for $CXX... " >&6; }
+if test ${boost_cv_lib_tag+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ boost_cv_lib_tag=unknown
+if test x$boost_cv_inc_path != xno; 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
+ # The following tests are mostly inspired by boost/config/auto_link.hpp
+ # The list is sorted to most recent/common to oldest compiler (in order
+ # to increase the likelihood of finding the right compiler with the
+ # least number of compilation attempt).
+ # Beware that some tests are sensible to the order (for instance, we must
+ # look for MinGW before looking for GCC3).
+ # I used one compilation test per compiler with a #error to recognize
+ # each compiler so that it works even when cross-compiling (let me know
+ # if you know a better approach).
+ # Known missing tags (known from Boost's tools/build/v2/tools/common.jam):
+ # como, edg, kcc, bck, mp, sw, tru, xlc
+ # I'm not sure about my test for `il' (be careful: Intel's ICC pre-defines
+ # the same defines as GCC's).
+ for i in \
+ "defined __GNUC__ && __GNUC__ == 8 && __GNUC_MINOR__ == 2 && !defined __ICC && \
+ (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \
+ || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw82" \
+ "defined __GNUC__ && __GNUC__ == 8 && __GNUC_MINOR__ == 2 && !defined __ICC @ gcc82" \
+ "defined __GNUC__ && __GNUC__ == 8 && __GNUC_MINOR__ == 1 && !defined __ICC && \
+ (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \
+ || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw81" \
+ "defined __GNUC__ && __GNUC__ == 8 && __GNUC_MINOR__ == 1 && !defined __ICC @ gcc81" \
+ "defined __GNUC__ && __GNUC__ == 8 && __GNUC_MINOR__ == 0 && !defined __ICC && \
+ (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \
+ || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw80" \
+ "defined __GNUC__ && __GNUC__ == 8 && __GNUC_MINOR__ == 0 && !defined __ICC @ gcc80" \
+ "defined __GNUC__ && __GNUC__ == 7 && __GNUC_MINOR__ == 3 && !defined __ICC && \
+ (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \
+ || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw73" \
+ "defined __GNUC__ && __GNUC__ == 7 && __GNUC_MINOR__ == 3 && !defined __ICC @ gcc73" \
+ "defined __GNUC__ && __GNUC__ == 7 && __GNUC_MINOR__ == 2 && !defined __ICC && \
+ (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \
+ || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw72" \
+ "defined __GNUC__ && __GNUC__ == 7 && __GNUC_MINOR__ == 2 && !defined __ICC @ gcc72" \
+ "defined __GNUC__ && __GNUC__ == 7 && __GNUC_MINOR__ == 1 && !defined __ICC && \
+ (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \
+ || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw71" \
+ "defined __GNUC__ && __GNUC__ == 7 && __GNUC_MINOR__ == 1 && !defined __ICC @ gcc71" \
+ "defined __GNUC__ && __GNUC__ == 7 && __GNUC_MINOR__ == 0 && !defined __ICC && \
+ (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \
+ || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw70" \
+ "defined __GNUC__ && __GNUC__ == 7 && __GNUC_MINOR__ == 0 && !defined __ICC @ gcc70" \
+ "defined __GNUC__ && __GNUC__ == 6 && __GNUC_MINOR__ == 4 && !defined __ICC && \
+ (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \
+ || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw64" \
+ "defined __GNUC__ && __GNUC__ == 6 && __GNUC_MINOR__ == 4 && !defined __ICC @ gcc64" \
+ "defined __GNUC__ && __GNUC__ == 6 && __GNUC_MINOR__ == 3 && !defined __ICC && \
+ (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \
+ || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw63" \
+ "defined __GNUC__ && __GNUC__ == 6 && __GNUC_MINOR__ == 3 && !defined __ICC @ gcc63" \
+ "defined __GNUC__ && __GNUC__ == 6 && __GNUC_MINOR__ == 2 && !defined __ICC && \
+ (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \
+ || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw62" \
+ "defined __GNUC__ && __GNUC__ == 6 && __GNUC_MINOR__ == 2 && !defined __ICC @ gcc62" \
+ "defined __GNUC__ && __GNUC__ == 6 && __GNUC_MINOR__ == 1 && !defined __ICC && \
+ (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \
+ || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw61" \
+ "defined __GNUC__ && __GNUC__ == 6 && __GNUC_MINOR__ == 1 && !defined __ICC @ gcc61" \
+ "defined __GNUC__ && __GNUC__ == 6 && __GNUC_MINOR__ == 0 && !defined __ICC && \
+ (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \
+ || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw60" \
+ "defined __GNUC__ && __GNUC__ == 6 && __GNUC_MINOR__ == 0 && !defined __ICC @ gcc60" \
+ "defined __GNUC__ && __GNUC__ == 5 && __GNUC_MINOR__ == 5 && !defined __ICC && \
+ (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \
+ || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw55" \
+ "defined __GNUC__ && __GNUC__ == 5 && __GNUC_MINOR__ == 5 && !defined __ICC @ gcc55" \
+ "defined __GNUC__ && __GNUC__ == 5 && __GNUC_MINOR__ == 4 && !defined __ICC && \
+ (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \
+ || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw54" \
+ "defined __GNUC__ && __GNUC__ == 5 && __GNUC_MINOR__ == 4 && !defined __ICC @ gcc54" \
+ "defined __GNUC__ && __GNUC__ == 5 && __GNUC_MINOR__ == 3 && !defined __ICC && \
+ (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \
+ || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw53" \
+ "defined __GNUC__ && __GNUC__ == 5 && __GNUC_MINOR__ == 3 && !defined __ICC @ gcc53" \
+ "defined __GNUC__ && __GNUC__ == 5 && __GNUC_MINOR__ == 2 && !defined __ICC && \
+ (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \
+ || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw52" \
+ "defined __GNUC__ && __GNUC__ == 5 && __GNUC_MINOR__ == 2 && !defined __ICC @ gcc52" \
+ "defined __GNUC__ && __GNUC__ == 5 && __GNUC_MINOR__ == 1 && !defined __ICC && \
+ (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \
+ || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw51" \
+ "defined __GNUC__ && __GNUC__ == 5 && __GNUC_MINOR__ == 1 && !defined __ICC @ gcc51" \
+ "defined __GNUC__ && __GNUC__ == 5 && __GNUC_MINOR__ == 0 && !defined __ICC && \
+ (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \
+ || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw50" \
+ "defined __GNUC__ && __GNUC__ == 5 && __GNUC_MINOR__ == 0 && !defined __ICC @ gcc50" \
+ "defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ == 10 && !defined __ICC && \
+ (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \
+ || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw410" \
+ "defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ == 10 && !defined __ICC @ gcc410" \
+ "defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ == 9 && !defined __ICC && \
+ (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \
+ || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw49" \
+ "defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ == 9 && !defined __ICC @ gcc49" \
+ "defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ == 8 && !defined __ICC && \
+ (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \
+ || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw48" \
+ "defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ == 8 && !defined __ICC @ gcc48" \
+ "defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ == 7 && !defined __ICC && \
+ (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \
+ || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw47" \
+ "defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ == 7 && !defined __ICC @ gcc47" \
+ "defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ == 6 && !defined __ICC && \
+ (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \
+ || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw46" \
+ "defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ == 6 && !defined __ICC @ gcc46" \
+ "defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ == 5 && !defined __ICC && \
+ (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \
+ || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw45" \
+ "defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ == 5 && !defined __ICC @ gcc45" \
+ "defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ == 4 && !defined __ICC && \
+ (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \
+ || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw44" \
+ "defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ == 4 && !defined __ICC @ gcc44" \
+ "defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ == 3 && !defined __ICC && \
+ (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \
+ || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw43" \
+ "defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ == 3 && !defined __ICC @ gcc43" \
+ "defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ == 2 && !defined __ICC && \
+ (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \
+ || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw42" \
+ "defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ == 2 && !defined __ICC @ gcc42" \
+ "defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ == 1 && !defined __ICC && \
+ (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \
+ || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw41" \
+ "defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ == 1 && !defined __ICC @ gcc41" \
+ "defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ == 0 && !defined __ICC && \
+ (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \
+ || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw40" \
+ "defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ == 0 && !defined __ICC @ gcc40" \
+ "defined __GNUC__ && __GNUC__ == 3 && !defined __ICC \
+ && (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \
+ || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw" \
+ "defined __GNUC__ && __GNUC__ == 3 && __GNUC_MINOR__ == 4 && !defined __ICC @ gcc34" \
+ "defined __GNUC__ && __GNUC__ == 3 && __GNUC_MINOR__ == 3 && !defined __ICC @ gcc33" \
+ "defined _MSC_VER && _MSC_VER >= 1500 @ vc90" \
+ "defined _MSC_VER && _MSC_VER == 1400 @ vc80" \
+ "defined __GNUC__ && __GNUC__ == 3 && __GNUC_MINOR__ == 2 && !defined __ICC @ gcc32" \
+ "defined _MSC_VER && _MSC_VER == 1310 @ vc71" \
+ "defined __GNUC__ && __GNUC__ == 3 && __GNUC_MINOR__ == 1 && !defined __ICC @ gcc31" \
+ "defined __GNUC__ && __GNUC__ == 3 && __GNUC_MINOR__ == 0 && !defined __ICC @ gcc30" \
+ "defined __BORLANDC__ @ bcb" \
+ "defined __ICC && (defined __unix || defined ) @ il" \
+ "defined __ICL @ iw" \
+ "defined _MSC_VER && _MSC_VER == 1300 @ vc7" \
+ "defined __GNUC__ && __GNUC__ == 2 && __GNUC_MINOR__ == 95 && !defined __ICC @ gcc295" \
+ "defined __MWERKS__ && __MWERKS__ <= 0x32FF @ cw9" \
+ "defined _MSC_VER && _MSC_VER < 1300 && !defined UNDER_CE @ vc6" \
+ "defined _MSC_VER && _MSC_VER < 1300 && defined UNDER_CE @ evc4" \
+ "defined __MWERKS__ && __MWERKS__ <= 0x31FF @ cw8"
+ do
+ boost_tag_test=`expr "X$i" : 'X\([^@]*\) @ '`
+ boost_tag=`expr "X$i" : 'X[^@]* @ \(.*\)'`
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#if $boost_tag_test
+/* OK */
+#else
+# error $boost_tag_test
+#endif
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ boost_cv_lib_tag=$boost_tag; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ done
+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
+ case $boost_cv_lib_tag in #(
+ # Some newer (>= 1.35?) versions of Boost seem to only use "gcc" as opposed
+ # to "gcc41" for instance.
+ *-gcc | *'-gcc ') :;; #( Don't re-add -gcc: it's already in there.
+ gcc*)
+ boost_tag_x=
+ case $host_os in #(
+ darwin*)
+ if test $boost_major_version -ge 136; then
+ # The `x' added in r46793 of Boost.
+ boost_tag_x=x
+ fi;;
+ esac
+ # We can specify multiple tags in this variable because it's used by
+ # BOOST_FIND_LIB that does a `for tag in -$boost_cv_lib_tag' ...
+ boost_cv_lib_tag="$boost_tag_x$boost_cv_lib_tag -${boost_tag_x}gcc"
+ ;; #(
+ unknown)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: could not figure out which toolset name to use for $CXX" >&5
+printf "%s\n" "$as_me: WARNING: could not figure out which toolset name to use for $CXX" >&2;}
+ boost_cv_lib_tag=
+ ;;
+ esac
+fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $boost_cv_lib_tag" >&5
+printf "%s\n" "$boost_cv_lib_tag" >&6; }
+# Check whether --enable-static-boost was given.
+if test ${enable_static_boost+y}
+then :
+ enableval=$enable_static_boost; enable_static_boost=yes
+else $as_nop
+ enable_static_boost=no
+fi
+
+# Check whether we do better use `mt' even though we weren't ask to.
+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
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#if defined _REENTRANT || defined _MT || defined __MT__
+/* use -mt */
+#else
+# error MT not needed
+#endif
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ boost_guess_use_mt=:
+else $as_nop
+ boost_guess_use_mt=false
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+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 x"$boost_cv_inc_path" = xno; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Boost not available, not searching for the Boost system library" >&5
+printf "%s\n" "$as_me: Boost not available, not searching for the Boost system library" >&6;}
+else
+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 x"$boost_cv_inc_path" = xno; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Boost not available, not searching for boost/system/error_code.hpp" >&5
+printf "%s\n" "$as_me: Boost not available, not searching for boost/system/error_code.hpp" >&6;}
+else
+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
+boost_save_CPPFLAGS=$CPPFLAGS
+CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
+ac_fn_cxx_check_header_compile "$LINENO" "boost/system/error_code.hpp" "ac_cv_header_boost_system_error_code_hpp" "$ac_includes_default"
+if test "x$ac_cv_header_boost_system_error_code_hpp" = xyes
+then :
+
+printf "%s\n" "#define HAVE_BOOST_SYSTEM_ERROR_CODE_HPP 1" >>confdefs.h
+
+else $as_nop
+ as_fn_error $? "cannot find boost/system/error_code.hpp" "$LINENO" 5
+fi
+
+CPPFLAGS=$boost_save_CPPFLAGS
+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
+fi
+
+boost_save_CPPFLAGS=$CPPFLAGS
+CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the Boost system library" >&5
+printf %s "checking for the Boost system library... " >&6; }
+if test ${boost_cv_lib_system+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ boost_cv_lib_system=no
+ case "" in #(
+ (mt | mt-) boost_mt=-mt; boost_rtopt=;; #(
+ (mt* | mt-*) boost_mt=-mt; boost_rtopt=`expr "X" : 'Xmt-*\(.*\)'`;; #(
+ (*) boost_mt=; boost_rtopt=;;
+ esac
+ if test $enable_static_boost = yes; then
+ boost_rtopt="s$boost_rtopt"
+ fi
+ # Find the proper debug variant depending on what we've been asked to find.
+ case $boost_rtopt in #(
+ (*d*) boost_rt_d=$boost_rtopt;; #(
+ (*[sgpn]*) # Insert the `d' at the right place (in between `sg' and `pn')
+ boost_rt_d=`echo "$boost_rtopt" | sed 's/\(s*g*\)\(p*n*\)/\1\2/'`;; #(
+ (*) boost_rt_d='-d';;
+ esac
+ # If the PREFERRED-RT-OPT are not empty, prepend a `-'.
+ test -n "$boost_rtopt" && boost_rtopt="-$boost_rtopt"
+ $boost_guess_use_mt && boost_mt=-mt
+ # Look for the abs path the static archive.
+ # $libext is computed by Libtool but let's make sure it's non empty.
+ test -z "$libext" &&
+ as_fn_error $? "the libext variable is empty, did you invoke Libtool?" "$LINENO" 5
+ boost_save_ac_objext=$ac_objext
+ # Generate the test file.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <boost/system/error_code.hpp>
+
+int
+main (void)
+{
+boost::system::error_code e; e.clear();
+ ;
+ return 0;
+}
+_ACEOF
+ if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_objext=do_not_rm_me_plz
+else $as_nop
+ as_fn_error $? "cannot compile a test that uses Boost system" "$LINENO" 5
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ ac_objext=$boost_save_ac_objext
+ boost_failed_libs=
+# Don't bother to ident the following nested for loops, only the 2
+# innermost ones matter.
+for boost_lib_ in system; do
+for boost_tag_ in -$boost_cv_lib_tag ''; do
+for boost_ver_ in -$boost_cv_lib_version ''; do
+for boost_mt_ in $boost_mt -mt ''; do
+for boost_rtopt_ in $boost_rtopt '' -d; do
+ for boost_full_suffix in \
+ $boost_last_suffix \
+ x$boost_tag_$boost_mt_$boost_rtopt_$boost_ver_ \
+ x$boost_tag_$boost_rtopt_$boost_ver_ \
+ x$boost_tag_$boost_mt_$boost_ver_ \
+ x$boost_tag_$boost_ver_
+ do
+ boost_real_suffix=`echo "$boost_full_suffix" | sed 's/^x//'`
+ boost_lib="boost_$boost_lib_$boost_real_suffix"
+ # Avoid testing twice the same lib
+ case $boost_failed_libs in #(
+ (*@$boost_lib@*) continue;;
+ esac
+ # If with_boost is empty, we'll search in /lib first, which is not quite
+ # right so instead we'll try to a location based on where the headers are.
+ boost_tmp_lib=$with_boost
+ test x"$with_boost" = x && boost_tmp_lib=${boost_cv_inc_path%/include}
+ for boost_ldpath in "$boost_tmp_lib/lib" '' \
+ /opt/local/lib* /usr/local/lib* /opt/lib* /usr/lib* \
+ "$with_boost" C:/Boost/lib /lib*
+ do
+ # Don't waste time with directories that don't exist.
+ if test x"$boost_ldpath" != x && test ! -e "$boost_ldpath"; then
+ continue
+ fi
+ boost_save_LDFLAGS=$LDFLAGS
+ # Are we looking for a static library?
+ case $boost_ldpath:$boost_rtopt_ in #(
+ (*?*:*s*) # Yes (Non empty boost_ldpath + s in rt opt)
+ boost_cv_lib_system_LIBS="$boost_ldpath/lib$boost_lib.$libext"
+ test -e "$boost_cv_lib_system_LIBS" || continue;; #(
+ (*) # No: use -lboost_foo to find the shared library.
+ boost_cv_lib_system_LIBS="-l$boost_lib";;
+ esac
+ boost_save_LIBS=$LIBS
+ LIBS="$boost_cv_lib_system_LIBS $LIBS"
+ test x"$boost_ldpath" != x && LDFLAGS="$LDFLAGS -L$boost_ldpath"
+ rm -f conftest$ac_exeext
+boost_save_ac_ext=$ac_ext
+boost_use_source=:
+# If we already have a .o, re-use it. We change $ac_ext so that $ac_link
+# tries to link the existing object file instead of compiling from source.
+test -f conftest.$ac_objext && ac_ext=$ac_objext && boost_use_source=false &&
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: re-using the existing conftest.$ac_objext" >&5
+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\""
+printf "%s\n" "$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
+ printf "%s\n" "$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_executable_p conftest$ac_exeext
+ }
+then :
+ boost_cv_lib_system=yes
+else $as_nop
+ if $boost_use_source; then
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ fi
+ boost_cv_lib_system=no
+fi
+ac_objext=$boost_save_ac_objext
+ac_ext=$boost_save_ac_ext
+rm -f core conftest.err conftest_ipa8_conftest.oo \
+ conftest$ac_exeext
+ ac_objext=$boost_save_ac_objext
+ LDFLAGS=$boost_save_LDFLAGS
+ LIBS=$boost_save_LIBS
+ if test x"$boost_cv_lib_system" = xyes; then
+ # Check or used cached result of whether or not using -R or
+ # -rpath makes sense. Some implementations of ld, such as for
+ # Mac OSX, require -rpath but -R is the flag known to work on
+ # other systems. https://github.com/tsuna/boost.m4/issues/19
+ if test ${boost_cv_rpath_link_ldflag+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case $boost_ldpath in
+ '') # Nothing to do.
+ boost_cv_rpath_link_ldflag=
+ boost_rpath_link_ldflag_found=yes;;
+ *)
+ for boost_cv_rpath_link_ldflag in -Wl,-R, -Wl,-rpath,; do
+ LDFLAGS="$boost_save_LDFLAGS -L$boost_ldpath $boost_cv_rpath_link_ldflag$boost_ldpath"
+ LIBS="$boost_cv_lib_system_LIBS $boost_save_LIBS"
+ rm -f conftest$ac_exeext
+boost_save_ac_ext=$ac_ext
+boost_use_source=:
+# If we already have a .o, re-use it. We change $ac_ext so that $ac_link
+# tries to link the existing object file instead of compiling from source.
+test -f conftest.$ac_objext && ac_ext=$ac_objext && boost_use_source=false &&
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: re-using the existing conftest.$ac_objext" >&5
+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\""
+printf "%s\n" "$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
+ printf "%s\n" "$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_executable_p conftest$ac_exeext
+ }
+then :
+ boost_rpath_link_ldflag_found=yes
+ break
+else $as_nop
+ if $boost_use_source; then
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ fi
+ boost_rpath_link_ldflag_found=no
+fi
+ac_objext=$boost_save_ac_objext
+ac_ext=$boost_save_ac_ext
+rm -f core conftest.err conftest_ipa8_conftest.oo \
+ conftest$ac_exeext
+ done
+ ;;
+ esac
+ if test "x$boost_rpath_link_ldflag_found" != "xyes"
+then :
+ as_fn_error $? "Unable to determine whether to use -R or -rpath" "$LINENO" 5
+fi
+ LDFLAGS=$boost_save_LDFLAGS
+ LIBS=$boost_save_LIBS
+
+fi
+
+ test x"$boost_ldpath" != x &&
+ boost_cv_lib_system_LDFLAGS="-L$boost_ldpath $boost_cv_rpath_link_ldflag$boost_ldpath"
+ boost_cv_lib_system_LDPATH="$boost_ldpath"
+ boost_last_suffix="$boost_full_suffix"
+ break 7
+ else
+ boost_failed_libs="$boost_failed_libs@$boost_lib@"
+ fi
+ done
+ done
+done
+done
+done
+done
+done # boost_lib_
+rm -f conftest.$ac_objext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $boost_cv_lib_system" >&5
+printf "%s\n" "$boost_cv_lib_system" >&6; }
+case $boost_cv_lib_system in #(
+ (yes) printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+printf "%s\n" "#define HAVE_BOOST_SYSTEM 1" >>confdefs.h
+ BOOST_SYSTEM_LDFLAGS=$boost_cv_lib_system_LDFLAGS
+ BOOST_SYSTEM_LDPATH=$boost_cv_lib_system_LDPATH
+ BOOST_LDPATH=$boost_cv_lib_system_LDPATH
+ BOOST_SYSTEM_LIBS=$boost_cv_lib_system_LIBS
+ ;;
+ (no) printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ as_fn_error $? "cannot find flags to link with the Boost system library (libboost-system)" "$LINENO" 5
+ ;;
+esac
+CPPFLAGS=$boost_save_CPPFLAGS
+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
+fi
+
+
+
+if test "x$have_filesystem" != "xyes" -a "x$have_experimental_filesystem" != "xyes"
+then :
+
+ # Do we have to check for Boost.System? This link-time dependency was
+# added as of 1.35.0. If we have a version <1.35, we must not attempt to
+# find Boost.System as it didn't exist by then.
+if test $boost_major_version -ge 135; then
+ if test x"$boost_cv_inc_path" = xno; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Boost not available, not searching for the Boost system library" >&5
+printf "%s\n" "$as_me: Boost not available, not searching for the Boost system library" >&6;}
+else
+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 x"$boost_cv_inc_path" = xno; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Boost not available, not searching for boost/system/error_code.hpp" >&5
+printf "%s\n" "$as_me: Boost not available, not searching for boost/system/error_code.hpp" >&6;}
+else
+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
+boost_save_CPPFLAGS=$CPPFLAGS
+CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
+ac_fn_cxx_check_header_compile "$LINENO" "boost/system/error_code.hpp" "ac_cv_header_boost_system_error_code_hpp" "$ac_includes_default"
+if test "x$ac_cv_header_boost_system_error_code_hpp" = xyes
+then :
+
+printf "%s\n" "#define HAVE_BOOST_SYSTEM_ERROR_CODE_HPP 1" >>confdefs.h
+
+else $as_nop
+ as_fn_error $? "cannot find boost/system/error_code.hpp" "$LINENO" 5
+fi
+
+CPPFLAGS=$boost_save_CPPFLAGS
+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
+fi
+
+boost_save_CPPFLAGS=$CPPFLAGS
+CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the Boost system library" >&5
+printf %s "checking for the Boost system library... " >&6; }
+if test ${boost_cv_lib_system+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ boost_cv_lib_system=no
+ case "" in #(
+ (mt | mt-) boost_mt=-mt; boost_rtopt=;; #(
+ (mt* | mt-*) boost_mt=-mt; boost_rtopt=`expr "X" : 'Xmt-*\(.*\)'`;; #(
+ (*) boost_mt=; boost_rtopt=;;
+ esac
+ if test $enable_static_boost = yes; then
+ boost_rtopt="s$boost_rtopt"
+ fi
+ # Find the proper debug variant depending on what we've been asked to find.
+ case $boost_rtopt in #(
+ (*d*) boost_rt_d=$boost_rtopt;; #(
+ (*[sgpn]*) # Insert the `d' at the right place (in between `sg' and `pn')
+ boost_rt_d=`echo "$boost_rtopt" | sed 's/\(s*g*\)\(p*n*\)/\1\2/'`;; #(
+ (*) boost_rt_d='-d';;
+ esac
+ # If the PREFERRED-RT-OPT are not empty, prepend a `-'.
+ test -n "$boost_rtopt" && boost_rtopt="-$boost_rtopt"
+ $boost_guess_use_mt && boost_mt=-mt
+ # Look for the abs path the static archive.
+ # $libext is computed by Libtool but let's make sure it's non empty.
+ test -z "$libext" &&
+ as_fn_error $? "the libext variable is empty, did you invoke Libtool?" "$LINENO" 5
+ boost_save_ac_objext=$ac_objext
+ # Generate the test file.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <boost/system/error_code.hpp>
+
+int
+main (void)
+{
+boost::system::error_code e; e.clear();
+ ;
+ return 0;
+}
+_ACEOF
+ if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_objext=do_not_rm_me_plz
+else $as_nop
+ as_fn_error $? "cannot compile a test that uses Boost system" "$LINENO" 5
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ ac_objext=$boost_save_ac_objext
+ boost_failed_libs=
+# Don't bother to ident the following nested for loops, only the 2
+# innermost ones matter.
+for boost_lib_ in system; do
+for boost_tag_ in -$boost_cv_lib_tag ''; do
+for boost_ver_ in -$boost_cv_lib_version ''; do
+for boost_mt_ in $boost_mt -mt ''; do
+for boost_rtopt_ in $boost_rtopt '' -d; do
+ for boost_full_suffix in \
+ $boost_last_suffix \
+ x$boost_tag_$boost_mt_$boost_rtopt_$boost_ver_ \
+ x$boost_tag_$boost_rtopt_$boost_ver_ \
+ x$boost_tag_$boost_mt_$boost_ver_ \
+ x$boost_tag_$boost_ver_
+ do
+ boost_real_suffix=`echo "$boost_full_suffix" | sed 's/^x//'`
+ boost_lib="boost_$boost_lib_$boost_real_suffix"
+ # Avoid testing twice the same lib
+ case $boost_failed_libs in #(
+ (*@$boost_lib@*) continue;;
+ esac
+ # If with_boost is empty, we'll search in /lib first, which is not quite
+ # right so instead we'll try to a location based on where the headers are.
+ boost_tmp_lib=$with_boost
+ test x"$with_boost" = x && boost_tmp_lib=${boost_cv_inc_path%/include}
+ for boost_ldpath in "$boost_tmp_lib/lib" '' \
+ /opt/local/lib* /usr/local/lib* /opt/lib* /usr/lib* \
+ "$with_boost" C:/Boost/lib /lib*
+ do
+ # Don't waste time with directories that don't exist.
+ if test x"$boost_ldpath" != x && test ! -e "$boost_ldpath"; then
+ continue
+ fi
+ boost_save_LDFLAGS=$LDFLAGS
+ # Are we looking for a static library?
+ case $boost_ldpath:$boost_rtopt_ in #(
+ (*?*:*s*) # Yes (Non empty boost_ldpath + s in rt opt)
+ boost_cv_lib_system_LIBS="$boost_ldpath/lib$boost_lib.$libext"
+ test -e "$boost_cv_lib_system_LIBS" || continue;; #(
+ (*) # No: use -lboost_foo to find the shared library.
+ boost_cv_lib_system_LIBS="-l$boost_lib";;
+ esac
+ boost_save_LIBS=$LIBS
+ LIBS="$boost_cv_lib_system_LIBS $LIBS"
+ test x"$boost_ldpath" != x && LDFLAGS="$LDFLAGS -L$boost_ldpath"
+ rm -f conftest$ac_exeext
+boost_save_ac_ext=$ac_ext
+boost_use_source=:
+# If we already have a .o, re-use it. We change $ac_ext so that $ac_link
+# tries to link the existing object file instead of compiling from source.
+test -f conftest.$ac_objext && ac_ext=$ac_objext && boost_use_source=false &&
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: re-using the existing conftest.$ac_objext" >&5
+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\""
+printf "%s\n" "$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
+ printf "%s\n" "$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_executable_p conftest$ac_exeext
+ }
+then :
+ boost_cv_lib_system=yes
+else $as_nop
+ if $boost_use_source; then
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ fi
+ boost_cv_lib_system=no
+fi
+ac_objext=$boost_save_ac_objext
+ac_ext=$boost_save_ac_ext
+rm -f core conftest.err conftest_ipa8_conftest.oo \
+ conftest$ac_exeext
+ ac_objext=$boost_save_ac_objext
+ LDFLAGS=$boost_save_LDFLAGS
+ LIBS=$boost_save_LIBS
+ if test x"$boost_cv_lib_system" = xyes; then
+ # Check or used cached result of whether or not using -R or
+ # -rpath makes sense. Some implementations of ld, such as for
+ # Mac OSX, require -rpath but -R is the flag known to work on
+ # other systems. https://github.com/tsuna/boost.m4/issues/19
+ if test ${boost_cv_rpath_link_ldflag+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case $boost_ldpath in
+ '') # Nothing to do.
+ boost_cv_rpath_link_ldflag=
+ boost_rpath_link_ldflag_found=yes;;
+ *)
+ for boost_cv_rpath_link_ldflag in -Wl,-R, -Wl,-rpath,; do
+ LDFLAGS="$boost_save_LDFLAGS -L$boost_ldpath $boost_cv_rpath_link_ldflag$boost_ldpath"
+ LIBS="$boost_cv_lib_system_LIBS $boost_save_LIBS"
+ rm -f conftest$ac_exeext
+boost_save_ac_ext=$ac_ext
+boost_use_source=:
+# If we already have a .o, re-use it. We change $ac_ext so that $ac_link
+# tries to link the existing object file instead of compiling from source.
+test -f conftest.$ac_objext && ac_ext=$ac_objext && boost_use_source=false &&
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: re-using the existing conftest.$ac_objext" >&5
+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\""
+printf "%s\n" "$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
+ printf "%s\n" "$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_executable_p conftest$ac_exeext
+ }
+then :
+ boost_rpath_link_ldflag_found=yes
+ break
+else $as_nop
+ if $boost_use_source; then
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ fi
+ boost_rpath_link_ldflag_found=no
+fi
+ac_objext=$boost_save_ac_objext
+ac_ext=$boost_save_ac_ext
+rm -f core conftest.err conftest_ipa8_conftest.oo \
+ conftest$ac_exeext
+ done
+ ;;
+ esac
+ if test "x$boost_rpath_link_ldflag_found" != "xyes"
+then :
+ as_fn_error $? "Unable to determine whether to use -R or -rpath" "$LINENO" 5
+fi
+ LDFLAGS=$boost_save_LDFLAGS
+ LIBS=$boost_save_LIBS
+
+fi
+
+ test x"$boost_ldpath" != x &&
+ boost_cv_lib_system_LDFLAGS="-L$boost_ldpath $boost_cv_rpath_link_ldflag$boost_ldpath"
+ boost_cv_lib_system_LDPATH="$boost_ldpath"
+ boost_last_suffix="$boost_full_suffix"
+ break 7
+ else
+ boost_failed_libs="$boost_failed_libs@$boost_lib@"
+ fi
+ done
+ done
+done
+done
+done
+done
+done # boost_lib_
+rm -f conftest.$ac_objext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $boost_cv_lib_system" >&5
+printf "%s\n" "$boost_cv_lib_system" >&6; }
+case $boost_cv_lib_system in #(
+ (yes) printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+printf "%s\n" "#define HAVE_BOOST_SYSTEM 1" >>confdefs.h
+ BOOST_SYSTEM_LDFLAGS=$boost_cv_lib_system_LDFLAGS
+ BOOST_SYSTEM_LDPATH=$boost_cv_lib_system_LDPATH
+ BOOST_LDPATH=$boost_cv_lib_system_LDPATH
+ BOOST_SYSTEM_LIBS=$boost_cv_lib_system_LIBS
+ ;;
+ (no) printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ as_fn_error $? "cannot find flags to link with the Boost system library (libboost-system)" "$LINENO" 5
+ ;;
+esac
+CPPFLAGS=$boost_save_CPPFLAGS
+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
+fi
+
+
+
+fi # end of the Boost.System check.
+boost_filesystem_save_LIBS=$LIBS
+boost_filesystem_save_LDFLAGS=$LDFLAGS
+LIBS="$LIBS $BOOST_SYSTEM_LIBS"
+LDFLAGS="$LDFLAGS $BOOST_SYSTEM_LDFLAGS"
+if test x"$boost_cv_inc_path" = xno; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Boost not available, not searching for the Boost filesystem library" >&5
+printf "%s\n" "$as_me: Boost not available, not searching for the Boost filesystem library" >&6;}
+else
+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 x"$boost_cv_inc_path" = xno; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Boost not available, not searching for boost/filesystem/path.hpp" >&5
+printf "%s\n" "$as_me: Boost not available, not searching for boost/filesystem/path.hpp" >&6;}
+else
+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
+boost_save_CPPFLAGS=$CPPFLAGS
+CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
+ac_fn_cxx_check_header_compile "$LINENO" "boost/filesystem/path.hpp" "ac_cv_header_boost_filesystem_path_hpp" "$ac_includes_default"
+if test "x$ac_cv_header_boost_filesystem_path_hpp" = xyes
+then :
+
+printf "%s\n" "#define HAVE_BOOST_FILESYSTEM_PATH_HPP 1" >>confdefs.h
+
+else $as_nop
+ as_fn_error $? "cannot find boost/filesystem/path.hpp" "$LINENO" 5
+fi
+
+CPPFLAGS=$boost_save_CPPFLAGS
+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
+fi
+
+boost_save_CPPFLAGS=$CPPFLAGS
+CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the Boost filesystem library" >&5
+printf %s "checking for the Boost filesystem library... " >&6; }
+if test ${boost_cv_lib_filesystem+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ boost_cv_lib_filesystem=no
+ case "" in #(
+ (mt | mt-) boost_mt=-mt; boost_rtopt=;; #(
+ (mt* | mt-*) boost_mt=-mt; boost_rtopt=`expr "X" : 'Xmt-*\(.*\)'`;; #(
+ (*) boost_mt=; boost_rtopt=;;
+ esac
+ if test $enable_static_boost = yes; then
+ boost_rtopt="s$boost_rtopt"
+ fi
+ # Find the proper debug variant depending on what we've been asked to find.
+ case $boost_rtopt in #(
+ (*d*) boost_rt_d=$boost_rtopt;; #(
+ (*[sgpn]*) # Insert the `d' at the right place (in between `sg' and `pn')
+ boost_rt_d=`echo "$boost_rtopt" | sed 's/\(s*g*\)\(p*n*\)/\1\2/'`;; #(
+ (*) boost_rt_d='-d';;
+ esac
+ # If the PREFERRED-RT-OPT are not empty, prepend a `-'.
+ test -n "$boost_rtopt" && boost_rtopt="-$boost_rtopt"
+ $boost_guess_use_mt && boost_mt=-mt
+ # Look for the abs path the static archive.
+ # $libext is computed by Libtool but let's make sure it's non empty.
+ test -z "$libext" &&
+ as_fn_error $? "the libext variable is empty, did you invoke Libtool?" "$LINENO" 5
+ boost_save_ac_objext=$ac_objext
+ # Generate the test file.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <boost/filesystem/path.hpp>
+
+int
+main (void)
+{
+boost::filesystem::path p;
+ ;
+ return 0;
+}
+_ACEOF
+ if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_objext=do_not_rm_me_plz
+else $as_nop
+ as_fn_error $? "cannot compile a test that uses Boost filesystem" "$LINENO" 5
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ ac_objext=$boost_save_ac_objext
+ boost_failed_libs=
+# Don't bother to ident the following nested for loops, only the 2
+# innermost ones matter.
+for boost_lib_ in filesystem; do
+for boost_tag_ in -$boost_cv_lib_tag ''; do
+for boost_ver_ in -$boost_cv_lib_version ''; do
+for boost_mt_ in $boost_mt -mt ''; do
+for boost_rtopt_ in $boost_rtopt '' -d; do
+ for boost_full_suffix in \
+ $boost_last_suffix \
+ x$boost_tag_$boost_mt_$boost_rtopt_$boost_ver_ \
+ x$boost_tag_$boost_rtopt_$boost_ver_ \
+ x$boost_tag_$boost_mt_$boost_ver_ \
+ x$boost_tag_$boost_ver_
+ do
+ boost_real_suffix=`echo "$boost_full_suffix" | sed 's/^x//'`
+ boost_lib="boost_$boost_lib_$boost_real_suffix"
+ # Avoid testing twice the same lib
+ case $boost_failed_libs in #(
+ (*@$boost_lib@*) continue;;
+ esac
+ # If with_boost is empty, we'll search in /lib first, which is not quite
+ # right so instead we'll try to a location based on where the headers are.
+ boost_tmp_lib=$with_boost
+ test x"$with_boost" = x && boost_tmp_lib=${boost_cv_inc_path%/include}
+ for boost_ldpath in "$boost_tmp_lib/lib" '' \
+ /opt/local/lib* /usr/local/lib* /opt/lib* /usr/lib* \
+ "$with_boost" C:/Boost/lib /lib*
+ do
+ # Don't waste time with directories that don't exist.
+ if test x"$boost_ldpath" != x && test ! -e "$boost_ldpath"; then
+ continue
+ fi
+ boost_save_LDFLAGS=$LDFLAGS
+ # Are we looking for a static library?
+ case $boost_ldpath:$boost_rtopt_ in #(
+ (*?*:*s*) # Yes (Non empty boost_ldpath + s in rt opt)
+ boost_cv_lib_filesystem_LIBS="$boost_ldpath/lib$boost_lib.$libext"
+ test -e "$boost_cv_lib_filesystem_LIBS" || continue;; #(
+ (*) # No: use -lboost_foo to find the shared library.
+ boost_cv_lib_filesystem_LIBS="-l$boost_lib";;
+ esac
+ boost_save_LIBS=$LIBS
+ LIBS="$boost_cv_lib_filesystem_LIBS $LIBS"
+ test x"$boost_ldpath" != x && LDFLAGS="$LDFLAGS -L$boost_ldpath"
+ rm -f conftest$ac_exeext
+boost_save_ac_ext=$ac_ext
+boost_use_source=:
+# If we already have a .o, re-use it. We change $ac_ext so that $ac_link
+# tries to link the existing object file instead of compiling from source.
+test -f conftest.$ac_objext && ac_ext=$ac_objext && boost_use_source=false &&
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: re-using the existing conftest.$ac_objext" >&5
+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\""
+printf "%s\n" "$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
+ printf "%s\n" "$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_executable_p conftest$ac_exeext
+ }
+then :
+ boost_cv_lib_filesystem=yes
+else $as_nop
+ if $boost_use_source; then
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ fi
+ boost_cv_lib_filesystem=no
+fi
+ac_objext=$boost_save_ac_objext
+ac_ext=$boost_save_ac_ext
+rm -f core conftest.err conftest_ipa8_conftest.oo \
+ conftest$ac_exeext
+ ac_objext=$boost_save_ac_objext
+ LDFLAGS=$boost_save_LDFLAGS
+ LIBS=$boost_save_LIBS
+ if test x"$boost_cv_lib_filesystem" = xyes; then
+ # Check or used cached result of whether or not using -R or
+ # -rpath makes sense. Some implementations of ld, such as for
+ # Mac OSX, require -rpath but -R is the flag known to work on
+ # other systems. https://github.com/tsuna/boost.m4/issues/19
+ if test ${boost_cv_rpath_link_ldflag+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case $boost_ldpath in
+ '') # Nothing to do.
+ boost_cv_rpath_link_ldflag=
+ boost_rpath_link_ldflag_found=yes;;
+ *)
+ for boost_cv_rpath_link_ldflag in -Wl,-R, -Wl,-rpath,; do
+ LDFLAGS="$boost_save_LDFLAGS -L$boost_ldpath $boost_cv_rpath_link_ldflag$boost_ldpath"
+ LIBS="$boost_cv_lib_filesystem_LIBS $boost_save_LIBS"
+ rm -f conftest$ac_exeext
+boost_save_ac_ext=$ac_ext
+boost_use_source=:
+# If we already have a .o, re-use it. We change $ac_ext so that $ac_link
+# tries to link the existing object file instead of compiling from source.
+test -f conftest.$ac_objext && ac_ext=$ac_objext && boost_use_source=false &&
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: re-using the existing conftest.$ac_objext" >&5
+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\""
+printf "%s\n" "$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
+ printf "%s\n" "$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_executable_p conftest$ac_exeext
+ }
+then :
+ boost_rpath_link_ldflag_found=yes
+ break
+else $as_nop
+ if $boost_use_source; then
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ fi
+ boost_rpath_link_ldflag_found=no
+fi
+ac_objext=$boost_save_ac_objext
+ac_ext=$boost_save_ac_ext
+rm -f core conftest.err conftest_ipa8_conftest.oo \
+ conftest$ac_exeext
+ done
+ ;;
+ esac
+ if test "x$boost_rpath_link_ldflag_found" != "xyes"
+then :
+ as_fn_error $? "Unable to determine whether to use -R or -rpath" "$LINENO" 5
+fi
+ LDFLAGS=$boost_save_LDFLAGS
+ LIBS=$boost_save_LIBS
+
+fi
+
+ test x"$boost_ldpath" != x &&
+ boost_cv_lib_filesystem_LDFLAGS="-L$boost_ldpath $boost_cv_rpath_link_ldflag$boost_ldpath"
+ boost_cv_lib_filesystem_LDPATH="$boost_ldpath"
+ boost_last_suffix="$boost_full_suffix"
+ break 7
+ else
+ boost_failed_libs="$boost_failed_libs@$boost_lib@"
+ fi
+ done
+ done
+done
+done
+done
+done
+done # boost_lib_
+rm -f conftest.$ac_objext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $boost_cv_lib_filesystem" >&5
+printf "%s\n" "$boost_cv_lib_filesystem" >&6; }
+case $boost_cv_lib_filesystem in #(
+ (yes) printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+printf "%s\n" "#define HAVE_BOOST_FILESYSTEM 1" >>confdefs.h
+ BOOST_FILESYSTEM_LDFLAGS=$boost_cv_lib_filesystem_LDFLAGS
+ BOOST_FILESYSTEM_LDPATH=$boost_cv_lib_filesystem_LDPATH
+ BOOST_LDPATH=$boost_cv_lib_filesystem_LDPATH
+ BOOST_FILESYSTEM_LIBS=$boost_cv_lib_filesystem_LIBS
+ ;;
+ (no) printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ as_fn_error $? "cannot find flags to link with the Boost filesystem library (libboost-filesystem)" "$LINENO" 5
+ ;;
+esac
+CPPFLAGS=$boost_save_CPPFLAGS
+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
+fi
+
+if test $enable_static_boost = yes && test $boost_major_version -ge 135; then
+ BOOST_FILESYSTEM_LIBS="$BOOST_FILESYSTEM_LIBS $BOOST_SYSTEM_LIBS"
+fi
+LIBS=$boost_filesystem_save_LIBS
+LDFLAGS=$boost_filesystem_save_LDFLAGS
+
+
+
+fi
+
+# =========================================================
+# Determine if we are going to build static lib (for MinGW)
+# =========================================================
+ if test "$enable_shared" = no -a "$enable_static" = yes; then
+ HAVE_STATIC_LIB_TRUE=
+ HAVE_STATIC_LIB_FALSE='#'
+else
+ HAVE_STATIC_LIB_TRUE='#'
+ HAVE_STATIC_LIB_FALSE=
+fi
+
+
+# =====================
+# Development Utilities
+# =====================
+# Check whether --enable-debug-utils was given.
+if test ${enable_debug_utils+y}
+then :
+ enableval=$enable_debug_utils; enable_debug_utils="$enableval"
+else $as_nop
+ enable_debug_utils=no
+
+fi
+
+
+# =====
+# Debug
+# =====
+# Check whether --enable-debug was given.
+if test ${enable_debug+y}
+then :
+ enableval=$enable_debug; enable_debug="$enableval"
+else $as_nop
+ enable_debug=no
+
+fi
+
+if test "x$enable_debug" != "xno"
+then :
+
+ CXXFLAGS="$CXXFLAGS -g -O0"
+ enable_debug_utils=yes
+
+else $as_nop
+
+ CXXFLAGS="$CXXFLAGS -O2"
+
+printf "%s\n" "#define NDEBUG /**/" >>confdefs.h
+
+
+fi
+
+if test "x$enable_debug_utils" != "xno"
+then :
+
+ CXXFLAGS="$CXXFLAGS -g -D__ORCUS_DEBUG_UTILS -DMDDS_SORTED_STRING_MAP_DEBUG"
+
+fi
+
+# zlib is a hard requirement in liborcus-parser.
+
+pkg_failed=no
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for zlib" >&5
+printf %s "checking for zlib... " >&6; }
+
+if test -n "$ZLIB_CFLAGS"; then
+ pkg_cv_ZLIB_CFLAGS="$ZLIB_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"zlib\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "zlib") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_ZLIB_CFLAGS=`$PKG_CONFIG --cflags "zlib" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+if test -n "$ZLIB_LIBS"; then
+ pkg_cv_ZLIB_LIBS="$ZLIB_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"zlib\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "zlib") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_ZLIB_LIBS=`$PKG_CONFIG --libs "zlib" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ _pkg_short_errors_supported=yes
+else
+ _pkg_short_errors_supported=no
+fi
+ if test $_pkg_short_errors_supported = yes; then
+ ZLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "zlib" 2>&1`
+ else
+ ZLIB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "zlib" 2>&1`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$ZLIB_PKG_ERRORS" >&5
+
+ as_fn_error $? "Package requirements (zlib) were not met:
+
+$ZLIB_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables ZLIB_CFLAGS
+and ZLIB_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details." "$LINENO" 5
+elif test $pkg_failed = untried; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables ZLIB_CFLAGS
+and ZLIB_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ ZLIB_CFLAGS=$pkg_cv_ZLIB_CFLAGS
+ ZLIB_LIBS=$pkg_cv_ZLIB_LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+
+fi
+
+# ==============
+# tools (binary)
+# ==============
+
+# Check whether --with-tools was given.
+if test ${with_tools+y}
+then :
+ withval=$with_tools; with_tools="$withval"
+else $as_nop
+ with_tools=yes
+
+fi
+
+
+# ==================
+# ods filter support
+# ==================
+
+# Check whether --with-ods-filter was given.
+if test ${with_ods_filter+y}
+then :
+ withval=$with_ods_filter; with_ods_filter="$withval"
+else $as_nop
+ with_ods_filter=yes
+
+fi
+
+
+# ===================
+# xlsx filter support
+# ===================
+
+# Check whether --with-xlsx-filter was given.
+if test ${with_xlsx_filter+y}
+then :
+ withval=$with_xlsx_filter; with_xlsx_filter="$withval"
+else $as_nop
+ with_xlsx_filter=yes
+
+fi
+
+
+# ======================
+# xls xml filter support
+# ======================
+
+# Check whether --with-xls-xml-filter was given.
+if test ${with_xls_xml_filter+y}
+then :
+ withval=$with_xls_xml_filter; with_xls_xml_filter="$withval"
+else $as_nop
+ with_xls_xml_filter=yes
+
+fi
+
+
+# =======================
+# gnumeric filter support
+# =======================
+
+# Check whether --with-gnumeric-filter was given.
+if test ${with_gnumeric_filter+y}
+then :
+ withval=$with_gnumeric_filter; with_gnumeric_filter="$withval"
+else $as_nop
+ with_gnumeric_filter=yes
+
+fi
+
+
+# ======================
+# parquet filter support
+# ======================
+
+# Check whether --with-parquet-filter was given.
+if test ${with_parquet_filter+y}
+then :
+ withval=$with_parquet_filter; with_parquet_filter="$withval"
+else $as_nop
+ with_parquet_filter=no
+
+fi
+
+
+
+# Check whether --with-cpu-features was given.
+if test ${with_cpu_features+y}
+then :
+ withval=$with_cpu_features; with_cpu_features="$withval"
+else $as_nop
+ with_cpu_features=no
+
+fi
+
+
+
+# Check whether --with-benchmark was given.
+if test ${with_benchmark+y}
+then :
+ withval=$with_benchmark; with_benchmark="$withval"
+else $as_nop
+ with_benchmark=yes
+
+fi
+
+
+
+# Check whether --with-doc-example was given.
+if test ${with_doc_example+y}
+then :
+ withval=$with_doc_example; with_doc_example="$withval"
+else $as_nop
+ with_doc_example=no
+
+fi
+
+
+ if test "x$with_ods_filter" != "xno"; then
+ WITH_ODS_FILTER_TRUE=
+ WITH_ODS_FILTER_FALSE='#'
+else
+ WITH_ODS_FILTER_TRUE='#'
+ WITH_ODS_FILTER_FALSE=
+fi
+
+ if test "x$with_xlsx_filter" != "xno"; then
+ WITH_XLSX_FILTER_TRUE=
+ WITH_XLSX_FILTER_FALSE='#'
+else
+ WITH_XLSX_FILTER_TRUE='#'
+ WITH_XLSX_FILTER_FALSE=
+fi
+
+ if test "x$with_xls_xml_filter" != "xno"; then
+ WITH_XLS_XML_FILTER_TRUE=
+ WITH_XLS_XML_FILTER_FALSE='#'
+else
+ WITH_XLS_XML_FILTER_TRUE='#'
+ WITH_XLS_XML_FILTER_FALSE=
+fi
+
+ if test "x$with_gnumeric_filter" != "xno"; then
+ WITH_GNUMERIC_FILTER_TRUE=
+ WITH_GNUMERIC_FILTER_FALSE='#'
+else
+ WITH_GNUMERIC_FILTER_TRUE='#'
+ WITH_GNUMERIC_FILTER_FALSE=
+fi
+
+ if test "x$with_parquet_filter" != "xno"; then
+ WITH_PARQUET_FILTER_TRUE=
+ WITH_PARQUET_FILTER_FALSE='#'
+else
+ WITH_PARQUET_FILTER_TRUE='#'
+ WITH_PARQUET_FILTER_FALSE=
+fi
+
+ if test "x$with_tools" != "xno"; then
+ WITH_TOOLS_TRUE=
+ WITH_TOOLS_FALSE='#'
+else
+ WITH_TOOLS_TRUE='#'
+ WITH_TOOLS_FALSE=
+fi
+
+ if test "x$with_benchmark" != "xno"; then
+ WITH_BENCHMARK_TRUE=
+ WITH_BENCHMARK_FALSE='#'
+else
+ WITH_BENCHMARK_TRUE='#'
+ WITH_BENCHMARK_FALSE=
+fi
+
+ if test "x$with_doc_example" != "xno"; then
+ WITH_DOC_EXAMPLE_TRUE=
+ WITH_DOC_EXAMPLE_FALSE='#'
+else
+ WITH_DOC_EXAMPLE_TRUE='#'
+ WITH_DOC_EXAMPLE_FALSE=
+fi
+
+
+if test "x$with_ods_filter" != "xno"
+then :
+
+ CXXFLAGS="$CXXFLAGS -D__ORCUS_ODS"
+
+fi
+
+if test "x$with_xlsx_filter" != "xno"
+then :
+
+ CXXFLAGS="$CXXFLAGS -D__ORCUS_XLSX"
+
+fi
+
+if test "x$with_xls_xml_filter" != "xno"
+then :
+
+ CXXFLAGS="$CXXFLAGS -D__ORCUS_XLS_XML"
+
+fi
+
+if test "x$with_gnumeric_filter" != "xno"
+then :
+
+ CXXFLAGS="$CXXFLAGS -D__ORCUS_GNUMERIC"
+ if test x"$boost_cv_inc_path" = xno; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Boost not available, not searching for the Boost iostreams library" >&5
+printf "%s\n" "$as_me: Boost not available, not searching for the Boost iostreams library" >&6;}
+else
+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 x"$boost_cv_inc_path" = xno; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Boost not available, not searching for boost/iostreams/device/file_descriptor.hpp" >&5
+printf "%s\n" "$as_me: Boost not available, not searching for boost/iostreams/device/file_descriptor.hpp" >&6;}
+else
+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
+boost_save_CPPFLAGS=$CPPFLAGS
+CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
+ac_fn_cxx_check_header_compile "$LINENO" "boost/iostreams/device/file_descriptor.hpp" "ac_cv_header_boost_iostreams_device_file_descriptor_hpp" "$ac_includes_default"
+if test "x$ac_cv_header_boost_iostreams_device_file_descriptor_hpp" = xyes
+then :
+
+printf "%s\n" "#define HAVE_BOOST_IOSTREAMS_DEVICE_FILE_DESCRIPTOR_HPP 1" >>confdefs.h
+
+else $as_nop
+ as_fn_error $? "cannot find boost/iostreams/device/file_descriptor.hpp" "$LINENO" 5
+fi
+
+CPPFLAGS=$boost_save_CPPFLAGS
+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
+fi
+
+boost_save_CPPFLAGS=$CPPFLAGS
+CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the Boost iostreams library" >&5
+printf %s "checking for the Boost iostreams library... " >&6; }
+if test ${boost_cv_lib_iostreams+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ boost_cv_lib_iostreams=no
+ case "" in #(
+ (mt | mt-) boost_mt=-mt; boost_rtopt=;; #(
+ (mt* | mt-*) boost_mt=-mt; boost_rtopt=`expr "X" : 'Xmt-*\(.*\)'`;; #(
+ (*) boost_mt=; boost_rtopt=;;
+ esac
+ if test $enable_static_boost = yes; then
+ boost_rtopt="s$boost_rtopt"
+ fi
+ # Find the proper debug variant depending on what we've been asked to find.
+ case $boost_rtopt in #(
+ (*d*) boost_rt_d=$boost_rtopt;; #(
+ (*[sgpn]*) # Insert the `d' at the right place (in between `sg' and `pn')
+ boost_rt_d=`echo "$boost_rtopt" | sed 's/\(s*g*\)\(p*n*\)/\1\2/'`;; #(
+ (*) boost_rt_d='-d';;
+ esac
+ # If the PREFERRED-RT-OPT are not empty, prepend a `-'.
+ test -n "$boost_rtopt" && boost_rtopt="-$boost_rtopt"
+ $boost_guess_use_mt && boost_mt=-mt
+ # Look for the abs path the static archive.
+ # $libext is computed by Libtool but let's make sure it's non empty.
+ test -z "$libext" &&
+ as_fn_error $? "the libext variable is empty, did you invoke Libtool?" "$LINENO" 5
+ boost_save_ac_objext=$ac_objext
+ # Generate the test file.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <boost/iostreams/device/file_descriptor.hpp>
+
+int
+main (void)
+{
+boost::iostreams::file_descriptor fd; fd.close();
+ ;
+ return 0;
+}
+_ACEOF
+ if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_objext=do_not_rm_me_plz
+else $as_nop
+ as_fn_error $? "cannot compile a test that uses Boost iostreams" "$LINENO" 5
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ ac_objext=$boost_save_ac_objext
+ boost_failed_libs=
+# Don't bother to ident the following nested for loops, only the 2
+# innermost ones matter.
+for boost_lib_ in iostreams; do
+for boost_tag_ in -$boost_cv_lib_tag ''; do
+for boost_ver_ in -$boost_cv_lib_version ''; do
+for boost_mt_ in $boost_mt -mt ''; do
+for boost_rtopt_ in $boost_rtopt '' -d; do
+ for boost_full_suffix in \
+ $boost_last_suffix \
+ x$boost_tag_$boost_mt_$boost_rtopt_$boost_ver_ \
+ x$boost_tag_$boost_rtopt_$boost_ver_ \
+ x$boost_tag_$boost_mt_$boost_ver_ \
+ x$boost_tag_$boost_ver_
+ do
+ boost_real_suffix=`echo "$boost_full_suffix" | sed 's/^x//'`
+ boost_lib="boost_$boost_lib_$boost_real_suffix"
+ # Avoid testing twice the same lib
+ case $boost_failed_libs in #(
+ (*@$boost_lib@*) continue;;
+ esac
+ # If with_boost is empty, we'll search in /lib first, which is not quite
+ # right so instead we'll try to a location based on where the headers are.
+ boost_tmp_lib=$with_boost
+ test x"$with_boost" = x && boost_tmp_lib=${boost_cv_inc_path%/include}
+ for boost_ldpath in "$boost_tmp_lib/lib" '' \
+ /opt/local/lib* /usr/local/lib* /opt/lib* /usr/lib* \
+ "$with_boost" C:/Boost/lib /lib*
+ do
+ # Don't waste time with directories that don't exist.
+ if test x"$boost_ldpath" != x && test ! -e "$boost_ldpath"; then
+ continue
+ fi
+ boost_save_LDFLAGS=$LDFLAGS
+ # Are we looking for a static library?
+ case $boost_ldpath:$boost_rtopt_ in #(
+ (*?*:*s*) # Yes (Non empty boost_ldpath + s in rt opt)
+ boost_cv_lib_iostreams_LIBS="$boost_ldpath/lib$boost_lib.$libext"
+ test -e "$boost_cv_lib_iostreams_LIBS" || continue;; #(
+ (*) # No: use -lboost_foo to find the shared library.
+ boost_cv_lib_iostreams_LIBS="-l$boost_lib";;
+ esac
+ boost_save_LIBS=$LIBS
+ LIBS="$boost_cv_lib_iostreams_LIBS $LIBS"
+ test x"$boost_ldpath" != x && LDFLAGS="$LDFLAGS -L$boost_ldpath"
+ rm -f conftest$ac_exeext
+boost_save_ac_ext=$ac_ext
+boost_use_source=:
+# If we already have a .o, re-use it. We change $ac_ext so that $ac_link
+# tries to link the existing object file instead of compiling from source.
+test -f conftest.$ac_objext && ac_ext=$ac_objext && boost_use_source=false &&
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: re-using the existing conftest.$ac_objext" >&5
+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\""
+printf "%s\n" "$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
+ printf "%s\n" "$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_executable_p conftest$ac_exeext
+ }
+then :
+ boost_cv_lib_iostreams=yes
+else $as_nop
+ if $boost_use_source; then
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ fi
+ boost_cv_lib_iostreams=no
+fi
+ac_objext=$boost_save_ac_objext
+ac_ext=$boost_save_ac_ext
+rm -f core conftest.err conftest_ipa8_conftest.oo \
+ conftest$ac_exeext
+ ac_objext=$boost_save_ac_objext
+ LDFLAGS=$boost_save_LDFLAGS
+ LIBS=$boost_save_LIBS
+ if test x"$boost_cv_lib_iostreams" = xyes; then
+ # Check or used cached result of whether or not using -R or
+ # -rpath makes sense. Some implementations of ld, such as for
+ # Mac OSX, require -rpath but -R is the flag known to work on
+ # other systems. https://github.com/tsuna/boost.m4/issues/19
+ if test ${boost_cv_rpath_link_ldflag+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case $boost_ldpath in
+ '') # Nothing to do.
+ boost_cv_rpath_link_ldflag=
+ boost_rpath_link_ldflag_found=yes;;
+ *)
+ for boost_cv_rpath_link_ldflag in -Wl,-R, -Wl,-rpath,; do
+ LDFLAGS="$boost_save_LDFLAGS -L$boost_ldpath $boost_cv_rpath_link_ldflag$boost_ldpath"
+ LIBS="$boost_cv_lib_iostreams_LIBS $boost_save_LIBS"
+ rm -f conftest$ac_exeext
+boost_save_ac_ext=$ac_ext
+boost_use_source=:
+# If we already have a .o, re-use it. We change $ac_ext so that $ac_link
+# tries to link the existing object file instead of compiling from source.
+test -f conftest.$ac_objext && ac_ext=$ac_objext && boost_use_source=false &&
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: re-using the existing conftest.$ac_objext" >&5
+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\""
+printf "%s\n" "$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
+ printf "%s\n" "$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_executable_p conftest$ac_exeext
+ }
+then :
+ boost_rpath_link_ldflag_found=yes
+ break
+else $as_nop
+ if $boost_use_source; then
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ fi
+ boost_rpath_link_ldflag_found=no
+fi
+ac_objext=$boost_save_ac_objext
+ac_ext=$boost_save_ac_ext
+rm -f core conftest.err conftest_ipa8_conftest.oo \
+ conftest$ac_exeext
+ done
+ ;;
+ esac
+ if test "x$boost_rpath_link_ldflag_found" != "xyes"
+then :
+ as_fn_error $? "Unable to determine whether to use -R or -rpath" "$LINENO" 5
+fi
+ LDFLAGS=$boost_save_LDFLAGS
+ LIBS=$boost_save_LIBS
+
+fi
+
+ test x"$boost_ldpath" != x &&
+ boost_cv_lib_iostreams_LDFLAGS="-L$boost_ldpath $boost_cv_rpath_link_ldflag$boost_ldpath"
+ boost_cv_lib_iostreams_LDPATH="$boost_ldpath"
+ boost_last_suffix="$boost_full_suffix"
+ break 7
+ else
+ boost_failed_libs="$boost_failed_libs@$boost_lib@"
+ fi
+ done
+ done
+done
+done
+done
+done
+done # boost_lib_
+rm -f conftest.$ac_objext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $boost_cv_lib_iostreams" >&5
+printf "%s\n" "$boost_cv_lib_iostreams" >&6; }
+case $boost_cv_lib_iostreams in #(
+ (yes) printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+printf "%s\n" "#define HAVE_BOOST_IOSTREAMS 1" >>confdefs.h
+ BOOST_IOSTREAMS_LDFLAGS=$boost_cv_lib_iostreams_LDFLAGS
+ BOOST_IOSTREAMS_LDPATH=$boost_cv_lib_iostreams_LDPATH
+ BOOST_LDPATH=$boost_cv_lib_iostreams_LDPATH
+ BOOST_IOSTREAMS_LIBS=$boost_cv_lib_iostreams_LIBS
+ ;;
+ (no) printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ as_fn_error $? "cannot find flags to link with the Boost iostreams library (libboost-iostreams)" "$LINENO" 5
+ ;;
+esac
+CPPFLAGS=$boost_save_CPPFLAGS
+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
+fi
+
+
+
+
+fi
+
+if test "x$with_parquet_filter" != "xno"
+then :
+
+ CXXFLAGS="$CXXFLAGS -D__ORCUS_PARQUET"
+
+pkg_failed=no
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for parquet" >&5
+printf %s "checking for parquet... " >&6; }
+
+if test -n "$PARQUET_CFLAGS"; then
+ pkg_cv_PARQUET_CFLAGS="$PARQUET_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"parquet\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "parquet") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_PARQUET_CFLAGS=`$PKG_CONFIG --cflags "parquet" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+if test -n "$PARQUET_LIBS"; then
+ pkg_cv_PARQUET_LIBS="$PARQUET_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"parquet\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "parquet") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_PARQUET_LIBS=`$PKG_CONFIG --libs "parquet" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ _pkg_short_errors_supported=yes
+else
+ _pkg_short_errors_supported=no
+fi
+ if test $_pkg_short_errors_supported = yes; then
+ PARQUET_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "parquet" 2>&1`
+ else
+ PARQUET_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "parquet" 2>&1`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$PARQUET_PKG_ERRORS" >&5
+
+ as_fn_error $? "Package requirements (parquet) were not met:
+
+$PARQUET_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables PARQUET_CFLAGS
+and PARQUET_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details." "$LINENO" 5
+elif test $pkg_failed = untried; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables PARQUET_CFLAGS
+and PARQUET_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ PARQUET_CFLAGS=$pkg_cv_PARQUET_CFLAGS
+ PARQUET_LIBS=$pkg_cv_PARQUET_LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+
+fi
+
+fi
+
+if test "x$with_cpu_features" != "xno"
+then :
+
+ CXXFLAGS="$CXXFLAGS -D__ORCUS_CPU_FEATURES"
+
+fi
+
+if test "x$with_tools" != "xno"
+then :
+
+ if test x"$boost_cv_inc_path" = xno; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Boost not available, not searching for the Boost program_options library" >&5
+printf "%s\n" "$as_me: Boost not available, not searching for the Boost program_options library" >&6;}
+else
+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 x"$boost_cv_inc_path" = xno; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Boost not available, not searching for boost/program_options.hpp" >&5
+printf "%s\n" "$as_me: Boost not available, not searching for boost/program_options.hpp" >&6;}
+else
+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
+boost_save_CPPFLAGS=$CPPFLAGS
+CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
+ac_fn_cxx_check_header_compile "$LINENO" "boost/program_options.hpp" "ac_cv_header_boost_program_options_hpp" "$ac_includes_default"
+if test "x$ac_cv_header_boost_program_options_hpp" = xyes
+then :
+
+printf "%s\n" "#define HAVE_BOOST_PROGRAM_OPTIONS_HPP 1" >>confdefs.h
+
+else $as_nop
+ as_fn_error $? "cannot find boost/program_options.hpp" "$LINENO" 5
+fi
+
+CPPFLAGS=$boost_save_CPPFLAGS
+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
+fi
+
+boost_save_CPPFLAGS=$CPPFLAGS
+CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the Boost program_options library" >&5
+printf %s "checking for the Boost program_options library... " >&6; }
+if test ${boost_cv_lib_program_options+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ boost_cv_lib_program_options=no
+ case "" in #(
+ (mt | mt-) boost_mt=-mt; boost_rtopt=;; #(
+ (mt* | mt-*) boost_mt=-mt; boost_rtopt=`expr "X" : 'Xmt-*\(.*\)'`;; #(
+ (*) boost_mt=; boost_rtopt=;;
+ esac
+ if test $enable_static_boost = yes; then
+ boost_rtopt="s$boost_rtopt"
+ fi
+ # Find the proper debug variant depending on what we've been asked to find.
+ case $boost_rtopt in #(
+ (*d*) boost_rt_d=$boost_rtopt;; #(
+ (*[sgpn]*) # Insert the `d' at the right place (in between `sg' and `pn')
+ boost_rt_d=`echo "$boost_rtopt" | sed 's/\(s*g*\)\(p*n*\)/\1\2/'`;; #(
+ (*) boost_rt_d='-d';;
+ esac
+ # If the PREFERRED-RT-OPT are not empty, prepend a `-'.
+ test -n "$boost_rtopt" && boost_rtopt="-$boost_rtopt"
+ $boost_guess_use_mt && boost_mt=-mt
+ # Look for the abs path the static archive.
+ # $libext is computed by Libtool but let's make sure it's non empty.
+ test -z "$libext" &&
+ as_fn_error $? "the libext variable is empty, did you invoke Libtool?" "$LINENO" 5
+ boost_save_ac_objext=$ac_objext
+ # Generate the test file.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <boost/program_options.hpp>
+
+int
+main (void)
+{
+boost::program_options::options_description d("test");
+ ;
+ return 0;
+}
+_ACEOF
+ if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_objext=do_not_rm_me_plz
+else $as_nop
+ as_fn_error $? "cannot compile a test that uses Boost program_options" "$LINENO" 5
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ ac_objext=$boost_save_ac_objext
+ boost_failed_libs=
+# Don't bother to ident the following nested for loops, only the 2
+# innermost ones matter.
+for boost_lib_ in program_options; do
+for boost_tag_ in -$boost_cv_lib_tag ''; do
+for boost_ver_ in -$boost_cv_lib_version ''; do
+for boost_mt_ in $boost_mt -mt ''; do
+for boost_rtopt_ in $boost_rtopt '' -d; do
+ for boost_full_suffix in \
+ $boost_last_suffix \
+ x$boost_tag_$boost_mt_$boost_rtopt_$boost_ver_ \
+ x$boost_tag_$boost_rtopt_$boost_ver_ \
+ x$boost_tag_$boost_mt_$boost_ver_ \
+ x$boost_tag_$boost_ver_
+ do
+ boost_real_suffix=`echo "$boost_full_suffix" | sed 's/^x//'`
+ boost_lib="boost_$boost_lib_$boost_real_suffix"
+ # Avoid testing twice the same lib
+ case $boost_failed_libs in #(
+ (*@$boost_lib@*) continue;;
+ esac
+ # If with_boost is empty, we'll search in /lib first, which is not quite
+ # right so instead we'll try to a location based on where the headers are.
+ boost_tmp_lib=$with_boost
+ test x"$with_boost" = x && boost_tmp_lib=${boost_cv_inc_path%/include}
+ for boost_ldpath in "$boost_tmp_lib/lib" '' \
+ /opt/local/lib* /usr/local/lib* /opt/lib* /usr/lib* \
+ "$with_boost" C:/Boost/lib /lib*
+ do
+ # Don't waste time with directories that don't exist.
+ if test x"$boost_ldpath" != x && test ! -e "$boost_ldpath"; then
+ continue
+ fi
+ boost_save_LDFLAGS=$LDFLAGS
+ # Are we looking for a static library?
+ case $boost_ldpath:$boost_rtopt_ in #(
+ (*?*:*s*) # Yes (Non empty boost_ldpath + s in rt opt)
+ boost_cv_lib_program_options_LIBS="$boost_ldpath/lib$boost_lib.$libext"
+ test -e "$boost_cv_lib_program_options_LIBS" || continue;; #(
+ (*) # No: use -lboost_foo to find the shared library.
+ boost_cv_lib_program_options_LIBS="-l$boost_lib";;
+ esac
+ boost_save_LIBS=$LIBS
+ LIBS="$boost_cv_lib_program_options_LIBS $LIBS"
+ test x"$boost_ldpath" != x && LDFLAGS="$LDFLAGS -L$boost_ldpath"
+ rm -f conftest$ac_exeext
+boost_save_ac_ext=$ac_ext
+boost_use_source=:
+# If we already have a .o, re-use it. We change $ac_ext so that $ac_link
+# tries to link the existing object file instead of compiling from source.
+test -f conftest.$ac_objext && ac_ext=$ac_objext && boost_use_source=false &&
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: re-using the existing conftest.$ac_objext" >&5
+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\""
+printf "%s\n" "$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
+ printf "%s\n" "$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_executable_p conftest$ac_exeext
+ }
+then :
+ boost_cv_lib_program_options=yes
+else $as_nop
+ if $boost_use_source; then
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ fi
+ boost_cv_lib_program_options=no
+fi
+ac_objext=$boost_save_ac_objext
+ac_ext=$boost_save_ac_ext
+rm -f core conftest.err conftest_ipa8_conftest.oo \
+ conftest$ac_exeext
+ ac_objext=$boost_save_ac_objext
+ LDFLAGS=$boost_save_LDFLAGS
+ LIBS=$boost_save_LIBS
+ if test x"$boost_cv_lib_program_options" = xyes; then
+ # Check or used cached result of whether or not using -R or
+ # -rpath makes sense. Some implementations of ld, such as for
+ # Mac OSX, require -rpath but -R is the flag known to work on
+ # other systems. https://github.com/tsuna/boost.m4/issues/19
+ if test ${boost_cv_rpath_link_ldflag+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case $boost_ldpath in
+ '') # Nothing to do.
+ boost_cv_rpath_link_ldflag=
+ boost_rpath_link_ldflag_found=yes;;
+ *)
+ for boost_cv_rpath_link_ldflag in -Wl,-R, -Wl,-rpath,; do
+ LDFLAGS="$boost_save_LDFLAGS -L$boost_ldpath $boost_cv_rpath_link_ldflag$boost_ldpath"
+ LIBS="$boost_cv_lib_program_options_LIBS $boost_save_LIBS"
+ rm -f conftest$ac_exeext
+boost_save_ac_ext=$ac_ext
+boost_use_source=:
+# If we already have a .o, re-use it. We change $ac_ext so that $ac_link
+# tries to link the existing object file instead of compiling from source.
+test -f conftest.$ac_objext && ac_ext=$ac_objext && boost_use_source=false &&
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: re-using the existing conftest.$ac_objext" >&5
+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\""
+printf "%s\n" "$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
+ printf "%s\n" "$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_executable_p conftest$ac_exeext
+ }
+then :
+ boost_rpath_link_ldflag_found=yes
+ break
+else $as_nop
+ if $boost_use_source; then
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ fi
+ boost_rpath_link_ldflag_found=no
+fi
+ac_objext=$boost_save_ac_objext
+ac_ext=$boost_save_ac_ext
+rm -f core conftest.err conftest_ipa8_conftest.oo \
+ conftest$ac_exeext
+ done
+ ;;
+ esac
+ if test "x$boost_rpath_link_ldflag_found" != "xyes"
+then :
+ as_fn_error $? "Unable to determine whether to use -R or -rpath" "$LINENO" 5
+fi
+ LDFLAGS=$boost_save_LDFLAGS
+ LIBS=$boost_save_LIBS
+
+fi
+
+ test x"$boost_ldpath" != x &&
+ boost_cv_lib_program_options_LDFLAGS="-L$boost_ldpath $boost_cv_rpath_link_ldflag$boost_ldpath"
+ boost_cv_lib_program_options_LDPATH="$boost_ldpath"
+ boost_last_suffix="$boost_full_suffix"
+ break 7
+ else
+ boost_failed_libs="$boost_failed_libs@$boost_lib@"
+ fi
+ done
+ done
+done
+done
+done
+done
+done # boost_lib_
+rm -f conftest.$ac_objext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $boost_cv_lib_program_options" >&5
+printf "%s\n" "$boost_cv_lib_program_options" >&6; }
+case $boost_cv_lib_program_options in #(
+ (yes) printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+printf "%s\n" "#define HAVE_BOOST_PROGRAM_OPTIONS 1" >>confdefs.h
+ BOOST_PROGRAM_OPTIONS_LDFLAGS=$boost_cv_lib_program_options_LDFLAGS
+ BOOST_PROGRAM_OPTIONS_LDPATH=$boost_cv_lib_program_options_LDPATH
+ BOOST_LDPATH=$boost_cv_lib_program_options_LDPATH
+ BOOST_PROGRAM_OPTIONS_LIBS=$boost_cv_lib_program_options_LIBS
+ ;;
+ (no) printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ as_fn_error $? "cannot find flags to link with the Boost program_options library (libboost-program_options)" "$LINENO" 5
+ ;;
+esac
+CPPFLAGS=$boost_save_CPPFLAGS
+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
+fi
+
+
+
+ if test x"$boost_cv_inc_path" = xno; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Boost not available, not searching for the Boost system library" >&5
+printf "%s\n" "$as_me: Boost not available, not searching for the Boost system library" >&6;}
+else
+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 x"$boost_cv_inc_path" = xno; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Boost not available, not searching for boost/system/error_code.hpp" >&5
+printf "%s\n" "$as_me: Boost not available, not searching for boost/system/error_code.hpp" >&6;}
+else
+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
+boost_save_CPPFLAGS=$CPPFLAGS
+CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
+ac_fn_cxx_check_header_compile "$LINENO" "boost/system/error_code.hpp" "ac_cv_header_boost_system_error_code_hpp" "$ac_includes_default"
+if test "x$ac_cv_header_boost_system_error_code_hpp" = xyes
+then :
+
+printf "%s\n" "#define HAVE_BOOST_SYSTEM_ERROR_CODE_HPP 1" >>confdefs.h
+
+else $as_nop
+ as_fn_error $? "cannot find boost/system/error_code.hpp" "$LINENO" 5
+fi
+
+CPPFLAGS=$boost_save_CPPFLAGS
+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
+fi
+
+boost_save_CPPFLAGS=$CPPFLAGS
+CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the Boost system library" >&5
+printf %s "checking for the Boost system library... " >&6; }
+if test ${boost_cv_lib_system+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ boost_cv_lib_system=no
+ case "" in #(
+ (mt | mt-) boost_mt=-mt; boost_rtopt=;; #(
+ (mt* | mt-*) boost_mt=-mt; boost_rtopt=`expr "X" : 'Xmt-*\(.*\)'`;; #(
+ (*) boost_mt=; boost_rtopt=;;
+ esac
+ if test $enable_static_boost = yes; then
+ boost_rtopt="s$boost_rtopt"
+ fi
+ # Find the proper debug variant depending on what we've been asked to find.
+ case $boost_rtopt in #(
+ (*d*) boost_rt_d=$boost_rtopt;; #(
+ (*[sgpn]*) # Insert the `d' at the right place (in between `sg' and `pn')
+ boost_rt_d=`echo "$boost_rtopt" | sed 's/\(s*g*\)\(p*n*\)/\1\2/'`;; #(
+ (*) boost_rt_d='-d';;
+ esac
+ # If the PREFERRED-RT-OPT are not empty, prepend a `-'.
+ test -n "$boost_rtopt" && boost_rtopt="-$boost_rtopt"
+ $boost_guess_use_mt && boost_mt=-mt
+ # Look for the abs path the static archive.
+ # $libext is computed by Libtool but let's make sure it's non empty.
+ test -z "$libext" &&
+ as_fn_error $? "the libext variable is empty, did you invoke Libtool?" "$LINENO" 5
+ boost_save_ac_objext=$ac_objext
+ # Generate the test file.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <boost/system/error_code.hpp>
+
+int
+main (void)
+{
+boost::system::error_code e; e.clear();
+ ;
+ return 0;
+}
+_ACEOF
+ if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_objext=do_not_rm_me_plz
+else $as_nop
+ as_fn_error $? "cannot compile a test that uses Boost system" "$LINENO" 5
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ ac_objext=$boost_save_ac_objext
+ boost_failed_libs=
+# Don't bother to ident the following nested for loops, only the 2
+# innermost ones matter.
+for boost_lib_ in system; do
+for boost_tag_ in -$boost_cv_lib_tag ''; do
+for boost_ver_ in -$boost_cv_lib_version ''; do
+for boost_mt_ in $boost_mt -mt ''; do
+for boost_rtopt_ in $boost_rtopt '' -d; do
+ for boost_full_suffix in \
+ $boost_last_suffix \
+ x$boost_tag_$boost_mt_$boost_rtopt_$boost_ver_ \
+ x$boost_tag_$boost_rtopt_$boost_ver_ \
+ x$boost_tag_$boost_mt_$boost_ver_ \
+ x$boost_tag_$boost_ver_
+ do
+ boost_real_suffix=`echo "$boost_full_suffix" | sed 's/^x//'`
+ boost_lib="boost_$boost_lib_$boost_real_suffix"
+ # Avoid testing twice the same lib
+ case $boost_failed_libs in #(
+ (*@$boost_lib@*) continue;;
+ esac
+ # If with_boost is empty, we'll search in /lib first, which is not quite
+ # right so instead we'll try to a location based on where the headers are.
+ boost_tmp_lib=$with_boost
+ test x"$with_boost" = x && boost_tmp_lib=${boost_cv_inc_path%/include}
+ for boost_ldpath in "$boost_tmp_lib/lib" '' \
+ /opt/local/lib* /usr/local/lib* /opt/lib* /usr/lib* \
+ "$with_boost" C:/Boost/lib /lib*
+ do
+ # Don't waste time with directories that don't exist.
+ if test x"$boost_ldpath" != x && test ! -e "$boost_ldpath"; then
+ continue
+ fi
+ boost_save_LDFLAGS=$LDFLAGS
+ # Are we looking for a static library?
+ case $boost_ldpath:$boost_rtopt_ in #(
+ (*?*:*s*) # Yes (Non empty boost_ldpath + s in rt opt)
+ boost_cv_lib_system_LIBS="$boost_ldpath/lib$boost_lib.$libext"
+ test -e "$boost_cv_lib_system_LIBS" || continue;; #(
+ (*) # No: use -lboost_foo to find the shared library.
+ boost_cv_lib_system_LIBS="-l$boost_lib";;
+ esac
+ boost_save_LIBS=$LIBS
+ LIBS="$boost_cv_lib_system_LIBS $LIBS"
+ test x"$boost_ldpath" != x && LDFLAGS="$LDFLAGS -L$boost_ldpath"
+ rm -f conftest$ac_exeext
+boost_save_ac_ext=$ac_ext
+boost_use_source=:
+# If we already have a .o, re-use it. We change $ac_ext so that $ac_link
+# tries to link the existing object file instead of compiling from source.
+test -f conftest.$ac_objext && ac_ext=$ac_objext && boost_use_source=false &&
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: re-using the existing conftest.$ac_objext" >&5
+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\""
+printf "%s\n" "$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
+ printf "%s\n" "$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_executable_p conftest$ac_exeext
+ }
+then :
+ boost_cv_lib_system=yes
+else $as_nop
+ if $boost_use_source; then
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ fi
+ boost_cv_lib_system=no
+fi
+ac_objext=$boost_save_ac_objext
+ac_ext=$boost_save_ac_ext
+rm -f core conftest.err conftest_ipa8_conftest.oo \
+ conftest$ac_exeext
+ ac_objext=$boost_save_ac_objext
+ LDFLAGS=$boost_save_LDFLAGS
+ LIBS=$boost_save_LIBS
+ if test x"$boost_cv_lib_system" = xyes; then
+ # Check or used cached result of whether or not using -R or
+ # -rpath makes sense. Some implementations of ld, such as for
+ # Mac OSX, require -rpath but -R is the flag known to work on
+ # other systems. https://github.com/tsuna/boost.m4/issues/19
+ if test ${boost_cv_rpath_link_ldflag+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case $boost_ldpath in
+ '') # Nothing to do.
+ boost_cv_rpath_link_ldflag=
+ boost_rpath_link_ldflag_found=yes;;
+ *)
+ for boost_cv_rpath_link_ldflag in -Wl,-R, -Wl,-rpath,; do
+ LDFLAGS="$boost_save_LDFLAGS -L$boost_ldpath $boost_cv_rpath_link_ldflag$boost_ldpath"
+ LIBS="$boost_cv_lib_system_LIBS $boost_save_LIBS"
+ rm -f conftest$ac_exeext
+boost_save_ac_ext=$ac_ext
+boost_use_source=:
+# If we already have a .o, re-use it. We change $ac_ext so that $ac_link
+# tries to link the existing object file instead of compiling from source.
+test -f conftest.$ac_objext && ac_ext=$ac_objext && boost_use_source=false &&
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: re-using the existing conftest.$ac_objext" >&5
+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\""
+printf "%s\n" "$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
+ printf "%s\n" "$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_executable_p conftest$ac_exeext
+ }
+then :
+ boost_rpath_link_ldflag_found=yes
+ break
+else $as_nop
+ if $boost_use_source; then
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ fi
+ boost_rpath_link_ldflag_found=no
+fi
+ac_objext=$boost_save_ac_objext
+ac_ext=$boost_save_ac_ext
+rm -f core conftest.err conftest_ipa8_conftest.oo \
+ conftest$ac_exeext
+ done
+ ;;
+ esac
+ if test "x$boost_rpath_link_ldflag_found" != "xyes"
+then :
+ as_fn_error $? "Unable to determine whether to use -R or -rpath" "$LINENO" 5
+fi
+ LDFLAGS=$boost_save_LDFLAGS
+ LIBS=$boost_save_LIBS
+
+fi
+
+ test x"$boost_ldpath" != x &&
+ boost_cv_lib_system_LDFLAGS="-L$boost_ldpath $boost_cv_rpath_link_ldflag$boost_ldpath"
+ boost_cv_lib_system_LDPATH="$boost_ldpath"
+ boost_last_suffix="$boost_full_suffix"
+ break 7
+ else
+ boost_failed_libs="$boost_failed_libs@$boost_lib@"
+ fi
+ done
+ done
+done
+done
+done
+done
+done # boost_lib_
+rm -f conftest.$ac_objext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $boost_cv_lib_system" >&5
+printf "%s\n" "$boost_cv_lib_system" >&6; }
+case $boost_cv_lib_system in #(
+ (yes) printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+printf "%s\n" "#define HAVE_BOOST_SYSTEM 1" >>confdefs.h
+ BOOST_SYSTEM_LDFLAGS=$boost_cv_lib_system_LDFLAGS
+ BOOST_SYSTEM_LDPATH=$boost_cv_lib_system_LDPATH
+ BOOST_LDPATH=$boost_cv_lib_system_LDPATH
+ BOOST_SYSTEM_LIBS=$boost_cv_lib_system_LIBS
+ ;;
+ (no) printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ as_fn_error $? "cannot find flags to link with the Boost system library (libboost-system)" "$LINENO" 5
+ ;;
+esac
+CPPFLAGS=$boost_save_CPPFLAGS
+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
+fi
+
+
+
+
+fi
+
+# ============
+# mdds support
+# ============
+
+pkg_failed=no
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for mdds-2.1 >= 2.1.1" >&5
+printf %s "checking for mdds-2.1 >= 2.1.1... " >&6; }
+
+if test -n "$MDDS_CFLAGS"; then
+ pkg_cv_MDDS_CFLAGS="$MDDS_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"mdds-2.1 >= 2.1.1\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "mdds-2.1 >= 2.1.1") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_MDDS_CFLAGS=`$PKG_CONFIG --cflags "mdds-2.1 >= 2.1.1" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+if test -n "$MDDS_LIBS"; then
+ pkg_cv_MDDS_LIBS="$MDDS_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"mdds-2.1 >= 2.1.1\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "mdds-2.1 >= 2.1.1") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_MDDS_LIBS=`$PKG_CONFIG --libs "mdds-2.1 >= 2.1.1" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ _pkg_short_errors_supported=yes
+else
+ _pkg_short_errors_supported=no
+fi
+ if test $_pkg_short_errors_supported = yes; then
+ MDDS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "mdds-2.1 >= 2.1.1" 2>&1`
+ else
+ MDDS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "mdds-2.1 >= 2.1.1" 2>&1`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$MDDS_PKG_ERRORS" >&5
+
+ as_fn_error $? "Package requirements (mdds-2.1 >= 2.1.1) were not met:
+
+$MDDS_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables MDDS_CFLAGS
+and MDDS_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details." "$LINENO" 5
+elif test $pkg_failed = untried; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables MDDS_CFLAGS
+and MDDS_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ MDDS_CFLAGS=$pkg_cv_MDDS_CFLAGS
+ MDDS_LIBS=$pkg_cv_MDDS_LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+
+fi
+CXXFLAGS="$CXXFLAGS $MDDS_CFLAGS"
+
+# =================
+# Spreadsheet model
+# =================
+# Check whether --enable-spreadsheet-model was given.
+if test ${enable_spreadsheet_model+y}
+then :
+ enableval=$enable_spreadsheet_model; enable_spreadsheet_model="$enableval"
+else $as_nop
+ enable_spreadsheet_model=yes
+
+fi
+
+if test "x$enable_spreadsheet_model" != "xno"
+then :
+
+
+pkg_failed=no
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libixion-$IXION_REQUIRED_API_VERSION >= 0.19.0" >&5
+printf %s "checking for libixion-$IXION_REQUIRED_API_VERSION >= 0.19.0... " >&6; }
+
+if test -n "$LIBIXION_CFLAGS"; then
+ pkg_cv_LIBIXION_CFLAGS="$LIBIXION_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libixion-\$IXION_REQUIRED_API_VERSION >= 0.19.0\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "libixion-$IXION_REQUIRED_API_VERSION >= 0.19.0") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_LIBIXION_CFLAGS=`$PKG_CONFIG --cflags "libixion-$IXION_REQUIRED_API_VERSION >= 0.19.0" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+if test -n "$LIBIXION_LIBS"; then
+ pkg_cv_LIBIXION_LIBS="$LIBIXION_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libixion-\$IXION_REQUIRED_API_VERSION >= 0.19.0\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "libixion-$IXION_REQUIRED_API_VERSION >= 0.19.0") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_LIBIXION_LIBS=`$PKG_CONFIG --libs "libixion-$IXION_REQUIRED_API_VERSION >= 0.19.0" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ _pkg_short_errors_supported=yes
+else
+ _pkg_short_errors_supported=no
+fi
+ if test $_pkg_short_errors_supported = yes; then
+ LIBIXION_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libixion-$IXION_REQUIRED_API_VERSION >= 0.19.0" 2>&1`
+ else
+ LIBIXION_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libixion-$IXION_REQUIRED_API_VERSION >= 0.19.0" 2>&1`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$LIBIXION_PKG_ERRORS" >&5
+
+ as_fn_error $? "Package requirements (libixion-$IXION_REQUIRED_API_VERSION >= 0.19.0) were not met:
+
+$LIBIXION_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables LIBIXION_CFLAGS
+and LIBIXION_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details." "$LINENO" 5
+elif test $pkg_failed = untried; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables LIBIXION_CFLAGS
+and LIBIXION_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ LIBIXION_CFLAGS=$pkg_cv_LIBIXION_CFLAGS
+ LIBIXION_LIBS=$pkg_cv_LIBIXION_LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+
+fi
+ CXXFLAGS="$CXXFLAGS -D__ORCUS_SPREADSHEET_MODEL"
+ if test x"$boost_cv_inc_path" = xno; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Boost not available, not searching for the Boost date_time library" >&5
+printf "%s\n" "$as_me: Boost not available, not searching for the Boost date_time library" >&6;}
+else
+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 x"$boost_cv_inc_path" = xno; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Boost not available, not searching for boost/date_time/posix_time/posix_time.hpp" >&5
+printf "%s\n" "$as_me: Boost not available, not searching for boost/date_time/posix_time/posix_time.hpp" >&6;}
+else
+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
+boost_save_CPPFLAGS=$CPPFLAGS
+CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
+ac_fn_cxx_check_header_compile "$LINENO" "boost/date_time/posix_time/posix_time.hpp" "ac_cv_header_boost_date_time_posix_time_posix_time_hpp" "$ac_includes_default"
+if test "x$ac_cv_header_boost_date_time_posix_time_posix_time_hpp" = xyes
+then :
+
+printf "%s\n" "#define HAVE_BOOST_DATE_TIME_POSIX_TIME_POSIX_TIME_HPP 1" >>confdefs.h
+
+else $as_nop
+ as_fn_error $? "cannot find boost/date_time/posix_time/posix_time.hpp" "$LINENO" 5
+fi
+
+CPPFLAGS=$boost_save_CPPFLAGS
+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
+fi
+
+boost_save_CPPFLAGS=$CPPFLAGS
+CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the Boost date_time library" >&5
+printf %s "checking for the Boost date_time library... " >&6; }
+if test ${boost_cv_lib_date_time+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ boost_cv_lib_date_time=no
+ case "" in #(
+ (mt | mt-) boost_mt=-mt; boost_rtopt=;; #(
+ (mt* | mt-*) boost_mt=-mt; boost_rtopt=`expr "X" : 'Xmt-*\(.*\)'`;; #(
+ (*) boost_mt=; boost_rtopt=;;
+ esac
+ if test $enable_static_boost = yes; then
+ boost_rtopt="s$boost_rtopt"
+ fi
+ # Find the proper debug variant depending on what we've been asked to find.
+ case $boost_rtopt in #(
+ (*d*) boost_rt_d=$boost_rtopt;; #(
+ (*[sgpn]*) # Insert the `d' at the right place (in between `sg' and `pn')
+ boost_rt_d=`echo "$boost_rtopt" | sed 's/\(s*g*\)\(p*n*\)/\1\2/'`;; #(
+ (*) boost_rt_d='-d';;
+ esac
+ # If the PREFERRED-RT-OPT are not empty, prepend a `-'.
+ test -n "$boost_rtopt" && boost_rtopt="-$boost_rtopt"
+ $boost_guess_use_mt && boost_mt=-mt
+ # Look for the abs path the static archive.
+ # $libext is computed by Libtool but let's make sure it's non empty.
+ test -z "$libext" &&
+ as_fn_error $? "the libext variable is empty, did you invoke Libtool?" "$LINENO" 5
+ boost_save_ac_objext=$ac_objext
+ # Generate the test file.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <boost/date_time/posix_time/posix_time.hpp>
+
+int
+main (void)
+{
+boost::posix_time::ptime t;
+ ;
+ return 0;
+}
+_ACEOF
+ if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_objext=do_not_rm_me_plz
+else $as_nop
+ as_fn_error $? "cannot compile a test that uses Boost date_time" "$LINENO" 5
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ ac_objext=$boost_save_ac_objext
+ boost_failed_libs=
+# Don't bother to ident the following nested for loops, only the 2
+# innermost ones matter.
+for boost_lib_ in date_time; do
+for boost_tag_ in -$boost_cv_lib_tag ''; do
+for boost_ver_ in -$boost_cv_lib_version ''; do
+for boost_mt_ in $boost_mt -mt ''; do
+for boost_rtopt_ in $boost_rtopt '' -d; do
+ for boost_full_suffix in \
+ $boost_last_suffix \
+ x$boost_tag_$boost_mt_$boost_rtopt_$boost_ver_ \
+ x$boost_tag_$boost_rtopt_$boost_ver_ \
+ x$boost_tag_$boost_mt_$boost_ver_ \
+ x$boost_tag_$boost_ver_
+ do
+ boost_real_suffix=`echo "$boost_full_suffix" | sed 's/^x//'`
+ boost_lib="boost_$boost_lib_$boost_real_suffix"
+ # Avoid testing twice the same lib
+ case $boost_failed_libs in #(
+ (*@$boost_lib@*) continue;;
+ esac
+ # If with_boost is empty, we'll search in /lib first, which is not quite
+ # right so instead we'll try to a location based on where the headers are.
+ boost_tmp_lib=$with_boost
+ test x"$with_boost" = x && boost_tmp_lib=${boost_cv_inc_path%/include}
+ for boost_ldpath in "$boost_tmp_lib/lib" '' \
+ /opt/local/lib* /usr/local/lib* /opt/lib* /usr/lib* \
+ "$with_boost" C:/Boost/lib /lib*
+ do
+ # Don't waste time with directories that don't exist.
+ if test x"$boost_ldpath" != x && test ! -e "$boost_ldpath"; then
+ continue
+ fi
+ boost_save_LDFLAGS=$LDFLAGS
+ # Are we looking for a static library?
+ case $boost_ldpath:$boost_rtopt_ in #(
+ (*?*:*s*) # Yes (Non empty boost_ldpath + s in rt opt)
+ boost_cv_lib_date_time_LIBS="$boost_ldpath/lib$boost_lib.$libext"
+ test -e "$boost_cv_lib_date_time_LIBS" || continue;; #(
+ (*) # No: use -lboost_foo to find the shared library.
+ boost_cv_lib_date_time_LIBS="-l$boost_lib";;
+ esac
+ boost_save_LIBS=$LIBS
+ LIBS="$boost_cv_lib_date_time_LIBS $LIBS"
+ test x"$boost_ldpath" != x && LDFLAGS="$LDFLAGS -L$boost_ldpath"
+ rm -f conftest$ac_exeext
+boost_save_ac_ext=$ac_ext
+boost_use_source=:
+# If we already have a .o, re-use it. We change $ac_ext so that $ac_link
+# tries to link the existing object file instead of compiling from source.
+test -f conftest.$ac_objext && ac_ext=$ac_objext && boost_use_source=false &&
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: re-using the existing conftest.$ac_objext" >&5
+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\""
+printf "%s\n" "$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
+ printf "%s\n" "$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_executable_p conftest$ac_exeext
+ }
+then :
+ boost_cv_lib_date_time=yes
+else $as_nop
+ if $boost_use_source; then
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ fi
+ boost_cv_lib_date_time=no
+fi
+ac_objext=$boost_save_ac_objext
+ac_ext=$boost_save_ac_ext
+rm -f core conftest.err conftest_ipa8_conftest.oo \
+ conftest$ac_exeext
+ ac_objext=$boost_save_ac_objext
+ LDFLAGS=$boost_save_LDFLAGS
+ LIBS=$boost_save_LIBS
+ if test x"$boost_cv_lib_date_time" = xyes; then
+ # Check or used cached result of whether or not using -R or
+ # -rpath makes sense. Some implementations of ld, such as for
+ # Mac OSX, require -rpath but -R is the flag known to work on
+ # other systems. https://github.com/tsuna/boost.m4/issues/19
+ if test ${boost_cv_rpath_link_ldflag+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case $boost_ldpath in
+ '') # Nothing to do.
+ boost_cv_rpath_link_ldflag=
+ boost_rpath_link_ldflag_found=yes;;
+ *)
+ for boost_cv_rpath_link_ldflag in -Wl,-R, -Wl,-rpath,; do
+ LDFLAGS="$boost_save_LDFLAGS -L$boost_ldpath $boost_cv_rpath_link_ldflag$boost_ldpath"
+ LIBS="$boost_cv_lib_date_time_LIBS $boost_save_LIBS"
+ rm -f conftest$ac_exeext
+boost_save_ac_ext=$ac_ext
+boost_use_source=:
+# If we already have a .o, re-use it. We change $ac_ext so that $ac_link
+# tries to link the existing object file instead of compiling from source.
+test -f conftest.$ac_objext && ac_ext=$ac_objext && boost_use_source=false &&
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: re-using the existing conftest.$ac_objext" >&5
+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\""
+printf "%s\n" "$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
+ printf "%s\n" "$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_executable_p conftest$ac_exeext
+ }
+then :
+ boost_rpath_link_ldflag_found=yes
+ break
+else $as_nop
+ if $boost_use_source; then
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ fi
+ boost_rpath_link_ldflag_found=no
+fi
+ac_objext=$boost_save_ac_objext
+ac_ext=$boost_save_ac_ext
+rm -f core conftest.err conftest_ipa8_conftest.oo \
+ conftest$ac_exeext
+ done
+ ;;
+ esac
+ if test "x$boost_rpath_link_ldflag_found" != "xyes"
+then :
+ as_fn_error $? "Unable to determine whether to use -R or -rpath" "$LINENO" 5
+fi
+ LDFLAGS=$boost_save_LDFLAGS
+ LIBS=$boost_save_LIBS
+
+fi
+
+ test x"$boost_ldpath" != x &&
+ boost_cv_lib_date_time_LDFLAGS="-L$boost_ldpath $boost_cv_rpath_link_ldflag$boost_ldpath"
+ boost_cv_lib_date_time_LDPATH="$boost_ldpath"
+ boost_last_suffix="$boost_full_suffix"
+ break 7
+ else
+ boost_failed_libs="$boost_failed_libs@$boost_lib@"
+ fi
+ done
+ done
+done
+done
+done
+done
+done # boost_lib_
+rm -f conftest.$ac_objext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $boost_cv_lib_date_time" >&5
+printf "%s\n" "$boost_cv_lib_date_time" >&6; }
+case $boost_cv_lib_date_time in #(
+ (yes) printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+printf "%s\n" "#define HAVE_BOOST_DATE_TIME 1" >>confdefs.h
+ BOOST_DATE_TIME_LDFLAGS=$boost_cv_lib_date_time_LDFLAGS
+ BOOST_DATE_TIME_LDPATH=$boost_cv_lib_date_time_LDPATH
+ BOOST_LDPATH=$boost_cv_lib_date_time_LDPATH
+ BOOST_DATE_TIME_LIBS=$boost_cv_lib_date_time_LIBS
+ ;;
+ (no) printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ as_fn_error $? "cannot find flags to link with the Boost date_time library (libboost-date_time)" "$LINENO" 5
+ ;;
+esac
+CPPFLAGS=$boost_save_CPPFLAGS
+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
+fi
+
+
+
+
+fi
+ if test "x$enable_spreadsheet_model" != "xno"; then
+ BUILD_SPREADSHEET_MODEL_TRUE=
+ BUILD_SPREADSHEET_MODEL_FALSE='#'
+else
+ BUILD_SPREADSHEET_MODEL_TRUE='#'
+ BUILD_SPREADSHEET_MODEL_FALSE=
+fi
+
+
+# ==============
+# Python support
+# ==============
+# Check whether --enable-python was given.
+if test ${enable_python+y}
+then :
+ enableval=$enable_python; enable_python="$enableval"
+else $as_nop
+ enable_python=yes
+
+fi
+
+
+# Check for python.
+if test "x$enable_python" != "xno"
+then :
+
+
+
+
+
+
+
+ if test -n "$PYTHON"; then
+ # If the user set $PYTHON, use it and don't search something else.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $PYTHON version is >= 3" >&5
+printf %s "checking whether $PYTHON version is >= 3... " >&6; }
+ prog="import sys
+# split strings by '.' and convert to numeric. Append some zeros
+# because we need at least 4 digits for the hex conversion.
+# map returns an iterator in Python 3.0 and a list in 2.x
+minver = list(map(int, '3'.split('.'))) + [0, 0, 0]
+minverhex = 0
+# xrange is not present in Python 3.0 and range returns an iterator
+for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[i]
+sys.exit(sys.hexversion < minverhex)"
+ if { echo "$as_me:$LINENO: $PYTHON -c "$prog"" >&5
+ ($PYTHON -c "$prog") >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ as_fn_error $? "Python interpreter is too old" "$LINENO" 5
+fi
+ am_display_PYTHON=$PYTHON
+ else
+ # Otherwise, try each interpreter until we find one that satisfies
+ # VERSION.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a Python interpreter with version >= 3" >&5
+printf %s "checking for a Python interpreter with version >= 3... " >&6; }
+if test ${am_cv_pathless_PYTHON+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ for am_cv_pathless_PYTHON in python python2 python3 python3.11 python3.10 python3.9 python3.8 python3.7 python3.6 python3.5 python3.4 python3.3 python3.2 python3.1 python3.0 python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 none; do
+ test "$am_cv_pathless_PYTHON" = none && break
+ prog="import sys
+# split strings by '.' and convert to numeric. Append some zeros
+# because we need at least 4 digits for the hex conversion.
+# map returns an iterator in Python 3.0 and a list in 2.x
+minver = list(map(int, '3'.split('.'))) + [0, 0, 0]
+minverhex = 0
+# xrange is not present in Python 3.0 and range returns an iterator
+for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[i]
+sys.exit(sys.hexversion < minverhex)"
+ if { echo "$as_me:$LINENO: $am_cv_pathless_PYTHON -c "$prog"" >&5
+ ($am_cv_pathless_PYTHON -c "$prog") >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+then :
+ break
+fi
+ done
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_pathless_PYTHON" >&5
+printf "%s\n" "$am_cv_pathless_PYTHON" >&6; }
+ # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON.
+ if test "$am_cv_pathless_PYTHON" = none; then
+ PYTHON=:
+ else
+ # Extract the first word of "$am_cv_pathless_PYTHON", so it can be a program name with args.
+set dummy $am_cv_pathless_PYTHON; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_PYTHON+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case $PYTHON in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_PYTHON="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+PYTHON=$ac_cv_path_PYTHON
+if test -n "$PYTHON"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5
+printf "%s\n" "$PYTHON" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ fi
+ am_display_PYTHON=$am_cv_pathless_PYTHON
+ fi
+
+
+ if test "$PYTHON" = :; then
+ as_fn_error $? "no suitable Python interpreter found" "$LINENO" 5
+ else
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON version" >&5
+printf %s "checking for $am_display_PYTHON version... " >&6; }
+if test ${am_cv_python_version+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ am_cv_python_version=`$PYTHON -c "import sys; print ('%u.%u' % sys.version_info[:2])"`
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_version" >&5
+printf "%s\n" "$am_cv_python_version" >&6; }
+ PYTHON_VERSION=$am_cv_python_version
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON platform" >&5
+printf %s "checking for $am_display_PYTHON platform... " >&6; }
+if test ${am_cv_python_platform+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"`
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_platform" >&5
+printf "%s\n" "$am_cv_python_platform" >&6; }
+ PYTHON_PLATFORM=$am_cv_python_platform
+
+
+ if test "x$prefix" = xNONE; then
+ am__usable_prefix=$ac_default_prefix
+ else
+ am__usable_prefix=$prefix
+ fi
+
+ # Allow user to request using sys.* values from Python,
+ # instead of the GNU $prefix values.
+
+# Check whether --with-python-sys-prefix was given.
+if test ${with_python_sys_prefix+y}
+then :
+ withval=$with_python_sys_prefix; am_use_python_sys=:
+else $as_nop
+ am_use_python_sys=false
+fi
+
+
+ # Allow user to override whatever the default Python prefix is.
+
+# Check whether --with-python_prefix was given.
+if test ${with_python_prefix+y}
+then :
+ withval=$with_python_prefix; am_python_prefix_subst=$withval
+ am_cv_python_prefix=$withval
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for explicit $am_display_PYTHON prefix" >&5
+printf %s "checking for explicit $am_display_PYTHON prefix... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_prefix" >&5
+printf "%s\n" "$am_cv_python_prefix" >&6; }
+else $as_nop
+
+ if $am_use_python_sys; then
+ # using python sys.prefix value, not GNU
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for python default $am_display_PYTHON prefix" >&5
+printf %s "checking for python default $am_display_PYTHON prefix... " >&6; }
+if test ${am_cv_python_prefix+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ am_cv_python_prefix=`$PYTHON -c "import sys; sys.stdout.write(sys.prefix)"`
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_prefix" >&5
+printf "%s\n" "$am_cv_python_prefix" >&6; }
+
+ case $am_cv_python_prefix in
+ $am__usable_prefix*)
+ am__strip_prefix=`echo "$am__usable_prefix" | sed 's|.|.|g'`
+ am_python_prefix_subst=`echo "$am_cv_python_prefix" | sed "s,^$am__strip_prefix,\\${prefix},"`
+ ;;
+ *)
+ am_python_prefix_subst=$am_cv_python_prefix
+ ;;
+ esac
+ else # using GNU prefix value, not python sys.prefix
+ am_python_prefix_subst='${prefix}'
+ am_python_prefix=$am_python_prefix_subst
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU default $am_display_PYTHON prefix" >&5
+printf %s "checking for GNU default $am_display_PYTHON prefix... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_python_prefix" >&5
+printf "%s\n" "$am_python_prefix" >&6; }
+ fi
+fi
+
+ # Substituting python_prefix_subst value.
+ PYTHON_PREFIX=$am_python_prefix_subst
+
+
+ # emacs-page Now do it all over again for Python exec_prefix, but with yet
+ # another conditional: fall back to regular prefix if that was specified.
+
+# Check whether --with-python_exec_prefix was given.
+if test ${with_python_exec_prefix+y}
+then :
+ withval=$with_python_exec_prefix; am_python_exec_prefix_subst=$withval
+ am_cv_python_exec_prefix=$withval
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for explicit $am_display_PYTHON exec_prefix" >&5
+printf %s "checking for explicit $am_display_PYTHON exec_prefix... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_exec_prefix" >&5
+printf "%s\n" "$am_cv_python_exec_prefix" >&6; }
+else $as_nop
+
+ # no explicit --with-python_exec_prefix, but if
+ # --with-python_prefix was given, use its value for python_exec_prefix too.
+ if test -n "$with_python_prefix"
+then :
+ am_python_exec_prefix_subst=$with_python_prefix
+ am_cv_python_exec_prefix=$with_python_prefix
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for python_prefix-given $am_display_PYTHON exec_prefix" >&5
+printf %s "checking for python_prefix-given $am_display_PYTHON exec_prefix... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_exec_prefix" >&5
+printf "%s\n" "$am_cv_python_exec_prefix" >&6; }
+else $as_nop
+
+ # Set am__usable_exec_prefix whether using GNU or Python values,
+ # since we use that variable for pyexecdir.
+ if test "x$exec_prefix" = xNONE; then
+ am__usable_exec_prefix=$am__usable_prefix
+ else
+ am__usable_exec_prefix=$exec_prefix
+ fi
+ #
+ if $am_use_python_sys; then # using python sys.exec_prefix, not GNU
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for python default $am_display_PYTHON exec_prefix" >&5
+printf %s "checking for python default $am_display_PYTHON exec_prefix... " >&6; }
+if test ${am_cv_python_exec_prefix+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ am_cv_python_exec_prefix=`$PYTHON -c "import sys; sys.stdout.write(sys.exec_prefix)"`
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_exec_prefix" >&5
+printf "%s\n" "$am_cv_python_exec_prefix" >&6; }
+ case $am_cv_python_exec_prefix in
+ $am__usable_exec_prefix*)
+ am__strip_prefix=`echo "$am__usable_exec_prefix" | sed 's|.|.|g'`
+ am_python_exec_prefix_subst=`echo "$am_cv_python_exec_prefix" | sed "s,^$am__strip_prefix,\\${exec_prefix},"`
+ ;;
+ *)
+ am_python_exec_prefix_subst=$am_cv_python_exec_prefix
+ ;;
+ esac
+ else # using GNU $exec_prefix, not python sys.exec_prefix
+ am_python_exec_prefix_subst='${exec_prefix}'
+ am_python_exec_prefix=$am_python_exec_prefix_subst
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU default $am_display_PYTHON exec_prefix" >&5
+printf %s "checking for GNU default $am_display_PYTHON exec_prefix... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_python_exec_prefix" >&5
+printf "%s\n" "$am_python_exec_prefix" >&6; }
+ fi
+fi
+fi
+
+ # Substituting python_exec_prefix_subst.
+ PYTHON_EXEC_PREFIX=$am_python_exec_prefix_subst
+
+
+ # Factor out some code duplication into this shell variable.
+ am_python_setup_sysconfig="\
+import sys
+# Prefer sysconfig over distutils.sysconfig, for better compatibility
+# with python 3.x. See automake bug#10227.
+try:
+ import sysconfig
+except ImportError:
+ can_use_sysconfig = 0
+else:
+ can_use_sysconfig = 1
+# Can't use sysconfig in CPython 2.7, since it's broken in virtualenvs:
+# <https://github.com/pypa/virtualenv/issues/118>
+try:
+ from platform import python_implementation
+ if python_implementation() == 'CPython' and sys.version[:3] == '2.7':
+ can_use_sysconfig = 0
+except ImportError:
+ pass"
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON script directory (pythondir)" >&5
+printf %s "checking for $am_display_PYTHON script directory (pythondir)... " >&6; }
+if test ${am_cv_python_pythondir+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "x$am_cv_python_prefix" = x; then
+ am_py_prefix=$am__usable_prefix
+ else
+ am_py_prefix=$am_cv_python_prefix
+ fi
+ am_cv_python_pythondir=`$PYTHON -c "
+$am_python_setup_sysconfig
+if can_use_sysconfig:
+ if hasattr(sysconfig, 'get_default_scheme'):
+ scheme = sysconfig.get_default_scheme()
+ else:
+ scheme = sysconfig._get_default_scheme()
+ if scheme == 'posix_local':
+ # Debian's default scheme installs to /usr/local/ but we want to find headers in /usr/
+ scheme = 'posix_prefix'
+ sitedir = sysconfig.get_path('purelib', scheme, vars={'base':'$am_py_prefix'})
+else:
+ from distutils import sysconfig
+ sitedir = sysconfig.get_python_lib(0, 0, prefix='$am_py_prefix')
+sys.stdout.write(sitedir)"`
+ #
+ case $am_cv_python_pythondir in
+ $am_py_prefix*)
+ am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'`
+ am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,\\${PYTHON_PREFIX},"`
+ ;;
+ *)
+ case $am_py_prefix in
+ /usr|/System*) ;;
+ *) am_cv_python_pythondir="\${PYTHON_PREFIX}/lib/python$PYTHON_VERSION/site-packages"
+ ;;
+ esac
+ ;;
+ esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pythondir" >&5
+printf "%s\n" "$am_cv_python_pythondir" >&6; }
+ pythondir=$am_cv_python_pythondir
+
+
+ pkgpythondir=\${pythondir}/$PACKAGE
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON extension module directory (pyexecdir)" >&5
+printf %s "checking for $am_display_PYTHON extension module directory (pyexecdir)... " >&6; }
+if test ${am_cv_python_pyexecdir+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "x$am_cv_python_exec_prefix" = x; then
+ am_py_exec_prefix=$am__usable_exec_prefix
+ else
+ am_py_exec_prefix=$am_cv_python_exec_prefix
+ fi
+ am_cv_python_pyexecdir=`$PYTHON -c "
+$am_python_setup_sysconfig
+if can_use_sysconfig:
+ if hasattr(sysconfig, 'get_default_scheme'):
+ scheme = sysconfig.get_default_scheme()
+ else:
+ scheme = sysconfig._get_default_scheme()
+ if scheme == 'posix_local':
+ # Debian's default scheme installs to /usr/local/ but we want to find headers in /usr/
+ scheme = 'posix_prefix'
+ sitedir = sysconfig.get_path('platlib', scheme, vars={'platbase':'$am_py_exec_prefix'})
+else:
+ from distutils import sysconfig
+ sitedir = sysconfig.get_python_lib(1, 0, prefix='$am_py_exec_prefix')
+sys.stdout.write(sitedir)"`
+ #
+ case $am_cv_python_pyexecdir in
+ $am_py_exec_prefix*)
+ am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'`
+ am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,\\${PYTHON_EXEC_PREFIX},"`
+ ;;
+ *)
+ case $am_py_exec_prefix in
+ /usr|/System*) ;;
+ *) am_cv_python_pyexecdir="\${PYTHON_EXEC_PREFIX}/lib/python$PYTHON_VERSION/site-packages"
+ ;;
+ esac
+ ;;
+ esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pyexecdir" >&5
+printf "%s\n" "$am_cv_python_pyexecdir" >&6; }
+ pyexecdir=$am_cv_python_pyexecdir
+
+
+ pkgpyexecdir=\${pyexecdir}/$PACKAGE
+
+
+
+ fi
+
+
+pkg_failed=no
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for python3 >= 0.28" >&5
+printf %s "checking for python3 >= 0.28... " >&6; }
+
+if test -n "$PYTHON_CFLAGS"; then
+ pkg_cv_PYTHON_CFLAGS="$PYTHON_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"python3 >= 0.28\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "python3 >= 0.28") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_PYTHON_CFLAGS=`$PKG_CONFIG --cflags "python3 >= 0.28" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+if test -n "$PYTHON_LIBS"; then
+ pkg_cv_PYTHON_LIBS="$PYTHON_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"python3 >= 0.28\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "python3 >= 0.28") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_PYTHON_LIBS=`$PKG_CONFIG --libs "python3 >= 0.28" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ _pkg_short_errors_supported=yes
+else
+ _pkg_short_errors_supported=no
+fi
+ if test $_pkg_short_errors_supported = yes; then
+ PYTHON_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "python3 >= 0.28" 2>&1`
+ else
+ PYTHON_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "python3 >= 0.28" 2>&1`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$PYTHON_PKG_ERRORS" >&5
+
+ as_fn_error $? "Package requirements (python3 >= 0.28) were not met:
+
+$PYTHON_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables PYTHON_CFLAGS
+and PYTHON_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details." "$LINENO" 5
+elif test $pkg_failed = untried; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables PYTHON_CFLAGS
+and PYTHON_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ PYTHON_CFLAGS=$pkg_cv_PYTHON_CFLAGS
+ PYTHON_LIBS=$pkg_cv_PYTHON_LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+
+fi
+
+fi
+ if test "x$enable_python" != "xno"; then
+ BUILD_PYTHON_TRUE=
+ BUILD_PYTHON_FALSE='#'
+else
+ BUILD_PYTHON_TRUE='#'
+ BUILD_PYTHON_FALSE=
+fi
+
+
+# csv is always enabled.
+CXXFLAGS="$CXXFLAGS -D__ORCUS_PYTHON_CSV"
+
+with_python_xlsx="no"
+if test "x$enable_spreadsheet_model" != "xno"; then
+ if test "x$enable_python" != "xno"; then
+ if test "x$with_xlsx_filter" != "xno"; then
+ with_python_xlsx="yes"
+ fi
+ fi
+fi
+
+if test "x$with_python_xlsx" != "xno"; then
+ CXXFLAGS="$CXXFLAGS -D__ORCUS_PYTHON_XLSX"
+fi
+
+with_python_ods="no"
+if test "x$enable_spreadsheet_model" != "xno"; then
+ if test "x$enable_python" != "xno"; then
+ if test "x$with_ods_filter" != "xno"; then
+ with_python_ods="yes"
+ fi
+ fi
+fi
+
+if test "x$with_python_ods" != "xno"; then
+ CXXFLAGS="$CXXFLAGS -D__ORCUS_PYTHON_ODS"
+fi
+
+with_python_xls_xml="no"
+if test "x$enable_spreadsheet_model" != "xno"; then
+ if test "x$enable_python" != "xno"; then
+ if test "x$with_xls_xml_filter" != "xno"; then
+ with_python_xls_xml="yes"
+ fi
+ fi
+fi
+
+if test "x$with_python_xls_xml" != "xno"; then
+ CXXFLAGS="$CXXFLAGS -D__ORCUS_PYTHON_XLS_XML"
+fi
+
+with_python_gnumeric="no"
+if test "x$enable_spreadsheet_model" != "xno"; then
+ if test "x$enable_python" != "xno"; then
+ if test "x$with_gnumeric_filter" != "xno"; then
+ with_python_gnumeric="yes"
+ fi
+ fi
+fi
+
+if test "x$with_python_gnumeric" != "xno"; then
+ CXXFLAGS="$CXXFLAGS -D__ORCUS_PYTHON_GNUMERIC"
+fi
+
+ if test "x$with_python_xlsx" != "xno"; then
+ WITH_PYTHON_XLSX_TRUE=
+ WITH_PYTHON_XLSX_FALSE='#'
+else
+ WITH_PYTHON_XLSX_TRUE='#'
+ WITH_PYTHON_XLSX_FALSE=
+fi
+
+ if test "x$with_python_ods" != "xno"; then
+ WITH_PYTHON_ODS_TRUE=
+ WITH_PYTHON_ODS_FALSE='#'
+else
+ WITH_PYTHON_ODS_TRUE='#'
+ WITH_PYTHON_ODS_FALSE=
+fi
+
+ if test "x$with_python_csv" != "xno"; then
+ WITH_PYTHON_CSV_TRUE=
+ WITH_PYTHON_CSV_FALSE='#'
+else
+ WITH_PYTHON_CSV_TRUE='#'
+ WITH_PYTHON_CSV_FALSE=
+fi
+
+ if test "x$with_python_xls_xml" != "xno"; then
+ WITH_PYTHON_XLS_XML_TRUE=
+ WITH_PYTHON_XLS_XML_FALSE='#'
+else
+ WITH_PYTHON_XLS_XML_TRUE='#'
+ WITH_PYTHON_XLS_XML_FALSE=
+fi
+
+ if test "x$with_python_gnumeric" != "xno"; then
+ WITH_PYTHON_GNUMERIC_TRUE=
+ WITH_PYTHON_GNUMERIC_FALSE='#'
+else
+ WITH_PYTHON_GNUMERIC_TRUE='#'
+ WITH_PYTHON_GNUMERIC_FALSE=
+fi
+
+
+# ==============
+# Werror support
+# ==============
+
+# NB: This must come at the end of all the other header detections, as enabling
+# it may cause some header detections to fail.
+
+# Check whether --enable-werror was given.
+if test ${enable_werror+y}
+then :
+ enableval=$enable_werror; enable_werror="$enableval"
+else $as_nop
+ enable_werror=no
+
+fi
+
+if test x"$enable_werror" = "xyes"
+then :
+
+ CXXFLAGS="$CXXFLAGS -Werror"
+
+fi
+
+
+
+
+
+ # Check whether --enable-valgrind was given.
+if test ${enable_valgrind+y}
+then :
+ enableval=$enable_valgrind; enable_valgrind=$enableval
+else $as_nop
+ enable_valgrind=
+fi
+
+
+ if test "$enable_valgrind" != "no"
+then :
+
+ # Check for Valgrind.
+ # Extract the first word of "valgrind", so it can be a program name with args.
+set dummy valgrind; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_VALGRIND+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$VALGRIND"; then
+ ac_cv_prog_VALGRIND="$VALGRIND" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_VALGRIND="valgrind"
+ printf "%s\n" "$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
+VALGRIND=$ac_cv_prog_VALGRIND
+if test -n "$VALGRIND"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $VALGRIND" >&5
+printf "%s\n" "$VALGRIND" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ if test "$VALGRIND" = ""
+then :
+
+ if test "$enable_valgrind" = "yes"
+then :
+
+ as_fn_error $? "Could not find valgrind; either install it or reconfigure with --disable-valgrind" "$LINENO" 5
+
+else $as_nop
+
+ enable_valgrind=no
+
+fi
+
+else $as_nop
+
+ enable_valgrind=yes
+
+fi
+
+fi
+
+ if test "$enable_valgrind" = "yes"; then
+ VALGRIND_ENABLED_TRUE=
+ VALGRIND_ENABLED_FALSE='#'
+else
+ VALGRIND_ENABLED_TRUE='#'
+ VALGRIND_ENABLED_FALSE=
+fi
+
+ VALGRIND_ENABLED=$enable_valgrind
+
+
+ # Check for Valgrind tools we care about.
+ valgrind_enabled_tools=
+
+ # Check whether --enable-valgrind-memcheck was given.
+if test ${enable_valgrind_memcheck+y}
+then :
+ enableval=$enable_valgrind_memcheck; enable_valgrind_memcheck=$enableval
+else $as_nop
+ enable_valgrind_memcheck=
+fi
+
+ if test "$enable_valgrind" = "no"
+then :
+
+ enable_valgrind_memcheck=no
+elif test "$enable_valgrind_memcheck" != "no"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Valgrind tool memcheck" >&5
+printf %s "checking for Valgrind tool memcheck... " >&6; }
+if test ${ax_cv_valgrind_tool_memcheck+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ ax_cv_valgrind_tool_memcheck=no
+
+ if `$VALGRIND --tool=memcheck --help >/dev/null 2>&1`
+then :
+
+ ax_cv_valgrind_tool_memcheck=yes
+
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_valgrind_tool_memcheck" >&5
+printf "%s\n" "$ax_cv_valgrind_tool_memcheck" >&6; }
+ if test "$ax_cv_valgrind_tool_memcheck" = "no"
+then :
+
+ if test "$enable_valgrind_memcheck" = "yes"
+then :
+
+ as_fn_error $? "Valgrind does not support memcheck; reconfigure with --disable-valgrind-memcheck" "$LINENO" 5
+
+else $as_nop
+
+ enable_valgrind_memcheck=no
+
+fi
+
+else $as_nop
+
+ enable_valgrind_memcheck=yes
+
+fi
+
+fi
+ if test "$enable_valgrind_memcheck" = "yes"
+then :
+
+ valgrind_enabled_tools="$valgrind_enabled_tools memcheck"
+
+fi
+ ENABLE_VALGRIND_memcheck=$enable_valgrind_memcheck
+
+
+ # Check whether --enable-valgrind-helgrind was given.
+if test ${enable_valgrind_helgrind+y}
+then :
+ enableval=$enable_valgrind_helgrind; enable_valgrind_helgrind=$enableval
+else $as_nop
+ enable_valgrind_helgrind=
+fi
+
+ if test "$enable_valgrind" = "no"
+then :
+
+ enable_valgrind_helgrind=no
+elif test "$enable_valgrind_helgrind" != "no"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Valgrind tool helgrind" >&5
+printf %s "checking for Valgrind tool helgrind... " >&6; }
+if test ${ax_cv_valgrind_tool_helgrind+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ ax_cv_valgrind_tool_helgrind=no
+
+ if `$VALGRIND --tool=helgrind --help >/dev/null 2>&1`
+then :
+
+ ax_cv_valgrind_tool_helgrind=yes
+
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_valgrind_tool_helgrind" >&5
+printf "%s\n" "$ax_cv_valgrind_tool_helgrind" >&6; }
+ if test "$ax_cv_valgrind_tool_helgrind" = "no"
+then :
+
+ if test "$enable_valgrind_helgrind" = "yes"
+then :
+
+ as_fn_error $? "Valgrind does not support helgrind; reconfigure with --disable-valgrind-helgrind" "$LINENO" 5
+
+else $as_nop
+
+ enable_valgrind_helgrind=no
+
+fi
+
+else $as_nop
+
+ enable_valgrind_helgrind=yes
+
+fi
+
+fi
+ if test "$enable_valgrind_helgrind" = "yes"
+then :
+
+ valgrind_enabled_tools="$valgrind_enabled_tools helgrind"
+
+fi
+ ENABLE_VALGRIND_helgrind=$enable_valgrind_helgrind
+
+
+ # Check whether --enable-valgrind-drd was given.
+if test ${enable_valgrind_drd+y}
+then :
+ enableval=$enable_valgrind_drd; enable_valgrind_drd=$enableval
+else $as_nop
+ enable_valgrind_drd=
+fi
+
+ if test "$enable_valgrind" = "no"
+then :
+
+ enable_valgrind_drd=no
+elif test "$enable_valgrind_drd" != "no"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Valgrind tool drd" >&5
+printf %s "checking for Valgrind tool drd... " >&6; }
+if test ${ax_cv_valgrind_tool_drd+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ ax_cv_valgrind_tool_drd=no
+
+ if `$VALGRIND --tool=drd --help >/dev/null 2>&1`
+then :
+
+ ax_cv_valgrind_tool_drd=yes
+
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_valgrind_tool_drd" >&5
+printf "%s\n" "$ax_cv_valgrind_tool_drd" >&6; }
+ if test "$ax_cv_valgrind_tool_drd" = "no"
+then :
+
+ if test "$enable_valgrind_drd" = "yes"
+then :
+
+ as_fn_error $? "Valgrind does not support drd; reconfigure with --disable-valgrind-drd" "$LINENO" 5
+
+else $as_nop
+
+ enable_valgrind_drd=no
+
+fi
+
+else $as_nop
+
+ enable_valgrind_drd=yes
+
+fi
+
+fi
+ if test "$enable_valgrind_drd" = "yes"
+then :
+
+ valgrind_enabled_tools="$valgrind_enabled_tools drd"
+
+fi
+ ENABLE_VALGRIND_drd=$enable_valgrind_drd
+
+
+ # Check whether --enable-valgrind-sgcheck was given.
+if test ${enable_valgrind_sgcheck+y}
+then :
+ enableval=$enable_valgrind_sgcheck; enable_valgrind_sgcheck=$enableval
+else $as_nop
+ enable_valgrind_sgcheck=
+fi
+
+ if test "$enable_valgrind" = "no"
+then :
+
+ enable_valgrind_sgcheck=no
+elif test "$enable_valgrind_sgcheck" != "no"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Valgrind tool sgcheck" >&5
+printf %s "checking for Valgrind tool sgcheck... " >&6; }
+if test ${ax_cv_valgrind_tool_sgcheck+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ ax_cv_valgrind_tool_sgcheck=no
+
+ if `$VALGRIND --tool=exp-sgcheck --help >/dev/null 2>&1`
+then :
+
+ ax_cv_valgrind_tool_sgcheck=yes
+
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_valgrind_tool_sgcheck" >&5
+printf "%s\n" "$ax_cv_valgrind_tool_sgcheck" >&6; }
+ if test "$ax_cv_valgrind_tool_sgcheck" = "no"
+then :
+
+ if test "$enable_valgrind_sgcheck" = "yes"
+then :
+
+ as_fn_error $? "Valgrind does not support sgcheck; reconfigure with --disable-valgrind-sgcheck" "$LINENO" 5
+
+else $as_nop
+
+ enable_valgrind_sgcheck=no
+
+fi
+
+else $as_nop
+
+ enable_valgrind_sgcheck=yes
+
+fi
+
+fi
+ if test "$enable_valgrind_sgcheck" = "yes"
+then :
+
+ valgrind_enabled_tools="$valgrind_enabled_tools sgcheck"
+
+fi
+ ENABLE_VALGRIND_sgcheck=$enable_valgrind_sgcheck
+
+
+ valgrind_tools="memcheck helgrind drd sgcheck"
+
+ valgrind_enabled_tools=$valgrind_enabled_tools
+
+
+VALGRIND_CHECK_RULES='
+# Valgrind check
+#
+# Optional:
+# - VALGRIND_SUPPRESSIONS_FILES: Space-separated list of Valgrind suppressions
+# files to load. (Default: empty)
+# - VALGRIND_FLAGS: General flags to pass to all Valgrind tools.
+# (Default: --num-callers=30)
+# - VALGRIND_$toolname_FLAGS: Flags to pass to Valgrind $toolname (one of:
+# memcheck, helgrind, drd, sgcheck). (Default: various)
+
+# Optional variables
+VALGRIND_SUPPRESSIONS ?= $(addprefix --suppressions=,$(VALGRIND_SUPPRESSIONS_FILES))
+VALGRIND_FLAGS ?= --num-callers=30
+VALGRIND_memcheck_FLAGS ?= --leak-check=full --show-reachable=no
+VALGRIND_helgrind_FLAGS ?= --history-level=approx
+VALGRIND_drd_FLAGS ?=
+VALGRIND_sgcheck_FLAGS ?=
+
+# Internal use
+valgrind_log_files = $(addprefix test-suite-,$(addsuffix .log,$(valgrind_tools)))
+
+valgrind_memcheck_flags = --tool=memcheck $(VALGRIND_memcheck_FLAGS)
+valgrind_helgrind_flags = --tool=helgrind $(VALGRIND_helgrind_FLAGS)
+valgrind_drd_flags = --tool=drd $(VALGRIND_drd_FLAGS)
+valgrind_sgcheck_flags = --tool=exp-sgcheck $(VALGRIND_sgcheck_FLAGS)
+
+valgrind_quiet = $(valgrind_quiet_$(V))
+valgrind_quiet_ = $(valgrind_quiet_$(AM_DEFAULT_VERBOSITY))
+valgrind_quiet_0 = --quiet
+valgrind_v_use = $(valgrind_v_use_$(V))
+valgrind_v_use_ = $(valgrind_v_use_$(AM_DEFAULT_VERBOSITY))
+valgrind_v_use_0 = @echo " USE " $(patsubst check-valgrind-%-local,%,$''@):;
+
+# Support running with and without libtool.
+ifneq ($(LIBTOOL),)
+valgrind_lt = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=execute
+else
+valgrind_lt =
+endif
+
+# Use recursive makes in order to ignore errors during check
+check-valgrind-local:
+ifeq ($(VALGRIND_ENABLED),yes)
+ $(A''M_V_at)$(MAKE) $(AM_MAKEFLAGS) -k \
+ $(foreach tool, $(valgrind_enabled_tools), check-valgrind-$(tool))
+else
+ @echo "Need to reconfigure with --enable-valgrind"
+endif
+
+# Valgrind running
+VALGRIND_TESTS_ENVIRONMENT = \
+ $(TESTS_ENVIRONMENT) \
+ env VALGRIND=$(VALGRIND) \
+ G_SLICE=always-malloc,debug-blocks \
+ G_DEBUG=fatal-warnings,fatal-criticals,gc-friendly
+
+VALGRIND_LOG_COMPILER = \
+ $(valgrind_lt) \
+ $(VALGRIND) $(VALGRIND_SUPPRESSIONS) --error-exitcode=1 $(VALGRIND_FLAGS)
+
+define valgrind_tool_rule
+check-valgrind-$(1)-local:
+ifeq ($$(VALGRIND_ENABLED)-$$(ENABLE_VALGRIND_$(1)),yes-yes)
+ifneq ($$(TESTS),)
+ $$(valgrind_v_use)$$(MAKE) check-TESTS \
+ TESTS_ENVIRONMENT="$$(VALGRIND_TESTS_ENVIRONMENT)" \
+ LOG_COMPILER="$$(VALGRIND_LOG_COMPILER)" \
+ LOG_FLAGS="$$(valgrind_$(1)_flags)" \
+ TEST_SUITE_LOG=test-suite-$(1).log
+endif
+else ifeq ($$(VALGRIND_ENABLED),yes)
+ @echo "Need to reconfigure with --enable-valgrind-$(1)"
+else
+ @echo "Need to reconfigure with --enable-valgrind"
+endif
+endef
+
+$(foreach tool,$(valgrind_tools),$(eval $(call valgrind_tool_rule,$(tool))))
+
+A''M_DISTCHECK_CONFIGURE_FLAGS ?=
+A''M_DISTCHECK_CONFIGURE_FLAGS += --disable-valgrind
+
+MOSTLYCLEANFILES ?=
+MOSTLYCLEANFILES += $(valgrind_log_files)
+
+.PHONY: check-valgrind $(addprefix check-valgrind-,$(valgrind_tools))
+'
+
+
+
+
+
+ac_config_files="$ac_config_files Makefile liborcus-$ORCUS_API_VERSION.pc:liborcus.pc.in liborcus-spreadsheet-model-$ORCUS_API_VERSION.pc:liborcus-spreadsheet-model.pc.in include/Makefile include/orcus/Makefile include/orcus/detail/Makefile include/orcus/spreadsheet/Makefile src/Makefile src/include/Makefile src/include/mso/Makefile src/liborcus/Makefile src/liborcus/constants.inl src/mso/Makefile src/parser/Makefile src/python/Makefile src/spreadsheet/Makefile src/test/Makefile test/python/env.json benchmark/Makefile doc_example/Makefile"
+
+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_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$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+y} || &/
+ 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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+printf "%s\n" "$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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+printf "%s\n" "$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=`printf "%s\n" "$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
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
+printf %s "checking that generated files are newer than configure... " >&6; }
+ if test -n "$am_sleep_pid"; then
+ # Hide warnings about reused PIDs.
+ wait $am_sleep_pid 2>/dev/null
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5
+printf "%s\n" "done" >&6; }
+ 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__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
+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
+if test -z "${HAVE_FILESYSTEM_TRUE}" && test -z "${HAVE_FILESYSTEM_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_FILESYSTEM\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_EXPERIMENTAL_FILESYSTEM_TRUE}" && test -z "${HAVE_EXPERIMENTAL_FILESYSTEM_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_EXPERIMENTAL_FILESYSTEM\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_STATIC_LIB_TRUE}" && test -z "${HAVE_STATIC_LIB_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_STATIC_LIB\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${WITH_ODS_FILTER_TRUE}" && test -z "${WITH_ODS_FILTER_FALSE}"; then
+ as_fn_error $? "conditional \"WITH_ODS_FILTER\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${WITH_XLSX_FILTER_TRUE}" && test -z "${WITH_XLSX_FILTER_FALSE}"; then
+ as_fn_error $? "conditional \"WITH_XLSX_FILTER\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${WITH_XLS_XML_FILTER_TRUE}" && test -z "${WITH_XLS_XML_FILTER_FALSE}"; then
+ as_fn_error $? "conditional \"WITH_XLS_XML_FILTER\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${WITH_GNUMERIC_FILTER_TRUE}" && test -z "${WITH_GNUMERIC_FILTER_FALSE}"; then
+ as_fn_error $? "conditional \"WITH_GNUMERIC_FILTER\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${WITH_PARQUET_FILTER_TRUE}" && test -z "${WITH_PARQUET_FILTER_FALSE}"; then
+ as_fn_error $? "conditional \"WITH_PARQUET_FILTER\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${WITH_TOOLS_TRUE}" && test -z "${WITH_TOOLS_FALSE}"; then
+ as_fn_error $? "conditional \"WITH_TOOLS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${WITH_BENCHMARK_TRUE}" && test -z "${WITH_BENCHMARK_FALSE}"; then
+ as_fn_error $? "conditional \"WITH_BENCHMARK\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${WITH_DOC_EXAMPLE_TRUE}" && test -z "${WITH_DOC_EXAMPLE_FALSE}"; then
+ as_fn_error $? "conditional \"WITH_DOC_EXAMPLE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_SPREADSHEET_MODEL_TRUE}" && test -z "${BUILD_SPREADSHEET_MODEL_FALSE}"; then
+ as_fn_error $? "conditional \"BUILD_SPREADSHEET_MODEL\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_PYTHON_TRUE}" && test -z "${BUILD_PYTHON_FALSE}"; then
+ as_fn_error $? "conditional \"BUILD_PYTHON\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${WITH_PYTHON_XLSX_TRUE}" && test -z "${WITH_PYTHON_XLSX_FALSE}"; then
+ as_fn_error $? "conditional \"WITH_PYTHON_XLSX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${WITH_PYTHON_ODS_TRUE}" && test -z "${WITH_PYTHON_ODS_FALSE}"; then
+ as_fn_error $? "conditional \"WITH_PYTHON_ODS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${WITH_PYTHON_CSV_TRUE}" && test -z "${WITH_PYTHON_CSV_FALSE}"; then
+ as_fn_error $? "conditional \"WITH_PYTHON_CSV\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${WITH_PYTHON_XLS_XML_TRUE}" && test -z "${WITH_PYTHON_XLS_XML_FALSE}"; then
+ as_fn_error $? "conditional \"WITH_PYTHON_XLS_XML\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${WITH_PYTHON_GNUMERIC_TRUE}" && test -z "${WITH_PYTHON_GNUMERIC_FALSE}"; then
+ as_fn_error $? "conditional \"WITH_PYTHON_GNUMERIC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${VALGRIND_ENABLED_TRUE}" && test -z "${VALGRIND_ENABLED_FALSE}"; then
+ as_fn_error $? "conditional \"VALGRIND_ENABLED\" 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"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+printf "%s\n" "$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
+as_nop=:
+if test ${ZSH_VERSION+y} && (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 $as_nop
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
+as_nl='
+'
+export as_nl
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
+
+# The user is always right.
+if ${PATH_SEPARATOR+false} :; 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
+
+
+# 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
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ 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
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+
+
+# 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
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ printf "%s\n" "$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_nop
+ 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_nop
+ 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 ||
+printf "%s\n" 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
+
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
+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
+
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_echo='printf %s\n'
+as_echo_n='printf %s'
+
+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 -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+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=`printf "%s\n" "$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 ||
+printf "%s\n" 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
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# 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 liborcus $as_me 0.19.2, which was
+generated by GNU Autoconf 2.71. 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 the package provider."
+
+_ACEOF
+ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"`
+ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"`
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config='$ac_cs_config_escaped'
+ac_cs_version="\\
+liborcus config.status 0.19.2
+configured by $0, generated by GNU Autoconf 2.71,
+ with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2021 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 )
+ printf "%s\n" "$ac_cs_version"; exit ;;
+ --config | --confi | --conf | --con | --co | --c )
+ printf "%s\n" "$ac_cs_config"; exit ;;
+ --debug | --debu | --deb | --de | --d | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`printf "%s\n" "$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=`printf "%s\n" "$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 )
+ printf "%s\n" "$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
+ \printf "%s\n" "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
+ printf "%s\n" "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"
+
+
+# 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"`'
+AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`'
+DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "$OBJDUMP" | $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_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $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"`'
+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"`'
+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_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $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"`'
+lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $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"`'
+lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $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"`'
+configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`'
+configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $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 AS \
+DLLTOOL \
+OBJDUMP \
+SHELL \
+ECHO \
+PATH_SEPARATOR \
+SED \
+GREP \
+EGREP \
+FGREP \
+LD \
+NM \
+LN_S \
+lt_SP2NL \
+lt_NL2SP \
+reload_flag \
+deplibs_check_method \
+file_magic_cmd \
+file_magic_glob \
+want_nocaseglob \
+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_import \
+lt_cv_sys_global_symbol_to_c_name_address \
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+lt_cv_nm_interface \
+nm_file_list_spec \
+lt_cv_truncate_bin \
+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\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+ ;;
+ *)
+ 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 \
+configure_time_dlsearch_path \
+configure_time_lt_sys_library_path \
+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\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+ ;;
+ *)
+ eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+ ;;
+ esac
+done
+
+ac_aux_dir='$ac_aux_dir'
+
+# See if we are running on zsh, and set the options that 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'
+ 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" ;;
+ "liborcus-$ORCUS_API_VERSION.pc") CONFIG_FILES="$CONFIG_FILES liborcus-$ORCUS_API_VERSION.pc:liborcus.pc.in" ;;
+ "liborcus-spreadsheet-model-$ORCUS_API_VERSION.pc") CONFIG_FILES="$CONFIG_FILES liborcus-spreadsheet-model-$ORCUS_API_VERSION.pc:liborcus-spreadsheet-model.pc.in" ;;
+ "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;;
+ "include/orcus/Makefile") CONFIG_FILES="$CONFIG_FILES include/orcus/Makefile" ;;
+ "include/orcus/detail/Makefile") CONFIG_FILES="$CONFIG_FILES include/orcus/detail/Makefile" ;;
+ "include/orcus/spreadsheet/Makefile") CONFIG_FILES="$CONFIG_FILES include/orcus/spreadsheet/Makefile" ;;
+ "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
+ "src/include/Makefile") CONFIG_FILES="$CONFIG_FILES src/include/Makefile" ;;
+ "src/include/mso/Makefile") CONFIG_FILES="$CONFIG_FILES src/include/mso/Makefile" ;;
+ "src/liborcus/Makefile") CONFIG_FILES="$CONFIG_FILES src/liborcus/Makefile" ;;
+ "src/liborcus/constants.inl") CONFIG_FILES="$CONFIG_FILES src/liborcus/constants.inl" ;;
+ "src/mso/Makefile") CONFIG_FILES="$CONFIG_FILES src/mso/Makefile" ;;
+ "src/parser/Makefile") CONFIG_FILES="$CONFIG_FILES src/parser/Makefile" ;;
+ "src/python/Makefile") CONFIG_FILES="$CONFIG_FILES src/python/Makefile" ;;
+ "src/spreadsheet/Makefile") CONFIG_FILES="$CONFIG_FILES src/spreadsheet/Makefile" ;;
+ "src/test/Makefile") CONFIG_FILES="$CONFIG_FILES src/test/Makefile" ;;
+ "test/python/env.json") CONFIG_FILES="$CONFIG_FILES test/python/env.json" ;;
+ "benchmark/Makefile") CONFIG_FILES="$CONFIG_FILES benchmark/Makefile" ;;
+ "doc_example/Makefile") CONFIG_FILES="$CONFIG_FILES doc_example/Makefile" ;;
+
+ *) 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+y} || CONFIG_FILES=$config_files
+ test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers
+ test ${CONFIG_COMMANDS+y} || 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=`printf "%s\n" "$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 '`
+ printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ `' by configure.'
+ if test x"$ac_file" != x-; then
+ configure_input="$ac_file. $configure_input"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+printf "%s\n" "$as_me: creating $ac_file" >&6;}
+ fi
+ # Neutralize special characters interpreted by sed in replacement strings.
+ case $configure_input in #(
+ *\&* | *\|* | *\\* )
+ ac_sed_conf_input=`printf "%s\n" "$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 ||
+printf "%s\n" 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=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`printf "%s\n" "$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@*)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+printf "%s\n" "$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"; } &&
+ { printf "%s\n" "$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
+printf "%s\n" "$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
+ {
+ printf "%s\n" "/* $configure_input */" >&1 \
+ && 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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+printf "%s\n" "$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
+ printf "%s\n" "/* $configure_input */" >&1 \
+ && 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 ||
+printf "%s\n" 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) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+printf "%s\n" "$as_me: executing $ac_file commands" >&6;}
+ ;;
+ esac
+
+
+ case $ac_file$ac_mode in
+ "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+ # Older Autoconf 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.
+ # TODO: see whether this extra hack can be removed once we start
+ # requiring Autoconf 2.70 or later.
+ case $CONFIG_FILES in #(
+ *\'*) :
+ eval set x "$CONFIG_FILES" ;; #(
+ *) :
+ set x $CONFIG_FILES ;; #(
+ *) :
+ ;;
+esac
+ shift
+ # Used to flag and report bootstrapping failures.
+ am_rc=0
+ for am_mf
+ do
+ # Strip MF so we end up with the name of the file.
+ am_mf=`printf "%s\n" "$am_mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile which includes
+ # dependency-tracking related rules and includes.
+ # Grep'ing the whole file directly is not great: AIX grep has a line
+ # limit of 2048, but all sed's we know have understand at least 4000.
+ sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
+ || continue
+ am_dirpart=`$as_dirname -- "$am_mf" ||
+$as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$am_mf" : 'X\(//\)[^/]' \| \
+ X"$am_mf" : 'X\(//\)$' \| \
+ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$am_mf" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ am_filepart=`$as_basename -- "$am_mf" ||
+$as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$am_mf" : 'X\(//\)$' \| \
+ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X/"$am_mf" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ { echo "$as_me:$LINENO: cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles" >&5
+ (cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } || am_rc=$?
+ done
+ if test $am_rc -ne 0; then
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "Something went wrong bootstrapping makefile fragments
+ for automatic dependency tracking. If GNU make was not used, consider
+ re-running the configure script with MAKE=\"gmake\" (or whatever is
+ necessary). You can also try re-running configure with the
+ '--disable-dependency-tracking' option to at least be able to build
+ the package (albeit without support for automatic dependency tracking).
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ { am_dirpart=; unset am_dirpart;}
+ { am_filepart=; unset am_filepart;}
+ { am_mf=; unset am_mf;}
+ { am_rc=; unset am_rc;}
+ rm -f conftest-deps.mk
+}
+ ;;
+ "libtool":C)
+
+ # See if we are running on zsh, and set the options that 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
+# Generated automatically by $as_me ($PACKAGE) $VERSION
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit, 1996
+
+# Copyright (C) 2014 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 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# The names of the tagged configurations supported by this script.
+available_tags='CXX '
+
+# Configured defaults for sys_lib_dlsearch_path munging.
+: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Which release of libtool.m4 was used?
+macro_version=$macro_version
+macro_revision=$macro_revision
+
+# Assembler program.
+AS=$lt_AS
+
+# DLL creation program.
+DLLTOOL=$lt_DLLTOOL
+
+# Object dumper program.
+OBJDUMP=$lt_OBJDUMP
+
+# 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 build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# Shared archive member basename,for filename based shared library versioning on AIX.
+shared_archive_member_spec=$shared_archive_member_spec
+
+# 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
+
+# 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
+
+# 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 into a list of symbols to manually relocate.
+global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import
+
+# 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
+
+# The name lister interface.
+nm_interface=$lt_lt_cv_nm_interface
+
+# 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 where our libraries should be installed.
+lt_sysroot=$lt_sysroot
+
+# Command to truncate a binary pipe.
+lt_truncate_bin=$lt_lt_cv_truncate_bin
+
+# 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
+
+# Detected run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path
+
+# Explicit LT_SYS_LIBRARY_PATH set during ./configure time.
+configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path
+
+# 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
+
+ cat <<'_LT_EOF' >> "$cfgfile"
+
+# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+# string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+# string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+# string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+# "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+# VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+ case x$2 in
+ x)
+ ;;
+ *:)
+ eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
+ ;;
+ x:*)
+ eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
+ ;;
+ *::*)
+ eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+ eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
+ ;;
+ *)
+ eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
+ ;;
+ esac
+}
+
+
+# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+ for cc_temp in $*""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+ done
+ func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+
+# ### END FUNCTIONS SHARED WITH CONFIGURE
+
+_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 set != "${COLLECT_NAMES+set}"; 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)
+
+ 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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
+
+# ==============================================
+# Display final informations about configuration
+# ==============================================
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}:
+==============================================================================
+Build configuration:
+ debug $enable_debug
+ debug-utils $enable_debug_utils
+ werror $enable_werror
+ spreadsheet-model $enable_spreadsheet_model
+ gnumeric-filter $with_gnumeric_filter
+ ods-filter $with_ods_filter
+ xlsx-filter $with_xlsx_filter
+ xls-xml-filter $with_xls_xml_filter
+ gnumeric $with_gnumeric_filter
+ parquet $with_parquet_filter
+ tools $with_tools
+ python $enable_python
+ python-xlsx $with_python_xlsx
+ python-ods $with_python_ods
+ python-xls-xml $with_python_xls_xml
+ python-gnumeric $with_python_gnumeric
+ cpu-features $with_cpu_features
+ benchmark $with_benchmark
+ doc-example $with_doc_example
+==============================================================================
+" >&5
+printf "%s\n" "$as_me:
+==============================================================================
+Build configuration:
+ debug $enable_debug
+ debug-utils $enable_debug_utils
+ werror $enable_werror
+ spreadsheet-model $enable_spreadsheet_model
+ gnumeric-filter $with_gnumeric_filter
+ ods-filter $with_ods_filter
+ xlsx-filter $with_xlsx_filter
+ xls-xml-filter $with_xls_xml_filter
+ gnumeric $with_gnumeric_filter
+ parquet $with_parquet_filter
+ tools $with_tools
+ python $enable_python
+ python-xlsx $with_python_xlsx
+ python-ods $with_python_ods
+ python-xls-xml $with_python_xls_xml
+ python-gnumeric $with_python_gnumeric
+ cpu-features $with_cpu_features
+ benchmark $with_benchmark
+ doc-example $with_doc_example
+==============================================================================
+" >&6;}
+
+
diff --git a/configure.ac b/configure.ac
new file mode 100644
index 0000000..0e1435b
--- /dev/null
+++ b/configure.ac
@@ -0,0 +1,423 @@
+# -*- Autoconf -*-
+# Process this file with autoconf to produce a configure script.
+
+# ===================
+# Version information
+# ===================
+m4_define([orcus_major_version], [0])
+m4_define([orcus_minor_version], [19])
+m4_define([orcus_micro_version], [2])
+m4_define([orcus_version], [orcus_major_version.orcus_minor_version.orcus_micro_version])
+
+# ===============
+# API information
+# ===============
+m4_define([orcus_major_api_version], [0])
+m4_define([orcus_minor_api_version], [18])
+m4_define([orcus_api_version], [orcus_major_version.orcus_minor_api_version])
+
+# =============
+# Automake init
+# =============
+AC_INIT([liborcus],[orcus_version])
+AC_CONFIG_MACRO_DIR([m4])
+m4_pattern_allow([^BOOST_])
+AC_CONFIG_HEADERS([config.h])
+AM_INIT_AUTOMAKE([1.11 foreign dist-bzip2 dist-xz])
+AM_SILENT_RULES([yes])
+AC_LANG([C++])
+AX_CXX_COMPILE_STDCXX_17([noext], [mandatory])
+CXXFLAGS="-fvisibility=hidden $CXXFLAGS -Wall -pthread -Wshadow"
+
+# ===========================
+# Find required base packages
+# ===========================
+AC_PROG_CPP
+AC_PROG_CXX
+LT_INIT([win32-dll disable-static pic-only])
+AC_PROG_INSTALL
+AC_PROG_LN_S
+PKG_PROG_PKG_CONFIG([0.20])
+
+# =====================
+# Find required headers
+# =====================
+AC_CHECK_HEADERS([stdlib.h sys/time.h unistd.h])
+
+# ===================================
+# Check for filesystem implementation
+# ===================================
+AC_CHECK_HEADER([filesystem], [have_filesystem=yes], [have_filesystem=no], [])
+
+AC_CHECK_HEADER([experimental/filesystem], [have_experimental_filesystem=yes], [have_experimental_filesystem=no], [])
+
+AM_CONDITIONAL([HAVE_FILESYSTEM], [test "x$have_filesystem" = "xyes"])
+AM_CONDITIONAL([HAVE_EXPERIMENTAL_FILESYSTEM], [test "x$have_experimental_filesystem" = "xyes"])
+
+# =============================================================
+# Checks for typedefs, structures, and compiler characteristics
+# =============================================================
+AC_HEADER_STDBOOL
+AC_C_INLINE
+AC_TYPE_MODE_T
+AC_TYPE_SIZE_T
+
+AC_CHECK_SIZEOF([void *])
+CXXFLAGS="$CXXFLAGS -DSIZEOF_VOID_P=$ac_cv_sizeof_void_p"
+
+# ============================
+# Checks for library functions
+# ============================
+AC_FUNC_STRTOD
+AC_CHECK_FUNCS([gettimeofday])
+AC_DEFINE([_REENTRANT], [], [Enable reentrant.])
+AC_DEFINE([BOOST_ALL_NO_LIB], [], [Disable boost's evil autolink.])
+
+# ======================
+# Set required ixion api
+# ======================
+IXION_REQUIRED_API_VERSION=0.18
+AC_SUBST(IXION_REQUIRED_API_VERSION)
+
+# =============
+# Set orcus api
+# =============
+ORCUS_API_VERSION=orcus_api_version
+ORCUS_MAJOR_VERSION=orcus_major_version
+ORCUS_MINOR_VERSION=orcus_minor_version
+ORCUS_MICRO_VERSION=orcus_micro_version
+AC_SUBST(ORCUS_API_VERSION)
+AC_SUBST(ORCUS_MAJOR_VERSION)
+AC_SUBST(ORCUS_MINOR_VERSION)
+AC_SUBST(ORCUS_MICRO_VERSION)
+
+BOOST_REQUIRE([1.36])
+BOOST_SYSTEM
+AS_IF([test "x$have_filesystem" != "xyes" -a "x$have_experimental_filesystem" != "xyes"], [
+ BOOST_FILESYSTEM
+])
+
+# =========================================================
+# Determine if we are going to build static lib (for MinGW)
+# =========================================================
+AM_CONDITIONAL([HAVE_STATIC_LIB],
+ [test "$enable_shared" = no -a "$enable_static" = yes])
+
+# =====================
+# Development Utilities
+# =====================
+AC_ARG_ENABLE(debug-utils,
+ AS_HELP_STRING([--enable-debug-utils], [Build with extra checks useful during development.]),
+ [enable_debug_utils="$enableval"],
+ [enable_debug_utils=no]
+)
+
+# =====
+# Debug
+# =====
+AC_ARG_ENABLE(debug,
+ AS_HELP_STRING([--enable-debug], [Build with debug features in mind.]),
+ [enable_debug="$enableval"],
+ [enable_debug=no]
+)
+AS_IF([test "x$enable_debug" != "xno"], [
+ CXXFLAGS="$CXXFLAGS -g -O0"
+ enable_debug_utils=yes
+], [
+ CXXFLAGS="$CXXFLAGS -O2"
+ AC_DEFINE([NDEBUG], [], [Disable debugging information])
+])
+
+AS_IF([test "x$enable_debug_utils" != "xno"], [
+ CXXFLAGS="$CXXFLAGS -g -D__ORCUS_DEBUG_UTILS -DMDDS_SORTED_STRING_MAP_DEBUG"
+])
+
+# zlib is a hard requirement in liborcus-parser.
+PKG_CHECK_MODULES([ZLIB], [zlib])
+
+# ==============
+# tools (binary)
+# ==============
+AC_ARG_WITH(tools,
+ AS_HELP_STRING([--without-tools],
+ [Disables building of binary executable tools.]),
+ [with_tools="$withval"],
+ [with_tools=yes]
+)
+
+# ==================
+# ods filter support
+# ==================
+AC_ARG_WITH(ods-filter,
+ AS_HELP_STRING([--without-ods-filter],
+ [Disables the OpenDocument Format spreadsheet import filter.]),
+ [with_ods_filter="$withval"],
+ [with_ods_filter=yes]
+)
+
+# ===================
+# xlsx filter support
+# ===================
+AC_ARG_WITH(xlsx-filter,
+ AS_HELP_STRING([--without-xlsx-filter],
+ [Disables the Microsoft Excel OOXML import filter.]),
+ [with_xlsx_filter="$withval"],
+ [with_xlsx_filter=yes]
+)
+
+# ======================
+# xls xml filter support
+# ======================
+AC_ARG_WITH(xls-xml-filter,
+ AS_HELP_STRING([--without-xls-xml-filter],
+ [Disables the Microsoft Excel XML import filter.]),
+ [with_xls_xml_filter="$withval"],
+ [with_xls_xml_filter=yes]
+)
+
+# =======================
+# gnumeric filter support
+# =======================
+AC_ARG_WITH(gnumeric-filter,
+ AS_HELP_STRING([--without-gnumeric-filter],
+ [Disables the gnumeric import filter. The gnumeric import filter depends on zLib.]),
+ [with_gnumeric_filter="$withval"],
+ [with_gnumeric_filter=yes]
+)
+
+# ======================
+# parquet filter support
+# ======================
+AC_ARG_WITH(parquet-filter,
+ AS_HELP_STRING([--with-parquet-filter],
+ [Disables the parquet import filter. The parquet import filter depends on Apache Arrow.]),
+ [with_parquet_filter="$withval"],
+ [with_parquet_filter=no]
+)
+
+AC_ARG_WITH(cpu-features,
+ AS_HELP_STRING([--with-cpu-features], [Enables custom CPU features.]),
+ [with_cpu_features="$withval"],
+ [with_cpu_features=no]
+)
+
+AC_ARG_WITH(benchmark,
+ AS_HELP_STRING([--without-benchmark], [Disables building of benchmark testing programs.]),
+ [with_benchmark="$withval"],
+ [with_benchmark=yes]
+)
+
+AC_ARG_WITH(doc-example,
+ AS_HELP_STRING([--with-doc-example], [Enables building of example code used in documentation.]),
+ [with_doc_example="$withval"],
+ [with_doc_example=no]
+)
+
+AM_CONDITIONAL([WITH_ODS_FILTER], [test "x$with_ods_filter" != "xno"])
+AM_CONDITIONAL([WITH_XLSX_FILTER], [test "x$with_xlsx_filter" != "xno"])
+AM_CONDITIONAL([WITH_XLS_XML_FILTER], [test "x$with_xls_xml_filter" != "xno"])
+AM_CONDITIONAL([WITH_GNUMERIC_FILTER], [test "x$with_gnumeric_filter" != "xno"])
+AM_CONDITIONAL([WITH_PARQUET_FILTER], [test "x$with_parquet_filter" != "xno"])
+AM_CONDITIONAL([WITH_TOOLS], [test "x$with_tools" != "xno"])
+AM_CONDITIONAL([WITH_BENCHMARK], [test "x$with_benchmark" != "xno"])
+AM_CONDITIONAL([WITH_DOC_EXAMPLE], [test "x$with_doc_example" != "xno"])
+
+AS_IF([test "x$with_ods_filter" != "xno"], [
+ CXXFLAGS="$CXXFLAGS -D__ORCUS_ODS"
+])
+
+AS_IF([test "x$with_xlsx_filter" != "xno"], [
+ CXXFLAGS="$CXXFLAGS -D__ORCUS_XLSX"
+])
+
+AS_IF([test "x$with_xls_xml_filter" != "xno"], [
+ CXXFLAGS="$CXXFLAGS -D__ORCUS_XLS_XML"
+])
+
+AS_IF([test "x$with_gnumeric_filter" != "xno"], [
+ CXXFLAGS="$CXXFLAGS -D__ORCUS_GNUMERIC"
+ BOOST_IOSTREAMS
+])
+
+AS_IF([test "x$with_parquet_filter" != "xno"], [
+ CXXFLAGS="$CXXFLAGS -D__ORCUS_PARQUET"
+ PKG_CHECK_MODULES([PARQUET], [parquet])
+])
+
+AS_IF([test "x$with_cpu_features" != "xno"], [
+ CXXFLAGS="$CXXFLAGS -D__ORCUS_CPU_FEATURES"
+])
+
+AS_IF([test "x$with_tools" != "xno"], [
+ BOOST_PROGRAM_OPTIONS
+ BOOST_SYSTEM
+])
+
+# ============
+# mdds support
+# ============
+PKG_CHECK_MODULES([MDDS],[mdds-2.1 >= 2.1.1])
+CXXFLAGS="$CXXFLAGS $MDDS_CFLAGS"
+
+# =================
+# Spreadsheet model
+# =================
+AC_ARG_ENABLE(spreadsheet-model,
+ AS_HELP_STRING([--disable-spreadsheet-model],
+ [Disable the spreadsheet model implementation in orcus. Note that the spreadsheet-specific command line utilities will not be built when this is disabled.]),
+ [enable_spreadsheet_model="$enableval"],
+ [enable_spreadsheet_model=yes]
+)
+AS_IF([test "x$enable_spreadsheet_model" != "xno"], [
+ PKG_CHECK_MODULES([LIBIXION],[libixion-$IXION_REQUIRED_API_VERSION >= 0.19.0])
+ CXXFLAGS="$CXXFLAGS -D__ORCUS_SPREADSHEET_MODEL"
+ BOOST_DATE_TIME
+])
+AM_CONDITIONAL([BUILD_SPREADSHEET_MODEL], [test "x$enable_spreadsheet_model" != "xno"])
+
+# ==============
+# Python support
+# ==============
+AC_ARG_ENABLE([python],
+ [AS_HELP_STRING([--disable-python], [Disable python bindings])],
+ [enable_python="$enableval"],
+ [enable_python=yes]
+)
+
+# Check for python.
+AS_IF([test "x$enable_python" != "xno"], [
+ AM_PATH_PYTHON(3)
+ PKG_CHECK_MODULES([PYTHON], [python3 >= 0.28])
+])
+AM_CONDITIONAL([BUILD_PYTHON], [test "x$enable_python" != "xno"])
+
+# csv is always enabled.
+CXXFLAGS="$CXXFLAGS -D__ORCUS_PYTHON_CSV"
+
+with_python_xlsx="no"
+if test "x$enable_spreadsheet_model" != "xno"; then
+ if test "x$enable_python" != "xno"; then
+ if test "x$with_xlsx_filter" != "xno"; then
+ with_python_xlsx="yes"
+ fi
+ fi
+fi
+
+if test "x$with_python_xlsx" != "xno"; then
+ CXXFLAGS="$CXXFLAGS -D__ORCUS_PYTHON_XLSX"
+fi
+
+with_python_ods="no"
+if test "x$enable_spreadsheet_model" != "xno"; then
+ if test "x$enable_python" != "xno"; then
+ if test "x$with_ods_filter" != "xno"; then
+ with_python_ods="yes"
+ fi
+ fi
+fi
+
+if test "x$with_python_ods" != "xno"; then
+ CXXFLAGS="$CXXFLAGS -D__ORCUS_PYTHON_ODS"
+fi
+
+with_python_xls_xml="no"
+if test "x$enable_spreadsheet_model" != "xno"; then
+ if test "x$enable_python" != "xno"; then
+ if test "x$with_xls_xml_filter" != "xno"; then
+ with_python_xls_xml="yes"
+ fi
+ fi
+fi
+
+if test "x$with_python_xls_xml" != "xno"; then
+ CXXFLAGS="$CXXFLAGS -D__ORCUS_PYTHON_XLS_XML"
+fi
+
+with_python_gnumeric="no"
+if test "x$enable_spreadsheet_model" != "xno"; then
+ if test "x$enable_python" != "xno"; then
+ if test "x$with_gnumeric_filter" != "xno"; then
+ with_python_gnumeric="yes"
+ fi
+ fi
+fi
+
+if test "x$with_python_gnumeric" != "xno"; then
+ CXXFLAGS="$CXXFLAGS -D__ORCUS_PYTHON_GNUMERIC"
+fi
+
+AM_CONDITIONAL([WITH_PYTHON_XLSX], [test "x$with_python_xlsx" != "xno"])
+AM_CONDITIONAL([WITH_PYTHON_ODS], [test "x$with_python_ods" != "xno"])
+AM_CONDITIONAL([WITH_PYTHON_CSV], [test "x$with_python_csv" != "xno"])
+AM_CONDITIONAL([WITH_PYTHON_XLS_XML], [test "x$with_python_xls_xml" != "xno"])
+AM_CONDITIONAL([WITH_PYTHON_GNUMERIC], [test "x$with_python_gnumeric" != "xno"])
+
+# ==============
+# Werror support
+# ==============
+
+# NB: This must come at the end of all the other header detections, as enabling
+# it may cause some header detections to fail.
+
+AC_ARG_ENABLE([werror],
+ [AS_HELP_STRING([--enable-werror], [Treat all warnings as errors, useful for development])],
+ [enable_werror="$enableval"],
+ [enable_werror=no]
+)
+AS_IF([test x"$enable_werror" = "xyes"], [
+ CXXFLAGS="$CXXFLAGS -Werror"
+])
+
+AX_VALGRIND_CHECK()
+
+AC_CONFIG_FILES([Makefile
+ liborcus-$ORCUS_API_VERSION.pc:liborcus.pc.in
+ liborcus-spreadsheet-model-$ORCUS_API_VERSION.pc:liborcus-spreadsheet-model.pc.in
+ include/Makefile
+ include/orcus/Makefile
+ include/orcus/detail/Makefile
+ include/orcus/spreadsheet/Makefile
+ src/Makefile
+ src/include/Makefile
+ src/include/mso/Makefile
+ src/liborcus/Makefile
+ src/liborcus/constants.inl
+ src/mso/Makefile
+ src/parser/Makefile
+ src/python/Makefile
+ src/spreadsheet/Makefile
+ src/test/Makefile
+ test/python/env.json
+ benchmark/Makefile
+ doc_example/Makefile
+])
+AC_OUTPUT
+
+# ==============================================
+# Display final informations about configuration
+# ==============================================
+AC_MSG_NOTICE([
+==============================================================================
+Build configuration:
+ debug $enable_debug
+ debug-utils $enable_debug_utils
+ werror $enable_werror
+ spreadsheet-model $enable_spreadsheet_model
+ gnumeric-filter $with_gnumeric_filter
+ ods-filter $with_ods_filter
+ xlsx-filter $with_xlsx_filter
+ xls-xml-filter $with_xls_xml_filter
+ gnumeric $with_gnumeric_filter
+ parquet $with_parquet_filter
+ tools $with_tools
+ python $enable_python
+ python-xlsx $with_python_xlsx
+ python-ods $with_python_ods
+ python-xls-xml $with_python_xls_xml
+ python-gnumeric $with_python_gnumeric
+ cpu-features $with_cpu_features
+ benchmark $with_benchmark
+ doc-example $with_doc_example
+==============================================================================
+])
+
diff --git a/depcomp b/depcomp
new file mode 100755
index 0000000..715e343
--- /dev/null
+++ b/depcomp
@@ -0,0 +1,791 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2018-03-07.03; # UTC
+
+# Copyright (C) 1999-2021 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 <https://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@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@gnu.org>.
+EOF
+ exit $?
+ ;;
+ -v | --v*)
+ echo "depcomp $scriptversion"
+ exit $?
+ ;;
+esac
+
+# Get the directory component of the given path, and save it in the
+# global variables '$dir'. Note that this directory component will
+# be either empty or ending with a '/' character. This is deliberate.
+set_dir_from ()
+{
+ case $1 in
+ */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
+ *) dir=;;
+ esac
+}
+
+# Get the suffix-stripped basename of the given path, and save it the
+# global variable '$base'.
+set_base_from ()
+{
+ base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
+}
+
+# If no dependency file was actually created by the compiler invocation,
+# we still have to create a dummy depfile, to avoid errors with the
+# Makefile "include basename.Plo" scheme.
+make_dummy_depfile ()
+{
+ echo "#dummy" > "$depfile"
+}
+
+# Factor out some common post-processing of the generated depfile.
+# Requires the auxiliary global variable '$tmpdepfile' to be set.
+aix_post_process_depfile ()
+{
+ # If the compiler actually managed to produce a dependency file,
+ # post-process it.
+ if test -f "$tmpdepfile"; then
+ # Each line is of the form 'foo.o: dependency.h'.
+ # Do two passes, one to just change these to
+ # $object: dependency.h
+ # and one to simply output
+ # dependency.h:
+ # which is needed to avoid the deleted-header problem.
+ { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
+ sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
+ } > "$depfile"
+ rm -f "$tmpdepfile"
+ else
+ make_dummy_depfile
+ fi
+}
+
+# A tabulation character.
+tab=' '
+# A newline character.
+nl='
+'
+# Character ranges might be problematic outside the C locale.
+# These definitions help.
+upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
+lower=abcdefghijklmnopqrstuvwxyz
+digits=0123456789
+alpha=${upper}${lower}
+
+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"
+
+# Avoid interferences from the environment.
+gccflag= dashmflag=
+
+# 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 information.
+ 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 -ne 0; then
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ mv "$tmpdepfile" "$depfile"
+ ;;
+
+gcc)
+## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
+## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
+## (see the conditional assignment to $gccflag above).
+## 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). Also, it might not be
+## supported by the other compilers which use the 'gcc' depmode.
+## - 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 -ne 0; then
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ # 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.
+## 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.
+ tr ' ' "$nl" < "$tmpdepfile" \
+ | 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 -ne 0; then
+ 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
+ make_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.
+ set_dir_from "$object"
+ set_base_from "$object"
+ 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 -ne 0; then
+ rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ exit $stat
+ fi
+
+ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ do
+ test -f "$tmpdepfile" && break
+ done
+ aix_post_process_depfile
+ ;;
+
+tcc)
+ # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
+ # FIXME: That version still under development at the moment of writing.
+ # Make that this statement remains true also for stable, released
+ # versions.
+ # It will wrap lines (doesn't matter whether long or short) with a
+ # trailing '\', as in:
+ #
+ # foo.o : \
+ # foo.c \
+ # foo.h \
+ #
+ # It will put a trailing '\' even on the last line, and will use leading
+ # spaces rather than leading tabs (at least since its commit 0394caf7
+ # "Emit spaces for -MD").
+ "$@" -MD -MF "$tmpdepfile"
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
+ # We have to change lines of the first kind to '$object: \'.
+ sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
+ # And for each line of the second kind, we have to emit a 'dep.h:'
+ # dummy dependency, to avoid the deleted-header problem.
+ sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+## The order of this option in the case statement is important, since the
+## shell code in configure will try each of these formats in the order
+## listed in this file. A plain '-MD' option would be understood by many
+## compilers, so we must ensure this comes after the gcc and icc options.
+pgcc)
+ # Portland's C compiler understands '-MD'.
+ # Will always output deps to 'file.d' where file is the root name of the
+ # source file under compilation, even if file resides in a subdirectory.
+ # The object file name does not affect the name of the '.d' file.
+ # pgcc 10.2 will output
+ # foo.o: sub/foo.c sub/foo.h
+ # and will wrap long lines using '\' :
+ # foo.o: sub/foo.c ... \
+ # sub/foo.h ... \
+ # ...
+ set_dir_from "$object"
+ # Use the source, not the object, to determine the base name, since
+ # that's sadly what pgcc will do too.
+ set_base_from "$source"
+ tmpdepfile=$base.d
+
+ # For projects that build the same source file twice into different object
+ # files, the pgcc approach of using the *source* file root name can cause
+ # problems in parallel builds. Use a locking strategy to avoid stomping on
+ # the same $tmpdepfile.
+ lockdir=$base.d-lock
+ trap "
+ echo '$0: caught signal, cleaning up...' >&2
+ rmdir '$lockdir'
+ exit 1
+ " 1 2 13 15
+ numtries=100
+ i=$numtries
+ while test $i -gt 0; do
+ # mkdir is a portable test-and-set.
+ if mkdir "$lockdir" 2>/dev/null; then
+ # This process acquired the lock.
+ "$@" -MD
+ stat=$?
+ # Release the lock.
+ rmdir "$lockdir"
+ break
+ else
+ # If the lock is being held by a different process, wait
+ # until the winning process is done or we timeout.
+ while test -d "$lockdir" && test $i -gt 0; do
+ sleep 1
+ i=`expr $i - 1`
+ done
+ fi
+ i=`expr $i - 1`
+ done
+ trap - 1 2 13 15
+ if test $i -le 0; then
+ echo "$0: failed to acquire lock after $numtries attempts" >&2
+ echo "$0: check lockdir '$lockdir'" >&2
+ exit 1
+ fi
+
+ if test $stat -ne 0; then
+ 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 "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+ # Some versions of the HPUX 10.20 sed can't process this invocation
+ # correctly. Breaking it into two sed invocations is a workaround.
+ sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
+ | sed -e 's/$/ :/' >> "$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.
+ set_dir_from "$object"
+ set_base_from "$object"
+ 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 -ne 0; then
+ 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,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
+ # Add 'dependent.h:' lines.
+ sed -ne '2,${
+ s/^ *//
+ s/ \\*$//
+ s/$/:/
+ p
+ }' "$tmpdepfile" >> "$depfile"
+ else
+ make_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.
+ set_dir_from "$object"
+ set_base_from "$object"
+
+ if test "$libtool" = yes; then
+ # Libtool 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$base.o.d # libtool 1.5
+ tmpdepfile2=$dir.libs/$base.o.d # Likewise.
+ tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504
+ "$@" -Wc,-MD
+ else
+ tmpdepfile1=$dir$base.d
+ tmpdepfile2=$dir$base.d
+ tmpdepfile3=$dir$base.d
+ "$@" -MD
+ fi
+
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ exit $stat
+ fi
+
+ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ do
+ test -f "$tmpdepfile" && break
+ done
+ # Same post-processing that is required for AIX mode.
+ aix_post_process_depfile
+ ;;
+
+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 -ne 0; then
+ 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"
+ echo >> "$depfile" # make sure the fragment doesn't end with a backslash
+ 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"
+ # Some versions of the HPUX 10.20 sed can't process this sed invocation
+ # correctly. Breaking it into two sed invocations is a workaround.
+ tr ' ' "$nl" < "$tmpdepfile" \
+ | 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"
+ # Some versions of the HPUX 10.20 sed can't process the last invocation
+ # correctly. Breaking it into two sed invocations is a workaround.
+ sed '1,2d' "$tmpdepfile" \
+ | tr ' ' "$nl" \
+ | 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 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/doc/_static/images/overview/doc-content.png b/doc/_static/images/overview/doc-content.png
new file mode 100644
index 0000000..cb87909
--- /dev/null
+++ b/doc/_static/images/overview/doc-content.png
Binary files differ
diff --git a/doc/_static/images/overview/multi-sheets-sheet1.png b/doc/_static/images/overview/multi-sheets-sheet1.png
new file mode 100644
index 0000000..e21c3b6
--- /dev/null
+++ b/doc/_static/images/overview/multi-sheets-sheet1.png
Binary files differ
diff --git a/doc/_static/images/overview/multi-sheets-sheet2.png b/doc/_static/images/overview/multi-sheets-sheet2.png
new file mode 100644
index 0000000..f2fe458
--- /dev/null
+++ b/doc/_static/images/overview/multi-sheets-sheet2.png
Binary files differ
diff --git a/doc/cli/index.rst b/doc/cli/index.rst
new file mode 100644
index 0000000..ed0726d
--- /dev/null
+++ b/doc/cli/index.rst
@@ -0,0 +1,16 @@
+
+CLI
+===
+
+.. toctree::
+ :maxdepth: 1
+
+ orcus_csv.rst
+ orcus_gnumeric.rst
+ orcus_json.rst
+ orcus_ods.rst
+ orcus_parquet.rst
+ orcus_xls_xml.rst
+ orcus_xlsx.rst
+ orcus_xml.rst
+ orcus_yaml.rst
diff --git a/doc/cli/orcus_csv.rst b/doc/cli/orcus_csv.rst
new file mode 100644
index 0000000..7809d78
--- /dev/null
+++ b/doc/cli/orcus_csv.rst
@@ -0,0 +1,65 @@
+orcus-csv
+=========
+
+Usage
+-----
+
+.. code-block::
+
+ orcus-csv [options] FILE
+
+The FILE must specify a path to an existing file.
+
+Options
+-------
+
+- ``-h [ --help ]``
+
+ Print this help.
+
+- ``-d [ --debug ]``
+
+ Turn on a debug mode and optionally specify a debug level in order to generate run-time debug outputs.
+
+- ``-r [ --recalc ]``
+
+ Re-calculate all formula cells after the documetn is loaded.
+
+- ``-e [ --error-policy ] arg (=fail)``
+
+ Specify whether to abort immediately when the loader fails to parse the first formula cell ('fail'), or skip the offending cells and continue ('skip').
+
+- ``--dump-check``
+
+ Dump the content to stdout in a special format used for content verification in automated tests.
+
+- ``-o [ --output ] arg``
+
+ Output directory path, or output file when --dump-check option is used.
+
+- ``-f [ --output-format ] arg``
+
+ Specify the output format. Supported format types are:
+
+ - check - Flat format that fully encodes document content. Suitable for automated testing.
+ - csv - CSV format.
+ - debug-state - This format dumps the internal state of the document in detail, useful for debugging.
+ - flat - Flat text format that displays document content in grid.
+ - html - HTML format.
+ - json - JSON format.
+ - none - No output to be generated. Maybe useful during development.
+ - xml - This format is currently unsupported.
+ - yaml - This format is currently unsupported.
+
+- ``--row-size arg``
+
+ Specify the number of maximum rows in each sheet.
+
+- ``--row-header arg``
+
+ Specify the number of header rows to repeat if the source content gets split into multiple sheets.
+
+- ``--split``
+
+ Specify whether or not to split the data into multiple sheets in case it won't fit in a single sheet.
+
diff --git a/doc/cli/orcus_gnumeric.rst b/doc/cli/orcus_gnumeric.rst
new file mode 100644
index 0000000..6b6ae23
--- /dev/null
+++ b/doc/cli/orcus_gnumeric.rst
@@ -0,0 +1,57 @@
+orcus-gnumeric
+==============
+
+Usage
+-----
+
+.. code-block::
+
+ orcus-gnumeric [options] FILE
+
+The FILE must specify a path to an existing file.
+
+Options
+-------
+
+- ``-h [ --help ]``
+
+ Print this help.
+
+- ``-d [ --debug ]``
+
+ Turn on a debug mode and optionally specify a debug level in order to generate run-time debug outputs.
+
+- ``-r [ --recalc ]``
+
+ Re-calculate all formula cells after the documetn is loaded.
+
+- ``-e [ --error-policy ] arg (=fail)``
+
+ Specify whether to abort immediately when the loader fails to parse the first formula cell ('fail'), or skip the offending cells and continue ('skip').
+
+- ``--dump-check``
+
+ Dump the content to stdout in a special format used for content verification in automated tests.
+
+- ``-o [ --output ] arg``
+
+ Output directory path, or output file when --dump-check option is used.
+
+- ``-f [ --output-format ] arg``
+
+ Specify the output format. Supported format types are:
+
+ - check - Flat format that fully encodes document content. Suitable for automated testing.
+ - csv - CSV format.
+ - debug-state - This format dumps the internal state of the document in detail, useful for debugging.
+ - flat - Flat text format that displays document content in grid.
+ - html - HTML format.
+ - json - JSON format.
+ - none - No output to be generated. Maybe useful during development.
+ - xml - This format is currently unsupported.
+ - yaml - This format is currently unsupported.
+
+- ``--row-size arg``
+
+ Specify the number of maximum rows in each sheet.
+
diff --git a/doc/cli/orcus_json.rst b/doc/cli/orcus_json.rst
new file mode 100644
index 0000000..be0208b
--- /dev/null
+++ b/doc/cli/orcus_json.rst
@@ -0,0 +1,45 @@
+orcus-json
+==========
+
+Usage
+-----
+
+.. code-block::
+
+ orcus-json [options] FILE
+
+The FILE must specify the path to an existing file.
+
+Options
+-------
+
+- ``-h [ --help ]``
+
+ Print this help.
+
+- ``--mode arg``
+
+ Mode of operation. Select one of the following options: convert, map, map-gen, or structure.
+
+- ``--resolve-refs``
+
+ Resolve JSON references to external files.
+
+- ``-o [ --output ] arg``
+
+ Output file path.
+
+- ``-f [ --output-format ] arg``
+
+ Specify the format of output file. Supported format types are:
+
+ - XML (xml)
+ - JSON (json)
+ - YAML (yaml)
+ - flat tree dump (check)
+ - no output (none)
+
+- ``-m [ --map ] arg``
+
+ Path to a map file. This parameter is only used for map mode, and it is required for map mode.
+
diff --git a/doc/cli/orcus_ods.rst b/doc/cli/orcus_ods.rst
new file mode 100644
index 0000000..fdeb2fa
--- /dev/null
+++ b/doc/cli/orcus_ods.rst
@@ -0,0 +1,57 @@
+orcus-ods
+=========
+
+Usage
+-----
+
+.. code-block::
+
+ orcus-ods [options] FILE
+
+The FILE must specify a path to an existing file.
+
+Options
+-------
+
+- ``-h [ --help ]``
+
+ Print this help.
+
+- ``-d [ --debug ]``
+
+ Turn on a debug mode and optionally specify a debug level in order to generate run-time debug outputs.
+
+- ``-r [ --recalc ]``
+
+ Re-calculate all formula cells after the documetn is loaded.
+
+- ``-e [ --error-policy ] arg (=fail)``
+
+ Specify whether to abort immediately when the loader fails to parse the first formula cell ('fail'), or skip the offending cells and continue ('skip').
+
+- ``--dump-check``
+
+ Dump the content to stdout in a special format used for content verification in automated tests.
+
+- ``-o [ --output ] arg``
+
+ Output directory path, or output file when --dump-check option is used.
+
+- ``-f [ --output-format ] arg``
+
+ Specify the output format. Supported format types are:
+
+ - check - Flat format that fully encodes document content. Suitable for automated testing.
+ - csv - CSV format.
+ - debug-state - This format dumps the internal state of the document in detail, useful for debugging.
+ - flat - Flat text format that displays document content in grid.
+ - html - HTML format.
+ - json - JSON format.
+ - none - No output to be generated. Maybe useful during development.
+ - xml - This format is currently unsupported.
+ - yaml - This format is currently unsupported.
+
+- ``--row-size arg``
+
+ Specify the number of maximum rows in each sheet.
+
diff --git a/doc/cli/orcus_parquet.rst b/doc/cli/orcus_parquet.rst
new file mode 100644
index 0000000..129919e
--- /dev/null
+++ b/doc/cli/orcus_parquet.rst
@@ -0,0 +1,57 @@
+orcus-parquet
+=============
+
+Usage
+-----
+
+.. code-block::
+
+ orcus-parquet [options] FILE
+
+The FILE must specify a path to an existing file.
+
+Options
+-------
+
+- ``-h [ --help ]``
+
+ Print this help.
+
+- ``-d [ --debug ]``
+
+ Turn on a debug mode and optionally specify a debug level in order to generate run-time debug outputs.
+
+- ``-r [ --recalc ]``
+
+ Re-calculate all formula cells after the documetn is loaded.
+
+- ``-e [ --error-policy ] arg (=fail)``
+
+ Specify whether to abort immediately when the loader fails to parse the first formula cell ('fail'), or skip the offending cells and continue ('skip').
+
+- ``--dump-check``
+
+ Dump the content to stdout in a special format used for content verification in automated tests.
+
+- ``-o [ --output ] arg``
+
+ Output directory path, or output file when --dump-check option is used.
+
+- ``-f [ --output-format ] arg``
+
+ Specify the output format. Supported format types are:
+
+ - check - Flat format that fully encodes document content. Suitable for automated testing.
+ - csv - CSV format.
+ - debug-state - This format dumps the internal state of the document in detail, useful for debugging.
+ - flat - Flat text format that displays document content in grid.
+ - html - HTML format.
+ - json - JSON format.
+ - none - No output to be generated. Maybe useful during development.
+ - xml - This format is currently unsupported.
+ - yaml - This format is currently unsupported.
+
+- ``--row-size arg``
+
+ Specify the number of maximum rows in each sheet.
+
diff --git a/doc/cli/orcus_xls_xml.rst b/doc/cli/orcus_xls_xml.rst
new file mode 100644
index 0000000..0081693
--- /dev/null
+++ b/doc/cli/orcus_xls_xml.rst
@@ -0,0 +1,57 @@
+orcus-xls-xml
+=============
+
+Usage
+-----
+
+.. code-block::
+
+ orcus-xls-xml [options] FILE
+
+The FILE must specify a path to an existing file.
+
+Options
+-------
+
+- ``-h [ --help ]``
+
+ Print this help.
+
+- ``-d [ --debug ]``
+
+ Turn on a debug mode and optionally specify a debug level in order to generate run-time debug outputs.
+
+- ``-r [ --recalc ]``
+
+ Re-calculate all formula cells after the documetn is loaded.
+
+- ``-e [ --error-policy ] arg (=fail)``
+
+ Specify whether to abort immediately when the loader fails to parse the first formula cell ('fail'), or skip the offending cells and continue ('skip').
+
+- ``--dump-check``
+
+ Dump the content to stdout in a special format used for content verification in automated tests.
+
+- ``-o [ --output ] arg``
+
+ Output directory path, or output file when --dump-check option is used.
+
+- ``-f [ --output-format ] arg``
+
+ Specify the output format. Supported format types are:
+
+ - check - Flat format that fully encodes document content. Suitable for automated testing.
+ - csv - CSV format.
+ - debug-state - This format dumps the internal state of the document in detail, useful for debugging.
+ - flat - Flat text format that displays document content in grid.
+ - html - HTML format.
+ - json - JSON format.
+ - none - No output to be generated. Maybe useful during development.
+ - xml - This format is currently unsupported.
+ - yaml - This format is currently unsupported.
+
+- ``--row-size arg``
+
+ Specify the number of maximum rows in each sheet.
+
diff --git a/doc/cli/orcus_xlsx.rst b/doc/cli/orcus_xlsx.rst
new file mode 100644
index 0000000..6da6d4c
--- /dev/null
+++ b/doc/cli/orcus_xlsx.rst
@@ -0,0 +1,57 @@
+orcus-xlsx
+==========
+
+Usage
+-----
+
+.. code-block::
+
+ orcus-xlsx [options] FILE
+
+The FILE must specify a path to an existing file.
+
+Options
+-------
+
+- ``-h [ --help ]``
+
+ Print this help.
+
+- ``-d [ --debug ]``
+
+ Turn on a debug mode and optionally specify a debug level in order to generate run-time debug outputs.
+
+- ``-r [ --recalc ]``
+
+ Re-calculate all formula cells after the documetn is loaded.
+
+- ``-e [ --error-policy ] arg (=fail)``
+
+ Specify whether to abort immediately when the loader fails to parse the first formula cell ('fail'), or skip the offending cells and continue ('skip').
+
+- ``--dump-check``
+
+ Dump the content to stdout in a special format used for content verification in automated tests.
+
+- ``-o [ --output ] arg``
+
+ Output directory path, or output file when --dump-check option is used.
+
+- ``-f [ --output-format ] arg``
+
+ Specify the output format. Supported format types are:
+
+ - check - Flat format that fully encodes document content. Suitable for automated testing.
+ - csv - CSV format.
+ - debug-state - This format dumps the internal state of the document in detail, useful for debugging.
+ - flat - Flat text format that displays document content in grid.
+ - html - HTML format.
+ - json - JSON format.
+ - none - No output to be generated. Maybe useful during development.
+ - xml - This format is currently unsupported.
+ - yaml - This format is currently unsupported.
+
+- ``--row-size arg``
+
+ Specify the number of maximum rows in each sheet.
+
diff --git a/doc/cli/orcus_xml.rst b/doc/cli/orcus_xml.rst
new file mode 100644
index 0000000..d41865e
--- /dev/null
+++ b/doc/cli/orcus_xml.rst
@@ -0,0 +1,43 @@
+orcus-xml
+=========
+
+Usage
+-----
+
+.. code-block::
+
+ orcus-xml [OPTIONS] FILE
+
+Options
+-------
+
+- ``-h [ --help ]``
+
+ Print this help.
+
+- ``--mode arg``
+
+ Mode of operation. Select one of the following options: dump, map, map-gen, structure, or transform.
+
+- ``-m [ --map ] arg``
+
+ Path to the map file. A map file is required for all modes except for the structure mode.
+
+- ``-o [ --output ] arg``
+
+ Path to either an output directory, or an output file.
+
+- ``-f [ --output-format ] arg``
+
+ Specify the output format. Supported format types are:
+
+ - check - Flat format that fully encodes document content. Suitable for automated testing.
+ - csv - CSV format.
+ - debug-state - This format dumps the internal state of the document in detail, useful for debugging.
+ - flat - Flat text format that displays document content in grid.
+ - html - HTML format.
+ - json - JSON format.
+ - none - No output to be generated. Maybe useful during development.
+ - xml - This format is currently unsupported.
+ - yaml - This format is currently unsupported.
+
diff --git a/doc/cli/orcus_yaml.rst b/doc/cli/orcus_yaml.rst
new file mode 100644
index 0000000..e29a8ed
--- /dev/null
+++ b/doc/cli/orcus_yaml.rst
@@ -0,0 +1,27 @@
+orcus-yaml
+==========
+
+Usage
+-----
+
+.. code-block::
+
+ orcus-yaml [options] FILE
+
+The FILE must specify a path to an existing file.
+
+Options
+-------
+
+- ``-h [ --help ]``
+
+ Print this help.
+
+- ``-o [ --output ] arg``
+
+ Output file path.
+
+- ``-f [ --output-format ] arg``
+
+ Specify the format of output file. Supported format types are: 1) yaml 2) json
+
diff --git a/doc/conf.py b/doc/conf.py
new file mode 100644
index 0000000..7dffca4
--- /dev/null
+++ b/doc/conf.py
@@ -0,0 +1,288 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# orcus documentation build configuration file, created by
+# sphinx-quickstart on Tue Sep 22 20:54:14 2015.
+#
+# This file is execfile()d with the current directory set to its
+# containing dir.
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+import sys
+import os
+from pathlib import Path
+import subprocess
+
+rtd_build = os.environ.get('READTHEDOCS', None) == 'True'
+
+if rtd_build:
+ subprocess.call("doxygen --version; doxygen doxygen.conf", shell=True)
+
+# Set paths for python modules (for autodoc). The paths must be absolute.
+py_root_path = Path(".") / ".." / "src" / "python"
+py_root_path = py_root_path.absolute()
+sys.path.insert(0, str(py_root_path))
+
+# -- General configuration ------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+#needs_sphinx = '1.0'
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = [
+ "breathe",
+ "sphinxarg.ext",
+ "sphinx.ext.napoleon",
+ "sphinx.ext.autodoc",
+ "sphinx.ext.intersphinx"
+]
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The encoding of source files.
+#source_encoding = 'utf-8-sig'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General information about the project.
+project = 'Orcus'
+copyright = '2023, Kohei Yoshida'
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = '0.19'
+# The full version, including alpha/beta/rc tags.
+release = '0.19.2'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#language = None
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+#today_fmt = '%B %d, %Y'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+exclude_patterns = ['_build']
+
+# The reST default role (used for this markup: `text`) to use for all
+# documents.
+#default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# A list of ignored prefixes for module index sorting.
+#modindex_common_prefix = []
+
+# If true, keep warnings as "system message" paragraphs in the built documents.
+#keep_warnings = False
+
+
+# -- Options for HTML output ----------------------------------------------
+
+# The theme to use for HTML and HTML Help pages. See the documentation for
+# a list of builtin themes.
+html_theme = 'sphinx_rtd_theme'
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further. For a list of options available for each theme, see the
+# documentation.
+html_theme_options = {
+ "navigation_depth": 5,
+}
+
+# Add any paths that contain custom themes here, relative to this directory.
+#html_theme_path = []
+
+# The name for this set of Sphinx documents. If None, it defaults to
+# "<project> v<release> documentation".
+#html_title = None
+
+# A shorter title for the navigation bar. Default is the same as html_title.
+#html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+#html_logo = None
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+#html_favicon = None
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+# Add any extra paths that contain custom files (such as robots.txt or
+# .htaccess) here, relative to this directory. These files are copied
+# directly to the root of the documentation.
+#html_extra_path = []
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+#html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+#html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+#html_additional_pages = {}
+
+# If false, no module index is generated.
+#html_domain_indices = True
+
+# If false, no index is generated.
+#html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+#html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+#html_show_sourcelink = True
+
+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
+#html_show_sphinx = True
+
+# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
+#html_show_copyright = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it. The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# This is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = None
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'orcusdoc'
+
+
+# -- Options for LaTeX output ---------------------------------------------
+
+latex_elements = {
+# The paper size ('letterpaper' or 'a4paper').
+#'papersize': 'letterpaper',
+
+# The font size ('10pt', '11pt' or '12pt').
+#'pointsize': '10pt',
+
+# Additional stuff for the LaTeX preamble.
+#'preamble': '',
+}
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title,
+# author, documentclass [howto, manual, or own class]).
+latex_documents = [
+ ('index', 'orcus.tex', 'Orcus Documentation',
+ 'Kohei Yoshida', 'manual'),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+#latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+#latex_use_parts = False
+
+# If true, show page references after internal links.
+#latex_show_pagerefs = False
+
+# If true, show URL addresses after external links.
+#latex_show_urls = False
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+#latex_domain_indices = True
+
+
+# -- Options for manual page output ---------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+ ('index', 'orcus', 'Orcus Documentation',
+ ['Kohei Yoshida'], 1)
+]
+
+# If true, show URL addresses after external links.
+#man_show_urls = False
+
+
+# -- Options for Texinfo output -------------------------------------------
+
+# Grouping the document tree into Texinfo files. List of tuples
+# (source start file, target name, title, author,
+# dir menu entry, description, category)
+texinfo_documents = [
+ ('index', 'orcus', 'Orcus Documentation',
+ 'Kohei Yoshida', 'Orcus', 'One line description of project.',
+ 'Miscellaneous'),
+]
+
+# Documents to append as an appendix to all manuals.
+#texinfo_appendices = []
+
+# If false, no module index is generated.
+#texinfo_domain_indices = True
+
+# How to display URL addresses: 'footnote', 'no', or 'inline'.
+#texinfo_show_urls = 'footnote'
+
+# If true, do not generate a @detailmenu in the "Top" node's menu.
+#texinfo_no_detailmenu = False
+
+breathe_projects = {"orcus": "./_doxygen/xml"}
+
+breathe_default_project = "orcus"
+
+breathe_default_members = ('members', 'undoc-members')
+
+intersphinx_mapping = {
+ 'python': ('https://docs.python.org/3', None),
+ 'ixion': ('https://ixion.readthedocs.io/en/latest', None),
+}
+
+autodoc_member_order = "bysource"
+
diff --git a/doc/cpp/core/config.rst b/doc/cpp/core/config.rst
new file mode 100644
index 0000000..a5a1f50
--- /dev/null
+++ b/doc/cpp/core/config.rst
@@ -0,0 +1,13 @@
+
+Configurations
+==============
+
+.. doxygenstruct:: orcus::config
+ :members:
+
+.. doxygenstruct:: orcus::json_config
+ :members:
+
+.. doxygenstruct:: orcus::yaml_config
+ :members:
+
diff --git a/doc/cpp/core/import-filter/csv.rst b/doc/cpp/core/import-filter/csv.rst
new file mode 100644
index 0000000..bee2671
--- /dev/null
+++ b/doc/cpp/core/import-filter/csv.rst
@@ -0,0 +1,6 @@
+
+Comma-separated values (CSV)
+============================
+
+.. doxygenclass:: orcus::orcus_csv
+ :members:
diff --git a/doc/cpp/core/import-filter/detect.rst b/doc/cpp/core/import-filter/detect.rst
new file mode 100644
index 0000000..09d6041
--- /dev/null
+++ b/doc/cpp/core/import-filter/detect.rst
@@ -0,0 +1,5 @@
+
+Format detection
+================
+
+.. doxygenfunction:: orcus::detect
diff --git a/doc/cpp/core/import-filter/gnumeric.rst b/doc/cpp/core/import-filter/gnumeric.rst
new file mode 100644
index 0000000..23a2bf9
--- /dev/null
+++ b/doc/cpp/core/import-filter/gnumeric.rst
@@ -0,0 +1,6 @@
+
+Gnumeric XML
+============
+
+.. doxygenclass:: orcus::orcus_gnumeric
+ :members:
diff --git a/doc/cpp/core/import-filter/index.rst b/doc/cpp/core/import-filter/index.rst
new file mode 100644
index 0000000..0b6befa
--- /dev/null
+++ b/doc/cpp/core/import-filter/index.rst
@@ -0,0 +1,20 @@
+
+Import filters
+==============
+
+.. toctree::
+ :maxdepth: 1
+
+ csv.rst
+ ods.rst
+ xls_xml.rst
+ xlsx.rst
+ gnumeric.rst
+ xml.rst
+ json.rst
+ detect.rst
+
+
+
+
+
diff --git a/doc/cpp/core/import-filter/json.rst b/doc/cpp/core/import-filter/json.rst
new file mode 100644
index 0000000..eb55810
--- /dev/null
+++ b/doc/cpp/core/import-filter/json.rst
@@ -0,0 +1,6 @@
+
+Generic JSON
+============
+
+.. doxygenclass:: orcus::orcus_json
+ :members:
diff --git a/doc/cpp/core/import-filter/ods.rst b/doc/cpp/core/import-filter/ods.rst
new file mode 100644
index 0000000..527b064
--- /dev/null
+++ b/doc/cpp/core/import-filter/ods.rst
@@ -0,0 +1,9 @@
+
+Open document spreadsheet
+=========================
+
+.. doxygenclass:: orcus::orcus_ods
+ :members:
+
+.. doxygenclass:: orcus::import_ods
+ :members:
diff --git a/doc/cpp/core/import-filter/xls_xml.rst b/doc/cpp/core/import-filter/xls_xml.rst
new file mode 100644
index 0000000..48a5371
--- /dev/null
+++ b/doc/cpp/core/import-filter/xls_xml.rst
@@ -0,0 +1,6 @@
+
+Microsoft Excel 2003 XML
+========================
+
+.. doxygenclass:: orcus::orcus_xls_xml
+ :members:
diff --git a/doc/cpp/core/import-filter/xlsx.rst b/doc/cpp/core/import-filter/xlsx.rst
new file mode 100644
index 0000000..4c468ca
--- /dev/null
+++ b/doc/cpp/core/import-filter/xlsx.rst
@@ -0,0 +1,9 @@
+
+Microsoft Excel 2007 XML
+========================
+
+.. doxygenclass:: orcus::orcus_xlsx
+ :members:
+
+.. doxygenclass:: orcus::import_xlsx
+ :members:
diff --git a/doc/cpp/core/import-filter/xml.rst b/doc/cpp/core/import-filter/xml.rst
new file mode 100644
index 0000000..67d9fd9
--- /dev/null
+++ b/doc/cpp/core/import-filter/xml.rst
@@ -0,0 +1,6 @@
+
+Generic XML
+===========
+
+.. doxygenclass:: orcus::orcus_xml
+ :members:
diff --git a/doc/cpp/core/index.rst b/doc/cpp/core/index.rst
new file mode 100644
index 0000000..3bb0623
--- /dev/null
+++ b/doc/cpp/core/index.rst
@@ -0,0 +1,25 @@
+
+Core
+====
+
+This section presents the API's from the ``liborcus`` part of this library,
+which contains the import filters that process various file formats containing
+spreadsheet document contents or contents that can be loaded into spreadsheet
+documents. It consists of the filter classes that parse the file streams and
+put their contents into the document store via a set of pre-defined interfaces,
+and these interfaces themselves.
+
+This module does not contain the document store itself, which is provided by
+the ``liborcus-spreadsheet-model`` module. Alternatively, the user can
+provide their own document store implementation wrapped inside a factory that
+provides all required interfaces.
+
+.. toctree::
+ :maxdepth: 1
+
+ import-filter/index.rst
+ tree-doc/index.rst
+ interface/index.rst
+ types/index.rst
+ utils.rst
+ config.rst
diff --git a/doc/cpp/core/interface/global.rst b/doc/cpp/core/interface/global.rst
new file mode 100644
index 0000000..0e73e47
--- /dev/null
+++ b/doc/cpp/core/interface/global.rst
@@ -0,0 +1,12 @@
+
+Global interfaces
+=================
+
+The following global interfaces are used to abstract the concrete filter and
+document classes from orcus's CLI framework.
+
+.. doxygenclass:: orcus::iface::import_filter
+ :members:
+
+.. doxygenclass:: orcus::iface::document_dumper
+ :members:
diff --git a/doc/cpp/core/interface/index.rst b/doc/cpp/core/interface/index.rst
new file mode 100644
index 0000000..92c22d0
--- /dev/null
+++ b/doc/cpp/core/interface/index.rst
@@ -0,0 +1,9 @@
+
+Interfaces
+==========
+
+.. toctree::
+ :maxdepth: 1
+
+ global.rst
+ spreadsheet/index.rst
diff --git a/doc/cpp/core/interface/spreadsheet/document.rst b/doc/cpp/core/interface/spreadsheet/document.rst
new file mode 100644
index 0000000..95eed76
--- /dev/null
+++ b/doc/cpp/core/interface/spreadsheet/document.rst
@@ -0,0 +1,21 @@
+
+Document import
+===============
+
+The following interfaces handle importing of contents and properties related to
+the entire document store.
+
+.. doxygenclass:: orcus::spreadsheet::iface::import_factory
+ :members:
+
+.. doxygenclass:: orcus::spreadsheet::iface::import_global_settings
+ :members:
+
+.. doxygenclass:: orcus::spreadsheet::iface::import_shared_strings
+ :members:
+
+.. doxygenclass:: orcus::spreadsheet::iface::import_named_expression
+ :members:
+
+.. doxygenclass:: orcus::spreadsheet::iface::import_reference_resolver
+ :members:
diff --git a/doc/cpp/core/interface/spreadsheet/document_export.rst b/doc/cpp/core/interface/spreadsheet/document_export.rst
new file mode 100644
index 0000000..984c059
--- /dev/null
+++ b/doc/cpp/core/interface/spreadsheet/document_export.rst
@@ -0,0 +1,13 @@
+
+Document export
+===============
+
+The following interfaces handle exporting of document content. Support for exporting
+is still very limited in orcus. It is currently used only by :cpp:class:`~orcus::orcus_xml`
+to re-export the content of an XML-mapped cell range as an XML output.
+
+.. doxygenclass:: orcus::spreadsheet::iface::export_sheet
+ :members:
+
+.. doxygenclass:: orcus::spreadsheet::iface::export_factory
+ :members:
diff --git a/doc/cpp/core/interface/spreadsheet/index.rst b/doc/cpp/core/interface/spreadsheet/index.rst
new file mode 100644
index 0000000..4254c22
--- /dev/null
+++ b/doc/cpp/core/interface/spreadsheet/index.rst
@@ -0,0 +1,15 @@
+
+.. _spreadsheet-interfaces:
+
+Spreadsheet interfaces
+======================
+
+.. toctree::
+ :maxdepth: 1
+
+ document.rst
+ sheet.rst
+ pivot.rst
+ styles.rst
+ view.rst
+ document_export.rst
diff --git a/doc/cpp/core/interface/spreadsheet/pivot.rst b/doc/cpp/core/interface/spreadsheet/pivot.rst
new file mode 100644
index 0000000..28d8df7
--- /dev/null
+++ b/doc/cpp/core/interface/spreadsheet/pivot.rst
@@ -0,0 +1,14 @@
+
+Pivot table import
+==================
+
+The folloiwng interfaces handle importing of contents related to pivot tables.
+
+.. doxygenclass:: orcus::spreadsheet::iface::import_pivot_cache_definition
+ :members:
+
+.. doxygenclass:: orcus::spreadsheet::iface::import_pivot_cache_field_group
+ :members:
+
+.. doxygenclass:: orcus::spreadsheet::iface::import_pivot_cache_records
+ :members:
diff --git a/doc/cpp/core/interface/spreadsheet/sheet.rst b/doc/cpp/core/interface/spreadsheet/sheet.rst
new file mode 100644
index 0000000..6482ac6
--- /dev/null
+++ b/doc/cpp/core/interface/spreadsheet/sheet.rst
@@ -0,0 +1,30 @@
+
+Sheet import
+============
+
+The following interfaces handle importing of contents and properties related to
+individual sheets.
+
+.. doxygenclass:: orcus::spreadsheet::iface::import_sheet
+ :members:
+
+.. doxygenclass:: orcus::spreadsheet::iface::import_sheet_properties
+ :members:
+
+.. doxygenclass:: orcus::spreadsheet::iface::import_data_table
+ :members:
+
+.. doxygenclass:: orcus::spreadsheet::iface::import_auto_filter
+ :members:
+
+.. doxygenclass:: orcus::spreadsheet::iface::import_conditional_format
+ :members:
+
+.. doxygenclass:: orcus::spreadsheet::iface::import_table
+ :members:
+
+.. doxygenclass:: orcus::spreadsheet::iface::import_formula
+ :members:
+
+.. doxygenclass:: orcus::spreadsheet::iface::import_array_formula
+ :members:
diff --git a/doc/cpp/core/interface/spreadsheet/styles.rst b/doc/cpp/core/interface/spreadsheet/styles.rst
new file mode 100644
index 0000000..1c4f9a8
--- /dev/null
+++ b/doc/cpp/core/interface/spreadsheet/styles.rst
@@ -0,0 +1,30 @@
+
+Styles import
+=============
+
+The folloiwng interfaces handle importing of properties related to various
+formatting styles.
+
+.. doxygenclass:: orcus::spreadsheet::iface::import_styles
+ :members:
+
+.. doxygenclass:: orcus::spreadsheet::iface::import_font_style
+ :members:
+
+.. doxygenclass:: orcus::spreadsheet::iface::import_fill_style
+ :members:
+
+.. doxygenclass:: orcus::spreadsheet::iface::import_border_style
+ :members:
+
+.. doxygenclass:: orcus::spreadsheet::iface::import_cell_protection
+ :members:
+
+.. doxygenclass:: orcus::spreadsheet::iface::import_number_format
+ :members:
+
+.. doxygenclass:: orcus::spreadsheet::iface::import_xf
+ :members:
+
+.. doxygenclass:: orcus::spreadsheet::iface::import_cell_style
+ :members:
diff --git a/doc/cpp/core/interface/spreadsheet/view.rst b/doc/cpp/core/interface/spreadsheet/view.rst
new file mode 100644
index 0000000..21f393e
--- /dev/null
+++ b/doc/cpp/core/interface/spreadsheet/view.rst
@@ -0,0 +1,9 @@
+
+View properties import
+======================
+
+The following interface handles importing of view properties. View properties
+affect how the content of a document may get displayed.
+
+.. doxygenclass:: orcus::spreadsheet::iface::import_sheet_view
+ :members:
diff --git a/doc/cpp/core/tree-doc/index.rst b/doc/cpp/core/tree-doc/index.rst
new file mode 100644
index 0000000..54b7a68
--- /dev/null
+++ b/doc/cpp/core/tree-doc/index.rst
@@ -0,0 +1,13 @@
+
+Document tree
+=============
+
+This section presents the API's for tree-structured documents, namely JSON and YAML
+documents.
+
+
+.. toctree::
+ :maxdepth: 1
+
+ json.rst
+ yaml.rst
diff --git a/doc/cpp/core/tree-doc/json.rst b/doc/cpp/core/tree-doc/json.rst
new file mode 100644
index 0000000..390ac37
--- /dev/null
+++ b/doc/cpp/core/tree-doc/json.rst
@@ -0,0 +1,36 @@
+
+JSON document tree
+==================
+
+Document tree
+-------------
+
+.. doxygenclass:: orcus::json::document_tree
+ :members:
+
+.. doxygenclass:: orcus::json::const_node
+ :members:
+
+.. doxygenclass:: orcus::json::node
+ :members:
+
+.. doxygenclass:: orcus::json::array
+ :members:
+
+.. doxygenclass:: orcus::json::object
+ :members:
+
+.. doxygenclass:: orcus::json::detail::init::node
+ :members:
+
+.. doxygenenum:: orcus::json::node_t
+ :project: orcus
+
+Exceptions
+----------
+
+.. doxygenclass:: orcus::json::document_error
+ :members:
+
+.. doxygenclass:: orcus::json::key_value_error
+ :members:
diff --git a/doc/cpp/core/tree-doc/yaml.rst b/doc/cpp/core/tree-doc/yaml.rst
new file mode 100644
index 0000000..547440b
--- /dev/null
+++ b/doc/cpp/core/tree-doc/yaml.rst
@@ -0,0 +1,19 @@
+
+YAML document tree
+==================
+
+Document tree
+-------------
+
+.. doxygenclass:: orcus::yaml::document_tree
+ :members:
+
+.. doxygenclass:: orcus::yaml::const_node
+ :members:
+
+Exceptions
+----------
+
+.. doxygenclass:: orcus::yaml::document_error
+ :members:
+
diff --git a/doc/cpp/core/types/core.rst b/doc/cpp/core/types/core.rst
new file mode 100644
index 0000000..1decff2
--- /dev/null
+++ b/doc/cpp/core/types/core.rst
@@ -0,0 +1,68 @@
+
+Core types
+==========
+
+Integral types
+--------------
+
+.. doxygentypedef:: orcus::spreadsheet::row_t
+.. doxygentypedef:: orcus::spreadsheet::col_t
+.. doxygentypedef:: orcus::spreadsheet::sheet_t
+.. doxygentypedef:: orcus::spreadsheet::color_elem_t
+.. doxygentypedef:: orcus::spreadsheet::col_width_t
+.. doxygentypedef:: orcus::spreadsheet::row_height_t
+.. doxygentypedef:: orcus::spreadsheet::pivot_cache_id_t
+
+
+Structs
+-------
+
+.. doxygenstruct:: orcus::spreadsheet::address_t
+ :members:
+
+.. doxygenstruct:: orcus::spreadsheet::range_size_t
+ :members:
+
+.. doxygenstruct:: orcus::spreadsheet::range_t
+ :members:
+
+.. doxygenstruct:: orcus::spreadsheet::src_address_t
+ :members:
+
+.. doxygenstruct:: orcus::spreadsheet::src_range_t
+ :members:
+
+.. doxygenstruct:: orcus::spreadsheet::color_rgb_t
+ :members:
+
+
+Enums
+-----
+
+.. doxygenenum:: orcus::spreadsheet::error_value_t
+.. doxygenenum:: orcus::spreadsheet::border_direction_t
+.. doxygenenum:: orcus::spreadsheet::border_style_t
+.. doxygenenum:: orcus::spreadsheet::fill_pattern_t
+.. doxygenenum:: orcus::spreadsheet::strikethrough_style_t
+.. doxygenenum:: orcus::spreadsheet::strikethrough_type_t
+.. doxygenenum:: orcus::spreadsheet::strikethrough_width_t
+.. doxygenenum:: orcus::spreadsheet::strikethrough_text_t
+.. doxygenenum:: orcus::spreadsheet::formula_grammar_t
+.. doxygenenum:: orcus::spreadsheet::formula_t
+.. doxygenenum:: orcus::spreadsheet::formula_ref_context_t
+.. doxygenenum:: orcus::spreadsheet::formula_error_policy_t
+.. doxygenenum:: orcus::spreadsheet::underline_t
+.. doxygenenum:: orcus::spreadsheet::underline_width_t
+.. doxygenenum:: orcus::spreadsheet::underline_mode_t
+.. doxygenenum:: orcus::spreadsheet::underline_type_t
+.. doxygenenum:: orcus::spreadsheet::hor_alignment_t
+.. doxygenenum:: orcus::spreadsheet::ver_alignment_t
+.. doxygenenum:: orcus::spreadsheet::xf_category_t
+.. doxygenenum:: orcus::spreadsheet::data_table_type_t
+.. doxygenenum:: orcus::spreadsheet::totals_row_function_t
+.. doxygenenum:: orcus::spreadsheet::conditional_format_t
+.. doxygenenum:: orcus::spreadsheet::condition_operator_t
+.. doxygenenum:: orcus::spreadsheet::condition_type_t
+.. doxygenenum:: orcus::spreadsheet::condition_date_t
+.. doxygenenum:: orcus::spreadsheet::databar_axis_t
+.. doxygenenum:: orcus::spreadsheet::pivot_cache_group_by_t
diff --git a/doc/cpp/core/types/index.rst b/doc/cpp/core/types/index.rst
new file mode 100644
index 0000000..a79f3f8
--- /dev/null
+++ b/doc/cpp/core/types/index.rst
@@ -0,0 +1,12 @@
+
+Types
+=====
+
+These types are used throughout the spreadsheet import and export interfaces.
+
+.. toctree::
+ :maxdepth: 1
+
+ core.rst
+ view.rst
+
diff --git a/doc/cpp/core/types/view.rst b/doc/cpp/core/types/view.rst
new file mode 100644
index 0000000..a542a62
--- /dev/null
+++ b/doc/cpp/core/types/view.rst
@@ -0,0 +1,20 @@
+
+View types
+==========
+
+Structs
+-------
+
+.. doxygenstruct:: orcus::spreadsheet::split_pane_t
+ :members:
+
+.. doxygenstruct:: orcus::spreadsheet::frozen_pane_t
+ :members:
+
+
+Enums
+-----
+
+.. doxygenenum:: orcus::spreadsheet::sheet_pane_t
+.. doxygenenum:: orcus::spreadsheet::pane_state_t
+
diff --git a/doc/cpp/core/utils.rst b/doc/cpp/core/utils.rst
new file mode 100644
index 0000000..480ae87
--- /dev/null
+++ b/doc/cpp/core/utils.rst
@@ -0,0 +1,19 @@
+
+Utilities
+=========
+
+Special values
+--------------
+
+.. doxygenfunction:: orcus::spreadsheet::get_default_column_width
+.. doxygenfunction:: orcus::spreadsheet::get_default_row_height
+
+Type conversion
+---------------
+
+.. doxygenfunction:: orcus::spreadsheet::to_totals_row_function_enum
+.. doxygenfunction:: orcus::spreadsheet::to_pivot_cache_group_by_enum
+.. doxygenfunction:: orcus::spreadsheet::to_error_value_enum
+.. doxygenfunction:: orcus::spreadsheet::to_color_rgb
+.. doxygenfunction:: orcus::spreadsheet::to_rc_address
+.. doxygenfunction:: orcus::spreadsheet::to_rc_range
diff --git a/doc/cpp/index.rst b/doc/cpp/index.rst
new file mode 100644
index 0000000..afb4909
--- /dev/null
+++ b/doc/cpp/index.rst
@@ -0,0 +1,10 @@
+
+C++ API reference
+=================
+
+.. toctree::
+ :maxdepth: 2
+
+ parser/index.rst
+ core/index.rst
+ spreadsheet-doc/index.rst
diff --git a/doc/cpp/parser/archive.rst b/doc/cpp/parser/archive.rst
new file mode 100644
index 0000000..e5f7a25
--- /dev/null
+++ b/doc/cpp/parser/archive.rst
@@ -0,0 +1,21 @@
+
+Archive
+=======
+
+Zip archive
+-----------
+
+.. doxygenstruct:: orcus::zip_file_entry_header
+ :members:
+
+.. doxygenclass:: orcus::zip_archive
+ :members:
+
+.. doxygenclass:: orcus::zip_archive_stream
+ :members:
+
+.. doxygenclass:: orcus::zip_archive_stream_fd
+ :members:
+
+.. doxygenclass:: orcus::zip_archive_stream_blob
+ :members:
diff --git a/doc/cpp/parser/base64.rst b/doc/cpp/parser/base64.rst
new file mode 100644
index 0000000..617db37
--- /dev/null
+++ b/doc/cpp/parser/base64.rst
@@ -0,0 +1,5 @@
+
+Base64
+======
+
+.. doxygenfile:: base64.hpp
diff --git a/doc/cpp/parser/css.rst b/doc/cpp/parser/css.rst
new file mode 100644
index 0000000..beb6cb2
--- /dev/null
+++ b/doc/cpp/parser/css.rst
@@ -0,0 +1,84 @@
+.. highlight:: cpp
+
+CSS parser
+==========
+
+.. doxygenclass:: orcus::css_parser
+ :members:
+
+Parser handler
+--------------
+
+.. doxygenclass:: orcus::css_handler
+ :members:
+
+CSS types
+---------
+
+.. doxygenenum:: orcus::css::combinator_t
+.. doxygenenum:: orcus::css::property_function_t
+.. doxygenenum:: orcus::css::property_value_t
+
+.. doxygentypedef:: orcus::css::pseudo_element_t
+.. doxygentypedef:: orcus::css::pseudo_class_t
+
+.. doxygenstruct:: orcus::css::rgba_color_t
+.. doxygenstruct:: orcus::css::hsla_color_t
+
+
+Constants
+---------
+
+Pseudo elements
+^^^^^^^^^^^^^^^
+
+.. doxygenvariable:: orcus::css::pseudo_element_after
+.. doxygenvariable:: orcus::css::pseudo_element_before
+.. doxygenvariable:: orcus::css::pseudo_element_first_letter
+.. doxygenvariable:: orcus::css::pseudo_element_first_line
+.. doxygenvariable:: orcus::css::pseudo_element_selection
+.. doxygenvariable:: orcus::css::pseudo_element_backdrop
+
+Pseudo classes
+^^^^^^^^^^^^^^
+
+.. doxygenvariable:: orcus::css::pseudo_class_active
+.. doxygenvariable:: orcus::css::pseudo_class_checked
+.. doxygenvariable:: orcus::css::pseudo_class_default
+.. doxygenvariable:: orcus::css::pseudo_class_dir
+.. doxygenvariable:: orcus::css::pseudo_class_disabled
+.. doxygenvariable:: orcus::css::pseudo_class_empty
+.. doxygenvariable:: orcus::css::pseudo_class_enabled
+.. doxygenvariable:: orcus::css::pseudo_class_first
+.. doxygenvariable:: orcus::css::pseudo_class_first_child
+.. doxygenvariable:: orcus::css::pseudo_class_first_of_type
+.. doxygenvariable:: orcus::css::pseudo_class_fullscreen
+.. doxygenvariable:: orcus::css::pseudo_class_focus
+.. doxygenvariable:: orcus::css::pseudo_class_hover
+.. doxygenvariable:: orcus::css::pseudo_class_indeterminate
+.. doxygenvariable:: orcus::css::pseudo_class_in_range
+.. doxygenvariable:: orcus::css::pseudo_class_invalid
+.. doxygenvariable:: orcus::css::pseudo_class_lang
+.. doxygenvariable:: orcus::css::pseudo_class_last_child
+.. doxygenvariable:: orcus::css::pseudo_class_last_of_type
+.. doxygenvariable:: orcus::css::pseudo_class_left
+.. doxygenvariable:: orcus::css::pseudo_class_link
+.. doxygenvariable:: orcus::css::pseudo_class_not
+.. doxygenvariable:: orcus::css::pseudo_class_nth_child
+.. doxygenvariable:: orcus::css::pseudo_class_nth_last_child
+.. doxygenvariable:: orcus::css::pseudo_class_nth_last_of_type
+.. doxygenvariable:: orcus::css::pseudo_class_nth_of_type
+.. doxygenvariable:: orcus::css::pseudo_class_only_child
+.. doxygenvariable:: orcus::css::pseudo_class_only_of_type
+.. doxygenvariable:: orcus::css::pseudo_class_optional
+.. doxygenvariable:: orcus::css::pseudo_class_out_of_range
+.. doxygenvariable:: orcus::css::pseudo_class_read_only
+.. doxygenvariable:: orcus::css::pseudo_class_read_write
+.. doxygenvariable:: orcus::css::pseudo_class_required
+.. doxygenvariable:: orcus::css::pseudo_class_right
+.. doxygenvariable:: orcus::css::pseudo_class_root
+.. doxygenvariable:: orcus::css::pseudo_class_scope
+.. doxygenvariable:: orcus::css::pseudo_class_target
+.. doxygenvariable:: orcus::css::pseudo_class_valid
+.. doxygenvariable:: orcus::css::pseudo_class_visited
+
diff --git a/doc/cpp/parser/csv.rst b/doc/cpp/parser/csv.rst
new file mode 100644
index 0000000..67e708a
--- /dev/null
+++ b/doc/cpp/parser/csv.rst
@@ -0,0 +1,17 @@
+.. highlight:: cpp
+
+CSV parser
+==========
+
+.. doxygenclass:: orcus::csv_parser
+ :members:
+
+.. doxygenstruct:: orcus::csv::parser_config
+ :members:
+
+Parser handler
+--------------
+
+.. doxygenclass:: orcus::csv_handler
+ :members:
+
diff --git a/doc/cpp/parser/exception.rst b/doc/cpp/parser/exception.rst
new file mode 100644
index 0000000..e6b14cc
--- /dev/null
+++ b/doc/cpp/parser/exception.rst
@@ -0,0 +1,37 @@
+.. highlight:: cpp
+
+Exceptions
+==========
+
+.. doxygenclass:: orcus::general_error
+ :members:
+
+.. doxygenclass:: orcus::invalid_arg_error
+ :members:
+
+.. doxygenclass:: orcus::xml_structure_error
+ :members:
+
+.. doxygenclass:: orcus::json_structure_error
+ :members:
+
+.. doxygenclass:: orcus::invalid_map_error
+ :members:
+
+.. doxygenclass:: orcus::value_error
+ :members:
+
+.. doxygenclass:: orcus::xpath_error
+ :members:
+
+.. doxygenclass:: orcus::interface_error
+ :members:
+
+.. doxygenclass:: orcus::parse_error
+ :members:
+
+.. doxygenclass:: orcus::malformed_xml_error
+ :members:
+
+.. doxygenclass:: orcus::zip_error
+ :members:
diff --git a/doc/cpp/parser/index.rst b/doc/cpp/parser/index.rst
new file mode 100644
index 0000000..5a8141b
--- /dev/null
+++ b/doc/cpp/parser/index.rst
@@ -0,0 +1,24 @@
+
+Low-level parsers
+=================
+
+This section presents the API's from the ``liborcus-parser`` part of this library,
+which contains low-level parsers and utilities either used by or used in conjunction
+with the parsers. The higher level import filters document models internally use
+these parsers and utilities.
+
+.. toctree::
+ :maxdepth: 1
+
+ xml.rst
+ xml_writer.rst
+ json.rst
+ css.rst
+ csv.rst
+ yaml.rst
+ types.rst
+ util.rst
+ stream.rst
+ base64.rst
+ archive.rst
+ exception.rst
diff --git a/doc/cpp/parser/json.rst b/doc/cpp/parser/json.rst
new file mode 100644
index 0000000..8aa402b
--- /dev/null
+++ b/doc/cpp/parser/json.rst
@@ -0,0 +1,14 @@
+.. highlight:: cpp
+
+JSON parser
+===========
+
+.. doxygenclass:: orcus::json_parser
+ :members:
+
+Parser handler
+--------------
+
+.. doxygenclass:: orcus::json_handler
+ :members:
+
diff --git a/doc/cpp/parser/stream.rst b/doc/cpp/parser/stream.rst
new file mode 100644
index 0000000..6f8ecde
--- /dev/null
+++ b/doc/cpp/parser/stream.rst
@@ -0,0 +1,24 @@
+.. highlight:: cpp
+
+Stream
+======
+
+Stream buffers
+--------------
+
+.. doxygenclass:: orcus::file_content
+ :members:
+
+.. doxygenclass:: orcus::memory_content
+ :members:
+
+Utility functions
+-----------------
+
+.. doxygenstruct:: orcus::line_with_offset
+ :members:
+
+.. doxygenfunction:: orcus::create_parse_error_output
+.. doxygenfunction:: orcus::locate_line_with_offset
+.. doxygenfunction:: orcus::locate_first_different_char
+.. doxygenfunction:: orcus::calc_logical_string_length
diff --git a/doc/cpp/parser/types.rst b/doc/cpp/parser/types.rst
new file mode 100644
index 0000000..6c53267
--- /dev/null
+++ b/doc/cpp/parser/types.rst
@@ -0,0 +1,43 @@
+
+Basic types
+===========
+
+Constants
+---------
+
+.. doxygenvariable:: orcus::INDEX_NOT_FOUND
+.. doxygenvariable:: orcus::XMLNS_UNKNOWN_ID
+.. doxygenvariable:: orcus::XML_UNKNOWN_TOKEN
+
+Type aliases
+------------
+
+.. doxygentypedef:: orcus::xml_token_attrs_t
+.. doxygentypedef:: orcus::xml_token_t
+.. doxygentypedef:: orcus::xmlns_id_t
+
+Structs
+-------
+
+.. doxygenstruct:: orcus::date_time_t
+.. doxygenstruct:: orcus::length_t
+.. doxygenstruct:: orcus::parse_error_value_t
+.. doxygenstruct:: orcus::xml_declaration_t
+.. doxygenstruct:: orcus::xml_name_t
+.. doxygenstruct:: orcus::xml_token_attr_t
+.. doxygenstruct:: orcus::xml_token_element_t
+
+Enums
+-----
+
+.. doxygenenum:: orcus::character_set_t
+.. doxygenenum:: orcus::dump_format_t
+.. doxygenenum:: orcus::format_t
+.. doxygenenum:: orcus::length_unit_t
+
+Utility functions
+-----------------
+
+.. doxygenfunction:: orcus::get_dump_format_entries
+.. doxygenfunction:: orcus::to_character_set
+.. doxygenfunction:: orcus::to_dump_format_enum
diff --git a/doc/cpp/parser/util.rst b/doc/cpp/parser/util.rst
new file mode 100644
index 0000000..2d3ec0d
--- /dev/null
+++ b/doc/cpp/parser/util.rst
@@ -0,0 +1,13 @@
+.. highlight:: cpp
+
+Utilities
+=========
+
+.. doxygenclass:: orcus::string_pool
+ :members:
+
+.. doxygenclass:: orcus::tokens
+ :members:
+
+.. doxygenclass:: orcus::cell_buffer
+ :members:
diff --git a/doc/cpp/parser/xml.rst b/doc/cpp/parser/xml.rst
new file mode 100644
index 0000000..462c466
--- /dev/null
+++ b/doc/cpp/parser/xml.rst
@@ -0,0 +1,65 @@
+.. highlight:: cpp
+
+XML parsers
+===========
+
+SAX base parser
+---------------
+
+.. doxygenclass:: orcus::sax_parser
+ :members:
+
+.. doxygenstruct:: orcus::sax_parser_default_config
+ :members:
+
+.. doxygenclass:: orcus::sax_handler
+ :members:
+
+.. doxygenstruct:: orcus::sax::parser_element
+ :members:
+
+.. doxygenstruct:: orcus::sax::parser_attribute
+ :members:
+
+SAX namespace parser
+--------------------
+
+.. doxygenclass:: orcus::sax_ns_parser
+ :members:
+
+.. doxygenclass:: orcus::sax_ns_handler
+ :members:
+
+.. doxygenstruct:: orcus::sax_ns_parser_element
+ :members:
+
+.. doxygenstruct:: orcus::sax_ns_parser_attribute
+ :members:
+
+SAX token parser
+----------------
+
+.. doxygenclass:: orcus::sax_token_parser
+ :members:
+
+.. doxygenclass:: orcus::sax_token_handler
+ :members:
+
+Namespace
+---------
+
+.. doxygenclass:: orcus::xmlns_repository
+ :members:
+
+.. doxygenclass:: orcus::xmlns_context
+ :members:
+
+Common
+------
+
+.. doxygenstruct:: orcus::sax::doctype_declaration
+ :members:
+
+.. doxygenfunction:: orcus::sax::decode_xml_encoded_char
+
+.. doxygenfunction:: orcus::sax::decode_xml_unicode_char
diff --git a/doc/cpp/parser/xml_writer.rst b/doc/cpp/parser/xml_writer.rst
new file mode 100644
index 0000000..1092ac4
--- /dev/null
+++ b/doc/cpp/parser/xml_writer.rst
@@ -0,0 +1,7 @@
+.. highlight:: cpp
+
+XML writer
+==========
+
+.. doxygenclass:: orcus::xml_writer
+ :members:
diff --git a/doc/cpp/parser/yaml.rst b/doc/cpp/parser/yaml.rst
new file mode 100644
index 0000000..0a1107a
--- /dev/null
+++ b/doc/cpp/parser/yaml.rst
@@ -0,0 +1,14 @@
+.. highlight:: cpp
+
+YAML parser
+===========
+
+.. doxygenclass:: orcus::yaml_parser
+ :members:
+
+Parser Handler
+--------------
+
+.. doxygenclass:: orcus::yaml_handler
+ :members:
+
diff --git a/doc/cpp/spreadsheet-doc/document.rst b/doc/cpp/spreadsheet-doc/document.rst
new file mode 100644
index 0000000..0b03610
--- /dev/null
+++ b/doc/cpp/spreadsheet-doc/document.rst
@@ -0,0 +1,9 @@
+
+Document
+========
+
+.. doxygenclass:: orcus::spreadsheet::document
+ :members:
+
+.. doxygenstruct:: orcus::spreadsheet::document_config
+ :members:
diff --git a/doc/cpp/spreadsheet-doc/import-export.rst b/doc/cpp/spreadsheet-doc/import-export.rst
new file mode 100644
index 0000000..0c5b801
--- /dev/null
+++ b/doc/cpp/spreadsheet-doc/import-export.rst
@@ -0,0 +1,50 @@
+
+Import and export
+=================
+
+The classes in this section can be viewed as the points of entry for initiating
+import or export processes.
+
+The :cpp:class:`~orcus::spreadsheet::import_factory` class wraps
+:cpp:class:`~orcus::spreadsheet::document` as its destination storage then
+gets passed to an import filter class that parses the content of an input file
+and populates the destination document store.
+
+The :cpp:class:`~orcus::spreadsheet::import_styles` class works similarly to
+:cpp:class:`~orcus::spreadsheet::import_factory` in that it wraps
+:cpp:class:`~orcus::spreadsheet::styles` as its destination storage then gets
+passed to a styles import parser in order to get the destination store
+populated. Although this class is used by
+:cpp:class:`~orcus::spreadsheet::import_factory` internally, it can also be
+instantiated independently to allow loading of just the styles data.
+
+The :cpp:class:`~orcus::spreadsheet::export_factory` also works in a similar
+fashion, however; the export functionality of the orcus library is currently
+very limited and should be considered experimental. It is currently only used
+by :cpp:class:`~orcus::orcus_xml` to export the content of a document which
+was originally imported from an XML document.
+
+.. warning::
+
+ The export functionality of the orcus library is highly experimental.
+
+
+Import factory
+--------------
+
+.. doxygenclass:: orcus::spreadsheet::import_factory
+ :members:
+
+
+Import styles
+-------------
+
+.. doxygenclass:: orcus::spreadsheet::import_styles
+ :members:
+
+
+Export factory
+--------------
+
+.. doxygenclass:: orcus::spreadsheet::export_factory
+ :members:
diff --git a/doc/cpp/spreadsheet-doc/index.rst b/doc/cpp/spreadsheet-doc/index.rst
new file mode 100644
index 0000000..b0c2c94
--- /dev/null
+++ b/doc/cpp/spreadsheet-doc/index.rst
@@ -0,0 +1,21 @@
+
+Spreadsheet document
+====================
+
+This section contains the API's related to the spreadsheet document storage, which
+is provided by the ``liborcus-spreadsheet`` part of this library. This ``liborcus-spreadsheet``
+module has dependency on the :ref:`ixion <ixion:index>` library in order to perform
+computation of formula cells.
+
+.. toctree::
+ :maxdepth: 1
+
+ types.rst
+ document.rst
+ sheet.rst
+ table.rst
+ pivot.rst
+ styles.rst
+ view.rst
+ shared-strings.rst
+ import-export.rst
diff --git a/doc/cpp/spreadsheet-doc/pivot.rst b/doc/cpp/spreadsheet-doc/pivot.rst
new file mode 100644
index 0000000..00c1a16
--- /dev/null
+++ b/doc/cpp/spreadsheet-doc/pivot.rst
@@ -0,0 +1,21 @@
+
+Pivot table
+===========
+
+.. doxygenstruct:: orcus::spreadsheet::pivot_cache_record_value_t
+ :members:
+
+.. doxygenstruct:: orcus::spreadsheet::pivot_cache_item_t
+ :members:
+
+.. doxygenstruct:: orcus::spreadsheet::pivot_cache_group_data_t
+ :members:
+
+.. doxygenstruct:: orcus::spreadsheet::pivot_cache_field_t
+ :members:
+
+.. doxygenclass:: orcus::spreadsheet::pivot_cache
+ :members:
+
+.. doxygenclass:: orcus::spreadsheet::pivot_collection
+ :members:
diff --git a/doc/cpp/spreadsheet-doc/shared-strings.rst b/doc/cpp/spreadsheet-doc/shared-strings.rst
new file mode 100644
index 0000000..799e57b
--- /dev/null
+++ b/doc/cpp/spreadsheet-doc/shared-strings.rst
@@ -0,0 +1,10 @@
+
+Shared strings
+==============
+
+.. doxygenclass:: orcus::spreadsheet::shared_strings
+ :members:
+
+.. doxygenstruct:: orcus::spreadsheet::format_run
+.. doxygentypedef:: orcus::spreadsheet::format_runs_t
+
diff --git a/doc/cpp/spreadsheet-doc/sheet.rst b/doc/cpp/spreadsheet-doc/sheet.rst
new file mode 100644
index 0000000..e1cf87e
--- /dev/null
+++ b/doc/cpp/spreadsheet-doc/sheet.rst
@@ -0,0 +1,6 @@
+
+Sheet
+=====
+
+.. doxygenclass:: orcus::spreadsheet::sheet
+ :members:
diff --git a/doc/cpp/spreadsheet-doc/styles.rst b/doc/cpp/spreadsheet-doc/styles.rst
new file mode 100644
index 0000000..59d7f77
--- /dev/null
+++ b/doc/cpp/spreadsheet-doc/styles.rst
@@ -0,0 +1,30 @@
+
+Styles
+======
+
+.. doxygenclass:: orcus::spreadsheet::styles
+ :members:
+
+.. doxygenstruct:: orcus::spreadsheet::font_t
+ :members:
+
+.. doxygenstruct:: orcus::spreadsheet::fill_t
+ :members:
+
+.. doxygenstruct:: orcus::spreadsheet::border_attrs_t
+ :members:
+
+.. doxygenstruct:: orcus::spreadsheet::border_t
+ :members:
+
+.. doxygenstruct:: orcus::spreadsheet::protection_t
+ :members:
+
+.. doxygenstruct:: orcus::spreadsheet::number_format_t
+ :members:
+
+.. doxygenstruct:: orcus::spreadsheet::cell_format_t
+ :members:
+
+.. doxygenstruct:: orcus::spreadsheet::cell_style_t
+ :members:
diff --git a/doc/cpp/spreadsheet-doc/table.rst b/doc/cpp/spreadsheet-doc/table.rst
new file mode 100644
index 0000000..4b44e42
--- /dev/null
+++ b/doc/cpp/spreadsheet-doc/table.rst
@@ -0,0 +1,9 @@
+
+Table and autofilter
+====================
+
+.. doxygenstruct:: orcus::spreadsheet::auto_filter_column_t
+.. doxygenstruct:: orcus::spreadsheet::auto_filter_t
+.. doxygenstruct:: orcus::spreadsheet::table_column_t
+.. doxygenstruct:: orcus::spreadsheet::table_style_t
+.. doxygenstruct:: orcus::spreadsheet::table_t
diff --git a/doc/cpp/spreadsheet-doc/types.rst b/doc/cpp/spreadsheet-doc/types.rst
new file mode 100644
index 0000000..51a8489
--- /dev/null
+++ b/doc/cpp/spreadsheet-doc/types.rst
@@ -0,0 +1,5 @@
+
+Types
+=====
+
+.. doxygenstruct:: orcus::spreadsheet::color_t
diff --git a/doc/cpp/spreadsheet-doc/view.rst b/doc/cpp/spreadsheet-doc/view.rst
new file mode 100644
index 0000000..79c07dd
--- /dev/null
+++ b/doc/cpp/spreadsheet-doc/view.rst
@@ -0,0 +1,9 @@
+
+View
+====
+
+.. doxygenclass:: orcus::spreadsheet::view
+ :members:
+
+.. doxygenclass:: orcus::spreadsheet::sheet_view
+ :members:
diff --git a/doc/doxygen.conf b/doc/doxygen.conf
new file mode 100644
index 0000000..375f5d2
--- /dev/null
+++ b/doc/doxygen.conf
@@ -0,0 +1,2276 @@
+# Doxyfile 1.8.6
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
+# for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME = "Orcus"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER =
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF =
+
+# With the PROJECT_LOGO tag one can specify an logo or icon that is included in
+# the documentation. The maximum height of the logo should not exceed 55 pixels
+# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo
+# to the output directory.
+
+PROJECT_LOGO =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = _doxygen
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
+
+CREATE_SUBDIRS = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES = YES
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a
+# new page for each member. If set to NO, the documentation of a member will be
+# part of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE = 4
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines.
+
+ALIASES =
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
+
+TCL_SUBST =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL. For instance to make
+# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C
+# (default is Fortran), use: inc=Fortran f=C.
+#
+# Note For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT = YES
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by by putting a % sign in front of the word
+# or globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE = NO
+
+# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. When set to YES local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO these classes will be included in the various overviews. This option has
+# no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO these declarations will be
+# included in the documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
+
+CASE_SENSE_NAMES = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES = NO
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING = NO
+
+# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the
+# todo list. This list is created by putting \todo commands in the
+# documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the
+# test list. This list is created by putting \test commands in the
+# documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES the list
+# will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES = NO
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. Do not use file names with spaces, bibtex cannot handle them. See
+# also \cite for info how to create references.
+
+CITE_BIB_FILES =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED = NO
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO doxygen will only warn about wrong or incomplete parameter
+# documentation, but not about the absence of documentation.
+# The default value is: NO.
+
+WARN_NO_PARAMDOC = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces.
+# Note: If this tag is empty the current directory is searched.
+
+INPUT = ../include
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: http://www.gnu.org/software/libiconv) for the list of
+# possible encodings.
+# The default value is: UTF-8.
+
+INPUT_ENCODING = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank the
+# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii,
+# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp,
+# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown,
+# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf,
+# *.qsf, *.as and *.js.
+
+FILE_PATTERNS = *.hpp
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE =
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+EXCLUDE_SYMBOLS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER ) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# function all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES, then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see http://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX = YES
+
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output
+# The default value is: YES.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional user-
+# defined cascading style sheet that is included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefor more robust against future updates.
+# Doxygen will copy the style sheet file to the output directory. For an example
+# see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the stylesheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: http://developer.apple.com/tools/xcode/), introduced with
+# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME = "Doxygen generated docs"
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE =
+
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler ( hhc.exe). If non-empty
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+HHC_LOCATION =
+
+# The GENERATE_CHI flag controls if a separate .chi index file is generated (
+# YES) or that it should be included in the master .chm file ( NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING =
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated (
+# YES) or a normal table of contents ( NO) in the .chm file.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
+# folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS =
+
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW = NO
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH = 250
+
+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW = NO
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# http://www.mathjax.org) which uses client side Javascript for the rendering
+# instead of using prerendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX = NO
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from http://www.mathjax.org before deployment.
+# The default value is: http://cdn.mathjax.org/mathjax/latest.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SEARCHENGINE = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript. There
+# are two flavours of web server based searching depending on the
+# EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for
+# searching and an index file used by the script. When EXTERNAL_SEARCH is
+# enabled the indexing and searching needs to be provided by external tools. See
+# the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer ( doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer ( doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES doxygen will generate LaTeX output.
+# The default value is: YES.
+
+GENERATE_LATEX = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_OUTPUT = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when enabling USE_PDFLATEX this option is only used for generating
+# bitmaps for formulas in the HTML output, but not in the Makefile that is
+# written to the output directory.
+# The default file is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE = a4
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. To get the times font for
+# instance you can specify
+# EXTRA_PACKAGES=times
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
+# generated LaTeX document. The header should contain everything until the first
+# chapter. If it is left blank doxygen will generate a standard header. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber. Doxygen will
+# replace them by respectively the title of the page, the current date and time,
+# only the current date, the version number of doxygen, the project name (see
+# PROJECT_NAME), or the project number (see PROJECT_NUMBER).
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PDF_HYPERLINKS = YES
+
+# If the LATEX_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES to get a
+# higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+USE_PDFLATEX = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help. This option is also used
+# when generating formulas in HTML.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BATCHMODE = NO
+
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HIDE_INDICES = NO
+
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_SOURCE_CODE = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE = plain
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_HYPERLINKS = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's config
+# file, i.e. a series of assignments. You only have to provide replacements,
+# missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's config file. A template extensions file can be generated
+# using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_EXTENSIONS_FILE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_EXTENSION = .3
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
+
+GENERATE_XML = YES
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT = xml
+
+# If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
+
+GENERATE_DOCBOOK = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT = docbook
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES doxygen will generate an AutoGen
+# Definitions (see http://autogen.sf.net) file that captures the structure of
+# the code including all documentation. Note that this feature is still
+# experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES doxygen will expand all macro names
+# in the source code. If set to NO only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION = YES
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES the includes files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED = ORCUS_DLLPUBLIC ORCUS_SPM_DLLPUBLIC ORCUS_PSR_DLLPUBLIC
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all refrences to function-like macros that are alone on a line, have an
+# all uppercase name, and do not end with a semicolon. Such function macros are
+# typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have an unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES all external class will be listed in the
+# class index. If set to NO only the inherited external classes will be listed.
+# The default value is: NO.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed in
+# the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS = YES
+
+# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
+# powerful graphs.
+# The default value is: YES.
+
+CLASS_DIAGRAMS = YES
+
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
+
+DIA_PATH =
+
+# If set to YES, the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: NO.
+
+HAVE_DOT = NO
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS = 0
+
+# When you want a differently looking font n the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH =
+
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+COLLABORATION_GRAPH = YES
+
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LOOK = NO
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LIMIT_NUM_FIELDS = 10
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+TEMPLATE_RELATIONS = NO
+
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDE_GRAPH = YES
+
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH = NO
+
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH = NO
+
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GRAPHICAL_HIERARCHY = YES
+
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot.
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, jpg, gif and svg.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT = png
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG = NO
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS =
+
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
+
+DIAFILE_DIRS =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_TRANSPARENT = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS = YES
+
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_CLEANUP = YES
diff --git a/doc/environment.yml b/doc/environment.yml
new file mode 100644
index 0000000..048c8ae
--- /dev/null
+++ b/doc/environment.yml
@@ -0,0 +1,9 @@
+name: RTD
+channels:
+ - conda-forge
+ - defaults
+dependencies:
+ - python=3.8
+ - doxygen>=1.9.1
+ - breathe
+ - sphinx-argparse
diff --git a/doc/index.rst b/doc/index.rst
new file mode 100644
index 0000000..2e72a50
--- /dev/null
+++ b/doc/index.rst
@@ -0,0 +1,33 @@
+.. orcus documentation master file, created by
+ sphinx-quickstart on Tue Sep 22 20:54:14 2015.
+ You can adapt this file completely to your liking, but it should at least
+ contain the root `toctree` directive.
+
+.. _index:
+
+Orcus documentation
+===================
+
+Orcus is a library that provides a collection of standalone file processing
+filters and utilities. It was originally focused on providing filters for
+spreadsheet documents, but filters for other types of documents have been
+added to the mix.
+
+Contents:
+
+.. toctree::
+ :maxdepth: 1
+
+ overview/index.rst
+ cpp/index.rst
+ python/index.rst
+ cli/index.rst
+ notes/index.rst
+
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`search`
+
diff --git a/doc/notes/index.rst b/doc/notes/index.rst
new file mode 100644
index 0000000..a474bab
--- /dev/null
+++ b/doc/notes/index.rst
@@ -0,0 +1,9 @@
+
+Notes
+=====
+
+.. toctree::
+ :maxdepth: 1
+
+ xml_map/index.rst
+ json_map/index.rst
diff --git a/doc/notes/json_map/example.json b/doc/notes/json_map/example.json
new file mode 100644
index 0000000..e7a2110
--- /dev/null
+++ b/doc/notes/json_map/example.json
@@ -0,0 +1,203 @@
+[
+ {
+ "id": 1,
+ "name": [
+ "Tab",
+ "Limpenny"
+ ],
+ "active": true,
+ "gender": "Male",
+ "language": "Kazakh"
+ },
+ {
+ "id": 2,
+ "name": [
+ "Manda",
+ "Hadgraft"
+ ],
+ "active": false,
+ "gender": "Female",
+ "language": "Bislama"
+ },
+ {
+ "id": 3,
+ "name": [
+ "Mickie",
+ "Boreham"
+ ],
+ "active": false,
+ "gender": "Male",
+ "language": "Swahili"
+ },
+ {
+ "id": 4,
+ "name": [
+ "Celinka",
+ "Brookfield"
+ ],
+ "active": false,
+ "gender": "Female",
+ "language": "Gagauz"
+ },
+ {
+ "id": 5,
+ "name": [
+ "Muffin",
+ "Bleas"
+ ],
+ "active": false,
+ "gender": "Female",
+ "language": "Hiri Motu"
+ },
+ {
+ "id": 6,
+ "name": [
+ "Jackelyn",
+ "Crumb"
+ ],
+ "active": false,
+ "gender": "Female",
+ "language": "Northern Sotho"
+ },
+ {
+ "id": 7,
+ "name": [
+ "Tessie",
+ "Hollingsbee"
+ ],
+ "active": true,
+ "gender": "Female",
+ "language": "Fijian"
+ },
+ {
+ "id": 8,
+ "name": [
+ "Yank",
+ "Wernham"
+ ],
+ "active": false,
+ "gender": "Male",
+ "language": "Tok Pisin"
+ },
+ {
+ "id": 9,
+ "name": [
+ "Brendan",
+ "Lello"
+ ],
+ "active": true,
+ "gender": "Male",
+ "language": "Fijian"
+ },
+ {
+ "id": 10,
+ "name": [
+ "Arabel",
+ "Rigg"
+ ],
+ "active": false,
+ "gender": "Female",
+ "language": "Kyrgyz"
+ },
+ {
+ "id": 11,
+ "name": [
+ "Carolann",
+ "McElory"
+ ],
+ "active": false,
+ "gender": "Female",
+ "language": "Pashto"
+ },
+ {
+ "id": 12,
+ "name": [
+ "Gasparo",
+ "Flack"
+ ],
+ "active": false,
+ "gender": "Male",
+ "language": "Telugu"
+ },
+ {
+ "id": 13,
+ "name": [
+ "Eolanda",
+ "Polendine"
+ ],
+ "active": false,
+ "gender": "Female",
+ "language": "Kashmiri"
+ },
+ {
+ "id": 14,
+ "name": [
+ "Brock",
+ "McCaw"
+ ],
+ "active": false,
+ "gender": "Male",
+ "language": "Tsonga"
+ },
+ {
+ "id": 15,
+ "name": [
+ "Wenda",
+ "Espinas"
+ ],
+ "active": false,
+ "gender": "Female",
+ "language": "Bulgarian"
+ },
+ {
+ "id": 16,
+ "name": [
+ "Zachary",
+ "Banane"
+ ],
+ "active": true,
+ "gender": "Male",
+ "language": "Persian"
+ },
+ {
+ "id": 17,
+ "name": [
+ "Sallyanne",
+ "Mengue"
+ ],
+ "active": false,
+ "gender": "Female",
+ "language": "Latvian"
+ },
+ {
+ "id": 18,
+ "name": [
+ "Elizabet",
+ "Hoofe"
+ ],
+ "active": true,
+ "gender": "Female",
+ "language": "Tswana"
+ },
+ {
+ "id": 19,
+ "name": [
+ "Alastair",
+ "Hutchence"
+ ],
+ "active": true,
+ "gender": "Male",
+ "language": "Ndebele"
+ },
+ {
+ "id": 20,
+ "name": [
+ "Minor",
+ "Worland"
+ ],
+ "active": true,
+ "gender": "Male",
+ "language": "Dutch"
+ }
+]
+
diff --git a/doc/notes/json_map/index.rst b/doc/notes/json_map/index.rst
new file mode 100644
index 0000000..00d6626
--- /dev/null
+++ b/doc/notes/json_map/index.rst
@@ -0,0 +1,326 @@
+
+Mapping JSON to spreadsheet
+===========================
+
+This tutorial covers how to map JSON document to a spreadsheet document, very
+similar to what we covered in :ref:`this tutorial <mapping-xml-to-ss>`
+where we illustrated how to map XML document to a spreadsheet document.
+
+Throughout this tutorial, we will be using :download:`this sample JSON document <example.json>`
+to illustrate how to achieve it using the ``orcus-json`` command. The structure
+of this tutorial will be similar to the structure of the XML mapping counterpart,
+since the steps are very similar.
+
+Examining the structure of the input JSON document
+--------------------------------------------------
+
+Let's first take a look at the sample JSON document:
+
+.. code-block:: javascript
+
+ [
+ {
+ "id": 1,
+ "name": [
+ "Tab",
+ "Limpenny"
+ ],
+ "active": true,
+ "gender": "Male",
+ "language": "Kazakh"
+ },
+ {
+ "id": 2,
+ "name": [
+ "Manda",
+ "Hadgraft"
+ ],
+ "active": false,
+ "gender": "Female",
+ "language": "Bislama"
+ },
+ {
+ "id": 3,
+ "name": [
+ "Mickie",
+ "Boreham"
+ ],
+ "active": false,
+ "gender": "Male",
+ "language": "Swahili"
+ },
+
+ ...
+
+This is essentially the same content as the XML sample document we used in the
+:ref:`last tutorial <mapping-xml-to-ss>` but re-formatted in JSON.
+
+Let run the following command:
+
+.. code-block::
+
+ orcus-json --mode structure example.json
+
+to analyze the structure of this JSON document. The command will generate the
+following output:
+
+.. code-block::
+
+ $array[20].object(*)['active'].value
+ $array[20].object(*)['gender'].value
+ $array[20].object(*)['id'].value
+ $array[20].object(*)['language'].value
+ $array[20].object(*)['name'].array[2].value[0,1]
+
+This structure output resembles a variant of JSONPath but some modifications
+are applied. It has the following characteristics:
+
+* The ``$`` symbol represents the root of the structure.
+* Array node takes the form of either ``array[N]``, where the value of ``N``
+ represents the number of elements.
+* Object node takes the form of ``object['key']``.
+* Value node, which is always a leaf node, is represented by ``value`` except
+ when the leaf node is an array containing values, it takes the form of ``value[0,1,2,...]``.
+* The ``.`` symbols represent the node boundaries.
+* The ``(*)`` symbols represent recurring nodes, which can be either array or
+ object.
+
+Auto-mapping the JSON document
+------------------------------
+
+Let's map this JSON document to a spreadsheet document by running:
+
+.. code-block::
+
+ orcus-json --mode map -o out -f flat example.json
+
+This is very similar to what we did in the XML mapping tutorial, except that
+the command used is ``orcus-json`` and the input file is ``example.json``.
+This will create file named ``out/range-0.txt`` which contains the following:
+
+.. code-block::
+
+ ---
+ Sheet name: range-0
+ rows: 21 cols: 6
+ +--------+-----------+-------------+-----------+--------+----------------+
+ | id | field 0 | field 1 | active | gender | language |
+ +--------+-----------+-------------+-----------+--------+----------------+
+ | 1 [v] | Tab | Limpenny | true [b] | Male | Kazakh |
+ +--------+-----------+-------------+-----------+--------+----------------+
+ | 2 [v] | Manda | Hadgraft | false [b] | Female | Bislama |
+ +--------+-----------+-------------+-----------+--------+----------------+
+ | 3 [v] | Mickie | Boreham | false [b] | Male | Swahili |
+ +--------+-----------+-------------+-----------+--------+----------------+
+ | 4 [v] | Celinka | Brookfield | false [b] | Female | Gagauz |
+ +--------+-----------+-------------+-----------+--------+----------------+
+ | 5 [v] | Muffin | Bleas | false [b] | Female | Hiri Motu |
+ +--------+-----------+-------------+-----------+--------+----------------+
+ | 6 [v] | Jackelyn | Crumb | false [b] | Female | Northern Sotho |
+ +--------+-----------+-------------+-----------+--------+----------------+
+ | 7 [v] | Tessie | Hollingsbee | true [b] | Female | Fijian |
+ +--------+-----------+-------------+-----------+--------+----------------+
+ | 8 [v] | Yank | Wernham | false [b] | Male | Tok Pisin |
+ +--------+-----------+-------------+-----------+--------+----------------+
+ | 9 [v] | Brendan | Lello | true [b] | Male | Fijian |
+ +--------+-----------+-------------+-----------+--------+----------------+
+ | 10 [v] | Arabel | Rigg | false [b] | Female | Kyrgyz |
+ +--------+-----------+-------------+-----------+--------+----------------+
+ | 11 [v] | Carolann | McElory | false [b] | Female | Pashto |
+ +--------+-----------+-------------+-----------+--------+----------------+
+ | 12 [v] | Gasparo | Flack | false [b] | Male | Telugu |
+ +--------+-----------+-------------+-----------+--------+----------------+
+ | 13 [v] | Eolanda | Polendine | false [b] | Female | Kashmiri |
+ +--------+-----------+-------------+-----------+--------+----------------+
+ | 14 [v] | Brock | McCaw | false [b] | Male | Tsonga |
+ +--------+-----------+-------------+-----------+--------+----------------+
+ | 15 [v] | Wenda | Espinas | false [b] | Female | Bulgarian |
+ +--------+-----------+-------------+-----------+--------+----------------+
+ | 16 [v] | Zachary | Banane | true [b] | Male | Persian |
+ +--------+-----------+-------------+-----------+--------+----------------+
+ | 17 [v] | Sallyanne | Mengue | false [b] | Female | Latvian |
+ +--------+-----------+-------------+-----------+--------+----------------+
+ | 18 [v] | Elizabet | Hoofe | true [b] | Female | Tswana |
+ +--------+-----------+-------------+-----------+--------+----------------+
+ | 19 [v] | Alastair | Hutchence | true [b] | Male | Ndebele |
+ +--------+-----------+-------------+-----------+--------+----------------+
+ | 20 [v] | Minor | Worland | true [b] | Male | Dutch |
+ +--------+-----------+-------------+-----------+--------+----------------+
+
+Again, this is very similar to what we saw in the XML-mapping example. Note
+that cell values with ``[v]`` and ``[b]`` indicate numeric and boolean values,
+respectively. Cells with no suffixes are string cells.
+
+Custom-mapping using map file
+-----------------------------
+
+This process is also very similar to the process we followed for XML mapping.
+We first auto-generate a map file, modify it, and use it to do the mapping again.
+Since there isn't much difference between XML mapping and JSON mapping, let's
+just go through this very quick.
+
+First step is to generate a map file for the auto-detected range by running:
+
+.. code-block::
+
+ orcus-json --mode map-gen -o map.json example.json
+
+which will write the mapping rules to ``map.json`` file. When you open the generated
+map file, you will see something like the following:
+
+.. code-block:: javascript
+
+ {
+ "sheets": [
+ "range-0"
+ ],
+ "ranges": [
+ {
+ "sheet": "range-0",
+ "row": 0,
+ "column": 0,
+ "row-header": true,
+ "fields": [
+ {
+ "path": "$[]['id']"
+ },
+ {
+ "path": "$[]['name'][0]"
+ },
+ {
+ "path": "$[]['name'][1]"
+ },
+ {
+ "path": "$[]['active']"
+ },
+ {
+ "path": "$[]['gender']"
+ },
+ {
+ "path": "$[]['language']"
+ }
+ ],
+ "row-groups": [
+ {
+ "path": "$"
+ }
+ ]
+ }
+ ]
+ }
+
+The structure and content of the map file should look similar to the XML counterpart,
+except that it is now in JSON format, and the paths are expressed in slightly
+modified JSONPath bracket notation, where ``[]`` represents an array node with
+no position specified.
+
+Now that we have a map file, let's modify this and use it to do the mapping once
+again. Just like the XML mapping example, we are going to:
+
+* insert two blank rows above,
+* drop the ``id`` and ``active`` fields,
+* specify labels for the fields, and
+* change the sheet name from ``range-0`` to ``My Data``.
+
+This is what we've come up with:
+
+.. code-block:: javascript
+
+ {
+ "sheets": [
+ "My Data"
+ ],
+ "ranges": [
+ {
+ "sheet": "My Data",
+ "row": 2,
+ "column": 0,
+ "row-header": true,
+ "fields": [
+ {
+ "path": "$[]['name'][0]", "label": "First Name"
+ },
+ {
+ "path": "$[]['name'][1]", "label": "Last Name"
+ },
+ {
+ "path": "$[]['gender']", "label": "Gender"
+ },
+ {
+ "path": "$[]['language']", "label": "Language"
+ }
+ ],
+ "row-groups": [
+ {
+ "path": "$"
+ }
+ ]
+ }
+ ]
+ }
+
+We'll save this file as ``map-modified.json``, and pass it to the ``orcus-json``
+command via ``--map`` or ``-m`` option:
+
+.. code-block::
+
+ orcus-json --mode map -o out -f flat -m map-modified.json example.json
+
+Let's check the output in ``out/My Data.txt`` and see what it contains:
+
+.. code-block::
+
+ ---
+ Sheet name: My Data
+ rows: 23 cols: 4
+ +------------+-------------+--------+----------------+
+ | | | | |
+ +------------+-------------+--------+----------------+
+ | | | | |
+ +------------+-------------+--------+----------------+
+ | First Name | Last Name | Gender | Language |
+ +------------+-------------+--------+----------------+
+ | Tab | Limpenny | Male | Kazakh |
+ +------------+-------------+--------+----------------+
+ | Manda | Hadgraft | Female | Bislama |
+ +------------+-------------+--------+----------------+
+ | Mickie | Boreham | Male | Swahili |
+ +------------+-------------+--------+----------------+
+ | Celinka | Brookfield | Female | Gagauz |
+ +------------+-------------+--------+----------------+
+ | Muffin | Bleas | Female | Hiri Motu |
+ +------------+-------------+--------+----------------+
+ | Jackelyn | Crumb | Female | Northern Sotho |
+ +------------+-------------+--------+----------------+
+ | Tessie | Hollingsbee | Female | Fijian |
+ +------------+-------------+--------+----------------+
+ | Yank | Wernham | Male | Tok Pisin |
+ +------------+-------------+--------+----------------+
+ | Brendan | Lello | Male | Fijian |
+ +------------+-------------+--------+----------------+
+ | Arabel | Rigg | Female | Kyrgyz |
+ +------------+-------------+--------+----------------+
+ | Carolann | McElory | Female | Pashto |
+ +------------+-------------+--------+----------------+
+ | Gasparo | Flack | Male | Telugu |
+ +------------+-------------+--------+----------------+
+ | Eolanda | Polendine | Female | Kashmiri |
+ +------------+-------------+--------+----------------+
+ | Brock | McCaw | Male | Tsonga |
+ +------------+-------------+--------+----------------+
+ | Wenda | Espinas | Female | Bulgarian |
+ +------------+-------------+--------+----------------+
+ | Zachary | Banane | Male | Persian |
+ +------------+-------------+--------+----------------+
+ | Sallyanne | Mengue | Female | Latvian |
+ +------------+-------------+--------+----------------+
+ | Elizabet | Hoofe | Female | Tswana |
+ +------------+-------------+--------+----------------+
+ | Alastair | Hutchence | Male | Ndebele |
+ +------------+-------------+--------+----------------+
+ | Minor | Worland | Male | Dutch |
+ +------------+-------------+--------+----------------+
+
+The ``id`` and ``active`` fields are gone, the remaining fields have custom
+labels we specified, and there are two blank rows above. It appears that all
+the changes we have intended have been properly applied.
diff --git a/doc/notes/xml_map/example.xml b/doc/notes/xml_map/example.xml
new file mode 100644
index 0000000..0dbb6d4
--- /dev/null
+++ b/doc/notes/xml_map/example.xml
@@ -0,0 +1,183 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<dataset>
+ <record id="1">
+ <name>
+ <first>Tab</first>
+ <last>Limpenny</last>
+ </name>
+ <active>true</active>
+ <gender>Male</gender>
+ <language>Kazakh</language>
+ </record>
+ <record id="2">
+ <name>
+ <first>Manda</first>
+ <last>Hadgraft</last>
+ </name>
+ <active>false</active>
+ <gender>Female</gender>
+ <language>Bislama</language>
+ </record>
+ <record id="3">
+ <name>
+ <first>Mickie</first>
+ <last>Boreham</last>
+ </name>
+ <active>false</active>
+ <gender>Male</gender>
+ <language>Swahili</language>
+ </record>
+ <record id="4">
+ <name>
+ <first>Celinka</first>
+ <last>Brookfield</last>
+ </name>
+ <active>false</active>
+ <gender>Female</gender>
+ <language>Gagauz</language>
+ </record>
+ <record id="5">
+ <name>
+ <first>Muffin</first>
+ <last>Bleas</last>
+ </name>
+ <active>false</active>
+ <gender>Female</gender>
+ <language>Hiri Motu</language>
+ </record>
+ <record id="6">
+ <name>
+ <first>Jackelyn</first>
+ <last>Crumb</last>
+ </name>
+ <active>false</active>
+ <gender>Female</gender>
+ <language>Northern Sotho</language>
+ </record>
+ <record id="7">
+ <name>
+ <first>Tessie</first>
+ <last>Hollingsbee</last>
+ </name>
+ <active>true</active>
+ <gender>Female</gender>
+ <language>Fijian</language>
+ </record>
+ <record id="8">
+ <name>
+ <first>Yank</first>
+ <last>Wernham</last>
+ </name>
+ <active>false</active>
+ <gender>Male</gender>
+ <language>Tok Pisin</language>
+ </record>
+ <record id="9">
+ <name>
+ <first>Brendan</first>
+ <last>Lello</last>
+ </name>
+ <active>true</active>
+ <gender>Male</gender>
+ <language>Fijian</language>
+ </record>
+ <record id="10">
+ <name>
+ <first>Arabel</first>
+ <last>Rigg</last>
+ </name>
+ <active>false</active>
+ <gender>Female</gender>
+ <language>Kyrgyz</language>
+ </record>
+ <record id="11">
+ <name>
+ <first>Carolann</first>
+ <last>McElory</last>
+ </name>
+ <active>false</active>
+ <gender>Female</gender>
+ <language>Pashto</language>
+ </record>
+ <record id="12">
+ <name>
+ <first>Gasparo</first>
+ <last>Flack</last>
+ </name>
+ <active>false</active>
+ <gender>Male</gender>
+ <language>Telugu</language>
+ </record>
+ <record id="13">
+ <name>
+ <first>Eolanda</first>
+ <last>Polendine</last>
+ </name>
+ <active>false</active>
+ <gender>Female</gender>
+ <language>Kashmiri</language>
+ </record>
+ <record id="14">
+ <name>
+ <first>Brock</first>
+ <last>McCaw</last>
+ </name>
+ <active>false</active>
+ <gender>Male</gender>
+ <language>Tsonga</language>
+ </record>
+ <record id="15">
+ <name>
+ <first>Wenda</first>
+ <last>Espinas</last>
+ </name>
+ <active>false</active>
+ <gender>Female</gender>
+ <language>Bulgarian</language>
+ </record>
+ <record id="16">
+ <name>
+ <first>Zachary</first>
+ <last>Banane</last>
+ </name>
+ <active>true</active>
+ <gender>Male</gender>
+ <language>Persian</language>
+ </record>
+ <record id="17">
+ <name>
+ <first>Sallyanne</first>
+ <last>Mengue</last>
+ </name>
+ <active>false</active>
+ <gender>Female</gender>
+ <language>Latvian</language>
+ </record>
+ <record id="18">
+ <name>
+ <first>Elizabet</first>
+ <last>Hoofe</last>
+ </name>
+ <active>true</active>
+ <gender>Female</gender>
+ <language>Tswana</language>
+ </record>
+ <record id="19">
+ <name>
+ <first>Alastair</first>
+ <last>Hutchence</last>
+ </name>
+ <active>true</active>
+ <gender>Male</gender>
+ <language>Ndebele</language>
+ </record>
+ <record id="20">
+ <name>
+ <first>Minor</first>
+ <last>Worland</last>
+ </name>
+ <active>true</active>
+ <gender>Male</gender>
+ <language>Dutch</language>
+ </record>
+</dataset>
diff --git a/doc/notes/xml_map/index.rst b/doc/notes/xml_map/index.rst
new file mode 100644
index 0000000..258920a
--- /dev/null
+++ b/doc/notes/xml_map/index.rst
@@ -0,0 +1,314 @@
+
+.. _mapping-xml-to-ss:
+
+Mapping XML to spreadsheet
+==========================
+
+In this tutorial, we will go over how to use the ``orcus-xml`` command to map an
+XML content into a spreadsheet document. We will be using :download:`this sample XML
+document <example.xml>` throughout this tutorial.
+
+Examining the structure of input XML document
+---------------------------------------------
+
+First, let's examine the general structure of this XML document:
+
+.. code-block:: XML
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <dataset>
+ <record id="1">
+ <name>
+ <first>Tab</first>
+ <last>Limpenny</last>
+ </name>
+ <active>true</active>
+ <gender>Male</gender>
+ <language>Kazakh</language>
+ </record>
+ <record id="2">
+ <name>
+ <first>Manda</first>
+ <last>Hadgraft</last>
+ </name>
+ <active>false</active>
+ <gender>Female</gender>
+ <language>Bislama</language>
+ </record>
+ <record id="3">
+
+ ...
+
+
+It starts with the ``<dataset>`` element as its root element, which contains
+recurring ``<record>`` elements each of which contains multiple fields. By
+looking at each ``<record>`` element structure, you can easily infer how the
+record content is structured. You can also run ``orcus-xml`` in structure
+mode in order to detect the structure of its content.
+
+Running the following command
+
+.. code-block::
+
+ orcus-xml --mode structure example.xml
+
+should generate the following output:
+
+.. code-block::
+
+ /dataset
+ /dataset/record[*]
+ /dataset/record[*]/@id
+ /dataset/record[*]/name
+ /dataset/record[*]/name/first
+ /dataset/record[*]/name/last
+ /dataset/record[*]/active
+ /dataset/record[*]/gender
+ /dataset/record[*]/language
+
+This output lists the paths of all encountered "leaf node" items one item per
+line, in order of occurrence. Each path is expressed in a XPath-like format,
+except for recurring "anchor" elements which are suffixed with the ``[*]``
+symbols. An anchor element in this context is defined as a recurring non-leaf
+element that contains either an attribute or a leaf element. You can think of
+anchor elements as elements that define the individual record boundaries.
+
+Auto-mapping the XML document
+-----------------------------
+
+Mapping this XML document to a spreadsheet document can be done by simply running
+``orcus-xml`` in map mode. You also need to specify the output format type and
+the output directory in order to see the content of the mapped spreadsheet
+document. Running the command:
+
+.. code-block::
+
+ orcus-xml --mode map -f flat -o out example.xml
+
+will create an output file named ``out/range-0.txt`` which contains the following:
+
+.. code-block::
+
+ ---
+ Sheet name: range-0
+ rows: 21 cols: 6
+ +--------+-----------+-------------+--------+--------+----------------+
+ | id | first | last | active | gender | language |
+ +--------+-----------+-------------+--------+--------+----------------+
+ | 1 [v] | Tab | Limpenny | true | Male | Kazakh |
+ +--------+-----------+-------------+--------+--------+----------------+
+ | 2 [v] | Manda | Hadgraft | false | Female | Bislama |
+ +--------+-----------+-------------+--------+--------+----------------+
+ | 3 [v] | Mickie | Boreham | false | Male | Swahili |
+ +--------+-----------+-------------+--------+--------+----------------+
+ | 4 [v] | Celinka | Brookfield | false | Female | Gagauz |
+ +--------+-----------+-------------+--------+--------+----------------+
+ | 5 [v] | Muffin | Bleas | false | Female | Hiri Motu |
+ +--------+-----------+-------------+--------+--------+----------------+
+ | 6 [v] | Jackelyn | Crumb | false | Female | Northern Sotho |
+ +--------+-----------+-------------+--------+--------+----------------+
+ | 7 [v] | Tessie | Hollingsbee | true | Female | Fijian |
+ +--------+-----------+-------------+--------+--------+----------------+
+ | 8 [v] | Yank | Wernham | false | Male | Tok Pisin |
+ +--------+-----------+-------------+--------+--------+----------------+
+ | 9 [v] | Brendan | Lello | true | Male | Fijian |
+ +--------+-----------+-------------+--------+--------+----------------+
+ | 10 [v] | Arabel | Rigg | false | Female | Kyrgyz |
+ +--------+-----------+-------------+--------+--------+----------------+
+ | 11 [v] | Carolann | McElory | false | Female | Pashto |
+ +--------+-----------+-------------+--------+--------+----------------+
+ | 12 [v] | Gasparo | Flack | false | Male | Telugu |
+ +--------+-----------+-------------+--------+--------+----------------+
+ | 13 [v] | Eolanda | Polendine | false | Female | Kashmiri |
+ +--------+-----------+-------------+--------+--------+----------------+
+ | 14 [v] | Brock | McCaw | false | Male | Tsonga |
+ +--------+-----------+-------------+--------+--------+----------------+
+ | 15 [v] | Wenda | Espinas | false | Female | Bulgarian |
+ +--------+-----------+-------------+--------+--------+----------------+
+ | 16 [v] | Zachary | Banane | true | Male | Persian |
+ +--------+-----------+-------------+--------+--------+----------------+
+ | 17 [v] | Sallyanne | Mengue | false | Female | Latvian |
+ +--------+-----------+-------------+--------+--------+----------------+
+ | 18 [v] | Elizabet | Hoofe | true | Female | Tswana |
+ +--------+-----------+-------------+--------+--------+----------------+
+ | 19 [v] | Alastair | Hutchence | true | Male | Ndebele |
+ +--------+-----------+-------------+--------+--------+----------------+
+ | 20 [v] | Minor | Worland | true | Male | Dutch |
+ +--------+-----------+-------------+--------+--------+----------------+
+
+We are using the ``flat`` format type which writes the data range of a sheet
+in a human-readable grid output.
+
+The mapped sheet content is the result of the automatic mapping of the original
+XML document. In automatic mapping, all attributes and element contents that
+can be mapped as field values will be mapped, and the sheet name will be automatically
+generated.
+
+Although not applicable to this particular example, if the source XML document
+contains multiple mappable ranges, they will get mapped to multiple sheets, one
+sheet per range.
+
+Custom-mapping using map file
+-----------------------------
+
+Generating map file
+^^^^^^^^^^^^^^^^^^^
+
+Automatic-mapping should work reasonably well in many cases, but sometime you
+may need to customize how you map your data, and this section will go over how
+you could do just that.
+
+The short answer is that you will need to create a map definition file and pass
+it to the ``orcus-xml`` command via ``-m`` or ``--map`` option. The easiest
+way to go about it is to have one generated for you.
+
+Running the following command:
+
+.. code-block::
+
+ orcus-xml --mode map-gen -o map.xml example.xml
+
+will generate a map file ``map.xml`` which contains the mapping definition based
+on the auto-detected structure. The content of ``map.xml`` generated from the
+example XML document should look like this:
+
+.. code-block:: XML
+
+ <?xml version="1.0"?>
+ <map xmlns="https://gitlab.com/orcus/orcus/xml-map-definition">
+ <sheet name="range-0"/>
+ <range sheet="range-0" row="0" column="0">
+ <field path="/dataset/record/@id"/>
+ <field path="/dataset/record/name/first"/>
+ <field path="/dataset/record/name/last"/>
+ <field path="/dataset/record/active"/>
+ <field path="/dataset/record/gender"/>
+ <field path="/dataset/record/language"/>
+ <row-group path="/dataset/record"/>
+ </range>
+ </map>
+
+Note that since the original map file content does not include any line breaks,
+you may want to run it through an XML reformatting tool such as
+`xmllint <http://xmlsoft.org/xmllint.html>`_ to "prettify" its content before
+viewing.
+
+Map file structure
+^^^^^^^^^^^^^^^^^^
+
+Hopefully the structure of the map file is self-explanatory, but let us go over
+it a little. The ``map`` element is the root element which contains one or
+more ``sheet`` elements and one or more ``range`` elements. The ``sheet``
+elements specify how many sheets should be created in the spreadsheet model,
+and what their names should be via their ``name`` attributes. The ordering of
+the ``sheet`` elements will reflect the ordering of the sheets in the final
+spreadsheet document.
+
+Each ``range`` element defines one mapped range of the source XML document, and
+this element itself stores the top-left position of the range in the final
+spreadsheet document via ``sheet``, ``row`` and ``column`` attributes. The ``range``
+element then contains one or more ``field`` elements, and one or more ``row-group``
+elements.
+
+Each ``field`` element defines one field within the mapped range and the path of
+the value in the source XML document. The path is expressed in XPath format.
+The ordering of the ``field`` elements reflects the ordering of the field columns
+in the final spreadsheet document.
+
+Each ``row-group`` element defines the path of an anchor element. For a simple
+XML document such as our current example, you only need one ``row-group``
+element. But an XML document with more complex structure may need more than one
+``row-group`` element to properly map nested recurring elements.
+
+Modifying map file
+^^^^^^^^^^^^^^^^^^
+
+Let's make some changes to this map file. First, the default sheet name ``range-0``
+doesn't look very good, so we'll change it to ``My Data``. Also, let's assume
+we aren't really interested in the ID values or the "active" values (whatever
+they may mean), so we'll drop those two fields. Additionally, since we don't like
+the default field labels, which are taken literally from the names of the corresponding
+attributes or elements, we'll define custom field labels. And finally, we'll add
+two empty rows above the data range so that we can edit in some nice title afterward.
+
+The modified map file will look like this:
+
+.. code-block:: XML
+
+ <?xml version="1.0"?>
+ <map xmlns="https://gitlab.com/orcus/orcus/xml-map-definition">
+ <sheet name="My Data"/>
+ <range sheet="My Data" row="2" column="0">
+ <field path="/dataset/record/name/first" label="First Name"/>
+ <field path="/dataset/record/name/last" label="Last Name"/>
+ <field path="/dataset/record/gender" label="Gender"/>
+ <field path="/dataset/record/language" label="Language"/>
+ <row-group path="/dataset/record"/>
+ </range>
+ </map>
+
+We'll save this as ``map-modified.xml``, and pass it to the ``orcus-xml`` command
+this time around like so:
+
+.. code-block::
+
+ ./src/orcus-xml --mode map -m map-modified.xml -o out -f flat example.xml
+
+This will output the content of the sheet to ``out/My Data.txt``, which will
+look like this:
+
+.. code-block::
+
+ ---
+ Sheet name: My Data
+ rows: 23 cols: 4
+ +------------+-------------+--------+----------------+
+ | | | | |
+ +------------+-------------+--------+----------------+
+ | | | | |
+ +------------+-------------+--------+----------------+
+ | First Name | Last Name | Gender | Language |
+ +------------+-------------+--------+----------------+
+ | Tab | Limpenny | Male | Kazakh |
+ +------------+-------------+--------+----------------+
+ | Manda | Hadgraft | Female | Bislama |
+ +------------+-------------+--------+----------------+
+ | Mickie | Boreham | Male | Swahili |
+ +------------+-------------+--------+----------------+
+ | Celinka | Brookfield | Female | Gagauz |
+ +------------+-------------+--------+----------------+
+ | Muffin | Bleas | Female | Hiri Motu |
+ +------------+-------------+--------+----------------+
+ | Jackelyn | Crumb | Female | Northern Sotho |
+ +------------+-------------+--------+----------------+
+ | Tessie | Hollingsbee | Female | Fijian |
+ +------------+-------------+--------+----------------+
+ | Yank | Wernham | Male | Tok Pisin |
+ +------------+-------------+--------+----------------+
+ | Brendan | Lello | Male | Fijian |
+ +------------+-------------+--------+----------------+
+ | Arabel | Rigg | Female | Kyrgyz |
+ +------------+-------------+--------+----------------+
+ | Carolann | McElory | Female | Pashto |
+ +------------+-------------+--------+----------------+
+ | Gasparo | Flack | Male | Telugu |
+ +------------+-------------+--------+----------------+
+ | Eolanda | Polendine | Female | Kashmiri |
+ +------------+-------------+--------+----------------+
+ | Brock | McCaw | Male | Tsonga |
+ +------------+-------------+--------+----------------+
+ | Wenda | Espinas | Female | Bulgarian |
+ +------------+-------------+--------+----------------+
+ | Zachary | Banane | Male | Persian |
+ +------------+-------------+--------+----------------+
+ | Sallyanne | Mengue | Female | Latvian |
+ +------------+-------------+--------+----------------+
+ | Elizabet | Hoofe | Female | Tswana |
+ +------------+-------------+--------+----------------+
+ | Alastair | Hutchence | Male | Ndebele |
+ +------------+-------------+--------+----------------+
+ | Minor | Worland | Male | Dutch |
+ +------------+-------------+--------+----------------+
+
+The new output now only contains four fields, with custom labels at the top, and
+now we have two empty rows above just like we intended.
diff --git a/doc/overview/doc-orcus.rst b/doc/overview/doc-orcus.rst
new file mode 100644
index 0000000..0577d4e
--- /dev/null
+++ b/doc/overview/doc-orcus.rst
@@ -0,0 +1,176 @@
+
+.. highlight:: cpp
+
+Use orcus's spreadsheet document class
+======================================
+
+If you want to use orcus' :cpp:class:`~orcus::spreadsheet::document` as your
+document store, you can use the :cpp:class:`~orcus::spreadsheet::import_factory`
+class that orcus provides which already implements all necessary interfaces.
+The example code shown below illustrates how to do this:
+
+.. literalinclude:: ../../doc_example/spreadsheet_doc_1.cpp
+ :language: C++
+
+This example code loads a file saved in the Open Document Spreadsheet format
+stored in a directory whose path is to be defined in the environment variable
+named ``INPUTDIR``. In this example, we don't check for the validity of ``INPUTDIR``
+for bravity's sake.
+
+The input file consists of the following content on its first sheet.
+
+.. figure:: /_static/images/overview/doc-content.png
+
+While it is not clear from this screenshot, cell C2 contains the formula
+**CONCATENATE(A2, " ", B2)** to concatenate the content of A2 and B2 with a
+space between them. Cells C3 through C7 also contain similar formula
+expressions.
+
+Let's walk through this code step by step. First, we need to instantiate the
+document store. Here we are using the concrete :cpp:class:`~orcus::spreadsheet::document`
+class available in orcus. Then immediately pass this document to the
+:cpp:class:`~orcus::spreadsheet::import_factory` instance also from orcus:
+
+.. literalinclude:: ../../doc_example/spreadsheet_doc_1.cpp
+ :language: C++
+ :start-after: //!code-start: instantiate
+ :end-before: //!code-end: instantiate
+ :dedent: 4
+
+The next step is to create the loader instance and pass the factory to it:
+
+.. literalinclude:: ../../doc_example/spreadsheet_doc_1.cpp
+ :language: C++
+ :start-after: //!code-start: loader
+ :end-before: //!code-end: loader
+ :dedent: 4
+
+In this example we are using the :cpp:class:`~orcus::orcus_ods` filter class
+because the document we are loading is of Open Document Spreadsheet type, but
+the process is the same for other document types, the only difference being
+the name of the class. Once the filter object is constructed, we'll simply
+load the file by calling its :cpp:func:`~orcus::orcus_ods::read_file` method
+and passing the path to the file as its argument:
+
+.. literalinclude:: ../../doc_example/spreadsheet_doc_1.cpp
+ :language: C++
+ :start-after: //!code-start: read-file
+ :end-before: //!code-end: read-file
+ :dedent: 4
+
+Once this call returns, the document has been fully populated. What the rest
+of the code does is to access the content of the first row of the first sheet of
+the document. First, you need to get a reference to the internal cell value
+store that we call *model context*:
+
+.. literalinclude:: ../../doc_example/spreadsheet_doc_1.cpp
+ :language: C++
+ :start-after: //!code-start: model-context
+ :end-before: //!code-end: model-context
+ :dedent: 4
+
+Since the content of cell A1 is a string, to get the value you need to first
+get the ID of the string:
+
+.. literalinclude:: ../../doc_example/spreadsheet_doc_1.cpp
+ :language: C++
+ :start-after: //!code-start: string-id
+ :end-before: //!code-end: string-id
+ :dedent: 4
+
+Once you have the ID of the string, you can pass that to the model to get the
+actual string value and print it to the standard output:
+
+.. literalinclude:: ../../doc_example/spreadsheet_doc_1.cpp
+ :language: C++
+ :start-after: //!code-start: print-string
+ :end-before: //!code-end: print-string
+ :dedent: 4
+
+Here we assume that the string value exists for the given ID. In case you
+pass a string ID value to the :cpp:func:`get_string` method and there isn't a string
+value associated with it, you'll get a null pointer returned from the call.
+
+The reason you need to take this 2-step process to get a string value is
+because all the string values stored in the cells are pooled at the document
+model level, and the cells themselves only store the ID values as integers.
+
+You may also have noticed that the types surrounding the :cpp:class:`ixion::model_context`
+class are all in the :cpp:any:`ixion` namespace. It is because orcus' own
+:cpp:class:`~orcus::spreadsheet::document` class uses the formula engine and the
+document model from the `ixion library <https://gitlab.com/ixion/ixion>`_ to handle
+calculation of the formula cells stored in the document, and the formula engine
+requires all cell values to be stored in the :cpp:class:`ixion::model_context`
+instance.
+
+.. note:: The :cpp:class:`~orcus::spreadsheet::document` class in orcus uses
+ the formula engine from the `ixion library <https://gitlab.com/ixion/ixion>`_
+ to calculate the results of the formula cells stored in the document.
+
+The rest of the code basically repeats the same process for cells B1 and C1:
+
+.. literalinclude:: ../../doc_example/spreadsheet_doc_1.cpp
+ :language: C++
+ :start-after: //!code-start: rest
+ :end-before: //!code-end: rest
+ :dedent: 4
+
+and generate the following output:
+
+.. code-block:: text
+
+ A1: Number
+ B1: String
+ C1: Formula
+
+Accessing the numeric cell values are a bit simpler since the values are
+stored directly with the cells. Using the document from the above code example
+code, the following code block:
+
+.. literalinclude:: ../../doc_example/spreadsheet_doc_1_num_and_formula.cpp
+ :language: C++
+ :start-after: //!code-start: print-numeric-cells
+ :end-before: //!code-end: print-numeric-cells
+ :dedent: 4
+
+will access the cells from A2 through A7 and print out their numeric values.
+You should see the following output generated from this code block:
+
+.. code-block:: text
+
+ A2: 1
+ A3: 2
+ A4: 3
+ A5: 4
+ A6: 5
+ A7: 6
+
+It's a bit more complex to handle formula cells. Since each formula cell
+contains two things: 1) the formula expression which is stored as tokens
+internally, and 2) the cached result of the formula. The following code
+illustrates how to retrieve the cached formula results of cells C2 through
+C7:
+
+.. literalinclude:: ../../doc_example/spreadsheet_doc_1_num_and_formula.cpp
+ :language: C++
+ :start-after: //!code-start: print-formula-cells
+ :end-before: //!code-end: print-formula-cells
+ :dedent: 4
+
+For each cell, this code first accesses the stored formula cell instance, get
+a reference to its cached result, then obtain its string result value to print
+it out to the standard output. Running this block of code will produce the
+following output:
+
+.. code-block:: text
+
+ C2: 1 Andy
+ C3: 2 Bruce
+ C4: 3 Charlie
+ C5: 4 David
+ C6: 5 Edward
+ C7: 6 Frank
+
+.. warning:: In production code, you should probabaly check the formula cell
+ pointer which may be null in case the cell at the specified
+ position is not a formula cell.
diff --git a/doc/overview/doc-user.rst b/doc/overview/doc-user.rst
new file mode 100644
index 0000000..a1292e5
--- /dev/null
+++ b/doc/overview/doc-user.rst
@@ -0,0 +1,574 @@
+
+.. highlight:: cpp
+
+Use a user-defined custom document class
+========================================
+
+In this section we will demonstrate how you can use orcus to populate your own
+custom document model by implementing your own set of interface classes and
+passing it to the orcus import filter. The first example code shown below is
+the *absolute* minimum that you need to implement in order for the orcus
+filter to function properly:
+
+.. literalinclude:: ../../doc_example/spreadsheet_doc_2.cpp
+ :language: C++
+
+Just like the example we used in the previous section, we are also loading a
+document saved in the Open Document Spreadsheet format via
+:cpp:class:`~orcus::orcus_ods`. The document being loaded is named
+multi-sheets.ods, and contains three sheets which are are named **'1st
+Sheet'**, **'2nd Sheet'**, and **'3rd Sheet'** in this exact order. When you
+compile and execute the above code, you should get the following output:
+
+.. code-block:: text
+
+ append_sheet: sheet index: 0; sheet name: 1st Sheet
+ append_sheet: sheet index: 1; sheet name: 2nd Sheet
+ append_sheet: sheet index: 2; sheet name: 3rd Sheet
+
+One primary role the import factory plays is to provide the orcus import
+filter with the ability to create and insert a new sheet to the document. As
+illustrated in the above code, it also provides access to existing sheets by
+its name or its position. Every import factory implementation must be a
+derived class of the :cpp:class:`orcus::spreadsheet::iface::import_factory`
+interface base class. At a minimum, it must implement
+
+* the :cpp:func:`~orcus::spreadsheet::iface::import_factory::append_sheet`
+ method which inserts a new sheet and return access to it,
+
+* two variants of the :cpp:func:`~orcus::spreadsheet::iface::import_factory::get_sheet`
+ method which returns access to an existing sheet, and
+
+* the :cpp:func:`~orcus::spreadsheet::iface::import_factory::finalize` method
+ which gets called exactly once at the very end of the import, to give the
+ implementation a chance to perform post-import tasks.
+
+in order for the code to be buildable. Now, since all of the sheet accessor
+methods return null pointers in this code, the import filter has no way of
+populating the sheet data. To actually receive the sheet data from the import
+filter, you must have these methods return valid pointers to sheet accessors.
+The next example shows how that can be done.
+
+
+Implement sheet interface
+-------------------------
+
+In this section we will expand on the code in the previous section to
+implement the sheet accessor interface, in order to receive cell values
+in each individual sheet. In this example, we will define a structure
+to hold a cell value, and store them in a 2-dimensional array for each
+sheet. First, let's define the cell value structure:
+
+.. literalinclude:: ../../doc_example/spreadsheet_doc_2_sheets_no_string_pool.cpp
+ :language: C++
+ :start-after: //!code-start: cell_value
+ :end-before: //!code-end: cell_value
+
+As we will be handling only three cell types i.e. empty, numeric, or string
+cell type, this structure will work just fine. We will also define a namespace
+alias called ``ss`` for convenience. This will be used in later code.
+
+Next, we'll define a sheet class called ``my_sheet`` that stores the cell values
+in a 2-dimensional array, and implements all required interfaces as a child class
+of :cpp:class:`~orcus::spreadsheet::iface::import_sheet`.
+
+At a minimum, the sheet accessor class must implement the following virtual
+methods to satisfy the interface requirements of
+:cpp:class:`~orcus::spreadsheet::iface::import_sheet`.
+
+* :cpp:func:`~orcus::spreadsheet::iface::import_sheet::set_auto` - This is a
+ setter method for a cell whose type is undetermined. The implementor must
+ determine the value type of this cell, from the raw string value of the
+ cell. This method is used when loading a CSV document, for instance.
+
+* :cpp:func:`~orcus::spreadsheet::iface::import_sheet::set_string` - This is a
+ setter method for a cell that stores a string value. All cell string values
+ are expectd to be pooled for the entire document, and this method only
+ receives a string index into a centrally-managed string table. The document
+ model is expected to implement a central string table that can translate an
+ index into its actual string value.
+
+* :cpp:func:`~orcus::spreadsheet::iface::import_sheet::set_value` - This is a
+ setter method for a cell that stores a numeric value.
+
+* :cpp:func:`~orcus::spreadsheet::iface::import_sheet::set_bool` - This is a
+ setter method for a cell that stores a boolean value. Note that not all
+ format types use this method, as some formats store boolean values as
+ numeric values.
+
+* :cpp:func:`~orcus::spreadsheet::iface::import_sheet::set_date_time` - This
+ is a setter method for a cell that stores a date time value. As with
+ boolean value type, some format types may not use this method as they store
+ date time values as numeric values, typically as days since epoch.
+
+* :cpp:func:`~orcus::spreadsheet::iface::import_sheet::set_format` - This is a
+ setter method for applying cell formats. Just like the string values, cell
+ format properties are expected to be stored in a document-wide cell format
+ properties table, and this method only receives an index into the table.
+
+* :cpp:func:`~orcus::spreadsheet::iface::import_sheet::get_sheet_size` - This
+ method is expected to return the dimension of the sheet which the loader may
+ need in some operations.
+
+For now, we'll only implement
+:cpp:func:`~orcus::spreadsheet::iface::import_sheet::set_string`,
+:cpp:func:`~orcus::spreadsheet::iface::import_sheet::set_value`, and
+:cpp:func:`~orcus::spreadsheet::iface::import_sheet::get_sheet_size`, and
+leave the rest empty.
+
+Here is the actual code for class ``my_sheet``:
+
+.. literalinclude:: ../../doc_example/spreadsheet_doc_2_sheets_no_string_pool.cpp
+ :language: C++
+ :start-after: //!code-start: my_sheet
+ :end-before: //!code-end: my_sheet
+
+Note that this class receives its sheet index value from the caller upon
+instantiation. A sheet index is a 0-based value and represents its position
+within the sheet collection.
+
+Finally, we will modify the ``my_import_factory`` class to store and manage a
+collection of ``my_sheet`` instances and to return the pointer value to a
+correct sheet accessor instance as needed.
+
+.. literalinclude:: ../../doc_example/spreadsheet_doc_2_sheets_no_string_pool.cpp
+ :language: C++
+ :start-after: //!code-start: my_import_factory
+ :end-before: //!code-end: my_import_factory
+
+Let's put it all together and run this code:
+
+.. literalinclude:: ../../doc_example/spreadsheet_doc_2_sheets_no_string_pool.cpp
+ :language: C++
+
+We'll be loading the same document we loaded in the previous example, but this
+time we will receive its cell values. Let's go through each sheet one at a
+time.
+
+Data on the first sheet looks like this:
+
+.. figure:: /_static/images/overview/multi-sheets-sheet1.png
+
+It consists of 4 columns, with each column having a header row followed by
+exactly ten rows of data. The first and forth columns contain numeric data,
+while the second and third columns contain string data.
+
+When you run the above code to load this sheet, you'll get the following output:
+
+.. code-block:: text
+
+ (sheet: 0; row: 0; col: 0): string index = 0
+ (sheet: 0; row: 0; col: 1): string index = 0
+ (sheet: 0; row: 0; col: 2): string index = 0
+ (sheet: 0; row: 0; col: 3): string index = 0
+ (sheet: 0; row: 1; col: 0): value = 1
+ (sheet: 0; row: 1; col: 1): string index = 0
+ (sheet: 0; row: 1; col: 2): string index = 0
+ (sheet: 0; row: 1; col: 3): value = 35
+ (sheet: 0; row: 2; col: 0): value = 2
+ (sheet: 0; row: 2; col: 1): string index = 0
+ (sheet: 0; row: 2; col: 2): string index = 0
+ (sheet: 0; row: 2; col: 3): value = 56
+ (sheet: 0; row: 3; col: 0): value = 3
+ (sheet: 0; row: 3; col: 1): string index = 0
+ (sheet: 0; row: 3; col: 2): string index = 0
+ (sheet: 0; row: 3; col: 3): value = 6
+ (sheet: 0; row: 4; col: 0): value = 4
+ (sheet: 0; row: 4; col: 1): string index = 0
+ (sheet: 0; row: 4; col: 2): string index = 0
+ (sheet: 0; row: 4; col: 3): value = 65
+ (sheet: 0; row: 5; col: 0): value = 5
+ (sheet: 0; row: 5; col: 1): string index = 0
+ (sheet: 0; row: 5; col: 2): string index = 0
+ (sheet: 0; row: 5; col: 3): value = 88
+ (sheet: 0; row: 6; col: 0): value = 6
+ (sheet: 0; row: 6; col: 1): string index = 0
+ (sheet: 0; row: 6; col: 2): string index = 0
+ (sheet: 0; row: 6; col: 3): value = 90
+ (sheet: 0; row: 7; col: 0): value = 7
+ (sheet: 0; row: 7; col: 1): string index = 0
+ (sheet: 0; row: 7; col: 2): string index = 0
+ (sheet: 0; row: 7; col: 3): value = 80
+ (sheet: 0; row: 8; col: 0): value = 8
+ (sheet: 0; row: 8; col: 1): string index = 0
+ (sheet: 0; row: 8; col: 2): string index = 0
+ (sheet: 0; row: 8; col: 3): value = 66
+ (sheet: 0; row: 9; col: 0): value = 9
+ (sheet: 0; row: 9; col: 1): string index = 0
+ (sheet: 0; row: 9; col: 2): string index = 0
+ (sheet: 0; row: 9; col: 3): value = 14
+ (sheet: 0; row: 10; col: 0): value = 10
+ (sheet: 0; row: 10; col: 1): string index = 0
+ (sheet: 0; row: 10; col: 2): string index = 0
+ (sheet: 0; row: 10; col: 3): value = 23
+
+There is a couple of things worth pointing out. First, the cell data
+flows left to right first then top to bottom second. Second, for this
+particular sheet and for this particular format, implementing just the
+two setter methods, namely
+:cpp:func:`~orcus::spreadsheet::iface::import_sheet::set_string` and
+:cpp:func:`~orcus::spreadsheet::iface::import_sheet::set_value` are
+enough to receive all cell values. However, we are getting a string
+index value of 0 for all string cells. This is because orcus expects
+the backend document model to implement the shared strings interface
+which is responsible for providing correct string indices to the import
+filter, and we have not yet implemented one. Let's fix that.
+
+
+Implement shared strings interface
+----------------------------------
+
+The first thing to do is define some types:
+
+.. literalinclude:: ../../doc_example/spreadsheet_doc_2_sheets_with_string_pool.cpp
+ :language: C++
+ :start-after: //!code-start: types
+ :end-before: //!code-end: types
+
+Here, we define ``ss_type`` to be the authoritative store for the shared
+string values. The string values will be stored as std::string type, and we
+use std::deque here to avoid re-allocation of internal buffers as the size
+of the container grows.
+
+Another type we define is ``ss_hash_type``, which will be the hash map type
+for storing string-to-index mapping entries. Here, we are using std::string_view
+instead of std::string so that we can simply reference the string values stored in
+the first container.
+
+The shared string interface is designed to handle both unformatted and
+formatted string values. The following two methods:
+
+* :cpp:func:`~orcus::spreadsheet::iface::import_shared_strings::add`
+* :cpp:func:`~orcus::spreadsheet::iface::import_shared_strings::append`
+
+are for unformatted string values. The
+:cpp:func:`~orcus::spreadsheet::iface::import_shared_strings::add` method is
+used when passing a string value that may or may not already exist in the
+shared string pool. The
+:cpp:func:`~orcus::spreadsheet::iface::import_shared_strings::append` method,
+on the other hand, is used only when the string value being passed is a
+brand-new string not yet stored in the string pool. When implementing the
+:cpp:func:`~orcus::spreadsheet::iface::import_shared_strings::append` method,
+you may skip checking for the existance of the string value in the pool before
+inserting it. Both of these methods are expected to return a positive integer
+value as the index of the string being passed.
+
+The following eight methods:
+
+* :cpp:func:`~orcus::spreadsheet::iface::import_shared_strings::set_segment_bold`
+* :cpp:func:`~orcus::spreadsheet::iface::import_shared_strings::set_segment_font`
+* :cpp:func:`~orcus::spreadsheet::iface::import_shared_strings::set_segment_font_color`
+* :cpp:func:`~orcus::spreadsheet::iface::import_shared_strings::set_segment_font_name`
+* :cpp:func:`~orcus::spreadsheet::iface::import_shared_strings::set_segment_font_size`
+* :cpp:func:`~orcus::spreadsheet::iface::import_shared_strings::set_segment_italic`
+* :cpp:func:`~orcus::spreadsheet::iface::import_shared_strings::append_segment`
+* :cpp:func:`~orcus::spreadsheet::iface::import_shared_strings::commit_segments`
+
+are for receiving formatted string values. Conceptually, a formatted string
+consists of a series of multiple string segments, where each segment may have
+different formatting attributes applied to it. These ``set_segment_*``
+methods are used to set the individual formatting attributes for the current
+string segment, and the string value for the current segment is passed through
+the
+:cpp:func:`~orcus::spreadsheet::iface::import_shared_strings::append_segment`
+call. The order in which the ``set_segment_*`` methods are called is not
+specified, and not all of them may be called, but they are guaranteed to be
+called before the
+:cpp:func:`~orcus::spreadsheet::iface::import_shared_strings::append_segment`
+method gets called. The implementation should keep a buffer to store the
+formatting attributes for the current segment and apply each attribute to the
+buffer as one of the ``set_segment_*`` methods gets called. When the
+:cpp:func:`~orcus::spreadsheet::iface::import_shared_strings::append_segment`
+gets called, the implementation should apply the formatting attirbute set
+currently in the buffer to the current segment, and reset the buffer for the
+next segment. When all of the string segments and their formatting attributes
+are passed,
+:cpp:func:`~orcus::spreadsheet::iface::import_shared_strings::commit_segments`
+gets called, signaling the implementation that now it's time to commit the
+string to the document model.
+
+As we are going to ignore the formatting attributes in our current example,
+the following code will do:
+
+.. literalinclude:: ../../doc_example/spreadsheet_doc_2_sheets_with_string_pool.cpp
+ :language: C++
+ :start-after: //!code-start: my_shared_strings
+ :end-before: //!code-end: my_shared_strings
+
+Note that some import filters may use the
+:cpp:func:`~orcus::spreadsheet::iface::import_shared_strings::append_segment`
+and
+:cpp:func:`~orcus::spreadsheet::iface::import_shared_strings::commit_segments`
+combination even for unformatted strings. Because of this, you still need to
+implement these two methods even if raw string values are all you care about.
+
+Note also that the container storing the string values is a reference. The
+source container will be owned by ``my_import_factory`` who will also be the
+owner of the ``my_shared_strings`` instance. Shown below is the modified
+version of ``my_import_factory`` that provides the shared string interface:
+
+.. literalinclude:: ../../doc_example/spreadsheet_doc_2_sheets_with_string_pool.cpp
+ :language: C++
+ :start-after: //!code-start: my_import_factory
+ :end-before: //!code-end: my_import_factory
+
+The shared string store is also passed to each sheet instance, and we'll use
+that to fetch the string values from their respective string indices.
+
+Let's put this all together:
+
+.. literalinclude:: ../../doc_example/spreadsheet_doc_2_sheets_with_string_pool.cpp
+ :language: C++
+
+The sheet class is largely unchanged except for one thing; it now takes a
+reference to the string pool and print the actual string value alongside the
+string index associated with it. When you execute this code, you'll see the
+following output when loading the same sheet:
+
+.. code-block:: text
+
+ (sheet: 0; row: 0; col: 0): string index = 0 (ID)
+ (sheet: 0; row: 0; col: 1): string index = 1 (First Name)
+ (sheet: 0; row: 0; col: 2): string index = 2 (Last Name)
+ (sheet: 0; row: 0; col: 3): string index = 3 (Age)
+ (sheet: 0; row: 1; col: 0): value = 1
+ (sheet: 0; row: 1; col: 1): string index = 5 (Thia)
+ (sheet: 0; row: 1; col: 2): string index = 6 (Beauly)
+ (sheet: 0; row: 1; col: 3): value = 35
+ (sheet: 0; row: 2; col: 0): value = 2
+ (sheet: 0; row: 2; col: 1): string index = 9 (Pepito)
+ (sheet: 0; row: 2; col: 2): string index = 10 (Resun)
+ (sheet: 0; row: 2; col: 3): value = 56
+ (sheet: 0; row: 3; col: 0): value = 3
+ (sheet: 0; row: 3; col: 1): string index = 13 (Emera)
+ (sheet: 0; row: 3; col: 2): string index = 14 (Gravey)
+ (sheet: 0; row: 3; col: 3): value = 6
+ (sheet: 0; row: 4; col: 0): value = 4
+ (sheet: 0; row: 4; col: 1): string index = 17 (Erinn)
+ (sheet: 0; row: 4; col: 2): string index = 18 (Flucks)
+ (sheet: 0; row: 4; col: 3): value = 65
+ (sheet: 0; row: 5; col: 0): value = 5
+ (sheet: 0; row: 5; col: 1): string index = 21 (Giusto)
+ (sheet: 0; row: 5; col: 2): string index = 22 (Bambury)
+ (sheet: 0; row: 5; col: 3): value = 88
+ (sheet: 0; row: 6; col: 0): value = 6
+ (sheet: 0; row: 6; col: 1): string index = 25 (Neall)
+ (sheet: 0; row: 6; col: 2): string index = 26 (Scorton)
+ (sheet: 0; row: 6; col: 3): value = 90
+ (sheet: 0; row: 7; col: 0): value = 7
+ (sheet: 0; row: 7; col: 1): string index = 29 (Ervin)
+ (sheet: 0; row: 7; col: 2): string index = 30 (Foreman)
+ (sheet: 0; row: 7; col: 3): value = 80
+ (sheet: 0; row: 8; col: 0): value = 8
+ (sheet: 0; row: 8; col: 1): string index = 33 (Shoshana)
+ (sheet: 0; row: 8; col: 2): string index = 34 (Bohea)
+ (sheet: 0; row: 8; col: 3): value = 66
+ (sheet: 0; row: 9; col: 0): value = 9
+ (sheet: 0; row: 9; col: 1): string index = 37 (Gladys)
+ (sheet: 0; row: 9; col: 2): string index = 38 (Somner)
+ (sheet: 0; row: 9; col: 3): value = 14
+ (sheet: 0; row: 10; col: 0): value = 10
+ (sheet: 0; row: 10; col: 1): string index = 41 (Ephraim)
+ (sheet: 0; row: 10; col: 2): string index = 42 (Russell)
+ (sheet: 0; row: 10; col: 3): value = 23
+
+The string indices now increment nicely, and their respective string values
+look correct.
+
+Now, let's turn our attention to the second sheet, which contains formulas.
+First, here is what the second sheet looks like:
+
+.. figure:: /_static/images/overview/multi-sheets-sheet2.png
+
+It contains a simple table extending from A1 to C9. It consists of three
+columns and the first row is a header row. Cells in the the first and second
+columns contain simple numbers and the third column contains formulas that
+simply add the two numbers to the left of the same row. When loading this
+sheet using the last code we used above, you'll see the following output:
+
+.. code-block:: text
+
+ (sheet: 1; row: 0; col: 0): string index = 44 (X)
+ (sheet: 1; row: 0; col: 1): string index = 45 (Y)
+ (sheet: 1; row: 0; col: 2): string index = 46 (X + Y)
+ (sheet: 1; row: 1; col: 0): value = 18
+ (sheet: 1; row: 1; col: 1): value = 79
+ (sheet: 1; row: 2; col: 0): value = 48
+ (sheet: 1; row: 2; col: 1): value = 55
+ (sheet: 1; row: 3; col: 0): value = 99
+ (sheet: 1; row: 3; col: 1): value = 35
+ (sheet: 1; row: 4; col: 0): value = 41
+ (sheet: 1; row: 4; col: 1): value = 69
+ (sheet: 1; row: 5; col: 0): value = 5
+ (sheet: 1; row: 5; col: 1): value = 18
+ (sheet: 1; row: 6; col: 0): value = 46
+ (sheet: 1; row: 6; col: 1): value = 69
+ (sheet: 1; row: 7; col: 0): value = 36
+ (sheet: 1; row: 7; col: 1): value = 67
+ (sheet: 1; row: 8; col: 0): value = 78
+ (sheet: 1; row: 8; col: 1): value = 2
+
+Everything looks fine except that the formula cells in C2:C9 are not loaded at
+all. This is because, in order to receive formula cell data, you must
+implement the required :cpp:class:`~orcus::spreadsheet::iface::import_formula`
+interface, which we will cover in the next section.
+
+
+Implement formula interface
+---------------------------
+
+In this section we will extend the code from the previous section in order to
+receive and process formula cell values from the sheet. We will need to make
+quite a few changes. Let's go over this one thing at a time. First, we are
+adding a new cell value type ``formula``:
+
+.. literalinclude:: ../../doc_example/spreadsheet_doc_2_sheets_with_formula.cpp
+ :language: C++
+ :start-after: //!code-start: cell_value_type
+ :end-before: //!code-end: cell_value_type
+
+which should not come as a surprise.
+
+We are not making any change to the ``cell_value`` struct itself, but we are
+re-using its ``index`` member for a formula cell value such that, if the cell
+stores a formula, the index will refer to its actual formula data which will
+be stored in a separate data store, much like how strings are stored
+externally and referenced by their indices in the ``cell_value`` instances.
+
+We are also adding a brand-new class called ``cell_grid``, to add an extra
+layer over the raw cell value array:
+
+.. literalinclude:: ../../doc_example/spreadsheet_doc_2_sheets_with_formula.cpp
+ :language: C++
+ :start-after: //!code-start: cell_grid
+ :end-before: //!code-end: cell_grid
+
+Each sheet instance will own one instance of ``cell_grid``, and the formula
+interface class instance will hold a reference to it and use it to insert
+formula cell values into it. The same sheet instance will also hold a formula
+value store, and pass its reference to the formula interface class.
+
+The formula interface class must implement the following methods:
+
+* :cpp:func:`~orcus::spreadsheet::iface::import_formula::set_position`
+* :cpp:func:`~orcus::spreadsheet::iface::import_formula::set_formula`
+* :cpp:func:`~orcus::spreadsheet::iface::import_formula::set_shared_formula_index`
+* :cpp:func:`~orcus::spreadsheet::iface::import_formula::set_result_string`
+* :cpp:func:`~orcus::spreadsheet::iface::import_formula::set_result_value`
+* :cpp:func:`~orcus::spreadsheet::iface::import_formula::set_result_empty`
+* :cpp:func:`~orcus::spreadsheet::iface::import_formula::set_result_bool`
+* :cpp:func:`~orcus::spreadsheet::iface::import_formula::commit`
+
+Depending on the type of a formula cell, and depending on the format of the
+document, some methods may not be called. The
+:cpp:func:`~orcus::spreadsheet::iface::import_formula::set_position` method
+always gets called regardless of the formula cell type, to specify the
+position of the formula cell. The
+:cpp:func:`~orcus::spreadsheet::iface::import_formula::set_formula` gets
+called for a formula cell that does not share its formula expression with any
+other formula cells, or a formula cell that shares its formula expression with
+a group of other formuls cells and is the primary cell of that group. If it's
+the primary cell of a grouped formula cells, the
+:cpp:func:`~orcus::spreadsheet::iface::import_formula::set_shared_formula_index`
+method also gets called to receive the identifier value of that group. All
+formula cells belonging to the same group receives the same identifier value
+via
+:cpp:func:`~orcus::spreadsheet::iface::import_formula::set_shared_formula_index`,
+but only the primary cell of a group receives the formula expression string
+via :cpp:func:`~orcus::spreadsheet::iface::import_formula::set_formula`. The
+rest of the methods -
+:cpp:func:`~orcus::spreadsheet::iface::import_formula::set_result_string`,
+:cpp:func:`~orcus::spreadsheet::iface::import_formula::set_result_value`,
+:cpp:func:`~orcus::spreadsheet::iface::import_formula::set_result_empty` and
+:cpp:func:`~orcus::spreadsheet::iface::import_formula::set_result_bool` - are
+called to deliver the cached formula cell value when applicable.
+
+The :cpp:func:`~orcus::spreadsheet::iface::import_formula::commit` method gets
+called at the very end to let the implementation commit the formula cell data
+to the backend document store.
+
+Without further ado, here is the formula interface implementation that we will
+use:
+
+.. literalinclude:: ../../doc_example/spreadsheet_doc_2_sheets_with_formula.cpp
+ :language: C++
+ :start-after: //!code-start: my_formula
+ :end-before: //!code-end: my_formula
+
+and here is the defintion of the ``formula`` struct that stores a formula expression
+string as well as its grammer type:
+
+.. literalinclude:: ../../doc_example/spreadsheet_doc_2_sheets_with_formula.cpp
+ :language: C++
+ :start-after: //!code-start: formula
+ :end-before: //!code-end: formula
+
+Note that since we are loading a OpenDocument Spereadsheet file (.ods) which
+does not support shared formulas, we do not need to handle the
+:cpp:func:`~orcus::spreadsheet::iface::import_formula::set_shared_formula_index`
+method. Likewise, we are leaving the ``set_result_*`` methods unhandled for
+now.
+
+This interface class also stores references to ``cell_grid`` and
+``std::vector<formula>`` instances, both of which are passed from the parent
+sheet instance.
+
+We also need to make a few changes to the sheet interface class to provide a formula interface
+and add a formula value store:
+
+.. literalinclude:: ../../doc_example/spreadsheet_doc_2_sheets_with_formula.cpp
+ :language: C++
+ :start-after: //!code-start: my_sheet
+ :end-before: //!code-end: my_sheet
+
+We've added the
+:cpp:func:`~orcus::spreadsheet::iface::import_sheet::get_formula` method which
+returns a pointer to the ``my_formula`` class instance defined above. The
+rest of the code is unchanged.
+
+Now let's see what happens when loading the same sheet from the previous
+section:
+
+.. code-block:: text
+
+ (sheet: 1; row: 0; col: 0): string index = 44 (X)
+ (sheet: 1; row: 0; col: 1): string index = 45 (Y)
+ (sheet: 1; row: 0; col: 2): string index = 46 (X + Y)
+ (sheet: 1; row: 1; col: 0): value = 18
+ (sheet: 1; row: 1; col: 1): value = 79
+ (sheet: 1; row: 2; col: 0): value = 48
+ (sheet: 1; row: 2; col: 1): value = 55
+ (sheet: 1; row: 3; col: 0): value = 99
+ (sheet: 1; row: 3; col: 1): value = 35
+ (sheet: 1; row: 4; col: 0): value = 41
+ (sheet: 1; row: 4; col: 1): value = 69
+ (sheet: 1; row: 5; col: 0): value = 5
+ (sheet: 1; row: 5; col: 1): value = 18
+ (sheet: 1; row: 6; col: 0): value = 46
+ (sheet: 1; row: 6; col: 1): value = 69
+ (sheet: 1; row: 7; col: 0): value = 36
+ (sheet: 1; row: 7; col: 1): value = 67
+ (sheet: 1; row: 8; col: 0): value = 78
+ (sheet: 1; row: 8; col: 1): value = 2
+ (sheet: 1; row: 1; col: 2): formula = [.A2]+[.B2] (ods)
+ (sheet: 1; row: 2; col: 2): formula = [.A3]+[.B3] (ods)
+ (sheet: 1; row: 3; col: 2): formula = [.A4]+[.B4] (ods)
+ (sheet: 1; row: 4; col: 2): formula = [.A5]+[.B5] (ods)
+ (sheet: 1; row: 5; col: 2): formula = [.A6]+[.B6] (ods)
+ (sheet: 1; row: 6; col: 2): formula = [.A7]+[.B7] (ods)
+ (sheet: 1; row: 7; col: 2): formula = [.A8]+[.B8] (ods)
+ (sheet: 1; row: 8; col: 2): formula = [.A9]+[.B9] (ods)
+
+Looks like we are getting the formula cell values this time around.
+
+One thing to note is that the formula expression strings you see here follow
+the syntax defined in the OpenFormula specifications, which is the formula syntax
+used in the OpenDocument Spreadsheet format.
+
+
+Implement more interfaces
+-------------------------
+
+This section has covered only a part of the available spreadsheet interfaces
+you can implement in your code. Refer to the :ref:`spreadsheet-interfaces`
+section to see the complete list of interfaces.
diff --git a/doc/overview/index.rst b/doc/overview/index.rst
new file mode 100644
index 0000000..0b95f8b
--- /dev/null
+++ b/doc/overview/index.rst
@@ -0,0 +1,95 @@
+
+.. highlight:: cpp
+
+Overview
+========
+
+Composition of the library
+--------------------------
+
+The primary goal of the orcus library is to provide a framework to import the
+contents of documents stored in various spreadsheet or spreadsheet-like
+formats. The library also provides several low-level parsers that can be used
+independently of the spreadsheet-related features if so desired. In addition,
+the library also provides support for some hierarchical documents, such as JSON
+and YAML, which were a later addition to the library.
+
+You can use this library either through its C++ API, Python API, or CLI. However,
+not all three methods equally expose all features of the library, and the C++ API
+is more complete than the other two.
+
+The library is physically split into four parts:
+
+ 1. the parser part that provides the aforementioned low-level parsers,
+ 2. the filter part that providers higher level import filters for spreadsheet
+ and hierarchical documents that internally use the low-level parsers,
+ 3. the spreadsheet document model part that includes the document model suitable
+ for storing spreadsheet document contents, and
+ 4. CLI for loading and converting spreadsheet and hierarchical documents.
+
+If you need to just use the parser part of the library, you need to only link
+against the ``liborcus-parser`` library file. If you need to use the import
+filter part, link againt both the ``liborcus-parser`` and the ``liborcus``
+libraries. Likewise, if you need to use the spreadsheet document model part,
+link against the aforementioned two plus the ``liborcus-spreadsheet-model``
+library.
+
+Also note that the spreadsheet document model part has additional dependency on
+the `ixion library <https://gitlab.com/ixion/ixion>`_ for handling formula
+re-calculations on document load.
+
+
+Loading spreadsheet documents
+-----------------------------
+
+The orcus library's primary aim is to provide a framework to import the contents
+of documents stored in various spreadsheet, or spreadsheet-like formats. It
+supports two primary use cases. The first use case is where the client
+program does not have its own document model, but needs to import data from a
+spreadsheet-like document file and access its content without implementing its
+own document store from scratch. In this particular use case, you can simply
+use the :cpp:class:`~orcus::spreadsheet::document` class to get it populated,
+and access its content through its API afterward.
+
+The second use case, which is a bit more advanced, is where the client program
+already has its own internal document model, and needs to use orcus
+to populate its document model. In this particular use case, you can
+implement your own set of classes that support necessary interfaces, and pass
+that to the orcus import filter.
+
+For each document type that orcus supports, there is a top-level import filter
+class that serves as an entry point for loading the content of a document you
+wish to load. You don't pass your document to this filter directly; instead,
+you wrap your document with what we call an **import factory**, then pass this
+factory instance to the loader. This import factory is then required to
+implement necessary interfaces that the filter class uses in order for it
+to pass data to the document as the file is getting parsed.
+
+When using orcus's own document model, you can simply use orcus's own import
+factory implementation to wrap its document. When using your own document
+model, on the other hand, you'll need to implement your own set of interface
+classes to wrap your document with.
+
+The following sections describe how to load a spreadsheet document by using 1)
+orcus's own spreadsheet document class, and 2) a user-defined custom docuemnt
+class.
+
+.. toctree::
+ :maxdepth: 1
+
+ doc-orcus.rst
+ doc-user.rst
+
+
+Loading hierarchical documents
+------------------------------
+
+The orcus library also includes support for hierarchical document types such
+as JSON and YAML. The following sections delve more into the support for
+these types of documents.
+
+.. toctree::
+ :maxdepth: 1
+
+ json.rst
+ yaml.rst
diff --git a/doc/overview/json.rst b/doc/overview/json.rst
new file mode 100644
index 0000000..0e252f9
--- /dev/null
+++ b/doc/overview/json.rst
@@ -0,0 +1,353 @@
+
+.. highlight:: cpp
+
+JSON
+====
+
+The JSON part of orcus consists of a low-level parser class that handles
+parsing of JSON strings, and a high-level document class that stores parsed
+JSON structures as a node tree.
+
+There are two approaches to processing JSON strings using the orcus library.
+One approach is to utilize the :cpp:class:`~orcus::json::document_tree` class
+to load and populate the JSON structure tree via its
+:cpp:func:`~orcus::json::document_tree::load()` method and traverse the tree
+through its :cpp:func:`~orcus::json::document_tree::get_document_root()` method.
+This approach is ideal if you want a quick way to parse and access the content
+of a JSON document with minimal effort.
+
+Another approach is to use the low-level :cpp:class:`~orcus::json_parser`
+class directly by providing your own handler class to receive callbacks from
+the parser. This method requires a bit more effort on your part to provide
+and populate your own data structure, but if you already have a data structure
+to store the content of JSON, then this approach is ideal. The
+:cpp:class:`~orcus::json::document_tree` class internally uses
+:cpp:class:`~orcus::json_parser` to parse JSON contents.
+
+
+Populating a document tree from JSON string
+-------------------------------------------
+
+The following code snippet shows an example of how to populate an instance of
+:cpp:class:`~orcus::json::document_tree` from a JSON string, and navigate its
+content tree afterward.
+
+.. literalinclude:: ../../doc_example/json_doc_1.cpp
+ :language: C++
+
+You'll see the following output when executing this code:
+
+.. code-block:: text
+
+ name: John Doe
+ occupation: Software Engineer
+ score:
+ - 89
+ - 67
+ - 90
+
+
+Using the low-level parser
+--------------------------
+
+The following code snippet shows how to use the low-level :cpp:class:`~orcus::json_parser`
+class by providing an own handler class and passing it as a template argument:
+
+.. literalinclude:: ../../doc_example/json_parser_1.cpp
+ :language: C++
+
+The parser constructor expects the char array, its length, and the handler
+instance. The base handler class :cpp:class:`~orcus::json_handler` implements
+all required handler methods. By inheriting from it, you only need to
+implement the handler methods you need. In this example, we are only
+implementing the :cpp:func:`~orcus::json_handler::object_key`,
+:cpp:func:`~orcus::json_handler::string`, and :cpp:func:`~orcus::json_handler::number`
+methods to process object key values, string values and numeric values,
+respectively. Refer to the :cpp:class:`~orcus::json_handler` class definition
+for all available handler methods.
+
+Executing this code will generate the following output:
+
+.. code-block:: text
+
+ JSON string: {"key1": [1,2,3,4,5], "key2": 12.3}
+ object key: key1
+ number: 1
+ number: 2
+ number: 3
+ number: 4
+ number: 5
+ object key: key2
+ number: 12.3
+
+
+Building a document tree directly
+---------------------------------
+
+You can also create and populate a JSON document tree directly without needing
+to parse a JSON string. This approach is ideal if you want to create a JSON
+tree from scratch and export it as a string. The following series of code
+snippets demonstrate how to exactly build JSON document trees directly and
+export their contents as JSON strings.
+
+The first example shows how to initialize the tree with a simple array:
+
+.. literalinclude:: ../../doc_example/json_doc_2.cpp
+ :language: C++
+ :start-after: //!code-start: root list
+ :end-before: //!code-end: root list
+
+You can simply specify the content of the array via initialization list and
+assign it to the document. The :cpp:func:`~orcus::json::document_tree::dump()`
+method then turns the content into a single string instance, which looks like
+the following:
+
+.. code-block:: text
+
+ [
+ 1,
+ 2,
+ "string value",
+ false,
+ null
+ ]
+
+If you need to build a array of arrays, do like the following:
+
+.. literalinclude:: ../../doc_example/json_doc_2.cpp
+ :language: C++
+ :start-after: //!code-start: list nested
+ :end-before: //!code-end: list nested
+
+This will create an array of two nested child arrays with three values each.
+Dumping the content of the tree as a JSON string will produce something like
+the following:
+
+.. code-block:: text
+
+ [
+ [
+ true,
+ false,
+ null
+ ],
+ [
+ 1.1,
+ 2.2,
+ "text"
+ ]
+ ]
+
+Creating an object can be done by nesting one of more key-value pairs, each of
+which is surrounded by a pair of curly braces, inside another pair of curly
+braces. For example, the following code:
+
+.. literalinclude:: ../../doc_example/json_doc_2.cpp
+ :language: C++
+ :start-after: //!code-start: list object
+ :end-before: //!code-end: list object
+
+produces the following output:
+
+.. code-block:: text
+
+ {
+ "key1": 1.2,
+ "key2": "some text"
+ }
+
+indicating that the tree consists of a single object having two key-value
+pairs.
+
+You may notice that this syntax is identical to the syntax for
+creating an array of arrays as shown above. In fact, in order for this to be
+an object, each of the inner sequences must have exactly two values, and its
+first value must be a string value. Failing that, it will be interpreted as
+an array of arrays.
+
+As with arrays, nesting of objects is also supported. The following code:
+
+.. literalinclude:: ../../doc_example/json_doc_2.cpp
+ :language: C++
+ :start-after: //!code-start: list object 2
+ :end-before: //!code-end: list object 2
+
+creates a root object having two key-value pairs one of which contains
+another object having three key-value pairs, as evident in the following output
+generated by this code:
+
+.. code-block:: text
+
+ {
+ "parent1": {
+ "child1": true,
+ "child2": false,
+ "child3": 123.4
+ },
+ "parent2": "not-nested"
+ }
+
+There is one caveat that you need to be aware of because of this special
+object creation syntax. When you have a nested array that exactly contains
+two values and the first value is a string value, you must explicitly declare
+that as an array by using an :cpp:class:`~orcus::json::array` class instance.
+For instance, this code:
+
+.. literalinclude:: ../../doc_example/json_doc_2.cpp
+ :language: C++
+ :start-after: //!code-start: array ambiguous
+ :end-before: //!code-end: array ambiguous
+
+is intended to be an object containing an array. However, because the supposed
+inner array contains exactly two values and the first value is a string
+value, which could be interpreted as a key-value pair for the outer object, it
+ends up being too ambiguous and a :cpp:class:`~orcus::json::key_value_error`
+exception gets thrown as a result.
+
+To work around this ambiguity, you need to declare the inner array to be
+explicit by using an :cpp:class:`~orcus::json::array` instance:
+
+.. literalinclude:: ../../doc_example/json_doc_2.cpp
+ :language: C++
+ :start-after: //!code-start: array explicit
+ :end-before: //!code-end: array explicit
+
+This code now correctly generates a root object containing one key-value pair
+whose value is an array:
+
+.. code-block:: text
+
+ {
+ "array": [
+ "one",
+ 987
+ ]
+ }
+
+Similar ambiguity issue arises when you want to construct a tree consisting
+only of an empty root object. You may be tempted to write something like
+this:
+
+.. literalinclude:: ../../doc_example/json_doc_2.cpp
+ :language: C++
+ :start-after: //!code-start: object ambiguous a
+ :end-before: //!code-end: object ambiguous a
+
+However, this will result in leaving the tree entirely unpopulated i.e. the
+tree will not even have a root node! If you continue on and try to get a root
+node from this tree, you'll get a :cpp:class:`~orcus::json::document_error`
+thrown as a result. If you inspect the error message stored in the exception:
+
+.. literalinclude:: ../../doc_example/json_doc_2.cpp
+ :language: C++
+ :start-after: //!code-start: object ambiguous b
+ :end-before: //!code-end: object ambiguous b
+
+you will get
+
+.. code-block:: text
+
+ json::document_error: document tree is empty
+
+giving you further proof that the tree is indeed empty! The solution here is
+to directly assign an instance of :cpp:class:`~orcus::json::object` to the
+document tree, which will initialize the tree with an empty root object. The
+following code:
+
+.. literalinclude:: ../../doc_example/json_doc_2.cpp
+ :language: C++
+ :start-after: //!code-start: object explicit 1
+ :end-before: //!code-end: object explicit 1
+
+will therefore generate
+
+.. code-block:: text
+
+ {
+ }
+
+You can also use the :cpp:class:`~orcus::json::object` class instances to
+indicate empty objects anythere in the tree. For instance, this code:
+
+.. literalinclude:: ../../doc_example/json_doc_2.cpp
+ :language: C++
+ :start-after: //!code-start: object explicit 2
+ :end-before: //!code-end: object explicit 2
+
+is intended to create an array containing three empty objects as its elements,
+and that's exactly what it does:
+
+.. code-block:: text
+
+ [
+ {
+ },
+ {
+ },
+ {
+ }
+ ]
+
+So far all the examples have shown how to initialize the document tree as the
+tree itself is being constructed. But our next example shows how to create
+new key-value pairs to existing objects after the document tree instance has
+been initialized.
+
+.. literalinclude:: ../../doc_example/json_doc_2.cpp
+ :language: C++
+ :start-after: //!code-start: root object add child
+ :end-before: //!code-end: root object add child
+
+This code first initializes the tree with an empty object, then retrieves the
+root empty object and assigns several key-value pairs to it. When converting
+the tree content to a string and inspecting it you'll see something like the
+following:
+
+.. code-block:: text
+
+ {
+ "child array": [
+ 1.1,
+ 1.2,
+ true
+ ],
+ "child1": 1,
+ "child3": [
+ true,
+ false
+ ],
+ "child2": "string",
+ "child object": {
+ "key1": 100,
+ "key2": 200
+ }
+ }
+
+The next example shows how to append values to an existing array after the
+tree has been constructed. Let's take a look at the code:
+
+.. literalinclude:: ../../doc_example/json_doc_2.cpp
+ :language: C++
+ :start-after: //!code-start: root array add child
+ :end-before: //!code-end: root array add child
+
+Like the previous example, this code first initializes the tree but this time
+with an empty array as its root, retrieves the root array, then appends
+several values to it via its :cpp:func:`~orcus::json::node::push_back` method.
+
+When you dump the content of this tree as a JSON string you'll get something
+like this:
+
+.. code-block:: text
+
+ [
+ -1.2,
+ "string",
+ true,
+ null,
+ {
+ "key1": 1.1,
+ "key2": 1.2
+ }
+ ]
+
diff --git a/doc/overview/yaml.rst b/doc/overview/yaml.rst
new file mode 100644
index 0000000..4109cf2
--- /dev/null
+++ b/doc/overview/yaml.rst
@@ -0,0 +1,8 @@
+
+.. highlight:: cpp
+
+YAML
+====
+
+TBD
+
diff --git a/doc/python/index.rst b/doc/python/index.rst
new file mode 100644
index 0000000..bb76c47
--- /dev/null
+++ b/doc/python/index.rst
@@ -0,0 +1,17 @@
+
+Python API reference
+====================
+
+Packages
+--------
+
+.. toctree::
+ :maxdepth: 1
+
+ orcus/index.rst
+ orcus/tools/index.rst
+ orcus/csv/index.rst
+ orcus/gnumeric/index.rst
+ orcus/ods/index.rst
+ orcus/xlsx/index.rst
+ orcus/xls_xml/index.rst
diff --git a/doc/python/orcus/cell.rst b/doc/python/orcus/cell.rst
new file mode 100644
index 0000000..0143307
--- /dev/null
+++ b/doc/python/orcus/cell.rst
@@ -0,0 +1,31 @@
+
+Cell
+====
+
+.. py:class:: orcus.Cell
+
+ This class represents a single cell within a :py:class:`.Sheet` object.
+
+ .. py:method:: get_formula_tokens
+
+ :rtype: :py:class:`.FormulaTokens`
+ :return: an iterator object for a formula cell.
+
+ Get an iterator object for formula tokens if the cell is a formula cell.
+ This method returns ``None`` for a non-formula cell.
+
+ .. py:attribute:: type
+ :type: orcus.CellType
+
+ Attribute specifying the type of this cell.
+
+ .. py:attribute:: value
+
+ Attribute containing the value of the cell.
+
+ .. py:attribute:: formula
+ :type: str
+
+ Attribute containing the formula string in case of a formula cell. This
+ value will be ``None`` for a non-formula cell.
+
diff --git a/doc/python/orcus/cell_type.rst b/doc/python/orcus/cell_type.rst
new file mode 100644
index 0000000..26568d4
--- /dev/null
+++ b/doc/python/orcus/cell_type.rst
@@ -0,0 +1,7 @@
+
+CellType
+========
+
+.. autoclass:: orcus.CellType
+ :members:
+ :undoc-members:
diff --git a/doc/python/orcus/csv/index.rst b/doc/python/orcus/csv/index.rst
new file mode 100644
index 0000000..f2b73a0
--- /dev/null
+++ b/doc/python/orcus/csv/index.rst
@@ -0,0 +1,19 @@
+
+orcus.csv
+=========
+
+.. py:function:: orcus.csv.read
+
+ Read an CSV file from a specified file path and create a :py:class:`orcus.Document`
+ instance object.
+
+ :param stream: either string value, or file object containing a string stream.
+ :rtype: :py:class:`orcus.Document`
+ :return: document instance object that stores the content of the file.
+
+ Example::
+
+ from orcus import csv
+
+ with open("path/to/file.csv", "r") as f:
+ doc = csv.read(f)
diff --git a/doc/python/orcus/document.rst b/doc/python/orcus/document.rst
new file mode 100644
index 0000000..d4b6fc5
--- /dev/null
+++ b/doc/python/orcus/document.rst
@@ -0,0 +1,21 @@
+
+Document
+========
+
+.. py:class:: orcus.Document
+
+ An instance of this class represents a document model. A document consists
+ of multiple sheet objects.
+
+ .. py:attribute:: sheets
+
+ Read-only attribute that stores a tuple of :py:class:`.Sheet` instance
+ objects.
+
+ .. py:function:: get_named_expressions
+
+ Get a named expressions iterator.
+
+ :rtype: :obj:`.NamedExpressions`
+ :return: named expression object.
+
diff --git a/doc/python/orcus/format_type.rst b/doc/python/orcus/format_type.rst
new file mode 100644
index 0000000..a3d4b01
--- /dev/null
+++ b/doc/python/orcus/format_type.rst
@@ -0,0 +1,7 @@
+
+FormatType
+==========
+
+.. autoclass:: orcus.FormatType
+ :members:
+ :undoc-members:
diff --git a/doc/python/orcus/formula_token.rst b/doc/python/orcus/formula_token.rst
new file mode 100644
index 0000000..d9627cf
--- /dev/null
+++ b/doc/python/orcus/formula_token.rst
@@ -0,0 +1,19 @@
+
+FormulaToken
+============
+
+.. py:class:: orcus.FormulaToken
+
+ This class represents a single formula token value as returned from a
+ :py:class:`.FormulaTokens` iterator.
+
+ .. py:attribute:: op
+ :type: orcus.FormulaTokenOp
+
+ Attribute specifying the opcode of the formula token.
+
+ .. py:attribute:: type
+ :type: orcus.FormulaTokenType
+
+ Attribute specifying the type of the formula token.
+
diff --git a/doc/python/orcus/formula_token_op.rst b/doc/python/orcus/formula_token_op.rst
new file mode 100644
index 0000000..0f29d59
--- /dev/null
+++ b/doc/python/orcus/formula_token_op.rst
@@ -0,0 +1,7 @@
+
+FormulaTokenOp
+==============
+
+.. autoclass:: orcus.FormulaTokenOp
+ :members:
+ :undoc-members:
diff --git a/doc/python/orcus/formula_token_type.rst b/doc/python/orcus/formula_token_type.rst
new file mode 100644
index 0000000..cc575d4
--- /dev/null
+++ b/doc/python/orcus/formula_token_type.rst
@@ -0,0 +1,7 @@
+
+FormulaTokenType
+================
+
+.. autoclass:: orcus.FormulaTokenType
+ :members:
+ :undoc-members:
diff --git a/doc/python/orcus/formula_tokens.rst b/doc/python/orcus/formula_tokens.rst
new file mode 100644
index 0000000..ba5aa4e
--- /dev/null
+++ b/doc/python/orcus/formula_tokens.rst
@@ -0,0 +1,8 @@
+
+FormulaTokens
+=============
+
+.. py:class:: orcus.FormulaTokens
+
+ Iterator for formula tokens within a :py:class:`.Cell` object representing
+ a formula cell. Each iteration will return a :py:class:`.FormulaToken` object.
diff --git a/doc/python/orcus/gnumeric/index.rst b/doc/python/orcus/gnumeric/index.rst
new file mode 100644
index 0000000..a3ab2cc
--- /dev/null
+++ b/doc/python/orcus/gnumeric/index.rst
@@ -0,0 +1,24 @@
+
+orcus.gnumeric
+==============
+
+.. py:function:: orcus.gnumeric.read
+
+ Read an Gnumeric file from a specified file path and create a
+ :py:class:`orcus.Document` instance object.
+
+ :param stream: file object containing byte streams.
+ :param bool recalc: optional parameter specifying whether or not to recalculate
+ the formula cells on load. Defaults to ``False``.
+ :param str error_policy: optional parameter indicating what to do when
+ encountering formula cells with invalid formula expressions. The value
+ must be either ``fail`` or ``skip``. Defaults to ``fail``.
+ :rtype: :py:class:`orcus.Document`
+ :return: document instance object that stores the content of the file.
+
+ Example::
+
+ from orcus import gnumeric
+
+ with open("path/to/file.gnumeric", "rb") as f:
+ doc = gnumeric.read(f, recalc=True, error_policy="fail")
diff --git a/doc/python/orcus/index.rst b/doc/python/orcus/index.rst
new file mode 100644
index 0000000..69ee284
--- /dev/null
+++ b/doc/python/orcus/index.rst
@@ -0,0 +1,34 @@
+
+orcus
+=====
+
+.. py:function:: orcus.detect_format
+
+ Detects the file format of the stream.
+
+ :param stream: either bytes, or file object containing a byte stream.
+ :rtype: :py:class:`orcus.FormatType`
+ :return: enum value specifying the detected file format.
+
+ Example::
+
+ import orcus
+
+ with open("path/to/file", "rb") as f:
+ fmt = orcus.detect_format(f)
+
+
+.. toctree::
+ :maxdepth: 1
+
+ cell.rst
+ cell_type.rst
+ document.rst
+ format_type.rst
+ formula_token.rst
+ formula_token_op.rst
+ formula_token_type.rst
+ formula_tokens.rst
+ named_expressions.rst
+ sheet.rst
+ sheet_rows.rst
diff --git a/doc/python/orcus/named_expressions.rst b/doc/python/orcus/named_expressions.rst
new file mode 100644
index 0000000..fc1aa81
--- /dev/null
+++ b/doc/python/orcus/named_expressions.rst
@@ -0,0 +1,13 @@
+
+NamedExpressions
+================
+
+.. py:class:: NamedExpressions
+
+ Iterator for named expressions.
+
+ .. py:attribute:: names
+ :type: set
+
+ A set of strings representing the names of the named expressions.
+
diff --git a/doc/python/orcus/ods/index.rst b/doc/python/orcus/ods/index.rst
new file mode 100644
index 0000000..1dac00e
--- /dev/null
+++ b/doc/python/orcus/ods/index.rst
@@ -0,0 +1,24 @@
+
+orcus.ods
+==========
+
+.. py:function:: orcus.ods.read
+
+ Read an Open Document Spreadsheet file from a specified file path and create
+ a :py:class:`orcus.Document` instance object.
+
+ :param stream: file object containing byte streams.
+ :param bool recalc: optional parameter specifying whether or not to recalculate
+ the formula cells on load. Defaults to ``False``.
+ :param str error_policy: optional parameter indicating what to do when
+ encountering formula cells with invalid formula expressions. The value
+ must be either ``fail`` or ``skip``. Defaults to ``fail``.
+ :rtype: :py:class:`orcus.Document`
+ :return: document instance object that stores the content of the file.
+
+ Example::
+
+ from orcus import ods
+
+ with open("path/to/file.ods", "rb") as f:
+ doc = ods.read(f, recalc=True, error_policy="fail")
diff --git a/doc/python/orcus/sheet.rst b/doc/python/orcus/sheet.rst
new file mode 100644
index 0000000..a94f64e
--- /dev/null
+++ b/doc/python/orcus/sheet.rst
@@ -0,0 +1,56 @@
+
+Sheet
+=====
+
+.. py:class:: orcus.Sheet
+
+ An instance of this class represents a single sheet inside a document.
+
+ .. py:function:: get_rows
+
+ This function returns a row iterator object that allows you to iterate
+ through rows in the data region.
+
+ :rtype: :py:class:`.SheetRows`
+ :return: row iterator object.
+
+ Example::
+
+ rows = sheet.get_rows()
+
+ for row in rows:
+ print(row) # tuple of cell values
+
+ .. py:function:: get_named_expressions
+
+ Get a named expressions iterator.
+
+ :rtype: :obj:`.NamedExpressions`
+ :return: named expression object.
+
+ .. py:function:: write
+
+ Write sheet content to specified file object.
+
+ :param file: writable object to write the sheet content to.
+ :param format: format of the output. Note that it currently
+ only supports a subset of the formats provided by the :obj:`.FormatType`
+ type.
+ :type format: :obj:`.FormatType`
+
+ .. py:attribute:: name
+
+ Read-only attribute that stores the name of the sheet.
+
+ .. py:attribute:: sheet_size
+
+ Read-only dictionary object that stores the column and row sizes of the
+ sheet with the **column** and **row** keys, respectively.
+
+ .. py:attribute:: data_size
+
+ Read-only dictionary object that stores the column and row sizes of the
+ data region of the sheet with the **column** and **row** keys, respectively.
+ The data region is the smallest possible range that includes all non-empty
+ cells in the sheet. The top-left corner of the data region is always at
+ the top-left corner of the sheet.
diff --git a/doc/python/orcus/sheet_rows.rst b/doc/python/orcus/sheet_rows.rst
new file mode 100644
index 0000000..bd86e6e
--- /dev/null
+++ b/doc/python/orcus/sheet_rows.rst
@@ -0,0 +1,9 @@
+
+SheetRows
+=========
+
+.. py:class:: SheetRows
+
+ Iterator for rows within a :py:class:`.Sheet` object. Each iteration returns
+ a tuple of :py:class:`.Cell` objects for the row.
+
diff --git a/doc/python/orcus/tools/bugzilla.rst b/doc/python/orcus/tools/bugzilla.rst
new file mode 100644
index 0000000..53cf869
--- /dev/null
+++ b/doc/python/orcus/tools/bugzilla.rst
@@ -0,0 +1,11 @@
+
+bugzilla
+========
+
+.. argparse::
+ :module: orcus.tools.bugzilla
+ :func: _create_argparser
+ :prog: orcus.tools.bugzilla
+
+.. autoclass:: orcus.tools.bugzilla.BugzillaAccess
+ :members:
diff --git a/doc/python/orcus/tools/file_processor.rst b/doc/python/orcus/tools/file_processor.rst
new file mode 100644
index 0000000..20b7e0a
--- /dev/null
+++ b/doc/python/orcus/tools/file_processor.rst
@@ -0,0 +1,9 @@
+
+file_processor
+==============
+
+.. argparse::
+ :module: orcus.tools.file_processor
+ :func: _create_argparser
+ :prog: orcus.tools.file_processor
+
diff --git a/doc/python/orcus/tools/index.rst b/doc/python/orcus/tools/index.rst
new file mode 100644
index 0000000..0942183
--- /dev/null
+++ b/doc/python/orcus/tools/index.rst
@@ -0,0 +1,10 @@
+
+orcus.tools
+===========
+
+.. toctree::
+ :maxdepth: 1
+
+ bugzilla.rst
+ file_processor.rst
+
diff --git a/doc/python/orcus/xls_xml/index.rst b/doc/python/orcus/xls_xml/index.rst
new file mode 100644
index 0000000..e7c07b1
--- /dev/null
+++ b/doc/python/orcus/xls_xml/index.rst
@@ -0,0 +1,25 @@
+
+orcus.xls_xml
+=============
+
+.. py:function:: orcus.xls_xml.read
+
+ Read an Excel file from a specified file path and create a
+ :py:class:`orcus.Document` instance object. The file must be saved in the
+ SpreadsheetML format.
+
+ :param stream: file object containing byte streams.
+ :param bool recalc: optional parameter specifying whether or not to recalculate
+ the formula cells on load. Defaults to ``False``.
+ :param str error_policy: optional parameter indicating what to do when
+ encountering formula cells with invalid formula expressions. The value
+ must be either ``fail`` or ``skip``. Defaults to ``fail``.
+ :rtype: :py:class:`orcus.Document`
+ :return: document instance object that stores the content of the file.
+
+ Example::
+
+ from orcus import xls_xml
+
+ with open("path/to/file.xls_xml", "rb") as f:
+ doc = xls_xml.read(f, recalc=True, error_policy="fail")
diff --git a/doc/python/orcus/xlsx/index.rst b/doc/python/orcus/xlsx/index.rst
new file mode 100644
index 0000000..977ea1c
--- /dev/null
+++ b/doc/python/orcus/xlsx/index.rst
@@ -0,0 +1,25 @@
+
+orcus.xlsx
+==========
+
+.. py:function:: orcus.xlsx.read
+
+ Read an Excel file from a specified file path and create a
+ :py:class:`orcus.Document` instance object. The file must be of Excel 2007
+ XML format.
+
+ :param stream: file object containing byte streams.
+ :param bool recalc: optional parameter specifying whether or not to recalculate
+ the formula cells on load. Defaults to ``False``.
+ :param str error_policy: optional parameter indicating what to do when
+ encountering formula cells with invalid formula expressions. The value
+ must be either ``fail`` or ``skip``. Defaults to ``fail``.
+ :rtype: :py:class:`orcus.Document`
+ :return: document instance object that stores the content of the file.
+
+ Example::
+
+ from orcus import xlsx
+
+ with open("path/to/file.xlsx", "rb") as f:
+ doc = xlsx.read(f, recalc=True, error_policy="fail")
diff --git a/doc/requirements.txt b/doc/requirements.txt
new file mode 100644
index 0000000..b3f96dd
--- /dev/null
+++ b/doc/requirements.txt
@@ -0,0 +1,3 @@
+breathe
+sphinx-argparse
+sphinx-rtd-theme
diff --git a/doc_example/Makefile.am b/doc_example/Makefile.am
new file mode 100644
index 0000000..0f097b2
--- /dev/null
+++ b/doc_example/Makefile.am
@@ -0,0 +1,110 @@
+
+AM_CPPFLAGS = \
+ -I$(top_srcdir)/include \
+ $(LIBIXION_CFLAGS) \
+ -DSRCDIR=\""$(top_srcdir)"\"
+
+bin_PROGRAMS =
+
+EXTRA_PROGRAMS = \
+ json-doc-1 \
+ json-doc-2 \
+ json-parser-1 \
+ xml-mapping-1 \
+ spreadsheet-doc-1 \
+ spreadsheet-doc-1-num-and-formula \
+ spreadsheet-doc-2 \
+ spreadsheet-doc-2-sheets-no-string-pool \
+ spreadsheet-doc-2-sheets-with-string-pool \
+ spreadsheet-doc-2-sheets-with-formula
+
+json_doc_1_SOURCES = \
+ json_doc_1.cpp
+
+json_doc_1_LDADD = \
+ ../src/liborcus/liborcus-@ORCUS_API_VERSION@.la \
+ ../src/parser/liborcus-parser-@ORCUS_API_VERSION@.la
+
+json_doc_2_SOURCES = \
+ json_doc_2.cpp
+
+json_doc_2_LDADD = \
+ ../src/liborcus/liborcus-@ORCUS_API_VERSION@.la \
+ ../src/parser/liborcus-parser-@ORCUS_API_VERSION@.la
+
+json_parser_1_SOURCES = \
+ json_parser_1.cpp
+
+json_parser_1_LDADD = \
+ ../src/parser/liborcus-parser-@ORCUS_API_VERSION@.la
+
+xml_mapping_1_SOURCES = \
+ xml_mapping_1.cpp
+
+xml_mapping_1_LDADD = \
+ ../src/parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../src/liborcus/liborcus-@ORCUS_API_VERSION@.la
+
+# Spreadsheet document examples.
+
+SPDOC_LDADD = \
+ ../src/parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../src/liborcus/liborcus-@ORCUS_API_VERSION@.la \
+ ../src/spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+ $(LIBIXION_LIBS)
+
+spreadsheet_doc_1_SOURCES = \
+ spreadsheet_doc_1.cpp
+
+spreadsheet_doc_1_LDADD = $(SPDOC_LDADD)
+
+spreadsheet_doc_1_num_and_formula_SOURCES = \
+ spreadsheet_doc_1_num_and_formula.cpp
+
+spreadsheet_doc_1_num_and_formula_LDADD = $(SPDOC_LDADD)
+
+spreadsheet_doc_2_SOURCES = \
+ spreadsheet_doc_2.cpp
+
+spreadsheet_doc_2_LDADD = \
+ ../src/parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../src/liborcus/liborcus-@ORCUS_API_VERSION@.la
+
+spreadsheet_doc_2_sheets_no_string_pool_SOURCES = \
+ spreadsheet_doc_2_sheets_no_string_pool.cpp
+
+spreadsheet_doc_2_sheets_no_string_pool_LDADD = \
+ ../src/parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../src/liborcus/liborcus-@ORCUS_API_VERSION@.la
+
+spreadsheet_doc_2_sheets_with_string_pool_SOURCES = \
+ spreadsheet_doc_2_sheets_with_string_pool.cpp
+
+spreadsheet_doc_2_sheets_with_string_pool_LDADD = \
+ ../src/parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../src/liborcus/liborcus-@ORCUS_API_VERSION@.la
+
+spreadsheet_doc_2_sheets_with_formula_SOURCES = \
+ spreadsheet_doc_2_sheets_with_formula.cpp
+
+spreadsheet_doc_2_sheets_with_formula_LDADD = \
+ ../src/parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../src/liborcus/liborcus-@ORCUS_API_VERSION@.la
+
+AM_TESTS_ENVIRONMENT = \
+ INPUTDIR=$(srcdir)/files; export INPUTDIR;
+
+TESTS = \
+ json-doc-1 \
+ json-doc-2 \
+ json-parser-1 \
+ xml-mapping-1 \
+ spreadsheet-doc-1 \
+ spreadsheet-doc-1-num-and-formula \
+ spreadsheet-doc-2 \
+ spreadsheet-doc-2-sheets-no-string-pool \
+ spreadsheet-doc-2-sheets-with-string-pool \
+ spreadsheet-doc-2-sheets-with-formula
+
+distclean-local:
+ rm -rf $(TESTS)
diff --git a/doc_example/Makefile.in b/doc_example/Makefile.in
new file mode 100644
index 0000000..5eaad38
--- /dev/null
+++ b/doc_example/Makefile.in
@@ -0,0 +1,1409 @@
+# Makefile.in generated by automake 1.16.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2021 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.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+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 =
+EXTRA_PROGRAMS = json-doc-1$(EXEEXT) json-doc-2$(EXEEXT) \
+ json-parser-1$(EXEEXT) xml-mapping-1$(EXEEXT) \
+ spreadsheet-doc-1$(EXEEXT) \
+ spreadsheet-doc-1-num-and-formula$(EXEEXT) \
+ spreadsheet-doc-2$(EXEEXT) \
+ spreadsheet-doc-2-sheets-no-string-pool$(EXEEXT) \
+ spreadsheet-doc-2-sheets-with-string-pool$(EXEEXT) \
+ spreadsheet-doc-2-sheets-with-formula$(EXEEXT)
+TESTS = json-doc-1$(EXEEXT) json-doc-2$(EXEEXT) json-parser-1$(EXEEXT) \
+ xml-mapping-1$(EXEEXT) spreadsheet-doc-1$(EXEEXT) \
+ spreadsheet-doc-1-num-and-formula$(EXEEXT) \
+ spreadsheet-doc-2$(EXEEXT) \
+ spreadsheet-doc-2-sheets-no-string-pool$(EXEEXT) \
+ spreadsheet-doc-2-sheets-with-string-pool$(EXEEXT) \
+ spreadsheet-doc-2-sheets-with-formula$(EXEEXT)
+subdir = doc_example
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
+ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_17.m4 \
+ $(top_srcdir)/m4/boost.m4 $(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)/m4/m4_ax_valgrind_check.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_json_doc_1_OBJECTS = json_doc_1.$(OBJEXT)
+json_doc_1_OBJECTS = $(am_json_doc_1_OBJECTS)
+json_doc_1_DEPENDENCIES = \
+ ../src/liborcus/liborcus-@ORCUS_API_VERSION@.la \
+ ../src/parser/liborcus-parser-@ORCUS_API_VERSION@.la
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+am_json_doc_2_OBJECTS = json_doc_2.$(OBJEXT)
+json_doc_2_OBJECTS = $(am_json_doc_2_OBJECTS)
+json_doc_2_DEPENDENCIES = \
+ ../src/liborcus/liborcus-@ORCUS_API_VERSION@.la \
+ ../src/parser/liborcus-parser-@ORCUS_API_VERSION@.la
+am_json_parser_1_OBJECTS = json_parser_1.$(OBJEXT)
+json_parser_1_OBJECTS = $(am_json_parser_1_OBJECTS)
+json_parser_1_DEPENDENCIES = \
+ ../src/parser/liborcus-parser-@ORCUS_API_VERSION@.la
+am_spreadsheet_doc_1_OBJECTS = spreadsheet_doc_1.$(OBJEXT)
+spreadsheet_doc_1_OBJECTS = $(am_spreadsheet_doc_1_OBJECTS)
+am__DEPENDENCIES_1 =
+am__DEPENDENCIES_2 = \
+ ../src/parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../src/liborcus/liborcus-@ORCUS_API_VERSION@.la \
+ ../src/spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+ $(am__DEPENDENCIES_1)
+spreadsheet_doc_1_DEPENDENCIES = $(am__DEPENDENCIES_2)
+am_spreadsheet_doc_1_num_and_formula_OBJECTS = \
+ spreadsheet_doc_1_num_and_formula.$(OBJEXT)
+spreadsheet_doc_1_num_and_formula_OBJECTS = \
+ $(am_spreadsheet_doc_1_num_and_formula_OBJECTS)
+spreadsheet_doc_1_num_and_formula_DEPENDENCIES = \
+ $(am__DEPENDENCIES_2)
+am_spreadsheet_doc_2_OBJECTS = spreadsheet_doc_2.$(OBJEXT)
+spreadsheet_doc_2_OBJECTS = $(am_spreadsheet_doc_2_OBJECTS)
+spreadsheet_doc_2_DEPENDENCIES = \
+ ../src/parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../src/liborcus/liborcus-@ORCUS_API_VERSION@.la
+am_spreadsheet_doc_2_sheets_no_string_pool_OBJECTS = \
+ spreadsheet_doc_2_sheets_no_string_pool.$(OBJEXT)
+spreadsheet_doc_2_sheets_no_string_pool_OBJECTS = \
+ $(am_spreadsheet_doc_2_sheets_no_string_pool_OBJECTS)
+spreadsheet_doc_2_sheets_no_string_pool_DEPENDENCIES = \
+ ../src/parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../src/liborcus/liborcus-@ORCUS_API_VERSION@.la
+am_spreadsheet_doc_2_sheets_with_formula_OBJECTS = \
+ spreadsheet_doc_2_sheets_with_formula.$(OBJEXT)
+spreadsheet_doc_2_sheets_with_formula_OBJECTS = \
+ $(am_spreadsheet_doc_2_sheets_with_formula_OBJECTS)
+spreadsheet_doc_2_sheets_with_formula_DEPENDENCIES = \
+ ../src/parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../src/liborcus/liborcus-@ORCUS_API_VERSION@.la
+am_spreadsheet_doc_2_sheets_with_string_pool_OBJECTS = \
+ spreadsheet_doc_2_sheets_with_string_pool.$(OBJEXT)
+spreadsheet_doc_2_sheets_with_string_pool_OBJECTS = \
+ $(am_spreadsheet_doc_2_sheets_with_string_pool_OBJECTS)
+spreadsheet_doc_2_sheets_with_string_pool_DEPENDENCIES = \
+ ../src/parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../src/liborcus/liborcus-@ORCUS_API_VERSION@.la
+am_xml_mapping_1_OBJECTS = xml_mapping_1.$(OBJEXT)
+xml_mapping_1_OBJECTS = $(am_xml_mapping_1_OBJECTS)
+xml_mapping_1_DEPENDENCIES = \
+ ../src/parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../src/liborcus/liborcus-@ORCUS_API_VERSION@.la
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/json_doc_1.Po \
+ ./$(DEPDIR)/json_doc_2.Po ./$(DEPDIR)/json_parser_1.Po \
+ ./$(DEPDIR)/spreadsheet_doc_1.Po \
+ ./$(DEPDIR)/spreadsheet_doc_1_num_and_formula.Po \
+ ./$(DEPDIR)/spreadsheet_doc_2.Po \
+ ./$(DEPDIR)/spreadsheet_doc_2_sheets_no_string_pool.Po \
+ ./$(DEPDIR)/spreadsheet_doc_2_sheets_with_formula.Po \
+ ./$(DEPDIR)/spreadsheet_doc_2_sheets_with_string_pool.Po \
+ ./$(DEPDIR)/xml_mapping_1.Po
+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_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+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_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(json_doc_1_SOURCES) $(json_doc_2_SOURCES) \
+ $(json_parser_1_SOURCES) $(spreadsheet_doc_1_SOURCES) \
+ $(spreadsheet_doc_1_num_and_formula_SOURCES) \
+ $(spreadsheet_doc_2_SOURCES) \
+ $(spreadsheet_doc_2_sheets_no_string_pool_SOURCES) \
+ $(spreadsheet_doc_2_sheets_with_formula_SOURCES) \
+ $(spreadsheet_doc_2_sheets_with_string_pool_SOURCES) \
+ $(xml_mapping_1_SOURCES)
+DIST_SOURCES = $(json_doc_1_SOURCES) $(json_doc_2_SOURCES) \
+ $(json_parser_1_SOURCES) $(spreadsheet_doc_1_SOURCES) \
+ $(spreadsheet_doc_1_num_and_formula_SOURCES) \
+ $(spreadsheet_doc_2_SOURCES) \
+ $(spreadsheet_doc_2_sheets_no_string_pool_SOURCES) \
+ $(spreadsheet_doc_2_sheets_with_formula_SOURCES) \
+ $(spreadsheet_doc_2_sheets_with_string_pool_SOURCES) \
+ $(xml_mapping_1_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__extra_recursive_targets = check-valgrind-recursive \
+ check-valgrind-memcheck-recursive \
+ check-valgrind-helgrind-recursive check-valgrind-drd-recursive \
+ check-valgrind-sgcheck-recursive
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+am__tty_colors_dummy = \
+ mgn= red= grn= lgn= blu= brg= std=; \
+ am__color_tests=no
+am__tty_colors = { \
+ $(am__tty_colors_dummy); \
+ if test "X$(AM_COLOR_TESTS)" = Xno; then \
+ am__color_tests=no; \
+ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+ am__color_tests=yes; \
+ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+ am__color_tests=yes; \
+ fi; \
+ if test $$am__color_tests = yes; then \
+ red=''; \
+ grn=''; \
+ lgn=''; \
+ blu=''; \
+ mgn=''; \
+ brg=''; \
+ std=''; \
+ fi; \
+}
+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__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# 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
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# 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. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(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='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)'
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \
+ $(top_srcdir)/test-driver
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BOOST_CPPFLAGS = @BOOST_CPPFLAGS@
+BOOST_DATE_TIME_LDFLAGS = @BOOST_DATE_TIME_LDFLAGS@
+BOOST_DATE_TIME_LDPATH = @BOOST_DATE_TIME_LDPATH@
+BOOST_DATE_TIME_LIBS = @BOOST_DATE_TIME_LIBS@
+BOOST_FILESYSTEM_LDFLAGS = @BOOST_FILESYSTEM_LDFLAGS@
+BOOST_FILESYSTEM_LDPATH = @BOOST_FILESYSTEM_LDPATH@
+BOOST_FILESYSTEM_LIBS = @BOOST_FILESYSTEM_LIBS@
+BOOST_IOSTREAMS_LDFLAGS = @BOOST_IOSTREAMS_LDFLAGS@
+BOOST_IOSTREAMS_LDPATH = @BOOST_IOSTREAMS_LDPATH@
+BOOST_IOSTREAMS_LIBS = @BOOST_IOSTREAMS_LIBS@
+BOOST_LDPATH = @BOOST_LDPATH@
+BOOST_PROGRAM_OPTIONS_LDFLAGS = @BOOST_PROGRAM_OPTIONS_LDFLAGS@
+BOOST_PROGRAM_OPTIONS_LDPATH = @BOOST_PROGRAM_OPTIONS_LDPATH@
+BOOST_PROGRAM_OPTIONS_LIBS = @BOOST_PROGRAM_OPTIONS_LIBS@
+BOOST_ROOT = @BOOST_ROOT@
+BOOST_SYSTEM_LDFLAGS = @BOOST_SYSTEM_LDFLAGS@
+BOOST_SYSTEM_LDPATH = @BOOST_SYSTEM_LDPATH@
+BOOST_SYSTEM_LIBS = @BOOST_SYSTEM_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CSCOPE = @CSCOPE@
+CTAGS = @CTAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_VALGRIND_drd = @ENABLE_VALGRIND_drd@
+ENABLE_VALGRIND_helgrind = @ENABLE_VALGRIND_helgrind@
+ENABLE_VALGRIND_memcheck = @ENABLE_VALGRIND_memcheck@
+ENABLE_VALGRIND_sgcheck = @ENABLE_VALGRIND_sgcheck@
+ETAGS = @ETAGS@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+HAVE_CXX17 = @HAVE_CXX17@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+IXION_REQUIRED_API_VERSION = @IXION_REQUIRED_API_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBIXION_CFLAGS = @LIBIXION_CFLAGS@
+LIBIXION_LIBS = @LIBIXION_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MDDS_CFLAGS = @MDDS_CFLAGS@
+MDDS_LIBS = @MDDS_LIBS@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+ORCUS_API_VERSION = @ORCUS_API_VERSION@
+ORCUS_MAJOR_VERSION = @ORCUS_MAJOR_VERSION@
+ORCUS_MICRO_VERSION = @ORCUS_MICRO_VERSION@
+ORCUS_MINOR_VERSION = @ORCUS_MINOR_VERSION@
+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@
+PARQUET_CFLAGS = @PARQUET_CFLAGS@
+PARQUET_LIBS = @PARQUET_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POW_LIB = @POW_LIB@
+PYTHON = @PYTHON@
+PYTHON_CFLAGS = @PYTHON_CFLAGS@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VALGRIND = @VALGRIND@
+VALGRIND_ENABLED = @VALGRIND_ENABLED@
+VERSION = @VERSION@
+ZLIB_CFLAGS = @ZLIB_CFLAGS@
+ZLIB_LIBS = @ZLIB_LIBS@
+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@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+runstatedir = @runstatedir@
+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@
+valgrind_enabled_tools = @valgrind_enabled_tools@
+valgrind_tools = @valgrind_tools@
+AM_CPPFLAGS = \
+ -I$(top_srcdir)/include \
+ $(LIBIXION_CFLAGS) \
+ -DSRCDIR=\""$(top_srcdir)"\"
+
+json_doc_1_SOURCES = \
+ json_doc_1.cpp
+
+json_doc_1_LDADD = \
+ ../src/liborcus/liborcus-@ORCUS_API_VERSION@.la \
+ ../src/parser/liborcus-parser-@ORCUS_API_VERSION@.la
+
+json_doc_2_SOURCES = \
+ json_doc_2.cpp
+
+json_doc_2_LDADD = \
+ ../src/liborcus/liborcus-@ORCUS_API_VERSION@.la \
+ ../src/parser/liborcus-parser-@ORCUS_API_VERSION@.la
+
+json_parser_1_SOURCES = \
+ json_parser_1.cpp
+
+json_parser_1_LDADD = \
+ ../src/parser/liborcus-parser-@ORCUS_API_VERSION@.la
+
+xml_mapping_1_SOURCES = \
+ xml_mapping_1.cpp
+
+xml_mapping_1_LDADD = \
+ ../src/parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../src/liborcus/liborcus-@ORCUS_API_VERSION@.la
+
+
+# Spreadsheet document examples.
+SPDOC_LDADD = \
+ ../src/parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../src/liborcus/liborcus-@ORCUS_API_VERSION@.la \
+ ../src/spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+ $(LIBIXION_LIBS)
+
+spreadsheet_doc_1_SOURCES = \
+ spreadsheet_doc_1.cpp
+
+spreadsheet_doc_1_LDADD = $(SPDOC_LDADD)
+spreadsheet_doc_1_num_and_formula_SOURCES = \
+ spreadsheet_doc_1_num_and_formula.cpp
+
+spreadsheet_doc_1_num_and_formula_LDADD = $(SPDOC_LDADD)
+spreadsheet_doc_2_SOURCES = \
+ spreadsheet_doc_2.cpp
+
+spreadsheet_doc_2_LDADD = \
+ ../src/parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../src/liborcus/liborcus-@ORCUS_API_VERSION@.la
+
+spreadsheet_doc_2_sheets_no_string_pool_SOURCES = \
+ spreadsheet_doc_2_sheets_no_string_pool.cpp
+
+spreadsheet_doc_2_sheets_no_string_pool_LDADD = \
+ ../src/parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../src/liborcus/liborcus-@ORCUS_API_VERSION@.la
+
+spreadsheet_doc_2_sheets_with_string_pool_SOURCES = \
+ spreadsheet_doc_2_sheets_with_string_pool.cpp
+
+spreadsheet_doc_2_sheets_with_string_pool_LDADD = \
+ ../src/parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../src/liborcus/liborcus-@ORCUS_API_VERSION@.la
+
+spreadsheet_doc_2_sheets_with_formula_SOURCES = \
+ spreadsheet_doc_2_sheets_with_formula.cpp
+
+spreadsheet_doc_2_sheets_with_formula_LDADD = \
+ ../src/parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../src/liborcus/liborcus-@ORCUS_API_VERSION@.la
+
+AM_TESTS_ENVIRONMENT = \
+ INPUTDIR=$(srcdir)/files; export INPUTDIR;
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cpp .lo .log .o .obj .test .test$(EXEEXT) .trs
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc_example/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign doc_example/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+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
+
+json-doc-1$(EXEEXT): $(json_doc_1_OBJECTS) $(json_doc_1_DEPENDENCIES) $(EXTRA_json_doc_1_DEPENDENCIES)
+ @rm -f json-doc-1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(json_doc_1_OBJECTS) $(json_doc_1_LDADD) $(LIBS)
+
+json-doc-2$(EXEEXT): $(json_doc_2_OBJECTS) $(json_doc_2_DEPENDENCIES) $(EXTRA_json_doc_2_DEPENDENCIES)
+ @rm -f json-doc-2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(json_doc_2_OBJECTS) $(json_doc_2_LDADD) $(LIBS)
+
+json-parser-1$(EXEEXT): $(json_parser_1_OBJECTS) $(json_parser_1_DEPENDENCIES) $(EXTRA_json_parser_1_DEPENDENCIES)
+ @rm -f json-parser-1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(json_parser_1_OBJECTS) $(json_parser_1_LDADD) $(LIBS)
+
+spreadsheet-doc-1$(EXEEXT): $(spreadsheet_doc_1_OBJECTS) $(spreadsheet_doc_1_DEPENDENCIES) $(EXTRA_spreadsheet_doc_1_DEPENDENCIES)
+ @rm -f spreadsheet-doc-1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(spreadsheet_doc_1_OBJECTS) $(spreadsheet_doc_1_LDADD) $(LIBS)
+
+spreadsheet-doc-1-num-and-formula$(EXEEXT): $(spreadsheet_doc_1_num_and_formula_OBJECTS) $(spreadsheet_doc_1_num_and_formula_DEPENDENCIES) $(EXTRA_spreadsheet_doc_1_num_and_formula_DEPENDENCIES)
+ @rm -f spreadsheet-doc-1-num-and-formula$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(spreadsheet_doc_1_num_and_formula_OBJECTS) $(spreadsheet_doc_1_num_and_formula_LDADD) $(LIBS)
+
+spreadsheet-doc-2$(EXEEXT): $(spreadsheet_doc_2_OBJECTS) $(spreadsheet_doc_2_DEPENDENCIES) $(EXTRA_spreadsheet_doc_2_DEPENDENCIES)
+ @rm -f spreadsheet-doc-2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(spreadsheet_doc_2_OBJECTS) $(spreadsheet_doc_2_LDADD) $(LIBS)
+
+spreadsheet-doc-2-sheets-no-string-pool$(EXEEXT): $(spreadsheet_doc_2_sheets_no_string_pool_OBJECTS) $(spreadsheet_doc_2_sheets_no_string_pool_DEPENDENCIES) $(EXTRA_spreadsheet_doc_2_sheets_no_string_pool_DEPENDENCIES)
+ @rm -f spreadsheet-doc-2-sheets-no-string-pool$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(spreadsheet_doc_2_sheets_no_string_pool_OBJECTS) $(spreadsheet_doc_2_sheets_no_string_pool_LDADD) $(LIBS)
+
+spreadsheet-doc-2-sheets-with-formula$(EXEEXT): $(spreadsheet_doc_2_sheets_with_formula_OBJECTS) $(spreadsheet_doc_2_sheets_with_formula_DEPENDENCIES) $(EXTRA_spreadsheet_doc_2_sheets_with_formula_DEPENDENCIES)
+ @rm -f spreadsheet-doc-2-sheets-with-formula$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(spreadsheet_doc_2_sheets_with_formula_OBJECTS) $(spreadsheet_doc_2_sheets_with_formula_LDADD) $(LIBS)
+
+spreadsheet-doc-2-sheets-with-string-pool$(EXEEXT): $(spreadsheet_doc_2_sheets_with_string_pool_OBJECTS) $(spreadsheet_doc_2_sheets_with_string_pool_DEPENDENCIES) $(EXTRA_spreadsheet_doc_2_sheets_with_string_pool_DEPENDENCIES)
+ @rm -f spreadsheet-doc-2-sheets-with-string-pool$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(spreadsheet_doc_2_sheets_with_string_pool_OBJECTS) $(spreadsheet_doc_2_sheets_with_string_pool_LDADD) $(LIBS)
+
+xml-mapping-1$(EXEEXT): $(xml_mapping_1_OBJECTS) $(xml_mapping_1_DEPENDENCIES) $(EXTRA_xml_mapping_1_DEPENDENCIES)
+ @rm -f xml-mapping-1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(xml_mapping_1_OBJECTS) $(xml_mapping_1_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json_doc_1.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json_doc_2.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json_parser_1.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spreadsheet_doc_1.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spreadsheet_doc_1_num_and_formula.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spreadsheet_doc_2.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spreadsheet_doc_2_sheets_no_string_pool.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spreadsheet_doc_2_sheets_with_formula.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spreadsheet_doc_2_sheets_with_string_pool.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xml_mapping_1.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.cpp.o:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cpp.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cpp.lo:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+check-valgrind-local:
+check-valgrind-memcheck-local:
+check-valgrind-helgrind-local:
+check-valgrind-drd-local:
+check-valgrind-sgcheck-local:
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ 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-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ 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"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+ fi; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ elif test -n "$$redo_logs"; then \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
+ else \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+ fi; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
+ else \
+ color_start= color_end=; \
+ fi; \
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS:
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+json-doc-1.log: json-doc-1$(EXEEXT)
+ @p='json-doc-1$(EXEEXT)'; \
+ b='json-doc-1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+json-doc-2.log: json-doc-2$(EXEEXT)
+ @p='json-doc-2$(EXEEXT)'; \
+ b='json-doc-2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+json-parser-1.log: json-parser-1$(EXEEXT)
+ @p='json-parser-1$(EXEEXT)'; \
+ b='json-parser-1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+xml-mapping-1.log: xml-mapping-1$(EXEEXT)
+ @p='xml-mapping-1$(EXEEXT)'; \
+ b='xml-mapping-1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+spreadsheet-doc-1.log: spreadsheet-doc-1$(EXEEXT)
+ @p='spreadsheet-doc-1$(EXEEXT)'; \
+ b='spreadsheet-doc-1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+spreadsheet-doc-1-num-and-formula.log: spreadsheet-doc-1-num-and-formula$(EXEEXT)
+ @p='spreadsheet-doc-1-num-and-formula$(EXEEXT)'; \
+ b='spreadsheet-doc-1-num-and-formula'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+spreadsheet-doc-2.log: spreadsheet-doc-2$(EXEEXT)
+ @p='spreadsheet-doc-2$(EXEEXT)'; \
+ b='spreadsheet-doc-2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+spreadsheet-doc-2-sheets-no-string-pool.log: spreadsheet-doc-2-sheets-no-string-pool$(EXEEXT)
+ @p='spreadsheet-doc-2-sheets-no-string-pool$(EXEEXT)'; \
+ b='spreadsheet-doc-2-sheets-no-string-pool'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+spreadsheet-doc-2-sheets-with-string-pool.log: spreadsheet-doc-2-sheets-with-string-pool$(EXEEXT)
+ @p='spreadsheet-doc-2-sheets-with-string-pool$(EXEEXT)'; \
+ b='spreadsheet-doc-2-sheets-with-string-pool'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+spreadsheet-doc-2-sheets-with-formula.log: spreadsheet-doc-2-sheets-with-formula$(EXEEXT)
+ @p='spreadsheet-doc-2-sheets-with-formula$(EXEEXT)'; \
+ b='spreadsheet-doc-2-sheets-with-formula'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.test$(EXEEXT).log:
+@am__EXEEXT_TRUE@ @p='$<'; \
+@am__EXEEXT_TRUE@ $(am__set_b); \
+@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @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
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(PROGRAMS)
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)"; 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:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -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)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+check-valgrind: check-valgrind-am
+
+check-valgrind-am: check-valgrind-local
+
+check-valgrind-drd: check-valgrind-drd-am
+
+check-valgrind-drd-am: check-valgrind-drd-local
+
+check-valgrind-helgrind: check-valgrind-helgrind-am
+
+check-valgrind-helgrind-am: check-valgrind-helgrind-local
+
+check-valgrind-memcheck: check-valgrind-memcheck-am
+
+check-valgrind-memcheck-am: check-valgrind-memcheck-local
+
+check-valgrind-sgcheck: check-valgrind-sgcheck-am
+
+check-valgrind-sgcheck-am: check-valgrind-sgcheck-local
+
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -f ./$(DEPDIR)/json_doc_1.Po
+ -rm -f ./$(DEPDIR)/json_doc_2.Po
+ -rm -f ./$(DEPDIR)/json_parser_1.Po
+ -rm -f ./$(DEPDIR)/spreadsheet_doc_1.Po
+ -rm -f ./$(DEPDIR)/spreadsheet_doc_1_num_and_formula.Po
+ -rm -f ./$(DEPDIR)/spreadsheet_doc_2.Po
+ -rm -f ./$(DEPDIR)/spreadsheet_doc_2_sheets_no_string_pool.Po
+ -rm -f ./$(DEPDIR)/spreadsheet_doc_2_sheets_with_formula.Po
+ -rm -f ./$(DEPDIR)/spreadsheet_doc_2_sheets_with_string_pool.Po
+ -rm -f ./$(DEPDIR)/xml_mapping_1.Po
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-local distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+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 ./$(DEPDIR)/json_doc_1.Po
+ -rm -f ./$(DEPDIR)/json_doc_2.Po
+ -rm -f ./$(DEPDIR)/json_parser_1.Po
+ -rm -f ./$(DEPDIR)/spreadsheet_doc_1.Po
+ -rm -f ./$(DEPDIR)/spreadsheet_doc_1_num_and_formula.Po
+ -rm -f ./$(DEPDIR)/spreadsheet_doc_2.Po
+ -rm -f ./$(DEPDIR)/spreadsheet_doc_2_sheets_no_string_pool.Po
+ -rm -f ./$(DEPDIR)/spreadsheet_doc_2_sheets_with_formula.Po
+ -rm -f ./$(DEPDIR)/spreadsheet_doc_2_sheets_with_string_pool.Po
+ -rm -f ./$(DEPDIR)/xml_mapping_1.Po
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-TESTS \
+ check-am check-valgrind-am check-valgrind-drd-am \
+ check-valgrind-drd-local check-valgrind-helgrind-am \
+ check-valgrind-helgrind-local check-valgrind-local \
+ check-valgrind-memcheck-am check-valgrind-memcheck-local \
+ check-valgrind-sgcheck-am check-valgrind-sgcheck-local clean \
+ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-local distclean-tags distdir 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-man \
+ install-pdf install-pdf-am 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 tags tags-am uninstall \
+ uninstall-am uninstall-binPROGRAMS
+
+.PRECIOUS: Makefile
+
+
+distclean-local:
+ rm -rf $(TESTS)
+
+# 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/doc_example/files/document.ods b/doc_example/files/document.ods
new file mode 100644
index 0000000..d310af2
--- /dev/null
+++ b/doc_example/files/document.ods
Binary files differ
diff --git a/doc_example/files/multi-sheets.ods b/doc_example/files/multi-sheets.ods
new file mode 100644
index 0000000..87685e7
--- /dev/null
+++ b/doc_example/files/multi-sheets.ods
Binary files differ
diff --git a/doc_example/json_doc_1.cpp b/doc_example/json_doc_1.cpp
new file mode 100644
index 0000000..cb5449f
--- /dev/null
+++ b/doc_example/json_doc_1.cpp
@@ -0,0 +1,55 @@
+
+#include <orcus/json_document_tree.hpp>
+#include <orcus/config.hpp>
+
+#include <cstdlib>
+#include <iostream>
+
+using namespace std;
+
+const char* json_string = "{"
+" \"name\": \"John Doe\","
+" \"occupation\": \"Software Engineer\","
+" \"score\": [89, 67, 90]"
+"}";
+
+int main()
+{
+ using node = orcus::json::node;
+
+ orcus::json_config config; // Use default configuration.
+
+ orcus::json::document_tree doc;
+ doc.load(json_string, config);
+
+ // Root is an object containing three key-value pairs.
+ node root = doc.get_document_root();
+
+ for (std::string_view key : root.keys())
+ {
+ node value = root.child(key);
+ switch (value.type())
+ {
+ case orcus::json::node_t::string:
+ // string value
+ cout << key << ": " << value.string_value() << endl;
+ break;
+ case orcus::json::node_t::array:
+ {
+ // array value
+ cout << key << ":" << endl;
+
+ for (size_t i = 0; i < value.child_count(); ++i)
+ {
+ node array_element = value.child(i);
+ cout << " - " << array_element.numeric_value() << endl;
+ }
+ break;
+ }
+ default:
+ ;
+ }
+ }
+
+ return EXIT_SUCCESS;
+}
diff --git a/doc_example/json_doc_2.cpp b/doc_example/json_doc_2.cpp
new file mode 100644
index 0000000..97ed3b5
--- /dev/null
+++ b/doc_example/json_doc_2.cpp
@@ -0,0 +1,219 @@
+
+#include <orcus/json_document_tree.hpp>
+#include <orcus/config.hpp>
+
+#include <iostream>
+#include <functional>
+#include <vector>
+
+void example_root_list()
+{
+ //!code-start: root list
+ orcus::json::document_tree doc = {
+ 1.0, 2.0, "string value", false, nullptr
+ };
+
+ std::cout << doc.dump() << std::endl;
+ //!code-end: root list
+}
+
+void example_list_nested()
+{
+ //!code-start: list nested
+ orcus::json::document_tree doc = {
+ { true, false, nullptr },
+ { 1.1, 2.2, "text" }
+ };
+
+ std::cout << doc.dump() << std::endl;
+ //!code-end: list nested
+}
+
+void example_list_object()
+{
+ //!code-start: list object
+ orcus::json::document_tree doc = {
+ { "key1", 1.2 },
+ { "key2", "some text" },
+ };
+
+ std::cout << doc.dump() << std::endl;
+ //!code-end: list object
+}
+
+void example_list_object_2()
+{
+ //!code-start: list object 2
+ orcus::json::document_tree doc = {
+ { "parent1", {
+ { "child1", true },
+ { "child2", false },
+ { "child3", 123.4 },
+ }
+ },
+ { "parent2", "not-nested" },
+ };
+
+ std::cout << doc.dump() << std::endl;
+ //!code-end: list object 2
+}
+
+void example_array_ambiguous()
+{
+ //!code-start: array ambiguous
+ orcus::json::document_tree doc = {
+ { "array", { "one", 987.0 } }
+ };
+ //!code-end: array ambiguous
+}
+
+void example_array_explicit()
+{
+ //!code-start: array explicit
+ using namespace orcus;
+
+ json::document_tree doc = {
+ { "array", json::array({ "one", 987.0 }) }
+ };
+
+ std::cout << doc.dump() << std::endl;
+ //!code-end: array explicit
+}
+
+void example_object_ambiguous()
+{
+ //!code-start: object ambiguous a
+ using namespace orcus;
+
+ json::document_tree doc = {};
+ //!code-end: object ambiguous a
+
+ //!code-start: object ambiguous b
+ try
+ {
+ auto root = doc.get_document_root();
+ }
+ catch (const json::document_error& e)
+ {
+ std::cout << e.what() << std::endl;
+ }
+ //!code-end: object ambiguous b
+}
+
+void example_object_explicit_1()
+{
+ //!code-start: object explicit 1
+ using namespace orcus;
+
+ json::document_tree doc = json::object();
+
+ std::cout << doc.dump() << std::endl;
+ //!code-end: object explicit 1
+}
+
+void example_object_explicit_2()
+{
+ //!code-start: object explicit 2
+ using namespace orcus;
+
+ json::document_tree doc = {
+ json::object(),
+ json::object(),
+ json::object()
+ };
+
+ std::cout << doc.dump() << std::endl;
+ //!code-end: object explicit 2
+}
+
+void example_root_object_add_child()
+{
+ //!code-start: root object add child
+ using namespace orcus;
+
+ // Initialize the tree with an empty object.
+ json::document_tree doc = json::object();
+
+ // Get the root object, and assign three key-value pairs.
+ json::node root = doc.get_document_root();
+ root["child1"] = 1.0;
+ root["child2"] = "string";
+ root["child3"] = { true, false }; // implicit array
+
+ // You can also create a key-value pair whose value is another object.
+ root["child object"] = {
+ { "key1", 100.0 },
+ { "key2", 200.0 }
+ };
+
+ root["child array"] = json::array({ 1.1, 1.2, true }); // explicit array
+
+ std::cout << doc.dump() << std::endl;
+ //!code-end: root object add child
+}
+
+void example_root_array_add_child()
+{
+ //!code-start: root array add child
+ using namespace orcus;
+
+ // Initialize the tree with an empty array root.
+ json::document_tree doc = json::array();
+
+ // Get the root array.
+ json::node root = doc.get_document_root();
+
+ // Append values to the array.
+ root.push_back(-1.2);
+ root.push_back("string");
+ root.push_back(true);
+ root.push_back(nullptr);
+
+ // You can append an object to the array via push_back() as well.
+ root.push_back({{"key1", 1.1}, {"key2", 1.2}});
+
+ std::cout << doc.dump() << std::endl;
+ //!code-end: root array add child
+}
+
+int main()
+{
+ using func_type = std::function<void()>;
+
+ std::vector<func_type> funcs = {
+ example_root_list,
+ example_list_nested,
+ example_list_object,
+ example_list_object_2,
+ example_array_explicit,
+ example_object_ambiguous,
+ example_object_explicit_1,
+ example_object_explicit_2,
+ example_root_object_add_child,
+ example_root_array_add_child,
+ };
+
+ for (func_type f : funcs)
+ {
+ std::cout << "--" << std::endl;
+ f();
+ }
+
+ std::vector<func_type> funcs_exc = {
+ example_array_ambiguous,
+ };
+
+ for (func_type f : funcs_exc)
+ {
+ try
+ {
+ f();
+ }
+ catch (orcus::json::key_value_error&)
+ {
+ // expected
+ }
+ }
+
+ return EXIT_SUCCESS;
+}
diff --git a/doc_example/json_parser_1.cpp b/doc_example/json_parser_1.cpp
new file mode 100644
index 0000000..322316a
--- /dev/null
+++ b/doc_example/json_parser_1.cpp
@@ -0,0 +1,41 @@
+
+#include <orcus/json_parser.hpp>
+#include <cstring>
+#include <iostream>
+
+using namespace std;
+
+class json_parser_handler : public orcus::json_handler
+{
+public:
+ void object_key(std::string_view key, bool /*transient*/)
+ {
+ cout << "object key: " << key << endl;
+ }
+
+ void string(std::string_view val, bool /*transient*/)
+ {
+ cout << "string: " << val << endl;
+ }
+
+ void number(double val)
+ {
+ cout << "number: " << val << endl;
+ }
+};
+
+int main()
+{
+ const char* test_code = "{\"key1\": [1,2,3,4,5], \"key2\": 12.3}";
+
+ cout << "JSON string: " << test_code << endl;
+
+ // Instantiate the parser with an own handler.
+ json_parser_handler hdl;
+ orcus::json_parser<json_parser_handler> parser(test_code, hdl);
+
+ // Parse the string.
+ parser.parse();
+
+ return EXIT_SUCCESS;
+}
diff --git a/doc_example/spreadsheet_doc_1.cpp b/doc_example/spreadsheet_doc_1.cpp
new file mode 100644
index 0000000..00bbba4
--- /dev/null
+++ b/doc_example/spreadsheet_doc_1.cpp
@@ -0,0 +1,64 @@
+
+#include <orcus/spreadsheet/document.hpp>
+#include <orcus/spreadsheet/factory.hpp>
+#include <orcus/orcus_ods.hpp>
+
+#include <ixion/address.hpp>
+#include <ixion/model_context.hpp>
+
+#include <iostream>
+#include <cstdlib>
+#include <filesystem>
+
+using namespace orcus;
+
+int main()
+{
+ std::filesystem::path input_dir = std::getenv("INPUTDIR");
+
+ //!code-start: instantiate
+ spreadsheet::range_size_t ss{1048576, 16384};
+ spreadsheet::document doc{ss};
+ spreadsheet::import_factory factory{doc};
+ //!code-end: instantiate
+
+ //!code-start: loader
+ orcus_ods loader(&factory);
+ //!code-end: loader
+
+ //!code-start: read-file
+ auto filepath = input_dir / "document.ods";
+ loader.read_file(filepath.native());
+ //!code-end: read-file
+
+ //!code-start: model-context
+ const ixion::model_context& model = doc.get_model_context();
+ //!code-end: model-context
+
+ //!code-start: string-id
+ ixion::abs_address_t pos(0, 0, 0); // Set the cell position to A1.
+ ixion::string_id_t str_id = model.get_string_identifier(pos);
+ //!code-end: string-id
+
+ //!code-start: print-string
+ const std::string* s = model.get_string(str_id);
+ assert(s);
+ std::cout << "A1: " << *s << std::endl;
+ //!code-end: print-string
+
+ //!code-start: rest
+ pos.column = 1; // Move to B1
+ str_id = model.get_string_identifier(pos);
+ s = model.get_string(str_id);
+ assert(s);
+ std::cout << "B1: " << *s << std::endl;
+
+ pos.column = 2; // Move to C1
+ str_id = model.get_string_identifier(pos);
+ s = model.get_string(str_id);
+ assert(s);
+ std::cout << "C1: " << *s << std::endl;
+ //!code-end: rest
+
+ return EXIT_SUCCESS;
+}
diff --git a/doc_example/spreadsheet_doc_1_num_and_formula.cpp b/doc_example/spreadsheet_doc_1_num_and_formula.cpp
new file mode 100644
index 0000000..88c405c
--- /dev/null
+++ b/doc_example/spreadsheet_doc_1_num_and_formula.cpp
@@ -0,0 +1,62 @@
+
+#include <orcus/spreadsheet/document.hpp>
+#include <orcus/spreadsheet/factory.hpp>
+#include <orcus/orcus_ods.hpp>
+
+#include <ixion/address.hpp>
+#include <ixion/model_context.hpp>
+#include <ixion/formula_result.hpp>
+#include <ixion/cell.hpp>
+
+#include <iostream>
+#include <filesystem>
+
+using namespace orcus;
+
+int main()
+{
+ std::filesystem::path input_dir = std::getenv("INPUTDIR");
+
+ // Instantiate a document, and wrap it with a factory.
+ spreadsheet::range_size_t ss{1048576, 16384};
+ spreadsheet::document doc{ss};
+ spreadsheet::import_factory factory{doc};
+
+ // Pass the factory to the document loader, and read the content from a file
+ // to populate the document.
+ orcus_ods loader(&factory);
+ auto filepath = input_dir / "document.ods";
+ loader.read_file(filepath.native());
+ doc.recalc_formula_cells();
+
+ // Now that the document is fully populated, access its content.
+ const ixion::model_context& model = doc.get_model_context();
+
+ //!code-start: print-numeric-cells
+ for (spreadsheet::row_t row = 1; row <= 6; ++row)
+ {
+ ixion::abs_address_t pos(0, row, 0);
+ double value = model.get_numeric_value(pos);
+ std::cout << "A" << (pos.row+1) << ": " << value << std::endl;
+ }
+ //!code-end: print-numeric-cells
+
+ //!code-start: print-formula-cells
+ for (spreadsheet::row_t row = 1; row <=6; ++row)
+ {
+ ixion::abs_address_t pos(0, row, 2); // Column C
+ const ixion::formula_cell* fc = model.get_formula_cell(pos);
+ assert(fc);
+
+ // Get the formula cell results.
+ const ixion::formula_result& result = fc->get_result_cache(
+ ixion::formula_result_wait_policy_t::throw_exception);
+
+ // We already know the result is a string.
+ const std::string& s = result.get_string();
+ std::cout << "C" << (pos.row+1) << ": " << s << std::endl;
+ }
+ //!code-end: print-formula-cells
+
+ return EXIT_SUCCESS;
+}
diff --git a/doc_example/spreadsheet_doc_2.cpp b/doc_example/spreadsheet_doc_2.cpp
new file mode 100644
index 0000000..614b50b
--- /dev/null
+++ b/doc_example/spreadsheet_doc_2.cpp
@@ -0,0 +1,44 @@
+
+#include <orcus/spreadsheet/import_interface.hpp>
+#include <orcus/orcus_ods.hpp>
+
+#include <filesystem>
+#include <iostream>
+
+namespace ss = orcus::spreadsheet;
+
+class my_empty_import_factory : public ss::iface::import_factory
+{
+public:
+ virtual ss::iface::import_sheet* append_sheet(ss::sheet_t sheet_index, std::string_view name) override
+ {
+ std::cout << "append_sheet: sheet index: " << sheet_index << "; sheet name: " << name << std::endl;
+ return nullptr;
+ }
+
+ virtual ss::iface::import_sheet* get_sheet(std::string_view name) override
+ {
+ std::cout << "get_sheet: sheet name: " << name << std::endl;
+ return nullptr;
+ }
+
+ virtual ss::iface::import_sheet* get_sheet(ss::sheet_t sheet_index) override
+ {
+ std::cout << "get_sheet: sheet index: " << sheet_index << std::endl;
+ return nullptr;
+ }
+
+ virtual void finalize() override {}
+};
+
+int main()
+{
+ std::filesystem::path input_dir = std::getenv("INPUTDIR");
+ auto filepath = input_dir / "multi-sheets.ods";
+
+ my_empty_import_factory factory;
+ orcus::orcus_ods loader(&factory);
+ loader.read_file(filepath.native());
+
+ return EXIT_SUCCESS;
+}
diff --git a/doc_example/spreadsheet_doc_2_sheets_no_string_pool.cpp b/doc_example/spreadsheet_doc_2_sheets_no_string_pool.cpp
new file mode 100644
index 0000000..ea58d5e
--- /dev/null
+++ b/doc_example/spreadsheet_doc_2_sheets_no_string_pool.cpp
@@ -0,0 +1,123 @@
+
+#include <orcus/spreadsheet/import_interface.hpp>
+#include <orcus/orcus_ods.hpp>
+
+#include <iostream>
+#include <memory>
+#include <filesystem>
+
+//!code-start: cell_value
+namespace ss = orcus::spreadsheet;
+
+enum class cell_value_type { empty, numeric, string };
+
+struct cell_value
+{
+ cell_value_type type;
+
+ union
+ {
+ std::size_t index;
+ double f;
+ };
+
+ cell_value() : type(cell_value_type::empty) {}
+};
+//!code-end: cell_value
+
+//!code-start: my_sheet
+class my_sheet : public ss::iface::import_sheet
+{
+ cell_value m_cells[100][1000];
+ ss::range_size_t m_sheet_size;
+ ss::sheet_t m_sheet_index;
+
+public:
+ my_sheet(ss::sheet_t sheet_index) :
+ m_sheet_index(sheet_index)
+ {
+ m_sheet_size.rows = 1000;
+ m_sheet_size.columns = 100;
+ }
+
+ virtual void set_string(ss::row_t row, ss::col_t col, ss::string_id_t sindex) override
+ {
+ std::cout << "(sheet: " << m_sheet_index << "; row: " << row << "; col: " << col
+ << "): string index = " << sindex << std::endl;
+
+ m_cells[col][row].type = cell_value_type::string;
+ m_cells[col][row].index = sindex;
+ }
+
+ virtual void set_value(ss::row_t row, ss::col_t col, double value) override
+ {
+ std::cout << "(sheet: " << m_sheet_index << "; row: " << row << "; col: " << col
+ << "): value = " << value << std::endl;
+
+ m_cells[col][row].type = cell_value_type::numeric;
+ m_cells[col][row].f = value;
+ }
+
+ virtual ss::range_size_t get_sheet_size() const override
+ {
+ return m_sheet_size;
+ }
+
+ // We don't implement these methods for now.
+ virtual void set_auto(ss::row_t, ss::col_t, std::string_view) override {}
+
+ virtual void set_bool(ss::row_t, ss::col_t, bool) override {}
+
+ virtual void set_date_time(ss::row_t, ss::col_t, int, int, int, int, int, double) override {}
+
+ virtual void set_format(ss::row_t, ss::col_t, std::size_t) override {}
+
+ virtual void set_format(ss::row_t, ss::col_t, ss::row_t, ss::col_t, std::size_t) override {}
+
+ virtual void set_column_format(ss::col_t, ss::col_t, std::size_t) override {}
+
+ virtual void set_row_format(ss::col_t, std::size_t) override {}
+
+ virtual void fill_down_cells(ss::row_t, ss::col_t, ss::row_t) override {}
+};
+//!code-end: my_sheet
+
+//!code-start: my_import_factory
+class my_import_factory : public ss::iface::import_factory
+{
+ std::vector<std::unique_ptr<my_sheet>> m_sheets;
+
+public:
+ virtual ss::iface::import_sheet* append_sheet(ss::sheet_t, std::string_view) override
+ {
+ m_sheets.push_back(std::make_unique<my_sheet>(m_sheets.size()));
+ return m_sheets.back().get();
+ }
+
+ virtual ss::iface::import_sheet* get_sheet(std::string_view) override
+ {
+ // TODO : implement this.
+ return nullptr;
+ }
+
+ virtual ss::iface::import_sheet* get_sheet(ss::sheet_t sheet_index) override
+ {
+ ss::sheet_t sheet_count = m_sheets.size();
+ return sheet_index < sheet_count ? m_sheets[sheet_index].get() : nullptr;
+ }
+
+ virtual void finalize() override {}
+};
+//!code-end: my_import_factory
+
+int main()
+{
+ std::filesystem::path input_dir = std::getenv("INPUTDIR");
+ auto filepath = input_dir / "multi-sheets.ods";
+
+ my_import_factory factory;
+ orcus::orcus_ods loader(&factory);
+ loader.read_file(filepath.native());
+
+ return EXIT_SUCCESS;
+}
diff --git a/doc_example/spreadsheet_doc_2_sheets_with_formula.cpp b/doc_example/spreadsheet_doc_2_sheets_with_formula.cpp
new file mode 100644
index 0000000..29511e4
--- /dev/null
+++ b/doc_example/spreadsheet_doc_2_sheets_with_formula.cpp
@@ -0,0 +1,290 @@
+
+#include <orcus/spreadsheet/import_interface.hpp>
+#include <orcus/orcus_ods.hpp>
+
+#include <iostream>
+#include <memory>
+#include <unordered_map>
+#include <deque>
+#include <filesystem>
+
+namespace ss = orcus::spreadsheet;
+
+//!code-start: cell_value_type
+enum class cell_value_type { empty, numeric, string, formula }; // adding a formula type here
+//!code-end: cell_value_type
+
+using ss_type = std::deque<std::string>;
+using ss_hash_type = std::unordered_map<std::string_view, std::size_t>;
+
+struct cell_value
+{
+ cell_value_type type;
+
+ union
+ {
+ size_t index; // either a string index or a formula index
+ double f;
+ };
+
+ cell_value() : type(cell_value_type::empty) {}
+};
+
+//!code-start: cell_grid
+class cell_grid
+{
+ cell_value m_cells[100][1000];
+public:
+
+ cell_value& operator()(ss::row_t row, ss::col_t col)
+ {
+ return m_cells[col][row];
+ }
+};
+//!code-end: cell_grid
+
+//!code-start: formula
+struct formula
+{
+ std::string expression;
+ ss::formula_grammar_t grammar;
+
+ formula() : grammar(ss::formula_grammar_t::unknown) {}
+ formula(std::string _expression, ss::formula_grammar_t _grammar) :
+ expression(std::move(_expression)),
+ grammar(_grammar) {}
+};
+//!code-end: formula
+
+//!code-start: my_formula
+class my_formula : public ss::iface::import_formula
+{
+ ss::sheet_t m_sheet_index;
+ cell_grid& m_cells;
+ std::vector<formula>& m_formula_store;
+
+ ss::row_t m_row;
+ ss::col_t m_col;
+ formula m_formula;
+
+public:
+ my_formula(ss::sheet_t sheet, cell_grid& cells, std::vector<formula>& formulas) :
+ m_sheet_index(sheet),
+ m_cells(cells),
+ m_formula_store(formulas),
+ m_row(0),
+ m_col(0) {}
+
+ virtual void set_position(ss::row_t row, ss::col_t col) override
+ {
+ m_row = row;
+ m_col = col;
+ }
+
+ virtual void set_formula(ss::formula_grammar_t grammar, std::string_view formula) override
+ {
+ m_formula.expression = formula;
+ m_formula.grammar = grammar;
+ }
+
+ virtual void set_shared_formula_index(std::size_t) override {}
+
+ virtual void set_result_string(std::string_view) override {}
+
+ virtual void set_result_value(double) override {}
+
+ virtual void set_result_empty() override {}
+
+ virtual void set_result_bool(bool) override {}
+
+ virtual void commit() override
+ {
+ std::cout << "(sheet: " << m_sheet_index << "; row: " << m_row << "; col: " << m_col << "): formula = "
+ << m_formula.expression << " (" << m_formula.grammar << ")" << std::endl;
+
+ std::size_t index = m_formula_store.size();
+ m_cells(m_row, m_col).type = cell_value_type::formula;
+ m_cells(m_row, m_col).index = index;
+ m_formula_store.push_back(std::move(m_formula));
+ }
+};
+//!code-end: my_formula
+
+//!code-start: my_sheet
+class my_sheet : public ss::iface::import_sheet
+{
+ cell_grid m_cells;
+ std::vector<formula> m_formula_store;
+ my_formula m_formula_iface;
+ ss::range_size_t m_sheet_size;
+ ss::sheet_t m_sheet_index;
+ const ss_type& m_string_pool;
+
+public:
+ my_sheet(ss::sheet_t sheet_index, const ss_type& string_pool) :
+ m_formula_iface(sheet_index, m_cells, m_formula_store),
+ m_sheet_index(sheet_index),
+ m_string_pool(string_pool)
+ {
+ m_sheet_size.rows = 1000;
+ m_sheet_size.columns = 100;
+ }
+
+ virtual void set_string(ss::row_t row, ss::col_t col, ss::string_id_t sindex) override
+ {
+ std::cout << "(sheet: " << m_sheet_index << "; row: " << row << "; col: " << col
+ << "): string index = " << sindex << " (" << m_string_pool[sindex] << ")" << std::endl;
+
+ m_cells(row, col).type = cell_value_type::string;
+ m_cells(row, col).index = sindex;
+ }
+
+ virtual void set_value(ss::row_t row, ss::col_t col, double value) override
+ {
+ std::cout << "(sheet: " << m_sheet_index << "; row: " << row << "; col: " << col
+ << "): value = " << value << std::endl;
+
+ m_cells(row, col).type = cell_value_type::numeric;
+ m_cells(row, col).f = value;
+ }
+
+ virtual ss::range_size_t get_sheet_size() const override
+ {
+ return m_sheet_size;
+ }
+
+ // We don't implement these methods for now.
+ virtual void set_auto(ss::row_t, ss::col_t, std::string_view) override {}
+
+ virtual void set_bool(ss::row_t, ss::col_t, bool) override {}
+
+ virtual void set_date_time(ss::row_t, ss::col_t, int, int, int, int, int, double) override {}
+
+ virtual void set_format(ss::row_t, ss::col_t, std::size_t) override {}
+
+ virtual void set_format(ss::row_t, ss::col_t, ss::row_t, ss::col_t, std::size_t) override {}
+
+ virtual void set_column_format(ss::col_t, ss::col_t, std::size_t) override {}
+
+ virtual void set_row_format(ss::col_t, std::size_t) override {}
+
+ virtual void fill_down_cells(ss::row_t, ss::col_t, ss::row_t) override {}
+
+ virtual ss::iface::import_formula* get_formula() override
+ {
+ return &m_formula_iface;
+ }
+};
+//!code-end: my_sheet
+
+class my_shared_strings : public ss::iface::import_shared_strings
+{
+ ss_hash_type m_ss_hash;
+ ss_type& m_ss;
+ std::string m_current_string;
+
+public:
+ my_shared_strings(ss_type& ss) : m_ss(ss) {}
+
+ virtual size_t add(std::string_view s) override
+ {
+ auto it = m_ss_hash.find(s);
+ if (it != m_ss_hash.end())
+ // This string already exists in the pool.
+ return it->second;
+
+ // This is a brand-new string.
+ return append(s);
+ }
+
+ virtual size_t append(std::string_view s) override
+ {
+ std::size_t string_index = m_ss.size();
+ m_ss.emplace_back(s);
+ m_ss_hash.emplace(s, string_index);
+
+ return string_index;
+ }
+
+ // The following methods are for formatted text segments, which we ignore for now.
+ virtual void set_segment_bold(bool) override {}
+
+ virtual void set_segment_font(std::size_t) override {}
+
+ virtual void set_segment_font_color(
+ ss::color_elem_t,
+ ss::color_elem_t,
+ ss::color_elem_t,
+ ss::color_elem_t) override {}
+
+ virtual void set_segment_font_name(std::string_view) override {}
+
+ virtual void set_segment_font_size(double) override {}
+
+ virtual void set_segment_italic(bool) override {}
+
+ virtual void append_segment(std::string_view s) override
+ {
+ m_current_string += s;
+ }
+
+ virtual std::size_t commit_segments() override
+ {
+ std::size_t string_index = m_ss.size();
+ m_ss.push_back(std::move(m_current_string));
+
+ const std::string& s = m_ss.back();
+ std::string_view sv(s.data(), s.size());
+ m_ss_hash.emplace(sv, string_index);
+
+ return string_index;
+ }
+};
+
+class my_import_factory : public ss::iface::import_factory
+{
+ ss_type m_string_pool; // string pool to be shared everywhere.
+ my_shared_strings m_shared_strings;
+ std::vector<std::unique_ptr<my_sheet>> m_sheets;
+
+public:
+ my_import_factory() : m_shared_strings(m_string_pool) {}
+
+ virtual ss::iface::import_shared_strings* get_shared_strings() override
+ {
+ return &m_shared_strings;
+ }
+
+ virtual ss::iface::import_sheet* append_sheet(ss::sheet_t, std::string_view) override
+ {
+ // Pass the string pool to each sheet instance.
+ m_sheets.push_back(std::make_unique<my_sheet>(m_sheets.size(), m_string_pool));
+ return m_sheets.back().get();
+ }
+
+ virtual ss::iface::import_sheet* get_sheet(std::string_view) override
+ {
+ // TODO : implement this.
+ return nullptr;
+ }
+
+ virtual ss::iface::import_sheet* get_sheet(ss::sheet_t sheet_index) override
+ {
+ ss::sheet_t sheet_count = m_sheets.size();
+ return sheet_index < sheet_count ? m_sheets[sheet_index].get() : nullptr;
+ }
+
+ virtual void finalize() override {}
+};
+
+int main()
+{
+ std::filesystem::path input_dir = std::getenv("INPUTDIR");
+ auto filepath = input_dir / "multi-sheets.ods";
+
+ my_import_factory factory;
+ orcus::orcus_ods loader(&factory);
+ loader.read_file(filepath.native());
+
+ return EXIT_SUCCESS;
+}
diff --git a/doc_example/spreadsheet_doc_2_sheets_with_string_pool.cpp b/doc_example/spreadsheet_doc_2_sheets_with_string_pool.cpp
new file mode 100644
index 0000000..76fcf80
--- /dev/null
+++ b/doc_example/spreadsheet_doc_2_sheets_with_string_pool.cpp
@@ -0,0 +1,204 @@
+
+#include <orcus/spreadsheet/import_interface.hpp>
+#include <orcus/orcus_ods.hpp>
+
+#include <iostream>
+#include <memory>
+#include <unordered_map>
+#include <deque>
+#include <filesystem>
+
+namespace ss = orcus::spreadsheet;
+
+enum class cell_value_type { empty, numeric, string };
+
+//!code-start: types
+using ss_type = std::deque<std::string>;
+using ss_hash_type = std::unordered_map<std::string_view, std::size_t>;
+//!code-end: types
+
+struct cell_value
+{
+ cell_value_type type;
+
+ union
+ {
+ std::size_t index;
+ double f;
+ };
+
+ cell_value() : type(cell_value_type::empty) {}
+};
+
+class my_sheet : public ss::iface::import_sheet
+{
+ cell_value m_cells[100][1000];
+ ss::range_size_t m_sheet_size;
+ ss::sheet_t m_sheet_index;
+ const ss_type& m_string_pool;
+
+public:
+ my_sheet(ss::sheet_t sheet_index, const ss_type& string_pool) :
+ m_sheet_index(sheet_index),
+ m_string_pool(string_pool)
+ {
+ m_sheet_size.rows = 1000;
+ m_sheet_size.columns = 100;
+ }
+
+ virtual void set_string(ss::row_t row, ss::col_t col, ss::string_id_t sindex) override
+ {
+ std::cout << "(sheet: " << m_sheet_index << "; row: " << row << "; col: " << col
+ << "): string index = " << sindex << " (" << m_string_pool[sindex] << ")" << std::endl;
+
+ m_cells[col][row].type = cell_value_type::string;
+ m_cells[col][row].index = sindex;
+ }
+
+ virtual void set_value(ss::row_t row, ss::col_t col, double value) override
+ {
+ std::cout << "(sheet: " << m_sheet_index << "; row: " << row << "; col: " << col
+ << "): value = " << value << std::endl;
+
+ m_cells[col][row].type = cell_value_type::numeric;
+ m_cells[col][row].f = value;
+ }
+
+ virtual ss::range_size_t get_sheet_size() const override
+ {
+ return m_sheet_size;
+ }
+
+ // We don't implement these methods for now.
+ virtual void set_auto(ss::row_t, ss::col_t, std::string_view) override {}
+
+ virtual void set_bool(ss::row_t, ss::col_t, bool) override {}
+
+ virtual void set_date_time(ss::row_t, ss::col_t, int, int, int, int, int, double) override {}
+
+ virtual void set_format(ss::row_t, ss::col_t, std::size_t) override {}
+
+ virtual void set_format(ss::row_t, ss::col_t, ss::row_t, ss::col_t, std::size_t) override {}
+
+ virtual void set_column_format(ss::col_t, ss::col_t, std::size_t) override {}
+
+ virtual void set_row_format(ss::col_t, std::size_t) override {}
+
+ virtual void fill_down_cells(ss::row_t, ss::col_t, ss::row_t) override {}
+};
+
+//!code-start: my_shared_strings
+class my_shared_strings : public ss::iface::import_shared_strings
+{
+ ss_hash_type m_ss_hash;
+ ss_type& m_ss;
+ std::string m_current_string;
+
+public:
+ my_shared_strings(ss_type& ss) : m_ss(ss) {}
+
+ virtual std::size_t add(std::string_view s) override
+ {
+ auto it = m_ss_hash.find(s);
+ if (it != m_ss_hash.end())
+ // This string already exists in the pool.
+ return it->second;
+
+ // This is a brand-new string.
+ return append(s);
+ }
+
+ virtual std::size_t append(std::string_view s) override
+ {
+ std::size_t string_index = m_ss.size();
+ m_ss.emplace_back(s);
+ m_ss_hash.emplace(s, string_index);
+
+ return string_index;
+ }
+
+ // The following methods are for formatted text segments, which we ignore for now.
+ virtual void set_segment_bold(bool) override {}
+
+ virtual void set_segment_font(std::size_t) override {}
+
+ virtual void set_segment_font_color(
+ ss::color_elem_t,
+ ss::color_elem_t,
+ ss::color_elem_t,
+ ss::color_elem_t) override {}
+
+ virtual void set_segment_font_name(std::string_view) override {}
+
+ virtual void set_segment_font_size(double) override {}
+
+ virtual void set_segment_italic(bool) override {}
+
+ virtual void append_segment(std::string_view s) override
+ {
+ m_current_string += s;
+ }
+
+ virtual std::size_t commit_segments() override
+ {
+ std::size_t string_index = m_ss.size();
+ m_ss.push_back(std::move(m_current_string));
+
+ const std::string& s = m_ss.back();
+ std::string_view sv(s.data(), s.size());
+ m_ss_hash.emplace(sv, string_index);
+
+ return string_index;
+ }
+};
+//!code-end: my_shared_strings
+
+//!code-start: my_import_factory
+class my_import_factory : public ss::iface::import_factory
+{
+ ss_type m_string_pool; // string pool to be shared everywhere.
+ my_shared_strings m_shared_strings;
+ std::vector<std::unique_ptr<my_sheet>> m_sheets;
+
+public:
+ my_import_factory() : m_shared_strings(m_string_pool) {}
+
+ virtual ss::iface::import_shared_strings* get_shared_strings() override
+ {
+ return &m_shared_strings;
+ }
+
+ virtual ss::iface::import_sheet* append_sheet(ss::sheet_t, std::string_view) override
+ {
+ // Pass the string pool to each sheet instance.
+ m_sheets.push_back(std::make_unique<my_sheet>(m_sheets.size(), m_string_pool));
+ return m_sheets.back().get();
+ }
+
+ virtual ss::iface::import_sheet* get_sheet(std::string_view) override
+ {
+ // TODO : implement this.
+ return nullptr;
+ }
+
+ virtual ss::iface::import_sheet* get_sheet(ss::sheet_t sheet_index) override
+ {
+ ss::sheet_t sheet_count = m_sheets.size();
+ return sheet_index < sheet_count ? m_sheets[sheet_index].get() : nullptr;
+ }
+
+ virtual void finalize() override {}
+};
+//!code-end: my_import_factory
+
+int main()
+{
+ std::filesystem::path input_dir = std::getenv("INPUTDIR");
+ auto filepath = input_dir / "multi-sheets.ods";
+
+ my_import_factory factory;
+ orcus::orcus_ods loader(&factory);
+ loader.read_file(filepath.native());
+
+ return EXIT_SUCCESS;
+}
diff --git a/doc_example/xml_mapping_1.cpp b/doc_example/xml_mapping_1.cpp
new file mode 100644
index 0000000..33d6ff2
--- /dev/null
+++ b/doc_example/xml_mapping_1.cpp
@@ -0,0 +1,129 @@
+
+#include <orcus/xml_namespace.hpp>
+
+#include <iostream>
+
+using namespace orcus;
+using namespace std;
+
+void run_xmlns_example()
+{
+ // A namespace repository is a shared storage for namespace strings for
+ // multiple contexts. The client code needs to simply create an instance
+ // from which to create contexts.
+ xmlns_repository ns_repo;
+
+ xmlns_context ns_cxt = ns_repo.create_context();
+
+ // Push namespaces with their aliases as you counter them. The push()
+ // method then returns an identifier associated with the alias.
+
+ // empty alias is for default namespace. You can either use nullptr or an
+ // empty string.
+ xmlns_id_t ns_default = ns_cxt.push(
+ std::string_view{}, "http://schemas.openxmlformats.org/spreadsheetml/2006/main");
+
+ xmlns_id_t ns_a = ns_cxt.push(
+ "a", "http://schemas.openxmlformats.org/drawingml/2006/main");
+
+ xmlns_id_t ns_r = ns_cxt.push(
+ "r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships");
+
+ // You can retrieve the data associated with alias ID's.
+ for (const xmlns_id_t nsid : {ns_default, ns_a, ns_r})
+ {
+ std::string_view alias = ns_cxt.get_alias(nsid);
+ cout << "Namespace alias '" << alias << "' has an index of " << ns_cxt.get_index(nsid)
+ << " and a short name of '" << ns_cxt.get_short_name(nsid) << "'." << endl;
+ cout << "The value of the alias '" << alias << "' is '" << ns_cxt.get(alias) << "'." << endl;
+ }
+
+ // Iterate over all namespaces in the current context.
+ for (const xmlns_id_t nsid : ns_cxt.get_all_namespaces())
+ cout << "'" << ns_cxt.get_alias(nsid) << "' = " << ns_cxt.get_short_name(nsid) << endl;
+}
+
+void run_xmlns_stacked()
+{
+ xmlns_repository ns_repo;
+ xmlns_context ns_cxt = ns_repo.create_context();
+
+ // Push a first default namespace.
+ xmlns_id_t ns_default_1 = ns_cxt.push(std::string_view{}, "http://original");
+
+ // Push a nested deffault namespace. This overwrites the original.
+ xmlns_id_t current_default_ns = ns_cxt.push(std::string_view{}, "http://nested");
+ cout << "same as original: " << (current_default_ns == ns_default_1) << endl;
+
+ // Pop the current default namespace. After this the original namespace
+ // becomes the default namespace again.
+ ns_cxt.pop(std::string_view{});
+
+ // Get the current default namespace identifier.
+ current_default_ns = ns_cxt.get(std::string_view{});
+ cout << "same as original: " << (current_default_ns == ns_default_1) << endl;
+}
+
+void run_xmlns_same_ns_different_aliases()
+{
+ xmlns_repository ns_repo;
+
+ // Same namespace URI may be associated with different aliases in different
+ // contexts.
+
+ xmlns_id_t alias_1, alias_2;
+ {
+ xmlns_context ns_cxt = ns_repo.create_context();
+ alias_1 = ns_cxt.push("foo", "http://some-namespace");
+
+ for (const xmlns_id_t nsid : ns_cxt.get_all_namespaces())
+ cout << "'" << ns_cxt.get_alias(nsid) << "' = " << ns_cxt.get_short_name(nsid) << endl;
+ }
+
+ {
+ xmlns_context ns_cxt = ns_repo.create_context();
+ alias_2 = ns_cxt.push("bar", "http://some-namespace");
+
+ for (const xmlns_id_t nsid : ns_cxt.get_all_namespaces())
+ cout << "'" << ns_cxt.get_alias(nsid) << "' = " << ns_cxt.get_short_name(nsid) << endl;
+ }
+
+ cout << (alias_1 == alias_2 ? "same" : "different") << endl;
+}
+
+void run_xmlns_different_ns_same_alias()
+{
+ xmlns_repository ns_repo;
+
+ // Same alias may be associated with different namespace URI's in different
+ // contexts.
+
+ xmlns_id_t alias_1, alias_2;
+ {
+ xmlns_context ns_cxt = ns_repo.create_context();
+ alias_1 = ns_cxt.push("foo", "http://namespace-1");
+
+ for (const xmlns_id_t nsid : ns_cxt.get_all_namespaces())
+ cout << "'" << ns_cxt.get_alias(nsid) << "' = " << ns_cxt.get_short_name(nsid) << endl;
+ }
+
+ {
+ xmlns_context ns_cxt = ns_repo.create_context();
+ alias_2 = ns_cxt.push("foo", "http://namespace-2");
+
+ for (const xmlns_id_t nsid : ns_cxt.get_all_namespaces())
+ cout << "'" << ns_cxt.get_alias(nsid) << "' = " << ns_cxt.get_short_name(nsid) << endl;
+ }
+
+ cout << (alias_1 == alias_2 ? "same" : "different") << endl;
+}
+
+int main()
+{
+ run_xmlns_example();
+ run_xmlns_stacked();
+ run_xmlns_same_ns_different_aliases();
+ run_xmlns_different_ns_same_alias();
+
+ return EXIT_SUCCESS;
+}
diff --git a/include/Makefile.am b/include/Makefile.am
new file mode 100644
index 0000000..305a9c4
--- /dev/null
+++ b/include/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS = orcus
diff --git a/include/Makefile.in b/include/Makefile.in
new file mode 100644
index 0000000..9921170
--- /dev/null
+++ b/include/Makefile.in
@@ -0,0 +1,718 @@
+# Makefile.in generated by automake 1.16.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2021 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.
+
+@SET_MAKE@
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+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@
+subdir = include
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
+ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_17.m4 \
+ $(top_srcdir)/m4/boost.m4 $(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)/m4/m4_ax_valgrind_check.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+ ctags-recursive dvi-recursive html-recursive info-recursive \
+ install-data-recursive install-dvi-recursive \
+ install-exec-recursive install-html-recursive \
+ install-info-recursive install-pdf-recursive \
+ install-ps-recursive install-recursive installcheck-recursive \
+ installdirs-recursive pdf-recursive ps-recursive \
+ tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
+ distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+ $(RECURSIVE_TARGETS) \
+ $(RECURSIVE_CLEAN_TARGETS) \
+ $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+ distdir distdir-am
+am__extra_recursive_targets = check-valgrind-recursive \
+ check-valgrind-memcheck-recursive \
+ check-valgrind-helgrind-recursive check-valgrind-drd-recursive \
+ check-valgrind-sgcheck-recursive
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(srcdir)/Makefile.in
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+ dir0=`pwd`; \
+ sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+ sed_rest='s,^[^/]*/*,,'; \
+ sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+ sed_butlast='s,/*[^/]*$$,,'; \
+ while test -n "$$dir1"; do \
+ first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+ if test "$$first" != "."; then \
+ if test "$$first" = ".."; then \
+ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+ else \
+ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+ if test "$$first2" = "$$first"; then \
+ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+ else \
+ dir2="../$$dir2"; \
+ fi; \
+ dir0="$$dir0"/"$$first"; \
+ fi; \
+ fi; \
+ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+ done; \
+ reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BOOST_CPPFLAGS = @BOOST_CPPFLAGS@
+BOOST_DATE_TIME_LDFLAGS = @BOOST_DATE_TIME_LDFLAGS@
+BOOST_DATE_TIME_LDPATH = @BOOST_DATE_TIME_LDPATH@
+BOOST_DATE_TIME_LIBS = @BOOST_DATE_TIME_LIBS@
+BOOST_FILESYSTEM_LDFLAGS = @BOOST_FILESYSTEM_LDFLAGS@
+BOOST_FILESYSTEM_LDPATH = @BOOST_FILESYSTEM_LDPATH@
+BOOST_FILESYSTEM_LIBS = @BOOST_FILESYSTEM_LIBS@
+BOOST_IOSTREAMS_LDFLAGS = @BOOST_IOSTREAMS_LDFLAGS@
+BOOST_IOSTREAMS_LDPATH = @BOOST_IOSTREAMS_LDPATH@
+BOOST_IOSTREAMS_LIBS = @BOOST_IOSTREAMS_LIBS@
+BOOST_LDPATH = @BOOST_LDPATH@
+BOOST_PROGRAM_OPTIONS_LDFLAGS = @BOOST_PROGRAM_OPTIONS_LDFLAGS@
+BOOST_PROGRAM_OPTIONS_LDPATH = @BOOST_PROGRAM_OPTIONS_LDPATH@
+BOOST_PROGRAM_OPTIONS_LIBS = @BOOST_PROGRAM_OPTIONS_LIBS@
+BOOST_ROOT = @BOOST_ROOT@
+BOOST_SYSTEM_LDFLAGS = @BOOST_SYSTEM_LDFLAGS@
+BOOST_SYSTEM_LDPATH = @BOOST_SYSTEM_LDPATH@
+BOOST_SYSTEM_LIBS = @BOOST_SYSTEM_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CSCOPE = @CSCOPE@
+CTAGS = @CTAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_VALGRIND_drd = @ENABLE_VALGRIND_drd@
+ENABLE_VALGRIND_helgrind = @ENABLE_VALGRIND_helgrind@
+ENABLE_VALGRIND_memcheck = @ENABLE_VALGRIND_memcheck@
+ENABLE_VALGRIND_sgcheck = @ENABLE_VALGRIND_sgcheck@
+ETAGS = @ETAGS@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+HAVE_CXX17 = @HAVE_CXX17@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+IXION_REQUIRED_API_VERSION = @IXION_REQUIRED_API_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBIXION_CFLAGS = @LIBIXION_CFLAGS@
+LIBIXION_LIBS = @LIBIXION_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MDDS_CFLAGS = @MDDS_CFLAGS@
+MDDS_LIBS = @MDDS_LIBS@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+ORCUS_API_VERSION = @ORCUS_API_VERSION@
+ORCUS_MAJOR_VERSION = @ORCUS_MAJOR_VERSION@
+ORCUS_MICRO_VERSION = @ORCUS_MICRO_VERSION@
+ORCUS_MINOR_VERSION = @ORCUS_MINOR_VERSION@
+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@
+PARQUET_CFLAGS = @PARQUET_CFLAGS@
+PARQUET_LIBS = @PARQUET_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POW_LIB = @POW_LIB@
+PYTHON = @PYTHON@
+PYTHON_CFLAGS = @PYTHON_CFLAGS@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VALGRIND = @VALGRIND@
+VALGRIND_ENABLED = @VALGRIND_ENABLED@
+VERSION = @VERSION@
+ZLIB_CFLAGS = @ZLIB_CFLAGS@
+ZLIB_LIBS = @ZLIB_LIBS@
+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@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+runstatedir = @runstatedir@
+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@
+valgrind_enabled_tools = @valgrind_enabled_tools@
+valgrind_tools = @valgrind_tools@
+SUBDIRS = orcus
+all: all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign include/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+# (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+ @fail=; \
+ if $(am__make_keepgoing); then \
+ failcom='fail=yes'; \
+ else \
+ failcom='exit 1'; \
+ fi; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+check-valgrind-local:
+check-valgrind-memcheck-local:
+check-valgrind-helgrind-local:
+check-valgrind-drd-local:
+check-valgrind-sgcheck-local:
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ $(am__define_uniq_tagged_files); \
+ 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-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ 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"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @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
+ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ $(am__make_dryrun) \
+ || test -d "$(distdir)/$$subdir" \
+ || $(MKDIR_P) "$(distdir)/$$subdir" \
+ || exit 1; \
+ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+ $(am__relativize); \
+ new_distdir=$$reldir; \
+ dir1=$$subdir; dir2="$(top_distdir)"; \
+ $(am__relativize); \
+ new_top_distdir=$$reldir; \
+ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+ ($(am__cd) $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$new_top_distdir" \
+ distdir="$$new_distdir" \
+ am__remove_distdir=: \
+ am__skip_length_check=: \
+ am__skip_mode_fix=: \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+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:
+
+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)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+check-valgrind: check-valgrind-recursive
+
+check-valgrind-am: check-valgrind-local
+
+check-valgrind-drd: check-valgrind-drd-recursive
+
+check-valgrind-drd-am: check-valgrind-drd-local
+
+check-valgrind-helgrind: check-valgrind-helgrind-recursive
+
+check-valgrind-helgrind-am: check-valgrind-helgrind-local
+
+check-valgrind-memcheck: check-valgrind-memcheck-recursive
+
+check-valgrind-memcheck-am: check-valgrind-memcheck-local
+
+check-valgrind-sgcheck: check-valgrind-sgcheck-recursive
+
+check-valgrind-sgcheck-am: check-valgrind-sgcheck-local
+
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(am__recursive_targets) install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+ check-am check-valgrind-am check-valgrind-drd-am \
+ check-valgrind-drd-local check-valgrind-helgrind-am \
+ check-valgrind-helgrind-local check-valgrind-local \
+ check-valgrind-memcheck-am check-valgrind-memcheck-local \
+ check-valgrind-sgcheck-am check-valgrind-sgcheck-local clean \
+ clean-generic clean-libtool cscopelist-am ctags ctags-am \
+ distclean distclean-generic distclean-libtool distclean-tags \
+ distdir dvi dvi-am html html-am info info-am install \
+ install-am 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-man \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ installdirs-am maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+ ps ps-am tags tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+# 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/include/orcus/Makefile.am b/include/orcus/Makefile.am
new file mode 100644
index 0000000..865e8e6
--- /dev/null
+++ b/include/orcus/Makefile.am
@@ -0,0 +1,88 @@
+SUBDIRS = detail spreadsheet
+
+liborcusdir = $(includedir)/liborcus-@ORCUS_API_VERSION@/orcus
+liborcus_HEADERS = \
+ base64.hpp \
+ cell_buffer.hpp \
+ config.hpp \
+ css_document_tree.hpp \
+ css_parser.hpp \
+ css_parser_base.hpp \
+ css_selector.hpp \
+ css_types.hpp \
+ csv_parser.hpp \
+ csv_parser_base.hpp \
+ dom_tree.hpp \
+ env.hpp \
+ exception.hpp \
+ format_detection.hpp \
+ info.hpp \
+ interface.hpp \
+ json_document_tree.hpp \
+ json_global.hpp \
+ json_parser.hpp \
+ json_parser_base.hpp \
+ json_parser_thread.hpp \
+ json_structure_tree.hpp \
+ measurement.hpp \
+ orcus_csv.hpp \
+ orcus_json.hpp \
+ orcus_xml.hpp \
+ parser_base.hpp \
+ parser_global.hpp \
+ sax_parser.hpp \
+ sax_parser_base.hpp \
+ sax_ns_parser.hpp \
+ sax_token_parser.hpp \
+ sax_token_parser_thread.hpp \
+ stream.hpp \
+ string_pool.hpp \
+ threaded_json_parser.hpp \
+ threaded_sax_token_parser.hpp \
+ tokens.hpp \
+ types.hpp \
+ xml_namespace.hpp \
+ xml_structure_tree.hpp \
+ xml_writer.hpp \
+ yaml_document_tree.hpp \
+ yaml_parser.hpp \
+ yaml_parser_base.hpp \
+ zip_archive.hpp \
+ zip_archive_stream.hpp
+
+if WITH_ODS_FILTER
+
+liborcus_HEADERS += \
+ orcus_ods.hpp \
+ orcus_import_ods.hpp
+
+endif # WITH_ODS_FILTER
+
+if WITH_XLSX_FILTER
+
+liborcus_HEADERS += \
+ orcus_xlsx.hpp \
+ orcus_import_xlsx.hpp
+
+endif # WITH_XLSX_FILTER
+
+if WITH_XLS_XML_FILTER
+
+liborcus_HEADERS += \
+ orcus_xls_xml.hpp
+
+endif # WITH_XLS_XML_FILTER
+
+if WITH_GNUMERIC_FILTER
+
+liborcus_HEADERS += \
+ orcus_gnumeric.hpp
+
+endif # WITH_GNUMERIC_FILTER
+
+if WITH_PARQUET_FILTER
+
+liborcus_HEADERS += \
+ orcus_parquet.hpp
+
+endif # WITH_PARQUET_FILTER
diff --git a/include/orcus/Makefile.in b/include/orcus/Makefile.in
new file mode 100644
index 0000000..0070b0f
--- /dev/null
+++ b/include/orcus/Makefile.in
@@ -0,0 +1,828 @@
+# Makefile.in generated by automake 1.16.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2021 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.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+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@
+@WITH_ODS_FILTER_TRUE@am__append_1 = \
+@WITH_ODS_FILTER_TRUE@ orcus_ods.hpp \
+@WITH_ODS_FILTER_TRUE@ orcus_import_ods.hpp
+
+@WITH_XLSX_FILTER_TRUE@am__append_2 = \
+@WITH_XLSX_FILTER_TRUE@ orcus_xlsx.hpp \
+@WITH_XLSX_FILTER_TRUE@ orcus_import_xlsx.hpp
+
+@WITH_XLS_XML_FILTER_TRUE@am__append_3 = \
+@WITH_XLS_XML_FILTER_TRUE@ orcus_xls_xml.hpp
+
+@WITH_GNUMERIC_FILTER_TRUE@am__append_4 = \
+@WITH_GNUMERIC_FILTER_TRUE@ orcus_gnumeric.hpp
+
+@WITH_PARQUET_FILTER_TRUE@am__append_5 = \
+@WITH_PARQUET_FILTER_TRUE@ orcus_parquet.hpp
+
+subdir = include/orcus
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
+ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_17.m4 \
+ $(top_srcdir)/m4/boost.m4 $(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)/m4/m4_ax_valgrind_check.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__liborcus_HEADERS_DIST) \
+ $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+ ctags-recursive dvi-recursive html-recursive info-recursive \
+ install-data-recursive install-dvi-recursive \
+ install-exec-recursive install-html-recursive \
+ install-info-recursive install-pdf-recursive \
+ install-ps-recursive install-recursive installcheck-recursive \
+ installdirs-recursive pdf-recursive ps-recursive \
+ tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__liborcus_HEADERS_DIST = base64.hpp cell_buffer.hpp config.hpp \
+ css_document_tree.hpp css_parser.hpp css_parser_base.hpp \
+ css_selector.hpp css_types.hpp csv_parser.hpp \
+ csv_parser_base.hpp dom_tree.hpp env.hpp exception.hpp \
+ format_detection.hpp info.hpp interface.hpp \
+ json_document_tree.hpp json_global.hpp json_parser.hpp \
+ json_parser_base.hpp json_parser_thread.hpp \
+ json_structure_tree.hpp measurement.hpp orcus_csv.hpp \
+ orcus_json.hpp orcus_xml.hpp parser_base.hpp parser_global.hpp \
+ sax_parser.hpp sax_parser_base.hpp sax_ns_parser.hpp \
+ sax_token_parser.hpp sax_token_parser_thread.hpp stream.hpp \
+ string_pool.hpp threaded_json_parser.hpp \
+ threaded_sax_token_parser.hpp tokens.hpp types.hpp \
+ xml_namespace.hpp xml_structure_tree.hpp xml_writer.hpp \
+ yaml_document_tree.hpp yaml_parser.hpp yaml_parser_base.hpp \
+ zip_archive.hpp zip_archive_stream.hpp orcus_ods.hpp \
+ orcus_import_ods.hpp orcus_xlsx.hpp orcus_import_xlsx.hpp \
+ orcus_xls_xml.hpp orcus_gnumeric.hpp orcus_parquet.hpp
+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)$(liborcusdir)"
+HEADERS = $(liborcus_HEADERS)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
+ distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+ $(RECURSIVE_TARGETS) \
+ $(RECURSIVE_CLEAN_TARGETS) \
+ $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+ distdir distdir-am
+am__extra_recursive_targets = check-valgrind-recursive \
+ check-valgrind-memcheck-recursive \
+ check-valgrind-helgrind-recursive check-valgrind-drd-recursive \
+ check-valgrind-sgcheck-recursive
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(srcdir)/Makefile.in
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+ dir0=`pwd`; \
+ sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+ sed_rest='s,^[^/]*/*,,'; \
+ sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+ sed_butlast='s,/*[^/]*$$,,'; \
+ while test -n "$$dir1"; do \
+ first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+ if test "$$first" != "."; then \
+ if test "$$first" = ".."; then \
+ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+ else \
+ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+ if test "$$first2" = "$$first"; then \
+ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+ else \
+ dir2="../$$dir2"; \
+ fi; \
+ dir0="$$dir0"/"$$first"; \
+ fi; \
+ fi; \
+ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+ done; \
+ reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BOOST_CPPFLAGS = @BOOST_CPPFLAGS@
+BOOST_DATE_TIME_LDFLAGS = @BOOST_DATE_TIME_LDFLAGS@
+BOOST_DATE_TIME_LDPATH = @BOOST_DATE_TIME_LDPATH@
+BOOST_DATE_TIME_LIBS = @BOOST_DATE_TIME_LIBS@
+BOOST_FILESYSTEM_LDFLAGS = @BOOST_FILESYSTEM_LDFLAGS@
+BOOST_FILESYSTEM_LDPATH = @BOOST_FILESYSTEM_LDPATH@
+BOOST_FILESYSTEM_LIBS = @BOOST_FILESYSTEM_LIBS@
+BOOST_IOSTREAMS_LDFLAGS = @BOOST_IOSTREAMS_LDFLAGS@
+BOOST_IOSTREAMS_LDPATH = @BOOST_IOSTREAMS_LDPATH@
+BOOST_IOSTREAMS_LIBS = @BOOST_IOSTREAMS_LIBS@
+BOOST_LDPATH = @BOOST_LDPATH@
+BOOST_PROGRAM_OPTIONS_LDFLAGS = @BOOST_PROGRAM_OPTIONS_LDFLAGS@
+BOOST_PROGRAM_OPTIONS_LDPATH = @BOOST_PROGRAM_OPTIONS_LDPATH@
+BOOST_PROGRAM_OPTIONS_LIBS = @BOOST_PROGRAM_OPTIONS_LIBS@
+BOOST_ROOT = @BOOST_ROOT@
+BOOST_SYSTEM_LDFLAGS = @BOOST_SYSTEM_LDFLAGS@
+BOOST_SYSTEM_LDPATH = @BOOST_SYSTEM_LDPATH@
+BOOST_SYSTEM_LIBS = @BOOST_SYSTEM_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CSCOPE = @CSCOPE@
+CTAGS = @CTAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_VALGRIND_drd = @ENABLE_VALGRIND_drd@
+ENABLE_VALGRIND_helgrind = @ENABLE_VALGRIND_helgrind@
+ENABLE_VALGRIND_memcheck = @ENABLE_VALGRIND_memcheck@
+ENABLE_VALGRIND_sgcheck = @ENABLE_VALGRIND_sgcheck@
+ETAGS = @ETAGS@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+HAVE_CXX17 = @HAVE_CXX17@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+IXION_REQUIRED_API_VERSION = @IXION_REQUIRED_API_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBIXION_CFLAGS = @LIBIXION_CFLAGS@
+LIBIXION_LIBS = @LIBIXION_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MDDS_CFLAGS = @MDDS_CFLAGS@
+MDDS_LIBS = @MDDS_LIBS@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+ORCUS_API_VERSION = @ORCUS_API_VERSION@
+ORCUS_MAJOR_VERSION = @ORCUS_MAJOR_VERSION@
+ORCUS_MICRO_VERSION = @ORCUS_MICRO_VERSION@
+ORCUS_MINOR_VERSION = @ORCUS_MINOR_VERSION@
+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@
+PARQUET_CFLAGS = @PARQUET_CFLAGS@
+PARQUET_LIBS = @PARQUET_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POW_LIB = @POW_LIB@
+PYTHON = @PYTHON@
+PYTHON_CFLAGS = @PYTHON_CFLAGS@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VALGRIND = @VALGRIND@
+VALGRIND_ENABLED = @VALGRIND_ENABLED@
+VERSION = @VERSION@
+ZLIB_CFLAGS = @ZLIB_CFLAGS@
+ZLIB_LIBS = @ZLIB_LIBS@
+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@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+runstatedir = @runstatedir@
+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@
+valgrind_enabled_tools = @valgrind_enabled_tools@
+valgrind_tools = @valgrind_tools@
+SUBDIRS = detail spreadsheet
+liborcusdir = $(includedir)/liborcus-@ORCUS_API_VERSION@/orcus
+liborcus_HEADERS = base64.hpp cell_buffer.hpp config.hpp \
+ css_document_tree.hpp css_parser.hpp css_parser_base.hpp \
+ css_selector.hpp css_types.hpp csv_parser.hpp \
+ csv_parser_base.hpp dom_tree.hpp env.hpp exception.hpp \
+ format_detection.hpp info.hpp interface.hpp \
+ json_document_tree.hpp json_global.hpp json_parser.hpp \
+ json_parser_base.hpp json_parser_thread.hpp \
+ json_structure_tree.hpp measurement.hpp orcus_csv.hpp \
+ orcus_json.hpp orcus_xml.hpp parser_base.hpp parser_global.hpp \
+ sax_parser.hpp sax_parser_base.hpp sax_ns_parser.hpp \
+ sax_token_parser.hpp sax_token_parser_thread.hpp stream.hpp \
+ string_pool.hpp threaded_json_parser.hpp \
+ threaded_sax_token_parser.hpp tokens.hpp types.hpp \
+ xml_namespace.hpp xml_structure_tree.hpp xml_writer.hpp \
+ yaml_document_tree.hpp yaml_parser.hpp yaml_parser_base.hpp \
+ zip_archive.hpp zip_archive_stream.hpp $(am__append_1) \
+ $(am__append_2) $(am__append_3) $(am__append_4) \
+ $(am__append_5)
+all: all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/orcus/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign include/orcus/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-liborcusHEADERS: $(liborcus_HEADERS)
+ @$(NORMAL_INSTALL)
+ @list='$(liborcus_HEADERS)'; test -n "$(liborcusdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(liborcusdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(liborcusdir)" || 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)$(liborcusdir)'"; \
+ $(INSTALL_HEADER) $$files "$(DESTDIR)$(liborcusdir)" || exit $$?; \
+ done
+
+uninstall-liborcusHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(liborcus_HEADERS)'; test -n "$(liborcusdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(liborcusdir)'; $(am__uninstall_files_from_dir)
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+# (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+ @fail=; \
+ if $(am__make_keepgoing); then \
+ failcom='fail=yes'; \
+ else \
+ failcom='exit 1'; \
+ fi; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+check-valgrind-local:
+check-valgrind-memcheck-local:
+check-valgrind-helgrind-local:
+check-valgrind-drd-local:
+check-valgrind-sgcheck-local:
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ $(am__define_uniq_tagged_files); \
+ 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-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ 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"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @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
+ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ $(am__make_dryrun) \
+ || test -d "$(distdir)/$$subdir" \
+ || $(MKDIR_P) "$(distdir)/$$subdir" \
+ || exit 1; \
+ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+ $(am__relativize); \
+ new_distdir=$$reldir; \
+ dir1=$$subdir; dir2="$(top_distdir)"; \
+ $(am__relativize); \
+ new_top_distdir=$$reldir; \
+ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+ ($(am__cd) $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$new_top_distdir" \
+ distdir="$$new_distdir" \
+ am__remove_distdir=: \
+ am__skip_length_check=: \
+ am__skip_mode_fix=: \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-recursive
+all-am: Makefile $(HEADERS)
+installdirs: installdirs-recursive
+installdirs-am:
+ for dir in "$(DESTDIR)$(liborcusdir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+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:
+
+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)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+check-valgrind: check-valgrind-recursive
+
+check-valgrind-am: check-valgrind-local
+
+check-valgrind-drd: check-valgrind-drd-recursive
+
+check-valgrind-drd-am: check-valgrind-drd-local
+
+check-valgrind-helgrind: check-valgrind-helgrind-recursive
+
+check-valgrind-helgrind-am: check-valgrind-helgrind-local
+
+check-valgrind-memcheck: check-valgrind-memcheck-recursive
+
+check-valgrind-memcheck-am: check-valgrind-memcheck-local
+
+check-valgrind-sgcheck: check-valgrind-sgcheck-recursive
+
+check-valgrind-sgcheck-am: check-valgrind-sgcheck-local
+
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-liborcusHEADERS
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-liborcusHEADERS
+
+.MAKE: $(am__recursive_targets) install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+ check-am check-valgrind-am check-valgrind-drd-am \
+ check-valgrind-drd-local check-valgrind-helgrind-am \
+ check-valgrind-helgrind-local check-valgrind-local \
+ check-valgrind-memcheck-am check-valgrind-memcheck-local \
+ check-valgrind-sgcheck-am check-valgrind-sgcheck-local clean \
+ clean-generic clean-libtool cscopelist-am ctags ctags-am \
+ distclean distclean-generic distclean-libtool distclean-tags \
+ distdir dvi dvi-am html html-am info info-am install \
+ install-am 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-liborcusHEADERS install-man install-pdf install-pdf-am \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs installdirs-am maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-generic \
+ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
+ uninstall-am uninstall-liborcusHEADERS
+
+.PRECIOUS: Makefile
+
+
+# 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/include/orcus/base64.hpp b/include/orcus/base64.hpp
new file mode 100644
index 0000000..44c7017
--- /dev/null
+++ b/include/orcus/base64.hpp
@@ -0,0 +1,37 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef __ORCUS_BASE64_HPP__
+#define __ORCUS_BASE64_HPP__
+
+#include "env.hpp"
+#include <cstdint>
+#include <vector>
+#include <string>
+
+namespace orcus {
+
+/**
+ * Decode a based64-encoded character sequence into a sequence of bytes.
+ *
+ * @param base64 encoded character sequence.
+ * @return decoded byte sequence.
+ */
+ORCUS_PSR_DLLPUBLIC std::vector<uint8_t> decode_from_base64(std::string_view base64);
+
+/**
+ * Encode a sequence of bytes into base64-encoded characters.
+ *
+ * @param input sequence of bytes to encode.
+ * @return base64-encoded character sequence representing the input bytes.
+ */
+ORCUS_PSR_DLLPUBLIC std::string encode_to_base64(const std::vector<uint8_t>& input);
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/cell_buffer.hpp b/include/orcus/cell_buffer.hpp
new file mode 100644
index 0000000..60df728
--- /dev/null
+++ b/include/orcus/cell_buffer.hpp
@@ -0,0 +1,42 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef __ORCUS_CELL_BUFFER_HPP__
+#define __ORCUS_CELL_BUFFER_HPP__
+
+#include "env.hpp"
+
+#include <string>
+
+namespace orcus {
+
+/**
+ * Temporary cell buffer used to decode encoded cell values. This is used in
+ * the sax, json and csv parsers.
+ */
+class ORCUS_PSR_DLLPUBLIC cell_buffer
+{
+ std::string m_buffer;
+ size_t m_buf_size;
+public:
+ cell_buffer(const cell_buffer&) = delete;
+
+ cell_buffer();
+ ~cell_buffer();
+
+ void append(const char* p, size_t len);
+ void reset();
+
+ std::string_view str() const;
+
+ bool empty() const;
+};
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/config.hpp b/include/orcus/config.hpp
new file mode 100644
index 0000000..17743e6
--- /dev/null
+++ b/include/orcus/config.hpp
@@ -0,0 +1,125 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_CONFIG_HPP
+#define INCLUDED_ORCUS_CONFIG_HPP
+
+#include "orcus/env.hpp"
+#include "orcus/types.hpp"
+
+#include <string>
+#include <variant>
+
+namespace orcus {
+
+struct ORCUS_DLLPUBLIC config
+{
+ format_t input_format;
+
+ /**
+ * configuration settings specific to the CSV format. This struct must be
+ * POD.
+ */
+ struct csv_config
+ {
+ /** Number of header rows to repeat in case of split. */
+ size_t header_row_size;
+
+ /**
+ * Whether or not to split oversized source data into multiple sheets
+ * in case it spills over.
+ */
+ bool split_to_multiple_sheets;
+ };
+
+ // TODO: add config for other formats as needed.
+ using data_type = std::variant<csv_config>;
+
+ /**
+ * Enable or disable runtime debug output to stdout or stderr.
+ */
+ bool debug;
+
+ /**
+ * Control whether or not to perform strict check of the xml structure of
+ * a stream being parsed. When enabled, it throws an xml_structure_error
+ * exception when an incorrect xml structure is detected.
+ */
+ bool structure_check;
+
+ data_type data;
+
+ config(format_t input_format);
+};
+
+struct ORCUS_DLLPUBLIC json_config
+{
+ /**
+ * Path of the JSON file being parsed, in case the JSON string originates
+ * from a file. This parameter is required if external JSON files need to
+ * be resolved. Otherwise it's optional.
+ */
+ std::string input_path;
+
+ /**
+ * Path of the file to which output is written to. Used only from the
+ * orcus-json command line tool.
+ */
+ std::string output_path;
+
+ /**
+ * Output format type. Used only from the orcus-json command line tool.
+ */
+ dump_format_t output_format;
+
+ /**
+ * Control whether or not to preserve the order of object's child
+ * name/value pairs. By definition, JSON's object is an unordered set of
+ * name/value pairs, but in some cases preserving the original order may
+ * be desirable.
+ */
+ bool preserve_object_order;
+
+ /**
+ * Control whether or not to resolve JSON references to external files.
+ */
+ bool resolve_references;
+
+ /**
+ * When true, the document tree should allocate memory and hold copies of
+ * string values in the tree. When false, no extra memory is allocated
+ * for string values in the tree and the string values simply point to the
+ * original json string stream.
+ *
+ * In other words, when this option is set to false, the caller must
+ * ensure that the json string stream instance stays alive for the entire
+ * life cycle of the document tree.
+ */
+ bool persistent_string_values;
+
+ json_config();
+ ~json_config();
+};
+
+struct ORCUS_DLLPUBLIC yaml_config
+{
+ enum class output_format_type { none, yaml, json };
+
+ std::string input_path;
+ std::string output_path;
+
+ output_format_type output_format;
+
+ yaml_config();
+ ~yaml_config();
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/css_document_tree.hpp b/include/orcus/css_document_tree.hpp
new file mode 100644
index 0000000..abbc65a
--- /dev/null
+++ b/include/orcus/css_document_tree.hpp
@@ -0,0 +1,100 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_CSS_DOCUMENT_TREE_HPP
+#define INCLUDED_ORCUS_CSS_DOCUMENT_TREE_HPP
+
+#include "orcus/css_selector.hpp"
+#include "orcus/exception.hpp"
+
+#include <string>
+#include <memory>
+
+namespace orcus {
+
+/**
+ * Class representing CSS rules.
+ */
+class ORCUS_DLLPUBLIC css_document_tree
+{
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+public:
+
+ class insertion_error : public general_error
+ {
+ public:
+ insertion_error(const std::string& msg);
+ };
+
+ css_document_tree(const css_document_tree&) = delete;
+
+ css_document_tree();
+ css_document_tree(css_document_tree&& other);
+ ~css_document_tree();
+
+ css_document_tree& operator=(css_document_tree&& other);
+
+ /**
+ * Load raw string stream containing CSS rules to populate the document
+ * tree.
+ *
+ * @param stream raw CSS rules.
+ */
+ void load(std::string_view stream);
+
+ /**
+ * Insert or replace properties for given selector and pseudo element
+ * flags.
+ *
+ * @param selector selector to store properties for.
+ * @param pseudo_elem pseudo element flags for the last simple selector.
+ * @param props new properties to insert.
+ */
+ void insert_properties(
+ const css_selector_t& selector,
+ css::pseudo_element_t pseudo_elem,
+ const css_properties_t& props);
+
+ /**
+ * Get properties associated with given selector and one or more pseudo
+ * elements.
+ *
+ * @param selector selector to get properties for.
+ * @param pseudo_elem pseudo element flags for the last simple selector.
+ * This value is a bitfield.
+ *
+ * @return const pointer to the property set instance, or NULL in case
+ * there is no properties for the given selector.
+ */
+ const css_properties_t* get_properties(
+ const css_selector_t& selector, css::pseudo_element_t pseudo_elem) const;
+
+ /**
+ * Get all sets of properties associated with given selector, for all
+ * pseudo element values.
+ *
+ * @param selector selector to get properties for.
+ *
+ * @return const pointer to the map of property sets with pseudo element
+ * values as the keys, or NULL in case there is no properties for
+ * the given selector.
+ */
+ const css_pseudo_element_properties_t*
+ get_all_properties(const css_selector_t& selector) const;
+
+ void dump() const;
+
+ void swap(css_document_tree& other) noexcept;
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/css_parser.hpp b/include/orcus/css_parser.hpp
new file mode 100644
index 0000000..93bbc14
--- /dev/null
+++ b/include/orcus/css_parser.hpp
@@ -0,0 +1,883 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_CSS_PARSER_HPP
+#define INCLUDED_ORCUS_CSS_PARSER_HPP
+
+#define ORCUS_DEBUG_CSS 0
+
+#include "parser_global.hpp"
+#include "css_parser_base.hpp"
+
+#include <cassert>
+#include <algorithm>
+
+#if ORCUS_DEBUG_CSS
+#include <iostream>
+using std::cout;
+using std::endl;
+#endif
+
+namespace orcus {
+
+/**
+ * Empty handler for CSS parser. Sub-class from it and implement necessary
+ * methods.
+ */
+class css_handler
+{
+public:
+ /**
+ * Called upon encountering an at-rule.
+ *
+ * @param name name of the at-rule.
+ */
+ void at_rule_name(std::string_view name)
+ {
+ (void)name;
+ }
+
+ /**
+ * Called upon encountering a simple selector type. A simple selector may
+ * consist of
+ *
+ * @code{.txt}
+ * <type>.<class>#<id>
+ * @endcode
+ *
+ * and this function only passes the type part of the simple selector
+ * expression.
+ *
+ * @param type simple selector type.
+ */
+ void simple_selector_type(std::string_view type)
+ {
+ (void)type;
+ }
+
+ /**
+ * Called upon encountering a simple selector class. A simple selector may
+ * consist of
+ *
+ * @code{.txt}
+ * <type>.<class>#<id>
+ * @endcode
+ *
+ * and this function only passes the class part of the simple selector
+ * expression.
+ *
+ * @param cls simple selector class.
+ */
+ void simple_selector_class(std::string_view cls)
+ {
+ (void)cls;
+ }
+
+ /**
+ * Called upon encountering a pseudo element of a simple selector. For
+ * instance, given the following CSS block:
+ *
+ * @code{.css}
+ * p::first-line {
+ * color: blue;
+ * text-transform: uppercase;
+ * }
+ * @endcode
+ *
+ * the `first-line` part is the pseudo element of the selector named `p`.
+ *
+ * @param pe pseudo element of a simple selector.
+ */
+ void simple_selector_pseudo_element(orcus::css::pseudo_element_t pe)
+ {
+ (void)pe;
+ }
+
+ /**
+ * Called upon encountering a pseudo class of a simple selector. For
+ * instance, given the following CSS block:
+ *
+ * @code{.css}
+ * button:hover {
+ * color: blue;
+ * }
+ * @endcode
+ *
+ * the `hover` part is the pseudo class of the selector named `button`.
+ *
+ * @param pc pseudo class of a simple selector.
+ */
+ void simple_selector_pseudo_class(orcus::css::pseudo_class_t pc)
+ {
+ (void)pc;
+ }
+
+ /**
+ * Called upon encountering a simple selector id. A simple selector may
+ * consist of
+ *
+ * @code{.txt}
+ * <type>.<class>#<id>
+ * @endcode
+ *
+ * and this function only passes the id part of the simle selector
+ * expression.
+ *
+ * @param id simple selector id.
+ */
+ void simple_selector_id(std::string_view id)
+ {
+ (void)id;
+ }
+
+ /**
+ * Called at the end of a simple selector expression.
+ *
+ * @todo find out the difference between a simple selector and a selector,
+ * and document it.
+ */
+ void end_simple_selector() {}
+
+ /**
+ * Called at the end of a selector expression.
+ *
+ * @todo find out the difference between a simple selector and a selector,
+ * and document it.
+ */
+ void end_selector() {}
+
+ /**
+ * Calling upon encountering a combinator. A combinator is an operator that
+ * combines other selectors. Given the following CSS block:
+ *
+ * @code{.css}
+ * div > p {
+ * background-color: yellow;
+ * }
+ * @endcode
+ *
+ * the `>` is the combinator that combines the `div` and `p` selectors.
+ *
+ * @param combinator type of combinator encountered.
+ */
+ void combinator(orcus::css::combinator_t combinator)
+ {
+ (void)combinator;
+ }
+
+ /**
+ * Called at each property name.
+ *
+ * @param name property name string.
+ */
+ void property_name(std::string_view name)
+ {
+ (void)name;
+ }
+
+ /**
+ * Called at each ordinary property value string.
+ *
+ * @param value value string.
+ */
+ void value(std::string_view value)
+ {
+ (void)value;
+ }
+
+ /**
+ * Called at each RGB color value of a property.
+ *
+ * @param red value of red (0-255)
+ * @param green value of green (0-255)
+ * @param blue value of blue (0-255)
+ */
+ void rgb(uint8_t red, uint8_t green, uint8_t blue)
+ {
+ (void)red; (void)green; (void)blue;
+ }
+
+ /**
+ * Called at each RGB color value of a property with alpha transparency
+ * value.
+ *
+ * @param red value of red (0-255)
+ * @param green value of green (0-255)
+ * @param blue value of blue (0-255)
+ * @param alpha alpha transparency value
+ */
+ void rgba(uint8_t red, uint8_t green, uint8_t blue, double alpha)
+ {
+ (void)red; (void)green; (void)blue; (void)alpha;
+ }
+
+ /**
+ * Called at each HSL color value of a property.
+ *
+ * @param hue hue
+ * @param sat saturation
+ * @param light lightness
+ */
+ void hsl(uint8_t hue, uint8_t sat, uint8_t light)
+ {
+ (void)hue; (void)sat; (void)light;
+ }
+
+ /**
+ * Called at each HSL color value of a property with alpha transparency
+ * value.
+ *
+ * @param hue hue
+ * @param sat saturation
+ * @param light lightness
+ * @param alpha alpha value
+ */
+ void hsla(uint8_t hue, uint8_t sat, uint8_t light, double alpha)
+ {
+ (void)hue; (void)sat; (void)light; (void)alpha;
+ }
+
+ /**
+ * Called at each URL value of a property.
+ *
+ * @param url URL value string.
+ */
+ void url(std::string_view url)
+ {
+ (void)url;
+ }
+
+ /**
+ * Called when the parsing begins.
+ */
+ void begin_parse() {}
+
+ /**
+ * Called when the parsing ends.
+ */
+ void end_parse() {}
+
+ /**
+ * Called at the beginning of each block. An opening brace '{' marks the
+ * beginning of a block.
+ */
+ void begin_block() {}
+
+ /**
+ * Called at the end of each block. A closing brace '}' marks the end of
+ * a block.
+ */
+ void end_block() {}
+
+ /**
+ * Called at the beginning of a single property expression. Each property
+ * expression may consist of
+ *
+ * @code{.txt}
+ * <name> : <value>, ..., <value>
+ * @endcode
+ *
+ * terminated by either a `;` or `}`.
+ */
+ void begin_property() {}
+
+ /**
+ * Called at the end of a single property expression.
+ */
+ void end_property() {}
+};
+
+/**
+ * Parser for CSS documents.
+ *
+ * @tparam HandlerT Hanlder type with member functions for event callbacks.
+ * Refer to css_handler.
+ */
+template<typename HandlerT>
+class css_parser : public css::parser_base
+{
+public:
+ typedef HandlerT handler_type;
+
+ css_parser(std::string_view content, handler_type& hdl);
+ void parse();
+
+private:
+ // Handlers - at the time a handler is called the current position is
+ // expected to point to the first unprocessed non-blank character, and
+ // each handler must set the current position to the next unprocessed
+ // non-blank character when it finishes.
+ void rule();
+ void at_rule_name();
+ void simple_selector_name();
+ void property_name();
+ void property();
+ void quoted_value(char c);
+ void value();
+ void function_value(std::string_view v);
+ void function_rgb(bool alpha);
+ void function_hsl(bool alpha);
+ void function_url();
+ void name_sep();
+ void property_sep();
+ void block();
+
+ handler_type& m_handler;
+};
+
+template<typename _Handler>
+css_parser<_Handler>::css_parser(std::string_view content, handler_type& hdl) :
+ css::parser_base(content), m_handler(hdl) {}
+
+template<typename _Handler>
+void css_parser<_Handler>::parse()
+{
+ shrink_stream();
+
+#if ORCUS_DEBUG_CSS
+ std::cout << "compressed: '";
+ const char* p = mp_char;
+ for (; p != mp_end; ++p)
+ std::cout << *p;
+ std::cout << "'" << std::endl;
+#endif
+ m_handler.begin_parse();
+ while (has_char())
+ rule();
+ m_handler.end_parse();
+}
+
+template<typename _Handler>
+void css_parser<_Handler>::rule()
+{
+ // <selector name> , ... , <selector name> <block>
+ while (has_char())
+ {
+ if (skip_comment())
+ continue;
+
+ char c = cur_char();
+ if (is_alpha(c))
+ {
+ simple_selector_name();
+ continue;
+ }
+
+ switch (c)
+ {
+ case '>':
+ set_combinator(c, css::combinator_t::direct_child);
+ break;
+ case '+':
+ set_combinator(c, css::combinator_t::next_sibling);
+ break;
+ case '.':
+ case '#':
+ case '@':
+ simple_selector_name();
+ break;
+ case ',':
+ name_sep();
+ break;
+ case '{':
+ reset_before_block();
+ block();
+ break;
+ default:
+ parse_error::throw_with("rule: failed to parse '", c, "'", offset());
+ }
+ }
+}
+
+template<typename _Handler>
+void css_parser<_Handler>::at_rule_name()
+{
+ assert(has_char());
+ assert(cur_char() == '@');
+ next();
+ char c = cur_char();
+ if (!is_alpha(c))
+ throw parse_error("at_rule_name: first character of an at-rule name must be an alphabet.", offset());
+
+ const char* p;
+ size_t len;
+ identifier(p, len);
+ skip_blanks();
+
+ m_handler.at_rule_name({p, len});
+#if ORCUS_DEBUG_CSS
+ std::string foo(p, len);
+ std::cout << "at-rule name: " << foo.c_str() << std::endl;
+#endif
+}
+
+template<typename _Handler>
+void css_parser<_Handler>::simple_selector_name()
+{
+ assert(has_char());
+ char c = cur_char();
+ if (c == '@')
+ {
+ // This is the name of an at-rule.
+ at_rule_name();
+ return;
+ }
+
+ if (m_simple_selector_count)
+ {
+#if ORCUS_DEBUG_CSS
+ cout << "combinator: " << m_combinator << endl;
+#endif
+ m_handler.combinator(m_combinator);
+ m_combinator = css::combinator_t::descendant;
+ }
+ assert(is_alpha(c) || c == '.' || c == '#');
+
+ const char* p = nullptr;
+ size_t n = 0;
+
+#if ORCUS_DEBUG_CSS
+ cout << "simple_selector_name: (" << m_simple_selector_count << ")";
+#endif
+
+ if (c != '.' && c != '#')
+ {
+ identifier(p, n);
+#if ORCUS_DEBUG_CSS
+ std::string s(p, n);
+ cout << " type=" << s;
+#endif
+ m_handler.simple_selector_type({p, n});
+ }
+
+ bool in_loop = true;
+ while (in_loop && has_char())
+ {
+ switch (cur_char())
+ {
+ case '.':
+ {
+ next();
+ identifier(p, n);
+ m_handler.simple_selector_class({p, n});
+#if ORCUS_DEBUG_CSS
+ std::string s(p, n);
+ std::cout << " class=" << s;
+#endif
+ }
+ break;
+ case '#':
+ {
+ next();
+ identifier(p, n);
+ m_handler.simple_selector_id({p, n});
+#if ORCUS_DEBUG_CSS
+ std::string s(p, n);
+ std::cout << " id=" << s;
+#endif
+ }
+ break;
+ case ':':
+ {
+ // This could be either a pseudo element or pseudo class.
+ next();
+ if (cur_char() == ':')
+ {
+ // pseudo element.
+ next();
+ identifier(p, n);
+ css::pseudo_element_t elem = css::to_pseudo_element({p, n});
+ if (!elem)
+ parse_error::throw_with(
+ "selector_name: unknown pseudo element '", {p, n}, "'", offset());
+
+ m_handler.simple_selector_pseudo_element(elem);
+ }
+ else
+ {
+ // pseudo class (or pseudo element in the older version of CSS).
+ identifier(p, n);
+ css::pseudo_class_t pc = css::to_pseudo_class({p, n});
+ if (!pc)
+ parse_error::throw_with(
+ "selector_name: unknown pseudo class '", {p, n}, "'", offset());
+
+ m_handler.simple_selector_pseudo_class(pc);
+ }
+ }
+ break;
+ default:
+ in_loop = false;
+ }
+ }
+
+ m_handler.end_simple_selector();
+ skip_comments_and_blanks();
+
+ ++m_simple_selector_count;
+
+#if ORCUS_DEBUG_CSS
+ std::cout << std::endl;
+#endif
+}
+
+template<typename _Handler>
+void css_parser<_Handler>::property_name()
+{
+ // <identifier>
+
+ assert(has_char());
+ char c = cur_char();
+ if (!is_alpha(c) && c != '.')
+ parse_error::throw_with(
+ "property_name: first character of a name must be an alphabet or a dot, but found '", c, "'", offset());
+
+ const char* p;
+ size_t len;
+ identifier(p, len);
+ skip_comments_and_blanks();
+
+ m_handler.property_name({p, len});
+#if ORCUS_DEBUG_CSS
+ std::string foo(p, len);
+ std::cout << "property name: " << foo.c_str() << std::endl;
+#endif
+}
+
+template<typename _Handler>
+void css_parser<_Handler>::property()
+{
+ // <property name> : <value> , ... , <value>
+
+ m_handler.begin_property();
+ property_name();
+ if (cur_char() != ':')
+ throw parse_error("property: ':' expected.", offset());
+ next();
+ skip_comments_and_blanks();
+
+ bool in_loop = true;
+ while (in_loop && has_char())
+ {
+ value();
+ char c = cur_char();
+ switch (c)
+ {
+ case ',':
+ {
+ // separated by commas.
+ next();
+ skip_comments_and_blanks();
+ }
+ break;
+ case ';':
+ case '}':
+ in_loop = false;
+ break;
+ default:
+ ;
+ }
+ }
+
+ skip_comments_and_blanks();
+ m_handler.end_property();
+}
+
+template<typename _Handler>
+void css_parser<_Handler>::quoted_value(char c)
+{
+ // Parse until the the end quote is reached.
+ const char* p = nullptr;
+ size_t len = 0;
+ literal(p, len, c);
+ next();
+ skip_blanks();
+
+ m_handler.value({p, len});
+#if ORCUS_DEBUG_CSS
+ std::string foo(p, len);
+ std::cout << "quoted value: " << foo.c_str() << std::endl;
+#endif
+}
+
+template<typename _Handler>
+void css_parser<_Handler>::value()
+{
+ assert(has_char());
+ char c = cur_char();
+ if (c == '"' || c == '\'')
+ {
+ quoted_value(c);
+ return;
+ }
+
+ std::string_view v = parse_value();
+ if (v.empty())
+ return;
+
+ if (cur_char() == '(')
+ {
+ function_value(v);
+ return;
+ }
+
+ m_handler.value(v);
+
+ skip_comments_and_blanks();
+
+#if ORCUS_DEBUG_CSS
+ std::cout << "value: " << v << std::endl;
+#endif
+}
+
+template<typename _Handler>
+void css_parser<_Handler>::function_value(std::string_view v)
+{
+ assert(cur_char() == '(');
+ css::property_function_t func = css::to_property_function(v);
+ if (func == css::property_function_t::unknown)
+ parse_error::throw_with("function_value: unknown function '", v, "'", offset());
+
+ // Move to the first character of the first argument.
+ next();
+ skip_comments_and_blanks();
+
+ switch (func)
+ {
+ case css::property_function_t::rgb:
+ function_rgb(false);
+ break;
+ case css::property_function_t::rgba:
+ function_rgb(true);
+ break;
+ case css::property_function_t::hsl:
+ function_hsl(false);
+ break;
+ case css::property_function_t::hsla:
+ function_hsl(true);
+ break;
+ case css::property_function_t::url:
+ function_url();
+ break;
+ default:
+ parse_error::throw_with("function_value: unhandled function '", v, "'", offset());
+ }
+
+ char c = cur_char();
+ if (c != ')')
+ parse_error::throw_with("function_value: ')' expected but '", c, "' found.", offset());
+
+ next();
+ skip_comments_and_blanks();
+}
+
+template<typename _Handler>
+void css_parser<_Handler>::function_rgb(bool alpha)
+{
+ // rgb(num, num, num) rgba(num, num, num, float)
+
+ uint8_t vals[3];
+ uint8_t* p = vals;
+ const uint8_t* plast = p + 2;
+ char c = 0;
+
+ for (; ; ++p)
+ {
+ *p = parse_uint8();
+
+ skip_comments_and_blanks();
+
+ if (p == plast)
+ break;
+
+ c = cur_char();
+
+ if (c != ',')
+ parse_error::throw_with("function_rgb: ',' expected but '", c, "' found.", offset());
+
+ next();
+ skip_comments_and_blanks();
+ }
+
+ if (alpha)
+ {
+ c = cur_char();
+ if (c != ',')
+ parse_error::throw_with("function_rgb: ',' expected but '", c, "' found.", offset());
+
+ next();
+ skip_comments_and_blanks();
+
+ double alpha_val = parse_double_or_throw();
+
+ alpha_val = std::clamp(alpha_val, 0.0, 1.0);
+ m_handler.rgba(vals[0], vals[1], vals[2], alpha_val);
+ }
+ else
+ m_handler.rgb(vals[0], vals[1], vals[2]);
+
+#if ORCUS_DEBUG_CSS
+ std::cout << "rgb";
+ if (alpha)
+ std::cout << 'a';
+ std::cout << '(';
+ p = vals;
+ const uint8_t* pend = plast + 1;
+ for (; p != pend; ++p)
+ std::cout << ' ' << (int)*p;
+ std::cout << " )" << std::endl;
+#endif
+}
+
+template<typename _Handler>
+void css_parser<_Handler>::function_hsl(bool alpha)
+{
+ // hsl(num, percent, percent) hsla(num, percent, percent, float)
+
+ double hue = parse_double_or_throw(); // casted to uint8_t eventually.
+ hue = std::clamp(hue, 0.0, 360.0);
+ skip_comments_and_blanks();
+
+ char c = cur_char();
+ if (c != ',')
+ parse_error::throw_with("function_hsl: ',' expected but '", c, "' found.", offset());
+
+ next();
+ skip_comments_and_blanks();
+
+ double sat = parse_percent();
+ sat = std::clamp(sat, 0.0, 100.0);
+ skip_comments_and_blanks();
+
+ c = cur_char();
+ if (c != ',')
+ parse_error::throw_with("function_hsl: ',' expected but '", c, "' found.", offset());
+
+ next();
+ skip_comments_and_blanks();
+
+ double light = parse_percent();
+ light = std::clamp(light, 0.0, 100.0);
+ skip_comments_and_blanks();
+
+ if (!alpha)
+ {
+ m_handler.hsl(hue, sat, light);
+ return;
+ }
+
+ c = cur_char();
+ if (c != ',')
+ parse_error::throw_with("function_hsl: ',' expected but '", c, "' found.", offset());
+
+ next();
+ skip_comments_and_blanks();
+
+ double alpha_val = parse_double_or_throw();
+ alpha_val = std::clamp(alpha_val, 0.0, 1.0);
+ skip_comments_and_blanks();
+ m_handler.hsla(hue, sat, light, alpha_val);
+}
+
+template<typename _Handler>
+void css_parser<_Handler>::function_url()
+{
+ char c = cur_char();
+
+ if (c == '"' || c == '\'')
+ {
+ // Quoted URL value.
+ const char* p;
+ size_t len;
+ literal(p, len, c);
+ next();
+ skip_comments_and_blanks();
+ m_handler.url({p, len});
+#if ORCUS_DEBUG_CSS
+ std::cout << "url(" << std::string(p, len) << ")" << std::endl;
+#endif
+ return;
+ }
+
+ // Unquoted URL value.
+ const char* p;
+ size_t len;
+ skip_to_or_blank(p, len, ")");
+ skip_comments_and_blanks();
+ m_handler.url({p, len});
+#if ORCUS_DEBUG_CSS
+ std::cout << "url(" << std::string(p, len) << ")" << std::endl;
+#endif
+}
+
+template<typename _Handler>
+void css_parser<_Handler>::name_sep()
+{
+ assert(cur_char() == ',');
+#if ORCUS_DEBUG_CSS
+ std::cout << "," << std::endl;
+#endif
+ next();
+ skip_blanks();
+ m_handler.end_selector();
+}
+
+template<typename _Handler>
+void css_parser<_Handler>::property_sep()
+{
+#if ORCUS_DEBUG_CSS
+ std::cout << ";" << std::endl;
+#endif
+ next();
+ skip_comments_and_blanks();
+}
+
+template<typename _Handler>
+void css_parser<_Handler>::block()
+{
+ // '{' <property> ';' ... ';' <property> ';'(optional) '}'
+
+ assert(cur_char() == '{');
+#if ORCUS_DEBUG_CSS
+ std::cout << "{" << std::endl;
+#endif
+ m_handler.end_selector();
+ m_handler.begin_block();
+
+ next();
+ skip_comments_and_blanks();
+
+ // parse properties.
+ while (has_char())
+ {
+ property();
+ if (cur_char() != ';')
+ break;
+ property_sep();
+ if (cur_char() == '}')
+ // ';' after the last property. This is optional but allowed.
+ break;
+ }
+
+ if (cur_char() != '}')
+ throw parse_error("block: '}' expected.", offset());
+
+ m_handler.end_block();
+
+ next();
+ skip_comments_and_blanks();
+
+#if ORCUS_DEBUG_CSS
+ std::cout << "}" << std::endl;
+#endif
+}
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/css_parser_base.hpp b/include/orcus/css_parser_base.hpp
new file mode 100644
index 0000000..4514269
--- /dev/null
+++ b/include/orcus/css_parser_base.hpp
@@ -0,0 +1,71 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_CSS_PARSER_BASE_HPP
+#define INCLUDED_CSS_PARSER_BASE_HPP
+
+#include "orcus/env.hpp"
+#include "orcus/css_types.hpp"
+#include "orcus/exception.hpp"
+#include "orcus/parser_base.hpp"
+
+#include <string>
+#include <exception>
+
+namespace orcus { namespace css {
+
+class ORCUS_PSR_DLLPUBLIC parser_base : public ::orcus::parser_base
+{
+public:
+ parser_base(std::string_view content);
+
+protected:
+
+ void identifier(const char*& p, size_t& len, std::string_view extra = std::string_view{});
+ uint8_t parse_uint8();
+
+ /**
+ * Parse an unquoted property value until one of non-value characters is
+ * reached.
+ *
+ * @return parsed value segment.
+ */
+ std::string_view parse_value();
+ double parse_percent();
+ double parse_double_or_throw();
+
+ void literal(const char*& p, size_t& len, char quote);
+ void skip_to(const char*& p, size_t& len, char c);
+
+ /**
+ * Skip until one of specified characters or a blank character is reached.
+ *
+ * @param p pointer to the first character of the skipped character array.
+ * @param len length of the skipped character array.
+ * @param chars one or more characters that can end the skipping.
+ */
+ void skip_to_or_blank(const char*& p, size_t& len, std::string_view chars);
+ void skip_blanks();
+ void skip_blanks_reverse();
+ void shrink_stream();
+ bool skip_comment();
+ void comment();
+ void skip_comments_and_blanks();
+ void set_combinator(char c, css::combinator_t combinator);
+ void reset_before_block();
+
+protected:
+ size_t m_simple_selector_count;
+ combinator_t m_combinator;
+};
+
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/css_selector.hpp b/include/orcus/css_selector.hpp
new file mode 100644
index 0000000..1e41d54
--- /dev/null
+++ b/include/orcus/css_selector.hpp
@@ -0,0 +1,110 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_CSS_SELECTOR_HPP
+#define INCLUDED_ORCUS_CSS_SELECTOR_HPP
+
+#include "env.hpp"
+#include "css_types.hpp"
+
+#include <ostream>
+#include <variant>
+#include <vector>
+#include <unordered_set>
+#include <unordered_map>
+
+namespace orcus {
+
+struct ORCUS_DLLPUBLIC css_simple_selector_t
+{
+ typedef std::unordered_set<std::string_view> classes_type;
+
+ std::string_view name;
+ std::string_view id;
+ classes_type classes;
+ css::pseudo_class_t pseudo_classes;
+
+ css_simple_selector_t();
+
+ void clear();
+ bool empty() const;
+
+ bool operator== (const css_simple_selector_t& r) const;
+ bool operator!= (const css_simple_selector_t& r) const;
+
+ struct hash
+ {
+ size_t operator() (const css_simple_selector_t& ss) const;
+ };
+};
+
+struct ORCUS_DLLPUBLIC css_chained_simple_selector_t
+{
+ css::combinator_t combinator;
+ css_simple_selector_t simple_selector;
+
+ bool operator== (const css_chained_simple_selector_t& r) const;
+
+ css_chained_simple_selector_t();
+ css_chained_simple_selector_t(const css_simple_selector_t& ss);
+ css_chained_simple_selector_t(css::combinator_t op, const css_simple_selector_t& ss);
+};
+
+/**
+ * Each CSS selector consists of one or more chained simple selectors.
+ */
+struct ORCUS_DLLPUBLIC css_selector_t
+{
+ typedef std::vector<css_chained_simple_selector_t> chained_type;
+ css_simple_selector_t first;
+ chained_type chained;
+
+ void clear();
+
+ bool operator== (const css_selector_t& r) const;
+};
+
+/**
+ * Structure representing a single CSS property value.
+ */
+struct ORCUS_DLLPUBLIC css_property_value_t
+{
+ using value_type = std::variant<std::string_view, css::rgba_color_t, css::hsla_color_t>;
+
+ css::property_value_t type;
+ value_type value;
+
+ css_property_value_t();
+ css_property_value_t(const css_property_value_t& r);
+
+ /**
+ * Constructor that takes a string value.
+ *
+ * @param _str string value to store. This value should point to a string
+ * buffer that's already been interned. The caller is
+ * responsible for managing the life cycle of the source string
+ * buffer.
+ */
+ css_property_value_t(std::string_view _str);
+
+ css_property_value_t& operator= (const css_property_value_t& r);
+
+ void swap(css_property_value_t& r);
+};
+
+typedef std::unordered_map<std::string_view, std::vector<css_property_value_t>> css_properties_t;
+typedef std::unordered_map<css::pseudo_element_t, css_properties_t> css_pseudo_element_properties_t;
+
+ORCUS_DLLPUBLIC std::ostream& operator<< (std::ostream& os, const css_simple_selector_t& v);
+ORCUS_DLLPUBLIC std::ostream& operator<< (std::ostream& os, const css_selector_t& v);
+ORCUS_DLLPUBLIC std::ostream& operator<< (std::ostream& os, const css_property_value_t& v);
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/css_types.hpp b/include/orcus/css_types.hpp
new file mode 100644
index 0000000..75386ea
--- /dev/null
+++ b/include/orcus/css_types.hpp
@@ -0,0 +1,139 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_CSS_TYPES_HPP
+#define INCLUDED_ORCUS_CSS_TYPES_HPP
+
+#include "env.hpp"
+
+#include <cstdlib>
+#include <cstdint>
+#include <string>
+
+namespace orcus { namespace css {
+
+enum class combinator_t
+{
+ /// `E F` where `F` is a descendant of `E`.
+ descendant,
+ /// `E > F` where `F` is a direct child of `E`.
+ direct_child,
+ /// `E + F` where `F` is a direct sibling of `E` where `E` precedes `F`.
+ next_sibling
+};
+
+/**
+ * List of functions used as property values.
+ */
+enum class property_function_t
+{
+ unknown = 0,
+ hsl,
+ hsla,
+ rgb,
+ rgba,
+ url
+};
+
+enum class property_value_t
+{
+ none = 0,
+ string,
+ hsl,
+ hsla,
+ rgb,
+ rgba,
+ url
+};
+
+struct rgba_color_t
+{
+ uint8_t red; /// 0 to 255
+ uint8_t green; /// 0 to 255
+ uint8_t blue; /// 0 to 255
+ double alpha;
+};
+
+struct hsla_color_t
+{
+ uint8_t hue; /// 0 to 255
+ uint8_t saturation; /// 0 to 255
+ uint8_t lightness; /// 0 to 255
+ double alpha;
+};
+
+using pseudo_element_t = uint16_t;
+using pseudo_class_t = uint64_t;
+
+ORCUS_PSR_DLLPUBLIC extern const pseudo_element_t pseudo_element_after;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_element_t pseudo_element_before;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_element_t pseudo_element_first_letter;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_element_t pseudo_element_first_line;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_element_t pseudo_element_selection;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_element_t pseudo_element_backdrop;
+
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_active;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_checked;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_default;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_dir;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_disabled;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_empty;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_enabled;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_first;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_first_child;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_first_of_type;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_fullscreen;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_focus;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_hover;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_indeterminate;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_in_range;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_invalid;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_lang;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_last_child;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_last_of_type;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_left;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_link;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_not;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_nth_child;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_nth_last_child;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_nth_last_of_type;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_nth_of_type;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_only_child;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_only_of_type;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_optional;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_out_of_range;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_read_only;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_read_write;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_required;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_right;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_root;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_scope;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_target;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_valid;
+ORCUS_PSR_DLLPUBLIC extern const pseudo_class_t pseudo_class_visited;
+
+/**
+ * Convert a textural representation of a pseudo element into its numerical
+ * representation.
+ */
+ORCUS_PSR_DLLPUBLIC pseudo_element_t to_pseudo_element(std::string_view s);
+
+/**
+ * Convert a textural representation of a pseudo class into its numerical
+ * representation.
+ */
+ORCUS_PSR_DLLPUBLIC pseudo_class_t to_pseudo_class(std::string_view s);
+
+ORCUS_PSR_DLLPUBLIC std::string pseudo_class_to_string(pseudo_class_t val);
+
+ORCUS_PSR_DLLPUBLIC property_function_t to_property_function(std::string_view s);
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/csv_parser.hpp b/include/orcus/csv_parser.hpp
new file mode 100644
index 0000000..5cb9598
--- /dev/null
+++ b/include/orcus/csv_parser.hpp
@@ -0,0 +1,306 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef ORCUS_CSV_PARSER_HPP
+#define ORCUS_CSV_PARSER_HPP
+
+#include "csv_parser_base.hpp"
+
+namespace orcus {
+
+class csv_handler
+{
+public:
+ /**
+ * Called when the parser starts parsing a stream.
+ */
+ void begin_parse() {}
+
+ /**
+ * Called when the parser finishes parsing a stream.
+ */
+ void end_parse() {}
+
+ /**
+ * Called at the beginning of every row.
+ */
+ void begin_row() {}
+
+ /**
+ * Called at the end of every row.
+ */
+ void end_row() {}
+
+ /**
+ * Called after every cell is parsed.
+ *
+ * @param value cell content.
+ * @param transient when true, the text content has been converted and is
+ * stored in a temporary buffer. In such case, there is
+ * no guarantee that the text content remain available
+ * after the end of the call. When this value is false,
+ * the text content is guaranteed to be valid so long as
+ * the original CSV stream content is valid.
+ */
+ void cell(std::string_view value, bool transient)
+ {
+ (void)value; (void)transient;
+ }
+};
+
+/**
+ * Parser for CSV documents.
+ *
+ * @tparam HandlerT Hanlder type with member functions for event callbacks.
+ * Refer to csv_handler.
+ */
+template<typename HandlerT>
+class csv_parser : public csv::parser_base
+{
+public:
+ typedef HandlerT handler_type;
+
+ csv_parser(std::string_view content, handler_type& hdl, const csv::parser_config& config);
+ void parse();
+
+private:
+
+ // handlers
+ void row();
+ void cell();
+ void quoted_cell();
+
+ void parse_cell_with_quote(const char* p0, size_t len0);
+
+ /**
+ * Push cell value to the handler.
+ */
+ void push_cell_value(const char* p, size_t n);
+
+private:
+ handler_type& m_handler;
+};
+
+template<typename _Handler>
+csv_parser<_Handler>::csv_parser(
+ std::string_view content, handler_type& hdl, const csv::parser_config& config) :
+ csv::parser_base(content, config), m_handler(hdl) {}
+
+template<typename _Handler>
+void csv_parser<_Handler>::parse()
+{
+#if ORCUS_DEBUG_CSV
+ for (const char* p = mp_begin; p < mp_end; ++p)
+ std::cout << *p;
+ std::cout << std::endl;
+#endif
+
+ m_handler.begin_parse();
+ while (has_char())
+ row();
+ m_handler.end_parse();
+}
+
+template<typename _Handler>
+void csv_parser<_Handler>::row()
+{
+ m_handler.begin_row();
+ while (true)
+ {
+ if (is_text_qualifier(cur_char()))
+ quoted_cell();
+ else
+ cell();
+
+ if (!has_char())
+ {
+ m_handler.end_row();
+ return;
+ }
+
+ char c = cur_char();
+ if (c == '\n')
+ {
+ next();
+#if ORCUS_DEBUG_CSV
+ cout << "(LF)" << endl;
+#endif
+ m_handler.end_row();
+ return;
+ }
+
+ if (!is_delim(c))
+ throw orcus::parse_error("expected a delimiter", offset());
+
+ next();
+
+ if (m_config.trim_cell_value)
+ skip_blanks();
+
+ if (!has_char())
+ {
+ m_handler.end_row();
+ return;
+ }
+ }
+}
+
+template<typename _Handler>
+void csv_parser<_Handler>::cell()
+{
+ const char* p = mp_char;
+ size_t len = 0;
+ char c = cur_char();
+ while (c != '\n' && !is_delim(c))
+ {
+ ++len;
+ next();
+ if (!has_char())
+ break;
+ c = cur_char();
+ }
+
+ if (!len)
+ p = nullptr;
+
+ push_cell_value(p, len);
+}
+
+template<typename _Handler>
+void csv_parser<_Handler>::quoted_cell()
+{
+#if ORCUS_DEBUG_CSV
+ cout << "--- quoted cell" << endl;
+#endif
+ char c = cur_char();
+ assert(is_text_qualifier(c));
+ next(); // Skip the opening quote.
+ if (!has_char())
+ return;
+
+ const char* p0 = mp_char;
+ size_t len = 1;
+ for (; has_char(); next(), ++len)
+ {
+ c = cur_char();
+#if ORCUS_DEBUG_CSV
+ cout << "'" << c << "'" << endl;
+#endif
+ if (!is_text_qualifier(c))
+ continue;
+
+ // current char is a quote. Check if the next char is also a text
+ // qualifier.
+
+ if (has_next() && is_text_qualifier(peek_char()))
+ {
+ next();
+ parse_cell_with_quote(p0, len);
+ return;
+ }
+
+ // Closing quote.
+ m_handler.cell({p0, len-1}, false);
+ next();
+ skip_blanks();
+ return;
+ }
+
+ // Stream ended prematurely. Handle it gracefully.
+ m_handler.cell({p0, len}, false);
+}
+
+template<typename _Handler>
+void csv_parser<_Handler>::parse_cell_with_quote(const char* p0, size_t len0)
+{
+#if ORCUS_DEBUG_CSV
+ using namespace std;
+ cout << "--- parse cell with quote" << endl;
+#endif
+ assert(is_text_qualifier(cur_char()));
+
+ // Push the preceding chars to the temp buffer.
+ m_cell_buf.reset();
+ m_cell_buf.append(p0, len0);
+
+ // Parse the rest, until the closing quote.
+ next();
+ const char* p_cur = mp_char;
+ size_t cur_len = 0;
+ for (; has_char(); next(), ++cur_len)
+ {
+ char c = cur_char();
+#if ORCUS_DEBUG_CSV
+ cout << "'" << c << "'" << endl;
+#endif
+ if (!is_text_qualifier(c))
+ continue;
+
+ if (has_next() && is_text_qualifier(peek_char()))
+ {
+ // double quotation. Copy the current segment to the cell buffer.
+ m_cell_buf.append(p_cur, cur_len);
+
+ next(); // to the 2nd quote.
+ p_cur = mp_char;
+ cur_len = 0;
+ continue;
+ }
+
+ // closing quote. Flush the current segment to the cell
+ // buffer, push the value to the handler, and exit normally.
+ m_cell_buf.append(p_cur, cur_len);
+
+ m_handler.cell(m_cell_buf.str(), true);
+ next();
+ skip_blanks();
+ return;
+ }
+
+ // Stream ended prematurely.
+ throw parse_error("stream ended prematurely while parsing quoted cell.", offset());
+}
+
+template<typename _Handler>
+void csv_parser<_Handler>::push_cell_value(const char* p, size_t n)
+{
+ size_t len = n;
+
+ if (m_config.trim_cell_value)
+ {
+ // Trim any leading blanks.
+ for (size_t i = 0; i < n; ++i, --len, ++p)
+ {
+ if (!is_blank(*p))
+ break;
+ }
+
+ // Trim any trailing blanks.
+ if (len)
+ {
+ const char* p_end = p + (len-1);
+ for (; p != p_end; --p_end, --len)
+ {
+ if (!is_blank(*p_end))
+ break;
+ }
+ }
+ }
+
+ m_handler.cell({p, len}, false);
+#if ORCUS_DEBUG_CSV
+ if (len)
+ cout << "(cell:'" << std::string(p, len) << "')" << endl;
+ else
+ cout << "(cell:'')" << endl;
+#endif
+}
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/csv_parser_base.hpp b/include/orcus/csv_parser_base.hpp
new file mode 100644
index 0000000..506d4e5
--- /dev/null
+++ b/include/orcus/csv_parser_base.hpp
@@ -0,0 +1,80 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef CSV_PARSER_BASE_HPP
+#define CSV_PARSER_BASE_HPP
+
+#include "env.hpp"
+#include "cell_buffer.hpp"
+#include "parser_global.hpp"
+#include "parser_base.hpp"
+
+#include <cstdlib>
+#include <cstring>
+#include <exception>
+#include <string>
+#include <cassert>
+#include <sstream>
+
+#define ORCUS_DEBUG_CSV 0
+
+#if ORCUS_DEBUG_CSV
+#include <iostream>
+using std::cout;
+using std::endl;
+#endif
+
+namespace orcus { namespace csv {
+
+/**
+ * Run-time configuration object for csv_parser.
+ */
+struct ORCUS_PSR_DLLPUBLIC parser_config
+{
+ /**
+ * One or more characters that serve as cell boundaries.
+ */
+ std::string delimiters;
+
+ /**
+ * A single character used as a text quote value.
+ */
+ char text_qualifier;
+
+ /**
+ * When true, the value of each cell gets trimmed i.e. any leading or
+ * trailing white spaces will get ignored.
+ */
+ bool trim_cell_value:1;
+
+ parser_config();
+};
+
+class ORCUS_PSR_DLLPUBLIC parser_base : public ::orcus::parser_base
+{
+protected:
+ const csv::parser_config& m_config;
+ cell_buffer m_cell_buf;
+
+protected:
+ parser_base(std::string_view content, const parser_config& config);
+
+ /**
+ * This is different from the global 'is_blank' in that it doesn't treat
+ * linefeed and carriage return characters as non-blanks.
+ */
+ bool is_blank(char c) const;
+ bool is_delim(char c) const;
+ bool is_text_qualifier(char c) const;
+
+ void skip_blanks();
+};
+
+}}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/detail/Makefile.am b/include/orcus/detail/Makefile.am
new file mode 100644
index 0000000..d1d3aee
--- /dev/null
+++ b/include/orcus/detail/Makefile.am
@@ -0,0 +1,7 @@
+
+liborcusdir = $(includedir)/liborcus-@ORCUS_API_VERSION@/orcus/detail
+
+liborcus_HEADERS = \
+ parser_token_buffer.hpp \
+ thread.hpp
+
diff --git a/include/orcus/detail/Makefile.in b/include/orcus/detail/Makefile.in
new file mode 100644
index 0000000..f58c7b1
--- /dev/null
+++ b/include/orcus/detail/Makefile.in
@@ -0,0 +1,662 @@
+# Makefile.in generated by automake 1.16.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2021 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.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+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@
+subdir = include/orcus/detail
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
+ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_17.m4 \
+ $(top_srcdir)/m4/boost.m4 $(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)/m4/m4_ax_valgrind_check.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(liborcus_HEADERS) \
+ $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+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)$(liborcusdir)"
+HEADERS = $(liborcus_HEADERS)
+am__extra_recursive_targets = check-valgrind-recursive \
+ check-valgrind-memcheck-recursive \
+ check-valgrind-helgrind-recursive check-valgrind-drd-recursive \
+ check-valgrind-sgcheck-recursive
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+am__DIST_COMMON = $(srcdir)/Makefile.in
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BOOST_CPPFLAGS = @BOOST_CPPFLAGS@
+BOOST_DATE_TIME_LDFLAGS = @BOOST_DATE_TIME_LDFLAGS@
+BOOST_DATE_TIME_LDPATH = @BOOST_DATE_TIME_LDPATH@
+BOOST_DATE_TIME_LIBS = @BOOST_DATE_TIME_LIBS@
+BOOST_FILESYSTEM_LDFLAGS = @BOOST_FILESYSTEM_LDFLAGS@
+BOOST_FILESYSTEM_LDPATH = @BOOST_FILESYSTEM_LDPATH@
+BOOST_FILESYSTEM_LIBS = @BOOST_FILESYSTEM_LIBS@
+BOOST_IOSTREAMS_LDFLAGS = @BOOST_IOSTREAMS_LDFLAGS@
+BOOST_IOSTREAMS_LDPATH = @BOOST_IOSTREAMS_LDPATH@
+BOOST_IOSTREAMS_LIBS = @BOOST_IOSTREAMS_LIBS@
+BOOST_LDPATH = @BOOST_LDPATH@
+BOOST_PROGRAM_OPTIONS_LDFLAGS = @BOOST_PROGRAM_OPTIONS_LDFLAGS@
+BOOST_PROGRAM_OPTIONS_LDPATH = @BOOST_PROGRAM_OPTIONS_LDPATH@
+BOOST_PROGRAM_OPTIONS_LIBS = @BOOST_PROGRAM_OPTIONS_LIBS@
+BOOST_ROOT = @BOOST_ROOT@
+BOOST_SYSTEM_LDFLAGS = @BOOST_SYSTEM_LDFLAGS@
+BOOST_SYSTEM_LDPATH = @BOOST_SYSTEM_LDPATH@
+BOOST_SYSTEM_LIBS = @BOOST_SYSTEM_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CSCOPE = @CSCOPE@
+CTAGS = @CTAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_VALGRIND_drd = @ENABLE_VALGRIND_drd@
+ENABLE_VALGRIND_helgrind = @ENABLE_VALGRIND_helgrind@
+ENABLE_VALGRIND_memcheck = @ENABLE_VALGRIND_memcheck@
+ENABLE_VALGRIND_sgcheck = @ENABLE_VALGRIND_sgcheck@
+ETAGS = @ETAGS@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+HAVE_CXX17 = @HAVE_CXX17@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+IXION_REQUIRED_API_VERSION = @IXION_REQUIRED_API_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBIXION_CFLAGS = @LIBIXION_CFLAGS@
+LIBIXION_LIBS = @LIBIXION_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MDDS_CFLAGS = @MDDS_CFLAGS@
+MDDS_LIBS = @MDDS_LIBS@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+ORCUS_API_VERSION = @ORCUS_API_VERSION@
+ORCUS_MAJOR_VERSION = @ORCUS_MAJOR_VERSION@
+ORCUS_MICRO_VERSION = @ORCUS_MICRO_VERSION@
+ORCUS_MINOR_VERSION = @ORCUS_MINOR_VERSION@
+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@
+PARQUET_CFLAGS = @PARQUET_CFLAGS@
+PARQUET_LIBS = @PARQUET_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POW_LIB = @POW_LIB@
+PYTHON = @PYTHON@
+PYTHON_CFLAGS = @PYTHON_CFLAGS@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VALGRIND = @VALGRIND@
+VALGRIND_ENABLED = @VALGRIND_ENABLED@
+VERSION = @VERSION@
+ZLIB_CFLAGS = @ZLIB_CFLAGS@
+ZLIB_LIBS = @ZLIB_LIBS@
+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@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+runstatedir = @runstatedir@
+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@
+valgrind_enabled_tools = @valgrind_enabled_tools@
+valgrind_tools = @valgrind_tools@
+liborcusdir = $(includedir)/liborcus-@ORCUS_API_VERSION@/orcus/detail
+liborcus_HEADERS = \
+ parser_token_buffer.hpp \
+ thread.hpp
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/orcus/detail/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign include/orcus/detail/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-liborcusHEADERS: $(liborcus_HEADERS)
+ @$(NORMAL_INSTALL)
+ @list='$(liborcus_HEADERS)'; test -n "$(liborcusdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(liborcusdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(liborcusdir)" || 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)$(liborcusdir)'"; \
+ $(INSTALL_HEADER) $$files "$(DESTDIR)$(liborcusdir)" || exit $$?; \
+ done
+
+uninstall-liborcusHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(liborcus_HEADERS)'; test -n "$(liborcusdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(liborcusdir)'; $(am__uninstall_files_from_dir)
+check-valgrind-local:
+check-valgrind-memcheck-local:
+check-valgrind-helgrind-local:
+check-valgrind-drd-local:
+check-valgrind-sgcheck-local:
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ 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-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ 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"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @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
+check-am: all-am
+check: check-am
+all-am: Makefile $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(liborcusdir)"; 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:
+
+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)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+check-valgrind: check-valgrind-am
+
+check-valgrind-am: check-valgrind-local
+
+check-valgrind-drd: check-valgrind-drd-am
+
+check-valgrind-drd-am: check-valgrind-drd-local
+
+check-valgrind-helgrind: check-valgrind-helgrind-am
+
+check-valgrind-helgrind-am: check-valgrind-helgrind-local
+
+check-valgrind-memcheck: check-valgrind-memcheck-am
+
+check-valgrind-memcheck-am: check-valgrind-memcheck-local
+
+check-valgrind-sgcheck: check-valgrind-sgcheck-am
+
+check-valgrind-sgcheck-am: check-valgrind-sgcheck-local
+
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-liborcusHEADERS
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+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 Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-liborcusHEADERS
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am check-valgrind-am \
+ check-valgrind-drd-am check-valgrind-drd-local \
+ check-valgrind-helgrind-am check-valgrind-helgrind-local \
+ check-valgrind-local check-valgrind-memcheck-am \
+ check-valgrind-memcheck-local check-valgrind-sgcheck-am \
+ check-valgrind-sgcheck-local clean clean-generic clean-libtool \
+ cscopelist-am ctags ctags-am distclean distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am 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-liborcusHEADERS install-man \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags tags-am uninstall uninstall-am uninstall-liborcusHEADERS
+
+.PRECIOUS: Makefile
+
+
+# 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/include/orcus/detail/parser_token_buffer.hpp b/include/orcus/detail/parser_token_buffer.hpp
new file mode 100644
index 0000000..3b13bec
--- /dev/null
+++ b/include/orcus/detail/parser_token_buffer.hpp
@@ -0,0 +1,188 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_DETAIL_THREAD_PARSER_TOKEN_BUFFER_HPP
+#define INCLUDED_ORCUS_DETAIL_THREAD_PARSER_TOKEN_BUFFER_HPP
+
+#include "orcus/exception.hpp"
+
+#include <mutex>
+#include <condition_variable>
+
+namespace orcus { namespace detail { namespace thread {
+
+/**
+ * Class that manages synchronization of parser tokens used in
+ * multi-threaded parsers.
+ */
+template<typename _TokensT>
+class parser_token_buffer
+{
+ enum class state_type { parsing_progress, parsing_ended, parsing_aborted };
+
+ typedef _TokensT tokens_type;
+
+ mutable std::mutex m_mtx_tokens;
+ std::condition_variable m_cv_tokens_empty;
+ std::condition_variable m_cv_tokens_ready;
+
+ tokens_type m_tokens; // token buffer used to hand over tokens to the client.
+
+ size_t m_token_size_threshold;
+ const size_t m_max_token_size;
+
+ state_type m_state;
+
+ bool tokens_empty() const
+ {
+ std::lock_guard<std::mutex> lock(m_mtx_tokens);
+ return m_tokens.empty();
+ }
+
+ /**
+ * Only to be called from the parser thread.
+ *
+ * Wait until the processor thread takes the new tokens and makes the
+ * token buffer empty.
+ */
+ void wait_until_tokens_empty()
+ {
+ std::unique_lock<std::mutex> lock(m_mtx_tokens);
+ while (!m_tokens.empty() && m_state == state_type::parsing_progress)
+ m_cv_tokens_empty.wait(lock);
+
+ if (m_state == state_type::parsing_aborted)
+ throw detail::parsing_aborted_error();
+ }
+
+public:
+
+ parser_token_buffer(size_t min_token_size, size_t max_token_size) :
+ m_token_size_threshold(std::max<size_t>(min_token_size, 1)),
+ m_max_token_size(max_token_size),
+ m_state(state_type::parsing_progress)
+ {
+ if (m_token_size_threshold > m_max_token_size)
+ throw invalid_arg_error(
+ "initial token size threshold is already larger than the max token size.");
+ }
+
+ /**
+ * Check the size of the parser token buffer, and if it exceeds specified
+ * threshold, move it to the client buffer.
+ *
+ * Call this from the parser thread.
+ *
+ * @param parser_tokens parser token buffer.
+ */
+ void check_and_notify(tokens_type& parser_tokens)
+ {
+ if (parser_tokens.size() < m_token_size_threshold)
+ // Still below the threshold.
+ return;
+
+ if (!tokens_empty())
+ {
+ if (m_token_size_threshold < (m_max_token_size/2))
+ {
+ // Double the threshold and continue to parse.
+ m_token_size_threshold *= 2;
+ return;
+ }
+
+ // We cannot increase the threshold any more. Wait for the
+ // client to finish.
+ wait_until_tokens_empty();
+ }
+
+ std::unique_lock<std::mutex> lock(m_mtx_tokens);
+ m_tokens.swap(parser_tokens);
+ lock.unlock();
+ m_cv_tokens_ready.notify_one();
+ }
+
+ /**
+ * Move the current parser token buffer to the client buffer, and signal
+ * the end of parsing.
+ *
+ * Call this from the parser thread.
+ *
+ * @param parser_tokens parser token buffer.
+ */
+ void notify_and_finish(tokens_type& parser_tokens)
+ {
+ // Wait until the client tokens get used up.
+ wait_until_tokens_empty();
+
+ {
+ std::lock_guard<std::mutex> lock(m_mtx_tokens);
+ m_tokens.swap(parser_tokens);
+ m_state = state_type::parsing_ended;
+ }
+ m_cv_tokens_ready.notify_one();
+ }
+
+ void abort()
+ {
+ {
+ std::lock_guard<std::mutex> lock(m_mtx_tokens);
+ m_tokens.clear();
+ m_state = state_type::parsing_aborted;
+ }
+ m_cv_tokens_empty.notify_one();
+ }
+
+ /**
+ * Retrieve the tokens currently in the client token buffer.
+ *
+ * Call this from the client (non-parser) thread.
+ *
+ * @param tokens place to move the tokens in the client token buffer to.
+ *
+ * @return true if the parsing is still in progress, therefore more tokens
+ * are expected, false if this is the last set of tokens.
+ */
+ bool next_tokens(tokens_type& tokens)
+ {
+ tokens.clear();
+
+ // Wait until the parser passes a new set of tokens.
+ std::unique_lock<std::mutex> lock(m_mtx_tokens);
+ while (m_tokens.empty() && m_state == state_type::parsing_progress)
+ m_cv_tokens_ready.wait(lock);
+
+ // Get the new tokens and notify the parser.
+ tokens.swap(m_tokens);
+ state_type parsing_progress = m_state; // Make a copy so that lock can be released safely.
+
+ lock.unlock();
+
+ m_cv_tokens_empty.notify_one();
+
+ return parsing_progress == state_type::parsing_progress;
+ }
+
+ /**
+ * Return the current token size threshold. Call this only after the
+ * parsing has finished.
+ *
+ * @return current token size threshold.
+ */
+ size_t token_size_threshold() const
+ {
+ if (m_state == state_type::parsing_progress)
+ return 0;
+
+ return m_token_size_threshold;
+ }
+};
+
+}}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/detail/thread.hpp b/include/orcus/detail/thread.hpp
new file mode 100644
index 0000000..2d63dbd
--- /dev/null
+++ b/include/orcus/detail/thread.hpp
@@ -0,0 +1,35 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_DETAIL_THREAD_HPP
+#define INCLUDED_ORCUS_DETAIL_THREAD_HPP
+
+#include <thread>
+
+namespace orcus { namespace detail { namespace thread {
+
+class scoped_guard
+{
+ std::thread m_thread;
+public:
+ scoped_guard(std::thread thread) : m_thread(std::move(thread)) {}
+ scoped_guard(scoped_guard&& other) : m_thread(std::move(other.m_thread)) {}
+
+ scoped_guard(const scoped_guard&) = delete;
+ scoped_guard& operator= (const scoped_guard&) = delete;
+
+ ~scoped_guard()
+ {
+ m_thread.join();
+ }
+};
+
+}}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/dom_tree.hpp b/include/orcus/dom_tree.hpp
new file mode 100644
index 0000000..68df0d0
--- /dev/null
+++ b/include/orcus/dom_tree.hpp
@@ -0,0 +1,134 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_DOM_TREE_HPP
+#define INCLUDED_ORCUS_DOM_TREE_HPP
+
+#include "types.hpp"
+
+#include <vector>
+#include <ostream>
+#include <memory>
+
+namespace orcus {
+
+class xmlns_context;
+
+namespace sax {
+
+struct doctype_declaration;
+
+}
+
+namespace dom {
+
+class document_tree;
+
+enum class node_t : uint8_t
+{
+ unset,
+ declaration,
+ element,
+};
+
+struct ORCUS_DLLPUBLIC entity_name
+{
+ xmlns_id_t ns;
+ std::string_view name;
+
+ entity_name();
+ entity_name(std::string_view _name);
+ entity_name(xmlns_id_t _ns, std::string_view _name);
+
+ bool operator== (const entity_name& other) const;
+ bool operator!= (const entity_name& other) const;
+};
+
+class ORCUS_DLLPUBLIC const_node
+{
+ friend class document_tree;
+
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+ const_node(std::unique_ptr<impl>&& _impl);
+public:
+ const_node();
+ const_node(const const_node& other);
+ const_node(const_node&& other);
+
+ ~const_node();
+
+ node_t type() const;
+
+ size_t child_count() const;
+
+ const_node child(size_t index) const;
+
+ entity_name name() const;
+
+ std::string_view attribute(const entity_name& name) const;
+ std::string_view attribute(std::string_view name) const;
+
+ size_t attribute_count() const;
+
+ const_node parent() const;
+
+ void swap(const_node& other);
+
+ const_node& operator= (const const_node& other);
+
+ bool operator== (const const_node& other) const;
+ bool operator!= (const const_node& other) const;
+};
+
+/**
+ * Ordinary DOM tree representing the content of an XML document.
+ */
+class ORCUS_DLLPUBLIC document_tree
+{
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+public:
+ document_tree(const document_tree&) = delete;
+ document_tree& operator= (const document_tree&) = delete;
+
+ document_tree(xmlns_context& cxt);
+ document_tree(document_tree&& other);
+ ~document_tree();
+
+ /**
+ * Parse a given XML stream and build the content tree.
+ *
+ * @param strm XML stream.
+ */
+ void load(std::string_view strm);
+
+ dom::const_node root() const;
+
+ dom::const_node declaration(std::string_view name) const;
+
+ /**
+ * Swap the content with another dom_tree instance.
+ *
+ * @param other the dom_tree instance to swap the content with.
+ */
+ void swap(document_tree& other);
+
+ const sax::doctype_declaration* get_doctype() const;
+
+ void dump_compact(std::ostream& os) const;
+};
+
+} // namespace dom
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/env.hpp b/include/orcus/env.hpp
new file mode 100644
index 0000000..47dc153
--- /dev/null
+++ b/include/orcus/env.hpp
@@ -0,0 +1,141 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef __ORCUS_ENV_HPP__
+#define __ORCUS_ENV_HPP__
+
+// orcus
+
+#if defined _WIN32 || defined __CYGWIN__
+ #if defined __MINGW32__
+ #define ORCUS_DLLPUBLIC
+ #define ORCUS_DLLLOCAL
+ #elif defined __ORCUS_BUILDING_DLL
+ #ifdef __GNUC__
+ #define ORCUS_DLLPUBLIC __attribute__ ((dllexport))
+ #else
+ #define ORCUS_DLLPUBLIC __declspec(dllexport)
+ #endif
+ #elif defined __ORCUS_STATIC_LIB
+ #define ORCUS_DLLPUBLIC
+ #else
+ #ifdef __GNUC__
+ #define ORCUS_DLLPUBLIC __attribute__ ((dllimport))
+ #else
+ #define ORCUS_DLLPUBLIC __declspec(dllimport)
+ #endif
+ #endif
+ #define ORCUS_DLLLOCAL
+#else
+ #if __GNUC__ >= 4
+ #define ORCUS_DLLPUBLIC __attribute__ ((visibility ("default")))
+ #define ORCUS_DLLLOCAL __attribute__ ((visibility ("hidden")))
+ #else
+ #define ORCUS_DLLPUBLIC
+ #define ORCUS_DLLLOCAL
+ #endif
+#endif
+
+// orcus-parser
+
+#if defined _WIN32 || defined __CYGWIN__
+ #if defined __MINGW32__
+ #define ORCUS_PSR_DLLPUBLIC
+ #define ORCUS_PSR_DLLLOCAL
+ #elif defined __ORCUS_PSR_BUILDING_DLL
+ #ifdef __GNUC__
+ #define ORCUS_PSR_DLLPUBLIC __attribute__ ((dllexport))
+ #else
+ #define ORCUS_PSR_DLLPUBLIC __declspec(dllexport)
+ #endif
+ #elif defined __ORCUS_PSR_STATIC_LIB
+ #define ORCUS_PSR_DLLPUBLIC
+ #else
+ #ifdef __GNUC__
+ #define ORCUS_PSR_DLLPUBLIC __attribute__ ((dllimport))
+ #else
+ #define ORCUS_PSR_DLLPUBLIC __declspec(dllimport)
+ #endif
+ #endif
+ #define ORCUS_PSR_DLLLOCAL
+#else
+ #if __GNUC__ >= 4
+ #define ORCUS_PSR_DLLPUBLIC __attribute__ ((visibility ("default")))
+ #define ORCUS_PSR_DLLLOCAL __attribute__ ((visibility ("hidden")))
+ #else
+ #define ORCUS_PSR_DLLPUBLIC
+ #define ORCUS_PSR_DLLLOCAL
+ #endif
+#endif
+
+// orcus-spreadsheet-model
+
+#if defined _WIN32 || defined __CYGWIN__
+ #if defined __MINGW32__
+ #define ORCUS_SPM_DLLPUBLIC
+ #define ORCUS_SPM_DLLLOCAL
+ #elif defined __ORCUS_SPM_BUILDING_DLL
+ #ifdef __GNUC__
+ #define ORCUS_SPM_DLLPUBLIC __attribute__ ((dllexport))
+ #else
+ #define ORCUS_SPM_DLLPUBLIC __declspec(dllexport)
+ #endif
+ #elif defined __ORCUS_SPM_STATIC_LIB
+ #define ORCUS_SPM_DLLPUBLIC
+ #else
+ #ifdef __GNUC__
+ #define ORCUS_SPM_DLLPUBLIC __attribute__ ((dllimport))
+ #else
+ #define ORCUS_SPM_DLLPUBLIC __declspec(dllimport)
+ #endif
+ #endif
+ #define ORCUS_SPM_DLLLOCAL
+#else
+ #if __GNUC__ >= 4
+ #define ORCUS_SPM_DLLPUBLIC __attribute__ ((visibility ("default")))
+ #define ORCUS_SPM_DLLLOCAL __attribute__ ((visibility ("hidden")))
+ #else
+ #define ORCUS_SPM_DLLPUBLIC
+ #define ORCUS_SPM_DLLLOCAL
+ #endif
+#endif
+
+// orcus-mso
+
+#if defined _WIN32 || defined __CYGWIN__
+ #if defined __MINGW32__
+ #define ORCUS_MSO_DLLPUBLIC
+ #define ORCUS_MSO_DLLLOCAL
+ #elif defined __ORCUS_MSO_BUILDING_DLL
+ #ifdef __GNUC__
+ #define ORCUS_MSO_DLLPUBLIC __attribute__ ((dllexport))
+ #else
+ #define ORCUS_MSO_DLLPUBLIC __declspec(dllexport)
+ #endif
+ #elif defined __ORCUS_MSO_STATIC_LIB
+ #define ORCUS_MSO_DLLPUBLIC
+ #else
+ #ifdef __GNUC__
+ #define ORCUS_MSO_DLLPUBLIC __attribute__ ((dllimport))
+ #else
+ #define ORCUS_MSO_DLLPUBLIC __declspec(dllimport)
+ #endif
+ #endif
+ #define ORCUS_MSO_DLLLOCAL
+#else
+ #if __GNUC__ >= 4
+ #define ORCUS_MSO_DLLPUBLIC __attribute__ ((visibility ("default")))
+ #define ORCUS_MSO_DLLLOCAL __attribute__ ((visibility ("hidden")))
+ #else
+ #define ORCUS_MSO_DLLPUBLIC
+ #define ORCUS_MSO_DLLLOCAL
+ #endif
+#endif
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/exception.hpp b/include/orcus/exception.hpp
new file mode 100644
index 0000000..5d1aa82
--- /dev/null
+++ b/include/orcus/exception.hpp
@@ -0,0 +1,152 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_EXCEPTION_HPP
+#define INCLUDED_ORCUS_EXCEPTION_HPP
+
+#include <stdexcept>
+#include <string>
+
+#include "env.hpp"
+
+namespace orcus {
+
+class ORCUS_PSR_DLLPUBLIC general_error : public std::exception
+{
+public:
+ explicit general_error(std::string msg);
+ explicit general_error(std::string_view cls, std::string_view msg);
+ virtual ~general_error() noexcept;
+ virtual const char* what() const noexcept;
+
+protected:
+ void append_msg(const std::string& s);
+
+private:
+ std::string m_msg;
+};
+
+class ORCUS_PSR_DLLPUBLIC invalid_arg_error : public std::invalid_argument
+{
+public:
+ explicit invalid_arg_error(const std::string& msg);
+ virtual ~invalid_arg_error() noexcept;
+};
+
+class ORCUS_PSR_DLLPUBLIC xml_structure_error : public general_error
+{
+public:
+ explicit xml_structure_error(std::string msg);
+ virtual ~xml_structure_error() noexcept;
+};
+
+class ORCUS_PSR_DLLPUBLIC json_structure_error : public general_error
+{
+public:
+ explicit json_structure_error(std::string msg);
+ virtual ~json_structure_error() noexcept;
+};
+
+class ORCUS_PSR_DLLPUBLIC invalid_map_error : public general_error
+{
+public:
+ explicit invalid_map_error(std::string msg);
+ virtual ~invalid_map_error() noexcept;
+};
+
+class ORCUS_PSR_DLLPUBLIC value_error : public general_error
+{
+public:
+ explicit value_error(std::string msg);
+ virtual ~value_error() noexcept;
+};
+
+/**
+ * Error indicating improper xpath syntax.
+ */
+class ORCUS_PSR_DLLPUBLIC xpath_error : public general_error
+{
+public:
+ xpath_error(std::string msg);
+ virtual ~xpath_error() noexcept;
+};
+
+/**
+ * This gets thrown when a public interface method is expected to return a
+ * non-null pointer to another interface but actually returns a null pointer.
+ */
+class ORCUS_PSR_DLLPUBLIC interface_error : public general_error
+{
+public:
+ interface_error(std::string msg);
+ virtual ~interface_error() noexcept;
+};
+
+/**
+ * Exception related to a parsing error that includes an offset in the stream
+ * where the error occurred.
+ */
+class ORCUS_PSR_DLLPUBLIC parse_error : public general_error
+{
+ std::ptrdiff_t m_offset; /// offset in the stream where the error occurred.
+
+protected:
+ parse_error(std::string_view cls, std::string_view msg, std::ptrdiff_t offset);
+
+public:
+ parse_error(std::string msg, std::ptrdiff_t offset);
+
+ /**
+ * Get the offset in a stream associated with the error.
+ *
+ * @return offset in a stream where the error occurred.
+ */
+ std::ptrdiff_t offset() const;
+
+ static void throw_with(
+ std::string_view msg_before, char c, std::string_view msg_after, std::ptrdiff_t offset);
+
+ static void throw_with(
+ std::string_view msg_before, std::string_view msg, std::string_view msg_after, std::ptrdiff_t offset);
+};
+
+/**
+ * This exception is thrown when SAX parser detects a malformed XML document.
+ */
+class ORCUS_PSR_DLLPUBLIC malformed_xml_error : public parse_error
+{
+public:
+ malformed_xml_error() = delete;
+ malformed_xml_error(std::string_view msg, std::ptrdiff_t offset);
+ virtual ~malformed_xml_error();
+};
+
+/**
+ * Exception related to parsing of zip archive stream.
+ */
+class ORCUS_PSR_DLLPUBLIC zip_error : public general_error
+{
+public:
+ zip_error(std::string_view msg);
+ virtual ~zip_error();
+};
+
+namespace detail {
+
+/**
+ * Internal error used in multi-threaded parsing to signal that the parser
+ * thread has been aborted.
+ */
+class ORCUS_PSR_DLLPUBLIC parsing_aborted_error : public std::exception {};
+
+}
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/format_detection.hpp b/include/orcus/format_detection.hpp
new file mode 100644
index 0000000..f4754bc
--- /dev/null
+++ b/include/orcus/format_detection.hpp
@@ -0,0 +1,52 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef ORCUS_FORMAT_DETECTION_HPP
+#define ORCUS_FORMAT_DETECTION_HPP
+
+#include <orcus/env.hpp>
+#include <orcus/types.hpp>
+
+#include <cstdlib>
+#include <memory>
+
+namespace orcus {
+
+namespace iface {
+
+class import_filter;
+
+}
+
+namespace spreadsheet { namespace iface {
+
+class import_factory;
+
+}}
+
+/**
+ * Detect the format of a given document stream.
+ *
+ * @param strm document stream to detect the format of.
+ */
+ORCUS_DLLPUBLIC format_t detect(std::string_view strm);
+
+/**
+ * Create an instance of import_filter for a specified format.
+ *
+ * @param type Format type to create an instace of import_filter of.
+ * @param factory Pointer to an import factory instance. It must not be null.
+ *
+ * @return Pointer to an instance of import_filter for specified format.
+ */
+ORCUS_DLLPUBLIC std::shared_ptr<iface::import_filter> create_filter(
+ format_t type, spreadsheet::iface::import_factory* factory);
+
+} // namespace orcus
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/info.hpp b/include/orcus/info.hpp
new file mode 100644
index 0000000..61866fa
--- /dev/null
+++ b/include/orcus/info.hpp
@@ -0,0 +1,22 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_INFO_HPP
+
+#include "orcus/env.hpp"
+
+namespace orcus {
+
+ORCUS_DLLPUBLIC int get_version_major();
+ORCUS_DLLPUBLIC int get_version_minor();
+ORCUS_DLLPUBLIC int get_version_micro();
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/interface.hpp b/include/orcus/interface.hpp
new file mode 100644
index 0000000..b08a9ee
--- /dev/null
+++ b/include/orcus/interface.hpp
@@ -0,0 +1,92 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_INTERFACE_HPP
+#define INCLUDED_ORCUS_INTERFACE_HPP
+
+#include "orcus/env.hpp"
+#include "orcus/types.hpp"
+
+#include <string>
+#include <memory>
+
+namespace orcus {
+
+struct config;
+
+namespace iface {
+
+/**
+ * Base interface for import filters.
+ */
+class ORCUS_DLLPUBLIC import_filter
+{
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+public:
+ import_filter(format_t input);
+ virtual ~import_filter();
+
+ /**
+ * Read the content of a file.
+ *
+ * @param filepath path to a local file. It must be a system path.
+ */
+ virtual void read_file(std::string_view filepath) = 0;
+
+ /**
+ * Read the content of an in-memory stream.
+ *
+ * @param stream in-memory stream to read from.
+ */
+ virtual void read_stream(std::string_view stream) = 0;
+
+ /**
+ * Get the name of a filter.
+ *
+ * @return name of a filter.
+ */
+ virtual std::string_view get_name() const = 0;
+
+ void set_config(const orcus::config& v);
+ const orcus::config& get_config() const;
+};
+
+/**
+ * Base interface for document content dumpers.
+ */
+class ORCUS_DLLPUBLIC document_dumper
+{
+public:
+ virtual ~document_dumper();
+
+ /**
+ * Dump the content of a document in a specified format, either into set of
+ * multiple files, or a single file.
+ *
+ * @param format Output format type in which to dump the content.
+ * @param output Depending on the output format type, this can be either an
+ * output directory path where multiple output files get
+ * created, or an output file path where the content of the
+ * entire document gets dumped into.
+ */
+ virtual void dump(dump_format_t format, const std::string& output) const = 0;
+
+ /**
+ * Dump the content of a document in a specialized "check" format suitable
+ * for content verification.
+ *
+ * @param os output stream to write the transformed content to.
+ */
+ virtual void dump_check(std::ostream& os) const = 0;
+};
+
+}}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/json_document_tree.hpp b/include/orcus/json_document_tree.hpp
new file mode 100644
index 0000000..e558c38
--- /dev/null
+++ b/include/orcus/json_document_tree.hpp
@@ -0,0 +1,504 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_JSON_DOCUMENT_TREE_HPP
+#define INCLUDED_ORCUS_JSON_DOCUMENT_TREE_HPP
+
+#include "env.hpp"
+#include "exception.hpp"
+
+#include <string>
+#include <memory>
+#include <vector>
+
+namespace orcus {
+
+struct json_config;
+
+namespace json {
+
+struct json_value;
+struct document_resource;
+class document_tree;
+
+/**
+ * Exception related to JSON document tree construction.
+ */
+class ORCUS_DLLPUBLIC document_error : public general_error
+{
+public:
+ document_error(const std::string& msg);
+ virtual ~document_error();
+};
+
+/**
+ * Exception that gets thrown due to ambiguity when you specify a braced
+ * list that can be interpreted either as a key-value pair inside an object
+ * or as values of an array.
+ */
+class ORCUS_DLLPUBLIC key_value_error : public document_error
+{
+public:
+ key_value_error(const std::string& msg);
+ virtual ~key_value_error();
+};
+
+enum class node_t : uint8_t
+{
+ /** node type is not set. */
+ unset = 0,
+ /** JSON string node. A node of this type contains a string value. */
+ string = 1,
+ /** JSON number node. A node of this type contains a numeric value. */
+ number = 2,
+ /**
+ * JSON object node. A node of this type contains one or more key-value
+ * pairs.
+ */
+ object = 3,
+ /**
+ * JSON array node. A node of this type contains one or more child nodes.
+ */
+ array = 4,
+ /**
+ * JSON boolean node containing a value of 'true'.
+ */
+ boolean_true = 5,
+ /**
+ * JSON boolean node containing a value of 'false'.
+ */
+ boolean_false = 6,
+ /**
+ * JSON node containing a 'null' value.
+ */
+ null = 7,
+};
+
+namespace detail { namespace init { class node; }}
+
+class const_node;
+class document_tree;
+
+class ORCUS_DLLPUBLIC const_node_iterator
+{
+ friend class const_node;
+
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+ const_node_iterator(const document_tree* doc, const const_node& v, bool begin);
+
+public:
+ const_node_iterator();
+ const_node_iterator(const const_node_iterator& other);
+ ~const_node_iterator();
+
+ const const_node& operator*() const;
+ const const_node* operator->() const;
+
+ const_node_iterator& operator++();
+ const_node_iterator operator++(int);
+
+ const_node_iterator& operator--();
+ const_node_iterator operator--(int);
+
+ bool operator== (const const_node_iterator& other) const;
+ bool operator!= (const const_node_iterator& other) const;
+
+ const_node_iterator& operator= (const const_node_iterator& other);
+};
+
+/**
+ * Each node instance represents a JSON value stored in the document tree.
+ * It's immutable.
+ */
+class ORCUS_DLLPUBLIC const_node
+{
+ friend class document_tree;
+ friend class const_node_iterator;
+
+protected:
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+ const_node(const document_tree* doc, json_value* jv);
+ const_node(std::unique_ptr<impl>&& p);
+public:
+ const_node() = delete;
+
+ const_node(const const_node& other);
+ const_node(const_node&& rhs);
+ ~const_node();
+
+ /**
+ * Get the type of a node.
+ *
+ * @return node type.
+ */
+ node_t type() const;
+
+ /**
+ * Get the number of child nodes if any.
+ *
+ * @return number of child nodes.
+ */
+ size_t child_count() const;
+
+ /**
+ * Get a list of keys stored in a JSON object node.
+ *
+ * @exception orcus::json::document_error if the node is not of the object
+ * type.
+ * @return a list of keys.
+ */
+ std::vector<std::string_view> keys() const;
+
+ /**
+ * Get the key by index in a JSON object node. This method works only
+ * when the <b>preserve object order</b> option is set.
+ *
+ * @param index 0-based key index.
+ *
+ * @exception orcus::json::document_error if the node is not of the object
+ * type.
+ *
+ * @exception std::out_of_range if the index is equal to or greater than
+ * the number of keys stored in the node.
+ *
+ * @return key value.
+ */
+ std::string_view key(size_t index) const;
+
+ /**
+ * Query whether or not a particular key exists in a JSON object node.
+ *
+ * @param key key value.
+ *
+ * @return true if this object node contains the specified key, otherwise
+ * false. If this node is not of a JSON object type, false is
+ * returned.
+ */
+ bool has_key(std::string_view key) const;
+ /**
+ * Get a child node by index.
+ *
+ * @param index 0-based index of a child node.
+ *
+ * @exception orcus::json::document_error if the node is not one of the
+ * object or array types.
+ *
+ * @exception std::out_of_range if the index is equal to or greater than
+ * the number of child nodes that the node has.
+ *
+ * @return child node instance.
+ */
+ const_node child(size_t index) const;
+
+ /**
+ * Get a child node by textural key value.
+ *
+ * @param key textural key value to get a child node by.
+ *
+ * @exception orcus::json::document_error if the node is not of the object
+ * type, or the node doesn't have the specified key.
+ *
+ * @return child node instance.
+ */
+ const_node child(std::string_view key) const;
+
+ /**
+ * Get the parent node.
+ *
+ * @exception orcus::json::document_error if the node doesn't have a parent
+ * node which implies that the node is a root node.
+ *
+ * @return parent node instance.
+ */
+ const_node parent() const;
+
+ /**
+ * Get the last child node.
+ *
+ * @exception orcus::json::document_error if the node is not of array type
+ * or node has no children.
+ *
+ * @return last child node instance.
+ */
+ const_node back() const;
+
+ /**
+ * Get the string value of a JSON string node.
+ *
+ * @exception orcus::json::document_error if the node is not of the string
+ * type.
+ *
+ * @return string value.
+ */
+ std::string_view string_value() const;
+
+ /**
+ * Get the numeric value of a JSON number node.
+ *
+ * @exception orcus::json::document_error if the node is not of the number
+ * type.
+ *
+ * @return numeric value.
+ */
+ double numeric_value() const;
+
+ const_node& operator=(const const_node& other);
+ const_node& operator=(const_node&& other);
+
+ /**
+ * Return an indentifier of the JSON value object that the node
+ * represents. The identifier is derived directly from the memory address
+ * of the value object.
+ *
+ * @return identifier of the JSON value object.
+ */
+ uintptr_t identity() const;
+
+ const_node_iterator begin() const;
+ const_node_iterator end() const;
+};
+
+/**
+ * Each node instance represents a JSON value stored in the document tree.
+ * This class allows mutable operations.
+ */
+class ORCUS_DLLPUBLIC node : public const_node
+{
+ friend class document_tree;
+
+ node(const document_tree* doc, json_value* jv);
+ node(const_node&& rhs);
+
+public:
+ node() = delete;
+
+ node(const node& other);
+ node(node&& rhs);
+ ~node();
+
+ node& operator=(const node& other);
+ node& operator=(const detail::init::node& v);
+ node operator[](std::string_view key);
+
+ /**
+ * Get a child node by index.
+ *
+ * @param index 0-based index of a child node.
+ *
+ * @exception orcus::json::document_error if the node is not one of the
+ * object or array types.
+ *
+ * @exception std::out_of_range if the index is equal to or greater than
+ * the number of child nodes that the node has.
+ *
+ * @return child node instance.
+ */
+ node child(size_t index);
+
+ /**
+ * Get a child node by textural key value.
+ *
+ * @param key textural key value to get a child node by.
+ *
+ * @exception orcus::json::document_error if the node is not of the object
+ * type, or the node doesn't have the specified key.
+ *
+ * @return child node instance.
+ */
+ node child(std::string_view key);
+
+ /**
+ * Get the parent node.
+ *
+ * @exception orcus::json::document_error if the node doesn't have a parent
+ * node which implies that the node is a root node.
+ *
+ * @return parent node instance.
+ */
+ node parent();
+
+ /**
+ * Get the last child node.
+ *
+ * @exception orcus::json::document_error if the node is not of array type
+ * or node has no children.
+ *
+ * @return last child node instance.
+ */
+ node back();
+
+ /**
+ * Append a new node value to the end of the array.
+ *
+ * @exception orcus::json::document_error if the node is not of array
+ * type.
+ * @param v new node value to append to the end of the array.
+ */
+ void push_back(const detail::init::node& v);
+};
+
+/**
+ * This class represents a JSON array, to be used to explicitly create an
+ * array instance during initialization.
+ */
+class ORCUS_DLLPUBLIC array
+{
+ friend class detail::init::node;
+ friend class document_tree;
+
+ std::vector<detail::init::node> m_vs;
+public:
+ array();
+ array(const array&) = delete;
+ array(array&& other);
+ array(std::initializer_list<detail::init::node> vs);
+ ~array();
+};
+
+/**
+ * This class represents a JSON object, primarily to be used to create an
+ * empty object instance.
+ */
+class ORCUS_DLLPUBLIC object
+{
+public:
+ object();
+ object(const object&) = delete;
+ object(object&& other);
+ ~object();
+};
+
+namespace detail { namespace init {
+
+/**
+ * Node to store an initial value during document tree initialization. It's
+ * not meant to be instantiated explicitly. A value passed from the braced
+ * initialization list is implicitly converted to an instance of this class.
+ */
+class ORCUS_DLLPUBLIC node
+{
+ friend class ::orcus::json::document_tree;
+ friend class ::orcus::json::node;
+
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+public:
+ node(double v);
+ node(int v);
+ node(bool b);
+ node(std::nullptr_t);
+ node(const char* p);
+ node(const std::string& s);
+ node(std::initializer_list<detail::init::node> vs);
+ node(json::array array);
+ node(json::object obj);
+
+ node(const node& other) = delete;
+ node(node&& other);
+ ~node();
+
+ node& operator= (node other) = delete;
+
+private:
+ node_t type() const;
+ json_value* to_json_value(document_resource& res) const;
+ void store_to_node(document_resource& res, json_value* parent) const;
+};
+
+}}
+
+/**
+ * This class stores a parsed JSON document tree structure.
+ */
+class ORCUS_DLLPUBLIC document_tree
+{
+ friend class const_node;
+ friend class node;
+
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+ const document_resource& get_resource() const;
+
+public:
+ document_tree();
+ document_tree(const document_tree&) = delete;
+ document_tree(document_tree&& other);
+ document_tree(document_resource& res);
+ document_tree(std::initializer_list<detail::init::node> vs);
+ document_tree(array vs);
+ document_tree(object obj);
+ ~document_tree();
+
+ document_tree& operator= (std::initializer_list<detail::init::node> vs);
+ document_tree& operator= (array vs);
+ document_tree& operator= (object obj);
+
+ /**
+ * Load raw string stream containing a JSON structure to populate the
+ * document tree.
+ *
+ * @param stream stream containing a JSON structure.
+ * @param config configuration object.
+ */
+ void load(std::string_view stream, const json_config& config);
+
+ /**
+ * Get the root node of the document.
+ *
+ * @return root node of the document.
+ */
+ json::const_node get_document_root() const;
+
+ /**
+ * Get the root node of the document.
+ *
+ * @return root node of the document.
+ */
+ json::node get_document_root();
+
+ /**
+ * Dump the JSON document tree to string.
+ *
+ * @return a string representation of the JSON document tree.
+ */
+ std::string dump() const;
+
+ /**
+ * Dump the JSON document tree to an XML structure.
+ *
+ * @return a string containing an XML structure representing the JSON
+ * content.
+ */
+ std::string dump_xml() const;
+
+ /**
+ * Dump the JSON document tree as YAML output.
+ *
+ * @return string containing a YAML output representing the JSON document
+ * tree structure.
+ */
+ std::string dump_yaml() const;
+
+ /**
+ * Swap the content of the document with another document instance.
+ *
+ * @param other document instance to swap the content with.
+ */
+ void swap(document_tree& other);
+};
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/json_global.hpp b/include/orcus/json_global.hpp
new file mode 100644
index 0000000..8c3a6e7
--- /dev/null
+++ b/include/orcus/json_global.hpp
@@ -0,0 +1,30 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_JSON_GLOBAL_HPP
+#define INCLUDED_ORCUS_JSON_GLOBAL_HPP
+
+#include "orcus/env.hpp"
+
+#include <string>
+
+namespace orcus { namespace json {
+
+/**
+ * Properly escape an input string appropriate for json output.
+ *
+ * @param input string value to escape.
+ *
+ * @return escaped string value.
+ */
+ORCUS_PSR_DLLPUBLIC std::string escape_string(const std::string& input);
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/json_parser.hpp b/include/orcus/json_parser.hpp
new file mode 100644
index 0000000..b021ff8
--- /dev/null
+++ b/include/orcus/json_parser.hpp
@@ -0,0 +1,402 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_JSON_PARSER_HPP
+#define INCLUDED_ORCUS_JSON_PARSER_HPP
+
+#include "json_parser_base.hpp"
+
+#include <cassert>
+#include <cmath>
+
+namespace orcus {
+
+class json_handler
+{
+public:
+ /**
+ * Called when the parsing begins.
+ */
+ void begin_parse() {}
+
+ /**
+ * Called when the parsing ends.
+ */
+ void end_parse() {}
+
+ /**
+ * Called when the opening brace of an array is encountered.
+ */
+ void begin_array() {}
+
+ /**
+ * Called when the closing brace of an array is encountered.
+ */
+ void end_array() {}
+
+ /**
+ * Called when the opening curly brace of an object is encountered.
+ */
+ void begin_object() {}
+
+ /**
+ * Called when a key value string of an object is encountered.
+ *
+ * @param key key value string.
+ * @param transient true if the string value is stored in a temporary
+ * buffer which is not guaranteed to hold the string
+ * value after the end of this callback. When false, the
+ * pointer points to somewhere in the JSON stream being
+ * parsed.
+ */
+ void object_key(std::string_view key, bool transient)
+ {
+ (void)key; (void)transient;
+ }
+
+ /**
+ * Called when the closing curly brace of an object is encountered.
+ */
+ void end_object() {}
+
+ /**
+ * Called when a boolean 'true' keyword is encountered.
+ */
+ void boolean_true() {}
+
+ /**
+ * Called when a boolean 'false' keyword is encountered.
+ */
+ void boolean_false() {}
+
+ /**
+ * Called when a 'null' keyword is encountered.
+ */
+ void null() {}
+
+ /**
+ * Called when a string value is encountered.
+ *
+ * @param val string value.
+ * @param transient true if the string value is stored in a temporary
+ * buffer which is not guaranteed to hold the string
+ * value after the end of this callback. When false, the
+ * pointer points to somewhere in the JSON stream being
+ * parsed.
+ */
+ void string(std::string_view val, bool transient)
+ {
+ (void)val; (void)transient;
+ }
+
+ /**
+ * Called when a numeric value is encountered.
+ *
+ * @param val numeric value.
+ */
+ void number(double val)
+ {
+ (void)val;
+ }
+};
+
+/**
+ * Parser for JSON documents.
+ *
+ * @tparam HandlerT Hanlder type with member functions for event callbacks.
+ * Refer to json_handler.
+ */
+template<typename HandlerT>
+class json_parser : public json::parser_base
+{
+public:
+ typedef HandlerT handler_type;
+
+ /**
+ * Constructor.
+ *
+ * @param content string stream containing JSON string.
+ * @param hdl handler class instance.
+ */
+ json_parser(std::string_view content, handler_type& hdl);
+
+ /**
+ * Call this method to start parsing.
+ */
+ void parse();
+
+private:
+ void root_value();
+ void value();
+ void array();
+ void end_array();
+ void object();
+ void number();
+ void string();
+
+private:
+ handler_type& m_handler;
+};
+
+template<typename _Handler>
+json_parser<_Handler>::json_parser(
+ std::string_view content, handler_type& hdl) :
+ json::parser_base(content), m_handler(hdl) {}
+
+template<typename _Handler>
+void json_parser<_Handler>::parse()
+{
+ m_handler.begin_parse();
+
+ skip_ws();
+ if (has_char())
+ root_value();
+ else
+ throw parse_error("parse: no json content could be found in file", offset());
+
+ if (has_char())
+ throw parse_error("parse: unexpected trailing string segment.", offset());
+
+ m_handler.end_parse();
+}
+
+template<typename _Handler>
+void json_parser<_Handler>::root_value()
+{
+ char c = cur_char();
+
+ switch (c)
+ {
+ case '[':
+ array();
+ break;
+ case '{':
+ object();
+ break;
+ default:
+ parse_error::throw_with(
+ "root_value: either '[' or '{' was expected, but '", cur_char(), "' was found.", offset());
+ }
+}
+
+template<typename _Handler>
+void json_parser<_Handler>::value()
+{
+ char c = cur_char();
+ if (is_numeric(c))
+ {
+ number();
+ return;
+ }
+
+ switch (c)
+ {
+ case '-':
+ number();
+ break;
+ case '[':
+ array();
+ break;
+ case '{':
+ object();
+ break;
+ case 't':
+ parse_true();
+ m_handler.boolean_true();
+ break;
+ case 'f':
+ parse_false();
+ m_handler.boolean_false();
+ break;
+ case 'n':
+ parse_null();
+ m_handler.null();
+ break;
+ case '"':
+ string();
+ break;
+ default:
+ parse_error::throw_with("value: failed to parse '", cur_char(), "'.", offset());
+ }
+}
+
+template<typename _Handler>
+void json_parser<_Handler>::array()
+{
+ assert(cur_char() == '[');
+
+ m_handler.begin_array();
+ for (next(); has_char(); next())
+ {
+ skip_ws();
+
+ if (cur_char() == ']')
+ {
+ end_array();
+ return;
+ }
+
+ value();
+ skip_ws();
+
+ if (has_char())
+ {
+ switch (cur_char())
+ {
+ case ']':
+ end_array();
+ return;
+ case ',':
+ if (peek_char() == ']')
+ {
+ parse_error::throw_with(
+ "array: ']' expected but '", cur_char(), "' found.", offset() );
+ }
+ continue;
+ default:
+ parse_error::throw_with(
+ "array: either ']' or ',' expected, but '", cur_char(), "' found.", offset());
+ }
+ }
+ else
+ {
+ // needs to be handled here,
+ // we would call next() before checking again with has_char() which
+ // is already past the end
+ break;
+ }
+ }
+
+ throw parse_error("array: failed to parse array.", offset());
+}
+
+template<typename _Handler>
+void json_parser<_Handler>::end_array()
+{
+ m_handler.end_array();
+ next();
+ skip_ws();
+}
+
+template<typename _Handler>
+void json_parser<_Handler>::object()
+{
+ assert(cur_char() == '{');
+
+ bool require_new_key = false;
+ m_handler.begin_object();
+ for (next(); has_char(); next())
+ {
+ skip_ws();
+ if (!has_char())
+ throw parse_error("object: stream ended prematurely before reaching a key.", offset());
+
+ switch (cur_char())
+ {
+ case '}':
+ if (require_new_key)
+ {
+ parse_error::throw_with(
+ "object: new key expected, but '", cur_char(), "' found.", offset());
+ }
+ m_handler.end_object();
+ next();
+ skip_ws();
+ return;
+ case '"':
+ break;
+ default:
+ parse_error::throw_with(
+ "object: '\"' was expected, but '", cur_char(), "' found.", offset());
+ }
+ require_new_key = false;
+
+ parse_quoted_string_state res = parse_string();
+ if (!res.str)
+ {
+ // Parsing was unsuccessful.
+ if (res.length == parse_quoted_string_state::error_no_closing_quote)
+ throw parse_error("object: stream ended prematurely before reaching the closing quote of a key.", offset());
+ else if (res.length == parse_quoted_string_state::error_illegal_escape_char)
+ parse_error::throw_with(
+ "object: illegal escape character '", cur_char(), "' in key value.", offset());
+ else
+ throw parse_error("object: unknown error while parsing a key value.", offset());
+ }
+
+ m_handler.object_key({res.str, res.length}, res.transient);
+
+ skip_ws();
+ if (cur_char() != ':')
+ parse_error::throw_with(
+ "object: ':' was expected, but '", cur_char(), "' found.", offset());
+
+ next();
+ skip_ws();
+
+ if (!has_char())
+ throw parse_error("object: stream ended prematurely before reaching a value.", offset());
+
+ value();
+
+ skip_ws();
+ if (!has_char())
+ throw parse_error("object: stream ended prematurely before reaching either '}' or ','.", offset());
+
+ switch (cur_char())
+ {
+ case '}':
+ m_handler.end_object();
+ next();
+ skip_ws();
+ return;
+ case ',':
+ require_new_key = true;
+ continue;
+ default:
+ parse_error::throw_with(
+ "object: either '}' or ',' expected, but '", cur_char(), "' found.", offset());
+ }
+ }
+
+ throw parse_error("object: closing '}' was never reached.", offset());
+}
+
+template<typename _Handler>
+void json_parser<_Handler>::number()
+{
+ assert(is_numeric(cur_char()) || cur_char() == '-');
+
+ double val = parse_double_or_throw();
+ m_handler.number(val);
+ skip_ws();
+}
+
+template<typename _Handler>
+void json_parser<_Handler>::string()
+{
+ parse_quoted_string_state res = parse_string();
+ if (res.str)
+ {
+ m_handler.string({res.str, res.length}, res.transient);
+ return;
+ }
+
+ // Parsing was unsuccessful.
+ if (res.length == parse_quoted_string_state::error_no_closing_quote)
+ throw parse_error("string: stream ended prematurely before reaching the closing quote.", offset());
+ else if (res.length == parse_quoted_string_state::error_illegal_escape_char)
+ parse_error::throw_with("string: illegal escape character '", cur_char(), "'.", offset());
+ else
+ throw parse_error("string: unknown error.", offset());
+}
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/json_parser_base.hpp b/include/orcus/json_parser_base.hpp
new file mode 100644
index 0000000..461808e
--- /dev/null
+++ b/include/orcus/json_parser_base.hpp
@@ -0,0 +1,46 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_JSON_PARSER_BASE_HPP
+#define INCLUDED_ORCUS_JSON_PARSER_BASE_HPP
+
+#include "parser_base.hpp"
+#include "parser_global.hpp"
+#include "exception.hpp"
+
+#include <memory>
+
+namespace orcus { namespace json {
+
+class ORCUS_PSR_DLLPUBLIC parser_base : public ::orcus::parser_base
+{
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+protected:
+
+ parser_base() = delete;
+ parser_base(const parser_base&) = delete;
+ parser_base& operator=(const parser_base&) = delete;
+
+ parser_base(std::string_view content);
+ ~parser_base();
+
+ void skip_ws();
+ void parse_true();
+ void parse_false();
+ void parse_null();
+ double parse_double_or_throw();
+
+ parse_quoted_string_state parse_string();
+};
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/json_parser_thread.hpp b/include/orcus/json_parser_thread.hpp
new file mode 100644
index 0000000..8328ef1
--- /dev/null
+++ b/include/orcus/json_parser_thread.hpp
@@ -0,0 +1,104 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_JSON_PARSER_THREAD_HPP
+#define INCLUDED_ORCUS_JSON_PARSER_THREAD_HPP
+
+#include "env.hpp"
+#include "types.hpp"
+
+#include <memory>
+#include <vector>
+#include <ostream>
+#include <variant>
+
+namespace orcus {
+
+class string_pool;
+
+namespace json {
+
+struct ORCUS_PSR_DLLPUBLIC parser_stats
+{
+ size_t token_buffer_size_threshold;
+};
+
+enum class parse_token_t
+{
+ unknown,
+ begin_parse,
+ end_parse,
+ begin_array,
+ end_array,
+ begin_object,
+ object_key,
+ end_object,
+ boolean_true,
+ boolean_false,
+ null,
+ string,
+ number,
+ parse_error,
+};
+
+struct ORCUS_PSR_DLLPUBLIC parse_token
+{
+ using value_type = std::variant<std::string_view, parse_error_value_t, double>;
+
+ parse_token_t type;
+ value_type value;
+
+ parse_token();
+ parse_token(parse_token_t _type);
+ parse_token(parse_token_t _type, std::string_view s);
+ parse_token(std::string_view s, std::ptrdiff_t offset);
+ parse_token(double value);
+
+ parse_token(const parse_token& other);
+
+ parse_token& operator= (parse_token) = delete;
+
+ bool operator== (const parse_token& other) const;
+ bool operator!= (const parse_token& other) const;
+};
+
+typedef std::vector<parse_token> parse_tokens_t;
+
+ORCUS_PSR_DLLPUBLIC std::ostream& operator<< (std::ostream& os, const parse_tokens_t& tokens);
+
+class ORCUS_PSR_DLLPUBLIC parser_thread
+{
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+public:
+ parser_thread(const char* p, size_t n, size_t min_token_size);
+ parser_thread(const char* p, size_t n, size_t min_token_size, size_t max_token_size);
+ ~parser_thread();
+
+ void start();
+
+ /**
+ * Wait until new set of tokens becomes available.
+ *
+ * @param tokens new set of tokens.
+ *
+ * @return true if the parsing is still in progress (therefore more tokens
+ * to come), false if it's done i.e. this is the last token set.
+ */
+ bool next_tokens(parse_tokens_t& tokens);
+
+ parser_stats get_stats() const;
+
+ void swap_string_pool(string_pool& pool);
+};
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/json_structure_tree.hpp b/include/orcus/json_structure_tree.hpp
new file mode 100644
index 0000000..ad77f5c
--- /dev/null
+++ b/include/orcus/json_structure_tree.hpp
@@ -0,0 +1,137 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_JSON_STRUCTURE_TREE_HPP
+#define INCLUDED_ORCUS_JSON_STRUCTURE_TREE_HPP
+
+#include "orcus/env.hpp"
+#include "orcus/types.hpp"
+
+#include <ostream>
+#include <memory>
+#include <vector>
+#include <functional>
+
+namespace orcus { namespace json {
+
+struct ORCUS_DLLPUBLIC table_range_t
+{
+ std::vector<std::string> paths;
+ std::vector<std::string> row_groups;
+};
+
+class ORCUS_DLLPUBLIC structure_tree
+{
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+public:
+
+ enum class node_type : short { unknown = 0, array = 1, object = 2, object_key = 3, value = 4 };
+
+ struct node_properties
+ {
+ node_type type;
+ bool repeat;
+ };
+
+ class ORCUS_DLLPUBLIC walker
+ {
+ friend class structure_tree;
+
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+ walker(const structure_tree::impl* parent_impl);
+ public:
+ walker();
+ walker(const walker& other);
+ ~walker();
+
+ /**
+ * Set the current position to the root node, and return its
+ * properties.
+ */
+ void root();
+
+ /**
+ * Move down to a child node at specified position. Call
+ * child_count() to get the number of child nodes the current node
+ * has. A child node position is 0-based and must be less than the
+ * child count.
+ *
+ * @param child_pos 0-based index of the child node to move down to.
+ */
+ void descend(size_t child_pos);
+
+ /**
+ * Move up to the parent node of the current node.
+ */
+ void ascend();
+
+ /**
+ * Return the number of child nodes the current node has.
+ *
+ * @return number of child nodes of the current node.
+ */
+ size_t child_count() const;
+
+ /**
+ * Get the properties of the current node.
+ */
+ node_properties get_node() const;
+
+ /**
+ * Build one or more field paths for the current value node. For a
+ * value node that is a child of an object, you'll always get one
+ * path, whereas a value node that is a chlid of an array, you may get
+ * more than one field paths.
+ *
+ * @return one or more field paths built for the current value node.
+ */
+ std::vector<std::string> build_field_paths() const;
+
+ /**
+ * Build a path for the parent of the current repeating node. A row
+ * group is an anchor to which repeating nodes get anchored to. It is
+ * used to determine when to increment row position during mapping.
+ *
+ * @return path for the row group of the current repeating node.
+ */
+ std::string build_row_group_path() const;
+ };
+
+ structure_tree(const structure_tree&) = delete;
+ structure_tree& operator= (const structure_tree&) = delete;
+
+ structure_tree();
+ ~structure_tree();
+
+ void parse(std::string_view stream);
+
+ /**
+ * For now, normalizing a tree just means sorting child nodes. We may add
+ * other normalization stuff later.
+ */
+ void normalize_tree();
+
+ void dump_compact(std::ostream& os) const;
+
+ walker get_walker() const;
+
+ using range_handler_type = std::function<void(table_range_t&&)>;
+
+ void process_ranges(range_handler_type rh) const;
+};
+
+ORCUS_DLLPUBLIC std::ostream& operator<< (std::ostream& os, structure_tree::node_type nt);
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/measurement.hpp b/include/orcus/measurement.hpp
new file mode 100644
index 0000000..7444ae0
--- /dev/null
+++ b/include/orcus/measurement.hpp
@@ -0,0 +1,41 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef ORCUS_MEASUREMENT_HPP
+#define ORCUS_MEASUREMENT_HPP
+
+#include "types.hpp"
+#include "env.hpp"
+
+#include <cstdlib>
+#include <string>
+
+namespace orcus {
+
+ORCUS_DLLPUBLIC double to_double(std::string_view s, const char** p_parse_ended = nullptr);
+ORCUS_DLLPUBLIC long to_long(std::string_view s, const char** p_parse_ended = nullptr);
+ORCUS_DLLPUBLIC bool to_bool(std::string_view s);
+
+/**
+ * Parse a string value containing a part representing a numerical value
+ * optionally followed by a part representing a unit of measurement.
+ *
+ * Examples of such string value are: "1.234in", "0.34cm" and so on.
+ *
+ * @param str original string value.
+ *
+ * @return structure containing a numerical value and a unit of measurement
+ * that the original string value represents.
+ */
+ORCUS_DLLPUBLIC length_t to_length(std::string_view str);
+
+ORCUS_DLLPUBLIC double convert(double value, length_unit_t unit_from, length_unit_t unit_to);
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/orcus_csv.hpp b/include/orcus/orcus_csv.hpp
new file mode 100644
index 0000000..3e34c15
--- /dev/null
+++ b/include/orcus/orcus_csv.hpp
@@ -0,0 +1,41 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef ORCUS_ORCUS_CSV_HPP
+#define ORCUS_ORCUS_CSV_HPP
+
+#include "interface.hpp"
+
+namespace orcus {
+
+namespace spreadsheet { namespace iface {
+ class import_factory;
+}}
+
+class ORCUS_DLLPUBLIC orcus_csv : public iface::import_filter
+{
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+public:
+ orcus_csv() = delete;
+ orcus_csv(const orcus_csv&) = delete;
+ orcus_csv& operator=(const orcus_csv&) = delete;
+
+ orcus_csv(spreadsheet::iface::import_factory* factory);
+ ~orcus_csv();
+
+ virtual void read_file(std::string_view filepath) override;
+ virtual void read_stream(std::string_view stream) override;
+
+ virtual std::string_view get_name() const override;
+};
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/orcus_gnumeric.hpp b/include/orcus/orcus_gnumeric.hpp
new file mode 100644
index 0000000..54f74a2
--- /dev/null
+++ b/include/orcus/orcus_gnumeric.hpp
@@ -0,0 +1,43 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef ORCUS_ORCUS_GNUMERIC_HPP
+#define ORCUS_ORCUS_GNUMERIC_HPP
+
+#include "interface.hpp"
+
+#include <memory>
+
+namespace orcus {
+
+namespace spreadsheet { namespace iface { class import_factory; }}
+
+class ORCUS_DLLPUBLIC orcus_gnumeric : public iface::import_filter
+{
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+public:
+ orcus_gnumeric() = delete;
+ orcus_gnumeric(const orcus_gnumeric&) = delete;
+ orcus_gnumeric& operator=(const orcus_gnumeric&) = delete;
+
+ orcus_gnumeric(spreadsheet::iface::import_factory* factory);
+ ~orcus_gnumeric();
+
+ static bool detect(const unsigned char* blob, size_t size);
+
+ virtual void read_file(std::string_view filepath) override;
+
+ virtual void read_stream(std::string_view stream) override;
+
+ virtual std::string_view get_name() const override;
+};
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/orcus_import_ods.hpp b/include/orcus/orcus_import_ods.hpp
new file mode 100644
index 0000000..1a94d0b
--- /dev/null
+++ b/include/orcus/orcus_import_ods.hpp
@@ -0,0 +1,32 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef ORCUS_ORCUS_IMPORT_ODS_HPP
+#define ORCUS_ORCUS_IMPORT_ODS_HPP
+
+#include "interface.hpp"
+
+namespace orcus {
+
+namespace spreadsheet { namespace iface {
+ class import_styles;
+}}
+
+class ORCUS_DLLPUBLIC import_ods
+{
+public:
+ import_ods() = delete;
+ import_ods(const import_ods&) = delete;
+ import_ods& operator=(const import_ods&) = delete;
+
+ static void read_styles(std::string_view s, spreadsheet::iface::import_styles* data);
+};
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/orcus_import_xlsx.hpp b/include/orcus/orcus_import_xlsx.hpp
new file mode 100644
index 0000000..8523299
--- /dev/null
+++ b/include/orcus/orcus_import_xlsx.hpp
@@ -0,0 +1,37 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_ORCUS_IMPORT_XLSX_HPP
+#define INCLUDED_ORCUS_ORCUS_IMPORT_XLSX_HPP
+
+#include "interface.hpp"
+
+namespace orcus {
+
+namespace spreadsheet { namespace iface {
+ class import_table;
+ class import_reference_resolver;
+}}
+
+class ORCUS_DLLPUBLIC import_xlsx
+{
+public:
+ import_xlsx() = delete;
+ import_xlsx(const import_xlsx&) = delete;
+ import_xlsx& operator=(const import_xlsx&) = delete;
+
+ static void read_table(
+ std::string_view s,
+ spreadsheet::iface::import_table& table,
+ spreadsheet::iface::import_reference_resolver& resolver);
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/orcus_json.hpp b/include/orcus/orcus_json.hpp
new file mode 100644
index 0000000..7ec487f
--- /dev/null
+++ b/include/orcus/orcus_json.hpp
@@ -0,0 +1,73 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_ORCUS_JSON_HPP
+#define INCLUDED_ORCUS_ORCUS_JSON_HPP
+
+#include "env.hpp"
+#include "./spreadsheet/types.hpp"
+
+#include <memory>
+#include <string_view>
+
+namespace orcus {
+
+namespace spreadsheet { namespace iface {
+
+class import_factory;
+
+}}
+
+class ORCUS_DLLPUBLIC orcus_json
+{
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+public:
+
+ orcus_json(const orcus_json&) = delete;
+ orcus_json& operator= (const orcus_json&) = delete;
+
+ orcus_json(spreadsheet::iface::import_factory* im_fact);
+ ~orcus_json();
+
+ void set_cell_link(std::string_view path, std::string_view sheet, spreadsheet::row_t row, spreadsheet::col_t col);
+
+ void start_range(
+ std::string_view sheet, spreadsheet::row_t row, spreadsheet::col_t col, bool row_header);
+
+ void append_field_link(std::string_view path, std::string_view label);
+ void set_range_row_group(std::string_view path);
+ void commit_range();
+
+ void append_sheet(std::string_view name);
+
+ void read_stream(std::string_view stream);
+
+ /**
+ * Read a JSON string that contains an entire set of mapping rules.
+ *
+ * This method also inserts all necessary sheets into the document model.
+ *
+ * @param stream JSON string.
+ */
+ void read_map_definition(std::string_view stream);
+
+ /**
+ * Read a JSON string, and detect and define mapping rules for one or more
+ * ranges.
+ *
+ * @param stream JSON string.
+ */
+ void detect_map_definition(std::string_view stream);
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/orcus_ods.hpp b/include/orcus/orcus_ods.hpp
new file mode 100644
index 0000000..08eb197
--- /dev/null
+++ b/include/orcus/orcus_ods.hpp
@@ -0,0 +1,58 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_ORCUS_ODS_HPP
+#define INCLUDED_ORCUS_ORCUS_ODS_HPP
+
+#include "orcus/spreadsheet/import_interface.hpp"
+#include "orcus/env.hpp"
+#include "interface.hpp"
+
+#include <memory>
+
+namespace orcus {
+
+namespace spreadsheet { namespace iface { class import_factory; }}
+
+struct orcus_ods_impl;
+class zip_archive;
+class zip_archive_stream;
+
+class ORCUS_DLLPUBLIC orcus_ods : public iface::import_filter
+{
+ orcus_ods(const orcus_ods&); // disabled
+ orcus_ods& operator= (const orcus_ods&); // disabled
+
+public:
+ orcus_ods(spreadsheet::iface::import_factory* factory);
+ ~orcus_ods();
+
+ static bool detect(const unsigned char* blob, size_t size);
+
+ virtual void read_file(std::string_view filepath) override;
+
+ virtual void read_stream(std::string_view stream) override;
+
+ virtual std::string_view get_name() const override;
+
+private:
+ static void list_content(const zip_archive& archive);
+ void read_styles(const zip_archive& archive);
+ void read_content(const zip_archive& archive);
+ void read_content_xml(const unsigned char* p, size_t size);
+
+ void read_file_impl(zip_archive_stream* stream);
+
+private:
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+};
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/orcus_parquet.hpp b/include/orcus/orcus_parquet.hpp
new file mode 100644
index 0000000..1dccf45
--- /dev/null
+++ b/include/orcus/orcus_parquet.hpp
@@ -0,0 +1,41 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#pragma once
+
+#include "./interface.hpp"
+#include "./spreadsheet/import_interface.hpp"
+
+namespace orcus {
+
+namespace spreadsheet { namespace iface { class import_factory; }}
+
+class ORCUS_DLLPUBLIC orcus_parquet : public iface::import_filter
+{
+public:
+ orcus_parquet(const orcus_parquet&) = delete;
+ orcus_parquet& operator=(const orcus_parquet&) = delete;
+
+ orcus_parquet(spreadsheet::iface::import_factory* factory);
+ ~orcus_parquet();
+
+ static bool detect(const unsigned char* blob, std::size_t size);
+
+ virtual void read_file(std::string_view filepath) override;
+
+ virtual void read_stream(std::string_view stream) override;
+
+ virtual std::string_view get_name() const override;
+
+private:
+ class impl;
+ std::unique_ptr<impl> mp_impl;
+};
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/orcus_xls_xml.hpp b/include/orcus/orcus_xls_xml.hpp
new file mode 100644
index 0000000..4534bfc
--- /dev/null
+++ b/include/orcus/orcus_xls_xml.hpp
@@ -0,0 +1,43 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_ORCUS_XLS_XML_HPP
+#define INCLUDED_ORCUS_ORCUS_XLS_XML_HPP
+
+#include "interface.hpp"
+#include <memory>
+
+namespace orcus {
+
+namespace spreadsheet { namespace iface { class import_factory; }}
+
+struct orcus_xls_xml_impl;
+
+class ORCUS_DLLPUBLIC orcus_xls_xml : public iface::import_filter
+{
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+public:
+ orcus_xls_xml(spreadsheet::iface::import_factory* factory);
+ ~orcus_xls_xml();
+
+ orcus_xls_xml(const orcus_xls_xml&) = delete;
+ orcus_xls_xml& operator= (const orcus_xls_xml&) = delete;
+
+ static bool detect(const unsigned char* blob, size_t size);
+
+ virtual void read_file(std::string_view filepath) override;
+ virtual void read_stream(std::string_view stream) override;
+
+ virtual std::string_view get_name() const override;
+};
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/orcus_xlsx.hpp b/include/orcus/orcus_xlsx.hpp
new file mode 100644
index 0000000..68b01c0
--- /dev/null
+++ b/include/orcus/orcus_xlsx.hpp
@@ -0,0 +1,87 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_ORCUS_XLSX_HPP
+#define INCLUDED_ORCUS_ORCUS_XLSX_HPP
+
+#include "interface.hpp"
+
+#include <memory>
+
+namespace orcus {
+
+namespace spreadsheet { namespace iface { class import_factory; }}
+
+struct xlsx_rel_sheet_info;
+struct xlsx_rel_table_info;
+struct xlsx_rel_pivot_cache_info;
+struct xlsx_rel_pivot_cache_record_info;
+struct orcus_xlsx_impl;
+class xlsx_opc_handler;
+
+class ORCUS_DLLPUBLIC orcus_xlsx : public iface::import_filter
+{
+ friend class xlsx_opc_handler;
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+public:
+ orcus_xlsx(spreadsheet::iface::import_factory* factory);
+ ~orcus_xlsx();
+
+ orcus_xlsx(const orcus_xlsx&) = delete;
+ orcus_xlsx& operator= (const orcus_xlsx&) = delete;
+
+ static bool detect(const unsigned char* blob, size_t size);
+
+ virtual void read_file(std::string_view filepath) override;
+ virtual void read_stream(std::string_view stream) override;
+
+ virtual std::string_view get_name() const override;
+
+private:
+
+ void set_formulas_to_doc();
+
+ void read_workbook(const std::string& dir_path, const std::string& file_name);
+
+ /**
+ * Parse a sheet xml part that contains data stored in a single sheet.
+ */
+ void read_sheet(const std::string& dir_path, const std::string& file_name, xlsx_rel_sheet_info* data);
+
+ /**
+ * Parse sharedStrings.xml part that contains a list of strings referenced
+ * in the document.
+ */
+ void read_shared_strings(const std::string& dir_path, const std::string& file_name);
+
+ void read_styles(const std::string& dir_path, const std::string& file_name);
+
+ void read_table(const std::string& dir_path, const std::string& file_name, xlsx_rel_table_info* data);
+
+ void read_pivot_cache_def(
+ const std::string& dir_path, const std::string& file_name,
+ const xlsx_rel_pivot_cache_info* data);
+
+ void read_pivot_cache_rec(
+ const std::string& dir_path, const std::string& file_name,
+ const xlsx_rel_pivot_cache_record_info* data);
+
+ void read_pivot_table(const std::string& dir_path, const std::string& file_name);
+
+ void read_rev_headers(const std::string& dir_path, const std::string& file_name);
+
+ void read_rev_log(const std::string& dir_path, const std::string& file_name);
+
+ void read_drawing(const std::string& dir_path, const std::string& file_name);
+};
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/orcus_xml.hpp b/include/orcus/orcus_xml.hpp
new file mode 100644
index 0000000..f20466f
--- /dev/null
+++ b/include/orcus/orcus_xml.hpp
@@ -0,0 +1,155 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_ORCUS_XML_HPP
+#define INCLUDED_ORCUS_ORCUS_XML_HPP
+
+#include "env.hpp"
+#include "spreadsheet/types.hpp"
+
+#include <ostream>
+#include <memory>
+
+namespace orcus {
+
+class xmlns_repository;
+
+namespace spreadsheet { namespace iface {
+ class import_factory;
+ class export_factory;
+}}
+
+class ORCUS_DLLPUBLIC orcus_xml
+{
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+public:
+ orcus_xml(const orcus_xml&) = delete;
+ orcus_xml& operator= (const orcus_xml&) = delete;
+
+ orcus_xml(xmlns_repository& ns_repo, spreadsheet::iface::import_factory* im_fact, spreadsheet::iface::export_factory* ex_fact);
+ ~orcus_xml();
+
+ /**
+ * Define a namespace and its alias used in a map file.
+ *
+ * @param alias alias for the namespace.
+ * @param uri namespace value.
+ * @param default_ns whether or not to use this namespace as the default
+ * namespace. When this value is set to true, the
+ * namespace being set will be applied for all elements
+ * and attributes used in the paths without explicit
+ * namespace values.
+ */
+ void set_namespace_alias(std::string_view alias, std::string_view uri, bool default_ns=false);
+
+ /**
+ * Define a mapping of a single element or attribute to a single cell
+ * location.
+ *
+ * @param xpath path to the element or attribute to link.
+ * @param sheet sheet index (0-based) of the linked cell location.
+ * @param row row index (0-based) of the linked cell location.
+ * @param col column index (0-based) of the linked cell location.
+ */
+ void set_cell_link(std::string_view xpath, std::string_view sheet, spreadsheet::row_t row, spreadsheet::col_t col);
+
+ /**
+ * Initiate the mapping definition of a linked range. The definition will
+ * get committed when the {@link commit_range} method is called.
+ *
+ * @param sheet sheet index (0-based) of the linked cell location.
+ * @param row row index (0-based) of the linked cell location.
+ * @param col column index (0-based) of the linked cell location.
+ */
+ void start_range(std::string_view sheet, spreadsheet::row_t row, spreadsheet::col_t col);
+
+ /**
+ * Append a field that is mapped to a specified path in the XML document
+ * to the current linked range.
+ *
+ * @param xpath path to the element or attribute to link as a field.
+ * @param label custom header label to use in lieu of the name of the
+ * linked entity.
+ */
+ void append_field_link(std::string_view xpath, std::string_view label);
+
+ /**
+ * Set the element located in the specified path as a row group in the
+ * current linked range.
+ *
+ * If the element is defined as a row-group element, the row index will
+ * increment whenever that element closes.
+ *
+ * @param xpath path to the element to use as a row group element.
+ */
+ void set_range_row_group(std::string_view xpath);
+
+ /**
+ * Commit the mapping definition of the current range.
+ */
+ void commit_range();
+
+ /**
+ * Append a new sheet to the spreadsheet document.
+ *
+ * @param name name of the sheet.
+ */
+ void append_sheet(std::string_view name);
+
+ /**
+ * Read the stream containing the source XML document.
+ *
+ * @param stream stream containing the content of the source XML document.
+ */
+ void read_stream(std::string_view stream);
+
+ /**
+ * Read an XML stream that contains an entire set of mapping rules.
+ *
+ * This method also inserts all necessary sheets into the document model.
+ *
+ * @param stream stream containing the XML string.
+ */
+ void read_map_definition(std::string_view stream);
+
+ /**
+ * Read a stream containing the source XML document, automatically detect
+ * all linkable ranges and import them one range per sheet.
+ *
+ * @param stream stream containing the source XML document.
+ */
+ void detect_map_definition(std::string_view stream);
+
+ /**
+ * Read a stream containing the source XML document, automatically detect
+ * all linkable ranges, and write a map definition file depicting the
+ * detected ranges.
+ *
+ * @param stream stream containing the source XML document.
+ * @param out output stream to write the map definition file to.
+ */
+ void write_map_definition(std::string_view stream, std::ostream& out) const;
+
+ /**
+ * Write the linked cells and ranges in the spreadsheet document as an XML
+ * document using the same map definition rules used to load the content.
+ *
+ * Note that this requires the source XML document stream, as it re-uses
+ * parts of the source stream.
+ *
+ * @param stream stream containing the source XML document.
+ * @param out output stream to write the XML document to.
+ */
+ void write(std::string_view stream, std::ostream& out) const;
+};
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/parser_base.hpp b/include/orcus/parser_base.hpp
new file mode 100644
index 0000000..b3d99a1
--- /dev/null
+++ b/include/orcus/parser_base.hpp
@@ -0,0 +1,155 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_PARSER_BASE_HPP
+#define INCLUDED_ORCUS_PARSER_BASE_HPP
+
+#include "env.hpp"
+#include "exception.hpp"
+
+#include <string>
+#include <cstdlib>
+#include <cstddef>
+#include <cassert>
+#include <functional>
+
+namespace orcus {
+
+class ORCUS_PSR_DLLPUBLIC parser_base
+{
+protected:
+ using numeric_parser_type = std::function<const char*(const char*, const char*, double&)>;
+
+ const char* const mp_begin;
+ const char* mp_char;
+ const char* mp_end;
+
+private:
+ numeric_parser_type m_func_parse_numeric;
+
+protected:
+ parser_base(const char* p, size_t n);
+
+ void set_numeric_parser(const numeric_parser_type& func)
+ {
+ m_func_parse_numeric = func;
+ }
+
+ bool has_char() const
+ {
+ assert(mp_char <= mp_end);
+ return mp_char != mp_end;
+ }
+
+ bool has_next() const
+ {
+ assert((mp_char+1) <= mp_end);
+ return (mp_char+1) != mp_end;
+ }
+
+ void next(size_t inc=1) { mp_char += inc; }
+
+ void prev(size_t dec=1);
+
+ char cur_char() const { return *mp_char; }
+
+ /**
+ * Peek a character at specified offset from the current position without
+ * advancing the current position.
+ *
+ * @note The caller <strong>must</strong> ensure that the specified offset
+ * position is a valid position. This method does not check its
+ * validity.
+ *
+ * @param offset offset from the current position to peek at.
+ *
+ * @return character at a specified offset position from the current
+ * position.
+ */
+ char peek_char(std::size_t offset=1) const;
+
+ /**
+ * Peek a segment of contiguous characters of a specified length starting
+ * from the current position.
+ *
+ * @note The caller <strong>must</strong> ensure that the specified
+ * substring segment is entirely valid. This method does not check
+ * its validity.
+ *
+ * @param length length of the segment to peek.
+ *
+ * @return segment of contiguous characters.
+ */
+ std::string_view peek_chars(std::size_t length) const;
+
+ /**
+ * Skip an optional byte order mark at the current position of the stream.
+ *
+ * Currently we only check for UTF-8 BOM.
+ */
+ void skip_bom();
+
+ void skip(std::string_view chars_to_skip);
+
+ /**
+ * Skip all characters that are 0-32 in ASCII range
+ */
+ void skip_space_and_control();
+
+ /**
+ * Parse and check next characters to see if it matches specified
+ * character sequence.
+ *
+ * @param expected sequence of characters to match against.
+ *
+ * @return true if it matches specified character sequence, false
+ * otherwise.
+ */
+ bool parse_expected(std::string_view expected);
+
+ /**
+ * Try to parse the next characters as double, or return NaN in case of
+ * failure.
+ *
+ * @return double value on success, or NaN on failure.
+ */
+ double parse_double();
+
+ /**
+ * Determine the number of characters remaining <strong>after</strong> the
+ * current character. For instance, if the current character is on the
+ * last character in the stream, this method will return 0, whereas if
+ * it's on the first character, it will return the total length - 1.
+ *
+ * @return number of characters remaining after the current character.
+ */
+ size_t remaining_size() const;
+
+ /**
+ * Determine the number of characters available from the current character
+ * to the end of the buffer. The current character is included.
+ *
+ * @return number of characters available including the current character.
+ */
+ size_t available_size() const
+ {
+ return std::distance(mp_char, mp_end);
+ }
+
+ /**
+ * Return the current offset from the beginning of the character stream.
+ *
+ * @return current offset from the beginning of the character stream.
+ */
+ std::ptrdiff_t offset() const;
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/parser_global.hpp b/include/orcus/parser_global.hpp
new file mode 100644
index 0000000..bf5971b
--- /dev/null
+++ b/include/orcus/parser_global.hpp
@@ -0,0 +1,153 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef ORCUS_PARSER_GLOBAL_HPP
+#define ORCUS_PARSER_GLOBAL_HPP
+
+#include "env.hpp"
+
+#include <sstream>
+
+namespace orcus {
+
+class cell_buffer;
+
+enum class string_escape_char_t
+{
+ invalid,
+ valid,
+ control_char
+};
+
+/**
+ * Stores state of string parsing. Upon successful parsing the str points
+ * to the first character of the string and the length stores the size of
+ * the string. When the parsing fails, the str value becomes nullptr and
+ * the length stores the error code.
+ */
+struct parse_quoted_string_state
+{
+ ORCUS_PSR_DLLPUBLIC static const size_t error_no_closing_quote;
+ ORCUS_PSR_DLLPUBLIC static const size_t error_illegal_escape_char;
+
+ const char* str;
+ size_t length;
+
+ /**
+ * When true, the str pointer points to the temporary buffer storage
+ * provided by the caller instead of the original character stream. The
+ * caller must allocate memory and copy the value to it before the buffer
+ * content changes if the parsed string value needs to be stored.
+ *
+ * When false, str points to a position in the original stream, and the
+ * caller doens't need to allocate memory to store the string value as
+ * long as the original character stream is alive.
+ */
+ bool transient;
+
+ /**
+ * When true, the string contains at least one control character - a
+ * character whose value ranges between 0x00 and 0x1F.
+ */
+ bool has_control_character;
+};
+
+ORCUS_PSR_DLLPUBLIC bool is_blank(char c);
+ORCUS_PSR_DLLPUBLIC bool is_alpha(char c);
+ORCUS_PSR_DLLPUBLIC bool is_numeric(char c);
+
+/**
+ * Check if the characater is one of allowed characters. Note that you can
+ * only specify up to 16 allowed characters.
+ *
+ * @param c character to check.
+ * @param allowed string containing all allowed characters.
+ *
+ * @return true if the character is one of the allowed characters, false
+ * otherwise.
+ */
+ORCUS_PSR_DLLPUBLIC bool is_in(char c, std::string_view allowed);
+
+/**
+ * Parse a sequence of characters into a double-precision numeric value.
+ *
+ * @param p pointer to the first character to start parsing from.
+ * @param p_end pointer to the first character not allowed to parse.
+ * @param value output parameter to assign the matched value to.
+ *
+ * @return pointer to the first non-matching character.
+ */
+ORCUS_PSR_DLLPUBLIC const char* parse_numeric(const char* p, const char* p_end, double& value);
+
+/**
+ * Parse a sequence of characters into an integer value.
+ *
+ * @param p pointer to the first character to start parsing from.
+ * @param p_end pointer to the first character not allowed to parse.
+ * @param value output parameter to assign the matched value to.
+ *
+ * @return pointer to the first non-matching character.
+ *
+ * @note Use of this function should be eventually replaced with
+ * std::from_chars() once it becomes available.
+ */
+ORCUS_PSR_DLLPUBLIC const char* parse_integer(const char* p, const char* p_end, long& value);
+
+/**
+ * Two single-quote characters ('') represent one single-quote character.
+ */
+ORCUS_PSR_DLLPUBLIC parse_quoted_string_state parse_single_quoted_string(
+ const char*& p, size_t max_length, cell_buffer& buffer);
+
+/**
+ * Starting from the opening single quote position, parse string all the way
+ * to the closing quote. Two single-quote characters ('') will be
+ * interpreted as encoded one single-quote character.
+ *
+ * @param p it should point to the opening single quote character.
+ * @param max_length maximum length to parse.
+ *
+ * @return address of the character immediately after the closing quote, or
+ * nullptr in case no closing quote is found.
+ */
+ORCUS_PSR_DLLPUBLIC const char* parse_to_closing_single_quote(
+ const char* p, size_t max_length);
+
+ORCUS_PSR_DLLPUBLIC parse_quoted_string_state parse_double_quoted_string(
+ const char*& p, size_t max_length, cell_buffer& buffer);
+
+/**
+ * Starting from the opening double quote position, parse string all the way
+ * to the closing quote. Two single-quote characters ('') will be
+ * interpreted as encoded one single-quote character.
+ *
+ * @param p it should point to the opening single quote character.
+ * @param max_length maximum length to parse.
+ *
+ * @return address of the character immediately after the closing quote, or
+ * nullptr in case no closing quote is found.
+ */
+ORCUS_PSR_DLLPUBLIC const char* parse_to_closing_double_quote(
+ const char* p, size_t max_length);
+
+/**
+ * Given a character that occurs immediately after the escape character '\',
+ * return what type this character is.
+ *
+ * @param c character that occurs immediately after the escape character
+ * '\'.
+ *
+ * @return enum value representing the type of escape character.
+ */
+ORCUS_PSR_DLLPUBLIC string_escape_char_t get_string_escape_char_type(char c);
+
+ORCUS_PSR_DLLPUBLIC std::string_view trim(std::string_view str);
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/sax_ns_parser.hpp b/include/orcus/sax_ns_parser.hpp
new file mode 100644
index 0000000..f888fa2
--- /dev/null
+++ b/include/orcus/sax_ns_parser.hpp
@@ -0,0 +1,374 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_SAX_NS_PARSER_HPP
+#define INCLUDED_ORCUS_SAX_NS_PARSER_HPP
+
+#include "sax_parser.hpp"
+#include "xml_namespace.hpp"
+
+#include <unordered_set>
+#include <vector>
+#include <algorithm>
+
+namespace orcus {
+
+struct sax_ns_parser_element
+{
+ /** Element namespace identifier. */
+ xmlns_id_t ns;
+ /** Element namespace alias. */
+ std::string_view ns_alias;
+ /** Element name. */
+ std::string_view name;
+ /** Position of the opening brace '<'. */
+ std::ptrdiff_t begin_pos;
+ /** Position immediately after the closing brace '>'. */
+ std::ptrdiff_t end_pos;
+};
+
+struct sax_ns_parser_attribute
+{
+ /** Attribute namespace identifier. */
+ xmlns_id_t ns;
+ /** Attribute namespace alias. */
+ std::string_view ns_alias;
+ /** Attribute name. */
+ std::string_view name;
+ /** Attribute value. */
+ std::string_view value;
+ /** Whether or not the attribute value is transient. */
+ bool transient;
+};
+
+namespace sax { namespace detail {
+
+struct entity_name
+{
+ std::string_view ns;
+ std::string_view name;
+
+ entity_name(std::string_view _ns, std::string_view _name) :
+ ns(_ns), name(_name) {}
+
+ bool operator== (const entity_name& other) const
+ {
+ return other.ns == ns && other.name == name;
+ }
+
+ struct hash
+ {
+ size_t operator() (const entity_name& v) const
+ {
+ std::hash<std::string_view> hasher;
+ return hasher(v.ns) + hasher(v.name);
+ }
+ };
+};
+
+typedef std::unordered_set<std::string_view> ns_keys_type;
+typedef std::unordered_set<entity_name, entity_name::hash> entity_names_type;
+
+struct elem_scope
+{
+ xmlns_id_t ns;
+ std::string_view name;
+ ns_keys_type ns_keys;
+
+ elem_scope() {}
+ elem_scope(const elem_scope&) = delete;
+ elem_scope(elem_scope&& other) = default;
+};
+
+using elem_scopes_type = std::vector<elem_scope>;
+
+}} // namespace sax::detail
+
+class sax_ns_handler
+{
+public:
+ /**
+ * Called when a doctype declaration &lt;!DOCTYPE ... &gt; is encountered.
+ *
+ * @param dtd struct containing doctype declaration data.
+ */
+ void doctype(const orcus::sax::doctype_declaration& dtd)
+ {
+ (void)dtd;
+ }
+
+ /**
+ * Called when &lt;?... is encountered, where the '...' may be an
+ * arbitraray dentifier. One common declaration is &lt;?xml which is
+ * typically given at the start of an XML stream.
+ *
+ * @param decl name of the identifier.
+ */
+ void start_declaration(std::string_view decl)
+ {
+ (void)decl;
+ }
+
+ /**
+ * Called when the closing tag (&gt;) of a &lt;?... ?&gt; is encountered.
+ *
+ * @param decl name of the identifier.
+ */
+ void end_declaration(std::string_view decl)
+ {
+ (void)decl;
+ }
+
+ /**
+ * Called at the start of each element.
+ *
+ * @param elem information of the element being parsed.
+ */
+ void start_element(const orcus::sax_ns_parser_element& elem)
+ {
+ (void)elem;
+ }
+
+ /**
+ * Called at the end of each element.
+ *
+ * @param elem information of the element being parsed.
+ */
+ void end_element(const orcus::sax_ns_parser_element& elem)
+ {
+ (void)elem;
+ }
+
+ /**
+ * Called when a segment of a text content is parsed. Each text content
+ * is a direct child of an element, which may have multiple child contents
+ * when the element also has a child element that are direct sibling to
+ * the text contents or the text contents are splitted by a comment.
+ *
+ * @param val value of the text content.
+ * @param transient when true, the text content has been converted and is
+ * stored in a temporary buffer due to presence of one or
+ * more encoded characters, in which case <em>the passed
+ * text value needs to be either immediately converted to
+ * a non-text value or be interned within the scope of
+ * the callback</em>.
+ */
+ void characters(std::string_view val, bool transient)
+ {
+ (void)val;
+ (void)transient;
+ }
+
+ /**
+ * Called upon parsing of an attribute of a declaration. The value of an
+ * attribute is assumed to be transient thus should be consumed within the
+ * scope of this callback.
+ *
+ * @param name name of an attribute.
+ * @param val value of an attribute.
+ *
+ * @todo Perhaps we should pass the transient flag here as well like all the
+ * other places.
+ */
+ void attribute(std::string_view name, std::string_view val)
+ {
+ (void)name;
+ (void)val;
+ }
+
+ /**
+ * Called upon parsing of an attribute of an element. Note that <em>when
+ * the attribute's transient flag is set, the attribute value is stored in
+ * a temporary buffer due to a presence of encoded characters, and must be
+ * processed within the scope of the callback</em>.
+ *
+ * @param attr struct containing attribute information.
+ */
+ void attribute(const orcus::sax_ns_parser_attribute& attr)
+ {
+ (void)attr;
+ }
+};
+
+/**
+ * SAX based XML parser with extra namespace handling.
+ *
+ * It uses an instance of xmlns_context passed by the caller to validate and
+ * convert namespace values into identifiers. The namespace identifier of
+ * each encountered element is always given even if one is not explicitly
+ * given.
+ *
+ * This parser keeps track of element scopes and detects non-matching element
+ * pairs.
+ *
+ * @tparam HandlerT Handler type with member functions for event callbacks.
+ * Refer to @ref sax_ns_handler.
+ */
+template<typename HandlerT>
+class sax_ns_parser
+{
+public:
+ typedef HandlerT handler_type;
+
+ sax_ns_parser(std::string_view content, xmlns_context& ns_cxt, handler_type& handler);
+ ~sax_ns_parser() = default;
+
+ /**
+ * Start parsing the document.
+ *
+ * @exception orcus::malformed_xml_error when it encounters a
+ * non-matching closing element.
+ */
+ void parse();
+
+private:
+ /**
+ * Re-route callbacks from the internal sax_parser into sax_ns_parser
+ * callbacks.
+ */
+ class handler_wrapper
+ {
+ sax::detail::elem_scopes_type m_scopes;
+ sax::detail::ns_keys_type m_ns_keys;
+ sax::detail::entity_names_type m_attrs;
+
+ sax_ns_parser_element m_elem;
+ sax_ns_parser_attribute m_attr;
+
+ xmlns_context& m_ns_cxt;
+ handler_type& m_handler;
+
+ bool m_declaration;
+
+ public:
+ handler_wrapper(xmlns_context& ns_cxt, handler_type& handler) : m_ns_cxt(ns_cxt), m_handler(handler), m_declaration(false) {}
+
+ void doctype(const sax::doctype_declaration& dtd)
+ {
+ m_handler.doctype(dtd);
+ }
+
+ void start_declaration(std::string_view name)
+ {
+ m_declaration = true;
+ m_handler.start_declaration(name);
+ }
+
+ void end_declaration(std::string_view name)
+ {
+ m_declaration = false;
+ m_handler.end_declaration(name);
+ }
+
+ void start_element(const sax::parser_element& elem)
+ {
+ m_scopes.emplace_back();
+ sax::detail::elem_scope& scope = m_scopes.back();
+ scope.ns = m_ns_cxt.get(elem.ns);
+ scope.name = elem.name;
+ scope.ns_keys.swap(m_ns_keys);
+
+ m_elem.ns = scope.ns;
+ m_elem.ns_alias = elem.ns;
+ m_elem.name = scope.name;
+ m_elem.begin_pos = elem.begin_pos;
+ m_elem.end_pos = elem.end_pos;
+ m_handler.start_element(m_elem);
+
+ m_attrs.clear();
+ }
+
+ void end_element(const sax::parser_element& elem)
+ {
+ sax::detail::elem_scope& scope = m_scopes.back();
+ if (scope.ns != m_ns_cxt.get(elem.ns) || scope.name != elem.name)
+ throw malformed_xml_error("mis-matching closing element.", -1);
+
+ m_elem.ns = scope.ns;
+ m_elem.ns_alias = elem.ns;
+ m_elem.name = scope.name;
+ m_elem.begin_pos = elem.begin_pos;
+ m_elem.end_pos = elem.end_pos;
+ m_handler.end_element(m_elem);
+
+ // Pop all namespaces declared in this scope.
+ for (const std::string_view& key : scope.ns_keys)
+ m_ns_cxt.pop(key);
+
+ m_scopes.pop_back();
+ }
+
+ void characters(std::string_view val, bool transient)
+ {
+ m_handler.characters(val, transient);
+ }
+
+ void attribute(const sax::parser_attribute& attr)
+ {
+ if (m_declaration)
+ {
+ // XML declaration attribute. Pass it through to the handler without namespace.
+ m_handler.attribute(attr.name, attr.value);
+ return;
+ }
+
+ if (m_attrs.count(sax::detail::entity_name(attr.ns, attr.name)) > 0)
+ throw malformed_xml_error(
+ "You can't define two attributes of the same name in the same element.", -1);
+
+ m_attrs.insert(sax::detail::entity_name(attr.ns, attr.name));
+
+ if (attr.ns.empty() && attr.name == "xmlns")
+ {
+ // Default namespace
+ m_ns_cxt.push(std::string_view{}, attr.value);
+ m_ns_keys.insert(std::string_view{});
+ return;
+ }
+
+ if (attr.ns == "xmlns")
+ {
+ // Namespace alias
+ if (!attr.name.empty())
+ {
+ m_ns_cxt.push(attr.name, attr.value);
+ m_ns_keys.insert(attr.name);
+ }
+ return;
+ }
+
+ m_attr.ns = attr.ns.empty() ? XMLNS_UNKNOWN_ID : m_ns_cxt.get(attr.ns);
+ m_attr.ns_alias = attr.ns;
+ m_attr.name = attr.name;
+ m_attr.value = attr.value;
+ m_attr.transient = attr.transient;
+ m_handler.attribute(m_attr);
+ }
+ };
+
+private:
+ handler_wrapper m_wrapper;
+ sax_parser<handler_wrapper> m_parser;
+};
+
+template<typename HandlerT>
+sax_ns_parser<HandlerT>::sax_ns_parser(
+ std::string_view content, xmlns_context& ns_cxt, handler_type& handler) :
+ m_wrapper(ns_cxt, handler), m_parser(content, m_wrapper)
+{
+}
+
+template<typename HandlerT>
+void sax_ns_parser<HandlerT>::parse()
+{
+ m_parser.parse();
+}
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/sax_parser.hpp b/include/orcus/sax_parser.hpp
new file mode 100644
index 0000000..f7283d2
--- /dev/null
+++ b/include/orcus/sax_parser.hpp
@@ -0,0 +1,576 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_SAX_PARSER_HPP
+#define INCLUDED_ORCUS_SAX_PARSER_HPP
+
+#include "sax_parser_base.hpp"
+
+#include <string_view>
+
+namespace orcus {
+
+struct sax_parser_default_config
+{
+ /**
+ * An integer value representing a baseline XML version. A value of 10
+ * corresponds with version 1.0 whereas a value of 11 corresponds with
+ * version 1.1.
+ */
+ static constexpr uint8_t baseline_version = 10;
+};
+
+class sax_handler
+{
+public:
+ /**
+ * Called when a doctype declaration &lt;!DOCTYPE ... &gt; is encountered.
+ *
+ * @param dtd struct containing doctype declaration data.
+ */
+ void doctype(const orcus::sax::doctype_declaration& dtd)
+ {
+ (void)dtd;
+ }
+
+ /**
+ * Called when &lt;?... is encountered, where the '...' may be an
+ * arbitraray dentifier. One common declaration is &lt;?xml which is
+ * typically given at the start of an XML stream.
+ *
+ * @param decl name of the identifier.
+ */
+ void start_declaration(std::string_view decl)
+ {
+ (void)decl;
+ }
+
+ /**
+ * Called when the closing tag (&gt;) of a &lt;?... ?&gt; is encountered.
+ *
+ * @param decl name of the identifier.
+ */
+ void end_declaration(std::string_view decl)
+ {
+ (void)decl;
+ }
+
+ /**
+ * Called at the start of each element.
+ *
+ * @param elem information of the element being parsed.
+ */
+ void start_element(const orcus::sax::parser_element& elem)
+ {
+ (void)elem;
+ }
+
+ /**
+ * Called at the end of each element.
+ *
+ * @param elem information of the element being parsed.
+ */
+ void end_element(const orcus::sax::parser_element& elem)
+ {
+ (void)elem;
+ }
+
+ /**
+ * Called when a segment of a text content is parsed. Each text content
+ * is a direct child of an element, which may have multiple child contents
+ * when the element also has a child element that are direct sibling to
+ * the text contents or the text contents are splitted by a comment.
+ *
+ * @param val value of the text content.
+ * @param transient when true, the text content has been converted and is
+ * stored in a temporary buffer due to presence of one or
+ * more encoded characters, in which case <em>the passed
+ * text value needs to be either immediately converted to
+ * a non-text value or be interned within the scope of
+ * the callback</em>.
+ */
+ void characters(std::string_view val, bool transient)
+ {
+ (void)val; (void)transient;
+ }
+
+ /**
+ * Called upon parsing of an attribute of an element. Note that <em>when
+ * the attribute's transient flag is set, the attribute value is stored in
+ * a temporary buffer due to presence of one or more encoded characters,
+ * and must be processed within the scope of the callback</em>.
+ *
+ * @param attr struct containing attribute information.
+ */
+ void attribute(const orcus::sax::parser_attribute& attr)
+ {
+ (void)attr;
+ }
+};
+
+/**
+ * SAX parser for XML documents.
+ *
+ * This parser is barebone in that it only parses the document and picks up
+ * all encountered elements and attributes without checking proper element
+ * pairs. The user is responsible for checking whether or not the document is
+ * well-formed in terms of element scopes.
+ *
+ * This parser additionally records the begin and end offset positions of each
+ * element.
+ *
+ * @tparam HandlerT Handler type with member functions for event callbacks.
+ * Refer to @ref sax_handler.
+ * @tparam ConfigT Parser configuration.
+ */
+template<typename HandlerT, typename ConfigT = sax_parser_default_config>
+class sax_parser : public sax::parser_base
+{
+public:
+ typedef HandlerT handler_type;
+ typedef ConfigT config_type;
+
+ sax_parser(std::string_view content, handler_type& handler);
+ ~sax_parser() = default;
+
+ void parse();
+
+private:
+
+ /**
+ * Parse XML header that occurs at the beginning of every XML stream i.e.
+ * <?xml version="..." encoding="..." ?>
+ */
+ void header();
+ void body();
+ void element();
+ void element_open(std::ptrdiff_t begin_pos);
+ void element_close(std::ptrdiff_t begin_pos);
+ void special_tag();
+ void declaration(const char* name_check);
+ void cdata();
+ void doctype();
+ void characters();
+ void attribute();
+
+private:
+ handler_type& m_handler;
+};
+
+template<typename HandlerT, typename ConfigT>
+sax_parser<HandlerT,ConfigT>::sax_parser(std::string_view content, handler_type& handler) :
+ sax::parser_base(content.data(), content.size()),
+ m_handler(handler)
+{
+}
+
+template<typename HandlerT, typename ConfigT>
+void sax_parser<HandlerT,ConfigT>::parse()
+{
+ m_nest_level = 0;
+ mp_char = mp_begin;
+ header();
+ skip_space_and_control();
+ body();
+
+ assert(m_buffer_pos == 0);
+}
+
+template<typename HandlerT, typename ConfigT>
+void sax_parser<HandlerT,ConfigT>::header()
+{
+ // we don't handle multi byte encodings so we can just skip bom entry if exists.
+ skip_bom();
+
+ // Allow leading whitespace in the XML stream.
+ // TODO : Make this configurable since strictly speaking such an XML
+ // sttream is invalid.
+ skip_space_and_control();
+
+ if (!has_char() || cur_char() != '<')
+ throw malformed_xml_error("xml file must begin with '<'.", offset());
+
+ if (config_type::baseline_version >= 11)
+ {
+ // XML version 1.1 requires a header declaration whereas in 1.0 it's
+ // optional.
+ if (next_char_checked() != '?')
+ throw malformed_xml_error("xml file must begin with '<?'.", offset());
+
+ declaration("xml");
+ }
+}
+
+template<typename HandlerT, typename ConfigT>
+void sax_parser<HandlerT,ConfigT>::body()
+{
+ while (has_char())
+ {
+ if (cur_char() == '<')
+ {
+ element();
+ if (!m_root_elem_open)
+ // Root element closed. Stop parsing.
+ return;
+ }
+ else if (m_nest_level)
+ // Call characters only when in xml hierarchy.
+ characters();
+ else
+ next();
+ }
+}
+
+template<typename HandlerT, typename ConfigT>
+void sax_parser<HandlerT,ConfigT>::element()
+{
+ assert(cur_char() == '<');
+ std::ptrdiff_t pos = offset();
+ char c = next_char_checked();
+ switch (c)
+ {
+ case '/':
+ element_close(pos);
+ return;
+ case '!':
+ special_tag();
+ return;
+ case '?':
+ declaration(nullptr);
+ return;
+ }
+
+ element_open(pos);
+}
+
+template<typename HandlerT, typename ConfigT>
+void sax_parser<HandlerT,ConfigT>::element_open(std::ptrdiff_t begin_pos)
+{
+ sax::parser_element elem;
+ element_name(elem, begin_pos);
+
+ while (true)
+ {
+ skip_space_and_control();
+ char c = cur_char_checked();
+ if (c == '/')
+ {
+ // Self-closing element: <element/>
+ if (next_and_char() != '>')
+ throw malformed_xml_error("expected '/>' to self-close the element.", offset());
+ next();
+ elem.end_pos = offset();
+ m_handler.start_element(elem);
+ reset_buffer_pos();
+ m_handler.end_element(elem);
+ if (!m_nest_level)
+ m_root_elem_open = false;
+#if ORCUS_DEBUG_SAX_PARSER
+ cout << "element_open: ns='" << elem.ns << "', name='" << elem.name << "' (self-closing)" << endl;
+#endif
+ return;
+ }
+ else if (c == '>')
+ {
+ // End of opening element: <element>
+ next();
+ elem.end_pos = offset();
+ nest_up();
+ m_handler.start_element(elem);
+ reset_buffer_pos();
+#if ORCUS_DEBUG_SAX_PARSER
+ cout << "element_open: ns='" << elem.ns << "', name='" << elem.name << "'" << endl;
+#endif
+ return;
+ }
+ else
+ attribute();
+ }
+}
+
+template<typename HandlerT, typename ConfigT>
+void sax_parser<HandlerT,ConfigT>::element_close(std::ptrdiff_t begin_pos)
+{
+ assert(cur_char() == '/');
+ nest_down();
+ next_check();
+ sax::parser_element elem;
+ element_name(elem, begin_pos);
+
+ if (cur_char() != '>')
+ throw malformed_xml_error("expected '>' to close the element.", offset());
+ next();
+ elem.end_pos = offset();
+
+ m_handler.end_element(elem);
+#if ORCUS_DEBUG_SAX_PARSER
+ cout << "element_close: ns='" << elem.ns << "', name='" << elem.name << "'" << endl;
+#endif
+ if (!m_nest_level)
+ m_root_elem_open = false;
+}
+
+template<typename HandlerT, typename ConfigT>
+void sax_parser<HandlerT,ConfigT>::special_tag()
+{
+ assert(cur_char() == '!');
+ // This can be either <![CDATA, <!--, or <!DOCTYPE.
+ size_t len = available_size();
+ if (len < 2)
+ throw malformed_xml_error("special tag too short.", offset());
+
+ switch (next_and_char())
+ {
+ case '-':
+ {
+ // Possibly comment.
+ if (next_and_char() != '-')
+ throw malformed_xml_error("comment expected.", offset());
+
+ len -= 2;
+ if (len < 3)
+ throw malformed_xml_error("malformed comment.", offset());
+
+ next();
+ comment();
+ }
+ break;
+ case '[':
+ {
+ // Possibly a CDATA.
+ expects_next("CDATA[", 6);
+ if (has_char())
+ cdata();
+ }
+ break;
+ case 'D':
+ {
+ // check if this is a DOCTYPE.
+ expects_next("OCTYPE", 6);
+ skip_space_and_control();
+ if (has_char())
+ doctype();
+ }
+ break;
+ default:
+ throw malformed_xml_error("failed to parse special tag.", offset());
+ }
+}
+
+template<typename HandlerT, typename ConfigT>
+void sax_parser<HandlerT,ConfigT>::declaration(const char* name_check)
+{
+ assert(cur_char() == '?');
+ next_check();
+
+ // Get the declaration name first.
+ std::string_view decl_name;
+ name(decl_name);
+#if ORCUS_DEBUG_SAX_PARSER
+ cout << "sax_parser::declaration: start name='" << decl_name << "'" << endl;
+#endif
+
+ if (name_check && decl_name != name_check)
+ {
+ std::ostringstream os;
+ os << "declaration name of '" << name_check << "' was expected, but '" << decl_name << "' was found instead.";
+ throw malformed_xml_error(os.str(), offset());
+ }
+
+ m_handler.start_declaration(decl_name);
+ skip_space_and_control();
+
+ // Parse the attributes.
+ while (cur_char_checked() != '?')
+ {
+ attribute();
+ skip_space_and_control();
+ }
+ if (next_char_checked() != '>')
+ throw malformed_xml_error("declaration must end with '?>'.", offset());
+
+ m_handler.end_declaration(decl_name);
+ reset_buffer_pos();
+ next();
+#if ORCUS_DEBUG_SAX_PARSER
+ cout << "sax_parser::declaration: end name='" << decl_name << "'" << endl;
+#endif
+}
+
+template<typename HandlerT, typename ConfigT>
+void sax_parser<HandlerT,ConfigT>::cdata()
+{
+ size_t len = available_size();
+ assert(len > 3);
+
+ // Parse until we reach ']]>'.
+ const char* p0 = mp_char;
+ size_t i = 0, match = 0;
+ for (char c = cur_char(); i < len; ++i, c = next_and_char())
+ {
+ if (c == ']')
+ {
+ // Be aware that we may encounter a series of more than two ']'
+ // characters, in which case we'll only count the last two.
+
+ if (match == 0)
+ // First ']'
+ ++match;
+ else if (match == 1)
+ // Second ']'
+ ++match;
+ }
+ else if (c == '>' && match == 2)
+ {
+ // Found ']]>'.
+ size_t cdata_len = i - 2;
+ m_handler.characters(std::string_view(p0, cdata_len), false);
+ next();
+ return;
+ }
+ else
+ match = 0;
+ }
+ throw malformed_xml_error("malformed CDATA section.", offset());
+}
+
+template<typename HandlerT, typename ConfigT>
+void sax_parser<HandlerT,ConfigT>::doctype()
+{
+ // Parse the root element first.
+ sax::doctype_declaration param;
+ name(param.root_element);
+ skip_space_and_control();
+
+ // Either PUBLIC or SYSTEM.
+ size_t len = available_size();
+ if (len < 6)
+ throw malformed_xml_error("DOCTYPE section too short.", offset());
+
+ param.keyword = sax::doctype_declaration::keyword_type::dtd_private;
+ char c = cur_char();
+ if (c == 'P')
+ {
+ if (next_and_char() != 'U' || next_and_char() != 'B' || next_and_char() != 'L' || next_and_char() != 'I' || next_and_char() != 'C')
+ throw malformed_xml_error("malformed DOCTYPE section.", offset());
+
+ param.keyword = sax::doctype_declaration::keyword_type::dtd_public;
+ }
+ else if (c == 'S')
+ {
+ if (next_and_char() != 'Y' || next_and_char() != 'S' || next_and_char() != 'T' || next_and_char() != 'E' || next_and_char() != 'M')
+ throw malformed_xml_error("malformed DOCTYPE section.", offset());
+ }
+
+ next_check();
+ skip_space_and_control();
+
+ // Parse FPI.
+ value(param.fpi, false);
+
+ has_char_throw("DOCTYPE section too short.");
+ skip_space_and_control();
+ has_char_throw("DOCTYPE section too short.");
+
+ if (cur_char() == '>')
+ {
+ // Optional URI not given. Exit.
+#if ORCUS_DEBUG_SAX_PARSER
+ cout << "sax_parser::doctype: root='" << param.root_element << "', fpi='" << param.fpi << "'" << endl;
+#endif
+ m_handler.doctype(param);
+ next();
+ return;
+ }
+
+ // Parse optional URI.
+ value(param.uri, false);
+
+ has_char_throw("DOCTYPE section too short.");
+ skip_space_and_control();
+ has_char_throw("DOCTYPE section too short.");
+
+ if (cur_char() != '>')
+ throw malformed_xml_error("malformed DOCTYPE section - closing '>' expected but not found.", offset());
+
+#if ORCUS_DEBUG_SAX_PARSER
+ cout << "sax_parser::doctype: root='" << param.root_element << "', fpi='" << param.fpi << "' uri='" << param.uri << "'" << endl;
+#endif
+ m_handler.doctype(param);
+ next();
+}
+
+template<typename HandlerT, typename ConfigT>
+void sax_parser<HandlerT,ConfigT>::characters()
+{
+ const char* p0 = mp_char;
+ for (; has_char(); next())
+ {
+ if (cur_char() == '<')
+ break;
+
+ if (cur_char() == '&')
+ {
+ // Text span with one or more encoded characters. Parse using cell buffer.
+ cell_buffer& buf = get_cell_buffer();
+ buf.reset();
+ buf.append(p0, mp_char-p0);
+ characters_with_encoded_char(buf);
+ if (buf.empty())
+ m_handler.characters(std::string_view{}, false);
+ else
+ m_handler.characters(buf.str(), true);
+ return;
+ }
+ }
+
+ if (mp_char > p0)
+ {
+ std::string_view val(p0, mp_char-p0);
+ m_handler.characters(val, false);
+ }
+}
+
+template<typename HandlerT, typename ConfigT>
+void sax_parser<HandlerT,ConfigT>::attribute()
+{
+ sax::parser_attribute attr;
+ attribute_name(attr.ns, attr.name);
+
+#if ORCUS_DEBUG_SAX_PARSER
+ cout << "sax_parser::attribute: ns='" << attr.ns << "', name='" << attr.name << "'" << endl;
+#endif
+
+ skip_space_and_control();
+
+ char c = cur_char_checked();
+ if (c != '=')
+ {
+ std::ostringstream os;
+ os << "Attribute must begin with 'name=..'. (ns='" << attr.ns << "', name='" << attr.name << "')";
+ throw malformed_xml_error(os.str(), offset());
+ }
+
+ next_check(); // skip the '='.
+ skip_space_and_control();
+
+ attr.transient = value(attr.value, true);
+ if (attr.transient)
+ // Value is stored in a temporary buffer. Push a new buffer.
+ inc_buffer_pos();
+
+#if ORCUS_DEBUG_SAX_PARSER
+ cout << "sax_parser::attribute: value='" << attr.value << "'" << endl;
+#endif
+
+ m_handler.attribute(attr);
+}
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/sax_parser_base.hpp b/include/orcus/sax_parser_base.hpp
new file mode 100644
index 0000000..4dcfc07
--- /dev/null
+++ b/include/orcus/sax_parser_base.hpp
@@ -0,0 +1,207 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_SAX_PARSER_BASE_HPP
+#define INCLUDED_ORCUS_SAX_PARSER_BASE_HPP
+
+#include "env.hpp"
+#include "cell_buffer.hpp"
+#include "parser_global.hpp"
+#include "parser_base.hpp"
+
+#include <cassert>
+#include <cstdlib>
+#include <exception>
+#include <sstream>
+#include <memory>
+
+#define ORCUS_DEBUG_SAX_PARSER 0
+
+#if ORCUS_DEBUG_SAX_PARSER
+#include <iostream>
+using std::cout;
+using std::endl;
+#endif
+
+namespace orcus { namespace sax {
+
+/**
+ * Document type declaration passed by sax_parser to its handler's doctype()
+ * call.
+ */
+struct doctype_declaration
+{
+ enum class keyword_type { dtd_public, dtd_private };
+
+ keyword_type keyword;
+ std::string_view root_element;
+ std::string_view fpi;
+ std::string_view uri;
+};
+
+/**
+ * Given an encoded name (such as 'quot' and 'amp'), return a single
+ * character that corresponds with the name. The name shouldn't include the
+ * leading '&' and trailing ';'.
+ *
+ * @param p pointer to the first character of encoded name
+ * @param n length of encoded name
+ *
+ * @return single character that corresponds with the encoded name. '\0' is
+ * returned if decoding fails.
+ */
+ORCUS_PSR_DLLPUBLIC char decode_xml_encoded_char(const char* p, size_t n);
+
+/**
+ * Given an encoded unicode value (such as #20A9), return a UTF-8 string
+ * that corresponds with the unicode value. The value shouldn't include the
+ * leading '&' and trailing ';'.
+ *
+ * @param p pointer to the first character of encoded name
+ * @param n length of encoded name
+ *
+ * @return string that corresponds with the encoded value. An empty string
+ * is returned if decoding fails.
+ */
+ORCUS_PSR_DLLPUBLIC std::string decode_xml_unicode_char(const char* p, size_t n);
+
+/**
+ * Element properties passed by sax_parser to its handler's open_element()
+ * and close_element() calls.
+ */
+struct parser_element
+{
+ /** Optional element namespace. It may be empty if it's not given. */
+ std::string_view ns;
+ /** Element name. */
+ std::string_view name;
+ /** Position of the opening brace '<'. */
+ std::ptrdiff_t begin_pos;
+ /** Position immediately after the closing brace '>'. */
+ std::ptrdiff_t end_pos;
+};
+
+/**
+ * Attribute properties passed by sax_parser to its handler's attribute()
+ * call. When an attribute value is "transient", it has been converted due to
+ * presence of encoded character(s) and has been stored in a temporary buffer.
+ * The handler must assume that the value will not survive after the callback
+ * function ends.
+ */
+struct parser_attribute
+{
+ /** Optional attribute namespace. It may be empty if it's not given. */
+ std::string_view ns;
+ /** Attribute name. */
+ std::string_view name;
+ /** Attribute value. */
+ std::string_view value;
+ /** Whether or not the attribute value is in a temporary buffer. */
+ bool transient;
+};
+
+class ORCUS_PSR_DLLPUBLIC parser_base : public ::orcus::parser_base
+{
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+ parser_base() = delete;
+ parser_base(const parser_base&) = delete;
+ parser_base& operator=(const parser_base&) = delete;
+protected:
+ size_t m_nest_level;
+ size_t m_buffer_pos;
+ bool m_root_elem_open:1;
+
+protected:
+ parser_base(const char* content, size_t size);
+ ~parser_base();
+
+ void next_check()
+ {
+ next();
+ if (!has_char())
+ throw malformed_xml_error("xml stream ended prematurely.", offset());
+ }
+
+ void nest_up() { ++m_nest_level; }
+ void nest_down()
+ {
+ if (m_nest_level == 0)
+ throw malformed_xml_error("incorrect nesting in xml stream", offset());
+
+ --m_nest_level;
+ }
+
+ void inc_buffer_pos();
+ void reset_buffer_pos() { m_buffer_pos = 0; }
+
+ void has_char_throw(const char* msg) const
+ {
+ if (!has_char())
+ throw malformed_xml_error(msg, offset());
+ }
+
+ char cur_char_checked() const
+ {
+ if (!has_char())
+ throw malformed_xml_error("xml stream ended prematurely.", offset());
+
+ return *mp_char;
+ }
+
+ char next_and_char()
+ {
+ next();
+#if ORCUS_DEBUG_SAX_PARSER
+ if (mp_char >= mp_end)
+ throw malformed_xml_error("xml stream ended prematurely.", offset());
+#endif
+ return *mp_char;
+ }
+
+ char next_char_checked()
+ {
+ next();
+ if (!has_char())
+ throw malformed_xml_error("xml stream ended prematurely.", offset());
+
+ return *mp_char;
+ }
+
+ cell_buffer& get_cell_buffer();
+
+ void comment();
+
+ void expects_next(const char* p, size_t n);
+
+ void parse_encoded_char(cell_buffer& buf);
+ void value_with_encoded_char(cell_buffer& buf, std::string_view& str, char quote_char);
+
+ /**
+ * Parse quoted value. Note that the retrieved string may be stored in a
+ * temporary cell buffer if the decode parameter is true. Use the string
+ * immediately after this call before the buffer becomes invalid.
+ *
+ * @note This method checks for valid stream; the caller doesn't need to
+ * check for valid stream before calling this method.
+ *
+ * @return true if the value is stored in temporary buffer, false
+ * otherwise.
+ */
+ bool value(std::string_view& str, bool decode);
+
+ void name(std::string_view& str);
+ void element_name(parser_element& elem, std::ptrdiff_t begin_pos);
+ void attribute_name(std::string_view& attr_ns, std::string_view& attr_name);
+ void characters_with_encoded_char(cell_buffer& buf);
+};
+
+}}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/sax_token_parser.hpp b/include/orcus/sax_token_parser.hpp
new file mode 100644
index 0000000..867c8b5
--- /dev/null
+++ b/include/orcus/sax_token_parser.hpp
@@ -0,0 +1,186 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_SAX_TOKEN_PARSER_HPP
+#define INCLUDED_ORCUS_SAX_TOKEN_PARSER_HPP
+
+#include "sax_ns_parser.hpp"
+#include "types.hpp"
+
+#include <vector>
+#include <algorithm>
+#include <functional>
+
+namespace orcus {
+
+class tokens;
+
+class ORCUS_PSR_DLLPUBLIC sax_token_handler_wrapper_base
+{
+protected:
+ xml_declaration_t m_declaration;
+ xml_token_element_t m_elem;
+ const tokens& m_tokens;
+
+ xml_token_t tokenize(std::string_view name) const;
+ void set_element(const sax_ns_parser_element& elem);
+
+public:
+ sax_token_handler_wrapper_base(const tokens& _tokens);
+
+ void attribute(std::string_view name, std::string_view val);
+ void attribute(const sax_ns_parser_attribute& attr);
+};
+
+class sax_token_handler
+{
+public:
+
+ /**
+ * Called immediately after the entire XML declaration has been parsed.
+ *
+ * @param decl struct containing the attributes of the XML declaration.
+ */
+ void declaration(const orcus::xml_declaration_t& decl)
+ {
+ (void)decl;
+ }
+
+ /**
+ * Called at the start of each element.
+ *
+ * @param elem struct containing the element's information as well as all
+ * the attributes that belong to the element.
+ */
+ void start_element(const orcus::xml_token_element_t& elem)
+ {
+ (void)elem;
+ }
+
+ /**
+ * Called at the end of each element.
+ *
+ * @param elem struct containing the element's information as well as all
+ * the attributes that belong to the element.
+ */
+ void end_element(const orcus::xml_token_element_t& elem)
+ {
+ (void)elem;
+ }
+
+ /**
+ * Called when a segment of a text content is parsed. Each text content
+ * is a direct child of an element, which may have multiple child contents
+ * when the element also has a child element that are direct sibling to
+ * the text contents or the text contents are splitted by a comment.
+ *
+ * @param val value of the text content.
+ * @param transient when true, the text content has been converted and is
+ * stored in a temporary buffer due to presence of one or
+ * more encoded characters, in which case <em>the passed
+ * text value needs to be either immediately converted to
+ * a non-text value or be interned within the scope of
+ * the callback</em>.
+ */
+ void characters(std::string_view val, bool transient)
+ {
+ (void)val; (void)transient;
+ }
+};
+
+/**
+ * SAX parser that tokenizes element and attribute names while parsing. All
+ * pre-defined elements and attribute names are translated into integral
+ * identifiers via use of @ref tokens. The user of this class needs to
+ * provide a pre-defined set of element and attribute names at construction
+ * time.
+ *
+ * This parser internally uses @ref sax_ns_parser.
+ *
+ * @tparam HandlerT Handler type with member functions for event callbacks.
+ * Refer to @ref sax_token_handler.
+ */
+template<typename HandlerT>
+class sax_token_parser
+{
+public:
+ typedef HandlerT handler_type;
+
+ sax_token_parser(
+ std::string_view content, const tokens& _tokens,
+ xmlns_context& ns_cxt, handler_type& handler);
+
+ ~sax_token_parser() = default;
+
+ void parse();
+
+private:
+
+ /**
+ * Re-route callbacks from the internal sax_ns_parser into the
+ * sax_token_parser callbacks.
+ */
+ class handler_wrapper : public sax_token_handler_wrapper_base
+ {
+ handler_type& m_handler;
+
+ public:
+ handler_wrapper(const tokens& _tokens, handler_type& handler) :
+ sax_token_handler_wrapper_base(_tokens), m_handler(handler) {}
+
+ void doctype(const sax::doctype_declaration&) {}
+
+ void start_declaration(std::string_view) {}
+
+ void end_declaration(std::string_view)
+ {
+ m_handler.declaration(m_declaration);
+ m_elem.attrs.clear();
+ }
+
+ void start_element(const sax_ns_parser_element& elem)
+ {
+ set_element(elem);
+ m_handler.start_element(m_elem);
+ m_elem.attrs.clear();
+ }
+
+ void end_element(const sax_ns_parser_element& elem)
+ {
+ set_element(elem);
+ m_handler.end_element(m_elem);
+ }
+
+ void characters(std::string_view val, bool transient)
+ {
+ m_handler.characters(val, transient);
+ }
+ };
+
+private:
+ handler_wrapper m_wrapper;
+ sax_ns_parser<handler_wrapper> m_parser;
+};
+
+template<typename HandlerT>
+sax_token_parser<HandlerT>::sax_token_parser(
+ std::string_view content, const tokens& _tokens, xmlns_context& ns_cxt, handler_type& handler) :
+ m_wrapper(_tokens, handler),
+ m_parser(content, ns_cxt, m_wrapper)
+{
+}
+
+template<typename HandlerT>
+void sax_token_parser<HandlerT>::parse()
+{
+ m_parser.parse();
+}
+
+} // namespace orcus
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/sax_token_parser_thread.hpp b/include/orcus/sax_token_parser_thread.hpp
new file mode 100644
index 0000000..b364573
--- /dev/null
+++ b/include/orcus/sax_token_parser_thread.hpp
@@ -0,0 +1,92 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_SAX_TOKEN_PARSER_THREAD_HPP
+#define INCLUDED_ORCUS_SAX_TOKEN_PARSER_THREAD_HPP
+
+#include "env.hpp"
+#include "types.hpp"
+
+#include <memory>
+#include <variant>
+#include <vector>
+#include <ostream>
+
+namespace orcus {
+
+class tokens;
+class xmlns_context;
+class string_pool;
+struct xml_token_element_t;
+
+namespace sax {
+
+enum class parse_token_t
+{
+ unknown,
+ start_element,
+ end_element,
+ characters,
+ parse_error,
+};
+
+struct ORCUS_PSR_DLLPUBLIC parse_token
+{
+ using value_type = std::variant<std::string_view, parse_error_value_t, const xml_token_element_t*>;
+
+ parse_token_t type;
+ value_type value;
+
+ parse_token();
+ parse_token(std::string_view _characters);
+ parse_token(parse_token_t _type, const xml_token_element_t* _element);
+ parse_token(std::string_view msg, std::ptrdiff_t offset);
+
+ parse_token(const parse_token& other);
+
+ parse_token& operator= (parse_token) = delete;
+
+ bool operator== (const parse_token& other) const;
+ bool operator!= (const parse_token& other) const;
+};
+
+typedef std::vector<parse_token> parse_tokens_t;
+
+ORCUS_PSR_DLLPUBLIC std::ostream& operator<< (std::ostream& os, const parse_tokens_t& tokens);
+
+class ORCUS_PSR_DLLPUBLIC parser_thread
+{
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+public:
+ parser_thread(const char* p, size_t n, const orcus::tokens& tks, xmlns_context& ns_cxt, size_t min_token_size);
+ parser_thread(const char* p, size_t n, const orcus::tokens& tks, xmlns_context& ns_cxt, size_t min_token_size, size_t max_token_size);
+ ~parser_thread();
+
+ void start();
+
+ /**
+ * Wait until new set of tokens becomes available.
+ *
+ * @param tokens new set of tokens.
+ *
+ * @return true if the parsing is still in progress (therefore more tokens
+ * to come), false if it's done i.e. this is the last token set.
+ */
+ bool next_tokens(parse_tokens_t& tokens);
+
+ void swap_string_pool(string_pool& pool);
+
+ void abort();
+};
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/spreadsheet/Makefile.am b/include/orcus/spreadsheet/Makefile.am
new file mode 100644
index 0000000..b01bce7
--- /dev/null
+++ b/include/orcus/spreadsheet/Makefile.am
@@ -0,0 +1,26 @@
+
+liborcusdir = $(includedir)/liborcus-@ORCUS_API_VERSION@/orcus/spreadsheet
+liborcus_HEADERS = \
+ types.hpp \
+ view_types.hpp \
+ export_interface.hpp \
+ import_interface.hpp \
+ import_interface_pivot.hpp \
+ import_interface_styles.hpp \
+ import_interface_view.hpp
+
+if BUILD_SPREADSHEET_MODEL
+
+liborcus_HEADERS += \
+ auto_filter.hpp \
+ config.hpp \
+ document.hpp \
+ document_types.hpp \
+ factory.hpp \
+ pivot.hpp \
+ shared_strings.hpp \
+ sheet.hpp \
+ styles.hpp \
+ view.hpp
+
+endif
diff --git a/include/orcus/spreadsheet/Makefile.in b/include/orcus/spreadsheet/Makefile.in
new file mode 100644
index 0000000..2331067
--- /dev/null
+++ b/include/orcus/spreadsheet/Makefile.in
@@ -0,0 +1,680 @@
+# Makefile.in generated by automake 1.16.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2021 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.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+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@
+@BUILD_SPREADSHEET_MODEL_TRUE@am__append_1 = \
+@BUILD_SPREADSHEET_MODEL_TRUE@ auto_filter.hpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ config.hpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ document.hpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ document_types.hpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ factory.hpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ pivot.hpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ shared_strings.hpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ sheet.hpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ styles.hpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ view.hpp
+
+subdir = include/orcus/spreadsheet
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
+ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_17.m4 \
+ $(top_srcdir)/m4/boost.m4 $(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)/m4/m4_ax_valgrind_check.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__liborcus_HEADERS_DIST) \
+ $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__liborcus_HEADERS_DIST = types.hpp view_types.hpp \
+ export_interface.hpp import_interface.hpp \
+ import_interface_pivot.hpp import_interface_styles.hpp \
+ import_interface_view.hpp auto_filter.hpp config.hpp \
+ document.hpp document_types.hpp factory.hpp pivot.hpp \
+ shared_strings.hpp sheet.hpp styles.hpp view.hpp
+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)$(liborcusdir)"
+HEADERS = $(liborcus_HEADERS)
+am__extra_recursive_targets = check-valgrind-recursive \
+ check-valgrind-memcheck-recursive \
+ check-valgrind-helgrind-recursive check-valgrind-drd-recursive \
+ check-valgrind-sgcheck-recursive
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+am__DIST_COMMON = $(srcdir)/Makefile.in
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BOOST_CPPFLAGS = @BOOST_CPPFLAGS@
+BOOST_DATE_TIME_LDFLAGS = @BOOST_DATE_TIME_LDFLAGS@
+BOOST_DATE_TIME_LDPATH = @BOOST_DATE_TIME_LDPATH@
+BOOST_DATE_TIME_LIBS = @BOOST_DATE_TIME_LIBS@
+BOOST_FILESYSTEM_LDFLAGS = @BOOST_FILESYSTEM_LDFLAGS@
+BOOST_FILESYSTEM_LDPATH = @BOOST_FILESYSTEM_LDPATH@
+BOOST_FILESYSTEM_LIBS = @BOOST_FILESYSTEM_LIBS@
+BOOST_IOSTREAMS_LDFLAGS = @BOOST_IOSTREAMS_LDFLAGS@
+BOOST_IOSTREAMS_LDPATH = @BOOST_IOSTREAMS_LDPATH@
+BOOST_IOSTREAMS_LIBS = @BOOST_IOSTREAMS_LIBS@
+BOOST_LDPATH = @BOOST_LDPATH@
+BOOST_PROGRAM_OPTIONS_LDFLAGS = @BOOST_PROGRAM_OPTIONS_LDFLAGS@
+BOOST_PROGRAM_OPTIONS_LDPATH = @BOOST_PROGRAM_OPTIONS_LDPATH@
+BOOST_PROGRAM_OPTIONS_LIBS = @BOOST_PROGRAM_OPTIONS_LIBS@
+BOOST_ROOT = @BOOST_ROOT@
+BOOST_SYSTEM_LDFLAGS = @BOOST_SYSTEM_LDFLAGS@
+BOOST_SYSTEM_LDPATH = @BOOST_SYSTEM_LDPATH@
+BOOST_SYSTEM_LIBS = @BOOST_SYSTEM_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CSCOPE = @CSCOPE@
+CTAGS = @CTAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_VALGRIND_drd = @ENABLE_VALGRIND_drd@
+ENABLE_VALGRIND_helgrind = @ENABLE_VALGRIND_helgrind@
+ENABLE_VALGRIND_memcheck = @ENABLE_VALGRIND_memcheck@
+ENABLE_VALGRIND_sgcheck = @ENABLE_VALGRIND_sgcheck@
+ETAGS = @ETAGS@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+HAVE_CXX17 = @HAVE_CXX17@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+IXION_REQUIRED_API_VERSION = @IXION_REQUIRED_API_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBIXION_CFLAGS = @LIBIXION_CFLAGS@
+LIBIXION_LIBS = @LIBIXION_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MDDS_CFLAGS = @MDDS_CFLAGS@
+MDDS_LIBS = @MDDS_LIBS@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+ORCUS_API_VERSION = @ORCUS_API_VERSION@
+ORCUS_MAJOR_VERSION = @ORCUS_MAJOR_VERSION@
+ORCUS_MICRO_VERSION = @ORCUS_MICRO_VERSION@
+ORCUS_MINOR_VERSION = @ORCUS_MINOR_VERSION@
+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@
+PARQUET_CFLAGS = @PARQUET_CFLAGS@
+PARQUET_LIBS = @PARQUET_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POW_LIB = @POW_LIB@
+PYTHON = @PYTHON@
+PYTHON_CFLAGS = @PYTHON_CFLAGS@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VALGRIND = @VALGRIND@
+VALGRIND_ENABLED = @VALGRIND_ENABLED@
+VERSION = @VERSION@
+ZLIB_CFLAGS = @ZLIB_CFLAGS@
+ZLIB_LIBS = @ZLIB_LIBS@
+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@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+runstatedir = @runstatedir@
+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@
+valgrind_enabled_tools = @valgrind_enabled_tools@
+valgrind_tools = @valgrind_tools@
+liborcusdir = $(includedir)/liborcus-@ORCUS_API_VERSION@/orcus/spreadsheet
+liborcus_HEADERS = types.hpp view_types.hpp export_interface.hpp \
+ import_interface.hpp import_interface_pivot.hpp \
+ import_interface_styles.hpp import_interface_view.hpp \
+ $(am__append_1)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/orcus/spreadsheet/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign include/orcus/spreadsheet/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-liborcusHEADERS: $(liborcus_HEADERS)
+ @$(NORMAL_INSTALL)
+ @list='$(liborcus_HEADERS)'; test -n "$(liborcusdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(liborcusdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(liborcusdir)" || 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)$(liborcusdir)'"; \
+ $(INSTALL_HEADER) $$files "$(DESTDIR)$(liborcusdir)" || exit $$?; \
+ done
+
+uninstall-liborcusHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(liborcus_HEADERS)'; test -n "$(liborcusdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(liborcusdir)'; $(am__uninstall_files_from_dir)
+check-valgrind-local:
+check-valgrind-memcheck-local:
+check-valgrind-helgrind-local:
+check-valgrind-drd-local:
+check-valgrind-sgcheck-local:
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ 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-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ 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"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @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
+check-am: all-am
+check: check-am
+all-am: Makefile $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(liborcusdir)"; 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:
+
+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)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+check-valgrind: check-valgrind-am
+
+check-valgrind-am: check-valgrind-local
+
+check-valgrind-drd: check-valgrind-drd-am
+
+check-valgrind-drd-am: check-valgrind-drd-local
+
+check-valgrind-helgrind: check-valgrind-helgrind-am
+
+check-valgrind-helgrind-am: check-valgrind-helgrind-local
+
+check-valgrind-memcheck: check-valgrind-memcheck-am
+
+check-valgrind-memcheck-am: check-valgrind-memcheck-local
+
+check-valgrind-sgcheck: check-valgrind-sgcheck-am
+
+check-valgrind-sgcheck-am: check-valgrind-sgcheck-local
+
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-liborcusHEADERS
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+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 Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-liborcusHEADERS
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am check-valgrind-am \
+ check-valgrind-drd-am check-valgrind-drd-local \
+ check-valgrind-helgrind-am check-valgrind-helgrind-local \
+ check-valgrind-local check-valgrind-memcheck-am \
+ check-valgrind-memcheck-local check-valgrind-sgcheck-am \
+ check-valgrind-sgcheck-local clean clean-generic clean-libtool \
+ cscopelist-am ctags ctags-am distclean distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am 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-liborcusHEADERS install-man \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags tags-am uninstall uninstall-am uninstall-liborcusHEADERS
+
+.PRECIOUS: Makefile
+
+
+# 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/include/orcus/spreadsheet/auto_filter.hpp b/include/orcus/spreadsheet/auto_filter.hpp
new file mode 100644
index 0000000..b6f2959
--- /dev/null
+++ b/include/orcus/spreadsheet/auto_filter.hpp
@@ -0,0 +1,149 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_SPREADSHEET_AUTO_FILTER_HPP
+#define INCLUDED_ORCUS_SPREADSHEET_AUTO_FILTER_HPP
+
+#include "types.hpp"
+#include "../env.hpp"
+
+#include <map>
+#include <unordered_set>
+
+#include <ixion/address.hpp>
+
+namespace orcus { namespace spreadsheet {
+
+/**
+ * Data for a single column inside autofilter range.
+ */
+struct ORCUS_SPM_DLLPUBLIC auto_filter_column_t
+{
+ using match_values_type = std::unordered_set<std::string_view>;
+ match_values_type match_values;
+
+ auto_filter_column_t();
+ auto_filter_column_t(const auto_filter_column_t& other);
+ auto_filter_column_t(auto_filter_column_t&& other);
+ ~auto_filter_column_t();
+
+ auto_filter_column_t& operator=(const auto_filter_column_t& other);
+ auto_filter_column_t& operator=(auto_filter_column_t&& other);
+
+ void reset();
+ void swap(auto_filter_column_t& r);
+};
+
+/**
+ * Data for a single autofilter entry. An autofilter can belong to either a
+ * sheet or a table.
+ */
+struct ORCUS_SPM_DLLPUBLIC auto_filter_t
+{
+ typedef std::map<col_t, auto_filter_column_t> columns_type;
+
+ ixion::abs_range_t range;
+
+ columns_type columns;
+
+ auto_filter_t();
+ auto_filter_t(const auto_filter_t& other);
+ auto_filter_t(auto_filter_t&& other);
+ ~auto_filter_t();
+
+ auto_filter_t& operator=(const auto_filter_t& other);
+ auto_filter_t& operator=(auto_filter_t&& other);
+
+ void reset();
+ void swap(auto_filter_t& r);
+
+ /**
+ * Set column data to specified column index.
+ *
+ * @param col column index to associate the data to.
+ * @param data column data.
+ */
+ void commit_column(col_t col, auto_filter_column_t data);
+};
+
+/**
+ * Single column entry in table.
+ */
+struct ORCUS_SPM_DLLPUBLIC table_column_t
+{
+ std::size_t identifier;
+ std::string_view name;
+ std::string_view totals_row_label;
+ totals_row_function_t totals_row_function;
+
+ table_column_t();
+ table_column_t(const table_column_t& other);
+ ~table_column_t();
+
+ table_column_t& operator=(const table_column_t& other);
+
+ void reset();
+};
+
+/**
+ * Table style information.
+ */
+struct ORCUS_SPM_DLLPUBLIC table_style_t
+{
+ std::string_view name;
+
+ bool show_first_column:1;
+ bool show_last_column:1;
+ bool show_row_stripes:1;
+ bool show_column_stripes:1;
+
+ table_style_t();
+ table_style_t(const table_style_t& other);
+ ~table_style_t();
+
+ table_style_t& operator=(const table_style_t& other);
+
+ void reset();
+};
+
+/**
+ * Single table entry. A table is a range in a spreadsheet that represents
+ * a single set of data that can be used as a data source.
+ */
+struct ORCUS_SPM_DLLPUBLIC table_t
+{
+ typedef std::vector<table_column_t> columns_type;
+
+ size_t identifier;
+
+ std::string_view name;
+ std::string_view display_name;
+
+ ixion::abs_range_t range;
+
+ size_t totals_row_count;
+
+ auto_filter_t filter;
+ columns_type columns;
+ table_style_t style;
+
+ table_t();
+ table_t(const table_t& other);
+ table_t(table_t&& other);
+ ~table_t();
+
+ table_t& operator=(const table_t& other);
+ table_t& operator=(table_t&& other);
+
+ void reset();
+};
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/spreadsheet/config.hpp b/include/orcus/spreadsheet/config.hpp
new file mode 100644
index 0000000..11eebfc
--- /dev/null
+++ b/include/orcus/spreadsheet/config.hpp
@@ -0,0 +1,37 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_SPREADSHEET_CONFIG_HPP
+#define INCLUDED_ORCUS_SPREADSHEET_CONFIG_HPP
+
+#include "orcus/env.hpp"
+
+#include <cstdint>
+
+namespace orcus { namespace spreadsheet {
+
+struct ORCUS_SPM_DLLPUBLIC document_config
+{
+ /**
+ * Precision to use when converting numeric values to their string
+ * representations. A negative value indicates the precision is not being
+ * specified.
+ */
+ int8_t output_precision;
+
+ document_config();
+ document_config(const document_config& r);
+ ~document_config();
+
+ document_config& operator= (const document_config& r);
+};
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/spreadsheet/document.hpp b/include/orcus/spreadsheet/document.hpp
new file mode 100644
index 0000000..4f20b6e
--- /dev/null
+++ b/include/orcus/spreadsheet/document.hpp
@@ -0,0 +1,166 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_SPREADSHEET_DOCUMENT_HPP
+#define INCLUDED_ORCUS_SPREADSHEET_DOCUMENT_HPP
+
+#include "orcus/env.hpp"
+#include "orcus/interface.hpp"
+#include "orcus/spreadsheet/types.hpp"
+
+#include <ostream>
+#include <memory>
+
+namespace ixion {
+
+class formula_name_resolver;
+class model_context;
+struct abs_address_t;
+
+}
+
+namespace orcus {
+
+class string_pool;
+struct date_time_t;
+
+namespace spreadsheet {
+
+class shared_strings;
+class styles;
+class pivot_collection;
+class sheet;
+class import_factory;
+
+struct document_config;
+struct table_t;
+
+namespace detail {
+
+struct document_impl;
+
+}
+
+/**
+ * Store spreadsheet document content. It uses the @p model_context class
+ * from the ixion library to store raw cell values required in the computation
+ * of formula expressions.
+ */
+class ORCUS_SPM_DLLPUBLIC document : public orcus::iface::document_dumper
+{
+ friend class sheet;
+ friend class import_factory;
+
+public:
+ document(const document&) = delete;
+ document& operator= (const document&) = delete;
+
+ document(const range_size_t& sheet_size);
+ ~document();
+
+ /** See @ref iface::document_dumper. */
+ virtual void dump(dump_format_t format, const std::string& output) const override;
+
+ /** See @ref iface::document_dumper. */
+ virtual void dump_check(std::ostream& os) const override;
+
+ shared_strings& get_shared_strings();
+ const shared_strings& get_shared_strings() const;
+
+ styles& get_styles();
+ const styles& get_styles() const;
+
+ pivot_collection& get_pivot_collection();
+ const pivot_collection& get_pivot_collection() const;
+
+ sheet* append_sheet(std::string_view sheet_name);
+ sheet* get_sheet(std::string_view sheet_name);
+ const sheet* get_sheet(std::string_view sheet_name) const;
+ sheet* get_sheet(sheet_t sheet_pos);
+ const sheet* get_sheet(sheet_t sheet_pos) const;
+
+ /**
+ * Clear document content, to make it empty.
+ */
+ void clear();
+
+ /**
+ * Calculate those formula cells that have been newly inserted and have
+ * not yet been calculated.
+ */
+ void recalc_formula_cells();
+
+ sheet_t get_sheet_index(std::string_view name) const;
+ std::string_view get_sheet_name(sheet_t sheet_pos) const;
+
+ /**
+ * Set a new name to a sheet.
+ *
+ * @param sheet_pos 0-based position of a sheet.
+ * @param name New name to set to a sheet.
+ */
+ void set_sheet_name(sheet_t sheet_pos, std::string name);
+
+ range_size_t get_sheet_size() const;
+ void set_sheet_size(const range_size_t& sheet_size);
+ size_t get_sheet_count() const;
+
+ void set_origin_date(int year, int month, int day);
+ date_time_t get_origin_date() const;
+
+ void set_formula_grammar(formula_grammar_t grammar);
+ formula_grammar_t get_formula_grammar() const;
+
+ const ixion::formula_name_resolver* get_formula_name_resolver(formula_ref_context_t cxt) const;
+
+ ixion::model_context& get_model_context();
+ const ixion::model_context& get_model_context() const;
+
+ const document_config& get_config() const;
+ void set_config(const document_config& cfg);
+
+ string_pool& get_string_pool();
+ const string_pool& get_string_pool() const;
+
+ /**
+ * Insert a new table object into the document. The document will take
+ * ownership of the inserted object after the call. The object will get
+ * inserted only when there is no pre-existing table object of the same
+ * name. The object not being inserted will be deleted.
+ *
+ * @param p table object to insert.
+ */
+ void insert_table(table_t* p);
+
+ /**
+ * Get a structure containing properties of a named table.
+ *
+ * @param name Name of the table.
+ *
+ * @return Pointer to the structure containing the properties of a named
+ * table, or @p nullptr if no such table exists for the given name.
+ */
+ const table_t* get_table(std::string_view name) const;
+
+private:
+ void dump_flat(const std::string& outdir) const;
+ void dump_html(const ::std::string& outdir) const;
+ void dump_json(const ::std::string& outdir) const;
+ void dump_csv(const std::string& outdir) const;
+ void dump_debug_state(const std::string& outdir) const;
+
+ void finalize_import();
+ void insert_dirty_cell(const ixion::abs_address_t& pos);
+
+private:
+ std::unique_ptr<detail::document_impl> mp_impl;
+};
+
+}}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/spreadsheet/document_types.hpp b/include/orcus/spreadsheet/document_types.hpp
new file mode 100644
index 0000000..b1a864f
--- /dev/null
+++ b/include/orcus/spreadsheet/document_types.hpp
@@ -0,0 +1,77 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#pragma once
+
+#include "types.hpp"
+#include <vector>
+
+namespace orcus { namespace spreadsheet {
+
+/**
+ * Stores a color value in ARGB format. Each color component ranges from 0 to
+ * 255 (8-bit).
+ */
+struct ORCUS_SPM_DLLPUBLIC color_t
+{
+ color_elem_t alpha;
+ color_elem_t red;
+ color_elem_t green;
+ color_elem_t blue;
+
+ color_t();
+ color_t(color_elem_t _red, color_elem_t _green, color_elem_t _blue);
+ color_t(color_elem_t _alpha, color_elem_t _red, color_elem_t _green, color_elem_t _blue);
+
+ void reset();
+
+ bool operator==(const color_t& other) const;
+ bool operator!=(const color_t& other) const;
+};
+
+/**
+ * Contains formatting properties of a section of a string. This is used in
+ * the stroage of rich-text strings.
+ */
+struct ORCUS_SPM_DLLPUBLIC format_run
+{
+ /** Position of the section where the formatting starts. */
+ std::size_t pos;
+ /** Length of the section. */
+ std::size_t size;
+ /** Name of the font. */
+ std::string_view font;
+ /** Size of the font. */
+ double font_size;
+ /** Color of the section. */
+ color_t color;
+ /** Whether or not the font is bold. */
+ bool bold:1;
+ /** Whether or not the font is italic. */
+ bool italic:1;
+
+ format_run();
+
+ /**
+ * Reset the properties to unformatted state.
+ */
+ void reset();
+
+ /**
+ * Query whether or not the section contains non-default format properties.
+ *
+ * @return @p true of it's formatted, otherwise @p false.
+ */
+ bool formatted() const;
+};
+
+/** Collection of format properties of a string. */
+using format_runs_t = std::vector<format_run>;
+
+}} // namespace orcus::spreadsheet
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/spreadsheet/export_interface.hpp b/include/orcus/spreadsheet/export_interface.hpp
new file mode 100644
index 0000000..3c3104d
--- /dev/null
+++ b/include/orcus/spreadsheet/export_interface.hpp
@@ -0,0 +1,60 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_SPREADSHEET_EXPORT_INTERFACE_HPP
+#define INCLUDED_ORCUS_SPREADSHEET_EXPORT_INTERFACE_HPP
+
+#include "types.hpp"
+#include "../env.hpp"
+
+#include <ostream>
+
+namespace orcus { namespace spreadsheet { namespace iface {
+
+/**
+ * Interface for exporting sheet contents.
+ */
+class export_sheet
+{
+public:
+ ORCUS_DLLPUBLIC virtual ~export_sheet() = 0;
+
+ /**
+ * Write the content of a cell to an output stream.
+ *
+ * @param os output stream to write the cell content to.
+ * @param row 0-based row position of a cell.
+ * @param col 0-based column position of a cell.
+ */
+ virtual void write_string(std::ostream& os, orcus::spreadsheet::row_t row, orcus::spreadsheet::col_t col) const = 0;
+};
+
+/**
+ * Entry-point interface for exporting document contents.
+ */
+class export_factory
+{
+public:
+ ORCUS_DLLPUBLIC virtual ~export_factory() = 0;
+
+ /**
+ * Obtain an interface for exporting sheet content.
+ *
+ * @param sheet_name name of the sheet to export.
+ *
+ * @return pointer to an interface for exporting sheet content.
+ */
+ virtual const export_sheet* get_sheet(std::string_view sheet_name) const = 0;
+};
+
+}}}
+
+
+
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/spreadsheet/factory.hpp b/include/orcus/spreadsheet/factory.hpp
new file mode 100644
index 0000000..e1423fa
--- /dev/null
+++ b/include/orcus/spreadsheet/factory.hpp
@@ -0,0 +1,143 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_SPREADSHEET_IMPORT_FACTORY_HPP
+#define INCLUDED_ORCUS_SPREADSHEET_IMPORT_FACTORY_HPP
+
+#include <orcus/spreadsheet/import_interface.hpp>
+#include <orcus/spreadsheet/import_interface_styles.hpp>
+#include <orcus/spreadsheet/export_interface.hpp>
+#include <orcus/env.hpp>
+
+#include <memory>
+
+namespace orcus {
+
+class string_pool;
+
+namespace spreadsheet {
+
+class document;
+class view;
+class styles;
+
+struct ORCUS_SPM_DLLPUBLIC import_factory_config
+{
+ /**
+ * When the font cache is enabled, the import factory checks each incoming
+ * font entry against the pool of existing font entries and insert it only
+ * when an equal entry doesn't already exist in the pool.
+ *
+ * @note It should not be enabled for a file format that already has
+ * font entries normalized, such as xlsx.
+ */
+ bool enable_font_cache = true;
+
+ import_factory_config();
+ import_factory_config(const import_factory_config& other);
+ ~import_factory_config();
+
+ import_factory_config& operator=(const import_factory_config& other);
+};
+
+/**
+ * Wraps @ref document and @ref view stores. This is to be used by the import
+ * filter to populate the document and view stores.
+ */
+class ORCUS_SPM_DLLPUBLIC import_factory : public iface::import_factory
+{
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+public:
+ import_factory(document& doc);
+ import_factory(document& doc, view& view_store);
+ virtual ~import_factory();
+
+ virtual iface::import_global_settings* get_global_settings() override;
+ virtual iface::import_shared_strings* get_shared_strings() override;
+ virtual iface::import_styles* get_styles() override;
+ virtual iface::import_named_expression* get_named_expression() override;
+ virtual iface::import_reference_resolver* get_reference_resolver(formula_ref_context_t cxt) override;
+ virtual iface::import_pivot_cache_definition* create_pivot_cache_definition(
+ orcus::spreadsheet::pivot_cache_id_t cache_id) override;
+ virtual iface::import_pivot_cache_records* create_pivot_cache_records(
+ orcus::spreadsheet::pivot_cache_id_t cache_id) override;
+ virtual iface::import_sheet* append_sheet(sheet_t sheet_index, std::string_view name) override;
+ virtual iface::import_sheet* get_sheet(std::string_view name) override;
+ virtual iface::import_sheet* get_sheet(sheet_t sheet_index) override;
+ virtual void finalize() override;
+
+ void set_config(const import_factory_config& config);
+
+ void set_default_row_size(row_t row_size);
+ void set_default_column_size(col_t col_size);
+
+ void set_character_set(character_set_t charset);
+ character_set_t get_character_set() const;
+
+ /**
+ * When setting this flag to true, those formula cells with no cached
+ * results will be re-calculated upon loading.
+ *
+ *
+ * @param b value of this flag.
+ */
+ void set_recalc_formula_cells(bool b);
+
+ void set_formula_error_policy(formula_error_policy_t policy);
+};
+
+/**
+ * Wraps @ref styles store. This is to be used by an import styles parser to
+ * populate the styles store.
+ */
+class ORCUS_SPM_DLLPUBLIC import_styles : public iface::import_styles
+{
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+public:
+ import_styles(styles& styles_store, string_pool& sp);
+ import_styles(std::shared_ptr<import_factory_config> config, styles& styles_store, string_pool& sp);
+ virtual ~import_styles() override;
+
+ virtual iface::import_font_style* start_font_style() override;
+ virtual iface::import_fill_style* start_fill_style() override;
+ virtual iface::import_border_style* start_border_style() override;
+ virtual iface::import_cell_protection* start_cell_protection() override;
+ virtual iface::import_number_format* start_number_format() override;
+ virtual iface::import_xf* start_xf(xf_category_t cat) override;
+ virtual iface::import_cell_style* start_cell_style() override;
+
+ virtual void set_font_count(size_t n) override;
+ virtual void set_fill_count(size_t n) override;
+ virtual void set_border_count(size_t n) override;
+ virtual void set_number_format_count(size_t n) override;
+ virtual void set_xf_count(xf_category_t cat, size_t n) override;
+ virtual void set_cell_style_count(size_t n) override;
+};
+
+/**
+ * Wraps @ref document store and faciliates export of its content.
+ *
+ * @warning It currently provides very limited functionality especially when
+ * compared to that of the @ref import_factory.
+ */
+class ORCUS_SPM_DLLPUBLIC export_factory : public iface::export_factory
+{
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+public:
+ export_factory(const document& doc);
+ virtual ~export_factory();
+
+ virtual const iface::export_sheet* get_sheet(std::string_view sheet_name) const override;
+};
+
+}}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/spreadsheet/import_interface.hpp b/include/orcus/spreadsheet/import_interface.hpp
new file mode 100644
index 0000000..2ba80a7
--- /dev/null
+++ b/include/orcus/spreadsheet/import_interface.hpp
@@ -0,0 +1,1332 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef ORCUS_SPREADSHEET_IMPORT_INTERFACE_HPP
+#define ORCUS_SPREADSHEET_IMPORT_INTERFACE_HPP
+
+#include <cstdlib>
+
+#include "types.hpp"
+#include "../types.hpp"
+#include "../env.hpp"
+
+// NB: This header must not depend on ixion, as it needs to be usable for
+// those clients that provide their own formula engine. Other headers in
+// the orcus::spreadsheet namespace may depend on ixion.
+
+namespace orcus { namespace spreadsheet { namespace iface {
+
+class import_styles;
+class import_pivot_cache_definition;
+class import_pivot_cache_records;
+class import_sheet_view;
+
+/**
+ * Interface for importing raw string values shared in string cells. String
+ * values may be either with or without formatted segments.
+ *
+ * To insert an unformatted string, simply use either append() or add()
+ * method. The string will then be immediately pushed to the pool.
+ *
+ * To insert a string with mixed formatted segments, you need to first use one
+ * or more of:
+ *
+ * @li set_segment_font()
+ * @li set_segment_bold()
+ * @li set_segment_italic()
+ * @li set_segment_font_name()
+ * @li set_segment_font_size()
+ * @li set_segment_font_color()
+ *
+ * to define the format attribute(s) of a string segment followed by a call to
+ * append_segment(). This may be repeated as many times as necessary. Then
+ * as the final step, call commit_segments() to insert the entire series of
+ * formatted segments to the pool as a single string entry. The following
+ * example demonstrates how the code may look like:
+ *
+ * @code{.cpp}
+ * import_shared_strings* iface = ...;
+ *
+ * // store a segment with specific font, size and boldness.
+ * iface->set_segment_font_name("FreeMono");
+ * iface->set_segment_font_size(14);
+ * iface->set_segment_font_bold(true);
+ * iface->append_segment("a bold and big segment");
+ *
+ * // store an unformatted segment.
+ * iface->append_segment(" followed by ");
+ *
+ * // store a segment with smaller, italic font.
+ * iface->set_segment_font_size(7);
+ * iface->set_segment_font_italic(true);
+ * iface->append_segment("a small and italic segment");
+ *
+ * iface->commit_segments(); // commit the whole formatted string to the pool.
+ * @endcode
+ */
+class ORCUS_DLLPUBLIC import_shared_strings
+{
+public:
+ virtual ~import_shared_strings();
+
+ /**
+ * Append a new string to the sequence of strings. Order of insertion
+ * determines the numerical ID value of an inserted string. Note that this
+ * method assumes that the caller knows the string being appended is not yet
+ * in the pool; it does not check on duplicated strings.
+ *
+ * @param s string to append to the pool.
+ *
+ * @return ID of the inserted string.
+ */
+ virtual size_t append(std::string_view s) = 0;
+
+ /**
+ * Similar to the append() method, it adds a new string to the string pool;
+ * however, this method checks if the string being added is already in the
+ * pool before each insertion, to avoid duplicated strings.
+ *
+ * @param s string to add to the pool.
+ *
+ * @return ID of the inserted string.
+ */
+ virtual size_t add(std::string_view s) = 0;
+
+ /**
+ * Set the index of a font to apply to the current format attributes. Refer
+ * to the import_font_style interface on how to obtain a font index. Note
+ * that a single font index is associated with multiple font-related
+ * formatting attributes, such as font name, font color, boldness and
+ * italics.
+ *
+ * @param font_index positive integer representing the font to use.
+ */
+ virtual void set_segment_font(size_t font_index) = 0;
+
+ /**
+ * Set whether or not to make the current segment bold.
+ *
+ * @param b true if it's bold, false otherwise.
+ */
+ virtual void set_segment_bold(bool b) = 0;
+
+ /**
+ * Set whether or not to make the current segment italic.
+ *
+ * @param b true if it's italic, false otherwise.
+ */
+ virtual void set_segment_italic(bool b) = 0;
+
+ /**
+ * Set the name of a font to the current segment.
+ *
+ * @param s font name.
+ */
+ virtual void set_segment_font_name(std::string_view s) = 0;
+
+ /**
+ * Set a font size to the current segment.
+ *
+ * @param point font size in points.
+ */
+ virtual void set_segment_font_size(double point) = 0;
+
+ /**
+ * Set the color of a font in ARGB format to the current segment.
+ *
+ * @param alpha alpha component value (0-255).
+ * @param red red component value (0-255).
+ * @param green green component value (0-255).
+ * @param blue blue component value (0-255).
+ */
+ virtual void set_segment_font_color(color_elem_t alpha, color_elem_t red, color_elem_t green, color_elem_t blue) = 0;
+
+ /**
+ * Push the current string segment to the buffer. Any formatting attributes
+ * defined so far will be applied to this segment.
+ *
+ * @param s string value for the segment.
+ */
+ virtual void append_segment(std::string_view s) = 0;
+
+ /**
+ * Store the entire formatted string in the current buffer to the shared
+ * strings pool. The implementor may choose to unconditionally append the
+ * string to the pool, or choose to find an existing duplicate and reuse
+ * it instead.
+ *
+ * @return ID of the string just inserted, or the ID of an existing string
+ * with identical formatting.
+ */
+ virtual size_t commit_segments() = 0;
+};
+
+/**
+ * Interface for importing sheet properties. Sheet properties include:
+ *
+ * @li column widths and row heights,
+ * @li hidden flags for columns and rows, and
+ * @li merged cell ranges.
+ *
+ * These properties are independent of the cell contents of a sheet.
+ */
+class ORCUS_DLLPUBLIC import_sheet_properties
+{
+public:
+ virtual ~import_sheet_properties();
+
+ /**
+ * Set a column width to one or more columns.
+ *
+ * @param col 0-based position of the first column.
+ * @param col_span number of contiguous columns to apply the width to.
+ * @param width column width to apply.
+ * @param unit unit of measurement to use for the width value.
+ */
+ virtual void set_column_width(col_t col, col_t col_span, double width, orcus::length_unit_t unit) = 0;
+
+ /**
+ * Set a column hidden flag to one or more columns.
+ *
+ * @param col 0-based position of the first column.
+ * @param col_span number of contiguous columns to apply the flag to.
+ * @param hidden flag indicating whether or not the columns are hidden.
+ */
+ virtual void set_column_hidden(col_t col, col_t col_span, bool hidden) = 0;
+
+ /**
+ * Set a row height to specified row.
+ *
+ * @param row 0-based position of a row.
+ * @param height new row height value to set.
+ * @param unit unit of the new row height value.
+ *
+ * @todo Convert this to take a raw span.
+ */
+ virtual void set_row_height(row_t row, double height, orcus::length_unit_t unit) = 0;
+
+ /**
+ * Set a row hidden flag to a specified row.
+ *
+ * @param row 0-based position of a row.
+ * @param hidden flag indicating whether or not the row is hidden.
+ *
+ * @todo Convert this to take a raw span.
+ */
+ virtual void set_row_hidden(row_t row, bool hidden) = 0;
+
+ /**
+ * Set a merged cell range.
+ *
+ * @param range structure containing the top-left and bottom-right
+ * positions of a merged cell range.
+ */
+ virtual void set_merge_cell_range(const range_t& range) = 0;
+};
+
+/**
+ * Interface for importing named expressions or ranges.
+ *
+ * This interface has two different methods for defining named expressions:
+ *
+ * @li set_named_expression() and
+ * @li set_named_range().
+ *
+ * Generally speaking, set_named_expression() can be used to define both named
+ * expression and named range. However, the implementor may choose to apply a
+ * different syntax rule to parse an expression passed to set_named_range(),
+ * depending on the formula grammar defined via @ref
+ * import_global_settings::set_default_formula_grammar(). For instance, the
+ * OpenDocument Spreadsheet format is known to use different syntax rules
+ * between named expressions and named ranges.
+ *
+ * A named range is a special case of a named expression where the expression
+ * consists of only one single cell range token.
+ *
+ * Here is a code example of how a named expression is defined:
+ *
+ * @code{.cpp}
+ * import_named_expression* iface = ...;
+ *
+ * // set the A1 on the first sheet as its origin (optional).
+ * src_address_t origin{0, 0, 0};
+ * iface->set_base_position(origin);
+ * iface->set_named_expression("MyExpression", "SUM(A1:B10)+SUM(D1:D4)");
+ * iface->commit();
+ * @endcode
+ *
+ * Replace the above set_named_expression() call with set_named_range() if you
+ * wish to define a named range instead.
+ */
+class ORCUS_DLLPUBLIC import_named_expression
+{
+public:
+ virtual ~import_named_expression();
+
+ /**
+ * Specify an optional base position, or origin, from which to evaluate a
+ * named expression. If not specified, the implementor should use the
+ * top-left corner cell on the first sheet as its origin.
+ *
+ * @param pos cell position to be used as the origin.
+ */
+ virtual void set_base_position(const src_address_t& pos) = 0;
+
+ /**
+ * Set a named expression to the buffer.
+ *
+ * @param name name of the expression to be defined.
+ * @param expression expression to be associated with the name.
+ */
+ virtual void set_named_expression(std::string_view name, std::string_view expression) = 0;
+
+ /**
+ * Set a named range to the buffer.
+ *
+ * @param name name of the expression to be defined.
+ * @param range range to be associated with the name.
+ */
+ virtual void set_named_range(std::string_view name, std::string_view range) = 0;
+
+ /**
+ * Commit the named expression or range currently in the buffer to the
+ * document.
+ */
+ virtual void commit() = 0;
+};
+
+/**
+ * Interface for importing data tables.
+ */
+class ORCUS_DLLPUBLIC import_data_table
+{
+public:
+ virtual ~import_data_table();
+
+ /**
+ * Set the type of a data table. A data table can either:
+ *
+ * @li be a single-variable column-oriented,
+ * @li be a single-variable row-oriented, or
+ * @li use two variables that use both column and row.
+ *
+ * @param type type of a data table.
+ */
+ virtual void set_type(data_table_type_t type) = 0;
+
+ /**
+ * Set the range of a data table.
+ *
+ * @param range range of a data table.
+ */
+ virtual void set_range(const range_t& range) = 0;
+
+ /**
+ * Set the reference of the first input cell.
+ *
+ * @param ref reference of the first input cell.
+ * @param deleted whether or not this input cell has been deleted.
+ */
+ virtual void set_first_reference(std::string_view ref, bool deleted) = 0;
+
+ /**
+ * Set the reference of the second input cell but only if the data table
+ * uses two variables.
+ *
+ * @note This method gets called only if the data table uses two variables.
+ *
+ * @param ref reference of the second input cell.
+ * @param deleted whether or not this input cell has been deleted.
+ */
+ virtual void set_second_reference(std::string_view ref, bool deleted) = 0;
+
+ /**
+ * Store the current data table data in the buffer to the backend sheet
+ * storage.
+ */
+ virtual void commit() = 0;
+};
+
+/**
+ * Interface for importing auto filters.
+ *
+ * Importing a single auto filter would roughly follow the following flow:
+ *
+ * @code{.cpp}
+ * import_auto_filter* iface = ... ;
+ *
+ * range_t range;
+ * range.first.column = 0;
+ * range.first.row = 0;
+ * range.last.column = 3;
+ * range.last.row = 1000;
+ * iface->set_range(range); // Auto filter is applied for A1:D1001.
+ *
+ * // Column A is filtered for a value of "A".
+ * iface->set_column(0);
+ * iface->append_column_match_value("A");
+ * iface->commit_column();
+ *
+ * // Column D is filtered for values of 1 and 4.
+ * iface->set_column(3);
+ * iface->append_column_match_value("1");
+ * iface->append_column_match_value("4");
+ * iface->commit_column();
+ *
+ * // Push the autofilter data in the current buffer to the sheet store.
+ * iface->commit();
+ * @endcode
+ */
+class ORCUS_DLLPUBLIC import_auto_filter
+{
+public:
+ virtual ~import_auto_filter();
+
+ /**
+ * Specify the range where the auto filter is applied.
+ *
+ * @param range structure containing the top-left and bottom-right
+ * positions of the auto filter range.
+ */
+ virtual void set_range(const range_t& range) = 0;
+
+ /**
+ * Specify the column position of a filter. The position is relative to
+ * the first column in the auto filter range. This method gets called at
+ * the beginning of each column filter data. The implementor may initialize
+ * the column filter data buffer when this method is called.
+ *
+ * @note This column position is relative to the first column in the
+ * autofilter range.
+ *
+ * @param col 0-based column position of a filter relative to the first
+ * column of the auto filter range.
+ */
+ virtual void set_column(col_t col) = 0;
+
+ /**
+ * Append a match value to the current column filter. A single column
+ * filter may have one or more match values.
+ *
+ * @param value match value to append to the current column filter.
+ */
+ virtual void append_column_match_value(std::string_view value) = 0;
+
+ /**
+ * Commit the current column filter data to the current auto filter buffer.
+ * The implementor may clear the current column filter buffer after this
+ * call.
+ */
+ virtual void commit_column() = 0;
+
+ /**
+ * Commit current auto filter data stored in the buffer to the sheet store.
+ */
+ virtual void commit() = 0;
+};
+
+/**
+ * This is an optional interface to import conditional formatting.
+ *
+ * In general, a single conditional format consists of:
+ *
+ * @li a cell range the format is applied to, and
+ * @li one or more rule entries.
+ *
+ * Each rule entry consists of:
+ *
+ * @li a type of rule,
+ * @li zero or more rule properties, and
+ * @li zero or more conditions depending on the rule type.
+ *
+ * Lastly, each condition consists of:
+ *
+ * @li a formula, value, or string,
+ * @li an optional color.
+ *
+ * The flow of the import process varies depending on the type of the
+ * conditional formatting being imported. The following is an example of
+ * importing a conditional formatting that consists of a rule that applies a
+ * format when the cell value is greather than 2:
+ *
+ * @code{.cpp}
+ * import_conditional_format* iface = ... ;
+ *
+ * iface->set_range("A2:A13");
+ * iface->set_xf_id(14); // apply differential format (dxf) whose ID is 14
+ * iface->set_type(conditional_format_t::condition); // rule entry type
+ * iface->set_operator(condition_operator_t::expression);
+ * iface->set_operator(condition_operator_t::greater);
+ *
+ * iface->set_formula("2");
+ * iface->commit_condition();
+ *
+ * iface->commit_entry();
+ *
+ * iface->commit_format();
+ * @endcode
+ *
+ * @todo Revise this API for simplification.
+ */
+class ORCUS_DLLPUBLIC import_conditional_format
+{
+public:
+ virtual ~import_conditional_format();
+
+ /**
+ * Sets the color of the current condition.
+ * only valid for type == databar or type == colorscale.
+ */
+ virtual void set_color(color_elem_t alpha, color_elem_t red,
+ color_elem_t green, color_elem_t blue) = 0;
+
+ /**
+ * Sets the formula, value or string of the current condition.
+ */
+ virtual void set_formula(std::string_view formula) = 0;
+
+ /**
+ * Sets the type for the formula, value or string of the current condition.
+ * Only valid for type = iconset, databar or colorscale.
+ */
+ virtual void set_condition_type(condition_type_t type) = 0;
+
+ /**
+ * Only valid for type = date.
+ */
+ virtual void set_date(condition_date_t date) = 0;
+
+ /**
+ * commits the current condition to the current entry.
+ */
+ virtual void commit_condition() = 0;
+
+ /**
+ * Name of the icons to use in the current entry.
+ * only valid for type = iconset
+ */
+ virtual void set_icon_name(std::string_view name) = 0;
+
+ /**
+ * Use a gradient for the current entry.
+ * only valid for type == databar
+ */
+ virtual void set_databar_gradient(bool gradient) = 0;
+
+ /**
+ * Position of the 0 axis in the current entry.
+ * only valid for type == databar.
+ */
+ virtual void set_databar_axis(databar_axis_t axis) = 0;
+
+ /**
+ * Databar color for positive values.
+ * only valid for type == databar.
+ */
+ virtual void set_databar_color_positive(color_elem_t alpha, color_elem_t red,
+ color_elem_t green, color_elem_t blue) = 0;
+
+ /**
+ * Databar color for negative values.
+ * only valid for type == databar.
+ */
+ virtual void set_databar_color_negative(color_elem_t alpha, color_elem_t red,
+ color_elem_t green, color_elem_t blue) = 0;
+
+ /**
+ * Sets the minimum length for a databar.
+ * only valid for type == databar.
+ */
+ virtual void set_min_databar_length(double length) = 0;
+
+ /**
+ * Sets the maximum length for a databar.
+ * only valid for type == databar.
+ */
+ virtual void set_max_databar_length(double length) = 0;
+
+ /**
+ * Don't show the value in the cell.
+ * only valid for type = databar, iconset, colorscale.
+ */
+ virtual void set_show_value(bool show) = 0;
+
+ /**
+ * Use the icons in reverse order.
+ * only valid for type == iconset.
+ */
+ virtual void set_iconset_reverse(bool reverse) = 0;
+
+ /**
+ * TODO: In OOXML the style is stored as dxf and in ODF as named style.
+ */
+ virtual void set_xf_id(size_t xf) = 0;
+
+ /**
+ * Sets the current operation used for the current entry.
+ * only valid for type == condition
+ */
+ virtual void set_operator(condition_operator_t condition_type) = 0;
+
+ virtual void set_type(conditional_format_t type) = 0;
+
+ virtual void commit_entry() = 0;
+
+ virtual void set_range(std::string_view range) = 0;
+
+ virtual void set_range(row_t row_start, col_t col_start,
+ row_t row_end, col_t col_end) = 0;
+
+ virtual void commit_format() = 0;
+};
+
+/**
+ * Interface for table. A table is a range of cells within a sheet that
+ * consists of one or more data columns with a header row that contains their
+ * labels.
+ */
+class ORCUS_DLLPUBLIC import_table
+{
+public:
+ virtual ~import_table();
+
+ /**
+ * Get an optional interface for importing auto filter data stored as part
+ * of a table.
+ *
+ * The implementor should initialize the internal state of the temporary
+ * auto filter object when this method is called.
+ *
+ * @return pointer to the auto filter interface object, or a @p nullptr if
+ * the implementor doesn't support it.
+ */
+ virtual import_auto_filter* get_auto_filter();
+
+ /**
+ * Set an integral identifier unique to the table.
+ *
+ * @param id identifier associated with the table.
+ */
+ virtual void set_identifier(size_t id) = 0;
+
+ /**
+ * Set a 2-dimensional cell range associated with the table.
+ *
+ * @param range cell range associated with the table.
+ */
+ virtual void set_range(const range_t& range) = 0;
+
+ /**
+ * Set the number of totals rows.
+ *
+ * @param row_count number of totals rows.
+ */
+ virtual void set_totals_row_count(size_t row_count) = 0;
+
+ /**
+ * Set the internal name of the table.
+ *
+ * @param name name of the table.
+ */
+ virtual void set_name(std::string_view name) = 0;
+
+ /**
+ * Set the displayed name of the table.
+ *
+ * @param name displayed name of the table.
+ */
+ virtual void set_display_name(std::string_view name) = 0;
+
+ /**
+ * Set the number of columns the table contains.
+ *
+ * @param n number of columns in the table.
+ *
+ * @note This method gets called before the column data gets imported. The
+ * implementor can use this call to initialize the buffer for storing
+ * the column data.
+ */
+ virtual void set_column_count(size_t n) = 0;
+
+ /**
+ * Set an integral identifier for a column.
+ *
+ * @param id integral identifier for a column.
+ */
+ virtual void set_column_identifier(size_t id) = 0;
+
+ /**
+ * Set a name of a column.
+ *
+ * @param name name of a column.
+ */
+ virtual void set_column_name(std::string_view name) = 0;
+
+ /**
+ * Set the totals row label for a column.
+ *
+ * @param label row label for a column.
+ */
+ virtual void set_column_totals_row_label(std::string_view label) = 0;
+
+ /**
+ * Set the totals row function for a column.
+ *
+ * @param func totals row function for a column.
+ */
+ virtual void set_column_totals_row_function(totals_row_function_t func) = 0;
+
+ /**
+ * Push and append the column data stored in the current column data buffer
+ * into the table buffer.
+ */
+ virtual void commit_column() = 0;
+
+ /**
+ * Set the name of a style to apply to the table.
+ *
+ * @param name name of a style to apply to the table.
+ */
+ virtual void set_style_name(std::string_view name) = 0;
+
+ /**
+ * Specify whether or not the first column in the table should have the
+ * style applied.
+ *
+ * @param b whether or not the first column in the table should have the
+ * style applied.
+ */
+ virtual void set_style_show_first_column(bool b) = 0;
+
+ /**
+ * Specify whether or not the last column in the table should have the style
+ * applied.
+ *
+ * @param b whether or not the last column in the table should have the
+ * style applied.
+ */
+ virtual void set_style_show_last_column(bool b) = 0;
+
+ /**
+ * Specify whether or not row stripe formatting is applied.
+ *
+ * @param b whether or not row stripe formatting is applied.
+ */
+ virtual void set_style_show_row_stripes(bool b) = 0;
+
+ /**
+ * Specify whether or not column stripe formatting is applied.
+ *
+ * @param b whether or not column stripe formatting is applied.
+ */
+ virtual void set_style_show_column_stripes(bool b) = 0;
+
+ /**
+ * Push the data stored in the table buffer into the document store.
+ */
+ virtual void commit() = 0;
+};
+
+/**
+ * Interface for importing the properties of a single formula cell. A formula
+ * cell contains a formula expression that can be computed, and optionally a
+ * cached result of the last computation performed on the expression.
+ */
+class ORCUS_DLLPUBLIC import_formula
+{
+public:
+ virtual ~import_formula();
+
+ /**
+ * Set the position of a cell.
+ *
+ * @param row row position.
+ * @param col column position.
+ */
+ virtual void set_position(row_t row, col_t col) = 0;
+
+ /**
+ * Set formula string to a cell.
+ *
+ * @param grammar grammar to use to compile the formula string into
+ * tokens.
+ * @param formula formula expression to store.
+ */
+ virtual void set_formula(formula_grammar_t grammar, std::string_view formula) = 0;
+
+ /**
+ * Register the formula stored in a cell as a shared formula to be shared
+ * with other cells, if the cell contains a formula string.
+ *
+ * If a cell references a shared formula stored in another cell, only
+ * specify the index of that shared formula without specifying a formula
+ * string of its own. In that case, it is expected that another formula
+ * cell registers its formula string for that index.
+ *
+ * @param index shared string index to register the formula with.
+ */
+ virtual void set_shared_formula_index(size_t index) = 0;
+
+ /**
+ * Set cached result of string type.
+ *
+ * @param value string result value.
+ */
+ virtual void set_result_string(std::string_view value) = 0;
+
+ /**
+ * Set cached result of numeric type.
+ *
+ * @param value numeric value to set as a cached result.
+ */
+ virtual void set_result_value(double value) = 0;
+
+ /**
+ * Set cached result of boolean type.
+ *
+ * @param value boolean value to set as a cached result.
+ */
+ virtual void set_result_bool(bool value) = 0;
+
+ /**
+ * Set empty value as a cached result.
+ */
+ virtual void set_result_empty() = 0;
+
+ /**
+ * Commit all the formula data to the specified cell.
+ */
+ virtual void commit() = 0;
+};
+
+/**
+ * Interface for importing the properties of an array formula which occupies a
+ * range of cells. Cells that are part of an array formula share the same
+ * formula expression but may have different calculation results.
+ */
+class ORCUS_DLLPUBLIC import_array_formula
+{
+public:
+ virtual ~import_array_formula();
+
+ /**
+ * Set the range of an array formula.
+ *
+ * @param range range of an array formula.
+ */
+ virtual void set_range(const range_t& range) = 0;
+
+ /**
+ * Set the formula expression of an array formula.
+ *
+ * @param grammar grammar to use to compile the formula string into
+ * tokens.
+ * @param formula formula expression of an array formula.
+ */
+ virtual void set_formula(formula_grammar_t grammar, std::string_view formula) = 0;
+
+ /**
+ * Set a cached string result of a cell within the array formula range.
+ *
+ * @param row 0-based row position of a cell.
+ * @param col 0-based column position of a cell.
+ * @param value cached string value to set.
+ */
+ virtual void set_result_string(row_t row, col_t col, std::string_view value) = 0;
+
+ /**
+ * Set a cached numeric result of a cell within the array formula range.
+ *
+ * @param row 0-based row position of a cell.
+ * @param col 0-based column position of a cell.
+ * @param value cached numeric value to set.
+ */
+ virtual void set_result_value(row_t row, col_t col, double value) = 0;
+
+ /**
+ * Set a cached boolean result of a cell within the array formula range.
+ *
+ * @param row 0-based row position of a cell.
+ * @param col 0-based column position of a cell.
+ * @param value cached boolean value to set.
+ */
+ virtual void set_result_bool(row_t row, col_t col, bool value) = 0;
+
+ /**
+ * Set an empty value as a cached result to a cell within the array formula
+ * range.
+ *
+ * @param row 0-based row position of a cell.
+ * @param col 0-based column position of a cell.
+ */
+ virtual void set_result_empty(row_t row, col_t col) = 0;
+
+ /**
+ * Push the properties of an array formula currently stored in the buffer to
+ * the sheet store.
+ */
+ virtual void commit() = 0;
+};
+
+/**
+ * Interface for importing the content and properties of a sheet.
+ */
+class ORCUS_DLLPUBLIC import_sheet
+{
+public:
+ virtual ~import_sheet();
+
+ /**
+ * Get an optional interface for importing properties that are specific to a
+ * view of a sheet.
+ *
+ * @return pointer to the interface for importing view properties, or a @p
+ * nullptr if the implementor doesn't support it.
+ */
+ virtual import_sheet_view* get_sheet_view();
+
+ /**
+ * Get an optional interface for importing sheet properties.
+ *
+ * @return pointer to the interface for importing sheet properties, or a @p
+ * nullptr if the implementor doesn't support it.
+ */
+ virtual import_sheet_properties* get_sheet_properties();
+
+ /**
+ * Get an optional interface for importing data tables. Note that the
+ * implementer may decide not to support this feature in which case this
+ * method should return a @p nullptr.
+ *
+ * The implementor should initialize the internal state of the temporary
+ * data table object when this method is called.
+ *
+ * @return pointer to the data table interface object, or a @p nullptr if
+ * the implementor doesn't support it.
+ */
+ virtual import_data_table* get_data_table();
+
+ /**
+ * Get an optional interface for importing auto filter ranges.
+ *
+ * The implementor should initialize the internal state of the temporary
+ * auto filter object when this method is called.
+ *
+ * @return pointer to the auto filter interface object, or a @p nullptr if
+ * the implementor doesn't support it.
+ */
+ virtual import_auto_filter* get_auto_filter();
+
+ /**
+ * Get an interface for importing tables.
+ *
+ * The implementor should initialize the internal state of the temporary
+ * table object when this method is called.
+ *
+ * @return pointer to the table interface object, or @p nullptr if the
+ * implementer doesn't support importing of tables.
+ */
+ virtual import_table* get_table();
+
+ /**
+ * Get an optional interface for importing conditional formats.
+ *
+ * @return pointer to the conditional format interface object, or @p nullptr
+ * if the implementer doesn't support importing conditional
+ * formats.
+ */
+ virtual import_conditional_format* get_conditional_format();
+
+ /**
+ * Get an optional interface for importing sheet-local named expressions.
+ *
+ * @return pointer to the sheet-local named expression interface, or a @p
+ * nullptr if the implementor doesn't support it.
+ */
+ virtual import_named_expression* get_named_expression();
+
+ /**
+ * Get an optional interface for importing array formulas. An array formula
+ * is a formula expression applied to a range of cells where each cell may
+ * have a different result value.
+ *
+ * @return pointer to the array formula import interface, or a @p nullptr if
+ * the implementor doesn't support it.
+ */
+ virtual import_array_formula* get_array_formula();
+
+ /**
+ * Get an optional interface for importing formula cells.
+ *
+ * @return pointer to the formula interface object, or a @p nullptr if the
+ * implementer doesn't support importing of formula cells.
+ */
+ virtual import_formula* get_formula();
+
+ /**
+ * Set raw string value to a cell and have the implementation
+ * auto-recognize its data type.
+ *
+ * @param row row ID
+ * @param col column ID
+ * @param s raw string value.
+ */
+ virtual void set_auto(row_t row, col_t col, std::string_view s) = 0;
+
+ /**
+ * Set string value to a cell.
+ *
+ * @param row row ID
+ * @param col column ID
+ * @param sindex 0-based string index in the shared string table.
+ */
+ virtual void set_string(row_t row, col_t col, string_id_t sindex) = 0;
+
+ /**
+ * Set numerical value to a cell.
+ *
+ * @param row row ID
+ * @param col column ID
+ * @param value value being assigned to the cell.
+ */
+ virtual void set_value(row_t row, col_t col, double value) = 0;
+
+ /**
+ * Set a boolean value to a cell.
+ *
+ * @param row row ID
+ * @param col col ID
+ * @param value boolean value being assigned to the cell
+ */
+ virtual void set_bool(row_t row, col_t col, bool value) = 0;
+
+ /**
+ * Set date and time value to a cell.
+ *
+ * @param row row ID
+ * @param col column ID
+ * @param year 1-based value representing year
+ * @param month 1-based value representing month, varying from 1 through
+ * 12.
+ * @param day 1-based value representing day, varying from 1 through 31.
+ * @param hour the hour of a day, ranging from 0 through 23.
+ * @param minute the minute of an hour, ranging from 0 through 59.
+ * @param second the second of a minute, ranging from 0 through 59.
+ */
+ virtual void set_date_time(
+ row_t row, col_t col,
+ int year, int month, int day, int hour, int minute, double second) = 0;
+
+ /**
+ * Set cell format to specified cell. The cell format is referred to by
+ * the xf (cell format) index in the styles table.
+ *
+ * @note This method gets called after both set_column_format() and
+ * set_row_format().
+ *
+ * @param row row ID
+ * @param col column ID
+ * @param xf_index 0-based xf (cell format) index
+ */
+ virtual void set_format(row_t row, col_t col, size_t xf_index) = 0;
+
+ /**
+ * Set cell format to specified cell range. The cell format is referred
+ * to by the xf (cell format) index in the styles table.
+ *
+ * @param row_start start row ID
+ * @param col_start start column ID
+ * @param row_end end row ID
+ * @param col_end end column ID
+ * @param xf_index 0-based xf (cell format) index
+ */
+ virtual void set_format(row_t row_start, col_t col_start,
+ row_t row_end, col_t col_end, size_t xf_index) = 0;
+
+ /**
+ * Set cell format to a specified column. The cell format is referred to by
+ * the xf (cell format) index in the styles table.
+ *
+ * @note This method gets called first before set_row_format() or
+ * set_format() variants.
+ *
+ * @param col column ID
+ * @param col_span number of contiguous columns to apply the format to. It
+ * must be at least one.
+ * @param xf_index 0-based xf (cell format) index
+ */
+ virtual void set_column_format(col_t col, col_t col_span, std::size_t xf_index) = 0;
+
+ /**
+ * Set cell format to a specified row. The cell format is referred to by
+ * the xf (cell format) index in the styles table.
+ *
+ * @note This method gets called after set_column_format() but before
+ * set_format().
+ *
+ * @param row row ID
+ * @param xf_index 0-based xf (cell format) index
+ */
+ virtual void set_row_format(row_t row, std::size_t xf_index) = 0;
+
+ /**
+ * Duplicate the value of the source cell to one or more cells located
+ * immediately below it.
+ *
+ * @param src_row row ID of the source cell
+ * @param src_col column ID of the source cell
+ * @param range_size number of cells below the source cell to copy the
+ * source cell value to. It must be at least one.
+ */
+ virtual void fill_down_cells(row_t src_row, col_t src_col, row_t range_size) = 0;
+
+ /**
+ * Get the size of the sheet.
+ *
+ * @return structure containing the numbers of rows and columns of the
+ * sheet.
+ */
+ virtual range_size_t get_sheet_size() const = 0;
+};
+
+/**
+ * Interface for specifying global settings that may affect how the
+ * implementor should process certain values and properties.
+ */
+class ORCUS_DLLPUBLIC import_global_settings
+{
+public:
+ virtual ~import_global_settings();
+
+ /**
+ * Set the date that is to be represented by a value of 0. All date
+ * values should be represented relative to this date. This may affect, for
+ * instance, values imported via @ref import_sheet::set_date_time().
+ *
+ * @param year 1-based value representing year
+ * @param month 1-based value representing month, varying from 1 through
+ * 12.
+ * @param day 1-based value representing day, varying from 1 through 31.
+ */
+ virtual void set_origin_date(int year, int month, int day) = 0;
+
+ /**
+ * Set the formula grammar to be used globally when parsing formulas if the
+ * grammar is not specified. This grammar should also be used when parsing
+ * range strings associated with shared formula ranges, array formula
+ * ranges, autofilter ranges etc.
+ *
+ * Note that the import filter may specify what formula grammar to use
+ * locally when importing formula expressions for cells via @ref
+ * import_formula::set_formula(), in which case the implementor should honor
+ * that one instead.
+ *
+ * @param grammar default formula grammar to use globally unless otherwise
+ * specified.
+ */
+ virtual void set_default_formula_grammar(formula_grammar_t grammar) = 0;
+
+ /**
+ * Get current global formula grammar. The import filter may use this
+ * method to query the current global formula grammar.
+ *
+ * @return current default formula grammar.
+ */
+ virtual formula_grammar_t get_default_formula_grammar() const = 0;
+
+ /**
+ * Set the character set to use when parsing encoded string values.
+ *
+ * @param charset character set to use when parsing encoded string values.
+ */
+ virtual void set_character_set(character_set_t charset) = 0;
+};
+
+/**
+ * This is an interface to allow the implementor to provide its own reference
+ * address parsers, for both single cell references and cell range references.
+ * The implementor may choose to provide a different parser depending of the
+ * type of formula_ref_context_t argument given to the @ref
+ * import_factory::get_reference_resolver() call.
+ */
+class ORCUS_DLLPUBLIC import_reference_resolver
+{
+public:
+ virtual ~import_reference_resolver();
+
+ /**
+ * Resolve a textural representation of a single cell address.
+ *
+ * @param address single cell address string.
+ *
+ * @return structure containing the column and row positions of the
+ * address.
+ *
+ * @exception orcus::invalid_arg_error the string is not a valid
+ * single cell addreess.
+ */
+ virtual src_address_t resolve_address(std::string_view address) = 0;
+
+ /**
+ * Resolve a textural representation of a range address. Note that a
+ * string representing a valid single cell address should be considered a
+ * valid range address.
+ *
+ * @param range range address string.
+ *
+ * @return structure containing the start and end positions of the range
+ * address.
+ *
+ * @exception invalid_arg_error the string is not a valid range addreess.
+ */
+ virtual src_range_t resolve_range(std::string_view range) = 0;
+};
+
+/**
+ * This interface is the entry point for the import filter code to instantiate
+ * other, more specialized interfaces. The life cycles of any specialized
+ * interfaces returned from this interface shall be managed by the implementor
+ * of this interface.
+ *
+ * The implementer of this interface may wrap a backend document store that
+ * needs to be populated.
+ */
+class ORCUS_DLLPUBLIC import_factory
+{
+public:
+ virtual ~import_factory();
+
+ /**
+ * Obtain an optional interface for global settings, which the import filter
+ * uses to specify global filter settings that may affect how certain values
+ * and properties should be processed. The implementor can use this
+ * interface to decide how to process relevant values and properties.
+ *
+ * @return pointer to the global settings interface, or a @p nullptr if the
+ * implementor doesn't support it.
+ */
+ virtual import_global_settings* get_global_settings();
+
+ /**
+ * Obtain an optional interface for importing shared strings for string
+ * cells. Implementing this interface is required in order to import string
+ * cell values.
+ *
+ * @return pointer to the shared strings interface, or a @p nullptr if the
+ * implementor doesn't support it.
+ */
+ virtual import_shared_strings* get_shared_strings();
+
+ /**
+ * Obtain an optional interface for importing global named expressions.
+ *
+ * Note that @ref import_sheet also provides the same interface, but its
+ * interface is for importing sheet-local named expressions.
+ *
+ * @return pointer to the global named expression interface, or a @p nullptr
+ * if the implementor doesn't support it.
+ */
+ virtual import_named_expression* get_named_expression();
+
+ /**
+ * Obtain an optional interface for importing styles used to add formatting
+ * properties to cell values.
+ *
+ * @return pointer to the styles interface, or a @p nullptr if the
+ * implementor doesn't support it.
+ */
+ virtual import_styles* get_styles();
+
+ /**
+ * Obtain an optional interface for resolving cell and cell-range references
+ * from string values.
+ *
+ * @param cxt context in which the formula expression containing the
+ * references to be resolved occurs.
+ *
+ * @return pointer to the reference resolve interfance, or a @p nullptr if
+ * the implementor doesn't support it.
+ */
+ virtual import_reference_resolver* get_reference_resolver(formula_ref_context_t cxt);
+
+ /**
+ * Obtain an optional interface for pivot cache definition import for a
+ * specified cache ID. In case a pivot cache alrady exists for the passed
+ * ID, the implementor should overwrite the existing cache with a brand-new
+ * cache instance.
+ *
+ * @param cache_id numeric ID associated with the pivot cache.
+ *
+ * @return pointer to the pivot cache interface, or a @p nullptr if the
+ * implementor doesn't support pivot cache import.
+ */
+ virtual import_pivot_cache_definition* create_pivot_cache_definition(
+ pivot_cache_id_t cache_id);
+
+ /**
+ * Obtain an optional interface for pivot cache records import for a
+ * specified cache ID.
+ *
+ * @param cache_id numeric ID associated with the pivot cache.
+ *
+ * @return pointer to the pivot cache records interface, or a @p nullptr if
+ * the implementor doesn't support pivot cache import.
+ */
+ virtual import_pivot_cache_records* create_pivot_cache_records(
+ pivot_cache_id_t cache_id);
+
+ /**
+ * Append a sheet with a specified sheet position index and name and return
+ * an interface for importing its content. The implementor can use a call
+ * to this method as a signal to create and append a new sheet instance to
+ * the document store.
+ *
+ * @param sheet_index position index of the sheet to be appended. It is
+ * 0-based i.e. the first sheet to be appended will
+ * have an index value of 0.
+ * @param name sheet name.
+ *
+ * @return pointer to the sheet instance, or a @p nullptr if the implementor
+ * doesn't support it. Note, however, that if the implementor
+ * doesn't support this interface, no cell values will get imported.
+ */
+ virtual import_sheet* append_sheet(sheet_t sheet_index, std::string_view name) = 0;
+
+ /**
+ * Get a sheet instance by name. The import filter may use this method to
+ * get access to an existing sheet after it has been created.
+ *
+ * @param name sheet name.
+ *
+ * @return pointer to the sheet instance whose name matches the name
+ * passed to this method. It returns a @p nullptr if no sheet
+ * instance exists by the specified name.
+ */
+ virtual import_sheet* get_sheet(std::string_view name) = 0;
+
+ /**
+ * Retrieve a sheet instance by a specified numerical sheet index.
+ *
+ * @param sheet_index sheet index.
+ *
+ * @return pointer to the sheet instance, or a @p nullptr if no sheet
+ * instance exists at the specified sheet index.
+ */
+ virtual import_sheet* get_sheet(sheet_t sheet_index) = 0;
+
+ /**
+ * The import filter calls this method after completing its import, to give
+ * the implementor a chance to perform post-processing.
+ */
+ virtual void finalize() = 0;
+};
+
+}}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/spreadsheet/import_interface_pivot.hpp b/include/orcus/spreadsheet/import_interface_pivot.hpp
new file mode 100644
index 0000000..275ed44
--- /dev/null
+++ b/include/orcus/spreadsheet/import_interface_pivot.hpp
@@ -0,0 +1,351 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_SPREADSHEET_IMPORT_INTERFACE_PIVOT_HPP
+#define INCLUDED_ORCUS_SPREADSHEET_IMPORT_INTERFACE_PIVOT_HPP
+
+#include <cstdlib>
+
+#include "types.hpp"
+#include "../types.hpp"
+#include "../env.hpp"
+
+// NB: This header must not depend on ixion, as it needs to be usable for
+// those clients that provide their own formula engine. Other headers in
+// the orcus::spreadsheet namespace may depend on ixion.
+
+namespace orcus { namespace spreadsheet { namespace iface {
+
+class import_pivot_cache_field_group;
+
+/**
+ * Interface for importing pivot cache definitions.
+ */
+class ORCUS_DLLPUBLIC import_pivot_cache_definition
+{
+public:
+ virtual ~import_pivot_cache_definition();
+
+ /**
+ * Specify that the source data of this pivot cache is located on a local
+ * worksheet.
+ *
+ * @param ref range string specifying the source range.
+ * @param sheet_name name of the worksheet where the source data is located.
+ *
+ * @todo use the ref resolver to resolve the range.
+ */
+ virtual void set_worksheet_source(std::string_view ref, std::string_view sheet_name) = 0;
+
+ /**
+ * Specify that the source data of this pivot cache is associated with a
+ * table.
+ *
+ * @param table_name name of the table.
+ */
+ virtual void set_worksheet_source(std::string_view table_name) = 0;
+
+ /**
+ * Set the total number of fields present in this pivot cache.
+ *
+ * @param n total number of fields in this pivot cache.
+ */
+ virtual void set_field_count(size_t n) = 0;
+
+ /**
+ * Set the name of the field in the current field buffer.
+ *
+ * @param name field name.
+ */
+ virtual void set_field_name(std::string_view name) = 0;
+
+ /**
+ * Set the lowest value of the field in the current field buffer.
+ *
+ * @param v lowest value of the field.
+ */
+ virtual void set_field_min_value(double v) = 0;
+
+ /**
+ * Set the highest value of the field in the current field buffer.
+ *
+ * @param v highest value of the field.
+ */
+ virtual void set_field_max_value(double v) = 0;
+
+ /**
+ * Set the lowest date value of the field in the current field buffer.
+ *
+ * @param dt lowest date value of the field.
+ */
+ virtual void set_field_min_date(const date_time_t& dt) = 0;
+
+ /**
+ * Set the highest date value of the field in the current field buffer.
+ *
+ * @param dt highest date value of the field.
+ */
+ virtual void set_field_max_date(const date_time_t& dt) = 0;
+
+ /**
+ * Mark the current field as a group field and initiate its import.
+ *
+ * The implementor should create an internal storage to prepare for the
+ * importing of field group data when this method gets called.
+ *
+ * @param base_index 0-based index of the field this group field uses as its
+ * base.
+ * @return interface for importing group field data, or a @p nullptr if the
+ * implementor doesn't support it.
+ */
+ virtual import_pivot_cache_field_group* start_field_group(size_t base_index) = 0;
+
+ /**
+ * Commit the field in the current field buffer to the pivot cache model.
+ */
+ virtual void commit_field() = 0;
+
+ /**
+ * Set a string value to the current field item buffer.
+ *
+ * @param value string value.
+ */
+ virtual void set_field_item_string(std::string_view value) = 0;
+
+ /**
+ * Set a numeric value to the current field item buffer.
+ *
+ * @param v numeric value.
+ */
+ virtual void set_field_item_numeric(double v) = 0;
+
+ /**
+ * Set a date-time value to the current field item buffer.
+ *
+ * @param dt date-time value.
+ */
+ virtual void set_field_item_date_time(const date_time_t& dt) = 0;
+
+ /**
+ * Set an error value to the current field item buffer,
+ *
+ * @param ev error value.
+ */
+ virtual void set_field_item_error(error_value_t ev) = 0;
+
+ /**
+ * Commit the field item in current field item buffer to the current field
+ * model.
+ */
+ virtual void commit_field_item() = 0;
+
+ /**
+ * Commit the current pivot cache model to the document model.
+ */
+ virtual void commit() = 0;
+};
+
+/**
+ * Interface for importing group field settings in a pivot cache definition.
+ */
+class ORCUS_DLLPUBLIC import_pivot_cache_field_group
+{
+public:
+ virtual ~import_pivot_cache_field_group();
+
+ /**
+ * Establish a linkage between a base item to a group item.
+ *
+ * The index to corresponding base item is inferred from the order of this
+ * method being called; the first call to this method implies a base item
+ * index of 0, the second call implies an index of 1, and so on.
+ *
+ * This method is called only for a non-range group field; a group field
+ * where parent-to-child item relationships are manually defined.
+ *
+ * @param group_item_index 0-based index for the group item.
+ */
+ virtual void link_base_to_group_items(size_t group_item_index) = 0;
+
+ /**
+ * Set an individual field item value that is of string type to the
+ * current internal buffer.
+ *
+ * This method can be called either for a range group field or a non-range
+ * one.
+ *
+ * @param value field item value.
+ */
+ virtual void set_field_item_string(std::string_view value) = 0;
+
+ /**
+ * Set an individual field item value that is of numeric type to the
+ * current internal buffer.
+ *
+ * This method can be called either for a range group field or a non-range
+ * one.
+ *
+ * @param v field item value.
+ */
+ virtual void set_field_item_numeric(double v) = 0;
+
+ /**
+ * Commit the current internal field item buffer to the group.
+ */
+ virtual void commit_field_item() = 0;
+
+ /**
+ * Set the range grouping type.
+ *
+ * The current group field implicitly becomes a range group field when
+ * this method is called.
+ *
+ * @param group_by type of range grouping.
+ */
+ virtual void set_range_grouping_type(pivot_cache_group_by_t group_by) = 0;
+
+ /**
+ * Set whether the current range group field has an automatic start
+ * position.
+ *
+ * The current group field implicitly becomes a range group field when
+ * this method is called.
+ *
+ * @param b whether or not the current range group field has an automatic
+ * start position.
+ */
+ virtual void set_range_auto_start(bool b) = 0;
+
+ /**
+ * Set whether the current range group field has an automatic end
+ * position.
+ *
+ * The current group field implicitly becomes a range group field when
+ * this method is called.
+ *
+ * @param b whether or not the current range group field has an automatic
+ * end position.
+ */
+ virtual void set_range_auto_end(bool b) = 0;
+
+ /**
+ * Set the start number of the current range group field.
+ *
+ * The current group field implicitly becomes a range group field when
+ * this method is called.
+ *
+ * @param v start number of the current range group field.
+ */
+ virtual void set_range_start_number(double v) = 0;
+
+ /**
+ * Set the end number of the current range group field.
+ *
+ * The current group field implicitly becomes a range group field when
+ * this method is called.
+ *
+ * @param v end number of the current range group field.
+ */
+ virtual void set_range_end_number(double v) = 0;
+
+ /**
+ * Set the start date of the current range group field.
+ *
+ * The current group field implicitly becomes a range group field when
+ * this method is called.
+ *
+ * @param dt start date of the current range group field.
+ */
+ virtual void set_range_start_date(const date_time_t& dt) = 0;
+
+ /**
+ * Set the end date of the current range group field.
+ *
+ * The current group field implicitly becomes a range group field when
+ * this method is called.
+ *
+ * @param dt end date of the current range group field.
+ */
+ virtual void set_range_end_date(const date_time_t& dt) = 0;
+
+ /**
+ * Set the interval of the current range group field. If the current
+ * range is a date range, the value represents the number of days.
+ *
+ * @param v interval of the current range group field.
+ */
+ virtual void set_range_interval(double v) = 0;
+
+ /**
+ * Commit the current field group data to the parent field.
+ */
+ virtual void commit() = 0;
+};
+
+/**
+ * Interface for importing pivot cache records.
+ */
+class ORCUS_DLLPUBLIC import_pivot_cache_records
+{
+public:
+ virtual ~import_pivot_cache_records();
+
+ /**
+ * Set the number of records included in pivot cache records.
+ *
+ * @note This method gets called before the very first record gets imported.
+ * The implementor can use this call as an opportunity to initialize
+ * any internal buffers used to store the imported records.
+ *
+ * @param n number of records included in pivot cache records.
+ */
+ virtual void set_record_count(size_t n) = 0;
+
+ /**
+ * Append to the current record buffer a numeric value as a column value.
+ *
+ * @param v numeric value to append to the current record buffer as a column
+ * value.
+ */
+ virtual void append_record_value_numeric(double v) = 0;
+
+ /**
+ * Append to the current record buffer a character value as a column value.
+ *
+ * @param s character value to append to the current record buffer as a
+ * column value.
+ */
+ virtual void append_record_value_character(std::string_view s) = 0;
+
+ /**
+ * Append to the current record buffer a column value referenced by an index
+ * into the shared items table of a pivot cache field. The corresponding
+ * field in the pivot cache definition should provide the shared items table
+ * that this index references.
+ *
+ * @param index index into the shared items table of a pivot cache field.
+ */
+ virtual void append_record_value_shared_item(size_t index) = 0;
+
+ /**
+ * Commit the record in the current record buffer.
+ *
+ * The implementor can clear the buffer afterward.
+ */
+ virtual void commit_record() = 0;
+
+ /**
+ * Commit the entire records set to the document store.
+ */
+ virtual void commit() = 0;
+};
+
+}}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/spreadsheet/import_interface_styles.hpp b/include/orcus/spreadsheet/import_interface_styles.hpp
new file mode 100644
index 0000000..6ad94a8
--- /dev/null
+++ b/include/orcus/spreadsheet/import_interface_styles.hpp
@@ -0,0 +1,774 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#pragma once
+
+#include <cstdlib>
+
+#include "types.hpp"
+#include "../types.hpp"
+#include "../env.hpp"
+
+// NB: This header must not depend on ixion, as it needs to be usable for
+// those clients that provide their own formula engine. Other headers in
+// the orcus::spreadsheet namespace may depend on ixion.
+
+namespace orcus { namespace spreadsheet { namespace iface {
+
+class import_font_style;
+class import_fill_style;
+class import_border_style;
+class import_cell_protection;
+class import_number_format;
+class import_xf;
+class import_cell_style;
+
+/**
+ * Interface for importing styles. This one acts as an entry point and
+ * provides other interfaces for the style categories.
+ *
+ * The styles are to be stored in a <a
+ * href="https://en.wikipedia.org/wiki/Flyweight_pattern">flyweight</a>
+ * fashion where each style category maintains an array of stored style
+ * items, which are referenced by their indices. Each time a style
+ * item is pushed through the interface, it returns an index representing the
+ * item. The indices are to be assigned sequentially starting with 0 in each
+ * style category, and <em>the default style must get an index of 0</em>.
+ * Because of this, the import filter imports the default styles first before
+ * importing other non-default styles.
+ *
+ * The appreviation @p xf stands for cell format, and is used throughout the
+ * styles API. Similarly, the @p dxf stands for differential cell format, and
+ * stores partial format properties that are to be applied on top of the base
+ * format properties.
+ *
+ * @note The implementor of this interface @em must implement all interfaces
+ * for all the style categories that this interface returns.
+ */
+class ORCUS_DLLPUBLIC import_styles
+{
+public:
+ virtual ~import_styles();
+
+ /**
+ * Signal the start of the import of font style attributes, and return a
+ * pointer to the interface instance for importing the attributes.
+ *
+ * @note Note that the import_styles implementer <i>must</i> return a
+ * non-null pointer.
+ *
+ * @return pointer to the interface instance for importing font style
+ * attributes.
+ */
+ virtual import_font_style* start_font_style() = 0;
+
+ /**
+ * Signal the start of the import of fill style attributes, and return a
+ * pointer to the interface instance for importing the attributes.
+ *
+ * @note Note that the import_styles implementer <i>must</i> return a
+ * non-null pointer.
+ *
+ * @return pointer to the interface instance for importing fill style
+ * attributes.
+ */
+ virtual import_fill_style* start_fill_style() = 0;
+
+ /**
+ * Signal the start of the import of border style attributes, and return a
+ * pointer to the interface instance for importing the attributes.
+ *
+ * @note Note that the import_styles implementer <i>must</i> return a
+ * non-null pointer.
+ *
+ * @return pointer to the interface instance for importing border style
+ * attributes.
+ */
+ virtual import_border_style* start_border_style() = 0;
+
+ /**
+ * Signal the start of the import of cell protection attributes, and return
+ * a pointer to the interface instance for importing the attributes.
+ *
+ * @note Note that the import_styles implementer <i>must</i> return a
+ * non-null pointer.
+ *
+ * @return pointer to the interface instance for importing cell protection
+ * attributes.
+ */
+ virtual import_cell_protection* start_cell_protection() = 0;
+
+ /**
+ * Signal the start of the import of number format attributes and return a
+ * pointer to the interface instance for importing the attributes.
+ *
+ * @note Note that the import_styles implementer <i>must</i> return a
+ * non-null pointer.
+ *
+ * @return pointer to the interface instance for importing number format
+ * attributes.
+ */
+ virtual import_number_format* start_number_format() = 0;
+
+ /**
+ * Signal the start of the import of cell format (xf) indices that each
+ * reference different format attributes in their respective pools, and
+ * return a pointer to the interface instance for importing the indices.
+ *
+ * @note Note that the import_styles implementer <i>must</i> return a
+ * non-null pointer.
+ *
+ * @return pointer to the interface instance for importing cell format (xf)
+ * indices.
+ */
+ virtual import_xf* start_xf(xf_category_t cat) = 0;
+
+ /**
+ * Signal the start of the import of named cell style information, and
+ * return a pointer to the interface instance for importing the information.
+ *
+ * @note Note that the import_styles implementer <i>must</i> return a
+ * non-null pointer.
+ *
+ * @return pointer to the interface instance for importing named cell style
+ * information.
+ */
+ virtual import_cell_style* start_cell_style() = 0;
+
+ /**
+ * Set the total number of font styles. This may be called before importing
+ * any of the font styles. This will give the implementer a chance to
+ * allocate storage. Note that it may not always be called.
+ *
+ * @param n number of font styles.
+ */
+ virtual void set_font_count(size_t n) = 0;
+
+ /**
+ * Set the total number of fill styles. This may be called before importing
+ * any of the fill styles. This will give the implementer a chance to
+ * allocate storage. Note that it may not always be called.
+ *
+ * @param n number of fill styles.
+ */
+ virtual void set_fill_count(size_t n) = 0;
+
+ /**
+ * Set the total number of border styles. This may be called before
+ * importing any of the border styles. This will give the implementer a
+ * chance to allocate storage. Note that it may not always be called.
+ *
+ * @param n number of border styles.
+ */
+ virtual void set_border_count(size_t n) = 0;
+
+ /**
+ * Set the total number of number format styles. This may be called before
+ * importing any of the number format styles. This will give the implementer
+ * a chance to allocate storage. Note that it may not always be called.
+ *
+ * @param n number of number format styles.
+ */
+ virtual void set_number_format_count(size_t n) = 0;
+
+ /**
+ * Set the total number of cell format styles for a specified cell format
+ * category. This may be called before importing any of the cell format
+ * styles for the specified category. This will give the implementer a
+ * chance to allocate storage. Note that it may not always be called.
+ *
+ * @param cat cell format category.
+ * @param n number of cell formats styles for the specified cell format
+ * category.
+ */
+ virtual void set_xf_count(xf_category_t cat, size_t n) = 0;
+
+ /**
+ * Set the total number of named cell styles. This may be called before
+ * importing any cell styles to give the implementer a chance to allocate
+ * storage. Note that it may not always be called.
+ *
+ * @param n number of named cell styles.
+ */
+ virtual void set_cell_style_count(size_t n) = 0;
+};
+
+/**
+ * Interface for importing font style items. The following font style
+ * properties store different values for western, asian and complex scripts:
+ *
+ * @li font name
+ * @li font size
+ * @li font weight (normal or bold)
+ * @li font style (normal or italic)
+ */
+class ORCUS_DLLPUBLIC import_font_style
+{
+public:
+ virtual ~import_font_style();
+
+ /**
+ * Set the font weight to either normal or bold, for western script.
+ *
+ * @param b whether the font has normal (false) or bold weight (true).
+ */
+ virtual void set_bold(bool b) = 0;
+
+ /**
+ * Set the font weight to either normal or bold, for asian script.
+ *
+ * @param b whether the font has normal (false) or bold weight (true).
+ */
+ virtual void set_bold_asian(bool b) = 0;
+
+ /**
+ * Set the font weight to either normal or bold, for complex script.
+ *
+ * @param b whether the font has normal (false) or bold weight (true).
+ */
+ virtual void set_bold_complex(bool b) = 0;
+
+ /**
+ * Set the font style to either normal or italic, for western script.
+ *
+ * @param b whether the font has normal (false) or italic style (true).
+ */
+ virtual void set_italic(bool b) = 0;
+
+ /**
+ * Set the font style to either normal or italic, for asian script.
+ *
+ * @param b whether the font has normal (false) or italic style (true).
+ */
+ virtual void set_italic_asian(bool b) = 0;
+
+ /**
+ * Set the font style to either normal or italic, for complex script.
+ *
+ * @param b whether the font has normal (false) or italic style (true).
+ */
+ virtual void set_italic_complex(bool b) = 0;
+
+ /**
+ * Set the name of a font, for western script.
+ *
+ * @param s font name.
+ */
+ virtual void set_name(std::string_view s) = 0;
+
+ /**
+ * Set the name of a font, for asian script.
+ *
+ * @param s font name.
+ */
+ virtual void set_name_asian(std::string_view s) = 0;
+
+ /**
+ * Set the name of a font, for complex script.
+ *
+ * @param s font name.
+ */
+ virtual void set_name_complex(std::string_view s) = 0;
+
+ /**
+ * Set the size of a font in points, for western script.
+ *
+ * @param point font size in points.
+ */
+ virtual void set_size(double point) = 0;
+
+ /**
+ * Set the size of a font in points, for asian script.
+ *
+ * @param point font size in points.
+ */
+ virtual void set_size_asian(double point) = 0;
+
+ /**
+ * Set the size of a font in points, for complex script.
+ *
+ * @param point font size in points.
+ */
+ virtual void set_size_complex(double point) = 0;
+
+ /**
+ * Set the underline type of a font.
+ *
+ * @param e underline type of a font.
+ */
+ virtual void set_underline(underline_t e) = 0;
+
+ /**
+ * Set the width of the underline of a font.
+ *
+ * @param e width of the underline of a font.
+ */
+ virtual void set_underline_width(underline_width_t e) = 0;
+
+ /**
+ * Set whether the underline of a font is continuous over the gaps, or skip
+ * the gaps.
+ *
+ * @param e whether the underline of a font is continuous over the gaps or
+ * skip the gaps.
+ */
+ virtual void set_underline_mode(underline_mode_t e) = 0;
+
+ /**
+ * Set whether the underline of a font consists of a single line, or a
+ * double line.
+ *
+ * @param e whether the underline of a font consists of a single line, or a
+ * double line.
+ *
+ * @todo Look into merging this with set_underline().
+ */
+ virtual void set_underline_type(underline_type_t e) = 0;
+
+ /**
+ * Specify the color of an underline in ARGB format.
+ *
+ * @param alpha alpha component of the color.
+ * @param red red component of the color.
+ * @param green green component of the color.
+ * @param blue blue component of the color.
+ *
+ * @note If this value is not explicitly set, the font color should be used.
+ */
+ virtual void set_underline_color(color_elem_t alpha, color_elem_t red, color_elem_t green, color_elem_t blue) = 0;
+
+ /**
+ * Specify the color of font in ARGB format.
+ *
+ * @param alpha alpha component of the color.
+ * @param red red component of the color.
+ * @param green green component of the color.
+ * @param blue blue component of the color.
+ */
+ virtual void set_color(color_elem_t alpha, color_elem_t red, color_elem_t green, color_elem_t blue) = 0;
+
+ /**
+ * Set the strikethrough style of a font.
+ *
+ * @param s strikethrough style of a font.
+ */
+ virtual void set_strikethrough_style(strikethrough_style_t s) = 0;
+
+ /**
+ * Set whether the strikethrough of a font consists of a single line or a
+ * double line.
+ *
+ * @param s whether the strikethrough of a font consists of a single line or
+ * a double line.
+ */
+ virtual void set_strikethrough_type(strikethrough_type_t s) = 0;
+
+ /**
+ * Set the width of the strikethrough of a font.
+ *
+ * @param s the width of the strikethrough of a font.
+ */
+ virtual void set_strikethrough_width(strikethrough_width_t s) = 0;
+
+ /**
+ * Set the text to use as a strikethrough.
+ *
+ * @param s text to use as a strikethrough.
+ */
+ virtual void set_strikethrough_text(strikethrough_text_t s) = 0;
+
+ /**
+ * Commit the font style in the current buffer.
+ *
+ * @return index of the committed font style, to be passed on to the
+ * import_xf::set_font() method as its argument.
+ */
+ virtual std::size_t commit() = 0;
+};
+
+/**
+ * Interface for importing fill style items.
+ */
+class ORCUS_DLLPUBLIC import_fill_style
+{
+public:
+ virtual ~import_fill_style();
+
+ /**
+ * Set the type of fill pattern.
+ *
+ * @param fp fill pattern type.
+ */
+ virtual void set_pattern_type(fill_pattern_t fp) = 0;
+
+ /**
+ * Set the foreground color of a fill. <i>Note that for a solid fill
+ * type, the foreground color will be used.</i>
+ *
+ * @param alpha alpha component ranging from 0 (fully transparent) to 255
+ * (fully opaque).
+ * @param red red component ranging from 0 to 255.
+ * @param green green component ranging from 0 to 255.
+ * @param blue blue component ranging from 0 to 255.
+ */
+ virtual void set_fg_color(color_elem_t alpha, color_elem_t red, color_elem_t green, color_elem_t blue) = 0;
+
+ /**
+ * Set the background color of a fill. <i>Note that this color will
+ * be ignored for a solid fill type.</i>
+ *
+ * @param alpha alpha component ranging from 0 (fully transparent) to 255
+ * (fully opaque).
+ * @param red red component ranging from 0 to 255.
+ * @param green green component ranging from 0 to 255.
+ * @param blue blue component ranging from 0 to 255.
+ */
+ virtual void set_bg_color(color_elem_t alpha, color_elem_t red, color_elem_t green, color_elem_t blue) = 0;
+
+ /**
+ * Commit the fill style in the current buffer.
+ *
+ * @return index of the committed fill style, to be passed on to the
+ * import_xf::set_fill() method as its argument.
+ */
+ virtual size_t commit() = 0;
+};
+
+/**
+ * Interface for importing border style items.
+ */
+class ORCUS_DLLPUBLIC import_border_style
+{
+public:
+ virtual ~import_border_style();
+
+ /**
+ * Set the border style to a specified border position.
+ *
+ * @param dir position of a border to set the style to.
+ * @param style border style to set.
+ */
+ virtual void set_style(border_direction_t dir, border_style_t style) = 0;
+
+ /**
+ * Set the color of a border.
+ *
+ * @param dir position of a border to set the color to.
+ * @param alpha alpha element of the color.
+ * @param red red element of the color.
+ * @param green green element of the color.
+ * @param blue blue element of the color.
+ */
+ virtual void set_color(
+ border_direction_t dir, color_elem_t alpha, color_elem_t red, color_elem_t green, color_elem_t blue) = 0;
+
+ /**
+ * Set the width of a border.
+ *
+ * @param dir position of a border.
+ * @param width width of a border.
+ * @param unit unit of measurement to use in the border width.
+ */
+ virtual void set_width(border_direction_t dir, double width, orcus::length_unit_t unit) = 0;
+
+ /**
+ * Commit the border style in the current buffer.
+ *
+ * @return index of the committed border style, to be passed on to the
+ * import_xf::set_border() method as its argument.
+ */
+ virtual size_t commit() = 0;
+};
+
+/**
+ * Interface for importing cell protection items.
+ */
+class ORCUS_DLLPUBLIC import_cell_protection
+{
+public:
+ virtual ~import_cell_protection();
+
+ /**
+ * Hide the entire cell content when the sheet is protected.
+ *
+ * @param b whether to hide the entire cell content when the sheet is
+ * protected.
+ */
+ virtual void set_hidden(bool b) = 0;
+
+ /**
+ * Lock the cell when the sheet is protected.
+ *
+ * @param b whether or not to lock the cell when the sheet is protected.
+ */
+ virtual void set_locked(bool b) = 0;
+
+ /**
+ * Specify whether or not to print the cell content when the sheet is
+ * protected.
+ *
+ *
+ * @param b whether or not to print the cell content when the sheet is
+ * protected.
+ */
+ virtual void set_print_content(bool b) = 0;
+
+ /**
+ * Hide the formula when the sheet is protected and the cell contains
+ * formula.
+ *
+ * @param b whether or not to hide the formula when the sheet is protected
+ * and the cell contains formula.
+ */
+ virtual void set_formula_hidden(bool b) = 0;
+
+ /**
+ * Commit the cell protection data in the current buffer.
+ *
+ * @return index of the committed cell protection data, to be passed on to
+ * the import_xf::set_protection() method as its argument.
+ */
+ virtual std::size_t commit() = 0;
+};
+
+/**
+ * Interface for importing number format items.
+ */
+class ORCUS_DLLPUBLIC import_number_format
+{
+public:
+ virtual ~import_number_format();
+
+ /**
+ * Set the integral identifier of a number format.
+ *
+ * @param id integral indentifier of a number format.
+ *
+ * @note This is specific to xlsx format. In xlsx, this identifier gets
+ * used to reference number formats instead of the identifier returned
+ * by the commit() method.
+ *
+ * @todo Perhaps when this method is called, the commit() method of the
+ * corresponding item should return the value set in this method
+ * instead.
+ */
+ virtual void set_identifier(std::size_t id) = 0;
+
+ /**
+ * Set the number format code.
+ *
+ * @param s number format code.
+ */
+ virtual void set_code(std::string_view s) = 0;
+
+ /**
+ * Commit the number format item in the current buffer.
+ *
+ * @return index of the committed number format item, to be passed on to the
+ * import_xf::set_number_format() method as its argument.
+ *
+ * @todo Look into returning the identifier set through the set_identifier()
+ * method.
+ */
+ virtual size_t commit() = 0;
+};
+
+/**
+ * This interface is used to import cell format records for direct cell
+ * formats, named cell style formats, and differential cell formats.
+ *
+ * The following cell format types:
+ * <ul>
+ * <li>font</li>
+ * <li>fill</li>
+ * <li>border</li>
+ * <li>protection</li>
+ * <li>number format</li>
+ * </ul>
+ * use indices to reference their records in their respective record pools.
+ *
+ * The horizontal and vertical alignments are specified directly.
+ */
+class ORCUS_DLLPUBLIC import_xf
+{
+public:
+ virtual ~import_xf();
+
+ /**
+ * Set the index of the font record, as returned from the
+ * import_font_style::commit() method.
+ *
+ * @param index index of the font record to reference.
+ */
+ virtual void set_font(size_t index) = 0;
+
+ /**
+ * Set the index of the fill record, as returned from the
+ * import_fill_style::commit() method.
+ *
+ * @param index index of the fill record to reference.
+ */
+ virtual void set_fill(size_t index) = 0;
+
+ /**
+ * Set the index of the border record, as returned from the
+ * import_border_style::commit() method.
+ *
+ * @param index index of the border record to reference.
+ */
+ virtual void set_border(size_t index) = 0;
+
+ /**
+ * Set the index of the cell protection record, as returned from the
+ * import_cell_protection::commit() method.
+ *
+ * @param index index of the cell protection record to reference.
+ */
+ virtual void set_protection(size_t index) = 0;
+
+ /**
+ * Set the index of the number format record, as returned from the
+ * import_number_format::commit() method.
+ *
+ * @param index index of the number format record to reference.
+ */
+ virtual void set_number_format(size_t index) = 0;
+
+ /**
+ * Set the index into the cell style record to specify a named cell style it
+ * uses as its base format in case the cell has an underlying style applied.
+ * This can be used for a direct cell format i.e. when the xf category is
+ * xf_category_t::cell or for a cell style format i.e. the xf category is
+ * xf_category_t::cell_style. In a cell style format, this can be used to
+ * reference a parent style.
+ *
+ * @param index index into the cell style record it uses as its basis.
+ */
+ virtual void set_style_xf(size_t index) = 0;
+
+ /**
+ * Set the flag indicating whether or not to apply the alignment attribute.
+ *
+ * @param b flag indicating whether or not to apply the alignment attribute.
+ *
+ * @note This is specific to Excel format.
+ */
+ virtual void set_apply_alignment(bool b) = 0;
+
+ /**
+ * Set the horizontal alignment of a style.
+ *
+ * @param align horizontal alignment of a style.
+ */
+ virtual void set_horizontal_alignment(hor_alignment_t align) = 0;
+
+ /**
+ * Set the vertical alignment of a style.
+ *
+ * @param align vertical alignment of a style.
+ */
+ virtual void set_vertical_alignment(ver_alignment_t align) = 0;
+
+ /**
+ * Specify whether or not to wrap text when the text spills over the cell
+ * region.
+ *
+ * @param b whether or not to wrap text when the text spills over the cell
+ * region.
+ */
+ virtual void set_wrap_text(bool b) = 0;
+
+ /**
+ * Specify whether or not to shrink the text within cell until it fits
+ * inside the cell.
+ *
+ * @param b whether or not to shrink the text.
+ */
+ virtual void set_shrink_to_fit(bool b) = 0;
+
+ /**
+ * Commit the cell format in the current buffer to the storage.
+ *
+ * @return index of the cell format data in the storage. This index may be
+ * passed to the import_cell_style::set_xf() method.
+ */
+ virtual size_t commit() = 0;
+};
+
+/**
+ * This interface is used to import named cell style records.
+ *
+ * @note The actual cell format data for named cell styles are imported
+ * through import_xf, and this interface references its index through
+ * the import_cell_style::set_xf() method.
+ *
+ */
+class ORCUS_DLLPUBLIC import_cell_style
+{
+public:
+ virtual ~import_cell_style();
+
+ /**
+ * Set the name associated with the named cell style.
+ *
+ * @param s name of the named cell style.
+ */
+ virtual void set_name(std::string_view s) = 0;
+
+ /**
+ * Set the name associated with the named cell style intended for display
+ * purposes.
+ *
+ * @param s name to use for display purposes.
+ *
+ * @note Not all supported formats make use of this property. Also, the
+ * style may not always have this property even if the format supports
+ * it. ODF uses this property when the original name contains
+ * characters that cannot be used in internal symbols.
+ */
+ virtual void set_display_name(std::string_view s) = 0;
+
+ /**
+ * Set the index into the cell format record. The named cell style applies
+ * the format referenced by this index.
+ *
+ * @param index index into the cell format record.
+ */
+ virtual void set_xf(size_t index) = 0;
+
+ /**
+ * Set the index into the built-in cell style record.
+ *
+ * @note This is Excel-specific, and unclear whether it's useful outside of
+ * Excel's implementation. Built-in styles are not stored in file, and
+ * Excel likely has its own internal styles stored in the application
+ * itself.
+ *
+ * @param index index into the built-in cell style record.
+ */
+ virtual void set_builtin(size_t index) = 0;
+
+ /**
+ * Set the name of the parent cell style it uses as its basis.
+ *
+ * @note ODF uses this but Excel does not use this value.
+ *
+ * @param s name of the parent cell style.
+ */
+ virtual void set_parent_name(std::string_view s) = 0;
+
+ /**
+ * Commit the cell style format in the current buffer to the storage.
+ *
+ * @note This method does @em not return an index.
+ */
+ virtual void commit() = 0;
+};
+
+}}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/spreadsheet/import_interface_view.hpp b/include/orcus/spreadsheet/import_interface_view.hpp
new file mode 100644
index 0000000..8e6b53e
--- /dev/null
+++ b/include/orcus/spreadsheet/import_interface_view.hpp
@@ -0,0 +1,78 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef IMPORT_ORCUS_SPREADSHEET_IMPORT_INTERFACE_VIEW_HPP
+#define IMPORT_ORCUS_SPREADSHEET_IMPORT_INTERFACE_VIEW_HPP
+
+#include <cstdlib>
+
+#include "view_types.hpp"
+#include "../types.hpp"
+#include "../env.hpp"
+
+namespace orcus { namespace spreadsheet { namespace iface {
+
+/**
+ * Interface for importing view properties. This interface may be obtained
+ * from the import_sheet interface.
+ */
+class ORCUS_DLLPUBLIC import_sheet_view
+{
+public:
+ virtual ~import_sheet_view();
+
+ /**
+ * Set the current sheet as the active sheet.
+ */
+ virtual void set_sheet_active() = 0;
+
+ /**
+ * Set the information about split view in the current sheet.
+ *
+ * @param hor_split horizontal position of the split in 1/20th of a point,
+ * or 0 if none. "Horizontal" in this case indicates the
+ * column direction.
+ * @param ver_split vertical position of the split in 1/20th of a point,
+ * or 0 if none. "Vertical" in this case indicates the
+ * row direction.
+ * @param top_left_cell the top left visible cell in the bottom right
+ * pane.
+ * @param active_pane active pane in this sheet.
+ */
+ virtual void set_split_pane(
+ double hor_split, double ver_split, const address_t& top_left_cell,
+ sheet_pane_t active_pane) = 0;
+
+ /**
+ * Set the state of frozen view in the current sheet.
+ *
+ * @param visible_columns number of visible columns in the left pane.
+ * @param visible_rows number of visible rows in the top pane.
+ * @param top_left_cell the top left visible cell in the bottom right
+ * pane.
+ * @param active_pane active pane in this sheet.
+ */
+ virtual void set_frozen_pane(
+ col_t visible_columns, row_t visible_rows, const address_t& top_left_cell,
+ sheet_pane_t active_pane) = 0;
+
+ /**
+ * Set the selected cursor range in a specified sheet pane.
+ *
+ * @param pane sheet pane associated with the selection. The top-left
+ * pane is used for a non-split sheet view.
+ * @param range selected cursor range. The range will be 1 column by 1
+ * row when the cursor is on a single cell only.
+ */
+ virtual void set_selected_range(sheet_pane_t pane, range_t range) = 0;
+};
+
+}}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/spreadsheet/pivot.hpp b/include/orcus/spreadsheet/pivot.hpp
new file mode 100644
index 0000000..dee2559
--- /dev/null
+++ b/include/orcus/spreadsheet/pivot.hpp
@@ -0,0 +1,254 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_SPREADSHEET_PIVOT_HPP
+#define INCLUDED_ORCUS_SPREADSHEET_PIVOT_HPP
+
+#include "../env.hpp"
+#include "../types.hpp"
+#include "types.hpp"
+
+#include <memory>
+#include <vector>
+#include <limits>
+#include <variant>
+#include <optional>
+
+namespace ixion {
+
+struct abs_range_t;
+
+}
+
+namespace orcus {
+
+class string_pool;
+
+namespace spreadsheet {
+
+class document;
+
+using pivot_cache_indices_t = std::vector<size_t>;
+
+struct ORCUS_SPM_DLLPUBLIC pivot_cache_record_value_t
+{
+ using value_type = std::variant<bool, double, std::size_t, std::string_view, date_time_t>;
+
+ enum class record_type
+ {
+ unknown = 0,
+ boolean,
+ date_time,
+ character,
+ numeric,
+ blank,
+ error,
+ shared_item_index
+ };
+
+ record_type type;
+ value_type value;
+
+ pivot_cache_record_value_t();
+ pivot_cache_record_value_t(std::string_view s);
+ pivot_cache_record_value_t(double v);
+ pivot_cache_record_value_t(size_t index);
+
+ bool operator== (const pivot_cache_record_value_t& other) const;
+ bool operator!= (const pivot_cache_record_value_t& other) const;
+};
+
+using pivot_cache_record_t = std::vector<pivot_cache_record_value_t>;
+
+struct ORCUS_SPM_DLLPUBLIC pivot_cache_item_t
+{
+ using value_type = std::variant<bool, double, std::string_view, date_time_t, error_value_t>;
+
+ enum class item_type
+ {
+ unknown = 0, boolean, date_time, character, numeric, blank, error
+ };
+
+ item_type type;
+ value_type value;
+
+ pivot_cache_item_t();
+ pivot_cache_item_t(std::string_view s);
+ pivot_cache_item_t(double numeric);
+ pivot_cache_item_t(bool boolean);
+ pivot_cache_item_t(const date_time_t& date_time);
+ pivot_cache_item_t(error_value_t error);
+
+ pivot_cache_item_t(const pivot_cache_item_t& other);
+ pivot_cache_item_t(pivot_cache_item_t&& other);
+
+ bool operator< (const pivot_cache_item_t& other) const;
+ bool operator== (const pivot_cache_item_t& other) const;
+
+ pivot_cache_item_t& operator= (pivot_cache_item_t other);
+
+ void swap(pivot_cache_item_t& other);
+};
+
+using pivot_cache_items_t = std::vector<pivot_cache_item_t>;
+
+/**
+ * Group data for a pivot cache field.
+ */
+struct ORCUS_SPM_DLLPUBLIC pivot_cache_group_data_t
+{
+ struct ORCUS_SPM_DLLPUBLIC range_grouping_type
+ {
+ pivot_cache_group_by_t group_by = pivot_cache_group_by_t::range;
+
+ bool auto_start = true;
+ bool auto_end = true;
+
+ double start = 0.0;
+ double end = 0.0;
+ double interval = 1.0;
+
+ date_time_t start_date;
+ date_time_t end_date;
+
+ range_grouping_type() = default;
+ range_grouping_type(const range_grouping_type& other) = default;
+ };
+
+ /**
+ * Mapping of base field member indices to the group field item indices.
+ */
+ pivot_cache_indices_t base_to_group_indices;
+
+ std::optional<range_grouping_type> range_grouping;
+
+ /**
+ * Individual items comprising the group.
+ */
+ pivot_cache_items_t items;
+
+ /** 0-based index of the base field. */
+ size_t base_field;
+
+ pivot_cache_group_data_t(size_t _base_field);
+ pivot_cache_group_data_t(const pivot_cache_group_data_t& other);
+ pivot_cache_group_data_t(pivot_cache_group_data_t&& other);
+
+ pivot_cache_group_data_t() = delete;
+};
+
+struct ORCUS_SPM_DLLPUBLIC pivot_cache_field_t
+{
+ /**
+ * Field name. It must be interned with the string pool belonging to the
+ * document.
+ */
+ std::string_view name;
+
+ pivot_cache_items_t items;
+
+ std::optional<double> min_value;
+ std::optional<double> max_value;
+
+ std::optional<date_time_t> min_date;
+ std::optional<date_time_t> max_date;
+
+ std::unique_ptr<pivot_cache_group_data_t> group_data;
+
+ pivot_cache_field_t();
+ pivot_cache_field_t(std::string_view _name);
+ pivot_cache_field_t(const pivot_cache_field_t& other);
+ pivot_cache_field_t(pivot_cache_field_t&& other);
+};
+
+class ORCUS_SPM_DLLPUBLIC pivot_cache
+{
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+public:
+ using fields_type = std::vector<pivot_cache_field_t>;
+ using records_type = std::vector<pivot_cache_record_t>;
+
+ pivot_cache(pivot_cache_id_t cache_id, string_pool& sp);
+ ~pivot_cache();
+
+ /**
+ * Bulk-insert all the fields in one step. Note that this will replace any
+ * pre-existing fields if any.
+ *
+ * @param fields field instances to move into storage.
+ */
+ void insert_fields(fields_type fields);
+
+ void insert_records(records_type record);
+
+ size_t get_field_count() const;
+
+ /**
+ * Retrieve a field data by its index.
+ *
+ * @param index index of the field to retrieve.
+ *
+ * @return pointer to the field instance, or nullptr if the index is
+ * out-of-range.
+ */
+ const pivot_cache_field_t* get_field(size_t index) const;
+
+ pivot_cache_id_t get_id() const;
+
+ const records_type& get_all_records() const;
+};
+
+class ORCUS_SPM_DLLPUBLIC pivot_collection
+{
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+public:
+ pivot_collection(document& doc);
+ ~pivot_collection();
+
+ /**
+ * Insert a new pivot cache associated with a worksheet source.
+ *
+ * @param sheet_name name of the sheet where the source data is.
+ * @param range range of the source data. Note that the sheet indices are
+ * not used.
+ * @param cache pivot cache instance to store.
+ */
+ void insert_worksheet_cache(
+ std::string_view sheet_name, const ixion::abs_range_t& range, std::unique_ptr<pivot_cache>&& cache);
+
+ /**
+ * Insert a new pivot cache associated with a table name.
+ *
+ * @param table_name source table name.
+ * @param cache pivot cache instance to store.
+ */
+ void insert_worksheet_cache(std::string_view table_name, std::unique_ptr<pivot_cache>&& cache);
+
+ /**
+ * Count the number of pivot caches currently stored.
+ *
+ * @return number of pivot caches currently stored in the document.
+ */
+ size_t get_cache_count() const;
+
+ const pivot_cache* get_cache(
+ std::string_view sheet_name, const ixion::abs_range_t& range) const;
+
+ pivot_cache* get_cache(pivot_cache_id_t cache_id);
+
+ const pivot_cache* get_cache(pivot_cache_id_t cache_id) const;
+};
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/spreadsheet/shared_strings.hpp b/include/orcus/spreadsheet/shared_strings.hpp
new file mode 100644
index 0000000..d447cb3
--- /dev/null
+++ b/include/orcus/spreadsheet/shared_strings.hpp
@@ -0,0 +1,77 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_SPREADSHEET_SHARED_STRINGS_HPP
+#define INCLUDED_ORCUS_SPREADSHEET_SHARED_STRINGS_HPP
+
+#include "document_types.hpp"
+
+#include <vector>
+#include <memory>
+#include <string>
+
+namespace ixion { class model_context; }
+
+namespace orcus {
+
+namespace spreadsheet {
+
+/**
+ * This class manages access to a pool of shared string instances for both
+ * unformatted strings and rich-text strings. The underlying string values
+ * themselves are stored externally in the `ixion::model_context` instance
+ * which this class references; this class itself only stores the format
+ * properties of the rich-text strings.
+ */
+class ORCUS_SPM_DLLPUBLIC shared_strings
+{
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+public:
+ shared_strings() = delete;
+ shared_strings(const shared_strings&) = delete;
+ shared_strings& operator=(const shared_strings&) = delete;
+
+ shared_strings(ixion::model_context& cxt);
+ ~shared_strings();
+
+ /**
+ * Set the entire format runs of a string.
+ *
+ * @param sindex index of the string to associate the format runs with.
+ * @param runs format runs.
+ */
+ void set_format_runs(std::size_t sindex, std::unique_ptr<format_runs_t> runs);
+
+ /**
+ * Get the entire format runs of a string.
+ *
+ * @param index index of the string to get the format runs of.
+ *
+ * @return pointer to the format runs, or @p nullptr if no format runs exist
+ * for the specified string index.
+ */
+ const format_runs_t* get_format_runs(std::size_t index) const;
+
+ /**
+ * Get an underlying string value associated with an index.
+ *
+ * @param index index of a string value.
+ *
+ * @return pointer to a string value associated with the index, or @p
+ * nullptr in case of an invalid string index.
+ */
+ const std::string* get_string(std::size_t index) const;
+
+ void dump(std::ostream& os) const;
+};
+
+}}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/spreadsheet/sheet.hpp b/include/orcus/spreadsheet/sheet.hpp
new file mode 100644
index 0000000..2ea6392
--- /dev/null
+++ b/include/orcus/spreadsheet/sheet.hpp
@@ -0,0 +1,150 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_SPREADSHEET_ODSTABLE_HPP
+#define INCLUDED_ORCUS_SPREADSHEET_ODSTABLE_HPP
+
+#include "../env.hpp"
+#include "types.hpp"
+
+#include <ostream>
+#include <memory>
+
+#include <ixion/address.hpp>
+#include <ixion/formula_tokens.hpp>
+#include <ixion/formula_result.hpp>
+
+namespace orcus {
+
+struct date_time_t;
+
+namespace spreadsheet {
+
+class document;
+struct auto_filter_t;
+
+namespace detail {
+
+struct sheet_impl;
+
+}
+
+/**
+ * This class represents a single sheet instance in the internal document
+ * model.
+ */
+class ORCUS_SPM_DLLPUBLIC sheet
+{
+ friend class document;
+ friend struct detail::sheet_impl;
+
+ static const row_t max_row_limit;
+ static const col_t max_col_limit;
+
+public:
+ sheet(document& doc, sheet_t sheet_index);
+ ~sheet() noexcept;
+
+ void set_auto(row_t row, col_t col, std::string_view s);
+ void set_string(row_t row, col_t col, string_id_t sindex);
+ void set_value(row_t row, col_t col, double value);
+ void set_bool(row_t row, col_t col, bool value);
+ void set_date_time(row_t row, col_t col, int year, int month, int day, int hour, int minute, double second);
+ void set_format(row_t row, col_t col, size_t index);
+ void set_format(row_t row_start, col_t col_start, row_t row_end, col_t col_end, size_t index);
+ void set_column_format(col_t col, col_t col_span, std::size_t index);
+ void set_row_format(row_t row, std::size_t index);
+
+ void set_formula(row_t row, col_t col, const ixion::formula_tokens_store_ptr_t& tokens);
+ void set_formula(row_t row, col_t col, const ixion::formula_tokens_store_ptr_t& tokens, ixion::formula_result result);
+ void set_grouped_formula(const range_t& range, ixion::formula_tokens_t tokens);
+ void set_grouped_formula(const range_t& range, ixion::formula_tokens_t tokens, ixion::formula_result result);
+
+ void set_col_width(col_t col, col_t col_span, col_width_t width);
+
+ /**
+ * Get column width in twips.
+ *
+ * @param col column index
+ * @param col_start pointer to a variable to store the index of the starting
+ * column of the range with the same width. Pass nullptr if
+ * the caller doesn't need this information.
+ * @param col_end pointer to a variable to store the index of the ending
+ * column plus one, of the range with the same width. Pass
+ * nullptr if the caller doesn't need this information.
+ *
+ * @return width of the specified column index (in twips).
+ */
+ col_width_t get_col_width(col_t col, col_t* col_start, col_t* col_end) const;
+
+ void set_col_hidden(col_t col, col_t col_span, bool hidden);
+ bool is_col_hidden(col_t col, col_t* col_start, col_t* col_end) const;
+
+ void set_row_height(row_t row, row_height_t height);
+ row_height_t get_row_height(row_t row, row_t* row_start, row_t* row_end) const;
+
+ void set_row_hidden(row_t row, bool hidden);
+ bool is_row_hidden(row_t row, row_t* row_start, row_t* row_end) const;
+
+ void set_merge_cell_range(const range_t& range);
+
+ void fill_down_cells(row_t src_row, col_t src_col, row_t range_size);
+
+ /**
+ * Return the size of a merged cell range.
+ *
+ * @param row row position of the upper-left cell.
+ * @param col column position of the upper-left cell.
+ *
+ * @return merged cell range.
+ */
+ range_t get_merge_cell_range(row_t row, col_t col) const;
+
+ size_t get_string_identifier(row_t row, col_t col) const;
+
+ auto_filter_t* get_auto_filter_data();
+ const auto_filter_t* get_auto_filter_data() const;
+ void set_auto_filter_data(auto_filter_t* p);
+
+ // Sheet dimension methods
+
+ /**
+ * Return the smallest range that contains all non-empty cells in this
+ * sheet. The top-left corner of the returned range is always column 0 and
+ * row 0.
+ *
+ * @return smallest range that contains all non-empty cells.
+ */
+ ixion::abs_range_t get_data_range() const;
+
+ sheet_t get_index() const;
+
+ date_time_t get_date_time(row_t row, col_t col) const;
+
+ void dump_flat(std::ostream& os) const;
+ void dump_check(std::ostream& os, std::string_view sheet_name) const;
+ void dump_html(std::ostream& os) const;
+ void dump_json(std::ostream& os) const;
+ void dump_csv(std::ostream& os) const;
+
+ void dump_debug_state(const std::string& output_dir, std::string_view sheet_name) const;
+
+ /**
+ * Get the cell format ID of specified cell.
+ */
+ size_t get_cell_format(row_t row, col_t col) const;
+
+private:
+ void finalize_import();
+
+ std::unique_ptr<detail::sheet_impl> mp_impl;
+};
+
+}}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/spreadsheet/styles.hpp b/include/orcus/spreadsheet/styles.hpp
new file mode 100644
index 0000000..5458b1f
--- /dev/null
+++ b/include/orcus/spreadsheet/styles.hpp
@@ -0,0 +1,268 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_SPREADSHEET_STYLES_HPP
+#define INCLUDED_ORCUS_SPREADSHEET_STYLES_HPP
+
+#include "../env.hpp"
+#include "../measurement.hpp"
+#include "document_types.hpp"
+
+#include <memory>
+#include <string_view>
+#include <optional>
+
+namespace orcus { namespace spreadsheet {
+
+class document;
+
+/**
+ * Font style record.
+ */
+struct ORCUS_SPM_DLLPUBLIC font_t
+{
+ std::optional<std::string_view> name;
+ std::optional<std::string_view> name_asian;
+ std::optional<std::string_view> name_complex;
+ std::optional<double> size;
+ std::optional<double> size_asian;
+ std::optional<double> size_complex;
+ std::optional<bool> bold;
+ std::optional<bool> bold_asian;
+ std::optional<bool> bold_complex;
+ std::optional<bool> italic;
+ std::optional<bool> italic_asian;
+ std::optional<bool> italic_complex;
+ std::optional<underline_t> underline_style;
+ std::optional<underline_width_t> underline_width;
+ std::optional<underline_mode_t> underline_mode;
+ std::optional<underline_type_t> underline_type;
+ std::optional<color_t> underline_color;
+ std::optional<color_t> color;
+ std::optional<strikethrough_style_t> strikethrough_style;
+ std::optional<strikethrough_width_t> strikethrough_width;
+ std::optional<strikethrough_type_t> strikethrough_type;
+ std::optional<strikethrough_text_t> strikethrough_text;
+
+ font_t();
+ font_t(const font_t& other);
+ ~font_t();
+
+ font_t& operator=(const font_t& other);
+
+ bool operator==(const font_t& other) const;
+ bool operator!=(const font_t& other) const;
+
+ void reset();
+
+ struct ORCUS_SPM_DLLPUBLIC hash
+ {
+ std::size_t operator()(const font_t& v) const;
+ };
+};
+
+/**
+ * Fill style record.
+ */
+struct ORCUS_SPM_DLLPUBLIC fill_t
+{
+ std::optional<fill_pattern_t> pattern_type;
+ std::optional<color_t> fg_color;
+ std::optional<color_t> bg_color;
+
+ fill_t();
+ void reset();
+};
+
+/**
+ * Attributes for a single border.
+ */
+struct ORCUS_SPM_DLLPUBLIC border_attrs_t
+{
+ std::optional<border_style_t> style;
+ std::optional<color_t> border_color;
+ std::optional<length_t> border_width;
+
+ border_attrs_t();
+ void reset();
+};
+
+/**
+ * Style record for the borders of a single cell.
+ */
+struct ORCUS_SPM_DLLPUBLIC border_t
+{
+ border_attrs_t top;
+ border_attrs_t bottom;
+ border_attrs_t left;
+ border_attrs_t right;
+ border_attrs_t diagonal;
+ border_attrs_t diagonal_bl_tr;
+ border_attrs_t diagonal_tl_br;
+
+ border_t();
+ void reset();
+};
+
+/**
+ * Style record for cell protection attributes.
+ */
+struct ORCUS_SPM_DLLPUBLIC protection_t
+{
+ std::optional<bool> locked;
+ std::optional<bool> hidden;
+ std::optional<bool> print_content;
+ std::optional<bool> formula_hidden;
+
+ protection_t();
+ void reset();
+};
+
+/**
+ * Style record for a number format.
+ */
+struct ORCUS_SPM_DLLPUBLIC number_format_t
+{
+ std::optional<std::size_t> identifier;
+ std::optional<std::string_view> format_string;
+
+ number_format_t();
+ void reset();
+
+ bool operator== (const number_format_t& other) const noexcept;
+ bool operator!= (const number_format_t& other) const noexcept;
+};
+
+/**
+ * Format attributes for a single cell. It references the format entries via
+ * integer indices, with some exceptions.
+ */
+struct ORCUS_SPM_DLLPUBLIC cell_format_t
+{
+ /** ID of a font style record. */
+ std::size_t font;
+ /** ID of a fill style record. */
+ std::size_t fill;
+ /** ID of a border style record. */
+ std::size_t border;
+ /** ID for a cell protection record. */
+ std::size_t protection;
+ /** ID for a number format record. */
+ std::size_t number_format;
+ /** ID for a parent named style. */
+ std::size_t style_xf;
+ /** Horizontal alignment of a cell. */
+ hor_alignment_t hor_align;
+ /** Vertical alignment of a cell. */
+ ver_alignment_t ver_align;
+ /** Flag on whether or not wrap text is enabled. */
+ std::optional<bool> wrap_text;
+ /** Flag on whether or not shrink to fit is enabled. */
+ std::optional<bool> shrink_to_fit;
+ bool apply_num_format:1;
+ bool apply_font:1;
+ bool apply_fill:1;
+ bool apply_border:1;
+ bool apply_alignment:1;
+ bool apply_protection:1;
+
+ cell_format_t();
+ void reset();
+};
+
+/**
+ * Attributes of a named cell style.
+ *
+ * Refer to @ref orcus::spreadsheet::iface::import_cell_style for how the data
+ * members of this struct are used in practice.
+ */
+struct ORCUS_SPM_DLLPUBLIC cell_style_t
+{
+ std::string_view name;
+ std::string_view display_name;
+ std::size_t xf;
+ std::size_t builtin;
+ std::string_view parent_name;
+
+ cell_style_t();
+ void reset();
+};
+
+ORCUS_SPM_DLLPUBLIC std::ostream& operator<< (std::ostream& os, const color_t& c);
+
+/**
+ * Stores various styles records such that they can be referenced via integer
+ * indices.
+ */
+class ORCUS_SPM_DLLPUBLIC styles
+{
+ friend class document;
+
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+public:
+ styles();
+ ~styles();
+
+ void reserve_font_store(size_t n);
+ std::size_t append_font(const font_t& font);
+
+ void reserve_fill_store(size_t n);
+ std::size_t append_fill(const fill_t& fill);
+
+ void reserve_border_store(size_t n);
+ std::size_t append_border(const border_t& border);
+
+ std::size_t append_protection(const protection_t& protection);
+
+ void reserve_number_format_store(size_t n);
+ std::size_t append_number_format(const number_format_t& nf);
+
+ void reserve_cell_style_format_store(size_t n);
+ size_t append_cell_style_format(const cell_format_t& cf);
+
+ void reserve_cell_format_store(size_t n);
+ size_t append_cell_format(const cell_format_t& cf);
+
+ void reserve_diff_cell_format_store(size_t n);
+ size_t append_diff_cell_format(const cell_format_t& cf);
+
+ void reserve_cell_style_store(size_t n);
+ void append_cell_style(const cell_style_t& cs);
+
+ const font_t* get_font(size_t index) const;
+ const fill_t* get_fill(size_t index) const;
+ const border_t* get_border(size_t index) const;
+ const protection_t* get_protection(size_t index) const;
+ const number_format_t* get_number_format(size_t index) const;
+ const cell_format_t* get_cell_format(size_t index) const;
+ const cell_format_t* get_cell_style_format(size_t index) const;
+ const cell_format_t* get_dxf_format(size_t index) const;
+ const cell_style_t* get_cell_style(size_t index) const;
+ const cell_style_t* get_cell_style_by_xf(size_t xfid) const;
+
+ size_t get_font_count() const;
+ size_t get_fill_count() const;
+ size_t get_border_count() const;
+ size_t get_protection_count() const;
+ size_t get_number_format_count() const;
+ size_t get_cell_formats_count() const;
+ size_t get_cell_style_formats_count() const;
+ size_t get_dxf_count() const;
+ size_t get_cell_styles_count() const;
+
+ void clear();
+
+private:
+ void finalize_import();
+};
+
+}}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/spreadsheet/types.hpp b/include/orcus/spreadsheet/types.hpp
new file mode 100644
index 0000000..df7b27e
--- /dev/null
+++ b/include/orcus/spreadsheet/types.hpp
@@ -0,0 +1,751 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef ORCUS_SPREADSHEET_TYPES_HPP
+#define ORCUS_SPREADSHEET_TYPES_HPP
+
+#include "../env.hpp"
+
+#include <cstdlib>
+#include <cstdint>
+#include <iosfwd>
+#include <initializer_list>
+#include <string_view>
+#include <vector>
+
+// NB: This header should only define primitive data types, enums and structs.
+
+namespace orcus { namespace spreadsheet {
+
+/** Row ID type. */
+using row_t = int32_t;
+/** Column ID type. */
+using col_t = int32_t;
+/** Sheet ID type. */
+using sheet_t = int32_t;
+/** Individual color element type. */
+using color_elem_t = uint8_t;
+/** Type for column width values. Column width values are stored in twips. */
+using col_width_t = uint16_t;
+/** Type for row height values. Row height values are stored in twips. */
+using row_height_t = uint16_t;
+/** Type for string ID's for string cells. */
+using string_id_t = uint32_t;
+/** Pivot cache ID type. */
+using pivot_cache_id_t = uint32_t;
+
+/**
+ * Get the special column width value that represents the default column
+ * width. The value itself is not to be used as an actual width value.
+ *
+ * @return value that represents the default column width.
+ */
+ORCUS_DLLPUBLIC col_width_t get_default_column_width();
+
+/**
+ * Get the special row height value that represents the default row height.
+ * The value itself is not to be used as an actual row height value.
+ *
+ * @return value that represents the default row height.
+ */
+ORCUS_DLLPUBLIC row_height_t get_default_row_height();
+
+/**
+ * Type of error value in cells.
+ */
+enum class error_value_t
+{
+ /**
+ * Error type unknown, typically used as an initial error value or generic
+ * default value.
+ */
+ unknown = 0,
+ /** Null reference error, displayed as `#NULL!`. */
+ null,
+ /** Division-by-zero error, displayed as `#DIV/0`. */
+ div0,
+ /** Formula expression error, displayed as `#VALUE!`. */
+ value,
+ /** Reference error, displayed as `#REF!`. */
+ ref,
+ /** Invalid named-expression error, displayed as `#NAME?` */
+ name,
+ /** Invalid numeric value error, displayed as `#NUM!`. */
+ num,
+ /** No value is available error, displayed as `#N/A!`. */
+ na
+};
+
+/**
+ * Type of border direction, used to reference the position of a border in a
+ * cell.
+ */
+enum class border_direction_t
+{
+ /** Unknown or uninitialized border direction value. */
+ unknown = 0,
+ /** Top border of a cell. */
+ top,
+ /** Bottom border of a cell. */
+ bottom,
+ /** Left border of a cell. */
+ left,
+ /** Right border of a cell. */
+ right,
+ /**
+ * Cross-diagonal borders of a cell. This is equivalent of both
+ * @p diagonal_bl_tr and @p diagonal_tl_br combined.
+ */
+ diagonal,
+ /** Diagonal border of a cell that runs from bottom-left to top-right. */
+ diagonal_bl_tr,
+ /** Diagonal border of a cell that runs from top-left to bottom-right. */
+ diagonal_tl_br
+};
+
+/**
+ * Type of border style.
+ */
+enum class border_style_t
+{
+ unknown = 0,
+ none,
+ solid,
+ dash_dot,
+ dash_dot_dot,
+ dashed,
+ dotted,
+ double_border,
+ hair,
+ medium,
+ medium_dash_dot,
+ medium_dash_dot_dot,
+ medium_dashed,
+ slant_dash_dot,
+ thick,
+ thin,
+ double_thin,
+ fine_dashed
+};
+
+/**
+ * Type of fill pattern for cell background.
+ */
+enum class fill_pattern_t
+{
+ none = 0,
+ solid,
+ dark_down,
+ dark_gray,
+ dark_grid,
+ dark_horizontal,
+ dark_trellis,
+ dark_up,
+ dark_vertical,
+ gray_0625,
+ gray_125,
+ light_down,
+ light_gray,
+ light_grid,
+ light_horizontal,
+ light_trellis,
+ light_up,
+ light_vertical,
+ medium_gray
+};
+
+/**
+ * Strikethrough style as applied to a cell value.
+ *
+ * @note This is specific to ODS format.
+ */
+enum class strikethrough_style_t
+{
+ none = 0,
+ solid,
+ dash,
+ dot_dash,
+ dot_dot_dash,
+ dotted,
+ long_dash,
+ wave
+};
+
+/**
+ * Strikethrough type as applied to a cell value.
+ *
+ * @note This is specific to ODS format.
+ */
+enum class strikethrough_type_t
+{
+ unknown = 0,
+ none,
+ single_type,
+ double_type
+};
+
+/**
+ * Width of strikethrough applied to a cell value.
+ *
+ * @note This is specific to ODS format.
+ */
+enum class strikethrough_width_t
+{
+ unknown = 0,
+ width_auto,
+ thin,
+ medium,
+ thick,
+ bold
+};
+
+/**
+ * Text used for strike-through.
+ *
+ * @note This is specific to ODS format.
+ */
+enum class strikethrough_text_t
+{
+ unknown = 0,
+ /** `/` is used as the text. */
+ slash,
+ /** `X` is used as the text. */
+ cross
+};
+
+/**
+ * Type that specifies the grammar of a formula expression. Each grammar
+ * may exhibit a different set of syntax rules.
+ */
+enum class formula_grammar_t
+{
+ /** Grammar type is either unknown or unspecified. */
+ unknown = 0,
+ /** Grammar used by the Excel 2003 XML (aka XML Spreadsheet) format. */
+ xls_xml,
+ /** Grammar used by the Office Open XML spreadsheet format. */
+ xlsx,
+ /** Grammar used by the OpenDocument Spreadsheet format. */
+ ods,
+ /** Grammar used by the Gnumeric XML format. */
+ gnumeric
+};
+
+/**
+ * Type of formula expression.
+ */
+enum class formula_t
+{
+ /** Formula expression type unknown, or generic default value. */
+ unknown = 0,
+ /** Formula expression in an array of cells. */
+ array,
+ /** Formula expression in a data table. */
+ data_table,
+ /** Formula expression in a normal formula cell. */
+ normal,
+ /** Formula expression in a shared formula cell. */
+ shared
+};
+
+/**
+ * Formula reference context specifies the location where a formula
+ * expression is used. This is used mainly for those document formats that
+ * make use of multiple formula reference syntaxes, such as ODS.
+ */
+enum class formula_ref_context_t
+{
+ /**
+ * Default context, that is, the context that is NOT any of the other
+ * contexts specified below.
+ */
+ global = 0,
+
+ /** Base cell position of either a named range or expression. */
+ named_expression_base,
+
+ /**
+ * Named range is a special case of named expression where the expression
+ * consists of only one range token.
+ */
+ named_range,
+};
+
+/**
+ * Type of policy on how to handle a formula cell with an erroneous expression
+ * that has been parsed unsuccessfully.
+ */
+enum class formula_error_policy_t
+{
+ unknown,
+ /** Loading of the document will be halted. */
+ fail,
+ /** The error cell will be skipped. */
+ skip
+};
+
+/**
+ * Underline type for a cell value.
+ */
+enum class underline_t
+{
+ /** Underline is absent. */
+ none = 0,
+ /** Underline consists of a single line. */
+ single_line,
+ /**
+ * Single line for accounting format.
+ *
+ * @note This is unique to xlsx format.
+ */
+ single_accounting,
+ /** Underline consists of a double line. */
+ double_line,
+ /**
+ * Double line for accounting format.
+ *
+ * @note This is unique to xlsx format.
+ */
+ double_accounting,
+ /** Underline is dotted. */
+ dotted,
+ /** Underline is dashed. */
+ dash,
+ /** Underline consists of repeated long dash segments. */
+ long_dash,
+ /** Underline consists of repeated dot and dash segments. */
+ dot_dash,
+ /** Underline consists of repeated dot, dot and dash segments. */
+ dot_dot_dash,
+ /** Underline is waved. */
+ wave
+};
+
+/**
+ * Underline width types, specific to ODF. When the enum value is either
+ * percent, positive_integer, or positive_length, the actual value should be
+ * given separately.
+ *
+ * @note The automatic enum value corresponds with the "auto" text value,
+ * which could not be used since it's a keyword in C++.
+ */
+enum class underline_width_t
+{
+ none = 0,
+ automatic,
+ bold,
+ dash,
+ medium,
+ thick,
+ thin,
+ percent,
+ positive_integer,
+ positive_length
+};
+
+/**
+ * Underline mode that determines whether an underline is applied to both
+ * words and spaces, or words only.
+ *
+ * @note This is specific to ODS format.
+ */
+enum class underline_mode_t
+{
+ /** Underline is applied to both words and spaces. */
+ continuous = 0,
+ /** Underline is applied only to words. */
+ skip_white_space
+};
+
+/**
+ * Whether a single line or a double line is used as an underline.
+ *
+ * @todo Perhaps we should merge this with underline_t.
+ */
+enum class underline_type_t
+{
+ none = 0,
+ /** A single line is used as an underline. */
+ single_type,
+ /** A double line is used as an underline. */
+ double_type
+};
+
+/**
+ * Type of horizontal alignment applied to a cell content.
+ */
+enum class hor_alignment_t
+{
+ unknown = 0,
+ left,
+ center,
+ right,
+ justified,
+ distributed,
+ filled
+};
+
+/**
+ * Type of vertical alignment applied to a cell content.
+ */
+enum class ver_alignment_t
+{
+ unknown = 0,
+ top,
+ middle,
+ bottom,
+ justified,
+ distributed
+};
+
+/**
+ * Cell format categories. The abbreviation "xf" stands for "cell format"
+ * where the "x" is short for cell.
+ */
+enum class xf_category_t
+{
+ unknown,
+ /** Direct cell format, also often referenced as xf. */
+ cell,
+ /** Cell format for named styles. */
+ cell_style,
+ /** Incremental cell format, also referenced as dxf. */
+ differential,
+};
+
+/**
+ * Type of data table. A data table can be either of a single-variable
+ * column, a single-variable row, or a double-variable type that uses both
+ * column and row input cells.
+ */
+enum class data_table_type_t
+{
+ column,
+ row,
+ both
+};
+
+/**
+ * Function type used in the totals row of a table.
+ */
+enum class totals_row_function_t
+{
+ none = 0,
+ sum,
+ minimum,
+ maximum,
+ average,
+ count,
+ count_numbers,
+ standard_deviation,
+ variance,
+ custom
+};
+
+/**
+ * Type of conditional format.
+ */
+enum class conditional_format_t
+{
+ unknown = 0,
+ condition,
+ date,
+ formula,
+ colorscale,
+ databar,
+ iconset
+};
+
+/**
+ * Operator type associated with a conditional format rule.
+ */
+enum class condition_operator_t
+{
+ unknown = 0,
+ equal,
+ less,
+ greater,
+ greater_equal,
+ less_equal,
+ not_equal,
+ between,
+ not_between,
+ duplicate,
+ unique,
+ top_n,
+ bottom_n,
+ above_average,
+ below_average,
+ above_equal_average,
+ below_equal_average,
+ contains_error,
+ contains_no_error,
+ begins_with,
+ ends_with,
+ contains,
+ contains_blanks,
+ not_contains,
+ expression
+};
+
+/**
+ * Type of a condition in a conditional format rule. This is applicable only
+ * when the type of a conditional format entry is either:
+ *
+ * @li @p colorscale,
+ * @li @p databar or
+ * @li @p iconset.
+ */
+enum class condition_type_t
+{
+ unknown = 0,
+ value,
+ automatic,
+ max,
+ min,
+ formula,
+ percent,
+ percentile
+};
+
+/**
+ * Type of a date condition when the type of a conditional format entry is
+ * @p date.
+ */
+enum class condition_date_t
+{
+ unknown = 0,
+ today,
+ yesterday,
+ tomorrow,
+ last_7_days,
+ this_week,
+ next_week,
+ last_week,
+ this_month,
+ next_month,
+ last_month,
+ this_year,
+ next_year,
+ last_year,
+};
+
+/**
+ * Databar axis type, applicable only when the type of a conditional format
+ * entry is @p databar.
+ */
+enum class databar_axis_t
+{
+ none = 0,
+ middle,
+ automatic
+};
+
+/**
+ * Type of range grouping in a group field of a pivot table cache.
+ */
+enum class pivot_cache_group_by_t
+{
+ /**
+ * Type of range grouping is unknown.
+ *
+ * This is an implicit default value of this type.
+ */
+ unknown = 0,
+ /** Grouping on "days" for date values. */
+ days,
+ /** Grouping on "hours" for date values. */
+ hours,
+ /** Grouping on "minutes" for date values. */
+ minutes,
+ /** Grouping on "months" for date values. */
+ months,
+ /** Grouping on "quarters" for date values. */
+ quarters,
+ /** Grouping by numeric ranges for numeric values. */
+ range,
+ /** Grouping on "seconds" for date values. */
+ seconds,
+ /** Grouping on "years" for date values. */
+ years
+};
+
+/**
+ * Stores a 2-dimensional cell address.
+ */
+struct address_t
+{
+ row_t row;
+ col_t column;
+};
+
+/**
+ * Stores the size of a range of a spreadsheet.
+ */
+struct range_size_t
+{
+ row_t rows;
+ col_t columns;
+};
+
+/**
+ * Stores a 2-dimensional cell range by storing the positions of the top-left
+ * and bottom-right corners of the range.
+ */
+struct range_t
+{
+ address_t first;
+ address_t last;
+};
+
+/**
+ * Stores 3-dimensional cell address. The 'src' abbreviation stands for
+ * sheet-row-column.
+ */
+struct src_address_t
+{
+ sheet_t sheet;
+ row_t row;
+ col_t column;
+};
+
+/**
+ * Stores 3-dimensional cell range address. The 'src' abbreviation stands for
+ * sheet-row-column.
+ */
+struct src_range_t
+{
+ src_address_t first;
+ src_address_t last;
+};
+
+/**
+ * Convert a 3-dimensional cell address to a 2-dimensional counterpart by
+ * dropping the sheet index.
+ */
+ORCUS_DLLPUBLIC address_t to_rc_address(const src_address_t& r);
+
+/**
+ * Convert a 3-dimensional cell range address to a 2-dimensional counterpart
+ * by dropping the sheet indices.
+ */
+ORCUS_DLLPUBLIC range_t to_rc_range(const src_range_t& r);
+
+ORCUS_DLLPUBLIC bool operator== (const address_t& left, const address_t& right);
+ORCUS_DLLPUBLIC bool operator!= (const address_t& left, const address_t& right);
+
+ORCUS_DLLPUBLIC bool operator== (const src_address_t& left, const src_address_t& right);
+ORCUS_DLLPUBLIC bool operator!= (const src_address_t& left, const src_address_t& right);
+
+ORCUS_DLLPUBLIC bool operator== (const range_t& left, const range_t& right);
+ORCUS_DLLPUBLIC bool operator!= (const range_t& left, const range_t& right);
+
+ORCUS_DLLPUBLIC bool operator== (const src_range_t& left, const src_range_t& right);
+ORCUS_DLLPUBLIC bool operator!= (const src_range_t& left, const src_range_t& right);
+
+ORCUS_DLLPUBLIC bool operator< (const range_t& left, const range_t& right);
+ORCUS_DLLPUBLIC bool operator> (const range_t& left, const range_t& right);
+
+ORCUS_DLLPUBLIC range_t& operator+= (range_t& left, const address_t& right);
+ORCUS_DLLPUBLIC range_t& operator-= (range_t& left, const address_t& right);
+
+ORCUS_DLLPUBLIC std::ostream& operator<< (std::ostream& os, const address_t& v);
+ORCUS_DLLPUBLIC std::ostream& operator<< (std::ostream& os, const src_address_t& v);
+ORCUS_DLLPUBLIC std::ostream& operator<< (std::ostream& os, const range_t& v);
+
+/**
+ * Stores a color value in RGB format.
+ */
+struct color_rgb_t
+{
+ color_elem_t red;
+ color_elem_t green;
+ color_elem_t blue;
+};
+
+/**
+ * Convert a string representation of a totals row function name to its
+ * equivalent enum value.
+ *
+ * @param s string value for totals row function name.
+ *
+ * @return enum value representing the totals row function.
+ */
+ORCUS_DLLPUBLIC totals_row_function_t to_totals_row_function_enum(std::string_view s);
+
+/**
+ * Convert a string representation of a pivot cache group-by type to its
+ * equivalent enum value.
+ *
+ * @param s string value for pivot cache group-by type.
+ *
+ * @return enum value representing the pivot cache group-by type.
+ */
+ORCUS_DLLPUBLIC pivot_cache_group_by_t to_pivot_cache_group_by_enum(std::string_view s);
+
+/**
+ * Convert a string representation of a error value to its equivalent enum
+ * value.
+ *
+ * @param s error value string.
+ *
+ * @return enum value representing the error value.
+ */
+ORCUS_DLLPUBLIC error_value_t to_error_value_enum(std::string_view s);
+
+/**
+ * Convert a string representation of a RGB value to an equivalent struct
+ * value. The string representation is expected to be a 6 digit hexadecimal
+ * value string that may or may not be prefixed with a '#'.
+ *
+ * @param s string representation of the RGB value.
+ *
+ * @return struct value representing an RGB value.
+ */
+ORCUS_DLLPUBLIC color_rgb_t to_color_rgb(std::string_view s);
+
+/**
+ * Convert a color name to an RGB value. It supports SVG 1.0 color keyword
+ * names minus those gray colors with 'grey' spelling variants. Note that
+ * the name must be all in lowercase.
+ *
+ * @param s color name.
+ *
+ * @return struct value representing an RGB value.
+ */
+ORCUS_DLLPUBLIC color_rgb_t to_color_rgb_from_name(std::string_view s);
+
+/**
+ * Convert a formula error policy name to its enum value equivalent.
+ *
+ * @param s policy name.
+ *
+ * @return enum value equivalent for the original error policy name.
+ */
+ORCUS_DLLPUBLIC formula_error_policy_t to_formula_error_policy(std::string_view s);
+
+ORCUS_DLLPUBLIC std::ostream& operator<< (std::ostream& os, error_value_t ev);
+ORCUS_DLLPUBLIC std::ostream& operator<< (std::ostream& os, border_style_t border);
+ORCUS_DLLPUBLIC std::ostream& operator<< (std::ostream& os, formula_grammar_t grammar);
+ORCUS_DLLPUBLIC std::ostream& operator<< (std::ostream& os, underline_t uline);
+ORCUS_DLLPUBLIC std::ostream& operator<< (std::ostream& os, underline_width_t ulwidth);
+ORCUS_DLLPUBLIC std::ostream& operator<< (std::ostream& os, underline_mode_t ulmode);
+ORCUS_DLLPUBLIC std::ostream& operator<< (std::ostream& os, underline_type_t ultype);
+ORCUS_DLLPUBLIC std::ostream& operator<< (std::ostream& os, hor_alignment_t halign);
+ORCUS_DLLPUBLIC std::ostream& operator<< (std::ostream& os, ver_alignment_t valign);
+ORCUS_DLLPUBLIC std::ostream& operator<< (std::ostream& os, const color_rgb_t& color);
+ORCUS_DLLPUBLIC std::ostream& operator<< (std::ostream& os, const fill_pattern_t& fill);
+ORCUS_DLLPUBLIC std::ostream& operator<< (std::ostream& os, const strikethrough_style_t& ss);
+ORCUS_DLLPUBLIC std::ostream& operator<< (std::ostream& os, const strikethrough_type_t& st);
+ORCUS_DLLPUBLIC std::ostream& operator<< (std::ostream& os, const strikethrough_width_t& sw);
+ORCUS_DLLPUBLIC std::ostream& operator<< (std::ostream& os, const strikethrough_text_t& st);
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/spreadsheet/view.hpp b/include/orcus/spreadsheet/view.hpp
new file mode 100644
index 0000000..7b5552f
--- /dev/null
+++ b/include/orcus/spreadsheet/view.hpp
@@ -0,0 +1,65 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_SPREADSHEET_VIEW_HPP
+#define INCLUDED_ORCUS_SPREADSHEET_VIEW_HPP
+
+#include "orcus/env.hpp"
+#include "orcus/spreadsheet/types.hpp"
+#include "orcus/spreadsheet/view_types.hpp"
+
+#include <memory>
+
+namespace orcus { namespace spreadsheet {
+
+class sheet_view;
+class document;
+
+class ORCUS_SPM_DLLPUBLIC view
+{
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+public:
+ view(document& doc);
+ ~view();
+
+ sheet_view* get_or_create_sheet_view(sheet_t sheet);
+ const sheet_view* get_sheet_view(sheet_t sheet) const;
+
+ void set_active_sheet(sheet_t sheet);
+ sheet_t get_active_sheet() const;
+};
+
+class ORCUS_SPM_DLLPUBLIC sheet_view
+{
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+public:
+ sheet_view(view& doc_view);
+ ~sheet_view();
+
+ const range_t& get_selection(sheet_pane_t pos) const;
+
+ void set_selection(sheet_pane_t pos, const range_t& range);
+
+ void set_active_pane(sheet_pane_t pos);
+ sheet_pane_t get_active_pane() const;
+
+ void set_split_pane(double hor_split, double ver_split, const address_t& top_left_cell);
+ const split_pane_t& get_split_pane() const;
+
+ void set_frozen_pane(col_t visible_cols, row_t visible_rows, const address_t& top_left_cell);
+ const frozen_pane_t& get_frozen_pane() const;
+
+ view& get_document_view();
+};
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/spreadsheet/view_types.hpp b/include/orcus/spreadsheet/view_types.hpp
new file mode 100644
index 0000000..ae6e728
--- /dev/null
+++ b/include/orcus/spreadsheet/view_types.hpp
@@ -0,0 +1,95 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef ORCUS_SPREADSHEET_VIEW_TYPES_HPP
+#define ORCUS_SPREADSHEET_VIEW_TYPES_HPP
+
+#include "orcus/spreadsheet/types.hpp"
+
+namespace orcus { namespace spreadsheet {
+
+/**
+ * Sheet pane position in a split sheet view. When the sheet is split, it is
+ * split into four panes.
+ */
+enum class sheet_pane_t : uint8_t
+{
+ unspecified = 0,
+ /** Top-left pane. */
+ top_left,
+ /** Top-right pane. */
+ top_right,
+ /** Bottom-left pane. */
+ bottom_left,
+ /** Bottom-right pane. */
+ bottom_right
+};
+
+/**
+ * State of a split pane - whether it's frozen, split, or both.
+ */
+enum class pane_state_t : uint8_t
+{
+ /** The state of the pane is not specified. */
+ unspecified = 0,
+ /** The pane is frozen. */
+ frozen,
+ /** The pane is split. */
+ split,
+ /** The pane is both frozen and split. */
+ frozen_split
+};
+
+/**
+ * Store information about the state of a split sheet view.
+ */
+struct split_pane_t
+{
+ /**
+ * Horizontal distance to the vertical split bar in 1/20th of a point, or
+ * 0 if not horizontally split.
+ */
+ double hor_split;
+
+ /**
+ * Vertical distance to the horizontal split bar in 1/20th of a point, or
+ * 0 if not vertically split.
+ */
+ double ver_split;
+
+ /**
+ * Top-left visible cell of the bottom-right pane. This value is valid
+ * only when either the horizontal distance or the vertical distance is
+ * non-zero.
+ */
+ address_t top_left_cell;
+};
+
+/**
+ * Store the state of a frozen sheet view.
+ */
+struct frozen_pane_t
+{
+ /**
+ * The number of visible columns in the top-left pane.
+ */
+ col_t visible_columns;
+ /**
+ * The number of visible rows in the top-left pane.
+ */
+ row_t visible_rows;
+ /**
+ * The position of the top-left cell in the bottom-right pane.
+ */
+ address_t top_left_cell;
+};
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/stream.hpp b/include/orcus/stream.hpp
new file mode 100644
index 0000000..dd094bb
--- /dev/null
+++ b/include/orcus/stream.hpp
@@ -0,0 +1,188 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_STREAM_HPP
+#define INCLUDED_ORCUS_STREAM_HPP
+
+#include "env.hpp"
+
+#include <memory>
+#include <string>
+
+namespace orcus {
+
+/**
+ * Represents the content of a file.
+ *
+ * The file content is memory-mapped initially, but may later become in-memory
+ * if the non-utf-8 content gets converted to utf-8.
+ */
+class ORCUS_PSR_DLLPUBLIC file_content
+{
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+public:
+ file_content(const file_content&) = delete;
+ file_content& operator= (const file_content&) = delete;
+
+ file_content();
+ file_content(file_content&& other);
+ file_content(std::string_view filepath);
+ ~file_content();
+
+ /**
+ * Obtain the memory address to the first character in the content buffer.
+ *
+ * @return pointer to the first character in the buffer.
+ */
+ const char* data() const;
+
+ /**
+ * Return the size of the content i.e. the number of characters in the
+ * content buffer.
+ *
+ * @return size of the content.
+ */
+ size_t size() const;
+
+ /**
+ * Query whether or not the content is empty.
+ *
+ * @return true if the content is empty, otherwise false.
+ */
+ bool empty() const;
+
+ /**
+ * Swap content with another instance.
+ *
+ * @param other another instance to swap content with.
+ */
+ void swap(file_content& other);
+
+ /**
+ * Load from a new file. This will invalidate the pointer returned from the
+ * data() method prior to the call.
+ *
+ * @param filepath path of the file to load from.
+ */
+ void load(std::string_view filepath);
+
+ /**
+ * Convert a non-utf-8 stream to a utf-8 one if the source stream contains
+ * a byte order mark. If not, it does nothing. When the conversion
+ * happens, the converted content will be stored in-memory.
+ */
+ void convert_to_utf8();
+
+ std::string_view str() const;
+};
+
+/**
+ * Represents the content of an in-memory buffer. Note that this class will
+ * NOT own the content of the source buffer but simply will reference it,
+ * except when the original buffer is a non-utf-8 stream and the caller
+ * chooses to convert it to utf-8 by calling its convert_to_utf8() method.
+ */
+class ORCUS_PSR_DLLPUBLIC memory_content
+{
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+public:
+ memory_content(const file_content&) = delete;
+ memory_content& operator= (const file_content&) = delete;
+
+ memory_content();
+ memory_content(std::string_view s);
+ memory_content(memory_content&& other);
+ ~memory_content();
+
+ const char* data() const;
+ size_t size() const;
+ bool empty() const;
+
+ void swap(memory_content& other);
+
+ /**
+ * Convert a non-utf-8 stream to a utf-8 one if the source stream contains
+ * a byte order mark. If not, it does nothing. When the conversion
+ * happens, the converted content will be owned by the object.
+ */
+ void convert_to_utf8();
+
+ std::string_view str() const;
+};
+
+struct ORCUS_PSR_DLLPUBLIC line_with_offset
+{
+ /** content of the entire line. */
+ std::string line;
+ /** 0-based line number. */
+ std::size_t line_number;
+ /** 0-based offset within the line. */
+ std::size_t offset_on_line;
+
+ line_with_offset(std::string _line, std::size_t _line_number, std::size_t _offset_on_line);
+ line_with_offset(const line_with_offset& other);
+ line_with_offset(line_with_offset&& other);
+ ~line_with_offset();
+
+ bool operator== (const line_with_offset& other) const;
+ bool operator!= (const line_with_offset& other) const;
+};
+
+/**
+ * Generate a sensible error output for parse error including the line where
+ * the error occurred and the offset of the error position on that line.
+ *
+ * @param strm entire character stream where the error occurred.
+ * @param offset offset of the error position within the stream.
+ *
+ * @return string formatted to be usable as an error message for stdout.
+ */
+ORCUS_PSR_DLLPUBLIC std::string create_parse_error_output(std::string_view strm, std::ptrdiff_t offset);
+
+/**
+ * Given a string consisting of multiple lines i.e. multiple line breaks,
+ * find the line that contains the specified offset position.
+ *
+ * @param strm string stream containing multiple lines to search.
+ * @param offset offset position.
+ *
+ * @return structure containing information about the line containing the
+ * offset position.
+ *
+ * @exception std::invalid_argument if the offset value equals or exceeds the
+ * length of the string stream being searched.
+ */
+ORCUS_PSR_DLLPUBLIC line_with_offset locate_line_with_offset(std::string_view strm, std::ptrdiff_t offset);
+
+/**
+ * Given two strings, locate the position of the first character that is
+ * different between the two strings. Note that if one of the strings is
+ * empty (or both of them are empty), it returns 0.
+ *
+ * @param left one of the strings to compare.
+ * @param right one of the strings to compare.
+ *
+ * @return position of the first character that is different between the two
+ * compared strings.
+ */
+ORCUS_PSR_DLLPUBLIC size_t locate_first_different_char(std::string_view left, std::string_view right);
+
+/**
+ * Calculate the logical length of a UTF-8 encoded string.
+ *
+ * @param s string to calculate the logical length of.
+ * @return logical length of the UTF-8 encoded string.
+ */
+ORCUS_PSR_DLLPUBLIC std::size_t calc_logical_string_length(std::string_view s);
+
+} // namespace orcus
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/string_pool.hpp b/include/orcus/string_pool.hpp
new file mode 100644
index 0000000..12419bc
--- /dev/null
+++ b/include/orcus/string_pool.hpp
@@ -0,0 +1,99 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_STRING_POOL_HPP
+#define INCLUDED_ORCUS_STRING_POOL_HPP
+
+#include "env.hpp"
+
+#include <string>
+#include <memory>
+#include <vector>
+
+namespace orcus {
+
+/**
+ * This class implements a shared string pool with the ability to merge with
+ * other pools.
+ *
+ * @note This class is not copy-constructible, but is move-constructible.
+ */
+class ORCUS_PSR_DLLPUBLIC string_pool
+{
+public:
+ string_pool(const string_pool&) = delete;
+ string_pool& operator=(const string_pool&) = delete;
+
+ string_pool();
+ string_pool(string_pool&& other);
+ ~string_pool();
+
+ /**
+ * Intern a string.
+ *
+ * @param str string to intern.
+ *
+ * @return pair whose first value is the interned string, and the second
+ * value specifies whether it is a newly created instance (true)
+ * or a reuse of an existing instance (false).
+ */
+ std::pair<std::string_view, bool> intern(std::string_view str);
+
+ /**
+ * Return all interned strings.
+ *
+ * @return sequence of all interned strings. The sequence will be sorted.
+ */
+ std::vector<std::string_view> get_interned_strings() const;
+
+ /**
+ * Dump pool's content to stdout.
+ *
+ * @todo This needs to be reworked to make it more generally usable.
+ */
+ void dump() const;
+
+ /**
+ * Clear pool's content.
+ */
+ void clear();
+
+ /**
+ * Query the total number of strings stored in the pool.
+ *
+ * @return size_t total number of strings in the pool.
+ */
+ size_t size() const;
+
+ /**
+ * Swap the content with another string-pool instance.
+ *
+ *
+ * @param other string-pool instance to swap contents with.
+ */
+ void swap(string_pool& other);
+
+ /**
+ * Merge another string pool instance in. This will not invalidate any
+ * string references to the other pool.
+ *
+ * The other string pool instance will become empty when this call
+ * returns.
+ *
+ * @param other string pool instance to merge in.
+ */
+ void merge(string_pool& other);
+
+private:
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+};
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/threaded_json_parser.hpp b/include/orcus/threaded_json_parser.hpp
new file mode 100644
index 0000000..09bddfa
--- /dev/null
+++ b/include/orcus/threaded_json_parser.hpp
@@ -0,0 +1,185 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_THREADED_JSON_PARSER_HPP
+#define INCLUDED_ORCUS_THREADED_JSON_PARSER_HPP
+
+#include "json_parser_thread.hpp"
+#include "json_parser_base.hpp"
+#include "detail/thread.hpp"
+
+#include <algorithm>
+
+namespace orcus {
+
+template<typename _Handler>
+class threaded_json_parser
+{
+public:
+
+ typedef _Handler handler_type;
+
+ /**
+ * Constructor.
+ *
+ * @param p pointer to a string stream containing JSON string.
+ * @param n size of the stream.
+ * @param hdl handler class instance.
+ * @param min_token_size minimum size of the internal token buffer.
+ */
+ threaded_json_parser(
+ const char* p, size_t n, handler_type& hdl, size_t min_token_size);
+
+ /**
+ * Constructor.
+ *
+ * @param p pointer to a string stream containing JSON string.
+ * @param n size of the stream.
+ * @param hdl handler class instance.
+ * @param min_token_size minimum size of the internal token buffer.
+ * @param max_token_size maximum size of the internal token buffer.
+ */
+ threaded_json_parser(
+ const char* p, size_t n, handler_type& hdl, size_t min_token_size,
+ size_t max_token_size);
+
+ /**
+ * Call this method to start parsing.
+ */
+ void parse();
+
+ /**
+ * Get statistics on the parsing session. Call this only after the
+ * parsing has finished.
+ *
+ * @return structure containing statistics of the parsing session.
+ */
+ json::parser_stats get_stats() const;
+
+ void swap_string_pool(string_pool& pool);
+
+private:
+ void thread_parse();
+
+ void process_tokens(json::parse_tokens_t& tokens);
+
+private:
+ json::parser_thread m_parser_thread;
+ handler_type& m_handler;
+};
+
+template<typename _Handler>
+threaded_json_parser<_Handler>::threaded_json_parser(
+ const char* p, size_t n, handler_type& hdl, size_t min_token_size) :
+ m_parser_thread(p, n, min_token_size), m_handler(hdl) {}
+
+template<typename _Handler>
+threaded_json_parser<_Handler>::threaded_json_parser(
+ const char* p, size_t n, handler_type& hdl, size_t min_token_size, size_t max_token_size) :
+ m_parser_thread(p, n, min_token_size, max_token_size), m_handler(hdl) {}
+
+template<typename _Handler>
+void threaded_json_parser<_Handler>::parse()
+{
+ std::thread t(&threaded_json_parser::thread_parse, this);
+ detail::thread::scoped_guard guard(std::move(t));
+
+ json::parse_tokens_t tokens;
+
+ while (m_parser_thread.next_tokens(tokens))
+ process_tokens(tokens);
+
+ process_tokens(tokens);
+}
+
+template<typename _Handler>
+json::parser_stats threaded_json_parser<_Handler>::get_stats() const
+{
+ return m_parser_thread.get_stats();
+}
+
+template<typename _Handler>
+void threaded_json_parser<_Handler>::swap_string_pool(string_pool& pool)
+{
+ m_parser_thread.swap_string_pool(pool);
+}
+
+template<typename _Handler>
+void threaded_json_parser<_Handler>::thread_parse()
+{
+ // Start parsing.
+ m_parser_thread.start();
+}
+
+template<typename _Handler>
+void threaded_json_parser<_Handler>::process_tokens(json::parse_tokens_t& tokens)
+{
+ std::for_each(tokens.begin(), tokens.end(),
+ [this](const json::parse_token& t)
+ {
+ switch (t.type)
+ {
+ case json::parse_token_t::begin_array:
+ m_handler.begin_array();
+ break;
+ case json::parse_token_t::begin_object:
+ m_handler.begin_object();
+ break;
+ case json::parse_token_t::begin_parse:
+ m_handler.begin_parse();
+ break;
+ case json::parse_token_t::boolean_false:
+ m_handler.boolean_false();
+ break;
+ case json::parse_token_t::boolean_true:
+ m_handler.boolean_true();
+ break;
+ case json::parse_token_t::end_array:
+ m_handler.end_array();
+ break;
+ case json::parse_token_t::end_object:
+ m_handler.end_object();
+ break;
+ case json::parse_token_t::end_parse:
+ m_handler.end_parse();
+ break;
+ case json::parse_token_t::null:
+ m_handler.null();
+ break;
+ case json::parse_token_t::number:
+ m_handler.number(std::get<double>(t.value));
+ break;
+ case json::parse_token_t::object_key:
+ {
+ auto s = std::get<std::string_view>(t.value);
+ m_handler.object_key(s.data(), s.size(), false);
+ break;
+ }
+ case json::parse_token_t::string:
+ {
+ auto s = std::get<std::string_view>(t.value);
+ m_handler.string(s.data(), s.size(), false);
+ break;
+ }
+ case json::parse_token_t::parse_error:
+ {
+ auto v = std::get<parse_error_value_t>(t.value);
+ throw parse_error(std::string{v.str}, v.offset);
+ }
+ case json::parse_token_t::unknown:
+ default:
+ throw general_error("unknown token type encountered.");
+ }
+ }
+ );
+}
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/threaded_sax_token_parser.hpp b/include/orcus/threaded_sax_token_parser.hpp
new file mode 100644
index 0000000..aa9019f
--- /dev/null
+++ b/include/orcus/threaded_sax_token_parser.hpp
@@ -0,0 +1,165 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_THREADED_SAX_TOKEN_PARSER_HPP
+#define INCLUDED_ORCUS_THREADED_SAX_TOKEN_PARSER_HPP
+
+#include "tokens.hpp"
+#include "xml_namespace.hpp"
+#include "sax_token_parser_thread.hpp"
+#include "sax_parser_base.hpp"
+#include "exception.hpp"
+#include "detail/thread.hpp"
+
+#include <thread>
+
+namespace orcus {
+
+class xmlns_context;
+class string_pool;
+
+template<typename _Handler>
+class threaded_sax_token_parser
+{
+public:
+
+ typedef _Handler handler_type;
+
+ /**
+ * Constructor.
+ *
+ * @param p pointer to a string stream containing XML content.
+ * @param n size of the stream.
+ * @param tks XML token map instance.
+ * @param ns_cxt namespace context instance.
+ * @param hdl handler class instance.
+ * @param min_token_size minimum size of the internal token buffer.
+ */
+ threaded_sax_token_parser(
+ const char* p, size_t n, const tokens& tks, xmlns_context& ns_cxt,
+ handler_type& hdl, size_t min_token_size);
+
+ /**
+ * Constructor.
+ *
+ * @param p pointer to a string stream containing XML content.
+ * @param n size of the stream.
+ * @param tks XML token map instance.
+ * @param ns_cxt namespace context instance.
+ * @param hdl handler class instance.
+ * @param min_token_size minimum size of the internal token buffer.
+ * @param max_token_size maximum size of the internal token buffer.
+ */
+ threaded_sax_token_parser(
+ const char* p, size_t n, const tokens& tks, xmlns_context& ns_cxt,
+ handler_type& hdl, size_t min_token_size, size_t max_token_size);
+
+ /**
+ * Call this method to start parsing.
+ */
+ void parse();
+
+ void swap_string_pool(string_pool& pool);
+
+private:
+ void thread_parse();
+
+ void process_tokens(const sax::parse_tokens_t& tokens);
+
+private:
+ sax::parser_thread m_parser_thread;
+ handler_type& m_handler;
+};
+
+template<typename _Handler>
+threaded_sax_token_parser<_Handler>::threaded_sax_token_parser(
+ const char* p, size_t n, const tokens& tks, xmlns_context& ns_cxt,
+ handler_type& hdl, size_t min_token_size) :
+ m_parser_thread(p, n, tks, ns_cxt, min_token_size), m_handler(hdl) {}
+
+template<typename _Handler>
+threaded_sax_token_parser<_Handler>::threaded_sax_token_parser(
+ const char* p, size_t n, const tokens& tks, xmlns_context& ns_cxt, handler_type& hdl,
+ size_t min_token_size, size_t max_token_size) :
+ m_parser_thread(p, n, tks, ns_cxt, min_token_size, max_token_size), m_handler(hdl) {}
+
+template<typename _Handler>
+void threaded_sax_token_parser<_Handler>::parse()
+{
+ std::thread t(&threaded_sax_token_parser::thread_parse, this);
+ detail::thread::scoped_guard guard(std::move(t));
+
+ sax::parse_tokens_t tokens;
+
+ try
+ {
+ while (m_parser_thread.next_tokens(tokens))
+ process_tokens(tokens);
+
+ process_tokens(tokens);
+ }
+ catch (const std::exception&)
+ {
+ m_parser_thread.abort();
+ throw;
+ }
+}
+
+template<typename _Handler>
+void threaded_sax_token_parser<_Handler>::swap_string_pool(string_pool& pool)
+{
+ m_parser_thread.swap_string_pool(pool);
+}
+
+template<typename _Handler>
+void threaded_sax_token_parser<_Handler>::thread_parse()
+{
+ // Start parsing.
+ m_parser_thread.start();
+}
+
+template<typename _Handler>
+void threaded_sax_token_parser<_Handler>::process_tokens(const sax::parse_tokens_t& tks)
+{
+ for (const sax::parse_token& t : tks)
+ {
+ switch (t.type)
+ {
+ case sax::parse_token_t::start_element:
+ {
+ const auto* elem = std::get<const xml_token_element_t*>(t.value);
+ m_handler.start_element(*elem);
+ break;
+ }
+ case sax::parse_token_t::end_element:
+ {
+ const auto* elem = std::get<const xml_token_element_t*>(t.value);
+ m_handler.end_element(*elem);
+ break;
+ }
+ case sax::parse_token_t::characters:
+ {
+ auto s = std::get<std::string_view>(t.value);
+ m_handler.characters(s, false);
+ break;
+ }
+ case sax::parse_token_t::parse_error:
+ {
+ auto v = std::get<parse_error_value_t>(t.value);
+ throw malformed_xml_error(std::string{v.str}, v.offset);
+ }
+ default:
+ throw general_error("unknown token type encountered.");
+ }
+ }
+}
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/tokens.hpp b/include/orcus/tokens.hpp
new file mode 100644
index 0000000..9edc877
--- /dev/null
+++ b/include/orcus/tokens.hpp
@@ -0,0 +1,74 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_TOKENS_HPP
+#define INCLUDED_ORCUS_TOKENS_HPP
+
+#include "types.hpp"
+
+#include <algorithm>
+#include <unordered_map>
+
+namespace orcus {
+
+/**
+ * XML token store that provides mapping of integral token indentifiers and
+ * their original names. Instances of this class are typically used as global
+ * constants.
+ *
+ * @note The string values for the original token names should be static
+ * values whose values and memory addresses remain unchanged during the
+ * life cycle of the instance that references them.
+ *
+ * @note This class is not copy-constructible.
+ */
+class ORCUS_PSR_DLLPUBLIC tokens
+{
+public:
+ tokens() = delete;
+ tokens(const tokens&) = delete;
+ tokens(const char** token_names, size_t token_name_count);
+ ~tokens();
+
+ /**
+ * Check if a token returned from get_token() method is valid.
+ *
+ * @return true if valid, false otherwise.
+ */
+ bool is_valid_token(xml_token_t token) const;
+
+ /**
+ * Get token from a specified name.
+ *
+ * @param name textural token name
+ *
+ * @return token value representing the given textural token.
+ */
+ xml_token_t get_token(std::string_view name) const;
+
+ /**
+ * Get textural token name from a token value.
+ *
+ * @param token numeric token value
+ *
+ * @return textural token name, or empty string in case the given token is
+ * not valid.
+ */
+ std::string_view get_token_name(xml_token_t token) const;
+
+private:
+ using token_map_type = std::unordered_map<std::string_view, xml_token_t>;
+
+ token_map_type m_tokens;
+ const char** m_token_names;
+ size_t m_token_name_count;
+};
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/types.hpp b/include/orcus/types.hpp
new file mode 100644
index 0000000..34c968a
--- /dev/null
+++ b/include/orcus/types.hpp
@@ -0,0 +1,634 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_TYPES_HPP
+#define INCLUDED_ORCUS_TYPES_HPP
+
+#include <cstdint>
+#include <cstdlib>
+#include <vector>
+#include <string>
+#include <unordered_set>
+#include "env.hpp"
+
+namespace orcus {
+
+class xmlns_context;
+class xmlns_repository;
+
+/**
+ * Integral type that represents a tokenized XML element name.
+ */
+using xml_token_t = std::size_t;
+
+/**
+ * Type that represents a normalized XML namespace identifier. Internally it
+ * is a pointer value that points to a static char buffer that stores a
+ * namespace name.
+ */
+using xmlns_id_t = const char*;
+
+/**
+ * Parser token that represents the state of a parse error, used by
+ * threaded_json_parser and threaded_sax_token_parser when transferring
+ * parse status between threads.
+ */
+struct ORCUS_PSR_DLLPUBLIC parse_error_value_t
+{
+ /** error message associated with the parse error. */
+ std::string_view str;
+ /** offset in stream where the error occurred. */
+ std::ptrdiff_t offset;
+
+ parse_error_value_t();
+ parse_error_value_t(const parse_error_value_t& other);
+ parse_error_value_t(std::string_view _str, std::ptrdiff_t _offset);
+
+ parse_error_value_t& operator=(const parse_error_value_t& other);
+
+ bool operator==(const parse_error_value_t& other) const;
+ bool operator!=(const parse_error_value_t& other) const;
+};
+
+/**
+ * Represents a name with a normalized namespace in XML documents. This can
+ * be used either as an element name or as an attribute name.
+ */
+struct ORCUS_PSR_DLLPUBLIC xml_name_t
+{
+ enum to_string_type { use_alias, use_short_name };
+
+ xmlns_id_t ns;
+ std::string_view name;
+
+ xml_name_t() noexcept;
+ xml_name_t(xmlns_id_t _ns, std::string_view _name);
+ xml_name_t(const xml_name_t& other);
+
+ xml_name_t& operator= (const xml_name_t& other);
+
+ bool operator== (const xml_name_t& other) const noexcept;
+ bool operator!= (const xml_name_t& other) const noexcept;
+
+ /**
+ * Convert a namespace-name value pair to a string representation with the
+ * namespace value converted to either an alias or a unique "short name".
+ * Refer to @link xmlns_context::get_alias() get_alias() @endlink and
+ * @link xmlns_context::get_short_name() get_short_name() @endlink
+ * for the explanations of an alias and short name.
+ *
+ * @param cxt namespace context object associated with the XML stream
+ * currently being parsed.
+ * @param type policy on how to convert a namespace identifier to a string
+ * representation.
+ *
+ * @return string representation of a namespace-name value pair.
+ */
+ std::string to_string(const xmlns_context& cxt, to_string_type type) const;
+
+ /**
+ * Convert a namespace-name value pair to a string representation with the
+ * namespace value converted to a unique "short name". Refer to @link
+ * xmlns_repository::get_short_name() get_short_name() @endlink for the
+ * explanations of a short name.
+ *
+ * @param repo namespace repository.
+ *
+ * @return string representation of a namespace-name value pair.
+ */
+ std::string to_string(const xmlns_repository& repo) const;
+};
+
+/**
+ * Struct containing properties of a tokenized XML attribute.
+ */
+struct ORCUS_PSR_DLLPUBLIC xml_token_attr_t
+{
+ xmlns_id_t ns;
+ xml_token_t name;
+ std::string_view raw_name;
+ std::string_view value;
+
+ /**
+ * Whether or not the attribute value is transient. A transient value is
+ * only guaranteed to be valid until the end of the start_element call,
+ * after which its validity is not guaranteed. A non-transient value is
+ * guaranteed to be valid during the life cycle of the xml stream it
+ * belongs to.
+ */
+ bool transient;
+
+ xml_token_attr_t();
+ xml_token_attr_t(const xml_token_attr_t& other);
+ xml_token_attr_t(
+ xmlns_id_t _ns, xml_token_t _name, std::string_view _value, bool _transient);
+ xml_token_attr_t(
+ xmlns_id_t _ns, xml_token_t _name, std::string_view _raw_name,
+ std::string_view _value, bool _transient);
+
+ xml_token_attr_t& operator=(const xml_token_attr_t& other);
+};
+
+using xml_token_attrs_t = std::vector<xml_token_attr_t>;
+
+/**
+ * Struct containing XML element properties passed to the handler of
+ * sax_token_parser via its @p start_element() and @p end_element()
+ * calls.
+ *
+ * @see
+ * @li sax_token_handler::start_element
+ * @li sax_token_handler::end_element
+ */
+struct ORCUS_PSR_DLLPUBLIC xml_token_element_t
+{
+ xmlns_id_t ns;
+ xml_token_t name;
+ std::string_view raw_name;
+ xml_token_attrs_t attrs;
+
+ xml_token_element_t& operator= (xml_token_element_t) = delete;
+
+ xml_token_element_t();
+ xml_token_element_t(xmlns_id_t _ns, xml_token_t _name, std::string_view _raw_name, std::vector<xml_token_attr_t>&& _attrs);
+ xml_token_element_t(const xml_token_element_t& other);
+ xml_token_element_t(xml_token_element_t&& other);
+};
+
+/**
+ * Character set types, generated from IANA character-sets specifications.
+ *
+ * @see https://www.iana.org/assignments/character-sets/character-sets.xhtml
+ */
+enum class character_set_t
+{
+ unspecified = 0,
+ adobe_standard_encoding,
+ adobe_symbol_encoding,
+ amiga_1251,
+ ansi_x3_110_1983,
+ asmo_449,
+ big5,
+ big5_hkscs,
+ bocu_1,
+ brf,
+ bs_4730,
+ bs_viewdata,
+ cesu_8,
+ cp50220,
+ cp51932,
+ csa_z243_4_1985_1,
+ csa_z243_4_1985_2,
+ csa_z243_4_1985_gr,
+ csn_369103,
+ dec_mcs,
+ din_66003,
+ dk_us,
+ ds_2089,
+ ebcdic_at_de,
+ ebcdic_at_de_a,
+ ebcdic_ca_fr,
+ ebcdic_dk_no,
+ ebcdic_dk_no_a,
+ ebcdic_es,
+ ebcdic_es_a,
+ ebcdic_es_s,
+ ebcdic_fi_se,
+ ebcdic_fi_se_a,
+ ebcdic_fr,
+ ebcdic_it,
+ ebcdic_pt,
+ ebcdic_uk,
+ ebcdic_us,
+ ecma_cyrillic,
+ es,
+ es2,
+ euc_jp,
+ euc_kr,
+ extended_unix_code_fixed_width_for_japanese,
+ gb18030,
+ gb2312,
+ gb_1988_80,
+ gb_2312_80,
+ gbk,
+ gost_19768_74,
+ greek7,
+ greek7_old,
+ greek_ccitt,
+ hp_desktop,
+ hp_legal,
+ hp_math8,
+ hp_pi_font,
+ hp_roman8,
+ hz_gb_2312,
+ ibm00858,
+ ibm00924,
+ ibm01140,
+ ibm01141,
+ ibm01142,
+ ibm01143,
+ ibm01144,
+ ibm01145,
+ ibm01146,
+ ibm01147,
+ ibm01148,
+ ibm01149,
+ ibm037,
+ ibm038,
+ ibm1026,
+ ibm1047,
+ ibm273,
+ ibm274,
+ ibm275,
+ ibm277,
+ ibm278,
+ ibm280,
+ ibm281,
+ ibm284,
+ ibm285,
+ ibm290,
+ ibm297,
+ ibm420,
+ ibm423,
+ ibm424,
+ ibm437,
+ ibm500,
+ ibm775,
+ ibm850,
+ ibm851,
+ ibm852,
+ ibm855,
+ ibm857,
+ ibm860,
+ ibm861,
+ ibm862,
+ ibm863,
+ ibm864,
+ ibm865,
+ ibm866,
+ ibm868,
+ ibm869,
+ ibm870,
+ ibm871,
+ ibm880,
+ ibm891,
+ ibm903,
+ ibm904,
+ ibm905,
+ ibm918,
+ ibm_symbols,
+ ibm_thai,
+ iec_p27_1,
+ inis,
+ inis_8,
+ inis_cyrillic,
+ invariant,
+ iso_10367_box,
+ iso_10646_j_1,
+ iso_10646_ucs_2,
+ iso_10646_ucs_4,
+ iso_10646_ucs_basic,
+ iso_10646_unicode_latin1,
+ iso_10646_utf_1,
+ iso_11548_1,
+ iso_2022_cn,
+ iso_2022_cn_ext,
+ iso_2022_jp,
+ iso_2022_jp_2,
+ iso_2022_kr,
+ iso_2033_1983,
+ iso_5427,
+ iso_5427_1981,
+ iso_5428_1980,
+ iso_646_basic_1983,
+ iso_646_irv_1983,
+ iso_6937_2_25,
+ iso_6937_2_add,
+ iso_8859_1,
+ iso_8859_10,
+ iso_8859_13,
+ iso_8859_14,
+ iso_8859_15,
+ iso_8859_16,
+ iso_8859_1_windows_3_0_latin_1,
+ iso_8859_1_windows_3_1_latin_1,
+ iso_8859_2,
+ iso_8859_2_windows_latin_2,
+ iso_8859_3,
+ iso_8859_4,
+ iso_8859_5,
+ iso_8859_6,
+ iso_8859_6_e,
+ iso_8859_6_i,
+ iso_8859_7,
+ iso_8859_8,
+ iso_8859_8_e,
+ iso_8859_8_i,
+ iso_8859_9,
+ iso_8859_9_windows_latin_5,
+ iso_8859_supp,
+ iso_ir_90,
+ iso_unicode_ibm_1261,
+ iso_unicode_ibm_1264,
+ iso_unicode_ibm_1265,
+ iso_unicode_ibm_1268,
+ iso_unicode_ibm_1276,
+ it,
+ jis_c6220_1969_jp,
+ jis_c6220_1969_ro,
+ jis_c6226_1978,
+ jis_c6226_1983,
+ jis_c6229_1984_a,
+ jis_c6229_1984_b,
+ jis_c6229_1984_b_add,
+ jis_c6229_1984_hand,
+ jis_c6229_1984_hand_add,
+ jis_c6229_1984_kana,
+ jis_encoding,
+ jis_x0201,
+ jis_x0212_1990,
+ jus_i_b1_002,
+ jus_i_b1_003_mac,
+ jus_i_b1_003_serb,
+ koi7_switched,
+ koi8_r,
+ koi8_u,
+ ks_c_5601_1987,
+ ksc5636,
+ kz_1048,
+ latin_greek,
+ latin_greek_1,
+ latin_lap,
+ macintosh,
+ microsoft_publishing,
+ mnem,
+ mnemonic,
+ msz_7795_3,
+ nats_dano,
+ nats_dano_add,
+ nats_sefi,
+ nats_sefi_add,
+ nc_nc00_10_81,
+ nf_z_62_010,
+ nf_z_62_010_1973,
+ ns_4551_1,
+ ns_4551_2,
+ osd_ebcdic_df03_irv,
+ osd_ebcdic_df04_1,
+ osd_ebcdic_df04_15,
+ pc8_danish_norwegian,
+ pc8_turkish,
+ pt,
+ pt2,
+ ptcp154,
+ scsu,
+ sen_850200_b,
+ sen_850200_c,
+ shift_jis,
+ t_101_g2,
+ t_61_7bit,
+ t_61_8bit,
+ tis_620,
+ tscii,
+ unicode_1_1,
+ unicode_1_1_utf_7,
+ unknown_8bit,
+ us_ascii,
+ us_dk,
+ utf_16,
+ utf_16be,
+ utf_16le,
+ utf_32,
+ utf_32be,
+ utf_32le,
+ utf_7,
+ utf_7_imap,
+ utf_8,
+ ventura_international,
+ ventura_math,
+ ventura_us,
+ videotex_suppl,
+ viqr,
+ viscii,
+ windows_1250,
+ windows_1251,
+ windows_1252,
+ windows_1253,
+ windows_1254,
+ windows_1255,
+ windows_1256,
+ windows_1257,
+ windows_1258,
+ windows_31j,
+ windows_874,
+};
+
+/**
+ * Struct holding XML declaration properties.
+ */
+struct ORCUS_PSR_DLLPUBLIC xml_declaration_t
+{
+ uint8_t version_major;
+ uint8_t version_minor;
+ character_set_t encoding;
+ bool standalone;
+
+ xml_declaration_t();
+ xml_declaration_t(uint8_t _version_major, uint8_t _version_minor, character_set_t _encoding, bool _standalone);
+ xml_declaration_t(const xml_declaration_t& other);
+ ~xml_declaration_t();
+
+ xml_declaration_t& operator= (const xml_declaration_t& other);
+
+ bool operator== (const xml_declaration_t& other) const;
+ bool operator!= (const xml_declaration_t& other) const;
+};
+
+/**
+ * Unit of length, as used in length_t.
+ */
+enum class length_unit_t
+{
+ unknown = 0,
+ centimeter,
+ millimeter,
+ /**
+ * Special unit of length used by Excel, defined as the maximum digit width
+ * of font used as the "Normal" style font.
+ *
+ * @note Since it's not possible to determine the actual length using this
+ * unit, it is approximated by 1.9 millimeters.
+ */
+ xlsx_column_digit,
+ inch,
+ point,
+ /** One twip is a twentieth of a point equal to 1/1440 of an inch. */
+ twip,
+ pixel
+};
+
+/**
+ * Input formats that orcus can import.
+ */
+enum class format_t
+{
+ unknown = 0,
+ ods,
+ xlsx,
+ gnumeric,
+ xls_xml,
+ csv,
+ parquet
+};
+
+/**
+ * Formats supported by orcus as output formats.
+ */
+enum class dump_format_t
+{
+ unknown = 0,
+ none,
+ check,
+ csv,
+ flat,
+ html,
+ json,
+ xml,
+ yaml,
+ debug_state
+};
+
+/**
+ * Holds a length value with unit of measurement.
+ */
+struct ORCUS_PSR_DLLPUBLIC length_t
+{
+ length_unit_t unit;
+ double value;
+
+ length_t();
+ length_t(length_unit_t _unit, double _value);
+ length_t(const length_t& other);
+ length_t& operator= (const length_t& other);
+
+ std::string to_string() const;
+
+ bool operator== (const length_t& other) const noexcept;
+ bool operator!= (const length_t& other) const noexcept;
+};
+
+/**
+ * Struct that holds a date or date-time value.
+ */
+struct ORCUS_PSR_DLLPUBLIC date_time_t
+{
+ int year;
+ int month;
+ int day;
+ int hour;
+ int minute;
+ double second;
+
+ date_time_t();
+ date_time_t(int _year, int _month, int _day);
+ date_time_t(int _year, int _month, int _day, int _hour, int _minute, double _second);
+ date_time_t(const date_time_t& other);
+ ~date_time_t();
+
+ date_time_t& operator= (date_time_t other);
+
+ bool operator== (const date_time_t& other) const;
+ bool operator!= (const date_time_t& other) const;
+ bool operator< (const date_time_t& other) const;
+
+ /**
+ * Convert the date-time value to an ISO-formatted string representation.
+ *
+ * @return ISO-formatted string representation of the date-time value.
+ */
+ std::string to_string() const;
+
+ /**
+ * Swap the value with another instance.
+ *
+ * @param other another instance to swap values with.
+ */
+ void swap(date_time_t& other);
+
+ /**
+ * Parse an ISO-formatted string representation of a date-time value, and
+ * convert it into a date_time_t value. A string representation allows
+ * either a date only or a date and time value, but it does not allow a time
+ * only value.
+ *
+ * Here are some examples of ISO-formatted date and date-time values:
+ *
+ * @li <b>2013-04-09</b> (date only)
+ * @li <b>2013-04-09T21:34:09.55</b> (date and time)
+ *
+ * @param str string representation of a date-time value.
+ * @return converted date-time value consisting of a set of numeric values.
+ */
+ static date_time_t from_chars(std::string_view str);
+};
+
+/**
+ * Parse a string that represents an output format type and convert it to a
+ * corresponding enum value.
+ *
+ * @param s string representing an output format type.
+ *
+ * @return enum value representing a character set, or
+ * character_set_t::unknown in case it cannot be
+ * determined.
+ */
+ORCUS_PSR_DLLPUBLIC dump_format_t to_dump_format_enum(std::string_view s);
+
+/**
+ * Parse a string that represents a character set and convert it to a
+ * corresponding enum value.
+ *
+ * @param s string representing a character set.
+ *
+ * @return enum value representing a character set, or
+ * character_set_t::unspecified in case it cannot be
+ * determined.
+ */
+ORCUS_PSR_DLLPUBLIC character_set_t to_character_set(std::string_view s);
+
+/**
+ * Get a list of available output format entries. Each entry consists of the
+ * name of a format and its enum value equivalent.
+ *
+ * @return list of available output format entries.
+ */
+ORCUS_PSR_DLLPUBLIC std::vector<std::pair<std::string_view, dump_format_t>> get_dump_format_entries();
+
+ORCUS_PSR_DLLPUBLIC std::ostream& operator<< (std::ostream& os, const length_t& v);
+ORCUS_PSR_DLLPUBLIC std::ostream& operator<< (std::ostream& os, const date_time_t& v);
+ORCUS_PSR_DLLPUBLIC std::ostream& operator<< (std::ostream& os, format_t v);
+
+/**
+ * Generic constant to be used to indicate that a valid index value is
+ * expected but not found.
+ */
+ORCUS_PSR_DLLPUBLIC extern const std::size_t INDEX_NOT_FOUND;
+
+/**
+ * Value associated with an unknown XML namespace.
+ */
+ORCUS_PSR_DLLPUBLIC extern const xmlns_id_t XMLNS_UNKNOWN_ID;
+
+/**
+ * Value associated with an unknown XML token.
+ */
+ORCUS_PSR_DLLPUBLIC extern const xml_token_t XML_UNKNOWN_TOKEN;
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/xml_namespace.hpp b/include/orcus/xml_namespace.hpp
new file mode 100644
index 0000000..cf9b270
--- /dev/null
+++ b/include/orcus/xml_namespace.hpp
@@ -0,0 +1,195 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_XML_NAMESPACE_MANAGER_HPP
+#define INCLUDED_ORCUS_XML_NAMESPACE_MANAGER_HPP
+
+#include "types.hpp"
+
+#include <ostream>
+#include <memory>
+
+namespace orcus {
+
+class xmlns_context;
+struct xmlns_repository_impl;
+struct xmlns_context_impl;
+
+/**
+ * Central XML namespace repository that stores all namespaces that are used
+ * in the current session.
+ *
+ * @warning this class is not copyable, but is movable; however, the
+ * moved-from object will not be usable after the move.
+ */
+class ORCUS_PSR_DLLPUBLIC xmlns_repository
+{
+ friend class xmlns_context;
+
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+ xmlns_id_t intern(std::string_view uri);
+
+ size_t get_index(xmlns_id_t ns_id) const;
+
+public:
+ xmlns_repository(const xmlns_repository&) = delete;
+ xmlns_repository& operator= (const xmlns_repository&) = delete;
+
+ xmlns_repository();
+ xmlns_repository(xmlns_repository&& other);
+ ~xmlns_repository();
+
+ xmlns_repository& operator= (xmlns_repository&&);
+
+ /**
+ * Add a set of predefined namespace values to the repository.
+ *
+ * @param predefined_ns predefined set of namespace values. This is a
+ * null-terminated array of xmlns_id_t. This
+ * xmlns_repository instance will assume that the
+ * instances of these xmlns_id_t values will be
+ * available throughout its life cycle; caller needs
+ * to ensure that they won't get deleted before the
+ * corresponding xmlns_repository instance is
+ * deleted.
+ */
+ void add_predefined_values(const xmlns_id_t* predefined_ns);
+
+ /**
+ * Create a context object associated with this namespace repository.
+ *
+ * @warning Since this context object references values stored in the repo,
+ * make sure that it will not out-live the repository object
+ * itself.
+ *
+ * @return context object to use for a new XML stream.
+ */
+ xmlns_context create_context();
+
+ /**
+ * Get XML namespace identifier from its numerical index.
+ *
+ * @param index numeric index of namespace.
+ *
+ * @return valid namespace identifier, or XMLNS_UNKNOWN_ID if not found.
+ */
+ xmlns_id_t get_identifier(size_t index) const;
+
+ /**
+ * See xmlns_context::get_short_name() for the explanation of this method,
+ * which works identically to it.
+ */
+ std::string get_short_name(xmlns_id_t ns_id) const;
+};
+
+/**
+ * XML namespace context. A new context should be used for each xml stream
+ * since the namespace keys themselves are not interned. Don't hold an
+ * instance of this class any longer than the life cycle of the xml stream
+ * it is used in.
+ *
+ * An empty key value i.e. `""` is associated with a default namespace.
+ */
+class ORCUS_PSR_DLLPUBLIC xmlns_context
+{
+ friend class xmlns_repository;
+
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+ xmlns_context(xmlns_repository& repo);
+public:
+ xmlns_context();
+ xmlns_context(xmlns_context&&);
+ xmlns_context(const xmlns_context& r);
+ ~xmlns_context();
+
+ xmlns_context& operator= (const xmlns_context& r);
+ xmlns_context& operator= (xmlns_context&& r);
+
+ /**
+ * Push a new namespace alias-value pair to the stack.
+ *
+ * @param alias namespace alias to push onto the stack. If the same alias
+ * is already present, this overwrites it until it gets popped
+ * off the stack.
+ * @param uri namespace name to associate with the alias.
+ *
+ * @return normalized namespace identifier for the namespace name.
+ */
+ xmlns_id_t push(std::string_view alias, std::string_view uri);
+
+ /**
+ * Pop a namespace alias from the stack.
+ *
+ * @param alias namespace alias to pop from the stack.
+ */
+ void pop(std::string_view alias);
+
+ /**
+ * Get the currnet namespace identifier for a specified namespace alias.
+ *
+ * @param alias namespace alias to get the current namespace identifier for.
+ *
+ * @return current namespace identifier associated with the alias.
+ */
+ xmlns_id_t get(std::string_view alias) const;
+
+ /**
+ * Get a unique index value associated with a specified identifier. An
+ * index value is guaranteed to be unique regardless of contexts.
+ *
+ * @param ns_id a namespace identifier to obtain index for.
+ *
+ * @return index value associated with the identifier.
+ */
+ size_t get_index(xmlns_id_t ns_id) const;
+
+ /**
+ * Get a 'short' name associated with a specified identifier. A short
+ * name is a string value conveniently short enough for display purposes,
+ * but still guaranteed to be unique to the identifier it is associated
+ * with.
+ *
+ * @note The xmlns_repository class has method of the same name, and that
+ * method works identically to this method.
+ *
+ * @param ns_id a namespace identifier to obtain short name for.
+ *
+ * @return short name for the specified identifier.
+ */
+ std::string get_short_name(xmlns_id_t ns_id) const;
+
+ /**
+ * Get an alias currently associated with a given namespace identifier.
+ *
+ * @param ns_id namespace identifier.
+ *
+ * @return alias name currently associted with the given namespace
+ * identifier, or an empty string if the given namespace is
+ * currently not associated with any aliases.
+ */
+ std::string_view get_alias(xmlns_id_t ns_id) const;
+
+ std::vector<xmlns_id_t> get_all_namespaces() const;
+
+ void dump(std::ostream& os) const;
+
+ /**
+ * Dump the internal state for debugging in YAML format.
+ */
+ void dump_state(std::ostream& os) const;
+
+ void swap(xmlns_context& other) noexcept;
+};
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/xml_structure_tree.hpp b/include/orcus/xml_structure_tree.hpp
new file mode 100644
index 0000000..423ede4
--- /dev/null
+++ b/include/orcus/xml_structure_tree.hpp
@@ -0,0 +1,198 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_XML_STRUCTURE_TREE_HPP
+#define INCLUDED_ORCUS_XML_STRUCTURE_TREE_HPP
+
+#include "env.hpp"
+#include "types.hpp"
+
+#include <ostream>
+#include <memory>
+#include <functional>
+
+namespace orcus {
+
+class xmlns_context;
+
+struct ORCUS_DLLPUBLIC xml_table_range_t
+{
+ std::vector<std::string> paths;
+ std::vector<std::string> row_groups;
+
+ xml_table_range_t();
+ ~xml_table_range_t();
+};
+
+/**
+ * Tree representing the structure of elements in XML content. Recurring
+ * elements under the same parent are represented by a single element
+ * instance. This tree only includes elements; no attributes and content
+ * nodes appear in this tree.
+ */
+class ORCUS_DLLPUBLIC xml_structure_tree
+{
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+public:
+ xml_structure_tree() = delete;
+ xml_structure_tree(const xml_structure_tree&) = delete;
+ xml_structure_tree& operator= (const xml_structure_tree&) = delete;
+
+ struct ORCUS_DLLPUBLIC entity_name
+ {
+ xmlns_id_t ns;
+ std::string_view name;
+
+ entity_name();
+ entity_name(xmlns_id_t _ns, std::string_view _name);
+
+ bool operator< (const entity_name& r) const;
+ bool operator== (const entity_name& r) const;
+
+ struct ORCUS_DLLPUBLIC hash
+ {
+ size_t operator ()(const entity_name& val) const;
+ };
+ };
+
+ typedef std::vector<entity_name> entity_names_type;
+
+ struct ORCUS_DLLPUBLIC element
+ {
+ entity_name name;
+ bool repeat;
+ bool has_content;
+
+ element();
+ element(const entity_name& _name, bool _repeat, bool _has_content);
+ };
+
+ struct walker_impl;
+
+ /**
+ * This class allows client to traverse the tree.
+ */
+ class ORCUS_DLLPUBLIC walker
+ {
+ friend class xml_structure_tree;
+
+ std::unique_ptr<walker_impl> mp_impl;
+
+ walker(const xml_structure_tree::impl& parent_impl);
+ public:
+ walker() = delete;
+ walker(const walker& r);
+ ~walker();
+ walker& operator= (const walker& r);
+
+ /**
+ * Set current position to the root element, and return the root
+ * element.
+ *
+ * @return root element.
+ */
+ element root();
+
+ /**
+ * Descend into a specified child element.
+ *
+ * @param name name of a child element.
+ *
+ * @return child element
+ *
+ * @throw general_error if no child elements exist for the specified
+ * name.
+ */
+ element descend(const entity_name& name);
+
+ /**
+ * Move up to the parent element.
+ */
+ element ascend();
+
+ /**
+ * Move to the element specified by a path expression. The path
+ * expression may be generated by
+ * <code>xml_structure_tree::walker::get_path</code>.
+ *
+ * @param path a simple XPath like expression
+ *
+ * @return element pointed to by the path.
+ */
+ element move_to(const std::string& path);
+
+ /**
+ * Get a list of names of all child elements at the current element
+ * position. The list of names is in order of appearance.
+ *
+ * @return list of child element names in order of appearance.
+ */
+ entity_names_type get_children();
+
+ /**
+ * Get a list of names of all attributes that belong to current
+ * element. The list of names is in order of appearance.
+ *
+ * @return list of attribute names in order of appearance.
+ */
+ entity_names_type get_attributes();
+
+ /**
+ * Get a numerical, 0-based index of given XML namespace.
+ *
+ * @param ns XML namespace ID.
+ *
+ * @return numeric, 0-based index of XML namespace if found, or
+ * <code>xml_structure_tree::walker::index_not_found</code> if
+ * the namespace is not found in this structure.
+ */
+ size_t get_xmlns_index(xmlns_id_t ns) const;
+
+ std::string get_xmlns_short_name(xmlns_id_t ns) const;
+
+ /**
+ * Convert an entity name to its proper string representation.
+ *
+ * @param name entity name to convert to string.
+ *
+ * @return string representation of the entity name, including the
+ * namespace.
+ */
+ std::string to_string(const entity_name& name) const;
+
+ /**
+ * Get a XPath like ID for the element inside of the XML tree.
+ *
+ */
+ std::string get_path() const;
+ };
+
+ xml_structure_tree(xmlns_context& xmlns_cxt);
+ xml_structure_tree(xml_structure_tree&& other);
+ ~xml_structure_tree();
+
+ void parse(std::string_view s);
+
+ void dump_compact(std::ostream& os) const;
+
+ walker get_walker() const;
+
+ using range_handler_type = std::function<void(xml_table_range_t&&)>;
+
+ void process_ranges(range_handler_type rh) const;
+
+ void swap(xml_structure_tree& other);
+};
+
+}
+
+
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/xml_writer.hpp b/include/orcus/xml_writer.hpp
new file mode 100644
index 0000000..b55485c
--- /dev/null
+++ b/include/orcus/xml_writer.hpp
@@ -0,0 +1,122 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_XML_WRITER_HPP
+#define INCLUDED_ORCUS_XML_WRITER_HPP
+
+#include "orcus/types.hpp"
+
+#include <memory>
+
+namespace orcus {
+
+class xmlns_repository;
+
+/**
+ * This class lets you produce XML contents from scratch. It writes its
+ * content to any object supporting the std::ostream interface.
+ */
+class ORCUS_PSR_DLLPUBLIC xml_writer
+{
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+ void close_current_element();
+ void pop_elements();
+
+public:
+ class ORCUS_PSR_DLLPUBLIC scope
+ {
+ friend class xml_writer;
+
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+ scope(xml_writer* parent, const xml_name_t& name);
+ public:
+ scope(const scope&) = delete;
+ scope(scope&& other);
+ ~scope();
+
+ scope& operator= (scope&& other);
+ };
+
+ xml_writer(const xml_writer&) = delete;
+ xml_writer& operator= (const xml_writer&) = delete;
+
+ xml_writer(xmlns_repository& ns_repo, std::ostream& os);
+ xml_writer(xml_writer&& other);
+
+ xml_writer& operator= (xml_writer&& other);
+
+ /**
+ * Destructor. Any remaining element(s) on the stack will get popped when
+ * the destructor is called.
+ */
+ ~xml_writer();
+
+ /**
+ * Push a new element to the stack, and write an opening element to the
+ * output stream. It differs from the {@link push_element} method in that
+ * the new element will be automatically popped when the returned object
+ * goes out of scope.
+ *
+ * @param name name of the new element.
+ *
+ * @return scope object which automatically pops the element when it goes
+ * out of scope.
+ */
+ scope push_element_scope(const xml_name_t& name);
+
+ /**
+ * Push a new element to the stack, and write an opening element to the
+ * output stream.
+ *
+ * @param name name of the element.
+ */
+ void push_element(const xml_name_t& name);
+
+ /**
+ * Add a namespace definition for the next element to be pushed.
+ *
+ * @param alias alias for the namespace.
+ * @param value value of the namespace definition.
+ *
+ * @return ID for the namespace being added.
+ */
+ xmlns_id_t add_namespace(std::string_view alias, std::string_view value);
+
+ /**
+ * Add a new attribute for the next element to be pushed.
+ *
+ * @param name name of the attribute to be added.
+ * @param value value of the attribute to be added.
+ */
+ void add_attribute(const xml_name_t& name, std::string_view value);
+
+ /**
+ * Add a content to the current element on the stack. The content will be
+ * properly encoded.
+ *
+ * @param content content to be added to the current element.
+ */
+ void add_content(std::string_view content);
+
+ /**
+ * Pop the current element from the stack, and write a closing element to
+ * the output stream.
+ *
+ * @return the name of the element being popped.
+ */
+ xml_name_t pop_element();
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/yaml_document_tree.hpp b/include/orcus/yaml_document_tree.hpp
new file mode 100644
index 0000000..d22a588
--- /dev/null
+++ b/include/orcus/yaml_document_tree.hpp
@@ -0,0 +1,109 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_YAML_DOCUMENT_TREE_HPP
+#define INCLUDED_ORCUS_YAML_DOCUMENT_TREE_HPP
+
+#include "env.hpp"
+#include "exception.hpp"
+
+#include <string>
+#include <memory>
+#include <vector>
+
+namespace orcus {
+
+namespace yaml {
+
+class document_tree;
+
+class ORCUS_DLLPUBLIC document_error : public general_error
+{
+public:
+ document_error(const std::string& msg);
+ virtual ~document_error();
+};
+
+enum class node_t : uint8_t
+{
+ unset,
+ string,
+ number,
+ map,
+ sequence,
+ boolean_true,
+ boolean_false,
+ null
+};
+
+struct yaml_value;
+
+class ORCUS_DLLPUBLIC const_node
+{
+ friend class ::orcus::yaml::document_tree;
+
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+ const_node(const yaml_value* yv);
+
+public:
+ const_node() = delete;
+
+ const_node(const const_node& other);
+ const_node(const_node&& rhs);
+ ~const_node();
+
+ node_t type() const;
+
+ size_t child_count() const;
+
+ std::vector<const_node> keys() const;
+
+ const_node key(size_t index) const;
+
+ const_node child(size_t index) const;
+
+ const_node child(const const_node& key) const;
+
+ const_node parent() const;
+
+ std::string_view string_value() const;
+ double numeric_value() const;
+
+ const_node& operator=(const const_node& other);
+
+ uintptr_t identity() const;
+};
+
+class ORCUS_DLLPUBLIC document_tree
+{
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+public:
+ document_tree();
+ document_tree(const document_tree&) = delete;
+ document_tree(document_tree&& other);
+ ~document_tree();
+
+ void load(std::string_view s);
+
+ size_t get_document_count() const;
+
+ const_node get_document_root(size_t index) const;
+
+ std::string dump_yaml() const;
+
+ std::string dump_json() const;
+};
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/yaml_parser.hpp b/include/orcus/yaml_parser.hpp
new file mode 100644
index 0000000..836a902
--- /dev/null
+++ b/include/orcus/yaml_parser.hpp
@@ -0,0 +1,691 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_YAML_PARSER_HPP
+#define INCLUDED_ORCUS_YAML_PARSER_HPP
+
+#include "orcus/yaml_parser_base.hpp"
+#include "orcus/parser_global.hpp"
+
+namespace orcus {
+
+/**
+ * Blank handler class for yaml_parser. One can sub-class this and overwrite
+ * callback functions one needs to handle.
+ */
+class yaml_handler
+{
+public:
+ /**
+ * Called when the parser starts parsing a content.
+ */
+ void begin_parse() {}
+
+ /**
+ * Called when the parser finishes parsing an entire content.
+ */
+ void end_parse() {}
+
+ /**
+ * Called when a new document is encountered.
+ */
+ void begin_document() {}
+
+ /**
+ * Called when the parser has finished parsing a document.
+ */
+ void end_document() {}
+
+ /**
+ * Called when a sequence begins.
+ */
+ void begin_sequence() {}
+
+ /**
+ * Called when a sequence ends.
+ */
+ void end_sequence() {}
+
+ /**
+ * Called when a map begins.
+ */
+ void begin_map() {}
+
+ /**
+ * Called when the parser starts parsing a map key.
+ */
+ void begin_map_key() {}
+
+ /**
+ * Called when the parser finishes parsing a map key.
+ */
+ void end_map_key() {}
+
+ /**
+ * Called when the parser finishes parsing an entire map.
+ */
+ void end_map() {}
+
+ /**
+ * Called when a string value is encountered.
+ *
+ * @param value string value.
+ */
+ void string(std::string_view value)
+ {
+ (void)value;
+ }
+
+ /**
+ * Called when a numeric value is encountered.
+ *
+ * @param val numeric value.
+ */
+ void number(double val)
+ {
+ (void)val;
+ }
+
+ /**
+ * Called when a boolean 'true' keyword is encountered.
+ */
+ void boolean_true() {}
+
+ /**
+ * Called when a boolean 'false' keyword is encountered.
+ */
+ void boolean_false() {}
+
+ /**
+ * Called when a 'null' keyword is encountered.
+ */
+ void null() {}
+};
+
+/**
+ * Parser for YAML documents.
+ *
+ * @tparam HandlerT Hanlder type with member functions for event callbacks.
+ * Refer to yaml_handler.
+ *
+ * @warning This parser is still highly experimental. Use with caution.
+ */
+template<typename HandlerT>
+class yaml_parser : public yaml::parser_base
+{
+public:
+ typedef HandlerT handler_type;
+
+ yaml_parser(std::string_view content, handler_type& hdl);
+
+ void parse();
+
+private:
+ size_t end_scope();
+ void check_or_begin_document();
+ void check_or_begin_map();
+ void check_or_begin_sequence();
+ void parse_value(const char* p, size_t len);
+ void push_value(const char* p, size_t len);
+ void parse_line(const char* p, size_t len);
+ void parse_map_key(const char* p, size_t len);
+
+ void handler_begin_parse();
+ void handler_end_parse();
+ void handler_begin_document();
+ void handler_end_document();
+ void handler_begin_sequence();
+ void handler_end_sequence();
+ void handler_begin_map();
+ void handler_end_map();
+ void handler_begin_map_key();
+ void handler_end_map_key();
+ void handler_string(const char* p, size_t n);
+ void handler_number(double val);
+ void handler_boolean_true();
+ void handler_boolean_false();
+ void handler_null();
+
+private:
+ handler_type& m_handler;
+};
+
+template<typename _Handler>
+void yaml_parser<_Handler>::handler_begin_parse()
+{
+ push_parse_token(yaml::detail::parse_token_t::begin_parse);
+ m_handler.begin_parse();
+}
+
+template<typename _Handler>
+void yaml_parser<_Handler>::handler_end_parse()
+{
+ push_parse_token(yaml::detail::parse_token_t::end_parse);
+ m_handler.end_parse();
+}
+
+template<typename _Handler>
+void yaml_parser<_Handler>::handler_begin_document()
+{
+ push_parse_token(yaml::detail::parse_token_t::begin_document);
+ m_handler.begin_document();
+}
+
+template<typename _Handler>
+void yaml_parser<_Handler>::handler_end_document()
+{
+ push_parse_token(yaml::detail::parse_token_t::end_document);
+ m_handler.end_document();
+}
+
+template<typename _Handler>
+void yaml_parser<_Handler>::handler_begin_sequence()
+{
+ push_parse_token(yaml::detail::parse_token_t::begin_sequence);
+ m_handler.begin_sequence();
+}
+
+template<typename _Handler>
+void yaml_parser<_Handler>::handler_end_sequence()
+{
+ push_parse_token(yaml::detail::parse_token_t::end_sequence);
+ m_handler.end_sequence();
+}
+
+template<typename _Handler>
+void yaml_parser<_Handler>::handler_begin_map()
+{
+ push_parse_token(yaml::detail::parse_token_t::begin_map);
+ m_handler.begin_map();
+}
+
+template<typename _Handler>
+void yaml_parser<_Handler>::handler_end_map()
+{
+ push_parse_token(yaml::detail::parse_token_t::end_map);
+ m_handler.end_map();
+}
+
+template<typename _Handler>
+void yaml_parser<_Handler>::handler_begin_map_key()
+{
+ push_parse_token(yaml::detail::parse_token_t::begin_map_key);
+ m_handler.begin_map_key();
+}
+
+template<typename _Handler>
+void yaml_parser<_Handler>::handler_end_map_key()
+{
+ push_parse_token(yaml::detail::parse_token_t::end_map_key);
+ m_handler.end_map_key();
+}
+
+template<typename _Handler>
+void yaml_parser<_Handler>::handler_string(const char* p, size_t n)
+{
+ push_parse_token(yaml::detail::parse_token_t::string);
+ m_handler.string({p, n});
+}
+
+template<typename _Handler>
+void yaml_parser<_Handler>::handler_number(double val)
+{
+ push_parse_token(yaml::detail::parse_token_t::number);
+ m_handler.number(val);
+}
+
+template<typename _Handler>
+void yaml_parser<_Handler>::handler_boolean_true()
+{
+ push_parse_token(yaml::detail::parse_token_t::boolean_true);
+ m_handler.boolean_true();
+}
+
+template<typename _Handler>
+void yaml_parser<_Handler>::handler_boolean_false()
+{
+ push_parse_token(yaml::detail::parse_token_t::boolean_false);
+ m_handler.boolean_false();
+}
+
+template<typename _Handler>
+void yaml_parser<_Handler>::handler_null()
+{
+ push_parse_token(yaml::detail::parse_token_t::null);
+ m_handler.null();
+}
+
+template<typename _Handler>
+yaml_parser<_Handler>::yaml_parser(std::string_view content, handler_type& hdl) :
+ yaml::parser_base(content), m_handler(hdl) {}
+
+template<typename _Handler>
+void yaml_parser<_Handler>::parse()
+{
+ handler_begin_parse();
+
+ while (has_char())
+ {
+ reset_on_new_line();
+
+ size_t indent = parse_indent();
+ if (indent == parse_indent_end_of_stream)
+ break;
+
+ if (indent == parse_indent_blank_line)
+ continue;
+
+ size_t cur_scope = get_scope();
+
+ if (cur_scope <= indent)
+ {
+ if (in_literal_block())
+ {
+ handle_line_in_literal(indent);
+ continue;
+ }
+
+ if (has_line_buffer())
+ {
+ // This line is part of multi-line string. Push the line to the
+ // buffer as-is.
+ handle_line_in_multi_line_string();
+ continue;
+ }
+ }
+
+ if (cur_scope == scope_empty)
+ {
+ if (indent > 0)
+ throw parse_error(
+ "first node of the document should not be indented.", offset());
+
+ push_scope(indent);
+ }
+ else if (indent > cur_scope)
+ {
+ push_scope(indent);
+ }
+ else if (indent < cur_scope)
+ {
+ // Current indent is less than the current scope level.
+ do
+ {
+ cur_scope = end_scope();
+ if (cur_scope < indent)
+ throw parse_error("parse: invalid indent level.", offset());
+ }
+ while (indent < cur_scope);
+ }
+
+ // Parse the rest of the line.
+ std::string_view line = parse_to_end_of_line();
+ line = trim(line);
+
+ assert(!line.empty());
+ parse_line(line.data(), line.size());
+ }
+
+ // End all remaining scopes.
+ size_t cur_scope = get_scope();
+ while (cur_scope != scope_empty)
+ cur_scope = end_scope();
+
+ if (get_doc_hash())
+ handler_end_document();
+
+ handler_end_parse();
+}
+
+template<typename _Handler>
+size_t yaml_parser<_Handler>::end_scope()
+{
+ switch (get_scope_type())
+ {
+ case yaml::detail::scope_t::map:
+ {
+ if (get_last_parse_token() == yaml::detail::parse_token_t::end_map_key)
+ handler_null();
+
+ handler_end_map();
+ break;
+ }
+ case yaml::detail::scope_t::sequence:
+ {
+ if (get_last_parse_token() == yaml::detail::parse_token_t::begin_sequence_element)
+ handler_null();
+
+ handler_end_sequence();
+ break;
+ }
+ case yaml::detail::scope_t::multi_line_string:
+ {
+ std::string_view merged = merge_line_buffer();
+ handler_string(merged.data(), merged.size());
+ break;
+ }
+ default:
+ {
+ if (has_line_buffer())
+ {
+ assert(get_line_buffer_count() == 1);
+ std::string_view line = pop_line_front();
+ parse_value(line.data(), line.size());
+ }
+ }
+ }
+ return pop_scope();
+}
+
+template<typename _Handler>
+void yaml_parser<_Handler>::check_or_begin_document()
+{
+ if (!get_doc_hash())
+ {
+ set_doc_hash(mp_char);
+ handler_begin_document();
+ }
+}
+
+template<typename _Handler>
+void yaml_parser<_Handler>::check_or_begin_map()
+{
+ switch (get_scope_type())
+ {
+ case yaml::detail::scope_t::unset:
+ {
+ check_or_begin_document();
+ set_scope_type(yaml::detail::scope_t::map);
+ handler_begin_map();
+ break;
+ }
+ case yaml::detail::scope_t::map:
+ {
+ if (get_last_parse_token() == yaml::detail::parse_token_t::end_map_key)
+ handler_null();
+ break;
+ }
+ default:
+ ;
+ }
+}
+
+template<typename _Handler>
+void yaml_parser<_Handler>::check_or_begin_sequence()
+{
+ switch (get_scope_type())
+ {
+ case yaml::detail::scope_t::unset:
+ {
+ check_or_begin_document();
+ set_scope_type(yaml::detail::scope_t::sequence);
+ handler_begin_sequence();
+ break;
+ }
+ case yaml::detail::scope_t::sequence:
+ {
+ if (get_last_parse_token() == yaml::detail::parse_token_t::begin_sequence_element)
+ handler_null();
+ break;
+ }
+ default:
+ ;
+ }
+
+ push_parse_token(yaml::detail::parse_token_t::begin_sequence_element);
+}
+
+template<typename _Handler>
+void yaml_parser<_Handler>::parse_value(const char* p, size_t len)
+{
+ check_or_begin_document();
+
+ const char* p0 = p;
+ const char* p_end = p + len;
+ double val;
+ p = parse_numeric(p, p_end, val);
+ if (p == p_end)
+ {
+ handler_number(val);
+ return;
+ }
+
+ yaml::detail::keyword_t kw = parse_keyword(p0, len);
+
+ if (kw != yaml::detail::keyword_t::unknown)
+ {
+ switch (kw)
+ {
+ case yaml::detail::keyword_t::null:
+ handler_null();
+ break;
+ case yaml::detail::keyword_t::boolean_true:
+ handler_boolean_true();
+ break;
+ case yaml::detail::keyword_t::boolean_false:
+ handler_boolean_false();
+ break;
+ default:
+ ;
+ }
+
+ return;
+ }
+
+ // Failed to parse it as a number or a keyword. It must be a string.
+ handler_string(p0, len);
+}
+
+template<typename _Handler>
+void yaml_parser<_Handler>::push_value(const char* p, size_t len)
+{
+ check_or_begin_document();
+
+ if (has_line_buffer() && get_scope_type() == yaml::detail::scope_t::unset)
+ set_scope_type(yaml::detail::scope_t::multi_line_string);
+
+ push_line_back(p, len);
+}
+
+template<typename _Handler>
+void yaml_parser<_Handler>::parse_line(const char* p, size_t len)
+{
+ const char* p_end = p + len;
+ const char* p0 = p; // Save the original head position.
+
+ if (*p == '-')
+ {
+ ++p;
+ if (p == p_end)
+ {
+ // List item start.
+ check_or_begin_sequence();
+ return;
+ }
+
+ switch (*p)
+ {
+ case '-':
+ {
+ // start of a document
+ ++p;
+ if (p == p_end)
+ throw parse_error("parse_line: line ended with '--'.", offset_last_char_of_line());
+
+ if (*p != '-')
+ parse_error::throw_with(
+ "parse_line: '-' expected but '", *p, "' found.",
+ offset_last_char_of_line() - std::ptrdiff_t(p_end-p));
+
+ ++p; // Skip the '-'.
+ set_doc_hash(p);
+ handler_begin_document();
+ clear_scopes();
+
+ if (p != p_end)
+ {
+ skip_blanks(p, p_end-p);
+
+ // Whatever comes after '---' is equivalent of first node.
+ assert(p != p_end);
+ push_scope(0);
+ parse_line(p, p_end-p);
+ }
+ return;
+ }
+ case ' ':
+ {
+ check_or_begin_sequence();
+
+ // list item start with inline first item content.
+ ++p;
+ if (p == p_end)
+ throw parse_error(
+ "parse_line: list item expected, but the line ended prematurely.",
+ offset_last_char_of_line() - std::ptrdiff_t(p_end-p));
+
+ skip_blanks(p, p_end-p);
+
+ size_t scope_width = get_scope() + (p-p0);
+ push_scope(scope_width);
+ parse_line(p, p_end-p);
+ return;
+ }
+ default:
+ // It is none of the above.
+ p = p0;
+ }
+
+ }
+
+ if (get_scope_type() == yaml::detail::scope_t::sequence)
+ parse_error::throw_with(
+ "'-' was expected for a sequence element, but '", *p, "' was found.",
+ offset_last_char_of_line()-len+1);
+
+ // If the line doesn't start with a "- ", it must be a dictionary key.
+ parse_map_key(p, len);
+}
+
+template<typename _Handler>
+void yaml_parser<_Handler>::parse_map_key(const char* p, size_t len)
+{
+ const char* p_end = p + len;
+ const char* p0 = p; // Save the original head position.
+
+ switch (*p)
+ {
+ case '"':
+ {
+ std::string_view quoted_str = parse_double_quoted_string_value(p, len);
+
+ if (p == p_end)
+ {
+ handler_string(quoted_str.data(), quoted_str.size());
+ return;
+ }
+
+ skip_blanks(p, p_end-p);
+
+ if (*p != ':')
+ throw parse_error(
+ "parse_map_key: ':' is expected after the quoted string key.",
+ offset() - std::ptrdiff_t(p_end-p+1));
+
+ check_or_begin_map();
+ handler_begin_map_key();
+ handler_string(quoted_str.data(), quoted_str.size());
+ handler_end_map_key();
+
+ ++p; // skip the ':'.
+ if (p == p_end)
+ return;
+
+ // Skip all white spaces.
+ skip_blanks(p, p_end-p);
+ }
+ break;
+ case '\'':
+ {
+ std::string_view quoted_str = parse_single_quoted_string_value(p, len);
+
+ if (p == p_end)
+ {
+ handler_string(quoted_str.data(), quoted_str.size());
+ return;
+ }
+
+ skip_blanks(p, p_end-p);
+
+ if (*p != ':')
+ throw parse_error(
+ "parse_map_key: ':' is expected after the quoted string key.",
+ offset() - std::ptrdiff_t(p_end-p+1));
+
+ check_or_begin_map();
+ handler_begin_map_key();
+ handler_string(quoted_str.data(), quoted_str.size());
+ handler_end_map_key();
+
+ ++p; // skip the ':'.
+ if (p == p_end)
+ return;
+
+ skip_blanks(p, p_end-p);
+ }
+ break;
+ default:
+ {
+ key_value kv = parse_key_value(p, p_end-p);
+
+ if (kv.key.empty())
+ {
+ // No map key found.
+ if (*p == '|')
+ {
+ start_literal_block();
+ return;
+ }
+
+ push_value(p, len);
+ return;
+ }
+
+ check_or_begin_map();
+ handler_begin_map_key();
+ parse_value(kv.key.data(), kv.key.size());
+ handler_end_map_key();
+
+ if (kv.value.empty())
+ return;
+
+ p = kv.value.data();
+ }
+ }
+
+ if (*p == '|')
+ {
+ start_literal_block();
+ return;
+ }
+
+ // inline map item.
+ if (*p == '-')
+ throw parse_error(
+ "parse_map_key: sequence entry is not allowed as an inline map item.",
+ offset() - std::ptrdiff_t(p_end-p+1));
+
+ size_t scope_width = get_scope() + (p-p0);
+ push_scope(scope_width);
+ parse_line(p, p_end-p);
+}
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/yaml_parser_base.hpp b/include/orcus/yaml_parser_base.hpp
new file mode 100644
index 0000000..13b4c91
--- /dev/null
+++ b/include/orcus/yaml_parser_base.hpp
@@ -0,0 +1,195 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_YAML_PARSER_BASE_HPP
+#define INCLUDED_ORCUS_YAML_PARSER_BASE_HPP
+
+#include "orcus/parser_base.hpp"
+
+#include <memory>
+#include <cassert>
+
+namespace orcus { namespace yaml {
+
+namespace detail {
+
+enum class scope_t
+{
+ unset,
+ sequence,
+ map,
+ multi_line_string
+};
+
+enum class keyword_t
+{
+ unknown,
+ boolean_true,
+ boolean_false,
+ null
+};
+
+enum class parse_token_t
+{
+ unknown,
+
+ // handler tokens (tokens associated with handler events)
+
+ begin_parse,
+ end_parse,
+ begin_document,
+ end_document,
+ begin_sequence,
+ end_sequence,
+ begin_map,
+ end_map,
+ begin_map_key,
+ end_map_key,
+ string,
+ number,
+ boolean_true,
+ boolean_false,
+ null,
+
+ // non-handler tokens
+
+ begin_sequence_element
+};
+
+}
+
+class ORCUS_PSR_DLLPUBLIC parser_base : public ::orcus::parser_base
+{
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+protected:
+
+ // The entire line is empty.
+ static const size_t parse_indent_blank_line;
+
+ // End of stream has reached while parsing in the indent part of a line.
+ static const size_t parse_indent_end_of_stream;
+
+ static const size_t scope_empty;
+
+ struct key_value
+ {
+ std::string_view key;
+ std::string_view value;
+ };
+
+ parser_base() = delete;
+ parser_base(const parser_base&) = delete;
+ parser_base& operator=(const parser_base&) = delete;
+
+ parser_base(std::string_view content);
+ ~parser_base();
+
+ void push_parse_token(detail::parse_token_t t);
+
+ detail::parse_token_t get_last_parse_token() const;
+
+ /**
+ * Get the offset position of the last character of the current line
+ * without comment or trailing whitespaces (if present). Call this only
+ * after the current line has been parsed to the end, that is, only after
+ * parse_to_end_of_line() has been called.
+ *
+ * @return offset position of the last character of the current line.
+ */
+ size_t offset_last_char_of_line() const;
+
+ /**
+ * Parse the prefix indent part of a line.
+ *
+ * @return number of whitespace characters encountered.
+ */
+ size_t parse_indent();
+
+ /**
+ * Once a non-whitespace character is reached, parse until the end of the
+ * line.
+ */
+ std::string_view parse_to_end_of_line();
+
+ /**
+ * Upon encountering a '#', skip until either the line-feed or the
+ * end-of-stream is reached.
+ */
+ void skip_comment();
+
+ void reset_on_new_line();
+
+ size_t get_scope() const;
+
+ void push_scope(size_t scope_width);
+
+ void clear_scopes();
+
+ detail::scope_t get_scope_type() const;
+
+ void set_scope_type(detail::scope_t type);
+
+ /**
+ * Pop the current scope and return the new scope width after the pop.
+ *
+ * @return new scope width after the pop.
+ */
+ size_t pop_scope();
+
+ void push_line_back(const char* p, size_t n);
+
+ std::string_view pop_line_front();
+
+ bool has_line_buffer() const;
+
+ size_t get_line_buffer_count() const;
+
+ std::string_view merge_line_buffer();
+
+ /**
+ * Get the hash value of current document, or nullptr if a document has
+ * not started.
+ *
+ * @return hash value of current document.
+ */
+ const char* get_doc_hash() const;
+
+ /**
+ * Set the hash value representing the current document. For now the
+ * memory address of the first character of the document is used as its
+ * hash value.
+ *
+ * @param hash hash value of a document.
+ */
+ void set_doc_hash(const char* hash);
+
+ detail::keyword_t parse_keyword(const char* p, size_t len);
+
+ key_value parse_key_value(const char* p, size_t len);
+
+ std::string_view parse_single_quoted_string_value(const char*& p, size_t max_length);
+
+ std::string_view parse_double_quoted_string_value(const char*& p, size_t max_length);
+
+ void skip_blanks(const char*& p, size_t len);
+
+ void start_literal_block();
+
+ bool in_literal_block() const;
+
+ void handle_line_in_literal(size_t indent);
+
+ void handle_line_in_multi_line_string();
+};
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/zip_archive.hpp b/include/orcus/zip_archive.hpp
new file mode 100644
index 0000000..afc6727
--- /dev/null
+++ b/include/orcus/zip_archive.hpp
@@ -0,0 +1,126 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_ZIP_ARCHIVE_HPP
+#define INCLUDED_ORCUS_ZIP_ARCHIVE_HPP
+
+#include "env.hpp"
+#include "exception.hpp"
+
+#include <string_view>
+#include <vector>
+#include <memory>
+#include <ostream>
+
+namespace orcus {
+
+/**
+ * Structure containing file entry header attributes.
+ */
+struct ORCUS_PSR_DLLPUBLIC zip_file_entry_header
+{
+ uint32_t header_signature = 0;
+ uint16_t required_version = 0;
+ uint16_t flag = 0;
+ uint16_t compression_method = 0;
+ uint16_t last_modified_time = 0;
+ uint16_t last_modified_date = 0;
+ uint32_t crc32 = 0;
+ uint32_t compressed_size = 0;
+ uint32_t uncompressed_size = 0;
+
+ std::string filename;
+ std::vector<uint8_t> extra_field;
+
+ zip_file_entry_header();
+ zip_file_entry_header(const zip_file_entry_header& other);
+ zip_file_entry_header(zip_file_entry_header&& other);
+ ~zip_file_entry_header();
+
+ zip_file_entry_header& operator=(const zip_file_entry_header& other);
+ zip_file_entry_header& operator=(zip_file_entry_header&& other);
+};
+
+ORCUS_PSR_DLLPUBLIC std::ostream& operator<<(std::ostream& os, const zip_file_entry_header& header);
+
+class zip_archive_stream;
+
+class ORCUS_PSR_DLLPUBLIC zip_archive
+{
+ class impl;
+
+ std::unique_ptr<impl> mp_impl;
+
+public:
+ zip_archive() = delete;
+ zip_archive(const zip_archive&) = delete;
+ zip_archive& operator= (const zip_archive) = delete;
+
+ zip_archive(zip_archive_stream* stream);
+ ~zip_archive();
+
+ /**
+ * Loading involves the parsing of the central directory of a zip archive
+ * (located toward the end of the stream) and building of file entry data
+ * which are stored in the central directory.
+ */
+ void load();
+
+ /**
+ * Retrieve the header information for a file entry specified by index.
+ *
+ * @param index file entry index.
+ *
+ * @return header information for a file entry.
+ */
+ zip_file_entry_header get_file_entry_header(std::size_t index) const;
+
+ /**
+ * Retrieve the header information for a file entry specified by name.
+ *
+ * @param name file entry name.
+ *
+ * @return header information for a file entry.
+ */
+ zip_file_entry_header get_file_entry_header(std::string_view name) const;
+
+ /**
+ * Get file entry name from its index.
+ *
+ * @param index file entry index
+ *
+ * @return file entry name
+ */
+ std::string_view get_file_entry_name(std::size_t index) const;
+
+ /**
+ * Return the number of file entries stored in this zip archive. Note
+ * that a file entry may be a directory, so the number of files stored in
+ * the zip archive may not equal the number of file entries.
+ *
+ * @return number of file entries.
+ */
+ size_t get_file_entry_count() const;
+
+ /**
+ * Retrieve data stream of specified file entry. The retrieved data stream
+ * gets uncompressed if the original stream is compressed.
+ *
+ * @param entry_name file entry name.
+ *
+ * @return buffer containing the data stream for specified entry.
+ *
+ * @exception zip_error thrown when any problem is encountered during data
+ * stream retrieval.
+ */
+ std::vector<unsigned char> read_file_entry(std::string_view entry_name) const;
+};
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/orcus/zip_archive_stream.hpp b/include/orcus/zip_archive_stream.hpp
new file mode 100644
index 0000000..7a6bb02
--- /dev/null
+++ b/include/orcus/zip_archive_stream.hpp
@@ -0,0 +1,71 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef __ORCUS_ZIP_ARCHIVE_STREAM_HPP__
+#define __ORCUS_ZIP_ARCHIVE_STREAM_HPP__
+
+#include "env.hpp"
+#include <cstdlib>
+#include <cstdio>
+#include <cstdint>
+
+namespace orcus {
+
+class ORCUS_PSR_DLLPUBLIC zip_archive_stream
+{
+public:
+ virtual ~zip_archive_stream();
+
+ virtual size_t size() const = 0;
+ virtual size_t tell() const = 0;
+ virtual void seek(size_t pos) = 0;
+ virtual void read(unsigned char* buffer, size_t length) const = 0;
+};
+
+/**
+ * Zip archive based on file descriptor. The caller needs to provide the
+ * file path to the zip archive.
+ */
+class ORCUS_PSR_DLLPUBLIC zip_archive_stream_fd : public zip_archive_stream
+{
+ FILE* m_stream;
+
+public:
+ zip_archive_stream_fd() = delete;
+ zip_archive_stream_fd(const char* filepath);
+ virtual ~zip_archive_stream_fd();
+
+ virtual size_t size() const;
+ virtual size_t tell() const;
+ virtual void seek(size_t pos);
+ virtual void read(unsigned char* buffer, size_t length) const;
+};
+
+/**
+ * Zip archive whose content is already loaded onto memory.
+ */
+class ORCUS_PSR_DLLPUBLIC zip_archive_stream_blob : public zip_archive_stream
+{
+ const uint8_t* m_blob;
+ const uint8_t* m_cur;
+ std::size_t m_size;
+
+public:
+ zip_archive_stream_blob() = delete;
+ zip_archive_stream_blob(const uint8_t* blob, std::size_t size);
+ virtual ~zip_archive_stream_blob();
+
+ virtual size_t size() const;
+ virtual size_t tell() const;
+ virtual void seek(size_t pos);
+ virtual void read(unsigned char* buffer, size_t length) const;
+};
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/install-sh b/install-sh
new file mode 100755
index 0000000..ec298b5
--- /dev/null
+++ b/install-sh
@@ -0,0 +1,541 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2020-11-14.01; # 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.
+
+tab=' '
+nl='
+'
+IFS=" $tab$nl"
+
+# Set DOITPROG to "echo" to test this script.
+
+doit=${DOITPROG-}
+doit_exec=${doit:-exec}
+
+# 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_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+# Create dirs (including intermediate dirs) using mode 755.
+# This is like GNU 'install' as of coreutils 8.32 (2020).
+mkdir_umask=22
+
+backupsuffix=
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+is_target_a_directory=possibly
+
+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 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.
+ -p pass -p to $cpprog.
+ -s $stripprog installed files.
+ -S SUFFIX attempt to back up existing files, with suffix SUFFIX.
+ -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
+
+By default, rm is invoked with -f; when overridden with RMPROG,
+it's up to you to specify -f if you want it.
+
+If -S is not specified, no backups are attempted.
+
+Email bug reports to bug-automake@gnu.org.
+Automake home page: https://www.gnu.org/software/automake/
+"
+
+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
+ *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
+ echo "$0: invalid mode: $mode" >&2
+ exit 1;;
+ esac
+ shift;;
+
+ -o) chowncmd="$chownprog $2"
+ shift;;
+
+ -p) cpprog="$cpprog -p";;
+
+ -s) stripcmd=$stripprog;;
+
+ -S) backupsuffix="$2"
+ shift;;
+
+ -t)
+ is_target_a_directory=always
+ dst_arg=$2
+ # Protect names problematic for 'test' and other utilities.
+ case $dst_arg in
+ -* | [=\(\)!]) dst_arg=./$dst_arg;;
+ esac
+ shift;;
+
+ -T) is_target_a_directory=never;;
+
+ --version) echo "$0 $scriptversion"; exit $?;;
+
+ --) shift
+ break;;
+
+ -*) echo "$0: invalid option: $1" >&2
+ exit 1;;
+
+ *) break;;
+ esac
+ shift
+done
+
+# We allow the use of options -d and -T together, by making -d
+# take the precedence; this is for compatibility with GNU install.
+
+if test -n "$dir_arg"; then
+ if test -n "$dst_arg"; then
+ echo "$0: target directory not allowed when installing a directory." >&2
+ exit 1
+ fi
+fi
+
+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
+ if test $# -gt 1 || test "$is_target_a_directory" = always; then
+ if test ! -d "$dst_arg"; then
+ echo "$0: $dst_arg: Is not a directory." >&2
+ exit 1
+ fi
+ fi
+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=$?
+ # Don't chown directories that already exist.
+ if test $dstdir_status = 0; then
+ chowncmd=""
+ fi
+ 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.
+ if test -d "$dst"; then
+ if test "$is_target_a_directory" = never; then
+ echo "$0: $dst_arg: Is a directory" >&2
+ exit 1
+ fi
+ dstdir=$dst
+ dstbase=`basename "$src"`
+ case $dst in
+ */) dst=$dst$dstbase;;
+ *) dst=$dst/$dstbase;;
+ esac
+ dstdir_status=0
+ else
+ dstdir=`dirname "$dst"`
+ test -d "$dstdir"
+ dstdir_status=$?
+ fi
+ fi
+
+ case $dstdir in
+ */) dstdirslash=$dstdir;;
+ *) dstdirslash=$dstdir/;;
+ esac
+
+ obsolete_mkdir_used=false
+
+ if test $dstdir_status != 0; then
+ case $posix_mkdir in
+ '')
+ # 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
+ # The $RANDOM variable is not portable (e.g., dash). Use it
+ # here however when possible just to lower collision chance.
+ tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+
+ trap '
+ ret=$?
+ rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null
+ exit $ret
+ ' 0
+
+ # Because "mkdir -p" follows existing symlinks and we likely work
+ # directly in world-writeable /tmp, make sure that the '$tmpdir'
+ # directory is successfully created first before we actually test
+ # 'mkdir -p'.
+ if (umask $mkdir_umask &&
+ $mkdirprog $mkdir_mode "$tmpdir" &&
+ exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/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-writable bit of parent directory when it shouldn't.
+ # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+ test_tmpdir="$tmpdir/a"
+ ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
+ case $ls_ld_tmpdir in
+ d????-?r-*) different_mode=700;;
+ d????-?--*) different_mode=755;;
+ *) false;;
+ esac &&
+ $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
+ ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
+ test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+ }
+ }
+ then posix_mkdir=:
+ fi
+ rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
+ else
+ # Remove any dirs left behind by ancient mkdir implementations.
+ rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
+ fi
+ trap '' 0;;
+ esac
+
+ if
+ $posix_mkdir && (
+ umask $mkdir_umask &&
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+ )
+ then :
+ else
+
+ # 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
+
+ oIFS=$IFS
+ IFS=/
+ set -f
+ set fnord $dstdir
+ shift
+ 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=${dstdirslash}_inst.$$_
+ rmtmp=${dstdirslash}_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 &&
+ { test -z "$stripcmd" || {
+ # Create $dsttmp read-write so that cp doesn't create it read-only,
+ # which would cause strip to fail.
+ if test -z "$doit"; then
+ : >"$dsttmp" # No need to fork-exec 'touch'.
+ else
+ $doit touch "$dsttmp"
+ fi
+ }
+ } &&
+ $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` &&
+ set -f &&
+ set X $old && old=:$2:$4:$5:$6 &&
+ set X $new && new=:$2:$4:$5:$6 &&
+ set +f &&
+ test "$old" = "$new" &&
+ $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+ then
+ rm -f "$dsttmp"
+ else
+ # If $backupsuffix is set, and the file being installed
+ # already exists, attempt a backup. Don't worry if it fails,
+ # e.g., if mv doesn't support -f.
+ if test -n "$backupsuffix" && test -f "$dst"; then
+ $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null
+ fi
+
+ # 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 "$dst" 2>/dev/null ||
+ { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+ { $doit $rmcmd "$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 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/liborcus-spreadsheet-model.pc.in b/liborcus-spreadsheet-model.pc.in
new file mode 100644
index 0000000..fa4a478
--- /dev/null
+++ b/liborcus-spreadsheet-model.pc.in
@@ -0,0 +1,12 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: liborcus-spreadsheet-model-@ORCUS_API_VERSION@
+Description: Standalone file import filter library for spreadsheet documents.
+Currently under development are ODS, XLSX and CSV import filters.
+Version: @VERSION@
+Libs: -L${libdir} -lorcus-spreadsheet-model-@ORCUS_API_VERSION@ @LIBIXION_LIBS@
+Cflags: -I${includedir}/liborcus-spreadsheet-model-@ORCUS_API_VERSION@ @LIBIXION_CFLAGS@
+
diff --git a/liborcus.pc.in b/liborcus.pc.in
new file mode 100644
index 0000000..04a14e1
--- /dev/null
+++ b/liborcus.pc.in
@@ -0,0 +1,12 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: liborcus-@ORCUS_API_VERSION@
+Description: Standalone file import filter library for spreadsheet documents.
+Currently under development are ODS, XLSX and CSV import filters.
+Version: @VERSION@
+Libs: -L${libdir} -lorcus-@ORCUS_API_VERSION@ -lorcus-parser-@ORCUS_API_VERSION@
+Cflags: -I${includedir}/liborcus-@ORCUS_API_VERSION@
+
diff --git a/ltmain.sh b/ltmain.sh
new file mode 100755
index 0000000..540a92a
--- /dev/null
+++ b/ltmain.sh
@@ -0,0 +1,11251 @@
+#! /bin/sh
+## DO NOT EDIT - This file generated from ./build-aux/ltmain.in
+## by inline-source v2014-01-03.01
+
+# libtool (GNU libtool) 2.4.6
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+
+# Copyright (C) 1996-2015 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+PROGRAM=libtool
+PACKAGE=libtool
+VERSION="2.4.6 Debian-2.4.6-15build2"
+package_revision=2.4.6
+
+
+## ------ ##
+## Usage. ##
+## ------ ##
+
+# Run './libtool --help' for help with using this script from the
+# command line.
+
+
+## ------------------------------- ##
+## User overridable command paths. ##
+## ------------------------------- ##
+
+# After configure completes, it has a better idea of some of the
+# shell tools we need than the defaults used by the functions shared
+# with bootstrap, so set those here where they can still be over-
+# ridden by the user, but otherwise take precedence.
+
+: ${AUTOCONF="autoconf"}
+: ${AUTOMAKE="automake"}
+
+
+## -------------------------- ##
+## Source external libraries. ##
+## -------------------------- ##
+
+# Much of our low-level functionality needs to be sourced from external
+# libraries, which are installed to $pkgauxdir.
+
+# Set a version string for this script.
+scriptversion=2015-01-20.17; # UTC
+
+# General shell script boiler plate, and helper functions.
+# Written by Gary V. Vaughan, 2004
+
+# Copyright (C) 2004-2015 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.
+
+# 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.
+
+# 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.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNES FOR A PARTICULAR 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/>.
+
+# Please report bugs or propose patches to gary@gnu.org.
+
+
+## ------ ##
+## Usage. ##
+## ------ ##
+
+# Evaluate this file near the top of your script to gain access to
+# the functions and variables defined here:
+#
+# . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh
+#
+# If you need to override any of the default environment variable
+# settings, do that before evaluating this file.
+
+
+## -------------------- ##
+## Shell normalisation. ##
+## -------------------- ##
+
+# Some shells need a little help to be as Bourne compatible as possible.
+# Before doing anything else, make sure all that help has been provided!
+
+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
+
+# NLS nuisances: We save the old values in case they are required later.
+_G_user_locale=
+_G_safe_locale=
+for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+do
+ eval "if test set = \"\${$_G_var+set}\"; then
+ save_$_G_var=\$$_G_var
+ $_G_var=C
+ export $_G_var
+ _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\"
+ _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\"
+ fi"
+done
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# Make sure IFS has a sensible default
+sp=' '
+nl='
+'
+IFS="$sp $nl"
+
+# There are apparently some retarded systems that use ';' as a PATH separator!
+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
+
+
+
+## ------------------------- ##
+## Locate command utilities. ##
+## ------------------------- ##
+
+
+# func_executable_p FILE
+# ----------------------
+# Check that FILE is an executable regular file.
+func_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+}
+
+
+# func_path_progs PROGS_LIST CHECK_FUNC [PATH]
+# --------------------------------------------
+# Search for either a program that responds to --version with output
+# containing "GNU", or else returned by CHECK_FUNC otherwise, by
+# trying all the directories in PATH with each of the elements of
+# PROGS_LIST.
+#
+# CHECK_FUNC should accept the path to a candidate program, and
+# set $func_check_prog_result if it truncates its output less than
+# $_G_path_prog_max characters.
+func_path_progs ()
+{
+ _G_progs_list=$1
+ _G_check_func=$2
+ _G_PATH=${3-"$PATH"}
+
+ _G_path_prog_max=0
+ _G_path_prog_found=false
+ _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:}
+ for _G_dir in $_G_PATH; do
+ IFS=$_G_save_IFS
+ test -z "$_G_dir" && _G_dir=.
+ for _G_prog_name in $_G_progs_list; do
+ for _exeext in '' .EXE; do
+ _G_path_prog=$_G_dir/$_G_prog_name$_exeext
+ func_executable_p "$_G_path_prog" || continue
+ case `"$_G_path_prog" --version 2>&1` in
+ *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;;
+ *) $_G_check_func $_G_path_prog
+ func_path_progs_result=$func_check_prog_result
+ ;;
+ esac
+ $_G_path_prog_found && break 3
+ done
+ done
+ done
+ IFS=$_G_save_IFS
+ test -z "$func_path_progs_result" && {
+ echo "no acceptable sed could be found in \$PATH" >&2
+ exit 1
+ }
+}
+
+
+# We want to be able to use the functions in this file before configure
+# has figured out where the best binaries are kept, which means we have
+# to search for them ourselves - except when the results are already set
+# where we skip the searches.
+
+# Unless the user overrides by setting SED, search the path for either GNU
+# sed, or the sed that truncates its output the least.
+test -z "$SED" && {
+ _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+ for _G_i in 1 2 3 4 5 6 7; do
+ _G_sed_script=$_G_sed_script$nl$_G_sed_script
+ done
+ echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed
+ _G_sed_script=
+
+ func_check_prog_sed ()
+ {
+ _G_path_prog=$1
+
+ _G_count=0
+ printf 0123456789 >conftest.in
+ while :
+ do
+ cat conftest.in conftest.in >conftest.tmp
+ mv conftest.tmp conftest.in
+ cp conftest.in conftest.nl
+ echo '' >> conftest.nl
+ "$_G_path_prog" -f conftest.sed <conftest.nl >conftest.out 2>/dev/null || break
+ diff conftest.out conftest.nl >/dev/null 2>&1 || break
+ _G_count=`expr $_G_count + 1`
+ if test "$_G_count" -gt "$_G_path_prog_max"; then
+ # Best one so far, save it but keep looking for a better one
+ func_check_prog_result=$_G_path_prog
+ _G_path_prog_max=$_G_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test 10 -lt "$_G_count" && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out
+ }
+
+ func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin
+ rm -f conftest.sed
+ SED=$func_path_progs_result
+}
+
+
+# Unless the user overrides by setting GREP, search the path for either GNU
+# grep, or the grep that truncates its output the least.
+test -z "$GREP" && {
+ func_check_prog_grep ()
+ {
+ _G_path_prog=$1
+
+ _G_count=0
+ _G_path_prog_max=0
+ printf 0123456789 >conftest.in
+ while :
+ do
+ cat conftest.in conftest.in >conftest.tmp
+ mv conftest.tmp conftest.in
+ cp conftest.in conftest.nl
+ echo 'GREP' >> conftest.nl
+ "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' <conftest.nl >conftest.out 2>/dev/null || break
+ diff conftest.out conftest.nl >/dev/null 2>&1 || break
+ _G_count=`expr $_G_count + 1`
+ if test "$_G_count" -gt "$_G_path_prog_max"; then
+ # Best one so far, save it but keep looking for a better one
+ func_check_prog_result=$_G_path_prog
+ _G_path_prog_max=$_G_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test 10 -lt "$_G_count" && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out
+ }
+
+ func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin
+ GREP=$func_path_progs_result
+}
+
+
+## ------------------------------- ##
+## User overridable command paths. ##
+## ------------------------------- ##
+
+# All uppercase variable names are used for environment variables. These
+# variables can be overridden by the user before calling a script that
+# uses them if a suitable command of that name is not already available
+# in the command search PATH.
+
+: ${CP="cp -f"}
+: ${ECHO="printf %s\n"}
+: ${EGREP="$GREP -E"}
+: ${FGREP="$GREP -F"}
+: ${LN_S="ln -s"}
+: ${MAKE="make"}
+: ${MKDIR="mkdir"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+: ${SHELL="${CONFIG_SHELL-/bin/sh}"}
+
+
+## -------------------- ##
+## Useful sed snippets. ##
+## -------------------- ##
+
+sed_dirname='s|/[^/]*$||'
+sed_basename='s|^.*/||'
+
+# Sed substitution that helps us do robust quoting. It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='s|\([`"$\\]\)|\\\1|g'
+
+# Same as above, but do not quote variable references.
+sed_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
+# that contains forward slashes, into one that contains
+# (escaped) backslashes. A very naive implementation.
+sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+
+# Re-'\' parameter expansions in output of sed_double_quote_subst that
+# were '\'-ed in input to the same. If an odd number of '\' preceded a
+# '$' in input to sed_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 '$'.
+_G_bs='\\'
+_G_bs2='\\\\'
+_G_bs4='\\\\\\\\'
+_G_dollar='\$'
+sed_double_backslash="\
+ s/$_G_bs4/&\\
+/g
+ s/^$_G_bs2$_G_dollar/$_G_bs&/
+ s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g
+ s/\n//g"
+
+
+## ----------------- ##
+## Global variables. ##
+## ----------------- ##
+
+# Except for the global variables explicitly listed below, the following
+# functions in the '^func_' namespace, and the '^require_' namespace
+# variables initialised in the 'Resource management' section, sourcing
+# this file will not pollute your global namespace with anything
+# else. There's no portable way to scope variables in Bourne shell
+# though, so actually running these functions will sometimes place
+# results into a variable named after the function, and often use
+# temporary variables in the '^_G_' namespace. If you are careful to
+# avoid using those namespaces casually in your sourcing script, things
+# should continue to work as you expect. And, of course, you can freely
+# overwrite any of the functions or variables defined here before
+# calling anything to customize them.
+
+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.
+
+# Allow overriding, eg assuming that you follow the convention of
+# putting '$debug_cmd' at the start of all your functions, you can get
+# bash to show function call trace with:
+#
+# debug_cmd='echo "${FUNCNAME[0]} $*" >&2' bash your-script-name
+debug_cmd=${debug_cmd-":"}
+exit_cmd=:
+
+# By convention, finish your script with:
+#
+# exit $exit_status
+#
+# so that you can set exit_status to non-zero if you want to indicate
+# something went wrong during execution without actually bailing out at
+# the point of failure.
+exit_status=$EXIT_SUCCESS
+
+# 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
+
+# The name of this program.
+progname=`$ECHO "$progpath" |$SED "$sed_basename"`
+
+# Make sure we have an absolute progpath for reexecution:
+case $progpath in
+ [\\/]*|[A-Za-z]:\\*) ;;
+ *[\\/]*)
+ progdir=`$ECHO "$progpath" |$SED "$sed_dirname"`
+ progdir=`cd "$progdir" && pwd`
+ progpath=$progdir/$progname
+ ;;
+ *)
+ _G_IFS=$IFS
+ IFS=${PATH_SEPARATOR-:}
+ for progdir in $PATH; do
+ IFS=$_G_IFS
+ test -x "$progdir/$progname" && break
+ done
+ IFS=$_G_IFS
+ test -n "$progdir" || progdir=`pwd`
+ progpath=$progdir/$progname
+ ;;
+esac
+
+
+## ----------------- ##
+## Standard options. ##
+## ----------------- ##
+
+# The following options affect the operation of the functions defined
+# below, and should be set appropriately depending on run-time para-
+# meters passed on the command line.
+
+opt_dry_run=false
+opt_quiet=false
+opt_verbose=false
+
+# Categories 'all' and 'none' are always available. Append any others
+# you will pass as the first argument to func_warning from your own
+# code.
+warning_categories=
+
+# By default, display warnings according to 'opt_warning_types'. Set
+# 'warning_func' to ':' to elide all warnings, or func_fatal_error to
+# treat the next displayed warning as a fatal error.
+warning_func=func_warn_and_continue
+
+# Set to 'all' to display all warnings, 'none' to suppress all
+# warnings, or a space delimited list of some subset of
+# 'warning_categories' to display only the listed warnings.
+opt_warning_types=all
+
+
+## -------------------- ##
+## Resource management. ##
+## -------------------- ##
+
+# This section contains definitions for functions that each ensure a
+# particular resource (a file, or a non-empty configuration variable for
+# example) is available, and if appropriate to extract default values
+# from pertinent package files. Call them using their associated
+# 'require_*' variable to ensure that they are executed, at most, once.
+#
+# It's entirely deliberate that calling these functions can set
+# variables that don't obey the namespace limitations obeyed by the rest
+# of this file, in order that that they be as useful as possible to
+# callers.
+
+
+# require_term_colors
+# -------------------
+# Allow display of bold text on terminals that support it.
+require_term_colors=func_require_term_colors
+func_require_term_colors ()
+{
+ $debug_cmd
+
+ test -t 1 && {
+ # COLORTERM and USE_ANSI_COLORS environment variables take
+ # precedence, because most terminfo databases neglect to describe
+ # whether color sequences are supported.
+ test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"}
+
+ if test 1 = "$USE_ANSI_COLORS"; then
+ # Standard ANSI escape sequences
+ tc_reset=''
+ tc_bold=''; tc_standout=''
+ tc_red=''; tc_green=''
+ tc_blue=''; tc_cyan=''
+ else
+ # Otherwise trust the terminfo database after all.
+ test -n "`tput sgr0 2>/dev/null`" && {
+ tc_reset=`tput sgr0`
+ test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold`
+ tc_standout=$tc_bold
+ test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso`
+ test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1`
+ test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2`
+ test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4`
+ test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5`
+ }
+ fi
+ }
+
+ require_term_colors=:
+}
+
+
+## ----------------- ##
+## Function library. ##
+## ----------------- ##
+
+# This section contains a variety of useful functions to call in your
+# scripts. Take note of the portable wrappers for features provided by
+# some modern shells, which will fall back to slower equivalents on
+# less featureful shells.
+
+
+# func_append VAR VALUE
+# ---------------------
+# Append VALUE onto the existing contents of VAR.
+
+ # We should try to minimise forks, especially on Windows where they are
+ # unreasonably slow, so skip the feature probes when bash or zsh are
+ # being used:
+ if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then
+ : ${_G_HAVE_ARITH_OP="yes"}
+ : ${_G_HAVE_XSI_OPS="yes"}
+ # The += operator was introduced in bash 3.1
+ case $BASH_VERSION in
+ [12].* | 3.0 | 3.0*) ;;
+ *)
+ : ${_G_HAVE_PLUSEQ_OP="yes"}
+ ;;
+ esac
+ fi
+
+ # _G_HAVE_PLUSEQ_OP
+ # Can be empty, in which case the shell is probed, "yes" if += is
+ # useable or anything else if it does not work.
+ test -z "$_G_HAVE_PLUSEQ_OP" \
+ && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \
+ && _G_HAVE_PLUSEQ_OP=yes
+
+if test yes = "$_G_HAVE_PLUSEQ_OP"
+then
+ # This is an XSI compatible shell, allowing a faster implementation...
+ eval 'func_append ()
+ {
+ $debug_cmd
+
+ eval "$1+=\$2"
+ }'
+else
+ # ...otherwise fall back to using expr, which is often a shell builtin.
+ func_append ()
+ {
+ $debug_cmd
+
+ eval "$1=\$$1\$2"
+ }
+fi
+
+
+# func_append_quoted VAR VALUE
+# ----------------------------
+# Quote VALUE and append to the end of shell variable VAR, separated
+# by a space.
+if test yes = "$_G_HAVE_PLUSEQ_OP"; then
+ eval 'func_append_quoted ()
+ {
+ $debug_cmd
+
+ func_quote_for_eval "$2"
+ eval "$1+=\\ \$func_quote_for_eval_result"
+ }'
+else
+ func_append_quoted ()
+ {
+ $debug_cmd
+
+ func_quote_for_eval "$2"
+ eval "$1=\$$1\\ \$func_quote_for_eval_result"
+ }
+fi
+
+
+# func_append_uniq VAR VALUE
+# --------------------------
+# Append unique VALUE onto the existing contents of VAR, assuming
+# entries are delimited by the first character of VALUE. For example:
+#
+# func_append_uniq options " --another-option option-argument"
+#
+# will only append to $options if " --another-option option-argument "
+# is not already present somewhere in $options already (note spaces at
+# each end implied by leading space in second argument).
+func_append_uniq ()
+{
+ $debug_cmd
+
+ eval _G_current_value='`$ECHO $'$1'`'
+ _G_delim=`expr "$2" : '\(.\)'`
+
+ case $_G_delim$_G_current_value$_G_delim in
+ *"$2$_G_delim"*) ;;
+ *) func_append "$@" ;;
+ esac
+}
+
+
+# func_arith TERM...
+# ------------------
+# Set func_arith_result to the result of evaluating TERMs.
+ test -z "$_G_HAVE_ARITH_OP" \
+ && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \
+ && _G_HAVE_ARITH_OP=yes
+
+if test yes = "$_G_HAVE_ARITH_OP"; then
+ eval 'func_arith ()
+ {
+ $debug_cmd
+
+ func_arith_result=$(( $* ))
+ }'
+else
+ func_arith ()
+ {
+ $debug_cmd
+
+ func_arith_result=`expr "$@"`
+ }
+fi
+
+
+# func_basename FILE
+# ------------------
+# Set func_basename_result to FILE with everything up to and including
+# the last / stripped.
+if test yes = "$_G_HAVE_XSI_OPS"; then
+ # If this shell supports suffix pattern removal, then use it to avoid
+ # forking. Hide the definitions single quotes in case the shell chokes
+ # on unsupported syntax...
+ _b='func_basename_result=${1##*/}'
+ _d='case $1 in
+ */*) func_dirname_result=${1%/*}$2 ;;
+ * ) func_dirname_result=$3 ;;
+ esac'
+
+else
+ # ...otherwise fall back to using sed.
+ _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`'
+ _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"`
+ if test "X$func_dirname_result" = "X$1"; then
+ func_dirname_result=$3
+ else
+ func_append func_dirname_result "$2"
+ fi'
+fi
+
+eval 'func_basename ()
+{
+ $debug_cmd
+
+ '"$_b"'
+}'
+
+
+# func_dirname FILE APPEND NONDIR_REPLACEMENT
+# -------------------------------------------
+# Compute the dirname of FILE. If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+eval 'func_dirname ()
+{
+ $debug_cmd
+
+ '"$_d"'
+}'
+
+
+# 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"
+# For efficiency, we do not delegate to the functions above but instead
+# duplicate the functionality here.
+eval 'func_dirname_and_basename ()
+{
+ $debug_cmd
+
+ '"$_b"'
+ '"$_d"'
+}'
+
+
+# func_echo ARG...
+# ----------------
+# Echo program name prefixed message.
+func_echo ()
+{
+ $debug_cmd
+
+ _G_message=$*
+
+ func_echo_IFS=$IFS
+ IFS=$nl
+ for _G_line in $_G_message; do
+ IFS=$func_echo_IFS
+ $ECHO "$progname: $_G_line"
+ done
+ IFS=$func_echo_IFS
+}
+
+
+# func_echo_all ARG...
+# --------------------
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+ $ECHO "$*"
+}
+
+
+# func_echo_infix_1 INFIX ARG...
+# ------------------------------
+# Echo program name, followed by INFIX on the first line, with any
+# additional lines not showing INFIX.
+func_echo_infix_1 ()
+{
+ $debug_cmd
+
+ $require_term_colors
+
+ _G_infix=$1; shift
+ _G_indent=$_G_infix
+ _G_prefix="$progname: $_G_infix: "
+ _G_message=$*
+
+ # Strip color escape sequences before counting printable length
+ for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan"
+ do
+ test -n "$_G_tc" && {
+ _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"`
+ _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"`
+ }
+ done
+ _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes
+
+ func_echo_infix_1_IFS=$IFS
+ IFS=$nl
+ for _G_line in $_G_message; do
+ IFS=$func_echo_infix_1_IFS
+ $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2
+ _G_prefix=$_G_indent
+ done
+ IFS=$func_echo_infix_1_IFS
+}
+
+
+# func_error ARG...
+# -----------------
+# Echo program name prefixed message to standard error.
+func_error ()
+{
+ $debug_cmd
+
+ $require_term_colors
+
+ func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2
+}
+
+
+# func_fatal_error ARG...
+# -----------------------
+# Echo program name prefixed message to standard error, and exit.
+func_fatal_error ()
+{
+ $debug_cmd
+
+ func_error "$*"
+ exit $EXIT_FAILURE
+}
+
+
+# func_grep EXPRESSION FILENAME
+# -----------------------------
+# Check whether EXPRESSION matches any line of FILENAME, without output.
+func_grep ()
+{
+ $debug_cmd
+
+ $GREP "$1" "$2" >/dev/null 2>&1
+}
+
+
+# func_len STRING
+# ---------------
+# Set func_len_result to the length of STRING. STRING may not
+# start with a hyphen.
+ test -z "$_G_HAVE_XSI_OPS" \
+ && (eval 'x=a/b/c;
+ test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \
+ && _G_HAVE_XSI_OPS=yes
+
+if test yes = "$_G_HAVE_XSI_OPS"; then
+ eval 'func_len ()
+ {
+ $debug_cmd
+
+ func_len_result=${#1}
+ }'
+else
+ func_len ()
+ {
+ $debug_cmd
+
+ func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len`
+ }
+fi
+
+
+# func_mkdir_p DIRECTORY-PATH
+# ---------------------------
+# Make sure the entire path to DIRECTORY-PATH is available.
+func_mkdir_p ()
+{
+ $debug_cmd
+
+ _G_directory_path=$1
+ _G_dir_list=
+
+ if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then
+
+ # Protect directory names starting with '-'
+ case $_G_directory_path in
+ -*) _G_directory_path=./$_G_directory_path ;;
+ esac
+
+ # While some portion of DIR does not yet exist...
+ while test ! -d "$_G_directory_path"; do
+ # ...make a list in topmost first order. Use a colon delimited
+ # list incase some portion of path contains whitespace.
+ _G_dir_list=$_G_directory_path:$_G_dir_list
+
+ # If the last portion added has no slash in it, the list is done
+ case $_G_directory_path in */*) ;; *) break ;; esac
+
+ # ...otherwise throw away the child directory and loop
+ _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"`
+ done
+ _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'`
+
+ func_mkdir_p_IFS=$IFS; IFS=:
+ for _G_dir in $_G_dir_list; do
+ IFS=$func_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 "$_G_dir" 2>/dev/null || :
+ done
+ IFS=$func_mkdir_p_IFS
+
+ # Bail out if we (or some other process) failed to create a directory.
+ test -d "$_G_directory_path" || \
+ func_fatal_error "Failed to create '$1'"
+ fi
+}
+
+
+# func_mktempdir [BASENAME]
+# -------------------------
+# Make a temporary directory that won't clash with other running
+# libtool processes, and avoids race conditions if possible. If
+# given, BASENAME is the basename for that directory.
+func_mktempdir ()
+{
+ $debug_cmd
+
+ _G_template=${TMPDIR-/tmp}/${1-$progname}
+
+ if test : = "$opt_dry_run"; then
+ # Return a directory name, but don't create it in dry-run mode
+ _G_tmpdir=$_G_template-$$
+ else
+
+ # If mktemp works, use that first and foremost
+ _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null`
+
+ if test ! -d "$_G_tmpdir"; then
+ # Failing that, at least try and use $RANDOM to avoid a race
+ _G_tmpdir=$_G_template-${RANDOM-0}$$
+
+ func_mktempdir_umask=`umask`
+ umask 0077
+ $MKDIR "$_G_tmpdir"
+ umask $func_mktempdir_umask
+ fi
+
+ # If we're not in dry-run mode, bomb out on failure
+ test -d "$_G_tmpdir" || \
+ func_fatal_error "cannot create temporary directory '$_G_tmpdir'"
+ fi
+
+ $ECHO "$_G_tmpdir"
+}
+
+
+# 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.
+func_normal_abspath ()
+{
+ $debug_cmd
+
+ # These SED scripts presuppose an absolute path with a trailing slash.
+ _G_pathcar='s|^/\([^/]*\).*$|\1|'
+ _G_pathcdr='s|^/[^/]*||'
+ _G_removedotparts=':dotsl
+ s|/\./|/|g
+ t dotsl
+ s|/\.$|/|'
+ _G_collapseslashes='s|/\{1,\}|/|g'
+ _G_finalslash='s|/*$|/|'
+
+ # 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 "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_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 "$_G_pathcar"`
+ func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+ -e "$_G_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_append 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_notquiet ARG...
+# --------------------
+# Echo program name prefixed message only when not in quiet mode.
+func_notquiet ()
+{
+ $debug_cmd
+
+ $opt_quiet || 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_relative_path SRCDIR DSTDIR
+# --------------------------------
+# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR.
+func_relative_path ()
+{
+ $debug_cmd
+
+ 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 -z "$func_relative_path_tlibdir"; 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 -n "$func_stripname_result"; then
+ func_append func_relative_path_result "/$func_stripname_result"
+ fi
+
+ # Normalisation. If bindir is libdir, return '.' else relative path.
+ if test -n "$func_relative_path_result"; then
+ func_stripname './' '' "$func_relative_path_result"
+ func_relative_path_result=$func_stripname_result
+ fi
+
+ test -n "$func_relative_path_result" || func_relative_path_result=.
+
+ :
+}
+
+
+# func_quote_for_eval ARG...
+# --------------------------
+# Aesthetically quote ARGs to be evaled later.
+# This function returns two values:
+# i) func_quote_for_eval_result
+# double-quoted, suitable for a subsequent eval
+# ii) func_quote_for_eval_unquoted_result
+# has all characters that are still active within double
+# quotes backslashified.
+func_quote_for_eval ()
+{
+ $debug_cmd
+
+ func_quote_for_eval_unquoted_result=
+ func_quote_for_eval_result=
+ while test 0 -lt $#; do
+ case $1 in
+ *[\\\`\"\$]*)
+ _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;;
+ *)
+ _G_unquoted_arg=$1 ;;
+ esac
+ if test -n "$func_quote_for_eval_unquoted_result"; then
+ func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg"
+ else
+ func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg"
+ fi
+
+ case $_G_unquoted_arg in
+ # Double-quote args containing shell metacharacters to delay
+ # word splitting, command substitution and variable expansion
+ # for a subsequent eval.
+ # Many Bourne shells cannot handle close brackets correctly
+ # in scan sets, so we specify it separately.
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ _G_quoted_arg=\"$_G_unquoted_arg\"
+ ;;
+ *)
+ _G_quoted_arg=$_G_unquoted_arg
+ ;;
+ esac
+
+ if test -n "$func_quote_for_eval_result"; then
+ func_append func_quote_for_eval_result " $_G_quoted_arg"
+ else
+ func_append func_quote_for_eval_result "$_G_quoted_arg"
+ fi
+ shift
+ done
+}
+
+
+# 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 ()
+{
+ $debug_cmd
+
+ case $1 in
+ *[\\\`\"]*)
+ _G_arg=`$ECHO "$1" | $SED \
+ -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;;
+ *)
+ _G_arg=$1 ;;
+ esac
+
+ case $_G_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.
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ _G_arg=\"$_G_arg\"
+ ;;
+ esac
+
+ func_quote_for_expand_result=$_G_arg
+}
+
+
+# func_stripname PREFIX SUFFIX NAME
+# ---------------------------------
+# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result.
+# 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).
+if test yes = "$_G_HAVE_XSI_OPS"; then
+ eval 'func_stripname ()
+ {
+ $debug_cmd
+
+ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+ # positional parameters, so assign one to ordinary variable first.
+ func_stripname_result=$3
+ func_stripname_result=${func_stripname_result#"$1"}
+ func_stripname_result=${func_stripname_result%"$2"}
+ }'
+else
+ func_stripname ()
+ {
+ $debug_cmd
+
+ case $2 in
+ .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;;
+ *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;;
+ esac
+ }
+fi
+
+
+# func_show_eval CMD [FAIL_EXP]
+# -----------------------------
+# Unless opt_quiet 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 ()
+{
+ $debug_cmd
+
+ _G_cmd=$1
+ _G_fail_exp=${2-':'}
+
+ func_quote_for_expand "$_G_cmd"
+ eval "func_notquiet $func_quote_for_expand_result"
+
+ $opt_dry_run || {
+ eval "$_G_cmd"
+ _G_status=$?
+ if test 0 -ne "$_G_status"; then
+ eval "(exit $_G_status); $_G_fail_exp"
+ fi
+ }
+}
+
+
+# func_show_eval_locale CMD [FAIL_EXP]
+# ------------------------------------
+# Unless opt_quiet 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 ()
+{
+ $debug_cmd
+
+ _G_cmd=$1
+ _G_fail_exp=${2-':'}
+
+ $opt_quiet || {
+ func_quote_for_expand "$_G_cmd"
+ eval "func_echo $func_quote_for_expand_result"
+ }
+
+ $opt_dry_run || {
+ eval "$_G_user_locale
+ $_G_cmd"
+ _G_status=$?
+ eval "$_G_safe_locale"
+ if test 0 -ne "$_G_status"; then
+ eval "(exit $_G_status); $_G_fail_exp"
+ 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 ()
+{
+ $debug_cmd
+
+ case $1 in
+ [0-9]* | *[!a-zA-Z0-9_]*)
+ func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'`
+ ;;
+ * )
+ func_tr_sh_result=$1
+ ;;
+ esac
+}
+
+
+# func_verbose ARG...
+# -------------------
+# Echo program name prefixed message in verbose mode only.
+func_verbose ()
+{
+ $debug_cmd
+
+ $opt_verbose && func_echo "$*"
+
+ :
+}
+
+
+# func_warn_and_continue ARG...
+# -----------------------------
+# Echo program name prefixed warning message to standard error.
+func_warn_and_continue ()
+{
+ $debug_cmd
+
+ $require_term_colors
+
+ func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2
+}
+
+
+# func_warning CATEGORY ARG...
+# ----------------------------
+# Echo program name prefixed warning message to standard error. Warning
+# messages can be filtered according to CATEGORY, where this function
+# elides messages where CATEGORY is not listed in the global variable
+# 'opt_warning_types'.
+func_warning ()
+{
+ $debug_cmd
+
+ # CATEGORY must be in the warning_categories list!
+ case " $warning_categories " in
+ *" $1 "*) ;;
+ *) func_internal_error "invalid warning category '$1'" ;;
+ esac
+
+ _G_category=$1
+ shift
+
+ case " $opt_warning_types " in
+ *" $_G_category "*) $warning_func ${1+"$@"} ;;
+ esac
+}
+
+
+# func_sort_ver VER1 VER2
+# -----------------------
+# 'sort -V' is not generally available.
+# Note this deviates from the version comparison in automake
+# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a
+# but this should suffice as we won't be specifying old
+# version formats or redundant trailing .0 in bootstrap.conf.
+# If we did want full compatibility then we should probably
+# use m4_version_compare from autoconf.
+func_sort_ver ()
+{
+ $debug_cmd
+
+ printf '%s\n%s\n' "$1" "$2" \
+ | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n
+}
+
+# func_lt_ver PREV CURR
+# ---------------------
+# Return true if PREV and CURR are in the correct order according to
+# func_sort_ver, otherwise false. Use it like this:
+#
+# func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..."
+func_lt_ver ()
+{
+ $debug_cmd
+
+ test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q`
+}
+
+
+# Local variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC"
+# time-stamp-time-zone: "UTC"
+# End:
+#! /bin/sh
+
+# Set a version string for this script.
+scriptversion=2015-10-07.11; # UTC
+
+# A portable, pluggable option parser for Bourne shell.
+# Written by Gary V. Vaughan, 2010
+
+# Copyright (C) 2010-2015 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.
+
+# 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/>.
+
+# Please report bugs or propose patches to gary@gnu.org.
+
+
+## ------ ##
+## Usage. ##
+## ------ ##
+
+# This file is a library for parsing options in your shell scripts along
+# with assorted other useful supporting features that you can make use
+# of too.
+#
+# For the simplest scripts you might need only:
+#
+# #!/bin/sh
+# . relative/path/to/funclib.sh
+# . relative/path/to/options-parser
+# scriptversion=1.0
+# func_options ${1+"$@"}
+# eval set dummy "$func_options_result"; shift
+# ...rest of your script...
+#
+# In order for the '--version' option to work, you will need to have a
+# suitably formatted comment like the one at the top of this file
+# starting with '# Written by ' and ending with '# warranty; '.
+#
+# For '-h' and '--help' to work, you will also need a one line
+# description of your script's purpose in a comment directly above the
+# '# Written by ' line, like the one at the top of this file.
+#
+# The default options also support '--debug', which will turn on shell
+# execution tracing (see the comment above debug_cmd below for another
+# use), and '--verbose' and the func_verbose function to allow your script
+# to display verbose messages only when your user has specified
+# '--verbose'.
+#
+# After sourcing this file, you can plug processing for additional
+# options by amending the variables from the 'Configuration' section
+# below, and following the instructions in the 'Option parsing'
+# section further down.
+
+## -------------- ##
+## Configuration. ##
+## -------------- ##
+
+# You should override these variables in your script after sourcing this
+# file so that they reflect the customisations you have added to the
+# option parser.
+
+# The usage line for option parsing errors and the start of '-h' and
+# '--help' output messages. You can embed shell variables for delayed
+# expansion at the time the message is displayed, but you will need to
+# quote other shell meta-characters carefully to prevent them being
+# expanded when the contents are evaled.
+usage='$progpath [OPTION]...'
+
+# Short help message in response to '-h' and '--help'. Add to this or
+# override it after sourcing this library to reflect the full set of
+# options your script accepts.
+usage_message="\
+ --debug enable verbose shell tracing
+ -W, --warnings=CATEGORY
+ report the warnings falling in CATEGORY [all]
+ -v, --verbose verbosely report processing
+ --version print version information and exit
+ -h, --help print short or long help message and exit
+"
+
+# Additional text appended to 'usage_message' in response to '--help'.
+long_help_message="
+Warning categories include:
+ 'all' show all warnings
+ 'none' turn off all the warnings
+ 'error' warnings are treated as fatal errors"
+
+# Help message printed before fatal option parsing errors.
+fatal_help="Try '\$progname --help' for more information."
+
+
+
+## ------------------------- ##
+## Hook function management. ##
+## ------------------------- ##
+
+# This section contains functions for adding, removing, and running hooks
+# to the main code. A hook is just a named list of of function, that can
+# be run in order later on.
+
+# func_hookable FUNC_NAME
+# -----------------------
+# Declare that FUNC_NAME will run hooks added with
+# 'func_add_hook FUNC_NAME ...'.
+func_hookable ()
+{
+ $debug_cmd
+
+ func_append hookable_fns " $1"
+}
+
+
+# func_add_hook FUNC_NAME HOOK_FUNC
+# ---------------------------------
+# Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must
+# first have been declared "hookable" by a call to 'func_hookable'.
+func_add_hook ()
+{
+ $debug_cmd
+
+ case " $hookable_fns " in
+ *" $1 "*) ;;
+ *) func_fatal_error "'$1' does not accept hook functions." ;;
+ esac
+
+ eval func_append ${1}_hooks '" $2"'
+}
+
+
+# func_remove_hook FUNC_NAME HOOK_FUNC
+# ------------------------------------
+# Remove HOOK_FUNC from the list of functions called by FUNC_NAME.
+func_remove_hook ()
+{
+ $debug_cmd
+
+ eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`'
+}
+
+
+# func_run_hooks FUNC_NAME [ARG]...
+# ---------------------------------
+# Run all hook functions registered to FUNC_NAME.
+# It is assumed that the list of hook functions contains nothing more
+# than a whitespace-delimited list of legal shell function names, and
+# no effort is wasted trying to catch shell meta-characters or preserve
+# whitespace.
+func_run_hooks ()
+{
+ $debug_cmd
+
+ _G_rc_run_hooks=false
+
+ case " $hookable_fns " in
+ *" $1 "*) ;;
+ *) func_fatal_error "'$1' does not support hook funcions.n" ;;
+ esac
+
+ eval _G_hook_fns=\$$1_hooks; shift
+
+ for _G_hook in $_G_hook_fns; do
+ if eval $_G_hook '"$@"'; then
+ # store returned options list back into positional
+ # parameters for next 'cmd' execution.
+ eval _G_hook_result=\$${_G_hook}_result
+ eval set dummy "$_G_hook_result"; shift
+ _G_rc_run_hooks=:
+ fi
+ done
+
+ $_G_rc_run_hooks && func_run_hooks_result=$_G_hook_result
+}
+
+
+
+## --------------- ##
+## Option parsing. ##
+## --------------- ##
+
+# In order to add your own option parsing hooks, you must accept the
+# full positional parameter list in your hook function, you may remove/edit
+# any options that you action, and then pass back the remaining unprocessed
+# options in '<hooked_function_name>_result', escaped suitably for
+# 'eval'. In this case you also must return $EXIT_SUCCESS to let the
+# hook's caller know that it should pay attention to
+# '<hooked_function_name>_result'. Returning $EXIT_FAILURE signalizes that
+# arguments are left untouched by the hook and therefore caller will ignore the
+# result variable.
+#
+# Like this:
+#
+# my_options_prep ()
+# {
+# $debug_cmd
+#
+# # Extend the existing usage message.
+# usage_message=$usage_message'
+# -s, --silent don'\''t print informational messages
+# '
+# # No change in '$@' (ignored completely by this hook). There is
+# # no need to do the equivalent (but slower) action:
+# # func_quote_for_eval ${1+"$@"}
+# # my_options_prep_result=$func_quote_for_eval_result
+# false
+# }
+# func_add_hook func_options_prep my_options_prep
+#
+#
+# my_silent_option ()
+# {
+# $debug_cmd
+#
+# args_changed=false
+#
+# # Note that for efficiency, we parse as many options as we can
+# # recognise in a loop before passing the remainder back to the
+# # caller on the first unrecognised argument we encounter.
+# while test $# -gt 0; do
+# opt=$1; shift
+# case $opt in
+# --silent|-s) opt_silent=:
+# args_changed=:
+# ;;
+# # Separate non-argument short options:
+# -s*) func_split_short_opt "$_G_opt"
+# set dummy "$func_split_short_opt_name" \
+# "-$func_split_short_opt_arg" ${1+"$@"}
+# shift
+# args_changed=:
+# ;;
+# *) # Make sure the first unrecognised option "$_G_opt"
+# # is added back to "$@", we could need that later
+# # if $args_changed is true.
+# set dummy "$_G_opt" ${1+"$@"}; shift; break ;;
+# esac
+# done
+#
+# if $args_changed; then
+# func_quote_for_eval ${1+"$@"}
+# my_silent_option_result=$func_quote_for_eval_result
+# fi
+#
+# $args_changed
+# }
+# func_add_hook func_parse_options my_silent_option
+#
+#
+# my_option_validation ()
+# {
+# $debug_cmd
+#
+# $opt_silent && $opt_verbose && func_fatal_help "\
+# '--silent' and '--verbose' options are mutually exclusive."
+#
+# false
+# }
+# func_add_hook func_validate_options my_option_validation
+#
+# You'll also need to manually amend $usage_message to reflect the extra
+# options you parse. It's preferable to append if you can, so that
+# multiple option parsing hooks can be added safely.
+
+
+# func_options_finish [ARG]...
+# ----------------------------
+# Finishing the option parse loop (call 'func_options' hooks ATM).
+func_options_finish ()
+{
+ $debug_cmd
+
+ _G_func_options_finish_exit=false
+ if func_run_hooks func_options ${1+"$@"}; then
+ func_options_finish_result=$func_run_hooks_result
+ _G_func_options_finish_exit=:
+ fi
+
+ $_G_func_options_finish_exit
+}
+
+
+# func_options [ARG]...
+# ---------------------
+# All the functions called inside func_options are hookable. See the
+# individual implementations for details.
+func_hookable func_options
+func_options ()
+{
+ $debug_cmd
+
+ _G_rc_options=false
+
+ for my_func in options_prep parse_options validate_options options_finish
+ do
+ if eval func_$my_func '${1+"$@"}'; then
+ eval _G_res_var='$'"func_${my_func}_result"
+ eval set dummy "$_G_res_var" ; shift
+ _G_rc_options=:
+ fi
+ done
+
+ # Save modified positional parameters for caller. As a top-level
+ # options-parser function we always need to set the 'func_options_result'
+ # variable (regardless the $_G_rc_options value).
+ if $_G_rc_options; then
+ func_options_result=$_G_res_var
+ else
+ func_quote_for_eval ${1+"$@"}
+ func_options_result=$func_quote_for_eval_result
+ fi
+
+ $_G_rc_options
+}
+
+
+# func_options_prep [ARG]...
+# --------------------------
+# All initialisations required before starting the option parse loop.
+# Note that when calling hook functions, we pass through the list of
+# positional parameters. If a hook function modifies that list, and
+# needs to propagate that back to rest of this script, then the complete
+# modified list must be put in 'func_run_hooks_result' before
+# returning $EXIT_SUCCESS (otherwise $EXIT_FAILURE is returned).
+func_hookable func_options_prep
+func_options_prep ()
+{
+ $debug_cmd
+
+ # Option defaults:
+ opt_verbose=false
+ opt_warning_types=
+
+ _G_rc_options_prep=false
+ if func_run_hooks func_options_prep ${1+"$@"}; then
+ _G_rc_options_prep=:
+ # save modified positional parameters for caller
+ func_options_prep_result=$func_run_hooks_result
+ fi
+
+ $_G_rc_options_prep
+}
+
+
+# func_parse_options [ARG]...
+# ---------------------------
+# The main option parsing loop.
+func_hookable func_parse_options
+func_parse_options ()
+{
+ $debug_cmd
+
+ func_parse_options_result=
+
+ _G_rc_parse_options=false
+ # this just eases exit handling
+ while test $# -gt 0; do
+ # Defer to hook functions for initial option parsing, so they
+ # get priority in the event of reusing an option name.
+ if func_run_hooks func_parse_options ${1+"$@"}; then
+ eval set dummy "$func_run_hooks_result"; shift
+ _G_rc_parse_options=:
+ fi
+
+ # Break out of the loop if we already parsed every option.
+ test $# -gt 0 || break
+
+ _G_match_parse_options=:
+ _G_opt=$1
+ shift
+ case $_G_opt in
+ --debug|-x) debug_cmd='set -x'
+ func_echo "enabling shell trace mode"
+ $debug_cmd
+ ;;
+
+ --no-warnings|--no-warning|--no-warn)
+ set dummy --warnings none ${1+"$@"}
+ shift
+ ;;
+
+ --warnings|--warning|-W)
+ if test $# = 0 && func_missing_arg $_G_opt; then
+ _G_rc_parse_options=:
+ break
+ fi
+ case " $warning_categories $1" in
+ *" $1 "*)
+ # trailing space prevents matching last $1 above
+ func_append_uniq opt_warning_types " $1"
+ ;;
+ *all)
+ opt_warning_types=$warning_categories
+ ;;
+ *none)
+ opt_warning_types=none
+ warning_func=:
+ ;;
+ *error)
+ opt_warning_types=$warning_categories
+ warning_func=func_fatal_error
+ ;;
+ *)
+ func_fatal_error \
+ "unsupported warning category: '$1'"
+ ;;
+ esac
+ shift
+ ;;
+
+ --verbose|-v) opt_verbose=: ;;
+ --version) func_version ;;
+ -\?|-h) func_usage ;;
+ --help) func_help ;;
+
+ # Separate optargs to long options (plugins may need this):
+ --*=*) func_split_equals "$_G_opt"
+ set dummy "$func_split_equals_lhs" \
+ "$func_split_equals_rhs" ${1+"$@"}
+ shift
+ ;;
+
+ # Separate optargs to short options:
+ -W*)
+ func_split_short_opt "$_G_opt"
+ set dummy "$func_split_short_opt_name" \
+ "$func_split_short_opt_arg" ${1+"$@"}
+ shift
+ ;;
+
+ # Separate non-argument short options:
+ -\?*|-h*|-v*|-x*)
+ func_split_short_opt "$_G_opt"
+ set dummy "$func_split_short_opt_name" \
+ "-$func_split_short_opt_arg" ${1+"$@"}
+ shift
+ ;;
+
+ --) _G_rc_parse_options=: ; break ;;
+ -*) func_fatal_help "unrecognised option: '$_G_opt'" ;;
+ *) set dummy "$_G_opt" ${1+"$@"}; shift
+ _G_match_parse_options=false
+ break
+ ;;
+ esac
+
+ $_G_match_parse_options && _G_rc_parse_options=:
+ done
+
+
+ if $_G_rc_parse_options; then
+ # save modified positional parameters for caller
+ func_quote_for_eval ${1+"$@"}
+ func_parse_options_result=$func_quote_for_eval_result
+ fi
+
+ $_G_rc_parse_options
+}
+
+
+# func_validate_options [ARG]...
+# ------------------------------
+# Perform any sanity checks on option settings and/or unconsumed
+# arguments.
+func_hookable func_validate_options
+func_validate_options ()
+{
+ $debug_cmd
+
+ _G_rc_validate_options=false
+
+ # Display all warnings if -W was not given.
+ test -n "$opt_warning_types" || opt_warning_types=" $warning_categories"
+
+ if func_run_hooks func_validate_options ${1+"$@"}; then
+ # save modified positional parameters for caller
+ func_validate_options_result=$func_run_hooks_result
+ _G_rc_validate_options=:
+ fi
+
+ # Bail if the options were screwed!
+ $exit_cmd $EXIT_FAILURE
+
+ $_G_rc_validate_options
+}
+
+
+
+## ----------------- ##
+## Helper functions. ##
+## ----------------- ##
+
+# This section contains the helper functions used by the rest of the
+# hookable option parser framework in ascii-betical order.
+
+
+# func_fatal_help ARG...
+# ----------------------
+# Echo program name prefixed message to standard error, followed by
+# a help hint, and exit.
+func_fatal_help ()
+{
+ $debug_cmd
+
+ eval \$ECHO \""Usage: $usage"\"
+ eval \$ECHO \""$fatal_help"\"
+ func_error ${1+"$@"}
+ exit $EXIT_FAILURE
+}
+
+
+# func_help
+# ---------
+# Echo long help message to standard output and exit.
+func_help ()
+{
+ $debug_cmd
+
+ func_usage_message
+ $ECHO "$long_help_message"
+ exit 0
+}
+
+
+# func_missing_arg ARGNAME
+# ------------------------
+# Echo program name prefixed message to standard error and set global
+# exit_cmd.
+func_missing_arg ()
+{
+ $debug_cmd
+
+ func_error "Missing argument for '$1'."
+ exit_cmd=exit
+}
+
+
+# func_split_equals STRING
+# ------------------------
+# Set func_split_equals_lhs and func_split_equals_rhs shell variables after
+# splitting STRING at the '=' sign.
+test -z "$_G_HAVE_XSI_OPS" \
+ && (eval 'x=a/b/c;
+ test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \
+ && _G_HAVE_XSI_OPS=yes
+
+if test yes = "$_G_HAVE_XSI_OPS"
+then
+ # This is an XSI compatible shell, allowing a faster implementation...
+ eval 'func_split_equals ()
+ {
+ $debug_cmd
+
+ func_split_equals_lhs=${1%%=*}
+ func_split_equals_rhs=${1#*=}
+ test "x$func_split_equals_lhs" = "x$1" \
+ && func_split_equals_rhs=
+ }'
+else
+ # ...otherwise fall back to using expr, which is often a shell builtin.
+ func_split_equals ()
+ {
+ $debug_cmd
+
+ func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'`
+ func_split_equals_rhs=
+ test "x$func_split_equals_lhs" = "x$1" \
+ || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'`
+ }
+fi #func_split_equals
+
+
+# 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.
+if test yes = "$_G_HAVE_XSI_OPS"
+then
+ # This is an XSI compatible shell, allowing a faster implementation...
+ eval 'func_split_short_opt ()
+ {
+ $debug_cmd
+
+ func_split_short_opt_arg=${1#??}
+ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}
+ }'
+else
+ # ...otherwise fall back to using expr, which is often a shell builtin.
+ func_split_short_opt ()
+ {
+ $debug_cmd
+
+ func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'`
+ func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'`
+ }
+fi #func_split_short_opt
+
+
+# func_usage
+# ----------
+# Echo short help message to standard output and exit.
+func_usage ()
+{
+ $debug_cmd
+
+ func_usage_message
+ $ECHO "Run '$progname --help |${PAGER-more}' for full usage"
+ exit 0
+}
+
+
+# func_usage_message
+# ------------------
+# Echo short help message to standard output.
+func_usage_message ()
+{
+ $debug_cmd
+
+ eval \$ECHO \""Usage: $usage"\"
+ echo
+ $SED -n 's|^# ||
+ /^Written by/{
+ x;p;x
+ }
+ h
+ /^Written by/q' < "$progpath"
+ echo
+ eval \$ECHO \""$usage_message"\"
+}
+
+
+# func_version
+# ------------
+# Echo version message to standard output and exit.
+func_version ()
+{
+ $debug_cmd
+
+ printf '%s\n' "$progname $scriptversion"
+ $SED -n '
+ /(C)/!b go
+ :more
+ /\./!{
+ N
+ s|\n# | |
+ b more
+ }
+ :go
+ /^# Written by /,/# warranty; / {
+ s|^# ||
+ s|^# *$||
+ s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2|
+ p
+ }
+ /^# Written by / {
+ s|^# ||
+ p
+ }
+ /^warranty; /q' < "$progpath"
+
+ exit $?
+}
+
+
+# Local variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC"
+# time-stamp-time-zone: "UTC"
+# End:
+
+# Set a version string.
+scriptversion='(GNU libtool) 2.4.6'
+
+
+# func_echo ARG...
+# ----------------
+# Libtool also displays the current mode in messages, so override
+# funclib.sh func_echo with this custom definition.
+func_echo ()
+{
+ $debug_cmd
+
+ _G_message=$*
+
+ func_echo_IFS=$IFS
+ IFS=$nl
+ for _G_line in $_G_message; do
+ IFS=$func_echo_IFS
+ $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line"
+ done
+ IFS=$func_echo_IFS
+}
+
+
+# func_warning ARG...
+# -------------------
+# Libtool warnings are not categorized, so override funclib.sh
+# func_warning with this simpler definition.
+func_warning ()
+{
+ $debug_cmd
+
+ $warning_func ${1+"$@"}
+}
+
+
+## ---------------- ##
+## Options parsing. ##
+## ---------------- ##
+
+# Hook in the functions to make sure our own options are parsed during
+# the option parsing loop.
+
+usage='$progpath [OPTION]... [MODE-ARG]...'
+
+# Short help message in response to '-h'.
+usage_message="Options:
+ --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
+ --no-warnings equivalent to '-Wnone'
+ --preserve-dup-deps don't remove duplicate dependency libraries
+ --quiet, --silent don't print informational messages
+ --tag=TAG use configuration variables from tag TAG
+ -v, --verbose print more informational messages than default
+ --version print version information
+ -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all]
+ -h, --help, --help-all print short, long, or detailed help message
+"
+
+# Additional text appended to 'usage_message' in response to '--help'.
+func_help ()
+{
+ $debug_cmd
+
+ func_usage_message
+ $ECHO "$long_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)
+ version: $progname $scriptversion Debian-2.4.6-15build2
+ automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q`
+ autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q`
+
+Report bugs to <bug-libtool@gnu.org>.
+GNU libtool home page: <http://www.gnu.org/s/libtool/>.
+General help using GNU software: <http://www.gnu.org/gethelp/>."
+ exit 0
+}
+
+
+# func_lo2o OBJECT-NAME
+# ---------------------
+# Transform OBJECT-NAME from a '.lo' suffix to the platform specific
+# object suffix.
+
+lo2o=s/\\.lo\$/.$objext/
+o2lo=s/\\.$objext\$/.lo/
+
+if test yes = "$_G_HAVE_XSI_OPS"; then
+ eval 'func_lo2o ()
+ {
+ case $1 in
+ *.lo) func_lo2o_result=${1%.lo}.$objext ;;
+ * ) func_lo2o_result=$1 ;;
+ esac
+ }'
+
+ # func_xform LIBOBJ-OR-SOURCE
+ # ---------------------------
+ # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise)
+ # suffix to a '.lo' libtool-object suffix.
+ eval 'func_xform ()
+ {
+ func_xform_result=${1%.*}.lo
+ }'
+else
+ # ...otherwise fall back to using sed.
+ func_lo2o ()
+ {
+ func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"`
+ }
+
+ func_xform ()
+ {
+ func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'`
+ }
+fi
+
+
+# func_fatal_configuration ARG...
+# -------------------------------
+# Echo program name prefixed message to standard error, followed by
+# a configuration failure hint, and exit.
+func_fatal_configuration ()
+{
+ func__fatal_error ${1+"$@"} \
+ "See the $PACKAGE documentation for more information." \
+ "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 yes = "$build_libtool_libs"; then
+ echo "enable shared libraries"
+ else
+ echo "disable shared libraries"
+ fi
+ if test yes = "$build_old_libs"; 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
+}
+
+
+# libtool_options_prep [ARG]...
+# -----------------------------
+# Preparation for options parsed by libtool.
+libtool_options_prep ()
+{
+ $debug_mode
+
+ # Option defaults:
+ opt_config=false
+ opt_dlopen=
+ opt_dry_run=false
+ opt_help=false
+ opt_mode=
+ opt_preserve_dup_deps=false
+ opt_quiet=false
+
+ nonopt=
+ preserve_args=
+
+ _G_rc_lt_options_prep=:
+
+ # 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
+ ;;
+ *)
+ _G_rc_lt_options_prep=false
+ ;;
+ esac
+
+ if $_G_rc_lt_options_prep; then
+ # Pass back the list of options.
+ func_quote_for_eval ${1+"$@"}
+ libtool_options_prep_result=$func_quote_for_eval_result
+ fi
+
+ $_G_rc_lt_options_prep
+}
+func_add_hook func_options_prep libtool_options_prep
+
+
+# libtool_parse_options [ARG]...
+# ---------------------------------
+# Provide handling for libtool specific options.
+libtool_parse_options ()
+{
+ $debug_cmd
+
+ _G_rc_lt_parse_options=false
+
+ # Perform our own loop to consume as many options as possible in
+ # each iteration.
+ while test $# -gt 0; do
+ _G_match_lt_parse_options=:
+ _G_opt=$1
+ shift
+ case $_G_opt in
+ --dry-run|--dryrun|-n)
+ opt_dry_run=:
+ ;;
+
+ --config) func_config ;;
+
+ --dlopen|-dlopen)
+ opt_dlopen="${opt_dlopen+$opt_dlopen
+}$1"
+ shift
+ ;;
+
+ --preserve-dup-deps)
+ opt_preserve_dup_deps=: ;;
+
+ --features) func_features ;;
+
+ --finish) set dummy --mode finish ${1+"$@"}; shift ;;
+
+ --help) opt_help=: ;;
+
+ --help-all) opt_help=': help-all' ;;
+
+ --mode) test $# = 0 && func_missing_arg $_G_opt && break
+ opt_mode=$1
+ case $1 in
+ # Valid mode arguments:
+ clean|compile|execute|finish|install|link|relink|uninstall) ;;
+
+ # Catch anything else as an error
+ *) func_error "invalid argument for $_G_opt"
+ exit_cmd=exit
+ break
+ ;;
+ esac
+ shift
+ ;;
+
+ --no-silent|--no-quiet)
+ opt_quiet=false
+ func_append preserve_args " $_G_opt"
+ ;;
+
+ --no-warnings|--no-warning|--no-warn)
+ opt_warning=false
+ func_append preserve_args " $_G_opt"
+ ;;
+
+ --no-verbose)
+ opt_verbose=false
+ func_append preserve_args " $_G_opt"
+ ;;
+
+ --silent|--quiet)
+ opt_quiet=:
+ opt_verbose=false
+ func_append preserve_args " $_G_opt"
+ ;;
+
+ --tag) test $# = 0 && func_missing_arg $_G_opt && break
+ opt_tag=$1
+ func_append preserve_args " $_G_opt $1"
+ func_enable_tag "$1"
+ shift
+ ;;
+
+ --verbose|-v) opt_quiet=false
+ opt_verbose=:
+ func_append preserve_args " $_G_opt"
+ ;;
+
+ # An option not handled by this hook function:
+ *) set dummy "$_G_opt" ${1+"$@"} ; shift
+ _G_match_lt_parse_options=false
+ break
+ ;;
+ esac
+ $_G_match_lt_parse_options && _G_rc_lt_parse_options=:
+ done
+
+ if $_G_rc_lt_parse_options; then
+ # save modified positional parameters for caller
+ func_quote_for_eval ${1+"$@"}
+ libtool_parse_options_result=$func_quote_for_eval_result
+ fi
+
+ $_G_rc_lt_parse_options
+}
+func_add_hook func_parse_options libtool_parse_options
+
+
+
+# libtool_validate_options [ARG]...
+# ---------------------------------
+# Perform any sanity checks on option settings and/or unconsumed
+# arguments.
+libtool_validate_options ()
+{
+ # save first non-option argument
+ if test 0 -lt $#; then
+ nonopt=$1
+ shift
+ fi
+
+ # preserve --debug
+ test : = "$debug_cmd" || func_append preserve_args " --debug"
+
+ case $host in
+ # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452
+ # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788
+ *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*)
+ # 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
+
+ test yes != "$build_libtool_libs" \
+ && test yes != "$build_old_libs" \
+ && func_fatal_configuration "not configured to build any kind of library"
+
+ # Darwin sucks
+ eval std_shrext=\"$shrext_cmds\"
+
+ # Only execute mode is allowed to have -dlopen flags.
+ if test -n "$opt_dlopen" && test execute != "$opt_mode"; 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."
+ }
+
+ # Pass back the unparsed argument list
+ func_quote_for_eval ${1+"$@"}
+ libtool_validate_options_result=$func_quote_for_eval_result
+}
+func_add_hook func_validate_options libtool_validate_options
+
+
+# Process options as early as possible so that --help and --version
+# can return quickly.
+func_options ${1+"$@"}
+eval set dummy "$func_options_result"; shift
+
+
+
+## ----------- ##
+## Main. ##
+## ----------- ##
+
+magic='%%%MAGIC variable%%%'
+magic_exe='%%%MAGIC EXE variable%%%'
+
+# Global variables.
+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=
+
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+ eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+}
+
+# func_generated_by_libtool
+# True iff stdin has been generated by Libtool. This function is only
+# a basic sanity check; it will hardly flush out determined imposters.
+func_generated_by_libtool_p ()
+{
+ $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
+}
+
+# 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 | func_generated_by_libtool_p
+}
+
+# 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 yes = "$lalib_p"
+}
+
+# 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 ()
+{
+ test -f "$1" &&
+ $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p
+}
+
+# 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 ()
+{
+ $debug_cmd
+
+ save_ifs=$IFS; IFS='~'
+ for cmd in $1; do
+ IFS=$sp$nl
+ eval cmd=\"$cmd\"
+ IFS=$save_ifs
+ 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 ()
+{
+ $debug_cmd
+
+ 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 ()
+{
+ $debug_cmd
+
+ 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 yes = "$build_libtool_libs"; then
+ write_lobj=\'$2\'
+ else
+ write_lobj=none
+ fi
+
+ if test yes = "$build_old_libs"; 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) $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 ()
+{
+ $debug_cmd
+
+ 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 "$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 ()
+{
+ $debug_cmd
+
+ # 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 ()
+{
+ $debug_cmd
+
+ 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 ()
+{
+ $debug_cmd
+
+ # awkward: cmd appends spaces to result
+ func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null |
+ $SED -e 's/[ ]*$//' -e "$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 ()
+{
+ $debug_cmd
+
+ 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 ()
+{
+ $debug_cmd
+
+ 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 ()
+{
+ $debug_cmd
+
+ 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 ()
+{
+ $debug_cmd
+
+ $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 ()
+{
+ $debug_cmd
+
+ 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 ()
+{
+ $debug_cmd
+
+ 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 ()
+{
+ $debug_cmd
+
+ 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 ()
+{
+ $debug_cmd
+
+ 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 ()
+{
+ $debug_cmd
+
+ 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 ()
+{
+ $debug_cmd
+
+ 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 ()
+{
+ $debug_cmd
+
+ 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 ()
+{
+ $debug_cmd
+
+ 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 ()
+{
+ $debug_cmd
+
+ 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 ()
+{
+ $debug_cmd
+
+ 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 ()
+{
+ $debug_cmd
+
+ 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 ()
+{
+ $debug_cmd
+
+ 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 ()
+{
+ $debug_cmd
+
+ 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_dll_def_p FILE
+# True iff FILE is a Windows DLL '.def' file.
+# Keep in sync with _LT_DLL_DEF_P in libtool.m4
+func_dll_def_p ()
+{
+ $debug_cmd
+
+ func_dll_def_p_tmp=`$SED -n \
+ -e 's/^[ ]*//' \
+ -e '/^\(;.*\)*$/d' \
+ -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \
+ -e q \
+ "$1"`
+ test DEF = "$func_dll_def_p_tmp"
+}
+
+
+# func_mode_compile arg...
+func_mode_compile ()
+{
+ $debug_cmd
+
+ # 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 yes = "$build_libtool_libs" \
+ || func_fatal_configuration "cannot 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 yes = "$build_old_libs"; 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 no = "$pic_mode" && test pass_all != "$deplibs_check_method"; 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 no = "$compiler_c_o"; 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 yes = "$need_locks"; 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 warn = "$need_locks"; 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 yes = "$build_libtool_libs"; then
+ # Without this assignment, base_compile gets emptied.
+ fbsd_hideous_sh_bug=$base_compile
+
+ if test no != "$pic_mode"; 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 warn = "$need_locks" &&
+ 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 yes = "$suppress_opt"; then
+ suppress_output=' >/dev/null 2>&1'
+ fi
+ fi
+
+ # Only build a position-dependent object if we build old libraries.
+ if test yes = "$build_old_libs"; then
+ if test yes != "$pic_mode"; then
+ # Don't build PIC code
+ command="$base_compile $qsrcfile$pie_flag"
+ else
+ command="$base_compile $qsrcfile $pic_flag"
+ fi
+ if test yes = "$compiler_c_o"; 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 warn = "$need_locks" &&
+ 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 no != "$need_locks"; then
+ removelist=$lockfile
+ $RM "$lockfile"
+ fi
+ }
+
+ exit $EXIT_SUCCESS
+}
+
+$opt_help || {
+ test compile = "$opt_mode" && 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
+ -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes)
+ -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 ()
+{
+ $debug_cmd
+
+ # 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 $opt_dry_run; then
+ # 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
+ else
+ 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
+ fi
+}
+
+test execute = "$opt_mode" && func_mode_execute ${1+"$@"}
+
+
+# func_mode_finish arg...
+func_mode_finish ()
+{
+ $debug_cmd
+
+ 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_quiet && 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 finish = "$opt_mode" && func_mode_finish ${1+"$@"}
+
+
+# func_mode_install arg...
+func_mode_install ()
+{
+ $debug_cmd
+
+ # There may be an optional sh(1) argument at the beginning of
+ # install_prog (especially on Windows NT).
+ if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" ||
+ # 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=false
+ 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=: ;;
+ -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-m = "X$prev" && 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=:
+ if $isdir; 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
+ ;;
+ os2*)
+ 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 yes = "$build_old_libs"; 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=:
+ 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'`
+ if test -n "$libdir" && test ! -f "$libfile"; then
+ func_warning "'$lib' has not been installed in '$libdir'"
+ finalize=false
+ fi
+ done
+
+ relink_command=
+ func_source "$wrapper"
+
+ outputname=
+ if test no = "$fast_install" && test -n "$relink_command"; then
+ $opt_dry_run || {
+ if $finalize; 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_quiet || {
+ 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 install = "$opt_mode" && 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 ()
+{
+ $debug_cmd
+
+ my_outputname=$1
+ my_originator=$2
+ my_pic_p=${3-false}
+ my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'`
+ my_dlsyms=
+
+ if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; 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) $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 can'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
+
+#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0)
+
+/* External symbol declarations for the compiler. */\
+"
+
+ if test yes = "$dlself"; 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
+
+ func_show_eval '$RM "${nlist}I"'
+ if test -n "$global_symbol_to_import"; then
+ eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I'
+ 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[];\
+"
+
+ if test -s "$nlist"I; then
+ echo >> "$output_objdir/$my_dlsyms" "\
+static void lt_syminit(void)
+{
+ LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols;
+ for (; symbol->name; ++symbol)
+ {"
+ $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms"
+ echo >> "$output_objdir/$my_dlsyms" "\
+ }
+}"
+ fi
+ echo >> "$output_objdir/$my_dlsyms" "\
+LT_DLSYM_CONST lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[] =
+{ {\"$my_originator\", (void *) 0},"
+
+ if test -s "$nlist"I; then
+ echo >> "$output_objdir/$my_dlsyms" "\
+ {\"@INIT@\", (void *) &lt_syminit},"
+ fi
+
+ 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" ;;
+ *)
+ $my_pic_p && pic_flag_for_symtable=" $pic_flag"
+ ;;
+ 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" "${nlist}I"'
+
+ # 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_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 ()
+{
+ $debug_cmd
+
+ 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 ()
+{
+ $debug_cmd
+
+ 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_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 ()
+{
+ $debug_cmd
+
+ 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
+ case $nm_interface in
+ "MS dumpbin")
+ if func_cygming_ms_implib_p "$1" ||
+ func_cygming_gnu_implib_p "$1"
+ then
+ win32_nmres=import
+ else
+ win32_nmres=
+ fi
+ ;;
+ *)
+ 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
+ }
+ }'`
+ ;;
+ esac
+ 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 ()
+{
+ $debug_cmd
+
+ 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 ()
+{
+ $debug_cmd
+
+ 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 that possess that section. Heuristic: eliminate
+ # all those that 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_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 ()
+{
+ $debug_cmd
+
+ 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 ()
+{
+ $debug_cmd
+
+ f_ex_an_ar_dir=$1; shift
+ f_ex_an_ar_oldlib=$1
+ if test yes = "$lock_old_archive_extraction"; 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 yes = "$lock_old_archive_extraction"; 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 ()
+{
+ $debug_cmd
+
+ 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`
+ func_basename "$darwin_archive"
+ darwin_base_archive=$func_basename_result
+ 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 "$sed_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 where 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) $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/ that is used only on
+# windows platforms, and (c) all begin with the string "--lt-"
+# (application programs are unlikely to have options that 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) $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 yes = "$fast_install"; 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 yes = "$shlibpath_overrides_runpath" && 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) $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>
+
+#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0)
+
+/* 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_platform || defined ... */
+#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
+#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 (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
+#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 5)
+# define externally_visible volatile
+#else
+# define externally_visible __attribute__((externally_visible)) volatile
+#endif
+externally_visible const char * MAGIC_EXE = "$magic_exe";
+const char * LIB_PATH_VARNAME = "$shlibpath_var";
+EOF
+
+ if test yes = "$shlibpath_overrides_runpath" && 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 yes = "$fast_install"; 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;
+ int rval = 127;
+
+ int i;
+
+ program_name = (char *) xstrdup (base_name (argv[0]));
+ newargz = XMALLOC (char *, (size_t) 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 (STREQ (argv[i], dumpscript_opt))
+ {
+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 (STREQ (argv[i], debug_opt))
+ {
+ lt_debug = 1;
+ continue;
+ }
+ if (STREQ (argv[i], ltwrapper_option_prefix))
+ {
+ /* 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) $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 = (int) _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];
+ size_t 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 = (size_t) (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 (STREQ (str, pat))
+ *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
+ size_t 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)
+ {
+ size_t orig_value_len = strlen (orig_value);
+ size_t 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 #' */
+ size_t len = strlen (new_value);
+ while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
+ {
+ new_value[--len] = '\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 ()
+{
+ $debug_cmd
+
+ case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in
+ *import*) : ;;
+ *) false ;;
+ esac
+}
+
+# func_suncc_cstd_abi
+# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!!
+# Several compiler flags select an ABI that is incompatible with the
+# Cstd library. Avoid specifying it if any are in CXXFLAGS.
+func_suncc_cstd_abi ()
+{
+ $debug_cmd
+
+ case " $compile_command " in
+ *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*)
+ suncc_use_cstd_abi=no
+ ;;
+ *)
+ suncc_use_cstd_abi=yes
+ ;;
+ esac
+}
+
+# func_mode_link arg...
+func_mode_link ()
+{
+ $debug_cmd
+
+ 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
+ # what 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 that 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=
+ os2dllname=
+ non_pic_objects=
+ precious_files_regex=
+ prefer_static_libs=no
+ preload=false
+ 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 yes != "$build_libtool_libs" \
+ && func_fatal_configuration "cannot build a shared library"
+ build_old_libs=no
+ break
+ ;;
+ -all-static | -static | -static-libtool-libs)
+ case $arg in
+ -all-static)
+ if test yes = "$build_libtool_libs" && 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)
+ $preload || {
+ # Add the symbol object into the linking commands.
+ func_append compile_command " @SYMFILE@"
+ func_append finalize_command " @SYMFILE@"
+ preload=:
+ }
+ case $arg in
+ *.la | *.lo) ;; # We handle these cases below.
+ force)
+ if test no = "$dlself"; then
+ dlself=needless
+ export_dynamic=yes
+ fi
+ prev=
+ continue
+ ;;
+ self)
+ if test dlprefiles = "$prev"; then
+ dlself=yes
+ elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then
+ dlself=yes
+ else
+ dlself=needless
+ export_dynamic=yes
+ fi
+ prev=
+ continue
+ ;;
+ *)
+ if test dlfiles = "$prev"; 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
+ ;;
+ mllvm)
+ # Clang does not use LLVM to link, so we can simply discard any
+ # '-mllvm $arg' options when doing the link step.
+ 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 none = "$pic_object" &&
+ test none = "$non_pic_object"; 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 none != "$pic_object"; then
+ # Prepend the subdirectory the object is found in.
+ pic_object=$xdir$pic_object
+
+ if test dlfiles = "$prev"; then
+ if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; 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 dlprefiles = "$prev"; 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 none != "$non_pic_object"; 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 none = "$pic_object"; 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
+ ;;
+ os2dllname)
+ os2dllname=$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 rpath = "$prev"; 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-export-symbols = "X$arg"; 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-lc = "X$arg" || test X-lm = "X$arg"; 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-lc = "X$arg" && continue
+ ;;
+ *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*)
+ # Do not include libc due to us having libc/libc_r.
+ test X-lc = "X$arg" && 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-lc = "X$arg" && continue
+ ;;
+ *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+ # Compiler inserts libc in the correct place for threads to work
+ test X-lc = "X$arg" && continue
+ ;;
+ esac
+ elif test X-lc_r = "X$arg"; then
+ case $host in
+ *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*)
+ # Do not include libc_r directly, use -pthread flag.
+ continue
+ ;;
+ esac
+ fi
+ func_append deplibs " $arg"
+ continue
+ ;;
+
+ -mllvm)
+ prev=mllvm
+ 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
+ ;;
+
+ -os2dllname)
+ prev=os2dllname
+ 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
+ # -fstack-protector* stack protector flags for GCC
+ # @file GCC response files
+ # -tp=* Portland pgcc target processor selection
+ # --sysroot=* for sysroot support
+ # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
+ # -specs=* GCC specs files
+ # -stdlib=* select c++ std lib with clang
+ # -fsanitize=* Clang/GCC memory and address sanitizer
+ # -fuse-ld=* Linker select flags for GCC
+ # -static-* direct GCC to link specific libraries statically
+ # -fcilkplus Cilk Plus language extension features for C/C++
+ -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*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \
+ -specs=*|-fsanitize=*|-fuse-ld=*|-static-*|-fcilkplus)
+ 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
+ ;;
+
+ -Z*)
+ if test os2 = "`expr $host : '.*\(os2\)'`"; then
+ # OS/2 uses -Zxxx to specify OS/2-specific options
+ compiler_flags="$compiler_flags $arg"
+ func_append compile_command " $arg"
+ func_append finalize_command " $arg"
+ case $arg in
+ -Zlinker | -Zstack)
+ prev=xcompiler
+ ;;
+ esac
+ continue
+ else
+ # Otherwise treat like 'Some other compiler flag' below
+ func_quote_for_eval "$arg"
+ arg=$func_quote_for_eval_result
+ fi
+ ;;
+
+ # 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 none = "$pic_object" &&
+ test none = "$non_pic_object"; then
+ func_fatal_error "cannot find name of object for '$arg'"
+ fi
+
+ # Extract subdirectory from the argument.
+ func_dirname "$arg" "/" ""
+ xdir=$func_dirname_result
+
+ test none = "$pic_object" || {
+ # Prepend the subdirectory the object is found in.
+ pic_object=$xdir$pic_object
+
+ if test dlfiles = "$prev"; then
+ if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; 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 dlprefiles = "$prev"; then
+ # Preload the old-style object.
+ func_append dlprefiles " $pic_object"
+ prev=
+ fi
+
+ # A PIC object.
+ func_append libobjs " $pic_object"
+ arg=$pic_object
+ }
+
+ # Non-PIC object.
+ if test none != "$non_pic_object"; 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 none = "$pic_object"; 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 dlfiles = "$prev"; then
+ # This library was specified with -dlopen.
+ func_append dlfiles " $func_resolve_sysroot_result"
+ prev=
+ elif test dlprefiles = "$prev"; 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 yes = "$export_dynamic" && 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\"
+
+ # Definition is injected by LT_CONFIG during libtool generation.
+ func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH"
+
+ 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 lib = "$linkmode"; 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=false
+ 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 lib,link = "$linkmode,$pass"; 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 lib,link = "$linkmode,$pass" ||
+ test prog,scan = "$linkmode,$pass"; then
+ libs=$deplibs
+ deplibs=
+ fi
+ if test prog = "$linkmode"; then
+ case $pass in
+ dlopen) libs=$dlfiles ;;
+ dlpreopen) libs=$dlprefiles ;;
+ link)
+ libs="$deplibs %DEPLIBS%"
+ test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs"
+ ;;
+ esac
+ fi
+ if test lib,dlpreopen = "$linkmode,$pass"; 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 dlopen = "$pass"; then
+ # Collect dlpreopened libraries
+ save_deplibs=$deplibs
+ deplibs=
+ fi
+
+ for deplib in $libs; do
+ lib=
+ found=false
+ case $deplib in
+ -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
+ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
+ if test prog,link = "$linkmode,$pass"; then
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ func_append compiler_flags " $deplib"
+ if test lib = "$linkmode"; then
+ case "$new_inherited_linker_flags " in
+ *" $deplib "*) ;;
+ * ) func_append new_inherited_linker_flags " $deplib" ;;
+ esac
+ fi
+ fi
+ continue
+ ;;
+ -l*)
+ if test lib != "$linkmode" && test prog != "$linkmode"; then
+ func_warning "'-l' is ignored for archives/objects"
+ continue
+ fi
+ func_stripname '-l' '' "$deplib"
+ name=$func_stripname_result
+ if test lib = "$linkmode"; 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 .la = "$search_ext"; then
+ found=:
+ else
+ found=false
+ fi
+ break 2
+ fi
+ done
+ done
+ if $found; then
+ # 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 yes = "$allow_libtool_libs_with_static_runtimes"; 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=false
+ func_dirname "$lib" "" "."
+ ladir=$func_dirname_result
+ lib=$ladir/$old_library
+ if test prog,link = "$linkmode,$pass"; then
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ deplibs="$deplib $deplibs"
+ test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs"
+ fi
+ continue
+ fi
+ fi
+ ;;
+ *) ;;
+ esac
+ fi
+ else
+ # deplib doesn't seem to be a libtool library
+ if test prog,link = "$linkmode,$pass"; then
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ deplibs="$deplib $deplibs"
+ test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs"
+ fi
+ continue
+ fi
+ ;; # -l
+ *.ltframework)
+ if test prog,link = "$linkmode,$pass"; then
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ deplibs="$deplib $deplibs"
+ if test lib = "$linkmode"; 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 conv = "$pass" && 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 conv = "$pass"; then
+ deplibs="$deplib $deplibs"
+ continue
+ fi
+ if test scan = "$pass"; 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 link = "$pass"; 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 conv = "$pass"; 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=false
+ 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=:
+ fi
+ ;;
+ pass_all)
+ valid_a_lib=:
+ ;;
+ esac
+ if $valid_a_lib; then
+ echo
+ $ECHO "*** Warning: Linking the shared library $output against the"
+ $ECHO "*** static library $deplib is not portable!"
+ deplibs="$deplib $deplibs"
+ else
+ 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."
+ fi
+ ;;
+ esac
+ continue
+ ;;
+ prog)
+ if test link != "$pass"; then
+ deplibs="$deplib $deplibs"
+ else
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ fi
+ continue
+ ;;
+ esac # linkmode
+ ;; # *.$libext
+ *.lo | *.$objext)
+ if test conv = "$pass"; then
+ deplibs="$deplib $deplibs"
+ elif test prog = "$linkmode"; then
+ if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; 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=:
+ continue
+ ;;
+ esac # case $deplib
+
+ $found || test -f "$lib" \
+ || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'"
+
+ # 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 lib,link = "$linkmode,$pass" ||
+ test prog,scan = "$linkmode,$pass" ||
+ { test prog != "$linkmode" && test lib != "$linkmode"; }; then
+ test -n "$dlopen" && func_append dlfiles " $dlopen"
+ test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen"
+ fi
+
+ if test conv = "$pass"; 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"
+ 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
+ elif test prog != "$linkmode" && test lib != "$linkmode"; then
+ func_fatal_error "'$lib' is not a convenience library"
+ fi
+ continue
+ fi # $pass = conv
+
+
+ # Get the name of the library we link against.
+ linklib=
+ if test -n "$old_library" &&
+ { test yes = "$prefer_static_libs" ||
+ test built,no = "$prefer_static_libs,$installed"; }; 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 dlopen = "$pass"; then
+ test -z "$libdir" \
+ && func_fatal_error "cannot -dlopen a convenience library: '$lib'"
+ if test -z "$dlname" ||
+ test yes != "$dlopen_support" ||
+ test no = "$build_libtool_libs"
+ 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 yes = "$installed"; 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 yes = "$hardcode_automatic" && 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 dlpreopen = "$pass"; then
+ if test -z "$libdir" && test prog = "$linkmode"; 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 lib = "$linkmode"; then
+ deplibs="$dir/$old_library $deplibs"
+ elif test prog,link = "$linkmode,$pass"; 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 prog = "$linkmode" && test link != "$pass"; then
+ func_append newlib_search_path " $ladir"
+ deplibs="$lib $deplibs"
+
+ linkalldeplibs=false
+ if test no != "$link_all_deplibs" || test -z "$library_names" ||
+ test no = "$build_libtool_libs"; then
+ linkalldeplibs=:
+ 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 $linkalldeplibs; 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 prog,link = "$linkmode,$pass"; then
+ if test -n "$library_names" &&
+ { { test no = "$prefer_static_libs" ||
+ test built,yes = "$prefer_static_libs,$installed"; } ||
+ 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 $alldeplibs &&
+ { test pass_all = "$deplibs_check_method" ||
+ { test yes = "$build_libtool_libs" &&
+ 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 built = "$use_static_libs" && test yes = "$installed"; then
+ use_static_libs=no
+ fi
+ if test -n "$library_names" &&
+ { test no = "$use_static_libs" || test -z "$old_library"; }; then
+ case $host in
+ *cygwin* | *mingw* | *cegcc* | *os2*)
+ # No point in relinking DLLs because paths are not encoded
+ func_append notinst_deplibs " $lib"
+ need_relink=no
+ ;;
+ *)
+ if test no = "$installed"; 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 yes = "$shouldnotlink" && test link = "$pass"; then
+ echo
+ if test prog = "$linkmode"; 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 lib = "$linkmode" &&
+ test yes = "$hardcode_into_libs"; 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* | *os2*)
+ 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 prog = "$linkmode" || test relink != "$opt_mode"; then
+ add_shlibpath=
+ add_dir=
+ add=
+ lib_linked=yes
+ case $hardcode_action in
+ immediate | unsupported)
+ if test no = "$hardcode_direct"; 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 cannot
+ # 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 no = "$hardcode_minus_L"; then
+ case $host in
+ *-*-sunos*) add_shlibpath=$dir ;;
+ esac
+ add_dir=-L$dir
+ add=-l$name
+ elif test no = "$hardcode_shlibpath_var"; then
+ add_shlibpath=$dir
+ add=-l$name
+ else
+ lib_linked=no
+ fi
+ ;;
+ relink)
+ if test yes = "$hardcode_direct" &&
+ test no = "$hardcode_direct_absolute"; then
+ add=$dir/$linklib
+ elif test yes = "$hardcode_minus_L"; 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 yes = "$hardcode_shlibpath_var"; then
+ add_shlibpath=$dir
+ add=-l$name
+ else
+ lib_linked=no
+ fi
+ ;;
+ *) lib_linked=no ;;
+ esac
+
+ if test yes != "$lib_linked"; 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 prog = "$linkmode"; 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 yes != "$hardcode_direct" &&
+ test yes != "$hardcode_minus_L" &&
+ test yes = "$hardcode_shlibpath_var"; then
+ case :$finalize_shlibpath: in
+ *":$libdir:"*) ;;
+ *) func_append finalize_shlibpath "$libdir:" ;;
+ esac
+ fi
+ fi
+ fi
+
+ if test prog = "$linkmode" || test relink = "$opt_mode"; then
+ add_shlibpath=
+ add_dir=
+ add=
+ # Finalize command for both is simple: just hardcode it.
+ if test yes = "$hardcode_direct" &&
+ test no = "$hardcode_direct_absolute"; then
+ add=$libdir/$linklib
+ elif test yes = "$hardcode_minus_L"; then
+ add_dir=-L$libdir
+ add=-l$name
+ elif test yes = "$hardcode_shlibpath_var"; then
+ case :$finalize_shlibpath: in
+ *":$libdir:"*) ;;
+ *) func_append finalize_shlibpath "$libdir:" ;;
+ esac
+ add=-l$name
+ elif test yes = "$hardcode_automatic"; 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 prog = "$linkmode"; 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 prog = "$linkmode"; 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 unsupported != "$hardcode_direct"; 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 yes = "$build_libtool_libs"; then
+ # Not a shared library
+ if test pass_all != "$deplibs_check_method"; 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 cannot 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 yes = "$module"; 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 no = "$build_old_libs"; 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 lib = "$linkmode"; then
+ if test -n "$dependency_libs" &&
+ { test yes != "$hardcode_into_libs" ||
+ test yes = "$build_old_libs" ||
+ test yes = "$link_static"; }; 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 no = "$link_static" && 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 no != "$link_all_deplibs"; 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 link = "$pass"; then
+ if test prog = "$linkmode"; 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 dlpreopen = "$pass"; then
+ # Link the dlpreopened libraries before other libraries
+ for deplib in $save_deplibs; do
+ deplibs="$deplib $deplibs"
+ done
+ fi
+ if test dlopen != "$pass"; then
+ test conv = "$pass" || {
+ # 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=
+ }
+
+ if test prog,link = "$linkmode,$pass"; then
+ vars="compile_deplibs finalize_deplibs"
+ else
+ vars=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
+
+ # Add Sun CC postdeps if required:
+ test CXX = "$tagname" && {
+ case $host_os in
+ linux*)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*) # Sun C++ 5.9
+ func_suncc_cstd_abi
+
+ if test no != "$suncc_use_cstd_abi"; then
+ func_append postdeps ' -library=Cstd -library=Crun'
+ fi
+ ;;
+ esac
+ ;;
+
+ solaris*)
+ func_cc_basename "$CC"
+ case $func_cc_basename_result in
+ CC* | sunCC*)
+ func_suncc_cstd_abi
+
+ if test no != "$suncc_use_cstd_abi"; then
+ func_append postdeps ' -library=Cstd -library=Crun'
+ fi
+ ;;
+ esac
+ ;;
+ esac
+ }
+
+ # 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 prog = "$linkmode"; then
+ dlfiles=$newdlfiles
+ fi
+ if test prog = "$linkmode" || test lib = "$linkmode"; then
+ dlprefiles=$newdlprefiles
+ fi
+
+ case $linkmode in
+ oldlib)
+ if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; 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 no = "$module" \
+ && func_fatal_help "libtool library '$output' must begin with 'lib'"
+
+ if test no != "$need_lib_prefix"; 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 pass_all != "$deplibs_check_method"; 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 no = "$dlself" \
+ || func_warning "'-dlopen self' is ignored for libtool libraries"
+
+ set dummy $rpath
+ shift
+ test 1 -lt "$#" \
+ && func_warning "ignoring multiple '-rpath's for a libtool library"
+
+ install_libdir=$1
+
+ oldlibs=
+ if test -z "$rpath"; then
+ if test yes = "$build_libtool_libs"; 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
+ # that has an extra 1 added just for fun
+ #
+ case $version_type in
+ # correct linux to gnu/linux during the next big refactor
+ darwin|freebsd-elf|linux|osf|windows|none)
+ func_arith $number_major + $number_minor
+ current=$func_arith_result
+ age=$number_minor
+ revision=$number_revision
+ ;;
+ freebsd-aout|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
+ ;;
+ *)
+ func_fatal_configuration "$modename: unknown library version type '$version_type'"
+ ;;
+ 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"
+ # On Darwin other compilers
+ case $CC in
+ nagfor*)
+ verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision"
+ ;;
+ *)
+ verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+ ;;
+ esac
+ ;;
+
+ freebsd-aout)
+ major=.$current
+ versuffix=.$current.$revision
+ ;;
+
+ freebsd-elf)
+ func_arith $current - $age
+ major=.$func_arith_result
+ versuffix=$major.$age.$revision
+ ;;
+
+ irix | nonstopux)
+ if test no = "$lt_irix_increment"; 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 0 -ne "$loop"; 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 0 -ne "$loop"; 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
+ ;;
+
+ sco)
+ major=.$current
+ versuffix=.$current
+ ;;
+
+ sunos)
+ major=.$current
+ versuffix=.$current.$revision
+ ;;
+
+ windows)
+ # Use '-' rather than '.', since we only want one
+ # extension on DOS 8.3 file systems.
+ 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 no = "$need_version"; then
+ versuffix=
+ else
+ versuffix=.0.0
+ fi
+ fi
+
+ # Remove version info from name if versioning should be avoided
+ if test yes,no = "$avoid_version,$need_version"; then
+ major=
+ versuffix=
+ verstring=
+ fi
+
+ # Check to see if the archive will have undefined symbols.
+ if test yes = "$allow_undefined"; then
+ if test unsupported = "$allow_undefined_flag"; then
+ if test yes = "$build_old_libs"; then
+ func_warning "undefined symbols not allowed in $host shared libraries; building static only"
+ build_libtool_libs=no
+ else
+ func_fatal_error "can't build $host shared library unless -no-undefined is specified"
+ fi
+ fi
+ else
+ # Don't allow undefined symbols.
+ allow_undefined_flag=$no_undefined_flag
+ fi
+
+ fi
+
+ func_generate_dlsyms "$libname" "$libname" :
+ func_append libobjs " $symfileobj"
+ test " " = "$libobjs" && libobjs=
+
+ if test relink != "$opt_mode"; 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 -n "$precious_files_regex"; 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 yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; 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 yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; 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 yes = "$build_libtool_libs"; 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 yes = "$build_libtool_need_lc"; 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 yes = "$allow_libtool_libs_with_static_runtimes"; 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 yes = "$allow_libtool_libs_with_static_runtimes"; 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 yes = "$allow_libtool_libs_with_static_runtimes"; 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 yes = "$want_nocaseglob" && nocaseglob=`shopt -p nocaseglob`
+ for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+ if test yes = "$want_nocaseglob"; 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 yes = "$allow_libtool_libs_with_static_runtimes"; 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 yes = "$allow_libtool_libs_with_static_runtimes"; 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 none = "$deplibs_check_method"; 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 yes = "$droppeddeps"; then
+ if test yes = "$module"; 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 no = "$build_old_libs"; 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 no = "$allow_undefined"; 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 no = "$build_old_libs"; 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 yes = "$build_libtool_libs"; then
+ # Remove $wl instances when linking with ld.
+ # FIXME: should test the right _cmds variable.
+ case $archive_cmds in
+ *\$LD\ *) wl= ;;
+ esac
+ if test yes = "$hardcode_into_libs"; then
+ # Hardcode the library paths
+ hardcode_libdirs=
+ dep_rpath=
+ rpath=$finalize_rpath
+ test relink = "$opt_mode" || 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 relink = "$opt_mode" || 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
+ func_dll_def_p "$export_symbols" || {
+ # 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
+ ;;
+ esac
+
+ # Prepare the list of exported symbols
+ if test -z "$export_symbols"; then
+ if test yes = "$always_export_symbols" || 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 yes = "$try_normal_branch" \
+ && { 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 : != "$skipped_export"; 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 : != "$skipped_export" && 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 yes = "$compiler_needs_object" &&
+ 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 yes = "$thread_safe" && 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 relink = "$opt_mode"; 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 yes = "$module" && 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 : != "$skipped_export" &&
+ 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 : != "$skipped_export" && test yes = "$with_gnu_ld"; 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 : != "$skipped_export" && test -n "$file_list_spec"; then
+ output=$output_objdir/$output_la.lnk
+ func_verbose "creating linker input file list: $output"
+ : > $output
+ set x $save_libobjs
+ shift
+ firstobj=
+ if test yes = "$compiler_needs_object"; 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 -z "$objlist" ||
+ 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 1 -eq "$k"; 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
+
+ ${skipped_export-false} && {
+ 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
+ }
+
+ 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_quiet || {
+ 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 relink = "$opt_mode"; 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
+
+ ${skipped_export-false} && {
+ 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
+ }
+
+ 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 yes = "$module" && 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=$sp$nl
+ eval cmd=\"$cmd\"
+ IFS=$save_ifs
+ $opt_quiet || {
+ 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 relink = "$opt_mode"; 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 relink = "$opt_mode"; 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 yes = "$module" || test yes = "$export_dynamic"; then
+ # On all known operating systems, these are identical.
+ dlname=$soname
+ fi
+ fi
+ ;;
+
+ obj)
+ if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; 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=
+ # if reload_cmds runs $LD directly, get rid of -Wl from
+ # whole_archive_flag_spec and hope we can get by with turning comma
+ # into space.
+ case $reload_cmds in
+ *\$LD[\ \$]*) wl= ;;
+ esac
+ if test -n "$convenience"; then
+ if test -n "$whole_archive_flag_spec"; then
+ eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
+ test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
+ reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags
+ 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 yes = "$build_libtool_libs" || 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
+
+ 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
+
+ test yes = "$build_libtool_libs" || {
+ 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
+ }
+
+ if test -n "$pic_flag" || test default != "$pic_mode"; 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"
+
+ $preload \
+ && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \
+ && 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 CXX = "$tagname"; 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 yes = "$build_old_libs"; 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@" false
+
+ # template prelinking step
+ if test -n "$prelink_cmds"; then
+ func_execute_cmds "$prelink_cmds" 'exit $?'
+ fi
+
+ wrappers_required=:
+ case $host in
+ *cegcc* | *mingw32ce*)
+ # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.
+ wrappers_required=false
+ ;;
+ *cygwin* | *mingw* )
+ test yes = "$build_libtool_libs" || wrappers_required=false
+ ;;
+ *)
+ if test no = "$need_relink" || test yes != "$build_libtool_libs"; then
+ wrappers_required=false
+ fi
+ ;;
+ esac
+ $wrappers_required || {
+ # 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
+ }
+
+ 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 yes = "$no_install"; 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
+
+ case $hardcode_action,$fast_install in
+ relink,*)
+ # 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"
+ ;;
+ *,yes)
+ link_command=$finalize_var$compile_command$finalize_rpath
+ relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
+ ;;
+ *,no)
+ link_command=$compile_var$compile_command$compile_rpath
+ relink_command=$finalize_var$finalize_command$finalize_rpath
+ ;;
+ *,needless)
+ link_command=$finalize_var$compile_command$finalize_rpath
+ relink_command=
+ ;;
+ esac
+
+ # 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
+
+ case $build_libtool_libs in
+ convenience)
+ oldobjs="$libobjs_save $symfileobj"
+ addlibs=$convenience
+ build_libtool_libs=no
+ ;;
+ module)
+ oldobjs=$libobjs_save
+ addlibs=$old_convenience
+ build_libtool_libs=no
+ ;;
+ *)
+ oldobjs="$old_deplibs $non_pic_objects"
+ $preload && test -f "$symfileobj" \
+ && func_append oldobjs " $symfileobj"
+ addlibs=$old_convenience
+ ;;
+ esac
+
+ 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 yes = "$build_libtool_libs"; 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 -z "$oldobjs"; 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 yes = "$build_old_libs" && 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 yes = "$hardcode_automatic"; then
+ relink_command=
+ fi
+
+ # Only create the output if not a dry run.
+ $opt_dry_run || {
+ for installed in no yes; do
+ if test yes = "$installed"; 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 -n "$bindir"; 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) $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 cannot 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 no,yes = "$installed,$need_relink"; 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
+}
+
+if test link = "$opt_mode" || test relink = "$opt_mode"; then
+ func_mode_link ${1+"$@"}
+fi
+
+
+# func_mode_uninstall arg...
+func_mode_uninstall ()
+{
+ $debug_cmd
+
+ RM=$nonopt
+ files=
+ rmforce=false
+ 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=: ;;
+ -*) 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 . = "$dir"; then
+ odir=$objdir
+ else
+ odir=$dir/$objdir
+ fi
+ func_basename "$file"
+ name=$func_basename_result
+ test uninstall = "$opt_mode" && odir=$dir
+
+ # Remember odir for removal later, being careful to avoid duplicates
+ if test clean = "$opt_mode"; 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 $rmforce; 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" '$rmforce || exit_status=1'
+ fi
+
+ if test -n "$old_library"; then
+ # Do each command in the old_postuninstall commands.
+ func_execute_cmds "$old_postuninstall_cmds" '$rmforce || 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 none != "$pic_object"; 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 none != "$non_pic_object"; then
+ func_append rmfiles " $dir/$non_pic_object"
+ fi
+ fi
+ ;;
+
+ *)
+ if test clean = "$opt_mode"; 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 yes = "$fast_install" && 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
+}
+
+if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then
+ func_mode_uninstall ${1+"$@"}
+fi
+
+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
+# where 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:
diff --git a/m4/ax_cxx_compile_stdcxx.m4 b/m4/ax_cxx_compile_stdcxx.m4
new file mode 100644
index 0000000..43087b2
--- /dev/null
+++ b/m4/ax_cxx_compile_stdcxx.m4
@@ -0,0 +1,951 @@
+# ===========================================================================
+# https://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+# AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional])
+#
+# DESCRIPTION
+#
+# Check for baseline language coverage in the compiler for the specified
+# version of the C++ standard. If necessary, add switches to CXX and
+# CXXCPP to enable support. VERSION may be '11' (for the C++11 standard)
+# or '14' (for the C++14 standard).
+#
+# The second argument, if specified, indicates whether you insist on an
+# extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g.
+# -std=c++11). If neither is specified, you get whatever works, with
+# preference for an extended mode.
+#
+# The third argument, if specified 'mandatory' or if left unspecified,
+# indicates that baseline support for the specified C++ standard is
+# required and that the macro should error out if no mode with that
+# support is found. If specified 'optional', then configuration proceeds
+# regardless, after defining HAVE_CXX${VERSION} if and only if a
+# supporting mode is found.
+#
+# LICENSE
+#
+# Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com>
+# Copyright (c) 2012 Zack Weinberg <zackw@panix.com>
+# Copyright (c) 2013 Roy Stogner <roystgnr@ices.utexas.edu>
+# Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov <sokolov@google.com>
+# Copyright (c) 2015 Paul Norman <penorman@mac.com>
+# Copyright (c) 2015 Moritz Klammler <moritz@klammler.eu>
+# Copyright (c) 2016, 2018 Krzesimir Nowak <qdlacz@gmail.com>
+# Copyright (c) 2019 Enji Cooper <yaneurabeya@gmail.com>
+#
+# Copying and distribution of this file, with or without modification, are
+# permitted in any medium without royalty provided the copyright notice
+# and this notice are preserved. This file is offered as-is, without any
+# warranty.
+
+#serial 11
+
+dnl This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro
+dnl (serial version number 13).
+
+AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl
+ m4_if([$1], [11], [ax_cxx_compile_alternatives="11 0x"],
+ [$1], [14], [ax_cxx_compile_alternatives="14 1y"],
+ [$1], [17], [ax_cxx_compile_alternatives="17 1z"],
+ [m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl
+ m4_if([$2], [], [],
+ [$2], [ext], [],
+ [$2], [noext], [],
+ [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl
+ m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true],
+ [$3], [mandatory], [ax_cxx_compile_cxx$1_required=true],
+ [$3], [optional], [ax_cxx_compile_cxx$1_required=false],
+ [m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])])
+ AC_LANG_PUSH([C++])dnl
+ ac_success=no
+
+ m4_if([$2], [noext], [], [dnl
+ if test x$ac_success = xno; then
+ for alternative in ${ax_cxx_compile_alternatives}; do
+ switch="-std=gnu++${alternative}"
+ cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
+ AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
+ $cachevar,
+ [ac_save_CXX="$CXX"
+ CXX="$CXX $switch"
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
+ [eval $cachevar=yes],
+ [eval $cachevar=no])
+ CXX="$ac_save_CXX"])
+ if eval test x\$$cachevar = xyes; then
+ CXX="$CXX $switch"
+ if test -n "$CXXCPP" ; then
+ CXXCPP="$CXXCPP $switch"
+ fi
+ ac_success=yes
+ break
+ fi
+ done
+ fi])
+
+ m4_if([$2], [ext], [], [dnl
+ if test x$ac_success = xno; then
+ dnl HP's aCC needs +std=c++11 according to:
+ dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf
+ dnl Cray's crayCC needs "-h std=c++11"
+ for alternative in ${ax_cxx_compile_alternatives}; do
+ for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}"; do
+ cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
+ AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
+ $cachevar,
+ [ac_save_CXX="$CXX"
+ CXX="$CXX $switch"
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
+ [eval $cachevar=yes],
+ [eval $cachevar=no])
+ CXX="$ac_save_CXX"])
+ if eval test x\$$cachevar = xyes; then
+ CXX="$CXX $switch"
+ if test -n "$CXXCPP" ; then
+ CXXCPP="$CXXCPP $switch"
+ fi
+ ac_success=yes
+ break
+ fi
+ done
+ if test x$ac_success = xyes; then
+ break
+ fi
+ done
+ fi])
+ AC_LANG_POP([C++])
+ if test x$ax_cxx_compile_cxx$1_required = xtrue; then
+ if test x$ac_success = xno; then
+ AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.])
+ fi
+ fi
+ if test x$ac_success = xno; then
+ HAVE_CXX$1=0
+ AC_MSG_NOTICE([No compiler with C++$1 support was found])
+ else
+ HAVE_CXX$1=1
+ AC_DEFINE(HAVE_CXX$1,1,
+ [define if the compiler supports basic C++$1 syntax])
+ fi
+ AC_SUBST(HAVE_CXX$1)
+])
+
+
+dnl Test body for checking C++11 support
+
+m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11],
+ _AX_CXX_COMPILE_STDCXX_testbody_new_in_11
+)
+
+
+dnl Test body for checking C++14 support
+
+m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14],
+ _AX_CXX_COMPILE_STDCXX_testbody_new_in_11
+ _AX_CXX_COMPILE_STDCXX_testbody_new_in_14
+)
+
+m4_define([_AX_CXX_COMPILE_STDCXX_testbody_17],
+ _AX_CXX_COMPILE_STDCXX_testbody_new_in_11
+ _AX_CXX_COMPILE_STDCXX_testbody_new_in_14
+ _AX_CXX_COMPILE_STDCXX_testbody_new_in_17
+)
+
+dnl Tests for new features in C++11
+
+m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[
+
+// If the compiler admits that it is not ready for C++11, why torture it?
+// Hopefully, this will speed up the test.
+
+#ifndef __cplusplus
+
+#error "This is not a C++ compiler"
+
+#elif __cplusplus < 201103L
+
+#error "This is not a C++11 compiler"
+
+#else
+
+namespace cxx11
+{
+
+ namespace test_static_assert
+ {
+
+ template <typename T>
+ struct check
+ {
+ static_assert(sizeof(int) <= sizeof(T), "not big enough");
+ };
+
+ }
+
+ namespace test_final_override
+ {
+
+ struct Base
+ {
+ virtual ~Base() {}
+ virtual void f() {}
+ };
+
+ struct Derived : public Base
+ {
+ virtual ~Derived() override {}
+ virtual void f() override {}
+ };
+
+ }
+
+ namespace test_double_right_angle_brackets
+ {
+
+ template < typename T >
+ struct check {};
+
+ typedef check<void> single_type;
+ typedef check<check<void>> double_type;
+ typedef check<check<check<void>>> triple_type;
+ typedef check<check<check<check<void>>>> quadruple_type;
+
+ }
+
+ namespace test_decltype
+ {
+
+ int
+ f()
+ {
+ int a = 1;
+ decltype(a) b = 2;
+ return a + b;
+ }
+
+ }
+
+ namespace test_type_deduction
+ {
+
+ template < typename T1, typename T2 >
+ struct is_same
+ {
+ static const bool value = false;
+ };
+
+ template < typename T >
+ struct is_same<T, T>
+ {
+ static const bool value = true;
+ };
+
+ template < typename T1, typename T2 >
+ auto
+ add(T1 a1, T2 a2) -> decltype(a1 + a2)
+ {
+ return a1 + a2;
+ }
+
+ int
+ test(const int c, volatile int v)
+ {
+ static_assert(is_same<int, decltype(0)>::value == true, "");
+ static_assert(is_same<int, decltype(c)>::value == false, "");
+ static_assert(is_same<int, decltype(v)>::value == false, "");
+ auto ac = c;
+ auto av = v;
+ auto sumi = ac + av + 'x';
+ auto sumf = ac + av + 1.0;
+ static_assert(is_same<int, decltype(ac)>::value == true, "");
+ static_assert(is_same<int, decltype(av)>::value == true, "");
+ static_assert(is_same<int, decltype(sumi)>::value == true, "");
+ static_assert(is_same<int, decltype(sumf)>::value == false, "");
+ static_assert(is_same<int, decltype(add(c, v))>::value == true, "");
+ return (sumf > 0.0) ? sumi : add(c, v);
+ }
+
+ }
+
+ namespace test_noexcept
+ {
+
+ int f() { return 0; }
+ int g() noexcept { return 0; }
+
+ static_assert(noexcept(f()) == false, "");
+ static_assert(noexcept(g()) == true, "");
+
+ }
+
+ namespace test_constexpr
+ {
+
+ template < typename CharT >
+ unsigned long constexpr
+ strlen_c_r(const CharT *const s, const unsigned long acc) noexcept
+ {
+ return *s ? strlen_c_r(s + 1, acc + 1) : acc;
+ }
+
+ template < typename CharT >
+ unsigned long constexpr
+ strlen_c(const CharT *const s) noexcept
+ {
+ return strlen_c_r(s, 0UL);
+ }
+
+ static_assert(strlen_c("") == 0UL, "");
+ static_assert(strlen_c("1") == 1UL, "");
+ static_assert(strlen_c("example") == 7UL, "");
+ static_assert(strlen_c("another\0example") == 7UL, "");
+
+ }
+
+ namespace test_rvalue_references
+ {
+
+ template < int N >
+ struct answer
+ {
+ static constexpr int value = N;
+ };
+
+ answer<1> f(int&) { return answer<1>(); }
+ answer<2> f(const int&) { return answer<2>(); }
+ answer<3> f(int&&) { return answer<3>(); }
+
+ void
+ test()
+ {
+ int i = 0;
+ const int c = 0;
+ static_assert(decltype(f(i))::value == 1, "");
+ static_assert(decltype(f(c))::value == 2, "");
+ static_assert(decltype(f(0))::value == 3, "");
+ }
+
+ }
+
+ namespace test_uniform_initialization
+ {
+
+ struct test
+ {
+ static const int zero {};
+ static const int one {1};
+ };
+
+ static_assert(test::zero == 0, "");
+ static_assert(test::one == 1, "");
+
+ }
+
+ namespace test_lambdas
+ {
+
+ void
+ test1()
+ {
+ auto lambda1 = [](){};
+ auto lambda2 = lambda1;
+ lambda1();
+ lambda2();
+ }
+
+ int
+ test2()
+ {
+ auto a = [](int i, int j){ return i + j; }(1, 2);
+ auto b = []() -> int { return '0'; }();
+ auto c = [=](){ return a + b; }();
+ auto d = [&](){ return c; }();
+ auto e = [a, &b](int x) mutable {
+ const auto identity = [](int y){ return y; };
+ for (auto i = 0; i < a; ++i)
+ a += b--;
+ return x + identity(a + b);
+ }(0);
+ return a + b + c + d + e;
+ }
+
+ int
+ test3()
+ {
+ const auto nullary = [](){ return 0; };
+ const auto unary = [](int x){ return x; };
+ using nullary_t = decltype(nullary);
+ using unary_t = decltype(unary);
+ const auto higher1st = [](nullary_t f){ return f(); };
+ const auto higher2nd = [unary](nullary_t f1){
+ return [unary, f1](unary_t f2){ return f2(unary(f1())); };
+ };
+ return higher1st(nullary) + higher2nd(nullary)(unary);
+ }
+
+ }
+
+ namespace test_variadic_templates
+ {
+
+ template <int...>
+ struct sum;
+
+ template <int N0, int... N1toN>
+ struct sum<N0, N1toN...>
+ {
+ static constexpr auto value = N0 + sum<N1toN...>::value;
+ };
+
+ template <>
+ struct sum<>
+ {
+ static constexpr auto value = 0;
+ };
+
+ static_assert(sum<>::value == 0, "");
+ static_assert(sum<1>::value == 1, "");
+ static_assert(sum<23>::value == 23, "");
+ static_assert(sum<1, 2>::value == 3, "");
+ static_assert(sum<5, 5, 11>::value == 21, "");
+ static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, "");
+
+ }
+
+ // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae
+ // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function
+ // because of this.
+ namespace test_template_alias_sfinae
+ {
+
+ struct foo {};
+
+ template<typename T>
+ using member = typename T::member_type;
+
+ template<typename T>
+ void func(...) {}
+
+ template<typename T>
+ void func(member<T>*) {}
+
+ void test();
+
+ void test() { func<foo>(0); }
+
+ }
+
+} // namespace cxx11
+
+#endif // __cplusplus >= 201103L
+
+]])
+
+
+dnl Tests for new features in C++14
+
+m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[
+
+// If the compiler admits that it is not ready for C++14, why torture it?
+// Hopefully, this will speed up the test.
+
+#ifndef __cplusplus
+
+#error "This is not a C++ compiler"
+
+#elif __cplusplus < 201402L
+
+#error "This is not a C++14 compiler"
+
+#else
+
+namespace cxx14
+{
+
+ namespace test_polymorphic_lambdas
+ {
+
+ int
+ test()
+ {
+ const auto lambda = [](auto&&... args){
+ const auto istiny = [](auto x){
+ return (sizeof(x) == 1UL) ? 1 : 0;
+ };
+ const int aretiny[] = { istiny(args)... };
+ return aretiny[0];
+ };
+ return lambda(1, 1L, 1.0f, '1');
+ }
+
+ }
+
+ namespace test_binary_literals
+ {
+
+ constexpr auto ivii = 0b0000000000101010;
+ static_assert(ivii == 42, "wrong value");
+
+ }
+
+ namespace test_generalized_constexpr
+ {
+
+ template < typename CharT >
+ constexpr unsigned long
+ strlen_c(const CharT *const s) noexcept
+ {
+ auto length = 0UL;
+ for (auto p = s; *p; ++p)
+ ++length;
+ return length;
+ }
+
+ static_assert(strlen_c("") == 0UL, "");
+ static_assert(strlen_c("x") == 1UL, "");
+ static_assert(strlen_c("test") == 4UL, "");
+ static_assert(strlen_c("another\0test") == 7UL, "");
+
+ }
+
+ namespace test_lambda_init_capture
+ {
+
+ int
+ test()
+ {
+ auto x = 0;
+ const auto lambda1 = [a = x](int b){ return a + b; };
+ const auto lambda2 = [a = lambda1(x)](){ return a; };
+ return lambda2();
+ }
+
+ }
+
+ namespace test_digit_separators
+ {
+
+ constexpr auto ten_million = 100'000'000;
+ static_assert(ten_million == 100000000, "");
+
+ }
+
+ namespace test_return_type_deduction
+ {
+
+ auto f(int& x) { return x; }
+ decltype(auto) g(int& x) { return x; }
+
+ template < typename T1, typename T2 >
+ struct is_same
+ {
+ static constexpr auto value = false;
+ };
+
+ template < typename T >
+ struct is_same<T, T>
+ {
+ static constexpr auto value = true;
+ };
+
+ int
+ test()
+ {
+ auto x = 0;
+ static_assert(is_same<int, decltype(f(x))>::value, "");
+ static_assert(is_same<int&, decltype(g(x))>::value, "");
+ return x;
+ }
+
+ }
+
+} // namespace cxx14
+
+#endif // __cplusplus >= 201402L
+
+]])
+
+
+dnl Tests for new features in C++17
+
+m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_17], [[
+
+// If the compiler admits that it is not ready for C++17, why torture it?
+// Hopefully, this will speed up the test.
+
+#ifndef __cplusplus
+
+#error "This is not a C++ compiler"
+
+#elif __cplusplus < 201703L
+
+#error "This is not a C++17 compiler"
+
+#else
+
+#include <initializer_list>
+#include <utility>
+#include <type_traits>
+
+namespace cxx17
+{
+
+ namespace test_constexpr_lambdas
+ {
+
+ constexpr int foo = [](){return 42;}();
+
+ }
+
+ namespace test::nested_namespace::definitions
+ {
+
+ }
+
+ namespace test_fold_expression
+ {
+
+ template<typename... Args>
+ int multiply(Args... args)
+ {
+ return (args * ... * 1);
+ }
+
+ template<typename... Args>
+ bool all(Args... args)
+ {
+ return (args && ...);
+ }
+
+ }
+
+ namespace test_extended_static_assert
+ {
+
+ static_assert (true);
+
+ }
+
+ namespace test_auto_brace_init_list
+ {
+
+ auto foo = {5};
+ auto bar {5};
+
+ static_assert(std::is_same<std::initializer_list<int>, decltype(foo)>::value);
+ static_assert(std::is_same<int, decltype(bar)>::value);
+ }
+
+ namespace test_typename_in_template_template_parameter
+ {
+
+ template<template<typename> typename X> struct D;
+
+ }
+
+ namespace test_fallthrough_nodiscard_maybe_unused_attributes
+ {
+
+ int f1()
+ {
+ return 42;
+ }
+
+ [[nodiscard]] int f2()
+ {
+ [[maybe_unused]] auto unused = f1();
+
+ switch (f1())
+ {
+ case 17:
+ f1();
+ [[fallthrough]];
+ case 42:
+ f1();
+ }
+ return f1();
+ }
+
+ }
+
+ namespace test_extended_aggregate_initialization
+ {
+
+ struct base1
+ {
+ int b1, b2 = 42;
+ };
+
+ struct base2
+ {
+ base2() {
+ b3 = 42;
+ }
+ int b3;
+ };
+
+ struct derived : base1, base2
+ {
+ int d;
+ };
+
+ derived d1 {{1, 2}, {}, 4}; // full initialization
+ derived d2 {{}, {}, 4}; // value-initialized bases
+
+ }
+
+ namespace test_general_range_based_for_loop
+ {
+
+ struct iter
+ {
+ int i;
+
+ int& operator* ()
+ {
+ return i;
+ }
+
+ const int& operator* () const
+ {
+ return i;
+ }
+
+ iter& operator++()
+ {
+ ++i;
+ return *this;
+ }
+ };
+
+ struct sentinel
+ {
+ int i;
+ };
+
+ bool operator== (const iter& i, const sentinel& s)
+ {
+ return i.i == s.i;
+ }
+
+ bool operator!= (const iter& i, const sentinel& s)
+ {
+ return !(i == s);
+ }
+
+ struct range
+ {
+ iter begin() const
+ {
+ return {0};
+ }
+
+ sentinel end() const
+ {
+ return {5};
+ }
+ };
+
+ void f()
+ {
+ range r {};
+
+ for (auto i : r)
+ {
+ [[maybe_unused]] auto v = i;
+ }
+ }
+
+ }
+
+ namespace test_lambda_capture_asterisk_this_by_value
+ {
+
+ struct t
+ {
+ int i;
+ int foo()
+ {
+ return [*this]()
+ {
+ return i;
+ }();
+ }
+ };
+
+ }
+
+ namespace test_enum_class_construction
+ {
+
+ enum class byte : unsigned char
+ {};
+
+ byte foo {42};
+
+ }
+
+ namespace test_constexpr_if
+ {
+
+ template <bool cond>
+ int f ()
+ {
+ if constexpr(cond)
+ {
+ return 13;
+ }
+ else
+ {
+ return 42;
+ }
+ }
+
+ }
+
+ namespace test_selection_statement_with_initializer
+ {
+
+ int f()
+ {
+ return 13;
+ }
+
+ int f2()
+ {
+ if (auto i = f(); i > 0)
+ {
+ return 3;
+ }
+
+ switch (auto i = f(); i + 4)
+ {
+ case 17:
+ return 2;
+
+ default:
+ return 1;
+ }
+ }
+
+ }
+
+ namespace test_template_argument_deduction_for_class_templates
+ {
+
+ template <typename T1, typename T2>
+ struct pair
+ {
+ pair (T1 p1, T2 p2)
+ : m1 {p1},
+ m2 {p2}
+ {}
+
+ T1 m1;
+ T2 m2;
+ };
+
+ void f()
+ {
+ [[maybe_unused]] auto p = pair{13, 42u};
+ }
+
+ }
+
+ namespace test_non_type_auto_template_parameters
+ {
+
+ template <auto n>
+ struct B
+ {};
+
+ B<5> b1;
+ B<'a'> b2;
+
+ }
+
+ namespace test_structured_bindings
+ {
+
+ int arr[2] = { 1, 2 };
+ std::pair<int, int> pr = { 1, 2 };
+
+ auto f1() -> int(&)[2]
+ {
+ return arr;
+ }
+
+ auto f2() -> std::pair<int, int>&
+ {
+ return pr;
+ }
+
+ struct S
+ {
+ int x1 : 2;
+ volatile double y1;
+ };
+
+ S f3()
+ {
+ return {};
+ }
+
+ auto [ x1, y1 ] = f1();
+ auto& [ xr1, yr1 ] = f1();
+ auto [ x2, y2 ] = f2();
+ auto& [ xr2, yr2 ] = f2();
+ const auto [ x3, y3 ] = f3();
+
+ }
+
+ namespace test_exception_spec_type_system
+ {
+
+ struct Good {};
+ struct Bad {};
+
+ void g1() noexcept;
+ void g2();
+
+ template<typename T>
+ Bad
+ f(T*, T*);
+
+ template<typename T1, typename T2>
+ Good
+ f(T1*, T2*);
+
+ static_assert (std::is_same_v<Good, decltype(f(g1, g2))>);
+
+ }
+
+ namespace test_inline_variables
+ {
+
+ template<class T> void f(T)
+ {}
+
+ template<class T> inline T g(T)
+ {
+ return T{};
+ }
+
+ template<> inline void f<>(int)
+ {}
+
+ template<> int g<>(int)
+ {
+ return 5;
+ }
+
+ }
+
+} // namespace cxx17
+
+#endif // __cplusplus < 201703L
+
+]])
diff --git a/m4/ax_cxx_compile_stdcxx_17.m4 b/m4/ax_cxx_compile_stdcxx_17.m4
new file mode 100644
index 0000000..a683417
--- /dev/null
+++ b/m4/ax_cxx_compile_stdcxx_17.m4
@@ -0,0 +1,35 @@
+# =============================================================================
+# https://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_17.html
+# =============================================================================
+#
+# SYNOPSIS
+#
+# AX_CXX_COMPILE_STDCXX_17([ext|noext], [mandatory|optional])
+#
+# DESCRIPTION
+#
+# Check for baseline language coverage in the compiler for the C++17
+# standard; if necessary, add switches to CXX and CXXCPP to enable
+# support.
+#
+# This macro is a convenience alias for calling the AX_CXX_COMPILE_STDCXX
+# macro with the version set to C++17. The two optional arguments are
+# forwarded literally as the second and third argument respectively.
+# Please see the documentation for the AX_CXX_COMPILE_STDCXX macro for
+# more information. If you want to use this macro, you also need to
+# download the ax_cxx_compile_stdcxx.m4 file.
+#
+# LICENSE
+#
+# Copyright (c) 2015 Moritz Klammler <moritz@klammler.eu>
+# Copyright (c) 2016 Krzesimir Nowak <qdlacz@gmail.com>
+#
+# Copying and distribution of this file, with or without modification, are
+# permitted in any medium without royalty provided the copyright notice
+# and this notice are preserved. This file is offered as-is, without any
+# warranty.
+
+#serial 2
+
+AX_REQUIRE_DEFINED([AX_CXX_COMPILE_STDCXX])
+AC_DEFUN([AX_CXX_COMPILE_STDCXX_17], [AX_CXX_COMPILE_STDCXX([17], [$1], [$2])])
diff --git a/m4/boost.m4 b/m4/boost.m4
new file mode 100644
index 0000000..96b4b54
--- /dev/null
+++ b/m4/boost.m4
@@ -0,0 +1,1696 @@
+# boost.m4: Locate Boost headers and libraries for autoconf-based projects.
+# Copyright (C) 2007-2011, 2014 Benoit Sigoure <tsuna@lrde.epita.fr>
+#
+# 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.
+#
+# Additional permission under section 7 of the GNU General Public
+# License, version 3 ("GPLv3"):
+#
+# If you convey this file as part of a work that contains a
+# configuration script generated by Autoconf, you may do so under
+# terms of your choice.
+#
+# 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/>.
+
+m4_define([_BOOST_SERIAL], [m4_translit([
+# serial 27
+], [#
+], [])])
+
+# Original sources can be found at http://github.com/tsuna/boost.m4
+# You can fetch the latest version of the script by doing:
+# wget http://github.com/tsuna/boost.m4/raw/master/build-aux/boost.m4
+
+# ------ #
+# README #
+# ------ #
+
+# This file provides several macros to use the various Boost libraries.
+# The first macro is BOOST_REQUIRE. It will simply check if it's possible to
+# find the Boost headers of a given (optional) minimum version and it will
+# define BOOST_CPPFLAGS accordingly. It will add an option --with-boost to
+# your configure so that users can specify non standard locations.
+# If the user's environment contains BOOST_ROOT and --with-boost was not
+# specified, --with-boost=$BOOST_ROOT is implicitly used.
+# For more README and documentation, go to http://github.com/tsuna/boost.m4
+# Note: THESE MACROS ASSUME THAT YOU USE LIBTOOL. If you don't, don't worry,
+# simply read the README, it will show you what to do step by step.
+
+m4_pattern_forbid([^_?(BOOST|Boost)_])
+
+
+# _BOOST_SED_CPP(SED-PROGRAM, PROGRAM,
+# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+# --------------------------------------------------------
+# Same as AC_EGREP_CPP, but leave the result in conftest.i.
+#
+# SED-PROGRAM is *not* overquoted, as in AC_EGREP_CPP. It is expanded
+# in double-quotes, so escape your double quotes.
+#
+# It could be useful to turn this into a macro which extracts the
+# value of any macro.
+m4_define([_BOOST_SED_CPP],
+[AC_LANG_PUSH([C++])dnl
+AC_LANG_PREPROC_REQUIRE()dnl
+AC_REQUIRE([AC_PROG_SED])dnl
+AC_LANG_CONFTEST([AC_LANG_SOURCE([[$2]])])
+AS_IF([dnl eval is necessary to expand ac_cpp.
+dnl Ultrix and Pyramid sh refuse to redirect output of eval, so use subshell.
+dnl Beware of Windows end-of-lines, for instance if we are running
+dnl some Windows programs under Wine. In that case, boost/version.hpp
+dnl is certainly using "\r\n", but the regular Unix shell will only
+dnl strip `\n' with backquotes, not the `\r'. This results in
+dnl boost_cv_lib_version='1_37\r' for instance, which breaks
+dnl everything else.
+dnl Cannot use 'dnl' after [$4] because a trailing dnl may break AC_CACHE_CHECK
+dnl
+dnl Beware that GCC 5, when expanding macros, may embed # line directives
+dnl a within single line:
+dnl
+dnl # 1 "conftest.cc"
+dnl # 1 "<built-in>"
+dnl # 1 "<command-line>"
+dnl # 1 "conftest.cc"
+dnl # 1 "/opt/local/include/boost/version.hpp" 1 3
+dnl # 2 "conftest.cc" 2
+dnl boost-lib-version =
+dnl # 2 "conftest.cc" 3
+dnl "1_56"
+dnl
+dnl So get rid of the # and empty lines, and glue the remaining ones together.
+(eval "$ac_cpp conftest.$ac_ext") 2>&AS_MESSAGE_LOG_FD |
+ grep -v '#' |
+ grep -v '^[[[:space:]]]*$' |
+ tr -d '\r' |
+ tr -s '\n' ' ' |
+ $SED -n -e "$1" >conftest.i 2>&1],
+ [$3],
+ [$4])
+rm -rf conftest*
+AC_LANG_POP([C++])dnl
+])# _BOOST_SED_CPP
+
+
+
+# BOOST_REQUIRE([VERSION], [ACTION-IF-NOT-FOUND])
+# -----------------------------------------------
+# Look for Boost. If version is given, it must either be a literal of the form
+# "X.Y.Z" where X, Y and Z are integers (the ".Z" part being optional) or a
+# variable "$var".
+# Defines the value BOOST_CPPFLAGS. This macro only checks for headers with
+# the required version, it does not check for any of the Boost libraries.
+# On # success, defines HAVE_BOOST. On failure, calls the optional
+# ACTION-IF-NOT-FOUND action if one was supplied.
+# Otherwise aborts with an error message.
+AC_DEFUN_ONCE([BOOST_REQUIRE],
+[AC_REQUIRE([AC_PROG_CXX])dnl
+AC_REQUIRE([AC_PROG_GREP])dnl
+echo "$as_me: this is boost.m4[]_BOOST_SERIAL" >&AS_MESSAGE_LOG_FD
+boost_save_IFS=$IFS
+boost_version_req=$1
+IFS=.
+set x $boost_version_req 0 0 0
+IFS=$boost_save_IFS
+shift
+boost_version_req=`expr "$[1]" '*' 100000 + "$[2]" '*' 100 + "$[3]"`
+boost_version_req_string=$[1].$[2].$[3]
+AC_ARG_WITH([boost],
+ [AS_HELP_STRING([--with-boost=DIR],
+ [prefix of Boost $1 @<:@guess@:>@])])dnl
+AC_ARG_VAR([BOOST_ROOT],[Location of Boost installation])dnl
+# If BOOST_ROOT is set and the user has not provided a value to
+# --with-boost, then treat BOOST_ROOT as if it the user supplied it.
+if test x"$BOOST_ROOT" != x; then
+ if test x"$with_boost" = x; then
+ AC_MSG_NOTICE([Detected BOOST_ROOT; continuing with --with-boost=$BOOST_ROOT])
+ with_boost=$BOOST_ROOT
+ else
+ AC_MSG_NOTICE([Detected BOOST_ROOT=$BOOST_ROOT, but overridden by --with-boost=$with_boost])
+ fi
+fi
+AC_SUBST([DISTCHECK_CONFIGURE_FLAGS],
+ ["$DISTCHECK_CONFIGURE_FLAGS '--with-boost=$with_boost'"])dnl
+boost_save_CPPFLAGS=$CPPFLAGS
+ AC_CACHE_CHECK([for Boost headers version >= $boost_version_req_string],
+ [boost_cv_inc_path],
+ [boost_cv_inc_path=no
+AC_LANG_PUSH([C++])dnl
+m4_pattern_allow([^BOOST_VERSION$])dnl
+ AC_LANG_CONFTEST([AC_LANG_PROGRAM([[#include <boost/version.hpp>
+#if !defined BOOST_VERSION
+# error BOOST_VERSION is not defined
+#elif BOOST_VERSION < $boost_version_req
+# error Boost headers version < $boost_version_req
+#endif
+]])])
+ # If the user provided a value to --with-boost, use it and only it.
+ case $with_boost in #(
+ ''|yes) set x '' /opt/local/include /usr/local/include /opt/include \
+ /usr/include C:/Boost/include;; #(
+ *) set x "$with_boost/include" "$with_boost";;
+ esac
+ shift
+ for boost_dir
+ do
+ # Without --layout=system, Boost (or at least some versions) installs
+ # itself in <prefix>/include/boost-<version>. This inner loop helps to
+ # find headers in such directories.
+ #
+ # Any ${boost_dir}/boost-x_xx directories are searched in reverse version
+ # order followed by ${boost_dir}. The final '.' is a sentinel for
+ # searching $boost_dir" itself. Entries are whitespace separated.
+ #
+ # I didn't indent this loop on purpose (to avoid over-indented code)
+ boost_layout_system_search_list=`cd "$boost_dir" 2>/dev/null \
+ && ls -1 | "${GREP}" '^boost-' | sort -rn -t- -k2 \
+ && echo .`
+ for boost_inc in $boost_layout_system_search_list
+ do
+ if test x"$boost_inc" != x.; then
+ boost_inc="$boost_dir/$boost_inc"
+ else
+ boost_inc="$boost_dir" # Uses sentinel in boost_layout_system_search_list
+ fi
+ if test x"$boost_inc" != x; then
+ # We are going to check whether the version of Boost installed
+ # in $boost_inc is usable by running a compilation that
+ # #includes it. But if we pass a -I/some/path in which Boost
+ # is not installed, the compiler will just skip this -I and
+ # use other locations (either from CPPFLAGS, or from its list
+ # of system include directories). As a result we would use
+ # header installed on the machine instead of the /some/path
+ # specified by the user. So in that precise case (trying
+ # $boost_inc), make sure the version.hpp exists.
+ #
+ # Use test -e as there can be symlinks.
+ test -e "$boost_inc/boost/version.hpp" || continue
+ CPPFLAGS="$CPPFLAGS -I$boost_inc"
+ fi
+ AC_COMPILE_IFELSE([], [boost_cv_inc_path=yes], [boost_cv_version=no])
+ if test x"$boost_cv_inc_path" = xyes; then
+ if test x"$boost_inc" != x; then
+ boost_cv_inc_path=$boost_inc
+ fi
+ break 2
+ fi
+ done
+ done
+AC_LANG_POP([C++])dnl
+ ])
+ case $boost_cv_inc_path in #(
+ no)
+ boost_errmsg="cannot find Boost headers version >= $boost_version_req_string"
+ m4_if([$2], [], [AC_MSG_ERROR([$boost_errmsg])],
+ [AC_MSG_NOTICE([$boost_errmsg])])
+ $2
+ ;;#(
+ yes)
+ BOOST_CPPFLAGS=
+ ;;#(
+ *)
+ AC_SUBST([BOOST_CPPFLAGS], ["-I$boost_cv_inc_path"])dnl
+ ;;
+ esac
+ if test x"$boost_cv_inc_path" != xno; then
+ AC_DEFINE([HAVE_BOOST], [1],
+ [Defined if the requested minimum BOOST version is satisfied])
+ AC_CACHE_CHECK([for Boost's header version],
+ [boost_cv_lib_version],
+ [m4_pattern_allow([^BOOST_LIB_VERSION$])dnl
+ _BOOST_SED_CPP([[/^boost-lib-version = /{s///;s/[\" ]//g;p;q;}]],
+ [#include <boost/version.hpp>
+boost-lib-version = BOOST_LIB_VERSION],
+ [boost_cv_lib_version=`cat conftest.i`])])
+ # e.g. "134" for 1_34_1 or "135" for 1_35
+ boost_major_version=`echo "$boost_cv_lib_version" | sed 's/_//;s/_.*//'`
+ case $boost_major_version in #(
+ '' | *[[!0-9]]*)
+ AC_MSG_ERROR([invalid value: boost_major_version='$boost_major_version'])
+ ;;
+ esac
+fi
+CPPFLAGS=$boost_save_CPPFLAGS
+])# BOOST_REQUIRE
+
+
+# BOOST_STATIC()
+# --------------
+# Add the "--enable-static-boost" configure argument. If this argument is given
+# on the command line, static versions of the libraries will be looked up.
+AC_DEFUN([BOOST_STATIC],
+ [AC_ARG_ENABLE([static-boost],
+ [AS_HELP_STRING([--enable-static-boost],
+ [Prefer the static boost libraries over the shared ones [no]])],
+ [enable_static_boost=yes],
+ [enable_static_boost=no])])# BOOST_STATIC
+
+
+# BOOST_FIND_HEADER([HEADER-NAME], [ACTION-IF-NOT-FOUND], [ACTION-IF-FOUND])
+# --------------------------------------------------------------------------
+# Wrapper around AC_CHECK_HEADER for Boost headers. Useful to check for
+# some parts of the Boost library which are only made of headers and don't
+# require linking (such as Boost.Foreach).
+#
+# Default ACTION-IF-NOT-FOUND: Fail with a fatal error unless Boost couldn't be
+# found in the first place, in which case by default a notice is issued to the
+# user. Presumably if we haven't died already it's because it's OK to not have
+# Boost, which is why only a notice is issued instead of a hard error.
+#
+# Default ACTION-IF-FOUND: define the preprocessor symbol HAVE_<HEADER-NAME> in
+# case of success # (where HEADER-NAME is written LIKE_THIS, e.g.,
+# HAVE_BOOST_FOREACH_HPP).
+AC_DEFUN([BOOST_FIND_HEADER],
+[AC_REQUIRE([BOOST_REQUIRE])dnl
+if test x"$boost_cv_inc_path" = xno; then
+ m4_default([$2], [AC_MSG_NOTICE([Boost not available, not searching for $1])])
+else
+AC_LANG_PUSH([C++])dnl
+boost_save_CPPFLAGS=$CPPFLAGS
+CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
+AC_CHECK_HEADER([$1],
+ [m4_default([$3], [AC_DEFINE(AS_TR_CPP([HAVE_$1]), [1],
+ [Define to 1 if you have <$1>])])],
+ [m4_default([$2], [AC_MSG_ERROR([cannot find $1])])])
+CPPFLAGS=$boost_save_CPPFLAGS
+AC_LANG_POP([C++])dnl
+fi
+])# BOOST_FIND_HEADER
+
+
+# BOOST_FIND_LIBS([COMPONENT-NAME], [CANDIDATE-LIB-NAMES],
+# [PREFERRED-RT-OPT], [HEADER-NAME], [CXX-TEST],
+# [CXX-PROLOGUE])
+# --------------------------------------------------------------
+# Look for the Boost library COMPONENT-NAME (e.g., `thread', for
+# libboost_thread) under the possible CANDIDATE-LIB-NAMES (e.g.,
+# "thread_win32 thread"). Check that HEADER-NAME works and check that
+# libboost_LIB-NAME can link with the code CXX-TEST. The optional
+# argument CXX-PROLOGUE can be used to include some C++ code before
+# the `main' function.
+#
+# Invokes BOOST_FIND_HEADER([HEADER-NAME]) (see above).
+#
+# Boost libraries typically come compiled with several flavors (with different
+# runtime options) so PREFERRED-RT-OPT is the preferred suffix. A suffix is one
+# or more of the following letters: sgdpn (in that order). s = static
+# runtime, d = debug build, g = debug/diagnostic runtime, p = STLPort build,
+# n = (unsure) STLPort build without iostreams from STLPort (it looks like `n'
+# must always be used along with `p'). Additionally, PREFERRED-RT-OPT can
+# start with `mt-' to indicate that there is a preference for multi-thread
+# builds. Some sample values for PREFERRED-RT-OPT: (nothing), mt, d, mt-d, gdp
+# ... If you want to make sure you have a specific version of Boost
+# (eg, >= 1.33) you *must* invoke BOOST_REQUIRE before this macro.
+AC_DEFUN([BOOST_FIND_LIBS],
+[AC_REQUIRE([BOOST_REQUIRE])dnl
+AC_REQUIRE([_BOOST_FIND_COMPILER_TAG])dnl
+AC_REQUIRE([BOOST_STATIC])dnl
+AC_REQUIRE([_BOOST_GUESS_WHETHER_TO_USE_MT])dnl
+if test x"$boost_cv_inc_path" = xno; then
+ AC_MSG_NOTICE([Boost not available, not searching for the Boost $1 library])
+else
+dnl The else branch is huge and wasn't indented on purpose.
+AC_LANG_PUSH([C++])dnl
+AS_VAR_PUSHDEF([Boost_lib], [boost_cv_lib_$1])dnl
+AS_VAR_PUSHDEF([Boost_lib_LDFLAGS], [boost_cv_lib_$1_LDFLAGS])dnl
+AS_VAR_PUSHDEF([Boost_lib_LDPATH], [boost_cv_lib_$1_LDPATH])dnl
+AS_VAR_PUSHDEF([Boost_lib_LIBS], [boost_cv_lib_$1_LIBS])dnl
+BOOST_FIND_HEADER([$4])
+boost_save_CPPFLAGS=$CPPFLAGS
+CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
+AC_CACHE_CHECK([for the Boost $1 library], [Boost_lib],
+ [_BOOST_FIND_LIBS($@)])
+case $Boost_lib in #(
+ (yes) _AC_MSG_LOG_CONFTEST
+ AC_DEFINE(AS_TR_CPP([HAVE_BOOST_$1]), [1], [Defined if the Boost $1 library is available])dnl
+ AC_SUBST(AS_TR_CPP([BOOST_$1_LDFLAGS]), [$Boost_lib_LDFLAGS])dnl
+ AC_SUBST(AS_TR_CPP([BOOST_$1_LDPATH]), [$Boost_lib_LDPATH])dnl
+ AC_SUBST([BOOST_LDPATH], [$Boost_lib_LDPATH])dnl
+ AC_SUBST(AS_TR_CPP([BOOST_$1_LIBS]), [$Boost_lib_LIBS])dnl
+ ;;
+ (no) _AC_MSG_LOG_CONFTEST
+ AC_MSG_ERROR([cannot find flags to link with the Boost $1 library (libboost-$1)])
+ ;;
+esac
+CPPFLAGS=$boost_save_CPPFLAGS
+AS_VAR_POPDEF([Boost_lib])dnl
+AS_VAR_POPDEF([Boost_lib_LDFLAGS])dnl
+AS_VAR_POPDEF([Boost_lib_LDPATH])dnl
+AS_VAR_POPDEF([Boost_lib_LIBS])dnl
+AC_LANG_POP([C++])dnl
+fi
+])
+
+
+# BOOST_FIND_LIB([LIB-NAME],
+# [PREFERRED-RT-OPT], [HEADER-NAME], [CXX-TEST],
+# [CXX-PROLOGUE])
+# --------------------------------------------------------------
+# Backward compatibility wrapper for BOOST_FIND_LIBS.
+AC_DEFUN([BOOST_FIND_LIB],
+[BOOST_FIND_LIBS([$1], $@)])
+
+
+# _BOOST_FIND_LIBS([LIB-NAME], [CANDIDATE-LIB-NAMES],
+# [PREFERRED-RT-OPT], [HEADER-NAME], [CXX-TEST],
+# [CXX-PROLOGUE])
+# --------------------------------------------------------------
+# Real implementation of BOOST_FIND_LIBS: rely on these local macros:
+# Boost_lib, Boost_lib_LDFLAGS, Boost_lib_LDPATH, Boost_lib_LIBS
+#
+# The algorithm is as follows: first look for a given library name
+# according to the user's PREFERRED-RT-OPT. For each library name, we
+# prefer to use the ones that carry the tag (toolset name). Each
+# library is searched through the various standard paths were Boost is
+# usually installed. If we can't find the standard variants, we try
+# to enforce -mt (for instance on MacOSX, libboost_thread.dylib
+# doesn't exist but there's -obviously- libboost_thread-mt.dylib).
+AC_DEFUN([_BOOST_FIND_LIBS],
+[Boost_lib=no
+ case "$3" in #(
+ (mt | mt-) boost_mt=-mt; boost_rtopt=;; #(
+ (mt* | mt-*) boost_mt=-mt; boost_rtopt=`expr "X$3" : 'Xmt-*\(.*\)'`;; #(
+ (*) boost_mt=; boost_rtopt=$3;;
+ esac
+ if test $enable_static_boost = yes; then
+ boost_rtopt="s$boost_rtopt"
+ fi
+ # Find the proper debug variant depending on what we've been asked to find.
+ case $boost_rtopt in #(
+ (*d*) boost_rt_d=$boost_rtopt;; #(
+ (*[[sgpn]]*) # Insert the `d' at the right place (in between `sg' and `pn')
+ boost_rt_d=`echo "$boost_rtopt" | sed 's/\(s*g*\)\(p*n*\)/\1\2/'`;; #(
+ (*) boost_rt_d='-d';;
+ esac
+ # If the PREFERRED-RT-OPT are not empty, prepend a `-'.
+ test -n "$boost_rtopt" && boost_rtopt="-$boost_rtopt"
+ $boost_guess_use_mt && boost_mt=-mt
+ # Look for the abs path the static archive.
+ # $libext is computed by Libtool but let's make sure it's non empty.
+ test -z "$libext" &&
+ AC_MSG_ERROR([the libext variable is empty, did you invoke Libtool?])
+ boost_save_ac_objext=$ac_objext
+ # Generate the test file.
+ AC_LANG_CONFTEST([AC_LANG_PROGRAM([$7
+#include <$4>
+$6], [$5])])
+dnl Optimization hacks: compiling C++ is slow, especially with Boost. What
+dnl we're trying to do here is guess the right combination of link flags
+dnl (LIBS / LDFLAGS) to use a given library. This can take several
+dnl iterations before it succeeds and is thus *very* slow. So what we do
+dnl instead is that we compile the code first (and thus get an object file,
+dnl typically conftest.o). Then we try various combinations of link flags
+dnl until we succeed to link conftest.o in an executable. The problem is
+dnl that the various TRY_LINK / COMPILE_IFELSE macros of Autoconf always
+dnl remove all the temporary files including conftest.o. So the trick here
+dnl is to temporarily change the value of ac_objext so that conftest.o is
+dnl preserved accross tests. This is obviously fragile and I will burn in
+dnl hell for not respecting Autoconf's documented interfaces, but in the
+dnl mean time, it optimizes the macro by a factor of 5 to 30.
+dnl Another small optimization: the first argument of AC_COMPILE_IFELSE left
+dnl empty because the test file is generated only once above (before we
+dnl start the for loops).
+ AC_COMPILE_IFELSE([],
+ [ac_objext=do_not_rm_me_plz],
+ [AC_MSG_ERROR([cannot compile a test that uses Boost $1])])
+ ac_objext=$boost_save_ac_objext
+ boost_failed_libs=
+# Don't bother to ident the following nested for loops, only the 2
+# innermost ones matter.
+for boost_lib_ in $2; do
+for boost_tag_ in -$boost_cv_lib_tag ''; do
+for boost_ver_ in -$boost_cv_lib_version ''; do
+for boost_mt_ in $boost_mt -mt ''; do
+for boost_rtopt_ in $boost_rtopt '' -d; do
+ for boost_full_suffix in \
+ $boost_last_suffix \
+ x$boost_tag_$boost_mt_$boost_rtopt_$boost_ver_ \
+ x$boost_tag_$boost_rtopt_$boost_ver_ \
+ x$boost_tag_$boost_mt_$boost_ver_ \
+ x$boost_tag_$boost_ver_
+ do
+ boost_real_suffix=`echo "$boost_full_suffix" | sed 's/^x//'`
+ boost_lib="boost_$boost_lib_$boost_real_suffix"
+ # Avoid testing twice the same lib
+ case $boost_failed_libs in #(
+ (*@$boost_lib@*) continue;;
+ esac
+ # If with_boost is empty, we'll search in /lib first, which is not quite
+ # right so instead we'll try to a location based on where the headers are.
+ boost_tmp_lib=$with_boost
+ test x"$with_boost" = x && boost_tmp_lib=${boost_cv_inc_path%/include}
+ for boost_ldpath in "$boost_tmp_lib/lib" '' \
+ /opt/local/lib* /usr/local/lib* /opt/lib* /usr/lib* \
+ "$with_boost" C:/Boost/lib /lib*
+ do
+ # Don't waste time with directories that don't exist.
+ if test x"$boost_ldpath" != x && test ! -e "$boost_ldpath"; then
+ continue
+ fi
+ boost_save_LDFLAGS=$LDFLAGS
+ # Are we looking for a static library?
+ case $boost_ldpath:$boost_rtopt_ in #(
+ (*?*:*s*) # Yes (Non empty boost_ldpath + s in rt opt)
+ Boost_lib_LIBS="$boost_ldpath/lib$boost_lib.$libext"
+ test -e "$Boost_lib_LIBS" || continue;; #(
+ (*) # No: use -lboost_foo to find the shared library.
+ Boost_lib_LIBS="-l$boost_lib";;
+ esac
+ boost_save_LIBS=$LIBS
+ LIBS="$Boost_lib_LIBS $LIBS"
+ test x"$boost_ldpath" != x && LDFLAGS="$LDFLAGS -L$boost_ldpath"
+dnl First argument of AC_LINK_IFELSE left empty because the test file is
+dnl generated only once above (before we start the for loops).
+ _BOOST_AC_LINK_IFELSE([],
+ [Boost_lib=yes], [Boost_lib=no])
+ ac_objext=$boost_save_ac_objext
+ LDFLAGS=$boost_save_LDFLAGS
+ LIBS=$boost_save_LIBS
+ if test x"$Boost_lib" = xyes; then
+ # Check or used cached result of whether or not using -R or
+ # -rpath makes sense. Some implementations of ld, such as for
+ # Mac OSX, require -rpath but -R is the flag known to work on
+ # other systems. https://github.com/tsuna/boost.m4/issues/19
+ AC_CACHE_VAL([boost_cv_rpath_link_ldflag],
+ [case $boost_ldpath in
+ '') # Nothing to do.
+ boost_cv_rpath_link_ldflag=
+ boost_rpath_link_ldflag_found=yes;;
+ *)
+ for boost_cv_rpath_link_ldflag in -Wl,-R, -Wl,-rpath,; do
+ LDFLAGS="$boost_save_LDFLAGS -L$boost_ldpath $boost_cv_rpath_link_ldflag$boost_ldpath"
+ LIBS="$Boost_lib_LIBS $boost_save_LIBS"
+ _BOOST_AC_LINK_IFELSE([],
+ [boost_rpath_link_ldflag_found=yes
+ break],
+ [boost_rpath_link_ldflag_found=no])
+ done
+ ;;
+ esac
+ AS_IF([test "x$boost_rpath_link_ldflag_found" != "xyes"],
+ [AC_MSG_ERROR([Unable to determine whether to use -R or -rpath])])
+ LDFLAGS=$boost_save_LDFLAGS
+ LIBS=$boost_save_LIBS
+ ])
+ test x"$boost_ldpath" != x &&
+ Boost_lib_LDFLAGS="-L$boost_ldpath $boost_cv_rpath_link_ldflag$boost_ldpath"
+ Boost_lib_LDPATH="$boost_ldpath"
+ boost_last_suffix="$boost_full_suffix"
+ break 7
+ else
+ boost_failed_libs="$boost_failed_libs@$boost_lib@"
+ fi
+ done
+ done
+done
+done
+done
+done
+done # boost_lib_
+rm -f conftest.$ac_objext
+])
+
+
+
+# --------------------------------------- #
+# Checks for the various Boost libraries. #
+# --------------------------------------- #
+
+# List of boost libraries: http://www.boost.org/libs/libraries.htm
+# The page http://beta.boost.org/doc/libs is useful: it gives the first release
+# version of each library (among other things).
+
+# BOOST_DEFUN(LIBRARY, CODE)
+# --------------------------
+# Define BOOST_<LIBRARY-UPPERCASE> as a macro that runs CODE.
+#
+# Use indir to avoid the warning on underquoted macro name given to AC_DEFUN.
+m4_define([BOOST_DEFUN],
+[m4_indir([AC_DEFUN],
+ m4_toupper([BOOST_$1]),
+[m4_pushdef([BOOST_Library], [$1])dnl
+$2
+m4_popdef([BOOST_Library])dnl
+])
+])
+
+
+# BOOST_ANY()
+# ------------
+# Look for Boost.Any
+BOOST_DEFUN([Any],
+[BOOST_FIND_HEADER([boost/any.hpp])])
+
+
+# BOOST_ARRAY()
+# -------------
+# Look for Boost.Array
+BOOST_DEFUN([Array],
+[BOOST_FIND_HEADER([boost/array.hpp])])
+
+
+# BOOST_ASIO()
+# ------------
+# Look for Boost.Asio (new in Boost 1.35).
+BOOST_DEFUN([Asio],
+[AC_REQUIRE([BOOST_SYSTEM])dnl
+BOOST_FIND_HEADER([boost/asio.hpp])])
+
+# BOOST_BIMAP()
+# ------------
+# Look for Boost.Bimap
+BOOST_DEFUN([Bimap],
+[BOOST_FIND_HEADER([boost/bimap.hpp])])
+
+
+# BOOST_ASSIGN()
+# -------------
+# Look for Boost.Assign
+BOOST_DEFUN([Assign],
+[BOOST_FIND_HEADER([boost/assign.hpp])])
+
+
+# BOOST_ATOMIC([PREFERRED-RT-OPT])
+# -------------------------------
+# Look for Boost.Atomic. For the documentation of PREFERRED-RT-OPT, see the
+# documentation of BOOST_FIND_LIB above.
+BOOST_DEFUN([Atomic],
+[BOOST_FIND_LIB([atomic], [$1],
+ [boost/atomic.hpp],
+ [boost::atomic<int> a;],
+ [ ],
+ [#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif])
+])# BOOST_ATOMIC
+
+
+# BOOST_BIND()
+# ------------
+# Look for Boost.Bind.
+BOOST_DEFUN([Bind],
+[BOOST_FIND_HEADER([boost/bind.hpp])])
+
+
+# BOOST_CAST()
+# ------------
+# Look for Boost.Cast
+BOOST_DEFUN([Cast],
+[BOOST_FIND_HEADER([boost/cast.hpp])])
+
+
+# BOOST_CHRONO()
+# --------------
+# Look for Boost.Chrono.
+BOOST_DEFUN([Chrono],
+[# Do we have to check for Boost.System? This link-time dependency was
+# added as of 1.35.0. If we have a version <1.35, we must not attempt to
+# find Boost.System as it didn't exist by then.
+if test $boost_major_version -ge 135; then
+ BOOST_SYSTEM([$1])
+fi # end of the Boost.System check.
+boost_filesystem_save_LIBS=$LIBS
+boost_filesystem_save_LDFLAGS=$LDFLAGS
+m4_pattern_allow([^BOOST_SYSTEM_(LIBS|LDFLAGS)$])dnl
+LIBS="$LIBS $BOOST_SYSTEM_LIBS"
+LDFLAGS="$LDFLAGS $BOOST_SYSTEM_LDFLAGS"
+BOOST_FIND_LIB([chrono], [$1],
+ [boost/chrono.hpp],
+ [boost::chrono::thread_clock d;])
+if test $enable_static_boost = yes && test $boost_major_version -ge 135; then
+ BOOST_CHRONO_LIBS="$BOOST_CHRONO_LIBS $BOOST_SYSTEM_LIBS"
+fi
+LIBS=$boost_filesystem_save_LIBS
+LDFLAGS=$boost_filesystem_save_LDFLAGS
+])# BOOST_CHRONO
+
+
+# BOOST_CONTEXT([PREFERRED-RT-OPT])
+# -----------------------------------
+# Look for Boost.Context. For the documentation of PREFERRED-RT-OPT, see the
+# documentation of BOOST_FIND_LIB above.
+#
+# * This library was introduced in Boost 1.51.0
+# * The signatures of make_fcontext() and jump_fcontext were changed in 1.56.0
+# * A dependency on boost_thread appears in 1.57.0
+BOOST_DEFUN([Context],
+[boost_context_save_LIBS=$LIBS
+ boost_context_save_LDFLAGS=$LDFLAGS
+if test $boost_major_version -ge 157; then
+ BOOST_THREAD([$1])
+ m4_pattern_allow([^BOOST_THREAD_(LIBS|LDFLAGS)$])dnl
+ LIBS="$LIBS $BOOST_THREAD_LIBS"
+ LDFLAGS="$LDFLAGS $BOOST_THREAD_LDFLAGS"
+fi
+BOOST_FIND_LIB([context], [$1],
+ [boost/context/fcontext.hpp],[[
+
+// creates a stack
+void * stack_pointer = new void*[4096];
+std::size_t const size = sizeof(void*[4096]);
+
+#if BOOST_VERSION <= 105100
+ctx::make_fcontext(&fc, f);
+return ctx::jump_fcontext(&fcm, &fc, 3) == 6;
+
+#else
+
+fc = ctx::make_fcontext(stack_pointer, size, f);
+return ctx::jump_fcontext(&fcm, fc, 3) == 6;
+
+#endif
+
+
+]],[dnl
+
+#include <boost/version.hpp>
+#if BOOST_VERSION <= 105100
+
+namespace ctx = boost::ctx;
+
+static ctx::fcontext_t fcm, fc;
+
+static void f(intptr_t i) {
+ ctx::jump_fcontext(&fc, &fcm, i * 2);
+}
+
+#elif BOOST_VERSION <= 105500
+
+namespace ctx = boost::context;
+
+// context
+static ctx::fcontext_t fcm, *fc;
+
+// context-function
+static void f(intptr_t i) {
+ ctx::jump_fcontext(fc, &fcm, i * 2);
+}
+
+#else
+
+namespace ctx = boost::context;
+
+// context
+static ctx::fcontext_t fcm, fc;
+
+// context-function
+static void f(intptr_t i) {
+ ctx::jump_fcontext(&fc, fcm, i * 2);
+}
+#endif
+])
+LIBS=$boost_context_save_LIBS
+LDFLAGS=$boost_context_save_LDFLAGS
+])# BOOST_CONTEXT
+
+
+# BOOST_CONVERSION()
+# ------------------
+# Look for Boost.Conversion (cast / lexical_cast)
+BOOST_DEFUN([Conversion],
+[BOOST_FIND_HEADER([boost/cast.hpp])
+BOOST_FIND_HEADER([boost/lexical_cast.hpp])
+])# BOOST_CONVERSION
+
+
+# BOOST_COROUTINE([PREFERRED-RT-OPT])
+# -----------------------------------
+# Look for Boost.Coroutine. For the documentation of PREFERRED-RT-OPT, see the
+# documentation of BOOST_FIND_LIB above. This library was introduced in Boost
+# 1.53.0
+BOOST_DEFUN([Coroutine],
+[
+boost_coroutine_save_LIBS=$LIBS
+boost_coroutine_save_LDFLAGS=$LDFLAGS
+# Link-time dependency from coroutine to context
+BOOST_CONTEXT([$1])
+# Starting from Boost 1.55 a dependency on Boost.System is added
+if test $boost_major_version -ge 155; then
+ BOOST_SYSTEM([$1])
+fi
+m4_pattern_allow([^BOOST_(CONTEXT|SYSTEM)_(LIBS|LDFLAGS)])
+LIBS="$LIBS $BOOST_CONTEXT_LIBS $BOOST_SYSTEM_LIBS"
+LDFLAGS="$LDFLAGS $BOOST_CONTEXT_LDFLAGS"
+
+# in 1.53 coroutine was a header only library
+if test $boost_major_version -eq 153; then
+ BOOST_FIND_HEADER([boost/coroutine/coroutine.hpp])
+else
+ BOOST_FIND_LIB([coroutine], [$1],
+ [boost/coroutine/coroutine.hpp],
+ [
+ #include <boost/version.hpp>
+ #if BOOST_VERSION <= 105500
+ boost::coroutines::coroutine<int(int)> coro; coro.get();
+ #else
+ boost::coroutines::asymmetric_coroutine<int>::pull_type coro; coro.get();
+ #endif
+ ])
+fi
+# Link-time dependency from coroutine to context, existed only in 1.53, in 1.54
+# coroutine doesn't use context from its headers but from its library.
+if test $boost_major_version -eq 153 || test $enable_static_boost = yes && test $boost_major_version -ge 154; then
+ BOOST_COROUTINE_LIBS="$BOOST_COROUTINE_LIBS $BOOST_CONTEXT_LIBS"
+ BOOST_COROUTINE_LDFLAGS="$BOOST_COROUTINE_LDFLAGS $BOOST_CONTEXT_LDFLAGS"
+fi
+if test $enable_static_boost = yes && test $boost_major_version -ge 155; then
+ BOOST_COROUTINE_LIBS="$BOOST_COROUTINE_LIBS $BOOST_SYSTEM_LIBS"
+ BOOST_COROUTINE_LDFLAGS="$BOOST_COROUTINE_LDFLAGS $BOOST_SYSTEM_LDFLAGS"
+fi
+LIBS=$boost_coroutine_save_LIBS
+LDFLAGS=$boost_coroutine_save_LDFLAGS
+])# BOOST_COROUTINE
+
+
+# BOOST_CRC()
+# -----------
+# Look for Boost.CRC
+BOOST_DEFUN([CRC],
+[BOOST_FIND_HEADER([boost/crc.hpp])
+])# BOOST_CRC
+
+
+# BOOST_DATE_TIME([PREFERRED-RT-OPT])
+# -----------------------------------
+# Look for Boost.Date_Time. For the documentation of PREFERRED-RT-OPT, see the
+# documentation of BOOST_FIND_LIB above.
+BOOST_DEFUN([Date_Time],
+[BOOST_FIND_LIB([date_time], [$1],
+ [boost/date_time/posix_time/posix_time.hpp],
+ [boost::posix_time::ptime t;])
+])# BOOST_DATE_TIME
+
+
+# BOOST_EXCEPTION()
+# ------------
+# Look for Boost.Exception
+BOOST_DEFUN([Exception],
+[BOOST_FIND_HEADER([boost/exception/all.hpp])])
+
+
+# BOOST_FILESYSTEM([PREFERRED-RT-OPT])
+# ------------------------------------
+# Look for Boost.Filesystem. For the documentation of PREFERRED-RT-OPT, see
+# the documentation of BOOST_FIND_LIB above.
+# Do not check for boost/filesystem.hpp because this file was introduced in
+# 1.34.
+BOOST_DEFUN([Filesystem],
+[# Do we have to check for Boost.System? This link-time dependency was
+# added as of 1.35.0. If we have a version <1.35, we must not attempt to
+# find Boost.System as it didn't exist by then.
+if test $boost_major_version -ge 135; then
+ BOOST_SYSTEM([$1])
+fi # end of the Boost.System check.
+boost_filesystem_save_LIBS=$LIBS
+boost_filesystem_save_LDFLAGS=$LDFLAGS
+m4_pattern_allow([^BOOST_SYSTEM_(LIBS|LDFLAGS)$])dnl
+LIBS="$LIBS $BOOST_SYSTEM_LIBS"
+LDFLAGS="$LDFLAGS $BOOST_SYSTEM_LDFLAGS"
+BOOST_FIND_LIB([filesystem], [$1],
+ [boost/filesystem/path.hpp], [boost::filesystem::path p;])
+if test $enable_static_boost = yes && test $boost_major_version -ge 135; then
+ BOOST_FILESYSTEM_LIBS="$BOOST_FILESYSTEM_LIBS $BOOST_SYSTEM_LIBS"
+fi
+LIBS=$boost_filesystem_save_LIBS
+LDFLAGS=$boost_filesystem_save_LDFLAGS
+])# BOOST_FILESYSTEM
+
+
+# BOOST_FLYWEIGHT()
+# -----------------
+# Look for Boost.Flyweight.
+BOOST_DEFUN([Flyweight],
+[dnl There's a hidden dependency on pthreads.
+AC_REQUIRE([_BOOST_PTHREAD_FLAG])dnl
+BOOST_FIND_HEADER([boost/flyweight.hpp])
+AC_SUBST([BOOST_FLYWEIGHT_LIBS], [$boost_cv_pthread_flag])
+])
+
+
+# BOOST_FOREACH()
+# ---------------
+# Look for Boost.Foreach.
+BOOST_DEFUN([Foreach],
+[BOOST_FIND_HEADER([boost/foreach.hpp])])
+
+
+# BOOST_FORMAT()
+# --------------
+# Look for Boost.Format.
+# Note: we can't check for boost/format/format_fwd.hpp because the header isn't
+# standalone. It can't be compiled because it triggers the following error:
+# boost/format/detail/config_macros.hpp:88: error: 'locale' in namespace 'std'
+# does not name a type
+BOOST_DEFUN([Format],
+[BOOST_FIND_HEADER([boost/format.hpp])])
+
+
+# BOOST_FUNCTION()
+# ----------------
+# Look for Boost.Function
+BOOST_DEFUN([Function],
+[BOOST_FIND_HEADER([boost/function.hpp])])
+
+
+# BOOST_FUSION()
+# -----------------
+# Look for Boost.Fusion
+BOOST_DEFUN([Fusion],
+[BOOST_FIND_HEADER([boost/fusion/sequence.hpp])])
+
+
+# BOOST_GEOMETRY()
+# ----------------
+# Look for Boost.Geometry (new since 1.47.0).
+BOOST_DEFUN([Geometry],
+[BOOST_FIND_HEADER([boost/geometry.hpp])
+])# BOOST_GEOMETRY
+
+
+# BOOST_GRAPH([PREFERRED-RT-OPT])
+# -------------------------------
+# Look for Boost.Graphs. For the documentation of PREFERRED-RT-OPT, see the
+# documentation of BOOST_FIND_LIB above.
+BOOST_DEFUN([Graph],
+[boost_graph_save_LIBS=$LIBS
+boost_graph_save_LDFLAGS=$LDFLAGS
+# Link-time dependency from graph to regex was added as of 1.40.0.
+if test $boost_major_version -ge 140; then
+ BOOST_REGEX([$1])
+ m4_pattern_allow([^BOOST_REGEX_(LIBS|LDFLAGS)$])dnl
+ LIBS="$LIBS $BOOST_REGEX_LIBS"
+ LDFLAGS="$LDFLAGS $BOOST_REGEX_LDFLAGS"
+fi
+BOOST_FIND_LIB([graph], [$1],
+ [boost/graph/adjacency_list.hpp], [boost::adjacency_list<> g;])
+LIBS=$boost_graph_save_LIBS
+LDFLAGS=$boost_graph_save_LDFLAGS
+])# BOOST_GRAPH
+
+
+# BOOST_HASH()
+# ------------
+# Look for Boost.Functional/Hash
+BOOST_DEFUN([Hash],
+[BOOST_FIND_HEADER([boost/functional/hash.hpp])])
+
+
+# BOOST_IOSTREAMS([PREFERRED-RT-OPT])
+# -----------------------------------
+# Look for Boost.IOStreams. For the documentation of PREFERRED-RT-OPT, see the
+# documentation of BOOST_FIND_LIB above.
+BOOST_DEFUN([IOStreams],
+[BOOST_FIND_LIB([iostreams], [$1],
+ [boost/iostreams/device/file_descriptor.hpp],
+ [boost::iostreams::file_descriptor fd; fd.close();])
+])# BOOST_IOSTREAMS
+
+
+# BOOST_ITERATOR()
+# ------------
+# Look for Boost.Iterator
+BOOST_DEFUN([Iterator],
+[BOOST_FIND_HEADER([boost/iterator/iterator_adaptor.hpp])])
+
+
+# BOOST_LAMBDA()
+# --------------
+# Look for Boost.Lambda
+BOOST_DEFUN([Lambda],
+[BOOST_FIND_HEADER([boost/lambda/lambda.hpp])])
+
+
+# BOOST_LOCALE()
+# --------------
+# Look for Boost.Locale
+BOOST_DEFUN([Locale],
+[
+boost_locale_save_LIBS=$LIBS
+boost_locale_save_LDFLAGS=$LDFLAGS
+# require SYSTEM for boost-1.50.0 and up
+if test $boost_major_version -ge 150; then
+ BOOST_SYSTEM([$1])
+ m4_pattern_allow([^BOOST_SYSTEM_(LIBS|LDFLAGS)$])dnl
+ LIBS="$LIBS $BOOST_SYSTEM_LIBS"
+ LDFLAGS="$LDFLAGS $BOOST_SYSTEM_LDFLAGS"
+fi # end of the Boost.System check.
+BOOST_FIND_LIB([locale], [$1],
+ [boost/locale.hpp],
+ [[boost::locale::generator gen; std::locale::global(gen(""));]])
+LIBS=$boost_locale_save_LIBS
+LDFLAGS=$boost_locale_save_LDFLAGS
+])# BOOST_LOCALE
+
+# BOOST_LOG([PREFERRED-RT-OPT])
+# -----------------------------
+# Look for Boost.Log. For the documentation of PREFERRED-RT-OPT, see the
+# documentation of BOOST_FIND_LIB above.
+BOOST_DEFUN([Log],
+[boost_log_save_LIBS=$LIBS
+boost_log_save_LDFLAGS=$LDFLAGS
+BOOST_SYSTEM([$1])
+BOOST_FILESYSTEM([$1])
+BOOST_DATE_TIME([$1])
+m4_pattern_allow([^BOOST_(SYSTEM|FILESYSTEM|DATE_TIME)_(LIBS|LDFLAGS)$])dnl
+LIBS="$LIBS $BOOST_DATE_TIME_LIBS $BOOST_FILESYSTEM_LIBS $BOOST_SYSTEM_LIBS"
+LDFLAGS="$LDFLAGS $BOOST_DATE_TIME_LDFLAGS $BOOST_FILESYSTEM_LDFLAGS $BOOST_SYSTEM_LDFLAGS"
+BOOST_FIND_LIB([log], [$1],
+ [boost/log/core/core.hpp],
+ [boost::log::attribute a; a.get_value();])
+LIBS=$boost_log_save_LIBS
+LDFLAGS=$boost_log_save_LDFLAGS
+])# BOOST_LOG
+
+
+# BOOST_LOG_SETUP([PREFERRED-RT-OPT])
+# -----------------------------------
+# Look for Boost.Log. For the documentation of PREFERRED-RT-OPT, see the
+# documentation of BOOST_FIND_LIB above.
+BOOST_DEFUN([Log_Setup],
+[boost_log_setup_save_LIBS=$LIBS
+boost_log_setup_save_LDFLAGS=$LDFLAGS
+BOOST_LOG([$1])
+m4_pattern_allow([^BOOST_LOG_(LIBS|LDFLAGS)$])dnl
+LIBS="$LIBS $BOOST_LOG_LIBS"
+LDFLAGS="$LDFLAGS $BOOST_LOG_LDFLAGS"
+BOOST_FIND_LIB([log_setup], [$1],
+ [boost/log/utility/setup/from_settings.hpp],
+ [boost::log::basic_settings<char> bs; bs.empty();])
+LIBS=$boost_log_setup_save_LIBS
+LDFLAGS=$boost_log_setup_save_LDFLAGS
+])# BOOST_LOG_SETUP
+
+
+# BOOST_MATH()
+# ------------
+# Look for Boost.Math
+# TODO: This library isn't header-only but it comes in multiple different
+# flavors that don't play well with BOOST_FIND_LIB (e.g, libboost_math_c99,
+# libboost_math_c99f, libboost_math_c99l, libboost_math_tr1,
+# libboost_math_tr1f, libboost_math_tr1l). This macro must be fixed to do the
+# right thing anyway.
+BOOST_DEFUN([Math],
+[BOOST_FIND_HEADER([boost/math/special_functions.hpp])])
+
+
+# BOOST_MPI([PREFERRED-RT-OPT])
+# -------------------------------
+# Look for Boost MPI. For the documentation of PREFERRED-RT-OPT, see the
+# documentation of BOOST_FIND_LIB above. Uses MPICXX variable if it is
+# set, otherwise tries CXX
+#
+BOOST_DEFUN([MPI],
+[boost_save_CXX=${CXX}
+boost_save_CXXCPP=${CXXCPP}
+if test x"${MPICXX}" != x; then
+ CXX=${MPICXX}
+ CXXCPP="${MPICXX} -E"
+fi
+BOOST_FIND_LIB([mpi], [$1],
+ [boost/mpi.hpp],
+ [int argc = 0;
+ char **argv = 0;
+ boost::mpi::environment env(argc,argv);])
+CXX=${boost_save_CXX}
+CXXCPP=${boost_save_CXXCPP}
+])# BOOST_MPI
+
+
+# BOOST_MPL()
+# ------------------
+# Look for Boost.MPL
+BOOST_DEFUN([MPL],
+[BOOST_FIND_HEADER([boost/mpl/for_each.hpp])])
+
+
+# BOOST_MULTIARRAY()
+# ------------------
+# Look for Boost.MultiArray
+BOOST_DEFUN([MultiArray],
+[BOOST_FIND_HEADER([boost/multi_array.hpp])])
+
+
+# BOOST_MULTIINDEXCCONTAINER()
+# ------------------
+# Look for Boost.MultiIndexContainer
+BOOST_DEFUN([MultiIndexContainer],
+[BOOST_FIND_HEADER([boost/multi_index_container.hpp])])
+
+
+# BOOST_NUMERIC_UBLAS()
+# --------------------------
+# Look for Boost.NumericUblas (Basic Linear Algebra)
+BOOST_DEFUN([Numeric_Ublas],
+[BOOST_FIND_HEADER([boost/numeric/ublas/vector.hpp])
+])# BOOST_NUMERIC_UBLAS
+
+
+# BOOST_NUMERIC_CONVERSION()
+# --------------------------
+# Look for Boost.NumericConversion (policy-based numeric conversion)
+BOOST_DEFUN([Numeric_Conversion],
+[BOOST_FIND_HEADER([boost/numeric/conversion/converter.hpp])
+])# BOOST_NUMERIC_CONVERSION
+
+
+# BOOST_OPTIONAL()
+# ----------------
+# Look for Boost.Optional
+BOOST_DEFUN([Optional],
+[BOOST_FIND_HEADER([boost/optional.hpp])])
+
+
+# BOOST_PREPROCESSOR()
+# --------------------
+# Look for Boost.Preprocessor
+BOOST_DEFUN([Preprocessor],
+[BOOST_FIND_HEADER([boost/preprocessor/repeat.hpp])])
+
+
+# BOOST_PROPERTY_TREE([PREFERRED-RT-OPT])
+# -----------------------------------------
+# Look for Boost.Property_Tree. For the documentation of PREFERRED-RT-OPT,
+# see the documentation of BOOST_FIND_LIB above.
+BOOST_DEFUN([Property_Tree],
+[BOOST_FIND_LIB([property_tree], [$1],
+ [boost/property_tree/ptree.hpp],
+ [boost::property_tree::ptree pt; boost::property_tree::read_xml d("test", pt);])
+])# BOOST_PROPERTY_TREE
+
+
+# BOOST_RANDOM()
+# --------------------
+# Look for Boost.Random
+BOOST_DEFUN([Random],
+[BOOST_FIND_HEADER([boost/random/random_number_generator.hpp])])
+
+
+# BOOST_RANGE()
+# --------------------
+# Look for Boost.Range
+BOOST_DEFUN([Range],
+[BOOST_FIND_HEADER([boost/range/adaptors.hpp])])
+
+# BOOST_UNORDERED()
+# -----------------
+# Look for Boost.Unordered
+BOOST_DEFUN([Unordered],
+[BOOST_FIND_HEADER([boost/unordered_map.hpp])])
+
+
+# BOOST_UUID()
+# ------------
+# Look for Boost.Uuid
+BOOST_DEFUN([Uuid],
+[BOOST_FIND_HEADER([boost/uuid/uuid.hpp])])
+
+
+# BOOST_PROGRAM_OPTIONS([PREFERRED-RT-OPT])
+# -----------------------------------------
+# Look for Boost.Program_options. For the documentation of PREFERRED-RT-OPT,
+# see the documentation of BOOST_FIND_LIB above.
+BOOST_DEFUN([Program_Options],
+[BOOST_FIND_LIB([program_options], [$1],
+ [boost/program_options.hpp],
+ [boost::program_options::options_description d("test");])
+])# BOOST_PROGRAM_OPTIONS
+
+
+
+# _BOOST_PYTHON_CONFIG(VARIABLE, FLAG)
+# ------------------------------------
+# Save VARIABLE, and define it via `python-config --FLAG`.
+# Substitute BOOST_PYTHON_VARIABLE.
+m4_define([_BOOST_PYTHON_CONFIG],
+[AC_SUBST([BOOST_PYTHON_$1],
+ [`python-config --$2 2>/dev/null`])dnl
+boost_python_save_$1=$$1
+$1="$$1 $BOOST_PYTHON_$1"])
+
+
+# BOOST_PYTHON([PREFERRED-RT-OPT])
+# --------------------------------
+# Look for Boost.Python. For the documentation of PREFERRED-RT-OPT,
+# see the documentation of BOOST_FIND_LIB above.
+BOOST_DEFUN([Python],
+[_BOOST_PYTHON_CONFIG([CPPFLAGS], [includes])
+_BOOST_PYTHON_CONFIG([LDFLAGS], [ldflags])
+_BOOST_PYTHON_CONFIG([LIBS], [libs])
+m4_pattern_allow([^BOOST_PYTHON_MODULE$])dnl
+BOOST_FIND_LIBS([python], [python python3], [$1],
+ [boost/python.hpp],
+ [], [BOOST_PYTHON_MODULE(empty) {}])
+CPPFLAGS=$boost_python_save_CPPFLAGS
+LDFLAGS=$boost_python_save_LDFLAGS
+LIBS=$boost_python_save_LIBS
+])# BOOST_PYTHON
+
+
+# BOOST_REF()
+# -----------
+# Look for Boost.Ref
+BOOST_DEFUN([Ref],
+[BOOST_FIND_HEADER([boost/ref.hpp])])
+
+
+# BOOST_REGEX([PREFERRED-RT-OPT])
+# -------------------------------
+# Look for Boost.Regex. For the documentation of PREFERRED-RT-OPT, see the
+# documentation of BOOST_FIND_LIB above.
+BOOST_DEFUN([Regex],
+[BOOST_FIND_LIB([regex], [$1],
+ [boost/regex.hpp],
+ [boost::regex exp("*"); boost::regex_match("foo", exp);])
+])# BOOST_REGEX
+
+
+# BOOST_SERIALIZATION([PREFERRED-RT-OPT])
+# ---------------------------------------
+# Look for Boost.Serialization. For the documentation of PREFERRED-RT-OPT, see
+# the documentation of BOOST_FIND_LIB above.
+BOOST_DEFUN([Serialization],
+[BOOST_FIND_LIB([serialization], [$1],
+ [boost/archive/text_oarchive.hpp],
+ [std::ostream* o = 0; // Cheap way to get an ostream...
+ boost::archive::text_oarchive t(*o);])
+])# BOOST_SERIALIZATION
+
+
+# BOOST_SIGNALS([PREFERRED-RT-OPT])
+# ---------------------------------
+# Look for Boost.Signals. For the documentation of PREFERRED-RT-OPT, see the
+# documentation of BOOST_FIND_LIB above.
+BOOST_DEFUN([Signals],
+[BOOST_FIND_LIB([signals], [$1],
+ [boost/signal.hpp],
+ [boost::signal<void ()> s;])
+])# BOOST_SIGNALS
+
+
+# BOOST_SIGNALS2()
+# ----------------
+# Look for Boost.Signals2 (new since 1.39.0).
+BOOST_DEFUN([Signals2],
+[BOOST_FIND_HEADER([boost/signals2.hpp])
+])# BOOST_SIGNALS2
+
+
+# BOOST_SMART_PTR()
+# -----------------
+# Look for Boost.SmartPtr
+BOOST_DEFUN([Smart_Ptr],
+[BOOST_FIND_HEADER([boost/scoped_ptr.hpp])
+BOOST_FIND_HEADER([boost/shared_ptr.hpp])
+])
+
+
+# BOOST_STATICASSERT()
+# --------------------
+# Look for Boost.StaticAssert
+BOOST_DEFUN([StaticAssert],
+[BOOST_FIND_HEADER([boost/static_assert.hpp])])
+
+
+# BOOST_STRING_ALGO()
+# -------------------
+# Look for Boost.StringAlgo
+BOOST_DEFUN([String_Algo],
+[BOOST_FIND_HEADER([boost/algorithm/string.hpp])
+])
+
+
+# BOOST_SYSTEM([PREFERRED-RT-OPT])
+# --------------------------------
+# Look for Boost.System. For the documentation of PREFERRED-RT-OPT, see the
+# documentation of BOOST_FIND_LIB above. This library was introduced in Boost
+# 1.35.0.
+BOOST_DEFUN([System],
+[BOOST_FIND_LIB([system], [$1],
+ [boost/system/error_code.hpp],
+ [boost::system::error_code e; e.clear();])
+])# BOOST_SYSTEM
+
+
+# BOOST_TEST([PREFERRED-RT-OPT])
+# ------------------------------
+# Look for Boost.Test. For the documentation of PREFERRED-RT-OPT, see the
+# documentation of BOOST_FIND_LIB above.
+BOOST_DEFUN([Test],
+[m4_pattern_allow([^BOOST_CHECK$])dnl
+BOOST_FIND_LIB([unit_test_framework], [$1],
+ [boost/test/unit_test.hpp], [BOOST_CHECK(2 == 2);],
+ [using boost::unit_test::test_suite;
+ test_suite* init_unit_test_suite(int argc, char ** argv)
+ { return NULL; }])
+])# BOOST_TEST
+
+
+# BOOST_THREAD([PREFERRED-RT-OPT])
+# ---------------------------------
+# Look for Boost.Thread. For the documentation of PREFERRED-RT-OPT, see the
+# documentation of BOOST_FIND_LIB above.
+BOOST_DEFUN([Thread],
+[dnl Having the pthread flag is required at least on GCC3 where
+dnl boost/thread.hpp would complain if we try to compile without
+dnl -pthread on GNU/Linux.
+AC_REQUIRE([_BOOST_PTHREAD_FLAG])dnl
+boost_thread_save_LIBS=$LIBS
+boost_thread_save_LDFLAGS=$LDFLAGS
+boost_thread_save_CPPFLAGS=$CPPFLAGS
+# Link-time dependency from thread to system was added as of 1.49.0.
+if test $boost_major_version -ge 149; then
+BOOST_SYSTEM([$1])
+fi # end of the Boost.System check.
+m4_pattern_allow([^BOOST_SYSTEM_(LIBS|LDFLAGS)$])dnl
+LIBS="$LIBS $BOOST_SYSTEM_LIBS $boost_cv_pthread_flag"
+LDFLAGS="$LDFLAGS $BOOST_SYSTEM_LDFLAGS"
+CPPFLAGS="$CPPFLAGS $boost_cv_pthread_flag"
+
+# When compiling for the Windows platform, the threads library is named
+# differently. This suffix doesn't exist in new versions of Boost, or
+# possibly new versions of GCC on mingw I am assuming it's Boost's change for
+# now and I am setting version to 1.48, for lack of knowledge as to when this
+# change occurred.
+if test $boost_major_version -lt 148; then
+ case $host_os in
+ (*mingw*) boost_thread_lib_ext=_win32;;
+ esac
+fi
+BOOST_FIND_LIBS([thread], [thread$boost_thread_lib_ext],
+ [$1],
+ [boost/thread.hpp], [boost::thread t; boost::mutex m;])
+
+case $host_os in
+ (*mingw*) boost_thread_w32_socket_link=-lws2_32;;
+esac
+
+BOOST_THREAD_LIBS="$BOOST_THREAD_LIBS $BOOST_SYSTEM_LIBS $boost_cv_pthread_flag $boost_thread_w32_socket_link"
+BOOST_THREAD_LDFLAGS="$BOOST_SYSTEM_LDFLAGS"
+BOOST_CPPFLAGS="$BOOST_CPPFLAGS $boost_cv_pthread_flag"
+LIBS=$boost_thread_save_LIBS
+LDFLAGS=$boost_thread_save_LDFLAGS
+CPPFLAGS=$boost_thread_save_CPPFLAGS
+])# BOOST_THREAD
+
+AU_ALIAS([BOOST_THREADS], [BOOST_THREAD])
+
+
+# BOOST_TOKENIZER()
+# -----------------
+# Look for Boost.Tokenizer
+BOOST_DEFUN([Tokenizer],
+[BOOST_FIND_HEADER([boost/tokenizer.hpp])])
+
+
+# BOOST_TRIBOOL()
+# ---------------
+# Look for Boost.Tribool
+BOOST_DEFUN([Tribool],
+[BOOST_FIND_HEADER([boost/logic/tribool_fwd.hpp])
+BOOST_FIND_HEADER([boost/logic/tribool.hpp])
+])
+
+
+# BOOST_TUPLE()
+# -------------
+# Look for Boost.Tuple
+BOOST_DEFUN([Tuple],
+[BOOST_FIND_HEADER([boost/tuple/tuple.hpp])])
+
+
+# BOOST_TYPETRAITS()
+# --------------------
+# Look for Boost.TypeTraits
+BOOST_DEFUN([TypeTraits],
+[BOOST_FIND_HEADER([boost/type_traits.hpp])])
+
+
+# BOOST_UTILITY()
+# ---------------
+# Look for Boost.Utility (noncopyable, result_of, base-from-member idiom,
+# etc.)
+BOOST_DEFUN([Utility],
+[BOOST_FIND_HEADER([boost/utility.hpp])])
+
+
+# BOOST_VARIANT()
+# ---------------
+# Look for Boost.Variant.
+BOOST_DEFUN([Variant],
+[BOOST_FIND_HEADER([boost/variant/variant_fwd.hpp])
+BOOST_FIND_HEADER([boost/variant.hpp])])
+
+
+# BOOST_POINTER_CONTAINER()
+# ------------------------
+# Look for Boost.PointerContainer
+BOOST_DEFUN([Pointer_Container],
+[BOOST_FIND_HEADER([boost/ptr_container/ptr_deque.hpp])
+BOOST_FIND_HEADER([boost/ptr_container/ptr_list.hpp])
+BOOST_FIND_HEADER([boost/ptr_container/ptr_vector.hpp])
+BOOST_FIND_HEADER([boost/ptr_container/ptr_array.hpp])
+BOOST_FIND_HEADER([boost/ptr_container/ptr_set.hpp])
+BOOST_FIND_HEADER([boost/ptr_container/ptr_map.hpp])
+])# BOOST_POINTER_CONTAINER
+
+
+# BOOST_WAVE([PREFERRED-RT-OPT])
+# ------------------------------
+# NOTE: If you intend to use Wave/Spirit with thread support, make sure you
+# call BOOST_THREAD first.
+# Look for Boost.Wave. For the documentation of PREFERRED-RT-OPT, see the
+# documentation of BOOST_FIND_LIB above.
+BOOST_DEFUN([Wave],
+[AC_REQUIRE([BOOST_FILESYSTEM])dnl
+AC_REQUIRE([BOOST_DATE_TIME])dnl
+boost_wave_save_LIBS=$LIBS
+boost_wave_save_LDFLAGS=$LDFLAGS
+m4_pattern_allow([^BOOST_((FILE)?SYSTEM|DATE_TIME|THREAD)_(LIBS|LDFLAGS)$])dnl
+LIBS="$LIBS $BOOST_SYSTEM_LIBS $BOOST_FILESYSTEM_LIBS $BOOST_DATE_TIME_LIBS \
+$BOOST_THREAD_LIBS"
+LDFLAGS="$LDFLAGS $BOOST_SYSTEM_LDFLAGS $BOOST_FILESYSTEM_LDFLAGS \
+$BOOST_DATE_TIME_LDFLAGS $BOOST_THREAD_LDFLAGS"
+BOOST_FIND_LIB([wave], [$1],
+ [boost/wave.hpp],
+ [boost::wave::token_id id; get_token_name(id);])
+LIBS=$boost_wave_save_LIBS
+LDFLAGS=$boost_wave_save_LDFLAGS
+])# BOOST_WAVE
+
+
+# BOOST_XPRESSIVE()
+# -----------------
+# Look for Boost.Xpressive (new since 1.36.0).
+BOOST_DEFUN([Xpressive],
+[BOOST_FIND_HEADER([boost/xpressive/xpressive.hpp])])
+
+
+# ----------------- #
+# Internal helpers. #
+# ----------------- #
+
+
+# _BOOST_PTHREAD_FLAG()
+# ---------------------
+# Internal helper for BOOST_THREAD. Computes boost_cv_pthread_flag
+# which must be used in CPPFLAGS and LIBS.
+#
+# Yes, we *need* to put the -pthread thing in CPPFLAGS because with GCC3,
+# boost/thread.hpp will trigger a #error if -pthread isn't used:
+# boost/config/requires_threads.hpp:47:5: #error "Compiler threading support
+# is not turned on. Please set the correct command line options for
+# threading: -pthread (Linux), -pthreads (Solaris) or -mthreads (Mingw32)"
+#
+# Based on ACX_PTHREAD: http://autoconf-archive.cryp.to/acx_pthread.html
+AC_DEFUN([_BOOST_PTHREAD_FLAG],
+[AC_REQUIRE([AC_PROG_CXX])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_LANG_PUSH([C++])dnl
+AC_CACHE_CHECK([for the flags needed to use pthreads], [boost_cv_pthread_flag],
+[ boost_cv_pthread_flag=
+ # The ordering *is* (sometimes) important. Some notes on the
+ # individual items follow:
+ # (none): in case threads are in libc; should be tried before -Kthread and
+ # other compiler flags to prevent continual compiler warnings
+ # -lpthreads: AIX (must check this before -lpthread)
+ # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
+ # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
+ # -llthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
+ # -pthread: GNU Linux/GCC (kernel threads), BSD/GCC (userland threads)
+ # -pthreads: Solaris/GCC
+ # -mthreads: MinGW32/GCC, Lynx/GCC
+ # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
+ # doesn't hurt to check since this sometimes defines pthreads too;
+ # also defines -D_REENTRANT)
+ # ... -mt is also the pthreads flag for HP/aCC
+ # -lpthread: GNU Linux, etc.
+ # --thread-safe: KAI C++
+ case $host_os in #(
+ *solaris*)
+ # On Solaris (at least, for some versions), libc contains stubbed
+ # (non-functional) versions of the pthreads routines, so link-based
+ # tests will erroneously succeed. (We need to link with -pthreads/-mt/
+ # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather
+ # a function called by this macro, so we could check for that, but
+ # who knows whether they'll stub that too in a future libc.) So,
+ # we'll just look for -pthreads and -lpthread first:
+ boost_pthread_flags="-pthreads -lpthread -mt -pthread";; #(
+ *)
+ boost_pthread_flags="-lpthreads -Kthread -kthread -llthread -pthread \
+ -pthreads -mthreads -lpthread --thread-safe -mt";;
+ esac
+ # Generate the test file.
+ AC_LANG_CONFTEST([AC_LANG_PROGRAM([#include <pthread.h>],
+ [pthread_t th; pthread_join(th, 0);
+ pthread_attr_init(0); pthread_cleanup_push(0, 0);
+ pthread_create(0,0,0,0); pthread_cleanup_pop(0);])])
+ for boost_pthread_flag in '' $boost_pthread_flags; do
+ boost_pthread_ok=false
+dnl Re-use the test file already generated.
+ boost_pthreads__save_LIBS=$LIBS
+ LIBS="$LIBS $boost_pthread_flag"
+ AC_LINK_IFELSE([],
+ [if grep ".*$boost_pthread_flag" conftest.err; then
+ echo "This flag seems to have triggered warnings" >&AS_MESSAGE_LOG_FD
+ else
+ boost_pthread_ok=:; boost_cv_pthread_flag=$boost_pthread_flag
+ fi])
+ LIBS=$boost_pthreads__save_LIBS
+ $boost_pthread_ok && break
+ done
+])
+AC_LANG_POP([C++])dnl
+])# _BOOST_PTHREAD_FLAG
+
+
+# _BOOST_gcc_test(MAJOR, MINOR)
+# -----------------------------
+# Internal helper for _BOOST_FIND_COMPILER_TAG.
+m4_define([_BOOST_gcc_test],
+["defined __GNUC__ && __GNUC__ == $1 && __GNUC_MINOR__ == $2 && !defined __ICC @ gcc$1$2"])dnl
+
+# _BOOST_mingw_test(MAJOR, MINOR)
+# -----------------------------
+# Internal helper for _BOOST_FIND_COMPILER_TAG.
+m4_define([_BOOST_mingw_test],
+["defined __GNUC__ && __GNUC__ == $1 && __GNUC_MINOR__ == $2 && !defined __ICC && \
+ (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \
+ || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw$1$2"])dnl
+
+
+# _BOOST_FIND_COMPILER_TAG()
+# --------------------------
+# Internal. When Boost is installed without --layout=system, each library
+# filename will hold a suffix that encodes the compiler used during the
+# build. The Boost build system seems to call this a `tag'.
+AC_DEFUN([_BOOST_FIND_COMPILER_TAG],
+[AC_REQUIRE([AC_PROG_CXX])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_CACHE_CHECK([for the toolset name used by Boost for $CXX],
+ [boost_cv_lib_tag],
+[boost_cv_lib_tag=unknown
+if test x$boost_cv_inc_path != xno; then
+ AC_LANG_PUSH([C++])dnl
+ # The following tests are mostly inspired by boost/config/auto_link.hpp
+ # The list is sorted to most recent/common to oldest compiler (in order
+ # to increase the likelihood of finding the right compiler with the
+ # least number of compilation attempt).
+ # Beware that some tests are sensible to the order (for instance, we must
+ # look for MinGW before looking for GCC3).
+ # I used one compilation test per compiler with a #error to recognize
+ # each compiler so that it works even when cross-compiling (let me know
+ # if you know a better approach).
+ # Known missing tags (known from Boost's tools/build/v2/tools/common.jam):
+ # como, edg, kcc, bck, mp, sw, tru, xlc
+ # I'm not sure about my test for `il' (be careful: Intel's ICC pre-defines
+ # the same defines as GCC's).
+ for i in \
+ _BOOST_mingw_test(8, 2) \
+ _BOOST_gcc_test(8, 2) \
+ _BOOST_mingw_test(8, 1) \
+ _BOOST_gcc_test(8, 1) \
+ _BOOST_mingw_test(8, 0) \
+ _BOOST_gcc_test(8, 0) \
+ _BOOST_mingw_test(7, 3) \
+ _BOOST_gcc_test(7, 3) \
+ _BOOST_mingw_test(7, 2) \
+ _BOOST_gcc_test(7, 2) \
+ _BOOST_mingw_test(7, 1) \
+ _BOOST_gcc_test(7, 1) \
+ _BOOST_mingw_test(7, 0) \
+ _BOOST_gcc_test(7, 0) \
+ _BOOST_mingw_test(6, 4) \
+ _BOOST_gcc_test(6, 4) \
+ _BOOST_mingw_test(6, 3) \
+ _BOOST_gcc_test(6, 3) \
+ _BOOST_mingw_test(6, 2) \
+ _BOOST_gcc_test(6, 2) \
+ _BOOST_mingw_test(6, 1) \
+ _BOOST_gcc_test(6, 1) \
+ _BOOST_mingw_test(6, 0) \
+ _BOOST_gcc_test(6, 0) \
+ _BOOST_mingw_test(5, 5) \
+ _BOOST_gcc_test(5, 5) \
+ _BOOST_mingw_test(5, 4) \
+ _BOOST_gcc_test(5, 4) \
+ _BOOST_mingw_test(5, 3) \
+ _BOOST_gcc_test(5, 3) \
+ _BOOST_mingw_test(5, 2) \
+ _BOOST_gcc_test(5, 2) \
+ _BOOST_mingw_test(5, 1) \
+ _BOOST_gcc_test(5, 1) \
+ _BOOST_mingw_test(5, 0) \
+ _BOOST_gcc_test(5, 0) \
+ _BOOST_mingw_test(4, 10) \
+ _BOOST_gcc_test(4, 10) \
+ _BOOST_mingw_test(4, 9) \
+ _BOOST_gcc_test(4, 9) \
+ _BOOST_mingw_test(4, 8) \
+ _BOOST_gcc_test(4, 8) \
+ _BOOST_mingw_test(4, 7) \
+ _BOOST_gcc_test(4, 7) \
+ _BOOST_mingw_test(4, 6) \
+ _BOOST_gcc_test(4, 6) \
+ _BOOST_mingw_test(4, 5) \
+ _BOOST_gcc_test(4, 5) \
+ _BOOST_mingw_test(4, 4) \
+ _BOOST_gcc_test(4, 4) \
+ _BOOST_mingw_test(4, 3) \
+ _BOOST_gcc_test(4, 3) \
+ _BOOST_mingw_test(4, 2) \
+ _BOOST_gcc_test(4, 2) \
+ _BOOST_mingw_test(4, 1) \
+ _BOOST_gcc_test(4, 1) \
+ _BOOST_mingw_test(4, 0) \
+ _BOOST_gcc_test(4, 0) \
+ "defined __GNUC__ && __GNUC__ == 3 && !defined __ICC \
+ && (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \
+ || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw" \
+ _BOOST_gcc_test(3, 4) \
+ _BOOST_gcc_test(3, 3) \
+ "defined _MSC_VER && _MSC_VER >= 1500 @ vc90" \
+ "defined _MSC_VER && _MSC_VER == 1400 @ vc80" \
+ _BOOST_gcc_test(3, 2) \
+ "defined _MSC_VER && _MSC_VER == 1310 @ vc71" \
+ _BOOST_gcc_test(3, 1) \
+ _BOOST_gcc_test(3, 0) \
+ "defined __BORLANDC__ @ bcb" \
+ "defined __ICC && (defined __unix || defined __unix__) @ il" \
+ "defined __ICL @ iw" \
+ "defined _MSC_VER && _MSC_VER == 1300 @ vc7" \
+ _BOOST_gcc_test(2, 95) \
+ "defined __MWERKS__ && __MWERKS__ <= 0x32FF @ cw9" \
+ "defined _MSC_VER && _MSC_VER < 1300 && !defined UNDER_CE @ vc6" \
+ "defined _MSC_VER && _MSC_VER < 1300 && defined UNDER_CE @ evc4" \
+ "defined __MWERKS__ && __MWERKS__ <= 0x31FF @ cw8"
+ do
+ boost_tag_test=`expr "X$i" : 'X\([[^@]]*\) @ '`
+ boost_tag=`expr "X$i" : 'X[[^@]]* @ \(.*\)'`
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#if $boost_tag_test
+/* OK */
+#else
+# error $boost_tag_test
+#endif
+]])], [boost_cv_lib_tag=$boost_tag; break], [])
+ done
+AC_LANG_POP([C++])dnl
+ case $boost_cv_lib_tag in #(
+ # Some newer (>= 1.35?) versions of Boost seem to only use "gcc" as opposed
+ # to "gcc41" for instance.
+ *-gcc | *'-gcc ') :;; #( Don't re-add -gcc: it's already in there.
+ gcc*)
+ boost_tag_x=
+ case $host_os in #(
+ darwin*)
+ if test $boost_major_version -ge 136; then
+ # The `x' added in r46793 of Boost.
+ boost_tag_x=x
+ fi;;
+ esac
+ # We can specify multiple tags in this variable because it's used by
+ # BOOST_FIND_LIB that does a `for tag in -$boost_cv_lib_tag' ...
+ boost_cv_lib_tag="$boost_tag_x$boost_cv_lib_tag -${boost_tag_x}gcc"
+ ;; #(
+ unknown)
+ AC_MSG_WARN([[could not figure out which toolset name to use for $CXX]])
+ boost_cv_lib_tag=
+ ;;
+ esac
+fi])dnl end of AC_CACHE_CHECK
+])# _BOOST_FIND_COMPILER_TAG
+
+
+# _BOOST_GUESS_WHETHER_TO_USE_MT()
+# --------------------------------
+# Compile a small test to try to guess whether we should favor MT (Multi
+# Thread) flavors of Boost. Sets boost_guess_use_mt accordingly.
+AC_DEFUN([_BOOST_GUESS_WHETHER_TO_USE_MT],
+[# Check whether we do better use `mt' even though we weren't ask to.
+AC_LANG_PUSH([C++])dnl
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#if defined _REENTRANT || defined _MT || defined __MT__
+/* use -mt */
+#else
+# error MT not needed
+#endif
+]])], [boost_guess_use_mt=:], [boost_guess_use_mt=false])
+AC_LANG_POP([C++])dnl
+])
+
+# _BOOST_AC_LINK_IFELSE(PROGRAM, [ACTION-IF-TRUE], [ACTION-IF-FALSE])
+# -------------------------------------------------------------------
+# Fork of _AC_LINK_IFELSE that preserves conftest.o across calls. Fragile,
+# will break when Autoconf changes its internals. Requires that you manually
+# rm -f conftest.$ac_objext in between to really different tests, otherwise
+# you will try to link a conftest.o left behind by a previous test.
+# Used to aggressively optimize BOOST_FIND_LIB (see the big comment in this
+# macro).
+#
+# Don't use "break" in the actions, as it would short-circuit some code
+# this macro runs after the actions.
+m4_define([_BOOST_AC_LINK_IFELSE],
+[m4_ifvaln([$1], [AC_LANG_CONFTEST([$1])])dnl
+rm -f conftest$ac_exeext
+boost_save_ac_ext=$ac_ext
+boost_use_source=:
+# If we already have a .o, re-use it. We change $ac_ext so that $ac_link
+# tries to link the existing object file instead of compiling from source.
+test -f conftest.$ac_objext && ac_ext=$ac_objext && boost_use_source=false &&
+ _AS_ECHO_LOG([re-using the existing conftest.$ac_objext])
+AS_IF([_AC_DO_STDERR($ac_link) && {
+ test -z "$ac_[]_AC_LANG_ABBREV[]_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ $as_executable_p conftest$ac_exeext
+dnl FIXME: use AS_TEST_X instead when 2.61 is widespread enough.
+ }],
+ [$2],
+ [if $boost_use_source; then
+ _AC_MSG_LOG_CONFTEST
+ fi
+ $3])
+ac_objext=$boost_save_ac_objext
+ac_ext=$boost_save_ac_ext
+dnl Delete also the IPA/IPO (Inter Procedural Analysis/Optimization)
+dnl information created by the PGI compiler (conftest_ipa8_conftest.oo),
+dnl as it would interfere with the next link command.
+rm -f core conftest.err conftest_ipa8_conftest.oo \
+ conftest$ac_exeext m4_ifval([$1], [conftest.$ac_ext])[]dnl
+])# _BOOST_AC_LINK_IFELSE
+
+# Local Variables:
+# mode: autoconf
+# End:
diff --git a/m4/libtool.m4 b/m4/libtool.m4
new file mode 100644
index 0000000..c4c0294
--- /dev/null
+++ b/m4/libtool.m4
@@ -0,0 +1,8394 @@
+# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
+#
+# Copyright (C) 1996-2001, 2003-2015 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) 2014 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 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 this program. If not, see <http://www.gnu.org/licenses/>.
+])
+
+# serial 58 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.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK
+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_PREPARE_CC_BASENAME
+# -----------------------
+m4_defun([_LT_PREPARE_CC_BASENAME], [
+# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+ for cc_temp in @S|@*""; do
+ case $cc_temp in
+ compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
+ distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+ done
+ func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+])# _LT_PREPARE_CC_BASENAME
+
+
+# _LT_CC_BASENAME(CC)
+# -------------------
+# It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME,
+# but that macro is also expanded into generated libtool script, which
+# arranges for $SED and $ECHO to be set by different means.
+m4_defun([_LT_CC_BASENAME],
+[m4_require([_LT_PREPARE_CC_BASENAME])dnl
+AC_REQUIRE([_LT_DECL_SED])dnl
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
+func_cc_basename $1
+cc_basename=$func_cc_basename_result
+])
+
+
+# _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
+m4_require([_LT_CMD_TRUNCATE])dnl
+
+_LT_CONFIG_LIBTOOL_INIT([
+# See if we are running on zsh, and set the options that 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 set != "${COLLECT_NAMES+set}"; 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\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+ ;;
+ *)
+ 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\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+ ;;
+ *)
+ 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 0 = "$lt_write_fail" && 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@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 yes = "$silent" &&
+ 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 that 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
+# Generated automatically by $as_me ($PACKAGE) $VERSION
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit, 1996
+
+_LT_COPYING
+_LT_LIBTOOL_TAGS
+
+# Configured defaults for sys_lib_dlsearch_path munging.
+: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
+
+# ### BEGIN LIBTOOL CONFIG
+_LT_LIBTOOL_CONFIG_VARS
+_LT_LIBTOOL_TAG_VARS
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+ cat <<'_LT_EOF' >> "$cfgfile"
+
+# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_PREPARE_MUNGE_PATH_LIST
+_LT_PREPARE_CC_BASENAME
+
+# ### END FUNCTIONS SHARED WITH CONFIGURE
+
+_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 set != "${COLLECT_NAMES+set}"; 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)
+
+ 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'
+ 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 0 = "$_lt_result"; 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 cr libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD
+ $AR cr 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 0 = "$_lt_result" && $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[[912]]*)
+ _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+ 10.[[012]][[,.]]*)
+ _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+ 10.*|11.*)
+ _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+ esac
+ ;;
+ esac
+ if test yes = "$lt_cv_apple_cc_single_mod"; then
+ _lt_dar_single_mod='$single_module'
+ fi
+ if test yes = "$lt_cv_ld_exported_symbols_list"; 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 no = "$lt_cv_ld_force_load"; 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 yes = "$lt_cv_ld_force_load"; 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*|nagfor*) _lt_dar_can_shared=yes ;;
+ *) _lt_dar_can_shared=$GCC ;;
+ esac
+ if test yes = "$_lt_dar_can_shared"; 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 yes != "$lt_cv_apple_cc_single_mod"; 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 set = "${lt_cv_aix_libpath+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 that will find a shell with a builtin
+# printf (that 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],
+[AS_HELP_STRING([--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 yes = "$GCC"; 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 where 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 no = "$enable_libtool_lock" || 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 what ABI is being produced by ac_compile, and set mode
+ # options accordingly.
+ 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 what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
+ echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ if test yes = "$lt_cv_prog_gnu_ld"; 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*
+ ;;
+
+mips64*-*linux*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
+ echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ emul=elf
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ emul="${emul}32"
+ ;;
+ *64-bit*)
+ emul="${emul}64"
+ ;;
+ esac
+ case `/usr/bin/file conftest.$ac_objext` in
+ *MSB*)
+ emul="${emul}btsmip"
+ ;;
+ *LSB*)
+ emul="${emul}ltsmip"
+ ;;
+ esac
+ case `/usr/bin/file conftest.$ac_objext` in
+ *N32*)
+ emul="${emul}n32"
+ ;;
+ esac
+ LD="${LD-ld} -m $emul"
+ fi
+ rm -rf conftest*
+ ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly. Note that the listed cases only cover the
+ # situations where additional linker options are needed (such as when
+ # doing 32-bit compilation for a host where ld defaults to 64-bit, or
+ # vice versa); the common cases where no linker options are needed do
+ # not appear in the list.
+ 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*)
+ case `/usr/bin/file conftest.o` in
+ *x86-64*)
+ LD="${LD-ld} -m elf32_x86_64"
+ ;;
+ *)
+ LD="${LD-ld} -m elf_i386"
+ ;;
+ esac
+ ;;
+ powerpc64le-*linux*)
+ LD="${LD-ld} -m elf32lppclinux"
+ ;;
+ 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"
+ ;;
+ powerpcle-*linux*)
+ LD="${LD-ld} -m elf64lppc"
+ ;;
+ 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 yes != "$lt_cv_cc_needs_belf"; then
+ # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+ CFLAGS=$SAVE_CFLAGS
+ fi
+ ;;
+*-*solaris*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
+ 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*|x86_64-*-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=cr}
+_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 0 -eq "$ac_status"; then
+ # Ensure the archiver fails upon bogus file names.
+ rm -f conftest.$ac_objext libconftest.a
+ AC_TRY_EVAL([lt_ar_try])
+ if test 0 -ne "$ac_status"; then
+ lt_cv_ar_at_file=@
+ fi
+ fi
+ rm -f conftest.* libconftest.a
+ ])
+ ])
+
+if test no = "$lt_cv_ar_at_file"; 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
+ bitrig* | 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" ## exclude from sc_useless_quotes_in_assignment
+ # 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 yes = "[$]$2"; 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 yes = "[$]$2"; 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;
+ ;;
+
+ bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*)
+ # 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" && \
+ test undefined != "$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 17 != "$i" # 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 yes = "$cross_compiling"; 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 -fvisibility=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 yes != "$enable_dlopen"; 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
+ ])
+ ;;
+
+ tpf*)
+ # Don't try to run any link tests for TPF. We know it's impossible
+ # because TPF is a cross-compiler, and we know how we open DSOs.
+ lt_cv_dlopen=dlopen
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=no
+ ;;
+
+ *)
+ 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 no = "$lt_cv_dlopen"; then
+ enable_dlopen=no
+ else
+ enable_dlopen=yes
+ fi
+
+ case $lt_cv_dlopen in
+ dlopen)
+ save_CPPFLAGS=$CPPFLAGS
+ test yes = "$ac_cv_header_dlfcn_h" && 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 yes = "$lt_cv_dlopen_self"; 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 no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; 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 no = "$hard_links"; 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 where 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 yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then
+
+ # We can hardcode non-existent directories.
+ if test no != "$_LT_TAGVAR(hardcode_direct, $1)" &&
+ # 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 no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" &&
+ test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; 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 relink = "$_LT_TAGVAR(hardcode_action, $1)" ||
+ test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test yes = "$shlibpath_overrides_runpath" ||
+ test no = "$enable_shared"; 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_PREPARE_MUNGE_PATH_LIST
+# ---------------------------
+# Make sure func_munge_path_list() is defined correctly.
+m4_defun([_LT_PREPARE_MUNGE_PATH_LIST],
+[[# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+# string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+# string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+# string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+# "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+# VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+ case x@S|@2 in
+ x)
+ ;;
+ *:)
+ eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\"
+ ;;
+ x:*)
+ eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\"
+ ;;
+ *::*)
+ eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+ eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\"
+ ;;
+ *)
+ eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\"
+ ;;
+ esac
+}
+]])# _LT_PREPARE_PATH_LIST
+
+
+# _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
+m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl
+AC_MSG_CHECKING([dynamic linker characteristics])
+m4_if([$1],
+ [], [
+if test yes = "$GCC"; 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`
+ # ...but if some path component already ends with the multilib dir we assume
+ # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer).
+ case "$lt_multi_os_dir; $lt_search_path_spec " in
+ "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*)
+ lt_multi_os_dir=
+ ;;
+ esac
+ 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"
+ elif test -n "$lt_multi_os_dir"; then
+ 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
+
+AC_ARG_VAR([LT_SYS_LIBRARY_PATH],
+[User-defined run-time library search path.])
+
+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 ia64 = "$host_cpu"; 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
+ # Using Import Files as archive members, it is possible to support
+ # filename-based versioning of shared library archives on AIX. While
+ # this would work for both with and without runtime linking, it will
+ # prevent static linking of such archives. So we do filename-based
+ # shared library versioning with .so extension only, which is used
+ # when both runtime linking and shared linking is enabled.
+ # Unfortunately, runtime linking may impact performance, so we do
+ # not want this to be the default eventually. Also, we use the
+ # versioned .so libs for executables only if there is the -brtl
+ # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+ # To allow for filename-based versioning support, we need to create
+ # libNAME.so.V as an archive file, containing:
+ # *) an Import File, referring to the versioned filename of the
+ # archive as well as the shared archive member, telling the
+ # bitwidth (32 or 64) of that shared object, and providing the
+ # list of exported symbols of that shared object, eventually
+ # decorated with the 'weak' keyword
+ # *) the shared object with the F_LOADONLY flag set, to really avoid
+ # it being seen by the linker.
+ # At run time we better use the real file rather than another symlink,
+ # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+ case $with_aix_soname,$aix_use_runtimelinking in
+ # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ aix,yes) # traditional libtool
+ dynamic_linker='AIX unversionable lib.so'
+ # 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'
+ ;;
+ aix,no) # traditional AIX only
+ dynamic_linker='AIX lib.a[(]lib.so.V[)]'
+ # 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'
+ ;;
+ svr4,*) # full svr4 only
+ dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,yes) # both, prefer svr4
+ dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # unpreferred sharedlib libNAME.a needs extra handling
+ postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+ postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,no) # both, prefer aix
+ dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]"
+ library_names_spec='$libname$release.a $libname.a'
+ soname_spec='$libname$release$shared_ext$major'
+ # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+ postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+ postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+ ;;
+ esac
+ 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%'\''`; $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$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ 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
+ ;;
+
+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=no
+ 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 32 = "$HPUX_IA64_MODE"; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux32
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux64
+ fi
+ ;;
+ 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 yes = "$lt_cv_prog_gnu_ld"; 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
+ ;;
+
+linux*android*)
+ version_type=none # Android doesn't support versioned libraries.
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext'
+ soname_spec='$libname$release$shared_ext'
+ finish_cmds=
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+
+ # 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
+
+ dynamic_linker='Android linker'
+ # Don't embed -rpath directories since the linker doesn't support them.
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | 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
+
+ # Ideally, we could use ldconfig to report *all* directores which are
+ # searched for libraries, however this is still not possible. Aside from not
+ # being certain /sbin/ldconfig is available, command
+ # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+ # even though it is searched at run-time. Try to do the best guess by
+ # appending ld.so.conf contents (and includes) 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="/lib /usr/lib $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'
+ ;;
+
+netbsdelf*-gnu)
+ version_type=linux
+ 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='NetBSD ld.elf_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* | bitrig*)
+ version_type=sunos
+ sys_lib_dlsearch_path_spec=/usr/lib
+ need_lib_prefix=no
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+ need_version=no
+ else
+ need_version=yes
+ fi
+ 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
+ shlibpath_overrides_runpath=yes
+ ;;
+
+os2*)
+ libname_spec='$name'
+ version_type=windows
+ shrext_cmds=.dll
+ need_version=no
+ need_lib_prefix=no
+ # OS/2 can only load a DLL with a base name of 8 characters or less.
+ soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+ v=$($ECHO $release$versuffix | tr -d .-);
+ n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+ $ECHO $n$v`$shared_ext'
+ library_names_spec='${libname}_dll.$libext'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=BEGINLIBPATH
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ 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'
+ ;;
+
+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 yes = "$with_gnu_ld"; 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=sco
+ 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 yes = "$with_gnu_ld"; 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 no = "$dynamic_linker" && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test yes = "$GCC"; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+ sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
+fi
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+ sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
+fi
+
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+_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], [configure_time_dlsearch_path], [2],
+ [Detected run-time system search path for libraries])
+_LT_DECL([], [configure_time_lt_sys_library_path], [2],
+ [Explicit LT_SYS_LIBRARY_PATH set during ./configure time])
+])# _LT_SYS_DYNAMIC_LINKER
+
+
+# _LT_PATH_TOOL_PREFIX(TOOL)
+# --------------------------
+# find a file program that 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@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 that 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 no = "$withval" || with_gnu_ld=yes],
+ [with_gnu_ld=no])dnl
+
+ac_prog=ld
+if test yes = "$GCC"; 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 yes = "$with_gnu_ld"; 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 no != "$with_gnu_ld" && break
+ ;;
+ *)
+ test yes != "$with_gnu_ld" && 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 yes != "$GCC"; then
+ reload_cmds=false
+ fi
+ ;;
+ darwin*)
+ if test yes = "$GCC"; 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_PATH_DD
+# -----------
+# find a working dd
+m4_defun([_LT_PATH_DD],
+[AC_CACHE_CHECK([for a working dd], [ac_cv_path_lt_DD],
+[printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+: ${lt_DD:=$DD}
+AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd],
+[if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+ cmp -s conftest.i conftest.out \
+ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=:
+fi])
+rm -f conftest.i conftest2.i conftest.out])
+])# _LT_PATH_DD
+
+
+# _LT_CMD_TRUNCATE
+# ----------------
+# find command to truncate a binary pipe
+m4_defun([_LT_CMD_TRUNCATE],
+[m4_require([_LT_PATH_DD])
+AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin],
+[printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+lt_cv_truncate_bin=
+if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+ cmp -s conftest.i conftest.out \
+ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1"
+fi
+rm -f conftest.i conftest2.i conftest.out
+test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"])
+_LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1],
+ [Command to truncate a binary pipe])
+])# _LT_CMD_TRUNCATE
+
+
+# _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
+# that 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.
+ if ( 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
+ ;;
+
+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 | gnu*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+netbsd* | netbsdelf*-gnu)
+ 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* | bitrig*)
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; 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
+ ;;
+os2*)
+ 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
+ # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
+ case $build_os in
+ mingw*) lt_bad_file=conftest.nm/nofile ;;
+ *) lt_bad_file=/dev/null ;;
+ esac
+ case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in
+ *$lt_bad_file* | *'Invalid file or object type'*)
+ lt_cv_path_NM="$tmp_nm -B"
+ break 2
+ ;;
+ *)
+ case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+ */dev/null*)
+ lt_cv_path_NM="$tmp_nm -p"
+ break 2
+ ;;
+ *)
+ 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 no != "$lt_cv_path_NM"; 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 -headers /dev/null 2>&1 | sed '1q'` in
+ *COFF*)
+ DUMPBIN="$DUMPBIN -symbols -headers"
+ ;;
+ *)
+ 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 one 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 yes != "$lt_cv_path_mainfest_tool"; then
+ MANIFEST_TOOL=:
+fi
+_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl
+])# _LT_PATH_MANIFEST_TOOL
+
+
+# _LT_DLL_DEF_P([FILE])
+# ---------------------
+# True iff FILE is a Windows DLL '.def' file.
+# Keep in sync with func_dll_def_p in the libtool script
+AC_DEFUN([_LT_DLL_DEF_P],
+[dnl
+ test DEF = "`$SED -n dnl
+ -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace
+ -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments
+ -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl
+ -e q dnl Only consider the first "real" line
+ $1`" dnl
+])# _LT_DLL_DEF_P
+
+
+# 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 yes = "$GCC"; 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 ia64 = "$host_cpu"; 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
+
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+ # Gets list of data symbols to import.
+ lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'"
+ # Adjust the below global symbol transforms to fixup imported variables.
+ lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
+ lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'"
+ lt_c_name_lib_hook="\
+ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\
+ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'"
+else
+ # Disable hooks by default.
+ lt_cv_sys_global_symbol_to_import=
+ lt_cdecl_hook=
+ lt_c_name_hook=
+ lt_c_name_lib_hook=
+fi
+
+# 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"\
+$lt_cdecl_hook\
+" -e 's/^T .* \(.*\)$/extern int \1();/p'"\
+" -e 's/^$symcode$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"\
+$lt_c_name_hook\
+" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'"
+
+# Transform an extracted symbol line into symbol name with lib prefix and
+# symbol address.
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\
+$lt_c_name_lib_hook\
+" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/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,
+ # D for any global variable and I for any imported 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};"\
+" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\
+" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\
+" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\
+" \$ 0!~/External *\|/{next};"\
+" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+" {if(hide[section]) next};"\
+" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\
+" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\
+" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\
+" s[1]~prfx {split(s[1],t,\"@\"); print f,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
+ $ECHO "$as_me:$LINENO: $NM conftest.$ac_objext | $lt_cv_sys_global_symbol_pipe > $nlist" >&AS_MESSAGE_LOG_FD
+ if eval "$NM" conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist 2>&AS_MESSAGE_LOG_FD && 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 can't be const, because runtime
+ relocations are performed -- see ld's documentation on pseudo-relocs. */
+# define LT@&t@_DLSYM_CONST
+#elif defined __osf__
+/* This system does not cope well with relocations in const data. */
+# define LT@&t@_DLSYM_CONST
+#else
+# define LT@&t@_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@_DLSYM_CONST struct {
+ const char *name;
+ void *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[[]] =
+{
+ { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+ $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$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 yes = "$pipe_works"; 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_import], [lt_cv_sys_global_symbol_to_import], [1],
+ [Transform the output of nm into a list of symbols to manually relocate])
+_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_interface], [lt_cv_nm_interface], [1],
+ [The name lister interface])
+_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 yes = "$GXX"; 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 ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ fi
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+
+ 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'])
+ case $host_os in
+ os2*)
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'
+ ;;
+ esac
+ ;;
+ 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 ia64 = "$host_cpu"; 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 ia64 != "$host_cpu"; 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 | 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* | netbsdelf*-gnu)
+ ;;
+ *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 yes = "$GCC"; 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 ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ fi
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+
+ 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'])
+ case $host_os in
+ os2*)
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'
+ ;;
+ esac
+ ;;
+
+ 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 ia64 = "$host_cpu"; 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
+ ;;
+
+ 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'
+ case $cc_basename in
+ 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'
+ ;;
+ esac
+ ;;
+
+ 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'])
+ case $host_os in
+ os2*)
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'
+ ;;
+ esac
+ ;;
+
+ 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 | 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'
+ ;;
+ # flang / f18. f95 an alias for gfortran or flang on Debian
+ flang* | f18* | f95*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ _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'
+ ;;
+ tcc*)
+ # Fabrice Bellard et al's Tiny 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)='-static'
+ ;;
+ 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 that 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@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@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 GNU nm, but means don't demangle to AIX nm.
+ # Without the "-l" option, or with the "-B" option, AIX nm treats
+ # weak defined symbols like other global defined symbols, whereas
+ # GNU nm marks them as "W".
+ # While the 'weak' keyword is ignored in the Export File, we need
+ # it in the Import File for the 'aix-soname' feature, so we have
+ # to replace the "-B" option with "-P" for AIX nm.
+ 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) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
+ else
+ _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | 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
+ ;;
+ linux* | k*bsd*-gnu | gnu*)
+ _LT_TAGVAR(link_all_deplibs, $1)=no
+ ;;
+ *)
+ _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 yes != "$GCC"; then
+ with_gnu_ld=no
+ fi
+ ;;
+ interix*)
+ # we just hope/assume this is gcc and not c89 (= MSVC++)
+ with_gnu_ld=yes
+ ;;
+ openbsd* | bitrig*)
+ with_gnu_ld=no
+ ;;
+ linux* | k*bsd*-gnu | gnu*)
+ _LT_TAGVAR(link_all_deplibs, $1)=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 yes = "$with_gnu_ld"; 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 yes = "$lt_use_gnu_ld_interface"; 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 | $SED -e 's/([^)]\+)\s\+//' 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 ia64 != "$host_cpu"; 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@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, use it as
+ # is; otherwise, prepend EXPORTS...
+ _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); 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
+ ;;
+
+ os2*)
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+ shrext_cmds=.dll
+ _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ prefix_cmds="$SED"~
+ if test EXPORTS = "`$SED 1q $export_symbols`"; then
+ prefix_cmds="$prefix_cmds -e 1d";
+ fi~
+ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ _LT_TAGVAR(enable_shared_with_static_runtimes, $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 linux-dietlibc = "$host_os"; 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 no = "$tmp_diet"
+ 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' ;;
+ nagfor*) # NAGFOR 5.3
+ tmp_sharedflag='-Wl,-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 yes = "$supports_anon_versioning"; 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
+ tcc*)
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic'
+ ;;
+ 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 yes = "$supports_anon_versioning"; 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* | netbsdelf*-gnu)
+ 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 cannot
+*** 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 no = "$_LT_TAGVAR(ld_shlibs, $1)"; 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 yes = "$GCC" && 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 ia64 = "$host_cpu"; 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 GNU nm, but means don't demangle to AIX nm.
+ # Without the "-l" option, or with the "-B" option, AIX nm treats
+ # weak defined symbols like other global defined symbols, whereas
+ # GNU nm marks them as "W".
+ # While the 'weak' keyword is ignored in the Export File, we need
+ # it in the Import File for the 'aix-soname' feature, so we have
+ # to replace the "-B" option with "-P" for AIX nm.
+ 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) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
+ else
+ _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | 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
+ # have runtime linking enabled, and use it for executables.
+ # For shared libraries, we enable/disable runtime linking
+ # depending on the kind of the shared library created -
+ # when "with_aix_soname,aix_use_runtimelinking" is:
+ # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables
+ # "aix,yes" lib.so shared, rtl:yes, for executables
+ # lib.a static archive
+ # "both,no" lib.so.V(shr.o) shared, rtl:yes
+ # lib.a(lib.so.V) shared, rtl:no, for executables
+ # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a(lib.so.V) shared, rtl:no
+ # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a static archive
+ case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+ for ld_flag in $LDFLAGS; do
+ if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then
+ aix_use_runtimelinking=yes
+ break
+ fi
+ done
+ if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # With aix-soname=svr4, we create the lib.so.V shared archives only,
+ # so we don't have lib.a shared libs to link our executables.
+ # We have to force runtime linking in this case.
+ aix_use_runtimelinking=yes
+ LDFLAGS="$LDFLAGS -Wl,-brtl"
+ fi
+ ;;
+ 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,'
+ case $with_aix_soname,$aix_use_runtimelinking in
+ aix,*) ;; # traditional, no import file
+ svr4,* | *,yes) # use import file
+ # The Import File defines what to hardcode.
+ _LT_TAGVAR(hardcode_direct, $1)=no
+ _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+ ;;
+ esac
+
+ if test yes = "$GCC"; 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 yes = "$aix_use_runtimelinking"; then
+ shared_flag="$shared_flag "'$wl-G'
+ fi
+ # Need to ensure runtime linking is disabled for the traditional
+ # shared library, or the linker may eventually find shared libraries
+ # /with/ Import File - we do not want to mix them.
+ shared_flag_aix='-shared'
+ shared_flag_svr4='-shared $wl-G'
+ else
+ # not using gcc
+ if test ia64 = "$host_cpu"; 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 yes = "$aix_use_runtimelinking"; then
+ shared_flag='$wl-G'
+ else
+ shared_flag='$wl-bM:SRE'
+ fi
+ shared_flag_aix='$wl-bM:SRE'
+ shared_flag_svr4='$wl-G'
+ 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,yes = "$with_aix_soname,$aix_use_runtimelinking"; 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 -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
+ else
+ if test ia64 = "$host_cpu"; 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 yes = "$with_gnu_ld"; 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
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+ # -brtl affects multiple linker settings, -berok does not and is overridden later
+ compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`'
+ if test svr4 != "$with_aix_soname"; then
+ # This is similar to how AIX traditionally builds its shared libraries.
+ _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+ fi
+ if test aix != "$with_aix_soname"; then
+ _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+ else
+ # used by -dlpreopen to get the symbols
+ _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir'
+ fi
+ _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d'
+ 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,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+ _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+ cp "$export_symbols" "$output_objdir/$soname.def";
+ echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+ else
+ $SED -e '\''s/^/-link -EXPORT:/'\'' < $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 yes = "$GCC"; 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 "x$output_objdir/$soname" = "x$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 "x$output_objdir/$soname" = "x$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 yes,no = "$GCC,$with_gnu_ld"; 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 no = "$with_gnu_ld"; 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 yes,no = "$GCC,$with_gnu_ld"; 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 no = "$with_gnu_ld"; 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 yes = "$GCC"; 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 yes = "$lt_cv_irix_exported_symbol"; 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
+ _LT_TAGVAR(link_all_deplibs, $1)=no
+ 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
+ ;;
+
+ linux*)
+ case $cc_basename in
+ tcc*)
+ # Fabrice Bellard et al's Tiny C Compiler
+ _LT_TAGVAR(ld_shlibs, $1)=yes
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+
+ netbsd* | netbsdelf*-gnu)
+ 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* | bitrig*)
+ 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__`"; 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
+ _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'
+ 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
+ shrext_cmds=.dll
+ _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ prefix_cmds="$SED"~
+ if test EXPORTS = "`$SED 1q $export_symbols`"; then
+ prefix_cmds="$prefix_cmds -e 1d";
+ fi~
+ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ ;;
+
+ osf3*)
+ if test yes = "$GCC"; 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 yes = "$GCC"; 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 yes = "$GCC"; 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 yes = "$GCC"; 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 sequent = "$host_vendor"; 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 yes = "$GCC"; 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 CANNOT 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 yes = "$GCC"; 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 sni = "$host_vendor"; 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 no = "$_LT_TAGVAR(ld_shlibs, $1)" && 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 yes,yes = "$GCC,$enable_shared"; 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 what 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 no = "$can_build_shared" && 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 yes = "$enable_shared" && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+
+ aix[[4-9]]*)
+ if test ia64 != "$host_cpu"; then
+ case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+ yes,aix,yes) ;; # shared object as lib.so file only
+ yes,svr4,*) ;; # shared object as lib.so archive member only
+ yes,*) enable_static=no ;; # shared object in lib.a archive as well
+ esac
+ 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 yes = "$enable_shared" || 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 no != "$CXX" &&
+ ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) ||
+ (test g++ != "$CXX"))); 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 yes != "$_lt_caught_CXX_error"; 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 yes = "$GXX"; 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 yes = "$GXX"; 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 yes = "$with_gnu_ld"; 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 ia64 = "$host_cpu"; 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
+ # have runtime linking enabled, and use it for executables.
+ # For shared libraries, we enable/disable runtime linking
+ # depending on the kind of the shared library created -
+ # when "with_aix_soname,aix_use_runtimelinking" is:
+ # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables
+ # "aix,yes" lib.so shared, rtl:yes, for executables
+ # lib.a static archive
+ # "both,no" lib.so.V(shr.o) shared, rtl:yes
+ # lib.a(lib.so.V) shared, rtl:no, for executables
+ # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a(lib.so.V) shared, rtl:no
+ # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a static archive
+ 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
+ if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # With aix-soname=svr4, we create the lib.so.V shared archives only,
+ # so we don't have lib.a shared libs to link our executables.
+ # We have to force runtime linking in this case.
+ aix_use_runtimelinking=yes
+ LDFLAGS="$LDFLAGS -Wl,-brtl"
+ fi
+ ;;
+ 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,'
+ case $with_aix_soname,$aix_use_runtimelinking in
+ aix,*) ;; # no import file
+ svr4,* | *,yes) # use import file
+ # The Import File defines what to hardcode.
+ _LT_TAGVAR(hardcode_direct, $1)=no
+ _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+ ;;
+ esac
+
+ if test yes = "$GXX"; 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 yes = "$aix_use_runtimelinking"; then
+ shared_flag=$shared_flag' $wl-G'
+ fi
+ # Need to ensure runtime linking is disabled for the traditional
+ # shared library, or the linker may eventually find shared libraries
+ # /with/ Import File - we do not want to mix them.
+ shared_flag_aix='-shared'
+ shared_flag_svr4='-shared $wl-G'
+ else
+ # not using gcc
+ if test ia64 = "$host_cpu"; 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 yes = "$aix_use_runtimelinking"; then
+ shared_flag='$wl-G'
+ else
+ shared_flag='$wl-bM:SRE'
+ fi
+ shared_flag_aix='$wl-bM:SRE'
+ shared_flag_svr4='$wl-G'
+ 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,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ # The "-G" linker flag allows undefined symbols.
+ _LT_TAGVAR(no_undefined_flag, $1)='-bernotok'
+ # 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 -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
+ else
+ if test ia64 = "$host_cpu"; 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 yes = "$with_gnu_ld"; 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
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+ # -brtl affects multiple linker settings, -berok does not and is overridden later
+ compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`'
+ if test svr4 != "$with_aix_soname"; then
+ # This is similar to how AIX traditionally builds its shared
+ # libraries. Need -bnortl late, we may have -brtl in LDFLAGS.
+ _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+ fi
+ if test aix != "$with_aix_soname"; then
+ _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+ else
+ # used by -dlpreopen to get the symbols
+ _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir'
+ fi
+ _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d'
+ 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@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,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+ _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+ cp "$export_symbols" "$output_objdir/$soname.def";
+ echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+ else
+ $SED -e '\''s/^/-link -EXPORT:/'\'' < $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, use it as
+ # is; otherwise, prepend EXPORTS...
+ _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); 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)
+ ;;
+
+ os2*)
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+ shrext_cmds=.dll
+ _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ prefix_cmds="$SED"~
+ if test EXPORTS = "`$SED 1q $export_symbols`"; then
+ prefix_cmds="$prefix_cmds -e 1d";
+ fi~
+ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ ;;
+
+ 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
+ ;;
+
+ 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 "x$output_objdir/$soname" = "x$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 yes = "$GXX"; 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 "x$output_objdir/$soname" = "x$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 no = "$with_gnu_ld"; 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 yes = "$GXX"; then
+ if test no = "$with_gnu_ld"; 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 yes = "$GXX"; then
+ if test no = "$with_gnu_ld"; 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 | 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 yes = "$supports_anon_versioning"; 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
+ ;;
+
+ openbsd* | bitrig*)
+ 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__`"; 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 yes,no = "$GXX,$with_gnu_ld"; 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 yes,no = "$GXX,$with_gnu_ld"; 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 $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 $wl-h $wl$soname -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 $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 $wl-h $wl$soname -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 CANNOT 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 no = "$_LT_TAGVAR(ld_shlibs, $1)" && 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 yes != "$_lt_caught_CXX_error"
+
+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 @S|@2 in
+ .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;;
+ *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@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 x-L = "$p" ||
+ test x-R = "$p"; 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 no = "$pre_test_object_deps_done"; 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 no = "$pre_test_object_deps_done"; 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)=
+ ;;
+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 no = "$F77"; 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 yes != "$_lt_disable_F77"; 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 no = "$can_build_shared" && 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 yes = "$enable_shared" && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+ aix[[4-9]]*)
+ if test ia64 != "$host_cpu"; then
+ case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+ yes,aix,yes) ;; # shared object as lib.so file only
+ yes,svr4,*) ;; # shared object as lib.so archive member only
+ yes,*) enable_static=no ;; # shared object in lib.a archive as well
+ esac
+ 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 yes = "$enable_shared" || 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 yes != "$_lt_disable_F77"
+
+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 no = "$FC"; 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 yes != "$_lt_disable_FC"; 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 no = "$can_build_shared" && 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 yes = "$enable_shared" && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+ aix[[4-9]]*)
+ if test ia64 != "$host_cpu"; then
+ case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+ yes,aix,yes) ;; # shared object as lib.so file only
+ yes,svr4,*) ;; # shared object as lib.so archive member only
+ yes,*) enable_static=no ;; # shared object in lib.a archive as well
+ esac
+ 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 yes = "$enable_shared" || 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 yes != "$_lt_disable_FC"
+
+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 set = "${GCJFLAGS+set}" || 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 10 -lt "$lt_ac_count" && 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],
+[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_PATH_CONVERSION_FUNCTIONS
+# -----------------------------
+# Determine what 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
new file mode 100644
index 0000000..94b0829
--- /dev/null
+++ b/m4/ltoptions.m4
@@ -0,0 +1,437 @@
+# Helper functions for option handling. -*- Autoconf -*-
+#
+# Copyright (C) 2004-2005, 2007-2009, 2011-2015 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 8 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_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4],
+ [_LT_WITH_AIX_SONAME([aix])])
+ ])
+])# _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_AIX_SONAME([DEFAULT])
+# ----------------------------------
+# implement the --with-aix-soname flag, and support the `aix-soname=aix'
+# and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT
+# is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'.
+m4_define([_LT_WITH_AIX_SONAME],
+[m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl
+shared_archive_member_spec=
+case $host,$enable_shared in
+power*-*-aix[[5-9]]*,yes)
+ AC_MSG_CHECKING([which variant of shared library versioning to provide])
+ AC_ARG_WITH([aix-soname],
+ [AS_HELP_STRING([--with-aix-soname=aix|svr4|both],
+ [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])],
+ [case $withval in
+ aix|svr4|both)
+ ;;
+ *)
+ AC_MSG_ERROR([Unknown argument to --with-aix-soname])
+ ;;
+ esac
+ lt_cv_with_aix_soname=$with_aix_soname],
+ [AC_CACHE_VAL([lt_cv_with_aix_soname],
+ [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT)
+ with_aix_soname=$lt_cv_with_aix_soname])
+ AC_MSG_RESULT([$with_aix_soname])
+ if test aix != "$with_aix_soname"; then
+ # For the AIX way of multilib, we name the shared archive member
+ # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',
+ # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File.
+ # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag,
+ # the AIX toolchain works better with OBJECT_MODE set (default 32).
+ if test 64 = "${OBJECT_MODE-32}"; then
+ shared_archive_member_spec=shr_64
+ else
+ shared_archive_member_spec=shr
+ fi
+ fi
+ ;;
+*)
+ with_aix_soname=aix
+ ;;
+esac
+
+_LT_DECL([], [shared_archive_member_spec], [0],
+ [Shared archive member basename, for filename based shared library versioning on AIX])dnl
+])# _LT_WITH_AIX_SONAME
+
+LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])])
+LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])])
+LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])])
+
+
+# _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=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
new file mode 100644
index 0000000..48bc934
--- /dev/null
+++ b/m4/ltsugar.m4
@@ -0,0 +1,124 @@
+# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*-
+#
+# Copyright (C) 2004-2005, 2007-2008, 2011-2015 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
new file mode 100644
index 0000000..fa04b52
--- /dev/null
+++ b/m4/ltversion.m4
@@ -0,0 +1,23 @@
+# ltversion.m4 -- version numbers -*- Autoconf -*-
+#
+# Copyright (C) 2004, 2011-2015 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 4179 ltversion.m4
+# This file is part of GNU Libtool
+
+m4_define([LT_PACKAGE_VERSION], [2.4.6])
+m4_define([LT_PACKAGE_REVISION], [2.4.6])
+
+AC_DEFUN([LTVERSION_VERSION],
+[macro_version='2.4.6'
+macro_revision='2.4.6'
+_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
new file mode 100644
index 0000000..c6b26f8
--- /dev/null
+++ b/m4/lt~obsolete.m4
@@ -0,0 +1,99 @@
+# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*-
+#
+# Copyright (C) 2004-2005, 2007, 2009, 2011-2015 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/m4/m4_ax_valgrind_check.m4 b/m4/m4_ax_valgrind_check.m4
new file mode 100644
index 0000000..e0d8a2f
--- /dev/null
+++ b/m4/m4_ax_valgrind_check.m4
@@ -0,0 +1,239 @@
+# ===========================================================================
+# https://www.gnu.org/software/autoconf-archive/ax_valgrind_check.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+# AX_VALGRIND_DFLT(memcheck|helgrind|drd|sgcheck, on|off)
+# AX_VALGRIND_CHECK()
+#
+# DESCRIPTION
+#
+# AX_VALGRIND_CHECK checks whether Valgrind is present and, if so, allows
+# running `make check` under a variety of Valgrind tools to check for
+# memory and threading errors.
+#
+# Defines VALGRIND_CHECK_RULES which should be substituted in your
+# Makefile; and $enable_valgrind which can be used in subsequent configure
+# output. VALGRIND_ENABLED is defined and substituted, and corresponds to
+# the value of the --enable-valgrind option, which defaults to being
+# enabled if Valgrind is installed and disabled otherwise. Individual
+# Valgrind tools can be disabled via --disable-valgrind-<tool>, the
+# default is configurable via the AX_VALGRIND_DFLT command or is to use
+# all commands not disabled via AX_VALGRIND_DFLT. All AX_VALGRIND_DFLT
+# calls must be made before the call to AX_VALGRIND_CHECK.
+#
+# If unit tests are written using a shell script and automake's
+# LOG_COMPILER system, the $(VALGRIND) variable can be used within the
+# shell scripts to enable Valgrind, as described here:
+#
+# https://www.gnu.org/software/gnulib/manual/html_node/Running-self_002dtests-under-valgrind.html
+#
+# Usage example:
+#
+# configure.ac:
+#
+# AX_VALGRIND_DFLT([sgcheck], [off])
+# AX_VALGRIND_CHECK
+#
+# in each Makefile.am with tests:
+#
+# @VALGRIND_CHECK_RULES@
+# VALGRIND_SUPPRESSIONS_FILES = my-project.supp
+# EXTRA_DIST = my-project.supp
+#
+# This results in a "check-valgrind" rule being added. Running `make
+# check-valgrind` in that directory will recursively run the module's test
+# suite (`make check`) once for each of the available Valgrind tools (out
+# of memcheck, helgrind and drd) while the sgcheck will be skipped unless
+# enabled again on the commandline with --enable-valgrind-sgcheck. The
+# results for each check will be output to test-suite-$toolname.log. The
+# target will succeed if there are zero errors and fail otherwise.
+#
+# Alternatively, a "check-valgrind-$TOOL" rule will be added, for $TOOL in
+# memcheck, helgrind, drd and sgcheck. These are useful because often only
+# some of those tools can be ran cleanly on a codebase.
+#
+# The macro supports running with and without libtool.
+#
+# LICENSE
+#
+# Copyright (c) 2014, 2015, 2016 Philip Withnall <philip.withnall@collabora.co.uk>
+#
+# Copying and distribution of this file, with or without modification, are
+# permitted in any medium without royalty provided the copyright notice
+# and this notice are preserved. This file is offered as-is, without any
+# warranty.
+
+#serial 23
+
+dnl Configured tools
+m4_define([valgrind_tool_list], [[memcheck], [helgrind], [drd], [sgcheck]])
+m4_set_add_all([valgrind_exp_tool_set], [sgcheck])
+m4_foreach([vgtool], [valgrind_tool_list],
+ [m4_define([en_dflt_valgrind_]vgtool, [on])])
+
+AC_DEFUN([AX_VALGRIND_DFLT],[
+ m4_define([en_dflt_valgrind_$1], [$2])
+])dnl
+
+AC_DEFUN([AX_VALGRIND_CHECK],[
+ AM_EXTRA_RECURSIVE_TARGETS([check-valgrind])
+ m4_foreach([vgtool], [valgrind_tool_list],
+ [AM_EXTRA_RECURSIVE_TARGETS([check-valgrind-]vgtool)])
+
+ dnl Check for --enable-valgrind
+ AC_ARG_ENABLE([valgrind],
+ [AS_HELP_STRING([--enable-valgrind], [Whether to enable Valgrind on the unit tests])],
+ [enable_valgrind=$enableval],[enable_valgrind=])
+
+ AS_IF([test "$enable_valgrind" != "no"],[
+ # Check for Valgrind.
+ AC_CHECK_PROG([VALGRIND],[valgrind],[valgrind])
+ AS_IF([test "$VALGRIND" = ""],[
+ AS_IF([test "$enable_valgrind" = "yes"],[
+ AC_MSG_ERROR([Could not find valgrind; either install it or reconfigure with --disable-valgrind])
+ ],[
+ enable_valgrind=no
+ ])
+ ],[
+ enable_valgrind=yes
+ ])
+ ])
+
+ AM_CONDITIONAL([VALGRIND_ENABLED],[test "$enable_valgrind" = "yes"])
+ AC_SUBST([VALGRIND_ENABLED],[$enable_valgrind])
+
+ # Check for Valgrind tools we care about.
+ [valgrind_enabled_tools=]
+ m4_foreach([vgtool],[valgrind_tool_list],[
+ AC_ARG_ENABLE([valgrind-]vgtool,
+ m4_if(m4_defn([en_dflt_valgrind_]vgtool),[off],dnl
+[AS_HELP_STRING([--enable-valgrind-]vgtool, [Whether to use ]vgtool[ during the Valgrind tests])],dnl
+[AS_HELP_STRING([--disable-valgrind-]vgtool, [Whether to skip ]vgtool[ during the Valgrind tests])]),
+ [enable_valgrind_]vgtool[=$enableval],
+ [enable_valgrind_]vgtool[=])
+ AS_IF([test "$enable_valgrind" = "no"],[
+ enable_valgrind_]vgtool[=no],
+ [test "$enable_valgrind_]vgtool[" ]dnl
+m4_if(m4_defn([en_dflt_valgrind_]vgtool), [off], [= "yes"], [!= "no"]),[
+ AC_CACHE_CHECK([for Valgrind tool ]vgtool,
+ [ax_cv_valgrind_tool_]vgtool,[
+ ax_cv_valgrind_tool_]vgtool[=no
+ m4_set_contains([valgrind_exp_tool_set],vgtool,
+ [m4_define([vgtoolx],[exp-]vgtool)],
+ [m4_define([vgtoolx],vgtool)])
+ AS_IF([`$VALGRIND --tool=]vgtoolx[ --help >/dev/null 2>&1`],[
+ ax_cv_valgrind_tool_]vgtool[=yes
+ ])
+ ])
+ AS_IF([test "$ax_cv_valgrind_tool_]vgtool[" = "no"],[
+ AS_IF([test "$enable_valgrind_]vgtool[" = "yes"],[
+ AC_MSG_ERROR([Valgrind does not support ]vgtool[; reconfigure with --disable-valgrind-]vgtool)
+ ],[
+ enable_valgrind_]vgtool[=no
+ ])
+ ],[
+ enable_valgrind_]vgtool[=yes
+ ])
+ ])
+ AS_IF([test "$enable_valgrind_]vgtool[" = "yes"],[
+ valgrind_enabled_tools="$valgrind_enabled_tools ]m4_bpatsubst(vgtool,[^exp-])["
+ ])
+ AC_SUBST([ENABLE_VALGRIND_]vgtool,[$enable_valgrind_]vgtool)
+ ])
+ AC_SUBST([valgrind_tools],["]m4_join([ ], valgrind_tool_list)["])
+ AC_SUBST([valgrind_enabled_tools],[$valgrind_enabled_tools])
+
+[VALGRIND_CHECK_RULES='
+# Valgrind check
+#
+# Optional:
+# - VALGRIND_SUPPRESSIONS_FILES: Space-separated list of Valgrind suppressions
+# files to load. (Default: empty)
+# - VALGRIND_FLAGS: General flags to pass to all Valgrind tools.
+# (Default: --num-callers=30)
+# - VALGRIND_$toolname_FLAGS: Flags to pass to Valgrind $toolname (one of:
+# memcheck, helgrind, drd, sgcheck). (Default: various)
+
+# Optional variables
+VALGRIND_SUPPRESSIONS ?= $(addprefix --suppressions=,$(VALGRIND_SUPPRESSIONS_FILES))
+VALGRIND_FLAGS ?= --num-callers=30
+VALGRIND_memcheck_FLAGS ?= --leak-check=full --show-reachable=no
+VALGRIND_helgrind_FLAGS ?= --history-level=approx
+VALGRIND_drd_FLAGS ?=
+VALGRIND_sgcheck_FLAGS ?=
+
+# Internal use
+valgrind_log_files = $(addprefix test-suite-,$(addsuffix .log,$(valgrind_tools)))
+
+valgrind_memcheck_flags = --tool=memcheck $(VALGRIND_memcheck_FLAGS)
+valgrind_helgrind_flags = --tool=helgrind $(VALGRIND_helgrind_FLAGS)
+valgrind_drd_flags = --tool=drd $(VALGRIND_drd_FLAGS)
+valgrind_sgcheck_flags = --tool=exp-sgcheck $(VALGRIND_sgcheck_FLAGS)
+
+valgrind_quiet = $(valgrind_quiet_$(V))
+valgrind_quiet_ = $(valgrind_quiet_$(AM_DEFAULT_VERBOSITY))
+valgrind_quiet_0 = --quiet
+valgrind_v_use = $(valgrind_v_use_$(V))
+valgrind_v_use_ = $(valgrind_v_use_$(AM_DEFAULT_VERBOSITY))
+valgrind_v_use_0 = @echo " USE " $(patsubst check-valgrind-%-local,%,$''@):;
+
+# Support running with and without libtool.
+ifneq ($(LIBTOOL),)
+valgrind_lt = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=execute
+else
+valgrind_lt =
+endif
+
+# Use recursive makes in order to ignore errors during check
+check-valgrind-local:
+ifeq ($(VALGRIND_ENABLED),yes)
+ $(A''M_V_at)$(MAKE) $(AM_MAKEFLAGS) -k \
+ $(foreach tool, $(valgrind_enabled_tools), check-valgrind-$(tool))
+else
+ @echo "Need to reconfigure with --enable-valgrind"
+endif
+
+# Valgrind running
+VALGRIND_TESTS_ENVIRONMENT = \
+ $(TESTS_ENVIRONMENT) \
+ env VALGRIND=$(VALGRIND) \
+ G_SLICE=always-malloc,debug-blocks \
+ G_DEBUG=fatal-warnings,fatal-criticals,gc-friendly
+
+VALGRIND_LOG_COMPILER = \
+ $(valgrind_lt) \
+ $(VALGRIND) $(VALGRIND_SUPPRESSIONS) --error-exitcode=1 $(VALGRIND_FLAGS)
+
+define valgrind_tool_rule
+check-valgrind-$(1)-local:
+ifeq ($$(VALGRIND_ENABLED)-$$(ENABLE_VALGRIND_$(1)),yes-yes)
+ifneq ($$(TESTS),)
+ $$(valgrind_v_use)$$(MAKE) check-TESTS \
+ TESTS_ENVIRONMENT="$$(VALGRIND_TESTS_ENVIRONMENT)" \
+ LOG_COMPILER="$$(VALGRIND_LOG_COMPILER)" \
+ LOG_FLAGS="$$(valgrind_$(1)_flags)" \
+ TEST_SUITE_LOG=test-suite-$(1).log
+endif
+else ifeq ($$(VALGRIND_ENABLED),yes)
+ @echo "Need to reconfigure with --enable-valgrind-$(1)"
+else
+ @echo "Need to reconfigure with --enable-valgrind"
+endif
+endef
+
+$(foreach tool,$(valgrind_tools),$(eval $(call valgrind_tool_rule,$(tool))))
+
+A''M_DISTCHECK_CONFIGURE_FLAGS ?=
+A''M_DISTCHECK_CONFIGURE_FLAGS += --disable-valgrind
+
+MOSTLYCLEANFILES ?=
+MOSTLYCLEANFILES += $(valgrind_log_files)
+
+.PHONY: check-valgrind $(addprefix check-valgrind-,$(valgrind_tools))
+']
+
+ AC_SUBST([VALGRIND_CHECK_RULES])
+ m4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([VALGRIND_CHECK_RULES])])
+])
diff --git a/misc/arrow-parquet/arrow-test.cpp b/misc/arrow-parquet/arrow-test.cpp
new file mode 100644
index 0000000..f29fa9b
--- /dev/null
+++ b/misc/arrow-parquet/arrow-test.cpp
@@ -0,0 +1,155 @@
+#include <arrow/io/file.h>
+#include <parquet/stream_reader.h>
+
+#include <iostream>
+#include <memory>
+#include <string>
+#include <sstream>
+
+using std::cout;
+using std::cerr;
+using std::endl;
+
+int main(int argc, char** argv)
+{
+ if (argc < 2)
+ return EXIT_FAILURE;
+
+ const char* filepath = argv[1];
+ std::shared_ptr<arrow::io::ReadableFile> infile;
+
+ PARQUET_ASSIGN_OR_THROW(
+ infile,
+ arrow::io::ReadableFile::Open(filepath));
+
+ auto file_reader = parquet::ParquetFileReader::Open(infile);
+ auto file_md = file_reader->metadata();
+ const parquet::FileMetaData& r = *file_md;
+
+ cout << "num-columns: " << r.num_columns() << endl;
+ cout << "num-rows: " << r.num_rows() << endl;
+ cout << "num-row-groups: " << r.num_row_groups() << endl;
+ cout << "num-schema-elements: " << r.num_schema_elements() << endl;
+ cout << "can-decompress: " << r.can_decompress() << endl;
+
+ for (int i = 0; i < r.num_row_groups(); ++i)
+ {
+ cout << "row-group " << i << ":" << endl;
+ auto rg = r.RowGroup(i);
+ cout << " num rows: " << rg->num_rows() << endl;
+ cout << " total byte size: " << rg->total_byte_size() << endl;
+ cout << " total compressed size: " << rg->total_compressed_size() << endl;
+ cout << " file offset: " << rg->file_offset() << endl;
+ cout << " num columns: " << rg->num_columns() << endl;
+
+ for (int j = 0; j < rg->num_columns(); ++j)
+ {
+ cout << " column chunk " << j << ":" << endl;
+ auto cc = rg->ColumnChunk(j);
+ cout << " file path: " << cc->file_path() << endl;
+ cout << " num values: " << cc->num_values() << endl;
+ cout << " type: " << cc->type() << endl;
+ cout << " data page offset: " << std::dec << cc->data_page_offset() << endl;
+ cout << " has dictionary page: " << cc->has_dictionary_page() << endl;
+ cout << " compression: " << cc->compression() << endl;
+ if (cc->has_dictionary_page())
+ cout << " dictionary page offset: " << cc->dictionary_page_offset() << endl;
+ cout << " has index page: " << cc->has_index_page() << endl;
+ }
+ }
+
+ cout << "schema:" << endl;
+ const parquet::SchemaDescriptor* p = r.schema();
+ cout << " name: " << p->name() << endl;
+ cout << " num-columns: " << p->num_columns() << endl;
+
+ std::vector<const parquet::ColumnDescriptor*> column_types;
+ column_types.reserve(p->num_columns());
+
+ for (int i = 0; i < p->num_columns(); ++i)
+ {
+ cout << "column " << i << ":" << endl;
+ const parquet::ColumnDescriptor* col_desc = p->Column(i);
+ column_types.push_back(col_desc);
+
+ cout << " name: " << col_desc->name() << endl;
+ cout << " physical type: " << col_desc->physical_type() << endl;
+ cout << " converted type: " << col_desc->converted_type() << endl;
+ cout << " type length: " << col_desc->type_length() << endl;
+ }
+
+ parquet::StreamReader stream{std::move(file_reader)};
+
+ if (stream.eof())
+ return EXIT_SUCCESS;
+
+ cout << "row values:" << endl;
+
+ // print column labels
+ for (const parquet::ColumnDescriptor* p : column_types)
+ cout << p->name() << ' ';
+ cout << endl;
+
+ for (int i = 0; i < r.num_rows(); ++i)
+ {
+ for (const parquet::ColumnDescriptor* p : column_types)
+ {
+ switch (p->physical_type())
+ {
+ case parquet::Type::BYTE_ARRAY:
+ {
+ switch (p->converted_type())
+ {
+ case parquet::ConvertedType::UTF8:
+ {
+ std::string v;
+ stream >> v;
+ cout << v << ' ';
+ break;
+ }
+ default:
+ throw std::runtime_error("WIP: unhandled converted type for BYTE_ARRAY");
+ }
+ break;
+ }
+ case parquet::Type::INT64:
+ {
+ switch (p->converted_type())
+ {
+ case parquet::ConvertedType::NONE:
+ {
+ int64_t v;
+ stream >> v;
+ cout << v << ' ';
+ break;
+ }
+ default:
+ throw std::runtime_error("WIP: unhandled converted type for INT64");
+ }
+ break;
+ }
+ case parquet::Type::BOOLEAN:
+ {
+ if (p->converted_type() != parquet::ConvertedType::NONE)
+ throw std::runtime_error("WIP: unhandled covnerted type for BOOLEAN");
+
+ bool v;
+ stream >> v;
+ cout << v << ' ';
+ break;
+ }
+ default:
+ {
+ std::ostringstream os;
+ os << "WIP: not handled type: physical=" << p->physical_type() << "; converted=" << p->converted_type();
+ throw std::runtime_error(os.str());
+ }
+ }
+ }
+
+ stream >> parquet::EndRow;
+ cout << endl;
+ }
+
+ return EXIT_SUCCESS;
+}
diff --git a/misc/arrow-parquet/dump-parquet.py b/misc/arrow-parquet/dump-parquet.py
new file mode 100755
index 0000000..742f37e
--- /dev/null
+++ b/misc/arrow-parquet/dump-parquet.py
@@ -0,0 +1,52 @@
+#!/usr/bin/env python3
+########################################################################
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+########################################################################
+
+import argparse
+from pathlib import Path
+
+import pyarrow.parquet as pq
+
+
+def main():
+ parser = argparse.ArgumentParser()
+ parser.add_argument("path", type=Path)
+ parser.add_argument("--num", "-n", type=int, default=10, help="Number of rows to print.")
+ args = parser.parse_args()
+
+ parquet = pq.ParquetFile(args.path)
+ print(f"num-row-groups: {parquet.metadata.num_row_groups}")
+ print(f"num-rows: {parquet.metadata.num_rows}")
+ print(f"num-columns: {parquet.metadata.num_columns}")
+ print("schema:")
+ for i, name in enumerate(parquet.metadata.schema.names):
+ col = parquet.metadata.schema.column(i)
+ print(f" column {i}:")
+ for attr_name in dir(col):
+ if attr_name.startswith("_"):
+ continue
+ attr_value = getattr(col, attr_name)
+ if callable(attr_value):
+ continue
+ print(f" {attr_name}: {attr_value}")
+
+ for icol, (name, chunked_array) in enumerate(zip(parquet.metadata.schema.names, parquet.read_row_group(0))):
+ print(f"column {icol}:")
+ print(f" name: {name}")
+ print(f" type: {chunked_array.type}")
+ print(f" num-chunks: {chunked_array.num_chunks}")
+ print(f" data:")
+ for i, v in enumerate(chunked_array.chunks[0]):
+ if i == args.num:
+ break
+ print(f" - {v}")
+
+
+if __name__ == "__main__":
+ main()
+
diff --git a/misc/arrow-parquet/gen-parquet-test-files.py b/misc/arrow-parquet/gen-parquet-test-files.py
new file mode 100755
index 0000000..a066536
--- /dev/null
+++ b/misc/arrow-parquet/gen-parquet-test-files.py
@@ -0,0 +1,92 @@
+#!/usr/bin/env python3
+########################################################################
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+########################################################################
+
+import pandas as pd
+from pathlib import Path
+
+
+def gen_str(pos):
+ return gen_str.values[pos]
+
+
+gen_str.values = (
+ "ubergeek",
+ "thwarter",
+ "ironfist",
+ "turkoman",
+ "mesozoan",
+ "seatsale",
+ "hardtack",
+ "phyllary",
+ "hydriads",
+ "stranger",
+ "cistuses",
+ "capelets",
+ "headband",
+ "dudesses",
+ "aminases",
+ "eggwhite",
+ "boxscore",
+ "upsurges",
+ "blowlamp",
+ "dionysia",
+ "rejecter",
+ "keratome",
+ "diasters",
+ "juddocks",
+ "gownsman",
+ "sweepsaw",
+ "chuckeys",
+ "partyers",
+ "weredogs",
+ "exabytes",
+)
+
+
+def main():
+ data = {
+ "float64 with nan": [1.2, 3.4, None, None, 5.6]
+ }
+
+ df = pd.DataFrame(data=data)
+ df["float64 with nan"] = df["float64 with nan"].astype("float64")
+
+ print(df)
+ print(df.dtypes)
+
+ outdir = Path("../../test/parquet/basic")
+ outpath = outdir / "float-with-non.parquet"
+ df.to_parquet(outpath, engine="pyarrow", compression=None)
+
+ row_size = 10
+ data = {
+ "int32": [v for v in range(row_size)],
+ "int64": [v * 10 + v for v in range(row_size)],
+ "float32": [-v for v in range(row_size)],
+ "float64": [-v - 21 for v in range(row_size)],
+ "boolean": [(v & 0x01) != 0 for v in range(row_size)],
+ "string": [gen_str(pos) for pos in range(row_size)],
+ }
+ df = pd.DataFrame(data=data)
+ df["int32"] = df["int32"].astype("int32")
+ df["int64"] = df["int64"].astype("int64")
+ df["float32"] = df["float32"].astype("float32")
+ df["float64"] = df["float64"].astype("float64")
+
+ print(df)
+ print(df.dtypes)
+
+ df.to_parquet(outdir / f"basic-nocomp.parquet", engine="pyarrow", compression=None)
+ for comp in ("gzip", "snappy", "zstd"):
+ df.to_parquet(outdir / f"basic-{comp}.parquet", engine="pyarrow", compression=comp)
+
+
+if __name__ == "__main__":
+ main()
+
diff --git a/misc/character-set/data.csv b/misc/character-set/data.csv
new file mode 100644
index 0000000..9a2eead
--- /dev/null
+++ b/misc/character-set/data.csv
@@ -0,0 +1,631 @@
+Preferred MIME Name,Name,Aliases
+US-ASCII,US-ASCII,iso-ir-6
+,,ANSI_X3.4-1968
+,,ANSI_X3.4-1986
+,,ISO_646.irv:1991
+,,ISO646-US
+,,US-ASCII
+,,us
+,,IBM367
+,,cp367
+,,csASCII
+ISO-8859-1,ISO_8859-1:1987,iso-ir-100
+,,ISO_8859-1
+,,ISO-8859-1
+,,latin1
+,,l1
+,,IBM819
+,,CP819
+,,csISOLatin1
+ISO-8859-2,ISO_8859-2:1987,iso-ir-101
+,,ISO_8859-2
+,,ISO-8859-2
+,,latin2
+,,l2
+,,csISOLatin2
+ISO-8859-3,ISO_8859-3:1988,iso-ir-109
+,,ISO_8859-3
+,,ISO-8859-3
+,,latin3
+,,l3
+,,csISOLatin3
+ISO-8859-4,ISO_8859-4:1988,iso-ir-110
+,,ISO_8859-4
+,,ISO-8859-4
+,,latin4
+,,l4
+,,csISOLatin4
+ISO-8859-5,ISO_8859-5:1988,iso-ir-144
+,,ISO_8859-5
+,,ISO-8859-5
+,,cyrillic
+,,csISOLatinCyrillic
+ISO-8859-6,ISO_8859-6:1987,iso-ir-127
+,,ISO_8859-6
+,,ISO-8859-6
+,,ECMA-114
+,,ASMO-708
+,,arabic
+,,csISOLatinArabic
+ISO-8859-7,ISO_8859-7:1987,iso-ir-126
+,,ISO_8859-7
+,,ISO-8859-7
+,,ELOT_928
+,,ECMA-118
+,,greek
+,,greek8
+,,csISOLatinGreek
+ISO-8859-8,ISO_8859-8:1988,iso-ir-138
+,,ISO_8859-8
+,,ISO-8859-8
+,,hebrew
+,,csISOLatinHebrew
+ISO-8859-9,ISO_8859-9:1989,iso-ir-148
+,,ISO_8859-9
+,,ISO-8859-9
+,,latin5
+,,l5
+,,csISOLatin5
+ISO-8859-10,ISO-8859-10,iso-ir-157
+,,l6
+,,ISO_8859-10:1992
+,,csISOLatin6
+,,latin6
+,ISO_6937-2-add,iso-ir-142
+,,csISOTextComm
+,JIS_X0201,X0201
+,,csHalfWidthKatakana
+,JIS_Encoding,csJISEncoding
+Shift_JIS,Shift_JIS,MS_Kanji
+,,csShiftJIS
+EUC-JP,Extended_UNIX_Code_Packed_Format_for_Japanese,csEUCPkdFmtJapanese
+,,EUC-JP
+,Extended_UNIX_Code_Fixed_Width_for_Japanese,csEUCFixWidJapanese
+,BS_4730,iso-ir-4
+,,ISO646-GB
+,,gb
+,,uk
+,,csISO4UnitedKingdom
+,SEN_850200_C,iso-ir-11
+,,ISO646-SE2
+,,se2
+,,csISO11SwedishForNames
+,IT,iso-ir-15
+,,ISO646-IT
+,,csISO15Italian
+,ES,iso-ir-17
+,,ISO646-ES
+,,csISO17Spanish
+,DIN_66003,iso-ir-21
+,,de
+,,ISO646-DE
+,,csISO21German
+,NS_4551-1,iso-ir-60
+,,ISO646-NO
+,,no
+,,csISO60DanishNorwegian
+,,csISO60Norwegian1
+,NF_Z_62-010,iso-ir-69
+,,ISO646-FR
+,,fr
+,,csISO69French
+,ISO-10646-UTF-1,csISO10646UTF1
+,ISO_646.basic:1983,ref
+,,csISO646basic1983
+,INVARIANT,csINVARIANT
+,ISO_646.irv:1983,iso-ir-2
+,,irv
+,,csISO2IntlRefVersion
+,NATS-SEFI,iso-ir-8-1
+,,csNATSSEFI
+,NATS-SEFI-ADD,iso-ir-8-2
+,,csNATSSEFIADD
+,NATS-DANO,iso-ir-9-1
+,,csNATSDANO
+,NATS-DANO-ADD,iso-ir-9-2
+,,csNATSDANOADD
+,SEN_850200_B,iso-ir-10
+,,FI
+,,ISO646-FI
+,,ISO646-SE
+,,se
+,,csISO10Swedish
+,KS_C_5601-1987,iso-ir-149
+,,KS_C_5601-1989
+,,KSC_5601
+,,korean
+,,csKSC56011987
+ISO-2022-KR,ISO-2022-KR,csISO2022KR
+EUC-KR,EUC-KR,csEUCKR
+ISO-2022-JP,ISO-2022-JP,csISO2022JP
+ISO-2022-JP-2,ISO-2022-JP-2,csISO2022JP2
+,JIS_C6220-1969-jp,JIS_C6220-1969
+,,iso-ir-13
+,,katakana
+,,x0201-7
+,,csISO13JISC6220jp
+,JIS_C6220-1969-ro,iso-ir-14
+,,jp
+,,ISO646-JP
+,,csISO14JISC6220ro
+,PT,iso-ir-16
+,,ISO646-PT
+,,csISO16Portuguese
+,greek7-old,iso-ir-18
+,,csISO18Greek7Old
+,latin-greek,iso-ir-19
+,,csISO19LatinGreek
+,NF_Z_62-010_(1973),iso-ir-25
+,,ISO646-FR1
+,,csISO25French
+,Latin-greek-1,iso-ir-27
+,,csISO27LatinGreek1
+,ISO_5427,iso-ir-37
+,,csISO5427Cyrillic
+,JIS_C6226-1978,iso-ir-42
+,,csISO42JISC62261978
+,BS_viewdata,iso-ir-47
+,,csISO47BSViewdata
+,INIS,iso-ir-49
+,,csISO49INIS
+,INIS-8,iso-ir-50
+,,csISO50INIS8
+,INIS-cyrillic,iso-ir-51
+,,csISO51INISCyrillic
+,ISO_5427:1981,iso-ir-54
+,,ISO5427Cyrillic1981
+,,csISO54271981
+,ISO_5428:1980,iso-ir-55
+,,csISO5428Greek
+,GB_1988-80,iso-ir-57
+,,cn
+,,ISO646-CN
+,,csISO57GB1988
+,GB_2312-80,iso-ir-58
+,,chinese
+,,csISO58GB231280
+,NS_4551-2,ISO646-NO2
+,,iso-ir-61
+,,no2
+,,csISO61Norwegian2
+,videotex-suppl,iso-ir-70
+,,csISO70VideotexSupp1
+,PT2,iso-ir-84
+,,ISO646-PT2
+,,csISO84Portuguese2
+,ES2,iso-ir-85
+,,ISO646-ES2
+,,csISO85Spanish2
+,MSZ_7795.3,iso-ir-86
+,,ISO646-HU
+,,hu
+,,csISO86Hungarian
+,JIS_C6226-1983,iso-ir-87
+,,x0208
+,,JIS_X0208-1983
+,,csISO87JISX0208
+,greek7,iso-ir-88
+,,csISO88Greek7
+,ASMO_449,ISO_9036
+,,arabic7
+,,iso-ir-89
+,,csISO89ASMO449
+,iso-ir-90,csISO90
+,JIS_C6229-1984-a,iso-ir-91
+,,jp-ocr-a
+,,csISO91JISC62291984a
+,JIS_C6229-1984-b,iso-ir-92
+,,ISO646-JP-OCR-B
+,,jp-ocr-b
+,,csISO92JISC62991984b
+,JIS_C6229-1984-b-add,iso-ir-93
+,,jp-ocr-b-add
+,,csISO93JIS62291984badd
+,JIS_C6229-1984-hand,iso-ir-94
+,,jp-ocr-hand
+,,csISO94JIS62291984hand
+,JIS_C6229-1984-hand-add,iso-ir-95
+,,jp-ocr-hand-add
+,,csISO95JIS62291984handadd
+,JIS_C6229-1984-kana,iso-ir-96
+,,csISO96JISC62291984kana
+,ISO_2033-1983,iso-ir-98
+,,e13b
+,,csISO2033
+,ANSI_X3.110-1983,iso-ir-99
+,,CSA_T500-1983
+,,NAPLPS
+,,csISO99NAPLPS
+,T.61-7bit,iso-ir-102
+,,csISO102T617bit
+,T.61-8bit,T.61
+,,iso-ir-103
+,,csISO103T618bit
+,ECMA-cyrillic,iso-ir-111
+,,KOI8-E
+,,csISO111ECMACyrillic
+,CSA_Z243.4-1985-1,iso-ir-121
+,,ISO646-CA
+,,csa7-1
+,,csa71
+,,ca
+,,csISO121Canadian1
+,CSA_Z243.4-1985-2,iso-ir-122
+,,ISO646-CA2
+,,csa7-2
+,,csa72
+,,csISO122Canadian2
+,CSA_Z243.4-1985-gr,iso-ir-123
+,,csISO123CSAZ24341985gr
+ISO-8859-6-E,ISO_8859-6-E,csISO88596E
+,,ISO-8859-6-E
+ISO-8859-6-I,ISO_8859-6-I,csISO88596I
+,,ISO-8859-6-I
+,T.101-G2,iso-ir-128
+,,csISO128T101G2
+ISO-8859-8-E,ISO_8859-8-E,csISO88598E
+,,ISO-8859-8-E
+ISO-8859-8-I,ISO_8859-8-I,csISO88598I
+,,ISO-8859-8-I
+,CSN_369103,iso-ir-139
+,,csISO139CSN369103
+,JUS_I.B1.002,iso-ir-141
+,,ISO646-YU
+,,js
+,,yu
+,,csISO141JUSIB1002
+,IEC_P27-1,iso-ir-143
+,,csISO143IECP271
+,JUS_I.B1.003-serb,iso-ir-146
+,,serbian
+,,csISO146Serbian
+,JUS_I.B1.003-mac,macedonian
+,,iso-ir-147
+,,csISO147Macedonian
+,greek-ccitt,iso-ir-150
+,,csISO150
+,,csISO150GreekCCITT
+,NC_NC00-10:81,cuba
+,,iso-ir-151
+,,ISO646-CU
+,,csISO151Cuba
+,ISO_6937-2-25,iso-ir-152
+,,csISO6937Add
+,GOST_19768-74,ST_SEV_358-88
+,,iso-ir-153
+,,csISO153GOST1976874
+,ISO_8859-supp,iso-ir-154
+,,latin1-2-5
+,,csISO8859Supp
+,ISO_10367-box,iso-ir-155
+,,csISO10367Box
+,latin-lap,lap
+,,iso-ir-158
+,,csISO158Lap
+,JIS_X0212-1990,x0212
+,,iso-ir-159
+,,csISO159JISX02121990
+,DS_2089,DS2089
+,,ISO646-DK
+,,dk
+,,csISO646Danish
+,us-dk,csUSDK
+,dk-us,csDKUS
+,KSC5636,ISO646-KR
+,,csKSC5636
+,UNICODE-1-1-UTF-7,csUnicode11UTF7
+,ISO-2022-CN,csISO2022CN
+,ISO-2022-CN-EXT,csISO2022CNEXT
+,UTF-8,csUTF8
+,ISO-8859-13,csISO885913
+,ISO-8859-14,iso-ir-199
+,,ISO_8859-14:1998
+,,ISO_8859-14
+,,latin8
+,,iso-celtic
+,,l8
+,,csISO885914
+,ISO-8859-15,ISO_8859-15
+,,Latin-9
+,,csISO885915
+,ISO-8859-16,iso-ir-226
+,,ISO_8859-16:2001
+,,ISO_8859-16
+,,latin10
+,,l10
+,,csISO885916
+,GBK,CP936
+,,MS936
+,,windows-936
+,,csGBK
+,GB18030,csGB18030
+,OSD_EBCDIC_DF04_15,csOSDEBCDICDF0415
+,OSD_EBCDIC_DF03_IRV,csOSDEBCDICDF03IRV
+,OSD_EBCDIC_DF04_1,csOSDEBCDICDF041
+,ISO-11548-1,ISO_11548-1
+,,ISO_TR_11548-1
+,,csISO115481
+,KZ-1048,STRK1048-2002
+,,RK1048
+,,csKZ1048
+,ISO-10646-UCS-2,csUnicode
+,ISO-10646-UCS-4,csUCS4
+,ISO-10646-UCS-Basic,csUnicodeASCII
+,ISO-10646-Unicode-Latin1,csUnicodeLatin1
+,,ISO-10646
+,ISO-10646-J-1,csUnicodeJapanese
+,ISO-Unicode-IBM-1261,csUnicodeIBM1261
+,ISO-Unicode-IBM-1268,csUnicodeIBM1268
+,ISO-Unicode-IBM-1276,csUnicodeIBM1276
+,ISO-Unicode-IBM-1264,csUnicodeIBM1264
+,ISO-Unicode-IBM-1265,csUnicodeIBM1265
+,UNICODE-1-1,csUnicode11
+,SCSU,csSCSU
+,UTF-7,csUTF7
+,UTF-16BE,csUTF16BE
+,UTF-16LE,csUTF16LE
+,UTF-16,csUTF16
+,CESU-8,csCESU8
+,,csCESU-8
+,UTF-32,csUTF32
+,UTF-32BE,csUTF32BE
+,UTF-32LE,csUTF32LE
+,BOCU-1,csBOCU1
+,,csBOCU-1
+,UTF-7-IMAP,csUTF7IMAP
+,ISO-8859-1-Windows-3.0-Latin-1,csWindows30Latin1
+,ISO-8859-1-Windows-3.1-Latin-1,csWindows31Latin1
+,ISO-8859-2-Windows-Latin-2,csWindows31Latin2
+,ISO-8859-9-Windows-Latin-5,csWindows31Latin5
+,hp-roman8,roman8
+,,r8
+,,csHPRoman8
+,Adobe-Standard-Encoding,csAdobeStandardEncoding
+,Ventura-US,csVenturaUS
+,Ventura-International,csVenturaInternational
+,DEC-MCS,dec
+,,csDECMCS
+,IBM850,cp850
+,,850
+,,csPC850Multilingual
+,PC8-Danish-Norwegian,csPC8DanishNorwegian
+,IBM862,cp862
+,,862
+,,csPC862LatinHebrew
+,PC8-Turkish,csPC8Turkish
+,IBM-Symbols,csIBMSymbols
+,IBM-Thai,csIBMThai
+,HP-Legal,csHPLegal
+,HP-Pi-font,csHPPiFont
+,HP-Math8,csHPMath8
+,Adobe-Symbol-Encoding,csHPPSMath
+,HP-DeskTop,csHPDesktop
+,Ventura-Math,csVenturaMath
+,Microsoft-Publishing,csMicrosoftPublishing
+,Windows-31J,csWindows31J
+GB2312,GB2312,csGB2312
+Big5,Big5,csBig5
+,macintosh,mac
+,,csMacintosh
+,IBM037,cp037
+,,ebcdic-cp-us
+,,ebcdic-cp-ca
+,,ebcdic-cp-wt
+,,ebcdic-cp-nl
+,,csIBM037
+,IBM038,EBCDIC-INT
+,,cp038
+,,csIBM038
+,IBM273,CP273
+,,csIBM273
+,IBM274,EBCDIC-BE
+,,CP274
+,,csIBM274
+,IBM275,EBCDIC-BR
+,,cp275
+,,csIBM275
+,IBM277,EBCDIC-CP-DK
+,,EBCDIC-CP-NO
+,,csIBM277
+,IBM278,CP278
+,,ebcdic-cp-fi
+,,ebcdic-cp-se
+,,csIBM278
+,IBM280,CP280
+,,ebcdic-cp-it
+,,csIBM280
+,IBM281,EBCDIC-JP-E
+,,cp281
+,,csIBM281
+,IBM284,CP284
+,,ebcdic-cp-es
+,,csIBM284
+,IBM285,CP285
+,,ebcdic-cp-gb
+,,csIBM285
+,IBM290,cp290
+,,EBCDIC-JP-kana
+,,csIBM290
+,IBM297,cp297
+,,ebcdic-cp-fr
+,,csIBM297
+,IBM420,cp420
+,,ebcdic-cp-ar1
+,,csIBM420
+,IBM423,cp423
+,,ebcdic-cp-gr
+,,csIBM423
+,IBM424,cp424
+,,ebcdic-cp-he
+,,csIBM424
+,IBM437,cp437
+,,437
+,,csPC8CodePage437
+,IBM500,CP500
+,,ebcdic-cp-be
+,,ebcdic-cp-ch
+,,csIBM500
+,IBM851,cp851
+,,851
+,,csIBM851
+,IBM852,cp852
+,,852
+,,csPCp852
+,IBM855,cp855
+,,855
+,,csIBM855
+,IBM857,cp857
+,,857
+,,csIBM857
+,IBM860,cp860
+,,860
+,,csIBM860
+,IBM861,cp861
+,,861
+,,cp-is
+,,csIBM861
+,IBM863,cp863
+,,863
+,,csIBM863
+,IBM864,cp864
+,,csIBM864
+,IBM865,cp865
+,,865
+,,csIBM865
+,IBM868,CP868
+,,cp-ar
+,,csIBM868
+,IBM869,cp869
+,,869
+,,cp-gr
+,,csIBM869
+,IBM870,CP870
+,,ebcdic-cp-roece
+,,ebcdic-cp-yu
+,,csIBM870
+,IBM871,CP871
+,,ebcdic-cp-is
+,,csIBM871
+,IBM880,cp880
+,,EBCDIC-Cyrillic
+,,csIBM880
+,IBM891,cp891
+,,csIBM891
+,IBM903,cp903
+,,csIBM903
+,IBM904,cp904
+,,904
+,,csIBBM904
+,IBM905,CP905
+,,ebcdic-cp-tr
+,,csIBM905
+,IBM918,CP918
+,,ebcdic-cp-ar2
+,,csIBM918
+,IBM1026,CP1026
+,,csIBM1026
+,EBCDIC-AT-DE,csIBMEBCDICATDE
+,EBCDIC-AT-DE-A,csEBCDICATDEA
+,EBCDIC-CA-FR,csEBCDICCAFR
+,EBCDIC-DK-NO,csEBCDICDKNO
+,EBCDIC-DK-NO-A,csEBCDICDKNOA
+,EBCDIC-FI-SE,csEBCDICFISE
+,EBCDIC-FI-SE-A,csEBCDICFISEA
+,EBCDIC-FR,csEBCDICFR
+,EBCDIC-IT,csEBCDICIT
+,EBCDIC-PT,csEBCDICPT
+,EBCDIC-ES,csEBCDICES
+,EBCDIC-ES-A,csEBCDICESA
+,EBCDIC-ES-S,csEBCDICESS
+,EBCDIC-UK,csEBCDICUK
+,EBCDIC-US,csEBCDICUS
+,UNKNOWN-8BIT,csUnknown8BiT
+,MNEMONIC,csMnemonic
+,MNEM,csMnem
+,VISCII,csVISCII
+,VIQR,csVIQR
+KOI8-R,KOI8-R,csKOI8R
+,HZ-GB-2312,
+,IBM866,cp866
+,,866
+,,csIBM866
+,IBM775,cp775
+,,csPC775Baltic
+,KOI8-U,csKOI8U
+,IBM00858,CCSID00858
+,,CP00858
+,,PC-Multilingual-850+euro
+,,csIBM00858
+,IBM00924,CCSID00924
+,,CP00924
+,,ebcdic-Latin9--euro
+,,csIBM00924
+,IBM01140,CCSID01140
+,,CP01140
+,,ebcdic-us-37+euro
+,,csIBM01140
+,IBM01141,CCSID01141
+,,CP01141
+,,ebcdic-de-273+euro
+,,csIBM01141
+,IBM01142,CCSID01142
+,,CP01142
+,,ebcdic-dk-277+euro
+,,ebcdic-no-277+euro
+,,csIBM01142
+,IBM01143,CCSID01143
+,,CP01143
+,,ebcdic-fi-278+euro
+,,ebcdic-se-278+euro
+,,csIBM01143
+,IBM01144,CCSID01144
+,,CP01144
+,,ebcdic-it-280+euro
+,,csIBM01144
+,IBM01145,CCSID01145
+,,CP01145
+,,ebcdic-es-284+euro
+,,csIBM01145
+,IBM01146,CCSID01146
+,,CP01146
+,,ebcdic-gb-285+euro
+,,csIBM01146
+,IBM01147,CCSID01147
+,,CP01147
+,,ebcdic-fr-297+euro
+,,csIBM01147
+,IBM01148,CCSID01148
+,,CP01148
+,,ebcdic-international-500+euro
+,,csIBM01148
+,IBM01149,CCSID01149
+,,CP01149
+,,ebcdic-is-871+euro
+,,csIBM01149
+,Big5-HKSCS,csBig5HKSCS
+,IBM1047,IBM-1047
+,,csIBM1047
+,PTCP154,csPTCP154
+,,PT154
+,,CP154
+,,Cyrillic-Asian
+,Amiga-1251,Ami1251
+,,Amiga1251
+,,Ami-1251
+,KOI7-switched,csKOI7switched
+,BRF,csBRF
+,TSCII,csTSCII
+,CP51932,csCP51932
+,windows-874,cswindows874
+,windows-1250,cswindows1250
+,windows-1251,cswindows1251
+,windows-1252,cswindows1252
+,windows-1253,cswindows1253
+,windows-1254,cswindows1254
+,windows-1255,cswindows1255
+,windows-1256,cswindows1256
+,windows-1257,cswindows1257
+,windows-1258,cswindows1258
+,TIS-620,csTIS620
+,,ISO-8859-11
+,CP50220,csCP50220
diff --git a/misc/character-set/gen-enum.py b/misc/character-set/gen-enum.py
new file mode 100755
index 0000000..ccb6f95
--- /dev/null
+++ b/misc/character-set/gen-enum.py
@@ -0,0 +1,101 @@
+#!/usr/bin/env python3
+########################################################################
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+########################################################################
+
+import argparse
+import csv
+import io
+from pathlib import Path
+
+
+def _cleanse_symbol(s):
+ s = s.replace("-", "_")
+ s = s.replace(":", "_")
+ s = s.replace(".", "_")
+ s = s.replace("(", "")
+ s = s.replace(")", "")
+ return s.lower()
+
+
+def _generate_enum(enum_symbols, outpath):
+ enum_symbols = sorted(enum_symbols)
+ buf = list()
+ buf.append("enum class character_set_t")
+ buf.append("{")
+ buf.append(" unspecified = 0,")
+
+ for entry in enum_symbols:
+ buf.append(f" {entry[0]},")
+
+ buf.append("};")
+
+ outpath.write_text("\n".join(buf))
+
+
+def _generate_map_entries(aliases, outpath):
+ entries = list()
+ for symbol, mapped_strs in aliases.items():
+ for mapped_str in mapped_strs:
+ entries.append((mapped_str.lower(), symbol))
+
+ entries = sorted(entries, key=lambda x: x[0])
+ buf = ["constexpr map_type::entry entries[] = {",]
+
+ for entry in entries:
+ buf.append(f' {{ "{entry[0]}", character_set_t::{entry[1]} }},')
+
+ buf.append("};")
+
+ outpath.write_text("\n".join(buf))
+
+
+def main():
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--enum-out", type=Path, default=Path("./enum.inl"))
+ parser.add_argument("--map-out", type=Path, default=Path("./map-entries.inl"))
+ parser.add_argument("filepath", type=Path)
+ args = parser.parse_args()
+
+ content = args.filepath.read_text()
+ stream = io.StringIO(content)
+
+ reader = csv.reader(stream)
+ next(reader) # skip the header row
+ aliases = dict()
+ enum_symbols = list()
+ symbol = None
+ for row in reader:
+ mime_name, name, alias = row
+
+ if mime_name:
+ # Take the MIME name as new symbol.
+ symbol = _cleanse_symbol(mime_name)
+ aliases[symbol] = set([mime_name, name])
+ enum_symbols.append((symbol, mime_name, name))
+ if alias:
+ aliases[symbol].add(alias)
+ elif name:
+ # Take the name as new symbol.
+ symbol = _cleanse_symbol(name)
+ aliases[symbol] = set([name,])
+ enum_symbols.append((symbol, name))
+ if alias:
+ aliases[symbol].add(alias)
+ else:
+ # the row only contains an alias for the current symbol.
+ if not alias:
+ raise RuntimeError("alias must be present.")
+ aliases[symbol].add(alias)
+
+ _generate_enum(enum_symbols, args.enum_out)
+ _generate_map_entries(aliases, args.map_out)
+
+
+if __name__ == "__main__":
+ main()
+
diff --git a/misc/file-processor-modules/preview.py b/misc/file-processor-modules/preview.py
new file mode 100644
index 0000000..244d8ce
--- /dev/null
+++ b/misc/file-processor-modules/preview.py
@@ -0,0 +1,33 @@
+########################################################################
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+########################################################################
+
+import orcus
+from orcus.tools.file_processor import config
+
+
+def process_document(filepath, doc):
+ buf = list()
+ for sh in doc.sheets:
+ try:
+ buf.append(f"sheet: {sh.name}")
+ for i, row in enumerate(sh.get_rows()):
+ if i > 9:
+ # Only display the first 10 rows.
+ buf.append("...")
+ break
+
+ row_s = list()
+ for cell in row:
+ v = cell.value if cell.value else ""
+ row_s.append(str(v))
+ row_s = ",".join(row_s)
+ buf.append(f"row {i}: {row_s}")
+ except Exception as e:
+ buf.append(f"???: (exception: {e})")
+
+ return buf
diff --git a/misc/notes/column-width-and-row-height.txt b/misc/notes/column-width-and-row-height.txt
new file mode 100644
index 0000000..336d9c9
--- /dev/null
+++ b/misc/notes/column-width-and-row-height.txt
@@ -0,0 +1,69 @@
+== XLSX ==
+
+Spec name: Office Open XML Part 4 - Markup Language Reference.pdf
+
+=== Column Width ===
+
+<cols>
+ <col min="1" max="2" width="13.140625" customWidth="1"/>
+ <col min="4" max="10" width="6.7109375" customWidth="1"/>
+</cols>
+
+Spec location: 3.3.1.12 col (Column Width & Formatting) (page 1946)
+
+ Column width measured as the number of characters of the maximum
+ digit width of the numbers 0, 1, 2, ..., 9 as rendered in the normal
+ style's font. There are 4 pixels of margin padding (two on each
+ side), plus 1 pixel padding for the gridlines.
+
+ width = Truncate([{Number of Characters} * {Maximum Digit Width} +
+ {5 pixel padding}]/{Maximum Digit Width}*256)/256
+
+ Using the Calibri font as an example, the maximum digit width of 11
+ point font size is 7 pixels (at 96 dpi). In fact, each digit is the
+ same width for this font. Therefore if the cell width is 8
+ characters wide, the value of this attribute shall be
+ Truncate([8*7+5]/7*256)/256 = 8.7109375.
+
+=== Row Height ===
+
+<row r="10" spans="1:10" ht="40.5" customHeight="1">
+ <c r="D10">
+ <v>11.1</v>
+ </c>
+</row>
+
+Spec location: 3.3.1.71 row (Row) (page 2012)
+
+ Row height measured in point size. There is no margin padding on
+ row height.
+
+== ODS ==
+
+=== Column Width & Row Height ===
+
+<style:style style:name="co1" style:family="table-column">
+ <style:table-column-properties fo:break-before="auto" style:column-width="0.8925in"/>
+</style:style>
+<style:style style:name="ro1" style:family="table-row">
+ <style:table-row-properties style:row-height="0.178in" fo:break-before="auto" style:use-optimal-row-height="true"/>
+</style:style>
+
+<table:table table:name="Test1" table:style-name="ta1" table:print="false">
+ <table:table-column table:style-name="co2" table:default-cell-style-name="Default"/>
+ <table:table-column table:style-name="co1" table:default-cell-style-name="Default"/>
+ <table:table-column table:style-name="co4" table:number-columns-repeated="2" table:default-cell-style-name="Default"/>
+ <table:table-row table:style-name="ro2">
+ <table:table-cell office:value-type="string">
+ <text:p>Name</text:p>
+ </table:table-cell>
+ <table:table-cell office:value-type="string">
+ <text:p>Value</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+</table:table>
+
+Spec doesn't say much, but it appears that the order of these
+<table:table-column> elements is significant & determines which column
+gets which automatic style, from left to right.
diff --git a/misc/notes/zlib-in-memory-gzip.txt b/misc/notes/zlib-in-memory-gzip.txt
new file mode 100644
index 0000000..acba449
--- /dev/null
+++ b/misc/notes/zlib-in-memory-gzip.txt
@@ -0,0 +1,8 @@
+Some notes on future implementation of in-memory compression and decompression
+of gzip format.
+
+http://www.experts-exchange.com/Programming/System/Windows__Programming/A_3189-In-Memory-Compression-and-Decompression-Using-ZLIB.html
+
+http://www.gzip.org/zlib/zlib_faq.html#faq20
+
+http://stackoverflow.com/questions/16682719/uncompress-data-in-memory-using-boost-gzip-decompressor
diff --git a/misc/xml-tokens/dump-xsd-keys.py b/misc/xml-tokens/dump-xsd-keys.py
new file mode 100755
index 0000000..c1e5012
--- /dev/null
+++ b/misc/xml-tokens/dump-xsd-keys.py
@@ -0,0 +1,145 @@
+#!/usr/bin/env python
+########################################################################
+#
+# Copyright (c) 2013 Kohei Yoshida
+#
+# 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.
+#
+########################################################################
+
+import xml.parsers.expat, argparse, sys
+import token_util
+
+class XMLParser:
+
+ def __init__ (self, strm):
+ self.__strm = strm
+ self.__elem = None
+ self.tokens = []
+ self.ns_tokens = []
+
+ def start_element(self, name, attrs):
+ self.__elem = name
+ if name in ['xs:element', 'xs:attribute', 'xsd:element', 'xsd:attribute'] and attrs.has_key('name'):
+ token = attrs['name']
+ if len(token) > 0:
+ self.tokens.append(token)
+
+ if name.endswith(':schema'):
+ # Check for namespace entries.
+ attr_names = attrs.keys()
+ for attr_name in attr_names:
+ if attr_name == 'xmlns':
+ self.ns_tokens.append(['', attrs[attr_name]])
+ elif attr_name.startswith('xmlns:'):
+ vals = attr_name.split(':')
+ self.ns_tokens.append([vals[1], attrs[attr_name]])
+
+ def end_element(self, name):
+ pass
+
+ def character(self, data):
+ pass
+
+ def parse (self):
+ p = xml.parsers.expat.ParserCreate()
+ p.StartElementHandler = self.start_element
+ p.EndElementHandler = self.end_element
+ p.CharacterDataHandler = self.character
+ p.Parse(self.__strm, 1)
+
+
+def parse_files(filenames):
+
+ tokens = {}
+ for filename in filenames:
+ file = open(filename, 'r')
+ chars = file.read()
+ file.close()
+
+ parser = XMLParser(chars)
+ parser.parse()
+ for token in parser.tokens:
+ tokens[token] = True
+
+ keys = tokens.keys()
+ keys.sort()
+
+ return keys
+
+
+def parse_files_ns(filenames):
+
+ tokens = {}
+ for filename in filenames:
+ file = open(filename, 'r')
+ chars = file.read()
+ file.close()
+
+ parser = XMLParser(chars)
+ parser.parse()
+ for ns_token in parser.ns_tokens:
+ alias, value = ns_token # each namespace token consists of an alias and a value.
+ if not tokens.has_key(value):
+ tokens[value] = []
+ if len(alias) > 0 and not alias in tokens[value]:
+ tokens[value].append(alias)
+
+ keys = tokens.keys()
+ keys.sort()
+ ret_val = []
+ for key in keys:
+ aliases = tokens[key]
+ t = key + " ("
+ first = True
+ for alias in aliases:
+ if first:
+ first = False
+ else:
+ t += ", "
+ t += alias
+ t += ")"
+ ret_val.append(t)
+
+ return ret_val
+
+
+desc = "Given an arbitrary XML Schema file (.xsd), dump all its keys specified in the schema to stdout."
+
+def main ():
+ parser = argparse.ArgumentParser(description=desc)
+ parser.add_argument('file', nargs='*', help='XML Shema file (.xsd)')
+ parser.add_argument('--ns', dest='ns_mode', action='store_true', default=False)
+ args = parser.parse_args(sys.argv[1:])
+ ns_mode = args.ns_mode
+
+ if ns_mode:
+ keys = parse_files_ns(args.file)
+ else:
+ keys = parse_files(args.file)
+
+ for key in keys:
+ print(key)
+
+if __name__ == '__main__':
+ main()
+
diff --git a/misc/xml-tokens/gen-gnumeric-tokens.py b/misc/xml-tokens/gen-gnumeric-tokens.py
new file mode 100755
index 0000000..6212a83
--- /dev/null
+++ b/misc/xml-tokens/gen-gnumeric-tokens.py
@@ -0,0 +1,81 @@
+#!/usr/bin/env python
+#************************************************************************
+#
+# Copyright (c) 2010-2012 Kohei Yoshida
+#
+# 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.
+#
+#***********************************************************************
+
+import xml.parsers.expat, sys
+import token_util
+
+class XMLParser:
+
+ def __init__ (self, strm):
+ self.__strm = strm
+ self.__elem = None
+ self.tokens = []
+
+ def start_element(self, name, attrs):
+ self.__elem = name
+ if name in ['xs:element', 'xs:attribute', 'xsd:element', 'xsd:attribute'] and attrs.has_key('name'):
+ token = attrs['name']
+ if len(token) > 0:
+ self.tokens.append(token)
+
+ def end_element(self, name):
+ pass
+
+ def character(self, data):
+ pass
+
+ def parse (self):
+ p = xml.parsers.expat.ParserCreate()
+ p.StartElementHandler = self.start_element
+ p.EndElementHandler = self.end_element
+ p.CharacterDataHandler = self.character
+ p.Parse(self.__strm, 1)
+
+
+def parse_file(filename):
+ file = open(filename, 'r')
+ chars = file.read()
+ file.close()
+
+ parser = XMLParser(chars)
+ parser.parse()
+ tokens = {}
+ for token in parser.tokens:
+ tokens[token] = True
+ keys = tokens.keys()
+ keys.sort()
+ return keys
+
+
+def main ():
+ tokens = parse_file(sys.argv[1])
+ token_util.gen_token_constants(sys.argv[2], tokens)
+ token_util.gen_token_names(sys.argv[3], tokens)
+
+if __name__ == '__main__':
+ main()
diff --git a/misc/xml-tokens/gen-odf-tokens.py b/misc/xml-tokens/gen-odf-tokens.py
new file mode 100755
index 0000000..2838604
--- /dev/null
+++ b/misc/xml-tokens/gen-odf-tokens.py
@@ -0,0 +1,192 @@
+#!/usr/bin/env python
+########################################################################
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+########################################################################
+
+import xml.parsers.expat
+import sys
+import argparse
+from pathlib import Path
+
+import token_util
+
+
+NS_RNG = "http://relaxng.org/ns/structure/1.0"
+
+
+class TokenParser:
+
+ def __init__ (self, strm):
+ self.__strm = strm
+ self.__elem = None
+ self.tokens = set()
+
+ def start_element(self, name, attrs):
+ self.__elem = name
+ if name in {f"{NS_RNG}:element", f"{NS_RNG}:attribute"} and "name" in attrs:
+ tokens = attrs['name'].split(':')
+ n = len(tokens)
+ if n != 2:
+ sys.stderr.write("unrecognized token type: "+attrs['name'])
+ sys.exit(1)
+
+ self.tokens.add(tokens[1])
+
+ for token in tokens:
+ self.tokens.add(token)
+
+ def character(self, data):
+ if self.__elem == f"{NS_RNG}:value":
+ s = data.strip()
+ if len(s) > 0:
+ self.tokens.add(s)
+
+ def parse(self):
+ p = xml.parsers.expat.ParserCreate(encoding="utf-8", namespace_separator=":")
+ p.StartElementHandler = self.start_element
+ p.CharacterDataHandler = self.character
+ p.Parse(self.__strm, 1)
+
+ self.tokens = sorted(self.tokens)
+
+
+class NSParser:
+
+ def __init__ (self, strm):
+ self.__strm = strm
+ self.__elem = None
+ self.ns_values = dict() # namespace values
+
+ def start_element(self, name, attrs):
+ self.__elem = name
+ if name.endswith("grammar"):
+ names = attrs.keys()
+ for name in names:
+ tokens = name.split(':')
+ if len(tokens) < 2 or tokens[0] != "xmlns":
+ continue
+
+ val = attrs[name]
+ self.ns_values[tokens[1]] = val
+
+ def parse(self):
+ p = xml.parsers.expat.ParserCreate(encoding="utf-8")
+ p.StartElementHandler = self.start_element
+ p.Parse(self.__strm, 1)
+
+ ns_values = list()
+ for k, v in self.ns_values.items():
+ if v == "http://relaxng.org/ns/structure/1.0":
+ # skip the relaxNG namespace since it is only used in the schema document.
+ continue
+ ns_values.append((k, v))
+
+ self.ns_values = sorted(ns_values, key=lambda x: x[0])
+
+
+def gen_namespace_tokens(filepath, ns_values):
+
+ # header (.hpp)
+ filepath_hpp = filepath + "_hpp.inl"
+ outfile = open(filepath_hpp, 'w')
+ outfile.write("namespace orcus {\n\n")
+ for key, _ in ns_values:
+ outfile.write("extern const xmlns_id_t NS_odf_")
+ outfile.write(key)
+ outfile.write(";\n")
+ outfile.write("\nextern const xmlns_id_t* NS_odf_all;\n")
+ outfile.write("\n}\n\n")
+ outfile.close()
+
+ # source (.cpp)
+ filepath_cpp = filepath + "_cpp.inl"
+ outfile = open(filepath_cpp, 'w')
+ outfile.write("namespace orcus {\n\n")
+ for key, value in ns_values:
+ outfile.write("const xmlns_id_t NS_odf_")
+ outfile.write(key)
+ outfile.write(" = \"")
+ outfile.write(value)
+ outfile.write("\"")
+ outfile.write(";\n")
+
+ outfile.write("\n")
+ outfile.write("namespace {\n\n")
+ outfile.write("const xmlns_id_t odf_ns[] = {\n")
+ for key, _ in ns_values:
+ outfile.write(" NS_odf_")
+ outfile.write(key)
+ outfile.write(",\n")
+ outfile.write(" nullptr\n")
+ outfile.write("};\n\n")
+ outfile.write("} // anonymous\n\n")
+
+ outfile.write("const xmlns_id_t* NS_odf_all = odf_ns;\n\n")
+
+ outfile.write("}\n\n")
+ outfile.close()
+
+
+def main():
+ parser = argparse.ArgumentParser()
+ parser.add_argument(
+ "--ns-file-prefix", type=str,
+ help="file name prefix for optioal namespace constant files")
+ parser.add_argument(
+ "--summary-output", type=Path,
+ help="optional output file to write collected token data summary")
+ parser.add_argument(
+ "--token-constants", type=Path,
+ help="path to C++ output file where token consants are to be written to")
+ parser.add_argument(
+ "--token-names", type=Path,
+ help="path to C++ output file where token names are to be written to")
+ parser.add_argument(
+ "odf_schema", metavar="ODF-SCHEMA", type=Path, help="path to RNG ODF schema file")
+ args = parser.parse_args()
+
+ if not args.odf_schema.is_file():
+ print(f"{args.odf_schema} is not a valid file.", file=sys.stderr)
+ sys.exit(1)
+
+ schema_content = args.odf_schema.read_text()
+ parser = TokenParser(schema_content)
+ parser.parse()
+ tokens = parser.tokens
+
+ parser = NSParser(schema_content)
+ parser.parse()
+ ns_values = parser.ns_values
+
+ if args.summary_output:
+ summary_content_buf = list()
+ summary_content_buf.append("list of tokens:")
+
+ for token in tokens:
+ summary_content_buf.append(f"- \"{token}\"")
+
+ summary_content_buf.append("list of namespaces:")
+
+ for ns, value in ns_values:
+ summary_content_buf.append(f"- {ns}: \"{value}\"")
+
+ args.summary_output.write_text("\n".join(summary_content_buf))
+
+ if args.token_constants:
+ with open(args.token_constants, "w") as f:
+ token_util.gen_token_constants(f, tokens)
+
+ if args.token_names:
+ with open(args.token_names, "w") as f:
+ token_util.gen_token_names(f, tokens)
+
+ if args.ns_file_prefix is not None:
+ gen_namespace_tokens(args.ns_file_prefix, ns_values)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/misc/xml-tokens/gen-ooxml-tokens.py b/misc/xml-tokens/gen-ooxml-tokens.py
new file mode 100755
index 0000000..cee4d6f
--- /dev/null
+++ b/misc/xml-tokens/gen-ooxml-tokens.py
@@ -0,0 +1,84 @@
+#!/usr/bin/env python3
+########################################################################
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+########################################################################
+
+import xml.parsers.expat
+import zipfile
+import argparse
+import sys
+import token_util
+
+
+class XMLParser:
+
+ def __init__ (self, strm):
+ self.__strm = strm
+ self.__elem = None
+ self.tokens = []
+
+ def start_element(self, name, attrs):
+ self.__elem = name
+ if name in ['xs:element', 'xs:attribute', 'xsd:element', 'xsd:attribute'] and "name" in attrs:
+ token = attrs['name']
+ if len(token) > 0:
+ self.tokens.append(token)
+
+ def end_element(self, name):
+ pass
+
+ def character(self, data):
+ pass
+
+ def parse (self):
+ p = xml.parsers.expat.ParserCreate()
+ p.StartElementHandler = self.start_element
+ p.EndElementHandler = self.end_element
+ p.CharacterDataHandler = self.character
+ p.Parse(self.__strm, 1)
+
+
+def get_all_tokens_from_zip(fpath):
+ with zipfile.ZipFile(fpath, 'r') as zip:
+ tokens = set()
+ for item in zip.namelist():
+ fd = zip.open(item, 'r')
+ parser = XMLParser(fd.read())
+ fd.close()
+ parser.parse()
+ tokens.update(parser.tokens)
+
+ return tokens
+
+
+def main():
+ parser = argparse.ArgumentParser()
+ parser.add_argument(
+ "-i", "--input", required=True, type=str,
+ help="Zip file containing schemas.")
+ parser.add_argument("--extra-input", type=argparse.FileType("r"), help="Optional input file containing extra token names.")
+ parser.add_argument(
+ "constant_file", metavar="CONSTANT-FILE", nargs=1, type=argparse.FileType("w"),
+ help="Output file to store constant values.")
+ parser.add_argument(
+ "name_file", metavar="NAME-FILE", nargs=1, type=argparse.FileType("w"),
+ help="Output file to store constant string names.")
+ args = parser.parse_args()
+
+ tokens = get_all_tokens_from_zip(args.input)
+
+ if args.extra_input:
+ extra_tokens = [x.strip() for x in args.extra_input.readlines()]
+ tokens.update(extra_tokens)
+
+ tokens = sorted(list(tokens))
+ token_util.gen_token_constants(args.constant_file[0], tokens)
+ token_util.gen_token_names(args.name_file[0], tokens)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/misc/xml-tokens/gen-tokens.py b/misc/xml-tokens/gen-tokens.py
new file mode 100755
index 0000000..f344e2e
--- /dev/null
+++ b/misc/xml-tokens/gen-tokens.py
@@ -0,0 +1,47 @@
+#!/usr/bin/env python3
+########################################################################
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+########################################################################
+
+import token_util
+import argparse
+import sys
+from pathlib import Path
+
+
+desc = """Generate C++ source files from a list of tokens.
+
+To generate tokens files for Excel 2003 XML (xls-xml), run
+
+ %(prog)s xls-xml-tokens.txt \\
+ ../../src/liborcus/xls_xml_token_constants.inl \\
+ ../../src/liborcus/xls_xml_tokens.inl \\
+"""
+
+def main ():
+ parser = argparse.ArgumentParser(
+ description=desc,
+ formatter_class=argparse.RawTextHelpFormatter
+ )
+ parser.add_argument("tokenlist", type=Path, help="plain-text file that contains a list of tokens.")
+ parser.add_argument("output1", type=Path, help="output file that will contain XML token values.")
+ parser.add_argument("output2", type=Path, help="output file that will contain XML token names.")
+ args = parser.parse_args()
+
+ tokens = {}
+ with open(args.tokenlist, "r") as f:
+ for line in f.readlines():
+ token = line.strip()
+ tokens[token] = True
+
+ tokens = sorted(tokens.keys())
+ token_util.gen_token_constants(args.output1, tokens)
+ token_util.gen_token_names(args.output2, tokens)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/misc/xml-tokens/gnumeric.xsd b/misc/xml-tokens/gnumeric.xsd
new file mode 100755
index 0000000..a2c79cf
--- /dev/null
+++ b/misc/xml-tokens/gnumeric.xsd
@@ -0,0 +1,1296 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ xmlns:gnm="http://www.gnumeric.org/v10.dtd"
+ xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
+ targetNamespace="http://www.gnumeric.org/v10.dtd"
+ elementFormDefault="qualified"
+ attributeFormDefault="unqualified">
+
+ <xs:annotation>
+ <xs:documentation xml:lang="en">
+ Schema for gnumeric spreadsheet documents
+ Created for Gnumeric 1.2.2,
+ Based on gnumeric source code and sample gnumeric documents
+ Author: Marc Johnson (marc_johnson27591@hotmail.com)
+
+ updated for 1.4.2 in Feb 2005
+ updated for 1.6.0 in Sept 2005
+ updated for 1.7.1 in Jun 2006
+ updated for 1.7.11 in Jun 2007 jody@gnome.org
+ updated for 1.7.91 in Nov 2007 jody@gnome.org
+ partially updated for 1.10.17 in July 2011 aguelzow@pyrshep.ca
+ </xs:documentation>
+ </xs:annotation>
+
+ <xs:element name="Workbook" type="gnm:Workbook"/>
+
+ <xs:complexType name="Version">
+ <xs:attribute name="Epoch" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="Major" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="Minor" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="Full" type="xs:string" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+
+ <xs:complexType name="Calculation">
+ <xs:attribute name="ManualRecalc" type="xs:boolean"/>
+ <xs:attribute name="EnableIteration" type="xs:boolean"/>
+ <xs:attribute name="MaxIterations" type="xs:nonNegativeInteger"/>
+ <xs:attribute name="FloatRadix" type="xs:positiveInteger"/>
+ <xs:attribute name="FloatDigits" type="xs:nonNegativeInteger"/>
+ <xs:attribute name="IterationTolerance" type="xs:double"/>
+ <xs:attribute name="DateConvention" type="gnm:DateConvention" use="optional" default="Lotus:1900"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+
+ <xs:group name="WorkbookContentBlockA">
+ <xs:sequence>
+ <!-- ancient files lack this, modern files require it -->
+ <xs:element name="SheetNameIndex" type="gnm:SheetNameIndex" minOccurs="0" maxOccurs="1"/>
+
+ <xs:element name="Names" type="gnm:Names" minOccurs="0" maxOccurs="1"/>
+
+ <!-- Deprecated, moved to Calculation and expanded in 1.7.11
+ Valid value == 1904, anything else == Lotus:1900 -->
+ <xs:element name="DateConvention" type="xs:int" minOccurs="0" maxOccurs="1"/>
+
+ <!-- preferred height and width -->
+ <xs:element name="Geometry">
+ <xs:complexType>
+ <xs:attribute name="Width" type="xs:nonNegativeInteger" use="optional"/>
+ <xs:attribute name="Height" type="xs:nonNegativeInteger" use="optional"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Sheets" type="gnm:Sheets"/>
+ <!-- which sheet was selected when the spreadsheet was saved? -->
+ <xs:element name="UIData">
+ <xs:complexType>
+ <xs:attribute name="SelectedTab" type="xs:nonNegativeInteger" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:group>
+
+ <xs:complexType name="Workbook">
+ <xs:sequence>
+ <xs:element name="Version" type="gnm:Version" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="Attributes" type="gnm:Attributes"/>
+
+ <!-- ignore office:document-meta -->
+ <xs:any minOccurs="0" maxOccurs="unbounded"
+ namespace="##other" processContents="lax"/>
+
+ <xs:choice>
+ <xs:sequence>
+ <!-- In new files the Calculation element comes first, in old files last -->
+ <xs:element name="Calculation" type="gnm:Calculation" minOccurs="0" maxOccurs="1"/>
+ <xs:group ref="gnm:WorkbookContentBlockA"/>
+ </xs:sequence>
+ <xs:sequence>
+ <xs:group ref="gnm:WorkbookContentBlockA"/>
+ <xs:element name="Calculation" type="gnm:Calculation" minOccurs="0" maxOccurs="1"/>
+ </xs:sequence>
+ </xs:choice>
+ </xs:sequence>
+ <!-- version number should be v10 - - &gt;
+ <xs:attribute name="gnm" type="gnm:namespace" use="required"/> -->
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+
+ <!-- How values are mapped to dates. All date functions are affected -->
+ <xs:simpleType name="DateConvention">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="Lotus:1900"/>
+ <xs:enumeration value="Apple:1904"/>
+
+ <!-- future values. currently treated as Lotus:1900 -->
+ <xs:enumeration value="ODF:1899"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="CellRef">
+ <xs:restriction base="xs:string">
+ <xs:pattern value="[A-Z]+\d+"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="Names">
+ <xs:sequence>
+ <xs:element name="Name" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence>
+ <!-- an oversight in the sax exporter (fixed in 1.4.3)
+ leaves off the namespace. Handle both formats.
+ -->
+ <xs:choice>
+ <xs:element name="name" type="xs:string"/>
+ <xs:element name="name" type="xs:string" form="unqualified"/>
+ </xs:choice>
+ <xs:choice>
+ <xs:element name="value" type="xs:string"/>
+ <xs:element name="value" type="xs:string" form="unqualified"/>
+ </xs:choice>
+ <xs:choice>
+ <xs:element name="position" type="xs:string"/>
+ <xs:element name="position" type="xs:string" form="unqualified"/>
+ </xs:choice>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="Attributes">
+ <xs:sequence>
+ <xs:element name="Attribute" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="type" minOccurs="0" maxOccurs="1" type="gnm:AttributeType"/>
+ <!-- must be 4 -->
+ <xs:element name="name" minOccurs="1" maxOccurs="1" type="xs:string"/>
+ <xs:element name="value" minOccurs="1" maxOccurs="1" type="xs:string"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:simpleType name="AttributeType">
+ <xs:restriction base="xs:integer">
+ <xs:minInclusive value="4"/>
+ <xs:maxInclusive value="4"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="SheetNameIndex">
+ <xs:sequence>
+ <xs:element name="SheetName" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="Cols" type="xs:positiveInteger" form="qualified"/>
+ <xs:attribute name="Rows" type="xs:positiveInteger" form="qualified"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="Sheets">
+ <xs:sequence>
+ <xs:element name="Sheet" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence>
+ <!-- name of the sheet -->
+ <xs:element name="Name" type="xs:string"/>
+ <!-- maximum column used -->
+ <xs:element name="MaxCol" type="xs:integer" minOccurs="0" maxOccurs="1"/>
+ <!-- maximum row used -->
+ <xs:element name="MaxRow" type="xs:integer" minOccurs="0" maxOccurs="1"/>
+ <!-- most recently used zoom factor -->
+ <xs:element name="Zoom" type="xs:double"/>
+ <xs:element name="Names" type="gnm:Names" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="PrintInformation" type="gnm:PrintInformation"/>
+ <xs:element name="Styles" type="gnm:Styles"/>
+ <xs:element name="Cols">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="ColInfo" type="gnm:Col_Row" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute name="DefaultSizePts" type="xs:double" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Rows">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="RowInfo" type="gnm:Col_Row" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute name="DefaultSizePts" type="xs:double" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Selections" type="gnm:Selections"/>
+ <xs:element name="Objects" type="gnm:Objects" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="Cells" type="gnm:Cells"/>
+ <xs:element name="MergedRegions" type="gnm:MergedRegions" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="SheetLayout" type="gnm:SheetLayout" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="Filters" type="gnm:Filters" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="Solver" type="gnm:Solver" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="Scenarios" type="gnm:Scenarios" minOccurs="0" maxOccurs="1"/>
+ </xs:sequence>
+ <!-- note: xs:boolean values can be true, false, 1, 0;
+ gnumeric, in this element, always generates 'true' or
+ 'false' for its attributes
+ -->
+ <xs:attribute name="DisplayFormulas" type="xs:boolean" use="optional" default="false"/>
+ <xs:attribute name="HideZero" type="xs:boolean" use="optional" default="false"/>
+ <xs:attribute name="HideGrid" type="xs:boolean" use="optional" default="false"/>
+ <xs:attribute name="HideColHeader" type="xs:boolean" use="optional" default="false"/>
+ <xs:attribute name="HideRowHeader" type="xs:boolean" use="optional" default="false"/>
+ <xs:attribute name="DisplayOutlines" type="xs:boolean" use="optional" default="true"/>
+ <xs:attribute name="OutlineSymbolsBelow" type="xs:boolean" use="optional" default="true"/>
+ <xs:attribute name="OutlineSymbolsRight" type="xs:boolean" use="optional" default="true"/>
+ <xs:attribute name="Visibility" type="gnm:SheetVisibility" use="optional" default="GNM_SHEET_VISIBILITY_VISIBLE"/>
+ <xs:attribute name="RTL_Layout" type="xs:boolean" use="optional" default="false"/>
+ <xs:attribute name="Protected" type="xs:boolean" use="optional" default="false"/>
+ <xs:attribute name="TabColor" type="gnm:color" use="optional"/>
+ <xs:attribute name="TabTextColor" type="gnm:color" use="optional"/>
+ <xs:attribute name="GridColor" type="gnm:color" use="optional"/>
+ <xs:attribute name="ExprConvention" type="gnm:ExprConvention" use="optional" default="gnumeric:A1"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <!-- How expressions are _displayed_ no impact on evaluation -->
+ <xs:simpleType name="ExprConvention">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="gnumeric:A1"/>
+ <xs:enumeration value="gnumeric:R1C1"/>
+
+ <!-- future values, currently displayed as gnumeric:A1 -->
+ <xs:enumeration value="ODF:A1"/>
+ <xs:enumeration value="Lotus:A1"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="PrintInformation">
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element name="Margins">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="top" type="gnm:margin"/>
+ <xs:element name="bottom" type="gnm:margin"/>
+ <xs:element name="left" type="gnm:margin" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="right" type="gnm:margin" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="header" type="gnm:margin" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="footer" type="gnm:margin" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Scale">
+ <xs:complexType>
+ <xs:attribute name="type" type="xs:string" use="required"/>
+ <xs:attribute name="percentage" type="xs:double" use="optional"/>
+ <xs:attribute name="cols" type="xs:integer" />
+ <xs:attribute name="rows" type="xs:integer" />
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <!-- center vertically -->
+ <xs:element name="vcenter">
+ <xs:complexType>
+ <xs:attribute name="value" type="xs:boolean" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <!-- center horizontally -->
+ <xs:element name="hcenter">
+ <xs:complexType>
+ <xs:attribute name="value" type="xs:boolean" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <!-- print grid lines -->
+ <xs:element name="grid">
+ <xs:complexType>
+ <xs:attribute name="value" type="xs:boolean" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <!-- print even if only styles -->
+ <xs:element name="even_if_only_styles">
+ <xs:complexType>
+ <xs:attribute name="value" type="xs:boolean" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <!-- print in monochrome -->
+ <xs:element name="monochrome">
+ <xs:complexType>
+ <xs:attribute name="value" type="xs:boolean" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <!-- print in draft mode -->
+ <xs:element name="draft">
+ <xs:complexType>
+ <xs:attribute name="value" type="xs:boolean" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <!-- print titles -->
+ <xs:element name="titles">
+ <xs:complexType>
+ <xs:attribute name="value" type="xs:boolean" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+
+ <!-- repeat range -->
+ <xs:element name="repeat_top" minOccurs="0" maxOccurs="1">
+ <xs:complexType>
+ <xs:attribute name="value" type="xs:string" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <!-- repeat range -->
+ <xs:element name="repeat_left" minOccurs="0" maxOccurs="1">
+ <xs:complexType>
+ <xs:attribute name="value" type="xs:string" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="order" type="gnm:print_ordering"/>
+ <xs:element name="orientation" type="gnm:print_orientation"/>
+ <xs:element name="Header" type="gnm:HeaderFooter"/>
+ <xs:element name="Footer" type="gnm:HeaderFooter"/>
+ <!-- typical values are A4, US-Letter -->
+ <xs:element name="paper" type="xs:string" minOccurs="0" maxOccurs="1"/>
+ <!-- do not print this sheet when "all" is selected in the job -->
+ <xs:element name="do_not_print" minOccurs="0" maxOccurs="1">
+ <xs:complexType>
+ <xs:attribute name="value" type="xs:boolean" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="print-to-uri" type="xs:string" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="vPageBreaks" type="gnm:PageBreaks" minOccurs="0" maxOccurs="1"/>
+ <!-- between rows -->
+ <xs:element name="hPageBreaks" type="gnm:PageBreaks" minOccurs="0" maxOccurs="1"/>
+ <!-- between cols -->
+ <xs:element name="print_range" minOccurs="0" maxOccurs="1">
+ <xs:complexType>
+ <xs:attribute name="value" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:integer">
+ <xs:enumeration value="-1"/>
+ <!-- PRINT_SAVED_INFO -->
+ <xs:enumeration value="0"/>
+ <!-- PRINT_ACTIVE_SHEET -->
+ <xs:enumeration value="1"/>
+ <!-- PRINT_ALL_SHEETS -->
+ <xs:enumeration value="2"/>
+ <!-- PRINT_ALL_SHEETS_INCLUDING_HIDDEN -->
+ <xs:enumeration value="3"/>
+ <!-- PRINT_SHEET_RANGE -->
+ <xs:enumeration value="4"/>
+ <!-- PRINT_SHEET_SELECTION -->
+ <xs:enumeration value="5"/>
+ <!-- PRINT_IGNORE_PRINTAREA -->
+ <xs:enumeration value="6"/>
+ <!-- PRINT_SHEET_SELECTION_IGNORE_PRINTAREA -->
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:complexType>
+ </xs:element>
+ </xs:choice>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+
+ <xs:complexType name="HeaderFooter">
+ <xs:attribute name="Left" type="xs:string" use="optional"/>
+ <xs:attribute name="Middle" type="xs:string" use="optional"/>
+ <xs:attribute name="Right" type="xs:string" use="optional"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+
+ <xs:complexType name="PageBreaks">
+ <xs:sequence>
+ <xs:element name="break" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:attribute name="pos" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="type" type="gnm:PageBreakType" use="optional" default="auto"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="count" type="xs:nonNegativeInteger" use="optional"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+
+ <xs:simpleType name="PageBreakType">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="auto"/>
+ <xs:enumeration value="manual"/>
+ <xs:enumeration value="data-slice"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="margin">
+ <xs:attribute name="Points" type="xs:double"/>
+ <xs:attribute name="PrefUnit" type="gnm:print_units"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+
+ <xs:simpleType name="print_units">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="mm"/>
+ <xs:enumeration value="millimeter"/>
+ <xs:enumeration value="cm"/>
+ <xs:enumeration value="centimeter"/>
+ <xs:enumeration value="in"/>
+ <xs:enumeration value="inch"/>
+ <xs:enumeration value="inches"/>
+ <xs:enumeration value="Pt"/>
+ <xs:enumeration value="Pts"/>
+ <xs:enumeration value="points"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="print_ordering">
+ <xs:restriction base="xs:string">
+ <!-- right, then down -->
+ <xs:enumeration value="r_then_d"/>
+ <!-- down, then right -->
+ <xs:enumeration value="d_then_r"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="print_orientation">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="landscape"/>
+ <xs:enumeration value="portrait"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="Styles">
+ <xs:sequence>
+ <xs:element name="StyleRegion" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Style" type="gnm:Style" minOccurs="1" maxOccurs="1"/>
+ </xs:sequence>
+ <xs:attribute name="startCol" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="startRow" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="endCol" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="endRow" type="xs:nonNegativeInteger" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="Style">
+ <xs:sequence>
+ <xs:element name="Font" minOccurs="0" maxOccurs="1">
+ <xs:complexType>
+ <xs:simpleContent>
+ <!-- Since these might be conditional styles, the atributes are
+ not required -->
+ <xs:extension base="xs:string">
+ <xs:attribute name="Unit" type="xs:double" use="optional"/>
+ <xs:attribute name="Bold" type="xs:boolean" use="optional"/>
+ <xs:attribute name="Italic" type="xs:boolean" use="optional"/>
+ <xs:attribute name="Underline" type="gnm:underline" use="optional"/>
+ <xs:attribute name="StrikeThrough" type="xs:boolean" use="optional"/>
+ <xs:attribute name="Script" type="gnm:script" use="optional"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="HyperLink" minOccurs="0" maxOccurs="1">
+ <xs:complexType>
+ <xs:attribute name="type" type="xs:string" use="required"/>
+ <xs:attribute name="target" type="xs:string" use="optional"/>
+ <xs:attribute name="tip" type="xs:string" use="optional"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="StyleBorder" minOccurs="0" maxOccurs="1">
+ <xs:complexType>
+ <xs:choice minOccurs="0" maxOccurs="6">
+ <!-- The order of the last two elements appears to be
+ version dependent-->
+ <xs:element name="Top" type="gnm:StyleBorderElement" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="Bottom" type="gnm:StyleBorderElement" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="Left" type="gnm:StyleBorderElement" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="Right" type="gnm:StyleBorderElement" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="Diagonal" type="gnm:StyleBorderElement" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="Rev-Diagonal" type="gnm:StyleBorderElement" minOccurs="0" maxOccurs="1"/>
+ </xs:choice>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Validation" minOccurs="0" maxOccurs="1">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Expression0" type="xs:string" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="Expression1" type="xs:string" minOccurs="0" maxOccurs="1"/>
+ </xs:sequence>
+ <xs:attribute name="Style" type="xs:integer" use="required"/>
+ <xs:attribute name="Type" type="xs:integer" use="required"/>
+ <xs:attribute name="Operator" type="xs:integer" use="optional"/>
+ <xs:attribute name="AllowBlank" type="xs:boolean" use="optional"/>
+ <xs:attribute name="UseDropdown" type="xs:boolean" use="optional"/>
+ <xs:attribute name="Title" type="xs:string" use="optional"/>
+ <xs:attribute name="Message" type="xs:string" use="optional"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="InputMessage" minOccurs="0" maxOccurs="1">
+ <xs:complexType>
+ <xs:attribute name="Title" type="xs:string" use="optional"/>
+ <xs:attribute name="Message" type="xs:string" use="optional"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Condition" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Expression0" type="xs:string" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="Expression1" type="xs:string" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="Style" type="gnm:Style" minOccurs="1" maxOccurs="1"/>
+ </xs:sequence>
+ <xs:attribute name="Operator" type="gnm:CondOp" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="HAlign" type="gnm:horizontal_alignment"/>
+ <xs:attribute name="VAlign" type="gnm:vertical_alignment"/>
+ <xs:attribute name="WrapText" type="xs:boolean" />
+
+ <!-- should be bool, but some files have odd truth values -->
+ <xs:attribute name="ShrinkToFit" type="xs:integer" />
+
+ <xs:attribute name="Rotation" type="xs:integer" use="optional"/>
+ <xs:attribute name="Orient" type="xs:integer" use="optional"/>
+ <xs:attribute name="Shade" type="gnm:Stipple" use="optional"/>
+ <xs:attribute name="Indent" type="xs:integer" use="optional"/>
+ <xs:attribute name="Locked" type="xs:boolean" use="optional"/>
+ <xs:attribute name="Hidden" type="xs:boolean" use="optional"/>
+ <xs:attribute name="Fore" type="gnm:color" use="optional"/>
+ <xs:attribute name="Back" type="gnm:color" use="optional"/>
+ <xs:attribute name="PatternColor" type="gnm:color" use="optional"/>
+ <xs:attribute name="Format" type="xs:string" use="optional"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+
+ <xs:complexType name="StyleBorderElement">
+ <xs:attribute name="Style" type="gnm:border_style" use="required"/>
+ <!-- Color is present when Style is not 0 -->
+ <xs:attribute name="Color" type="gnm:color" use="optional"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+
+ <xs:simpleType name="border_style">
+ <xs:restriction base="xs:integer">
+ <!-- 0 = NONE
+ 1 = THIN
+ 2 = MEDIUM
+ 3 = DASHED
+ 4 = DOTTED
+ 5 = THICK
+ 6 = DOUBLE
+ 7 = HAIR
+ 8 = MEDIUM_DASH
+ 9 = DASH_DOT
+ 10 = MEDIUM_DASH_DOT
+ 11 = DASH_DOT_DOT
+ 12 = MEDIUM_DASH_DOT_DOT
+ 13 = SLANTED_DASH_DOT
+ -->
+ <xs:minInclusive value="0"/>
+ <xs:maxInclusive value="13"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="underline">
+ <xs:restriction base="xs:integer">
+ <!-- 0 = NONE
+ 1 = SINGLE
+ 2 = DOUBLE
+ -->
+ <xs:minInclusive value="0"/>
+ <xs:maxInclusive value="2"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="script">
+ <xs:restriction base="xs:integer">
+ <!-- GO_FONT_SCRIPT_SUB = -1,
+ GO_FONT_SCRIPT_STANDARD = 0,
+ GO_FONT_SCRIPT_SUPER = 1
+ -->
+ <xs:minInclusive value="-1"/>
+ <xs:maxInclusive value="1"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="horizontal_alignment">
+ <xs:restriction base="xs:integer">
+ <!-- this is a bit map as follows:
+ 1 = GENERAL
+ 2 = LEFT
+ 4 = RIGHT
+ 8 = CENTER
+ 16 = FILL
+ 32 = JUSTIFY
+ 64 = CENTER ACROSS SELECTION
+ 128 = DISTRIBUTED
+ -->
+ <xs:minInclusive value="1"/>
+ <xs:maxInclusive value="128"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="vertical_alignment">
+ <xs:restriction base="xs:integer">
+ <!-- this is a bit map as follows:
+ 1 = TOP
+ 2 = BOTTOM
+ 4 = CENTER
+ 8 = JUSTIFY
+ 16 = DISTRIBUTED
+ -->
+ <xs:minInclusive value="1"/>
+ <xs:maxInclusive value="16"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="Stipple">
+ <xs:restriction base="xs:integer">
+ <!-- the values are defined as follows:
+ 0 = NONE
+ 1 = Solid
+ 2 = 75%
+ 3 = 50%
+ 4 = 25%
+ 5 = 12.5%
+ 6 = 6.25%
+ 7 = Horizontal Stripe
+ 8 = Vertical Stripe
+ 9 = Reverse Diagonal Stripe
+ 10 = Diagonal Stripe
+ 11 = Diagonal Crosshatch
+ 12 = Thick Diagonal Crosshatch
+ 13 = Thin Horizontal Stripe
+ 14 = Thin Vertical Stripe
+ 15 = Thin Reverse Diagonal Stripe
+ 16 = Thin Diagonal Stripe
+ 17 = Thin Crosshatch
+ 18 = Thin Diagonal Crosshatch
+ 19 = Applix small circle
+ 20 = Applix semicircle
+ 21 = Applix small thatch
+ 22 = Applix round thatch
+ 23 = Applix Brick
+ 24 = 100%
+ 25 = 87.5%
+ -->
+ <xs:minInclusive value="0"/>
+ <xs:maxInclusive value="25"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="color">
+ <xs:restriction base="xs:string">
+ <!-- colors in hex, 16 bits red, green, then blue -->
+ <xs:pattern value="[0-9A-F]{1,4}:[0-9A-F]{1,4}:[0-9A-F]{1,4}"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="Col_Row">
+ <!-- column/row number -->
+ <xs:attribute name="No" type="xs:nonNegativeInteger" use="required"/>
+ <!-- size in points -->
+ <xs:attribute name="Unit" type="xs:double" use="required"/>
+ <!-- DEPRECATED in 1.7.1 : top/left margin (no unit it does not scale) -->
+ <xs:attribute name="MarginA" type="gnm:col_row_margin" use="optional"/>
+ <!-- DEPRECATED in 1.7.1 : botton/right margin (no unit it does not scale) -->
+ <xs:attribute name="MarginB" type="gnm:col_row_margin" use="optional"/>
+ <!-- true if size is explicitly set -->
+ <xs:attribute name="HardSize" type="xs:boolean" use="optional" default="0"/>
+ <xs:attribute name="Hidden" type="xs:boolean" use="optional" default="0"/>
+ <xs:attribute name="Collapsed" type="xs:boolean" use="optional" default="0"/>
+ <xs:attribute name="OutlineLevel" type="xs:integer" use="optional" default="0"/>
+ <!-- The number of consequitive identically sized cols/rows -->
+ <xs:attribute name="Count" type="xs:integer" use="optional" default="1"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+
+ <xs:simpleType name="col_row_margin">
+ <xs:restriction base="xs:integer">
+ <xs:minInclusive value="0"/>
+ <xs:maxInclusive value="7"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="Selections">
+ <xs:sequence>
+ <xs:element name="Selection" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:attribute name="startCol" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="startRow" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="endCol" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="endRow" type="xs:nonNegativeInteger" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="CursorCol" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="CursorRow" type="xs:nonNegativeInteger" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+
+ <xs:attributeGroup name="ObjectAnchor">
+ <xs:attribute name="ObjectBound" type="xs:string" use="required"/>
+ <xs:attribute name="ObjectOffset" type="gnm:offsets" use="required"/>
+ <xs:attribute name="ObjectAnchorType" type="gnm:anchor_type" use="optional"/>
+ <xs:attribute name="Direction" type="gnm:direction" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:attributeGroup>
+
+ <xs:attributeGroup name="ObjectProperties">
+ <xs:attribute name="Print" type="xs:boolean" use="optional"/>
+ <xs:attribute name="Name" type="xs:string" use="optional"/>
+ </xs:attributeGroup>
+
+ <xs:attributeGroup name="ObjectAdjustmentProps">
+ <xs:attribute name="Min" type="xs:double" use="required"/>
+ <xs:attribute name="Max" type="xs:double" use="required"/>
+ <xs:attribute name="Inc" type="xs:double" use="required"/>
+ <xs:attribute name="Page" type="xs:double" use="required"/>
+ <xs:attribute name="Value" type="xs:double" use="required"/>
+ <xs:attribute name="Input" type="xs:string" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:attributeGroup>
+
+ <xs:complexType name="Objects">
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element name="CellComment">
+ <xs:complexType>
+ <xs:attributeGroup ref="gnm:ObjectAnchor"/>
+ <xs:attributeGroup ref="gnm:ObjectProperties"/>
+ <xs:attribute name="Author" type="xs:string" use="optional"/>
+ <xs:attribute name="Text" type="xs:string" use="required"/>
+ <xs:attribute name="TextFormat" type="xs:string" use="optional"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="SheetObjectFilled">
+ <xs:complexType>
+ <xs:choice minOccurs="0" maxOccurs="1">
+ <xs:any namespace="##local" processContents="lax"/>
+ </xs:choice>
+ <xs:attributeGroup ref="gnm:ObjectAnchor"/>
+ <xs:attributeGroup ref="gnm:ObjectProperties"/>
+ <xs:attribute name="OutlineColor" type="gnm:color" use="required"/>
+ <xs:attribute name="FillColor" type="gnm:color" use="required"/>
+ <xs:attribute name="Type" type="gnm:objectfilled" use="required"/>
+ <xs:attribute name="Width" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="Label" type="xs:string" use="optional"/>
+ <xs:attribute name="LabelFormat" type="xs:string" use="optional"/>
+
+ <!-- the arrow shape attributes are only used if the type is
+ arrow (type="gnm:2")
+ -->
+ <xs:attribute name="ArrowShapeA" type="xs:double" use="optional"/>
+ <xs:attribute name="ArrowShapeB" type="xs:double" use="optional"/>
+ <xs:attribute name="ArrowShapeC" type="xs:double" use="optional"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+
+ <!-- widgets -->
+ <xs:element name="SheetWidgetButton">
+ <xs:complexType>
+ <xs:attributeGroup ref="gnm:ObjectAnchor"/>
+ <xs:attributeGroup ref="gnm:ObjectProperties"/>
+ <xs:attribute name="Label" type="xs:string" use="required"/>
+ <xs:attribute name="Value" type="xs:integer" />
+ <xs:attribute name="Input" type="xs:string" />
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="SheetWidgetCheckbox">
+ <xs:complexType>
+ <xs:attributeGroup ref="gnm:ObjectAnchor"/>
+ <xs:attributeGroup ref="gnm:ObjectProperties"/>
+ <xs:attribute name="Label" type="xs:string" use="required"/>
+ <xs:attribute name="Value" type="xs:integer" use="required"/>
+ <xs:attribute name="Input" type="xs:string" />
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="SheetWidgetToggleButton" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:attributeGroup ref="gnm:ObjectAnchor"/>
+ <xs:attributeGroup ref="gnm:ObjectProperties"/>
+ <xs:attribute name="Label" type="xs:string" use="required"/>
+ <xs:attribute name="Value" type="xs:integer" use="required"/>
+ <xs:attribute name="Input" type="xs:string" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="SheetWidgetScrollbar">
+ <xs:complexType>
+ <xs:attributeGroup ref="gnm:ObjectAnchor"/>
+ <xs:attributeGroup ref="gnm:ObjectAdjustmentProps"/>
+ <xs:attributeGroup ref="gnm:ObjectProperties"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="SheetWidgetSpinbutton">
+ <xs:complexType>
+ <xs:attributeGroup ref="gnm:ObjectAnchor"/>
+ <xs:attributeGroup ref="gnm:ObjectAdjustmentProps"/>
+ <xs:attributeGroup ref="gnm:ObjectProperties"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="SheetWidgetSlider" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:attributeGroup ref="gnm:ObjectAnchor"/>
+ <xs:attributeGroup ref="gnm:ObjectAdjustmentProps"/>
+ <xs:attributeGroup ref="gnm:ObjectProperties"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="SheetObjectImage">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Content" form="unqualified">
+ <xs:complexType mixed="true">
+ <xs:attribute name="image-type" type="xs:string" use="required"/>
+ <xs:attribute name="size-bytes" type="xs:int" use="optional"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attributeGroup ref="gnm:ObjectAnchor"/>
+ <xs:attributeGroup ref="gnm:ObjectProperties"/>
+ <xs:attribute name="crop-top" type="xs:double" use="required"/>
+ <xs:attribute name="crop-bottom" type="xs:double" use="required"/>
+ <xs:attribute name="crop-left" type="xs:double" use="required"/>
+ <xs:attribute name="crop-right" type="xs:double" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="SheetObjectGraph">
+ <xs:complexType>
+ <xs:choice minOccurs="1" maxOccurs="1">
+ <xs:element name="GogObject" type="gnm:GogObject"/>
+ <xs:element name="GogObject" type="gnm:GogObject" form="unqualified"/>
+ </xs:choice>
+ <xs:attributeGroup ref="gnm:ObjectAnchor"/>
+ <xs:attributeGroup ref="gnm:ObjectProperties"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="SheetWidgetFrame">
+ <xs:complexType>
+ <xs:attributeGroup ref="gnm:ObjectAnchor"/>
+ <xs:attributeGroup ref="gnm:ObjectProperties"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="SheetWidgetLabel">
+ <xs:complexType>
+ <xs:attributeGroup ref="gnm:ObjectAnchor"/>
+ <xs:attributeGroup ref="gnm:ObjectProperties"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="SheetWidgetList">
+ <xs:complexType>
+ <xs:attributeGroup ref="gnm:ObjectAnchor"/>
+ <xs:attributeGroup ref="gnm:ObjectProperties"/>
+ <xs:attribute name="Content" type="xs:string" use="required"/>
+ <xs:attribute name="Output" type="xs:string" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="SheetWidgetCombo">
+ <xs:complexType>
+ <xs:attributeGroup ref="gnm:ObjectAnchor"/>
+ <xs:attributeGroup ref="gnm:ObjectProperties"/>
+ <xs:attribute name="Content" type="xs:string" use="required"/>
+ <xs:attribute name="Output" type="xs:string" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+
+ <!-- no longer supported -->
+ <xs:element name="SheetObjectBonobo">
+ <xs:complexType>
+ <xs:attributeGroup ref="gnm:ObjectAnchor"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:choice>
+ </xs:complexType>
+
+ <xs:complexType name="GogObject">
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element name="property" type="gnm:GogProperty"/>
+ <xs:element name="property" type="gnm:GogProperty" form="unqualified"/>
+ <xs:element name="data" type="gnm:GOData"/>
+ <xs:element name="data" type="gnm:GOData" form="unqualified"/>
+ <xs:element name="GogObject" type="gnm:GogObject"/>
+ <xs:element name="GogObject" type="gnm:GogObject" form="unqualified"/>
+ </xs:choice>
+ <xs:attribute name="type" type="xs:string" use="optional"/>
+ <xs:attribute name="role" type="xs:string" use="optional"/>
+ </xs:complexType>
+
+ <xs:complexType name="GogProperty" mixed="true">
+ <xs:sequence>
+ <!-- children are unstructured -->
+ <xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
+ </xs:sequence>
+ <xs:attribute name="name" type="xs:string" use="required"/>
+ <xs:attribute name="type" type="xs:string" use="optional"/>
+ </xs:complexType>
+
+ <xs:complexType name="GOData">
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element name="dimension" type="gnm:GODimension"/>
+ <xs:element name="dimension" type="gnm:GODimension" form="unqualified"/>
+ </xs:choice>
+ </xs:complexType>
+ <xs:complexType name="GODimension">
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="id" type="xs:integer" use="required"/>
+ <xs:attribute name="type" type="xs:string" use="required"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:simpleType name="offsets">
+ <xs:restriction base="xs:string">
+ <!-- if this seems hard to read, it purportedly describes 4
+ space-separated doubles
+ -->
+ <xs:pattern value="[+\-]?\d+(.\d+)?([Ee]([+\-])?\d+)? [+\-]?\d+(.\d+)?([Ee]([+\-])?\d+)? [+\-]?\d+(.\d+)?([Ee]([+\-])?\d+)? [+\-]?\d+(.\d+)?([Ee]([+\-])?\d+)?"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <!-- As of 1.7.7 this is deprecated -->
+ <xs:simpleType name="anchor_type">
+ <xs:restriction base="xs:string">
+ <!-- if this seems hard to read, it purportedly describes 4
+ space-separated positive numbers
+
+ each number needs to be one of the following:
+ 0 = UNKNOWN
+ 16 = PERCENTAGE_FROM_COLROW_START
+ 32 = PTS_FROM_COLROW_START
+ 33 = PTS_FROM_COLROW_END
+ 48 = PTS_ABSOLUTE
+ -->
+ <xs:pattern value="\d+ \d+ \d+ \d+"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="direction">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="-1"/>
+ <!-- unknown -->
+ <xs:enumeration value="0"/>
+ <!-- up right -->
+ <xs:enumeration value="1"/>
+ <!-- up left -->
+ <xs:enumeration value="16"/>
+ <!-- down right -->
+ <xs:enumeration value="17"/>
+ <!-- down left -->
+ <xs:enumeration value="255"/>
+ <!-- unknown -->
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="objectfilled">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="1"/>
+ <!-- line -->
+ <xs:enumeration value="2"/>
+ <!-- arrow -->
+ <xs:enumeration value="101"/>
+ <!-- box -->
+ <xs:enumeration value="102"/>
+ <!-- oval -->
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="Cells">
+ <xs:sequence>
+ <xs:element name="Cell" minOccurs="0" maxOccurs="unbounded">
+ <!-- expressions are stored as entered, with a leading '='.
+ Once a shared expression has been defined, subsequent
+ Cell elements using that same shared expression simply
+ use the "ExprID" attribute to indicate which shared
+ expression is used, and no Content element is included
+ -->
+ <xs:complexType mixed="true">
+ <!-- Compatibility for ancient 0.x format -->
+ <xs:sequence>
+ <xs:element name="Content" type="xs:string" minOccurs="0" maxOccurs="1"/>
+ </xs:sequence>
+
+ <!-- Col and Row are sufficient for a cell that is an element of
+ an array of cells as long as it's not the top left cell -->
+ <xs:attribute name="Col" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="Row" type="xs:nonNegativeInteger" use="required"/>
+ <!-- ExprID is only used to refer to a shared expression -->
+ <xs:attribute name="ExprID" type="xs:nonNegativeInteger" use="optional"/>
+ <!-- ValueType is not used if the cell contains an expression -->
+ <xs:attribute name="ValueType" type="gnm:ValueType" use="optional"/>
+ <!-- ValueFormat is apparently used only for cell-by-cell format overrides -->
+ <xs:attribute name="ValueFormat" type="xs:string" use="optional"/>
+ <!-- Cols and Rows are used to define an array of cells -->
+ <xs:attribute name="Cols" type="xs:positiveInteger" use="optional"/>
+ <xs:attribute name="Rows" type="xs:positiveInteger" use="optional"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:simpleType name="ValueType">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="10"/>
+ <!-- empty -->
+ <xs:enumeration value="20"/>
+ <!-- boolean -->
+ <xs:enumeration value="30"/>
+ <!-- integer -->
+ <xs:enumeration value="40"/>
+ <!-- float -->
+ <xs:enumeration value="50"/>
+ <!-- error -->
+ <xs:enumeration value="60"/>
+ <!-- string -->
+ <xs:enumeration value="70"/>
+ <!-- cellrange -->
+ <xs:enumeration value="80"/>
+ <!-- array -->
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="CondOp">
+ <xs:restriction base="xs:nonNegativeInteger">
+ <xs:enumeration value="0"/>
+ <!-- GNM_STYLE_COND_BETWEEN -->
+ <xs:enumeration value="1"/>
+ <!-- GNM_STYLE_COND_NOT_BETWEEN -->
+ <xs:enumeration value="2"/>
+ <!-- GNM_STYLE_COND_EQUAL -->
+ <xs:enumeration value="3"/>
+ <!-- GNM_STYLE_COND_NOT_EQUAL -->
+ <xs:enumeration value="4"/>
+ <!-- GNM_STYLE_COND_GT -->
+ <xs:enumeration value="5"/>
+ <!-- GNM_STYLE_COND_LT -->
+ <xs:enumeration value="6"/>
+ <!-- GNM_STYLE_COND_GTE -->
+ <xs:enumeration value="7"/>
+ <!-- GNM_STYLE_COND_LTE -->
+
+ <!-- Arbitrary expr evaluated at EvalPos -->
+ <xs:enumeration value="8"/>
+ <!-- GNM_STYLE_COND_CUSTOM -->
+
+ <!-- New in Gnumeric 1.8 -->
+ <xs:enumeration value="16"/>
+ <!-- GNM_STYLE_COND_CONTAINS_STR -->
+ <xs:enumeration value="17"/>
+ <!-- GNM_STYLE_COND_NOT_CONTAINS_STR -->
+ <xs:enumeration value="18"/>
+ <!-- GNM_STYLE_COND_BEGINS_WITH_STR -->
+ <xs:enumeration value="19"/>
+ <!-- GNM_STYLE_COND_NOT_BEGINS_WITH_STR -->
+ <xs:enumeration value="20"/>
+ <!-- GNM_STYLE_COND_ENDS_WITH_STR -->
+ <xs:enumeration value="21"/>
+ <!-- GNM_STYLE_COND_NOT_ENDS_WITH_STR -->
+
+ <xs:enumeration value="22"/>
+ <!-- GNM_STYLE_COND_CONTAINS_ERR -->
+ <xs:enumeration value="23"/>
+ <!-- GNM_STYLE_COND_NOT_CONTAINS_ERR -->
+
+ <xs:enumeration value="24"/>
+ <!-- GNM_STYLE_COND_CONTAINS_BLANKS -->
+ <xs:enumeration value="25"/>
+ <!-- GNM_STYLE_COND_NOT_CONTAINS_BLANK -->
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="FilterFieldType">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="expr"/>
+ <xs:enumeration value="blanks"/>
+ <xs:enumeration value="nonblanks"/>
+ <xs:enumeration value="bucket"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="FilterFieldOp">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="eq"/>
+ <xs:enumeration value="gt"/>
+ <xs:enumeration value="lt"/>
+ <xs:enumeration value="gte"/>
+ <xs:enumeration value="lte"/>
+ <xs:enumeration value="ne"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="FilterField">
+ <xs:attribute name="Index" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="Type" type="gnm:FilterFieldType" use="required"/>
+
+ <!-- WARNING WARNING WARNING
+ Value and ValueType have their senses
+ reversed due to an old typo -->
+ <!-- Only valid for Type=expr -->
+ <xs:attribute name="Value0" type="gnm:ValueType" use="optional"/>
+ <xs:attribute name="ValueType0" type="xs:string" use="optional"/>
+ <xs:attribute name="Op0" type="gnm:FilterFieldOp" use="optional"/>
+ <xs:attribute name="Value1" type="gnm:ValueType" use="optional"/>
+ <xs:attribute name="ValueType1" type="xs:string" use="optional"/>
+ <xs:attribute name="Op1" type="gnm:FilterFieldOp" use="optional"/>
+
+ <!-- Only valid for Type=bucket -->
+ <xs:attribute name="top" type="xs:boolean" use="optional"/>
+ <!-- top vs bottom -->
+ <xs:attribute name="items" type="xs:boolean" use="optional"/>
+ <!-- top n vs top n% -->
+ <xs:attribute name="count" type="xs:double" use="optional"/>
+ <!-- top COUNT -->
+
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+
+ <xs:complexType name="Filters">
+ <xs:sequence>
+ <xs:element name="Filter" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Field" type="gnm:FilterField" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute name="Area" type="xs:string" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="MergedRegions">
+ <xs:sequence>
+ <xs:element name="Merge" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+
+ <xs:complexType name="Solver">
+ <xs:sequence>
+ <xs:element name="Constr" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:attribute name="Lcol" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="Lrow" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="Rcol" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="Rrow" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="Cols" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="Rows" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="Type" type="gnm:solver_constraint_t" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="TargetCol" type="xs:integer" use="optional"/>
+ <xs:attribute name="TargetRow" type="xs:integer" use="optional"/>
+ <xs:attribute name="ProblemType" type="gnm:solver_problem_t" use="required"/>
+ <xs:attribute name="ModelType" type="gnm:model_type_t"/>
+ <xs:attribute name="Inputs" type="xs:string"/>
+ <xs:attribute name="MaxTime" type="xs:integer" use="required"/>
+ <xs:attribute name="MaxIter" type="xs:integer" use="required"/>
+ <xs:attribute name="NonNeg" type="xs:boolean" use="required"/>
+ <xs:attribute name="Discr" type="xs:boolean" use="required"/>
+ <xs:attribute name="AutoScale" type="xs:boolean" use="required"/>
+ <xs:attribute name="ShowIter" type="xs:boolean"/>
+ <xs:attribute name="AnswerR" type="xs:boolean"/>
+ <xs:attribute name="SensitivityR" type="xs:boolean"/>
+ <xs:attribute name="LimitsR" type="xs:boolean"/>
+ <xs:attribute name="PerformR" type="xs:boolean"/>
+ <xs:attribute name="ProgramR" type="xs:boolean" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+
+ <xs:simpleType name="solver_constraint_t">
+ <xs:restriction base="xs:integer">
+ <xs:enumeration value="0" />
+ <!-- none -->
+ <xs:enumeration value="1" />
+ <!-- &lt;= -->
+ <xs:enumeration value="2" />
+ <!-- &gt;= -->
+ <xs:enumeration value="4" />
+ <!-- = -->
+ <xs:enumeration value="8" />
+ <!-- Int -->
+ <xs:enumeration value="16"/>
+ <!-- boolean -->
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="solver_problem_t">
+ <xs:restriction base="xs:integer">
+ <xs:enumeration value="0" />
+ <!-- SolverMinimize -->
+ <xs:enumeration value="1" />
+ <!-- SolverMaximize -->
+ <xs:enumeration value="2" />
+ <!-- SolverEqualTo -->
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="model_type_t">
+ <xs:restriction base="xs:integer">
+ <xs:enumeration value="0" />
+ <!-- GNM_SOLVER_LP -->
+ <xs:enumeration value="1" />
+ <!-- GNM_SOLVER_QP -->
+ <xs:enumeration value="2" />
+ <!-- GNM_SOLVER_NLP -->
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="SheetVisibility">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="GNM_SHEET_VISIBILITY_VISIBLE"/>
+ <xs:enumeration value="GNM_SHEET_VISIBILITY_HIDDEN"/>
+ <xs:enumeration value="GNM_SHEET_VISIBILITY_VERY_HIDDEN"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="Scenarios">
+ <xs:sequence>
+ <xs:element name="Scenario" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Name" type="xs:string"/>
+ <xs:element name="Comment" type="xs:string"/>
+ <xs:element name="CellsStr" type="xs:string"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="SheetLayout">
+ <xs:sequence>
+ <xs:element name="FreezePanes" minOccurs="0" maxOccurs="1">
+ <xs:complexType>
+ <xs:attribute name="FrozenTopLeft" type="xs:string" use="required"/>
+ <xs:attribute name="UnfrozenTopLeft" type="xs:string" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="TopLeft" type="xs:string" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+</xs:schema>
diff --git a/misc/xml-tokens/ooxml-extra-tokens.txt b/misc/xml-tokens/ooxml-extra-tokens.txt
new file mode 100644
index 0000000..a39f3d0
--- /dev/null
+++ b/misc/xml-tokens/ooxml-extra-tokens.txt
@@ -0,0 +1,3 @@
+AlternateContent
+Choice
+Fallback
diff --git a/misc/xml-tokens/token_util.py b/misc/xml-tokens/token_util.py
new file mode 100644
index 0000000..19ba436
--- /dev/null
+++ b/misc/xml-tokens/token_util.py
@@ -0,0 +1,70 @@
+########################################################################
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+########################################################################
+
+import sys
+
+
+unknown_token_name = "??"
+
+
+def normalize_name(old):
+ new = ''
+ for c in old:
+ if c in '.-': # '.' nad '-' are not allowed in C++ symbols.
+ c = '_'
+ new += c
+ return new
+
+
+def gen_token_list(filepath, tokens, ns_tokens):
+ dic = {}
+ for t in tokens:
+ dic[t] = True
+ for t in ns_tokens:
+ dic[t] = True
+
+ keys = dic.keys()
+ keys.sort()
+ file = open(filepath, 'w')
+ for key in keys:
+ file.write(key + "\n")
+ file.close()
+
+
+def get_auto_gen_warning():
+ return "// This file has been auto-generated. Do not hand-edit this."
+
+
+def gen_token_constants(outfile, tokens):
+
+ with open(outfile, "w") as f:
+ print(get_auto_gen_warning(), file=f)
+ print(file=f)
+
+ for i, token in enumerate(tokens):
+ token = normalize_name(token)
+ print(f"const xml_token_t XML_{token} = {i+1};", file=f)
+
+
+def gen_token_names(outfile, tokens):
+
+ with open(outfile, "w") as f:
+ print(get_auto_gen_warning(), file=f)
+ print(file=f)
+
+ print("const char* token_names[] = {", file=f)
+ print(f" \"{unknown_token_name}\", // 0", file=f)
+
+ for i, token in enumerate(tokens):
+ s = ','
+ if i == len(tokens) - 1:
+ s = ' '
+ print(f" \"{token}\"{s} // {i+1}", file=f)
+ print("};", file=f)
+ print(file=f)
+ print(f"size_t token_name_count = {len(tokens)+1};", file=f)
diff --git a/misc/xml-tokens/xls-xml-tokens.txt b/misc/xml-tokens/xls-xml-tokens.txt
new file mode 100644
index 0000000..c7aa93c
--- /dev/null
+++ b/misc/xml-tokens/xls-xml-tokens.txt
@@ -0,0 +1,991 @@
+AcceptLabelsInFormulas
+Action
+ActiveChart
+ActiveCol
+ActiveColumn
+ActivePane
+ActiveRow
+ActiveRows
+ActiveSheet
+Aggregate
+AlertVersion
+Alignment
+AllItemName
+AllowDeleteCols
+AllowDeleteRows
+AllowFilter
+AllowFormatCells
+AllowInsertCols
+AllowInsertHyperlinks
+AllowInsertRows
+AllowPNG
+AllowSizeCols
+AllowSizeRows
+AllowSort
+AllowUsePivotTables
+AlternateMethod
+AppName
+Append
+ApplyAutomaticOutlineStyles
+Area
+ArrayRange
+Async
+Attribute
+AttributeType
+Authentication
+Author
+AutoFilter
+AutoFilterAnd
+AutoFilterColumn
+AutoFilterCondition
+AutoFilterOr
+AutoFitHeight
+AutoFitWidth
+AutoFormatAlignment
+AutoFormatBorder
+AutoFormatFont
+AutoFormatName
+AutoFormatNumber
+AutoFormatPattern
+AutoFormatWidth
+AutoRepublish
+AutoShowCount
+AutoShowField
+AutoShowRange
+AutoShowType
+AutoSortField
+AutoSortOrder
+B
+BackgroundQuery
+BaseField
+BaseItem
+Basic
+Behavior
+Binding
+BlackAndWhite
+BlankLineAfterItems
+BlockTotal
+Bold
+Boolean
+Border
+Borders
+Bottom
+BoundField
+Bytes
+CacheDetails
+CacheFile
+CacheIndex
+CachePosition
+CalculatedMember
+Calculation
+CantGetUniqueItems
+Caption
+CaptionAlignment
+CaseSensitive
+Category
+Cell
+CellRangeList
+CellsExpanded
+CellsExpandedSeqNum
+CellsNotExpanded
+CenterHorizontal
+CenterVertical
+Cf
+CharSet
+Characters
+CharactersWithSpaces
+ClientParameter
+ClientParameterBinding
+ClientParameterBindings
+ClientParameterValue
+Clipped
+CodeName
+Col1
+Col10
+Col11
+Col12
+Col13
+Col14
+Col15
+Col16
+Col17
+Col18
+Col19
+Col2
+Col20
+Col3
+Col4
+Col5
+Col6
+Col7
+Col8
+Col9
+ColBreak
+ColBreaks
+ColFirst
+ColLast
+Color
+Column
+ColumnInfo
+ColumnInputCell
+ColumnName
+ComboHide
+Comma
+CommandText
+CommandTextOrignal
+CommandType
+Comment
+CommentsLayout
+Company
+ComponentOptions
+Condition
+ConditionalFormatting
+Connection
+ConnectionInfo
+ConnectionString
+Consecutive
+ConsolidationReference
+Count
+CountOfSameItems
+CreateBackup
+Created
+Credential
+CredentialBinding
+CredentialValue
+Crn
+CubeField
+CubeSource
+CurrentPage
+Custom
+CustomDocumentProperties
+Data
+DataAxisEmpty
+DataField
+DataMember
+DataSource
+DataTable
+DataType
+DataValidation
+DataValueEditing
+Date1904
+Decimal
+DefaultColumnWidth
+DefaultItem
+DefaultRowHeight
+DefaultValue
+DefaultVersion
+DeletedTitle
+Delimiters
+Descending
+Description
+DetailFormat
+DetailMaxHeight
+DetailMaxWidth
+DetailRowHeight
+DetailSortOrder
+DetailWidth
+Dimension
+DisableDateRecognition
+DisableDrillDown
+DisableEdit
+DisableFieldDialog
+DisableRefresh
+DisableWizard
+DisplayDrawingObjects
+DisplayEmptyMembers
+DisplayErrorString
+DisplayFieldList
+DisplayFormulas
+DisplayIn
+DisplayInkNotes
+DisplayPageBreak
+DisplayRightToLeft
+DivID
+DoNotCalculateBeforeSave
+DoNotDisplayColHeaders
+DoNotDisplayGridlines
+DoNotDisplayHeadings
+DoNotDisplayOutline
+DoNotDisplayRowHeaders
+DoNotDisplayZeros
+DoNotJoinDelimiters
+DoNotPersist
+DoNotPersistSort
+DoNotPersstAF
+DoNotPromptForFile
+DoNotSaveLinkValues
+DocumentProperties
+DontShowInFieldList
+DownloadComponents
+DraftQuality
+DrawAspect
+DrilledLevel
+DrilledMember
+EditWebPage
+ElementType
+EmbedSaveSmartTags
+EnableMultiplePageItems
+EnableRedirections
+EnableSelection
+Encode
+EntirePage
+Entry
+Error
+ErrorHide
+ErrorMessage
+ErrorString
+ErrorStyle
+ErrorTitle
+ExcelName
+ExcelType
+ExcelWorkbook
+ExcelWorksheetType
+Expanded
+ExpandedColumnCount
+ExpandedRowCount
+ExternName
+ExtraLeftColumns
+ExtraRightColumns
+Face
+Family
+Family
+Field
+FieldLabelFormat
+FieldListBottom
+FieldListLeft
+FieldListRight
+FieldListTop
+FieldStart
+FieldType
+File
+FileName
+FillDown
+Filled
+FilterCaption
+FilterMember
+FilterOn
+FirstVisibleSheet
+FitHeight
+FitToPage
+FitWidth
+Font
+FontName
+Footer
+Format
+FormatSettings
+FormatType
+Formula
+FormulaIndex
+FormulaV10
+FreezePanes
+FrozenNoSplit
+FullColumns
+FullRows
+Function
+FunctionGroup
+FunctionGroupIndex
+FuturePersist
+FutureVer
+GrandTotalString
+GridlineColor
+GridlineColorIndex
+Gridlines
+GroupBy
+GroupDefinition
+GroupEnd
+GroupEndAuto
+GroupLevel
+GroupMember
+GroupNumber
+GroupStart
+GroupStartAuto
+GroupType
+GroupedWidth
+Guid
+HRef
+HRefScreenTip
+HTMLFormat
+HTMLTables
+HasNoAutoFormat
+HasNoRecords
+Header
+HeaderRange
+HeaderRow
+Height
+Hidden
+HideDetail
+HideDropDowns
+HideFormula
+HideHorizontalScrollBar
+HideInactiveListBorder
+HideOfficeLogo
+HidePivotTableFieldList
+HideTotalsAnnotation
+HideVerticalScrollBar
+HideWorkbookTabs
+Horizontal
+HorizontalResolution
+Href
+HtmlType
+HyperlinkBase
+I
+ID
+IMEMode
+Id
+IdWrapped
+If
+ImmediateItemsOnDrop
+Indent
+Index
+IndividualCellBorders
+InputHide
+InputMessage
+InputTitle
+InsertEntireRows
+InstanceShape
+Interior
+IntlMacro
+Invalid
+InvertedColumnMember
+InvertedRowMember
+IsGroupLevel
+IsMemberProperty
+IsNotFiltered
+Italic
+Item
+ItemType
+Iteration
+KeyboardShortcut
+Keywords
+Label
+LastAuthor
+LastPrinted
+LastSaved
+Layout
+LayoutForm
+LayoutPageBreak
+LayoutSubtotalLocation
+LeafColumnMember
+LeafRowMember
+Left
+LeftCell
+LeftColumnRightPane
+LeftColumnVisible
+LeftToRight
+LengthLevelUniqueName
+Level
+LineStyle
+Lines
+LoadMode
+LocalConnection
+Location
+LocationOfComponents
+Macro
+MainFile
+Maintain
+MajorVersion
+Manager
+Map
+MapChildItems
+MapID
+MapInfo
+Mapdata
+Margin
+Max
+MaxChange
+MaxHeight
+MaxIterations
+MaxWidth
+Measure
+Member
+MemberExpand
+MemberFormat
+MemberName
+MemberPropertiesOrder
+MemberProperty
+MemberPropertyParent
+MergeAcross
+MergeDown
+MergeLabels
+Min
+MinorVersion
+Missing
+MissingItemsLimit
+Moper
+MoveAfterReturn
+Name
+NamedCell
+NamedRange
+Names
+Namespace
+NewAsync
+NewItemsHidden
+NextId
+NextSheetNumber
+NoAutoFit
+NoAutoFormatWidth
+NoAutoPage
+NoAutoRecover
+NoAutofit
+NoColumnGrand
+NoDetailAutoFit
+NoDisplayNullString
+NoDragToColumn
+NoDragToData
+NoDragToHide
+NoDragToPage
+NoDragToRow
+NoInserts
+NoPreserveFormatting
+NoPrintRepeatItems
+NoPrinterInfo
+NoRefreshCache
+NoRowGrand
+NoSaveData
+NoSummaryColumnsRightDetail
+NoSummaryRowsBelowDetail
+NoTextToColumns
+NoTitles
+NoToggleDataHeader
+NoViewCalculatedMembers
+NonDefaultName
+NotInverted
+NotVisible
+NullString
+Number
+NumberFormat
+NumberOfCopies
+OLEObject
+OWCVersion
+ObjectID
+OfficeDocumentSettings
+OleLink
+Operator
+OptimizeCache
+Orientation
+Outline
+OverwriteCells
+PLCaption
+PLDataOrientation
+PLExport
+PLGroupType
+PLName
+PLPivotField
+PLPosition
+PLSubtotal
+PLTPivotItem
+PLTotal
+PTFormat
+PTFormula
+PTLineItem
+PTLineItems
+PTPivotData
+PTRule
+PTSource
+PageBreakZoom
+PageBreaks
+PageFieldOrder
+PageFieldStyle
+PageFieldWrapCount
+PageMargins
+PageSetup
+Pages
+Pane
+Panes
+PaperSizeIndex
+Paragraphs
+Parameter
+ParameterType
+ParameterValue
+Parent
+ParentField
+ParentIsOther
+ParentName
+ParentUniqueName
+ParseFormulaAsV10
+ParseRuleAsV10
+PasteFormula
+PasteRefersTo
+Path
+Pattern
+PatternColor
+PivotAxis
+PivotCache
+PivotField
+PivotItem
+PivotTable
+PivotView
+Position
+PrecisionAsDisplayed
+PresentationFormat
+Print
+PrintErrors
+PrintSetTitles
+ProgID
+PromptString
+ProtectContents
+ProtectObjects
+ProtectScenarios
+ProtectStructure
+ProtectWindows
+Protected
+Protection
+Proxy
+PublishObject
+PublishObjects
+Purpose
+QTSource
+Qualifier
+Query97
+QuerySource
+QueryTable
+QueryType
+Range
+RangeSelection
+ReadOnly
+ReadingOrder
+RefModeR1C1
+Reference
+RefersTo
+RefreshDate
+RefreshDateCopy
+RefreshInfo
+RefreshName
+RefreshOnChange
+RefreshOnFileOpen
+RefreshTimeSpan
+RefreshedInXl9
+Resource
+Revision
+Right
+RightToLeft
+RobustConnect
+RootElement
+Rotate
+Rotation
+Row
+RowBreak
+RowBreaks
+RowColHeadings
+RowInputCell
+RowLast
+RowNumbers
+Rule
+RuleType
+RuleV10
+S
+SOAPAction
+SQLType
+Scale
+Schema
+SchemaID
+SchemaRef
+Selected
+SelectedSheets
+Selection
+SelectionNamespaces
+SemiColon
+SeqNum
+Sequence
+ServerBased
+ServerSortOrder
+Set
+Shadow
+ShapeID
+SheetIndex
+SheetName
+ShowAllItems
+ShowAlways
+ShowCellBackgroundFromOLAP
+ShowImportExportValidationErrors
+ShowPageBreakZoom
+ShowPageMultipleItemLabel
+ShowTotals
+ShrinkToFit
+Size
+SmallGrid
+SmartTagType
+SmartTags
+SolveOrder
+Sort
+SortKey
+SortOrder
+Sorting
+Source
+SourceConnectionFile
+SourceConsolidation
+SourceDataFile
+SourceHierarchy
+SourceHierarchyLevel
+SourceName
+SourceType
+Space
+SpaceAbove
+SpaceBelow
+Span
+SplitHorizontal
+SplitVertical
+SpreadsheetAutoFit
+StandardWidth
+StartPageNumber
+StartRow
+StrikeThrough
+Style
+StyleID
+Styles
+Sub
+SubType
+Subject
+Subtotal
+SubtotalFormat
+SubtotalHiddenPageItems
+SubtotalName
+Sup
+SupBook
+Synchronous
+Tab
+TabColorIndex
+TabRatio
+Table
+TableStyle
+Tag
+Text
+TextQualifier
+TextWizardSettings
+ThousandSeparator
+Ticked
+Title
+Toolbar
+TooltipInfo
+Top
+TopCell
+TopRowBottomPane
+TopRowVisible
+TotalAlignment
+TotalAllMembers
+TotalCaptionAlignment
+TotalFormat
+TotalTime
+TotalWidth
+TransitionExpressionEvaluation
+TransitionFormulaEntry
+Type
+U
+URLString
+Uncalced
+Underline
+UniqueName
+Unsynced
+UseBlank
+UseLocalConnection
+UseSameSettings
+User
+VMLFrame
+VacatedStyle
+ValidPrinterInfo
+Value
+Value1
+Value2
+Version
+VersionLastEdit
+VersionLastRefresh
+VersionLastUpdate
+VersionRefreshableMin
+VersionUpdateableMin
+Vertical
+VerticalAlign
+VerticalResolution
+VerticalText
+ViewableRange
+Visible
+VisualTotals
+WantAdvise
+WantPict
+Watch
+Watches
+WebPostString
+Weight
+Width
+WindowHeight
+WindowHidden
+WindowIconic
+WindowTopX
+WindowTopY
+WindowWidth
+Windows
+Words
+Workbook
+WorkbookOptions
+Worksheet
+WorksheetOptions
+WorksheetSource
+WrapText
+XPath
+XSDType
+Xct
+ZeroHeight
+Zoom
+accentbar
+adj
+adjusthandles
+alignshape
+allowincell
+allowoverlap
+alt
+althref
+angle
+arc
+arcsize
+arrowok
+aspect
+aspectratio
+attribute
+autorotationcenter
+backdepth
+background
+bilevel
+blacklevel
+borderbottomcolor
+borderleftcolor
+borderrightcolor
+bordertopcolor
+brightness
+bullet
+button
+bwmode
+bwnormal
+bwpure
+callout
+caption
+chromakey
+class
+clip
+color
+color2
+colormenu
+colormode
+colormru
+colors
+complex
+connectangles
+connectloc
+connectlocs
+connectortype
+connecttype
+content
+control1
+control2
+coordorigin
+coordsize
+cropbottom
+cropleft
+cropping
+cropright
+croptop
+curve
+dashstyle
+data
+datatype
+detectmouseclick
+diffusity
+displaycustomheaders
+distance
+doubleclicknotify
+drop
+dropauto
+dt
+edge
+editas
+embosscolor
+end
+endAngle
+endarrow
+endarrowlength
+endarrowwidth
+endcap
+entry
+eqn
+ext
+extends
+extrusion
+extrusioncolor
+extrusionok
+f
+facet
+fill
+fillcolor
+filled
+fillok
+filltype
+fitpath
+fitshape
+focus
+focusposition
+focussize
+forcedash
+foredepth
+formulas
+from
+gain
+gamma
+gap
+gradientshapeok
+grayscale
+group
+grouping
+h
+handles
+hidden
+how
+hr
+hralign
+href
+hrheight
+hrnoshade
+hrpct
+hrstd
+hrwidth
+id
+idmap
+idref
+image
+imagealignshape
+imageaspect
+imagedata
+imagesize
+inset
+insetmode
+invx
+invy
+joinstyle
+length
+lengthspecified
+lightface
+lightharsh
+lightharsh2
+lightlevel
+lightlevel2
+lightposition
+lightposition2
+limo
+line
+linestyle
+lock
+lockrotationcenter
+map
+master
+matrix
+maxLength
+metal
+method
+minusx
+minusy
+miterlimit
+movie
+name
+namespaceuri
+new
+obscured
+offset
+offset2
+old
+ole
+oleicon
+oleid
+on
+oned
+onmouseover
+opacity
+opacity2
+orientation
+orientationangle
+origin
+oval
+password
+path
+phonetictext
+plane
+points
+polar
+polyline
+position
+preferrelative
+print
+proxy
+r
+radiusrange
+rect
+regroupid
+regrouptable
+relativeposition
+render
+rotation
+rotationangle
+rotationcenter
+roundrect
+row
+ruleinitiator
+ruleproxy
+rules
+selection
+shadow
+shadowcolor
+shadowok
+shape
+shapedefaults
+shapelayout
+shapetype
+shininess
+singleclick
+size
+skew
+skewamt
+skewangle
+specularity
+spid
+spidmax
+spt
+src
+start
+startAngle
+startarrow
+startarrowlength
+startarrowwidth
+string
+stroke
+strokecolor
+stroked
+strokeok
+strokeweight
+style
+switch
+tablelimits
+tableproperties
+target
+targetscreensize
+text
+textborder
+textbox
+textboxrect
+textpath
+textpathok
+title
+to
+trim
+type
+url
+useExplicit
+userId
+userdrawn
+userhidden
+v
+verticies
+viewpoint
+viewpointorigin
+visible
+weight
+worksheetoptions
+wrapcoords
+xrange
+xscale
+yrange
diff --git a/missing b/missing
new file mode 100755
index 0000000..1fe1611
--- /dev/null
+++ b/missing
@@ -0,0 +1,215 @@
+#! /bin/sh
+# Common wrapper for a few potentially missing GNU programs.
+
+scriptversion=2018-03-07.03; # UTC
+
+# Copyright (C) 1996-2021 Free Software Foundation, Inc.
+# Originally written by Fran,cois Pinard <pinard@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 <https://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
+
+case $1 in
+
+ --is-lightweight)
+ # Used by our autoconf macros to check whether the available missing
+ # script is modern enough.
+ exit 0
+ ;;
+
+ --run)
+ # Back-compat with the calling convention used by older automake.
+ shift
+ ;;
+
+ -h|--h|--he|--hel|--help)
+ echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due
+to PROGRAM being missing or too old.
+
+Options:
+ -h, --help display this help and exit
+ -v, --version output version information and exit
+
+Supported PROGRAM values:
+ aclocal autoconf autoheader autom4te automake makeinfo
+ bison yacc flex lex help2man
+
+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@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
+
+# Run the given program, remember its exit status.
+"$@"; st=$?
+
+# If it succeeded, we are done.
+test $st -eq 0 && exit 0
+
+# Also exit now if we it failed (or wasn't found), and '--version' was
+# passed; such an option is passed most likely to detect whether the
+# program is present and works.
+case $2 in --version|--help) exit $st;; esac
+
+# Exit code 63 means version mismatch. This often happens when the user
+# tries to use an ancient version of a tool on a file that requires a
+# minimum version.
+if test $st -eq 63; then
+ msg="probably too old"
+elif test $st -eq 127; then
+ # Program was missing.
+ msg="missing on your system"
+else
+ # Program was found and executed, but failed. Give up.
+ exit $st
+fi
+
+perl_URL=https://www.perl.org/
+flex_URL=https://github.com/westes/flex
+gnu_software_URL=https://www.gnu.org/software
+
+program_details ()
+{
+ case $1 in
+ aclocal|automake)
+ echo "The '$1' program is part of the GNU Automake package:"
+ echo "<$gnu_software_URL/automake>"
+ echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:"
+ echo "<$gnu_software_URL/autoconf>"
+ echo "<$gnu_software_URL/m4/>"
+ echo "<$perl_URL>"
+ ;;
+ autoconf|autom4te|autoheader)
+ echo "The '$1' program is part of the GNU Autoconf package:"
+ echo "<$gnu_software_URL/autoconf/>"
+ echo "It also requires GNU m4 and Perl in order to run:"
+ echo "<$gnu_software_URL/m4/>"
+ echo "<$perl_URL>"
+ ;;
+ esac
+}
+
+give_advice ()
+{
+ # Normalize program name to check for.
+ normalized_program=`echo "$1" | sed '
+ s/^gnu-//; t
+ s/^gnu//; t
+ s/^g//; t'`
+
+ printf '%s\n' "'$1' is $msg."
+
+ configure_deps="'configure.ac' or m4 files included by 'configure.ac'"
+ case $normalized_program in
+ autoconf*)
+ echo "You should only need it if you modified 'configure.ac',"
+ echo "or m4 files included by it."
+ program_details 'autoconf'
+ ;;
+ autoheader*)
+ echo "You should only need it if you modified 'acconfig.h' or"
+ echo "$configure_deps."
+ program_details 'autoheader'
+ ;;
+ automake*)
+ echo "You should only need it if you modified 'Makefile.am' or"
+ echo "$configure_deps."
+ program_details 'automake'
+ ;;
+ aclocal*)
+ echo "You should only need it if you modified 'acinclude.m4' or"
+ echo "$configure_deps."
+ program_details 'aclocal'
+ ;;
+ autom4te*)
+ echo "You might have modified some maintainer files that require"
+ echo "the 'autom4te' program to be rebuilt."
+ program_details 'autom4te'
+ ;;
+ bison*|yacc*)
+ echo "You should only need it if you modified a '.y' file."
+ echo "You may want to install the GNU Bison package:"
+ echo "<$gnu_software_URL/bison/>"
+ ;;
+ lex*|flex*)
+ echo "You should only need it if you modified a '.l' file."
+ echo "You may want to install the Fast Lexical Analyzer package:"
+ echo "<$flex_URL>"
+ ;;
+ help2man*)
+ echo "You should only need it if you modified a dependency" \
+ "of a man page."
+ echo "You may want to install the GNU Help2man package:"
+ echo "<$gnu_software_URL/help2man/>"
+ ;;
+ makeinfo*)
+ echo "You should only need it if you modified a '.texi' file, or"
+ echo "any other file indirectly affecting the aspect of the manual."
+ echo "You might want to install the Texinfo package:"
+ echo "<$gnu_software_URL/texinfo/>"
+ echo "The spurious makeinfo call might also be the consequence of"
+ echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might"
+ echo "want to install GNU make:"
+ echo "<$gnu_software_URL/make/>"
+ ;;
+ *)
+ echo "You might have modified some files without having the proper"
+ echo "tools for further handling them. Check the 'README' file, it"
+ echo "often tells you about the needed prerequisites for installing"
+ echo "this package. You may also peek at any GNU archive site, in"
+ echo "case some other package contains this missing '$1' program."
+ ;;
+ esac
+}
+
+give_advice "$1" | sed -e '1s/^/WARNING: /' \
+ -e '2,$s/^/ /' >&2
+
+# Propagate the correct exit status (expected to be 127 for a program
+# not found, 63 for a program that failed due to version mismatch).
+exit $st
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/slickedit/cmake.vpj b/slickedit/cmake.vpj
new file mode 100644
index 0000000..65898bc
--- /dev/null
+++ b/slickedit/cmake.vpj
@@ -0,0 +1,106 @@
+<!DOCTYPE Project SYSTEM "http://www.slickedit.com/dtd/vse/10.0/vpj.dtd">
+<Project
+ Version="10.0"
+ VendorName="SlickEdit"
+ TemplateName="(Other)"
+ WorkingDir=".">
+ <Config
+ Name="Release"
+ OutputFile=""
+ CompilerConfigName="">
+ <Menu>
+ <Target
+ Name="Compile"
+ MenuCaption="&amp;Compile"
+ CaptureOutputWith="ProcessBuffer"
+ SaveOption="SaveCurrent"
+ RunFromDir="%rw">
+ <Exec/>
+ </Target>
+ <Target
+ Name="Build"
+ MenuCaption="&amp;Build"
+ CaptureOutputWith="ProcessBuffer"
+ SaveOption="SaveWorkspaceFiles"
+ RunFromDir="%rw">
+ <Exec/>
+ </Target>
+ <Target
+ Name="Rebuild"
+ MenuCaption="&amp;Rebuild"
+ CaptureOutputWith="ProcessBuffer"
+ SaveOption="SaveWorkspaceFiles"
+ RunFromDir="%rw">
+ <Exec/>
+ </Target>
+ <Target
+ Name="Debug"
+ MenuCaption="&amp;Debug"
+ SaveOption="SaveNone"
+ RunFromDir="%rw">
+ <Exec/>
+ </Target>
+ <Target
+ Name="Execute"
+ MenuCaption="E&amp;xecute"
+ SaveOption="SaveNone"
+ RunFromDir="%rw">
+ <Exec CmdLine='"cmake.exe"'/>
+ </Target>
+ </Menu>
+ </Config>
+ <CustomFolders>
+ <Folder
+ Name="Source Files"
+ Filters="*.c;*.C;*.cc;*.cpp;*.cp;*.cxx;*.c++;*.prg;*.pas;*.dpr;*.asm;*.s;*.bas;*.java;*.cs;*.sc;*.scala;*.e;*.cob;*.html;*.rc;*.tcl;*.py;*.pl;*.d;*.m;*.mm;*.go;*.groovy;*.gsh"
+ GUID="{B36B5047-1F53-4425-9E05-016BAD8947B9}"/>
+ <Folder
+ Name="Header Files"
+ Filters="*.h;*.H;*.hh;*.hpp;*.hxx;*.h++;*.inc;*.sh;*.cpy;*.if"
+ GUID="{C2ED2798-BE1E-41A1-B92A-EE092F0A30AC}"/>
+ <Folder
+ Name="Resource Files"
+ Filters="*.ico;*.cur;*.dlg"
+ GUID="{CDF06D54-CD2B-4D6B-2577-D79C09C1A38E}"/>
+ <Folder
+ Name="Bitmaps"
+ Filters="*.bmp"
+ GUID="{FE939B93-264B-4FA9-9E7D-752DEC8465AE}"/>
+ <Folder
+ Name="Other Files"
+ Filters=""
+ GUID="{48B76FDC-F021-4FEC-F274-6CD2FF24E3B4}"></Folder>
+ </CustomFolders>
+ <Files AutoFolders="DirectoryView">
+ <Folder Name="..">
+ <F N="../CMakeLists.txt"/>
+ </Folder>
+ <Folder Name="../include">
+ <Folder Name="orcus">
+ <Folder Name="detail">
+ <F N="../include/orcus/detail/CMakeLists.txt"/>
+ </Folder>
+ <Folder Name="mso">
+ <F N="../include/orcus/mso/CMakeLists.txt"/>
+ </Folder>
+ <Folder Name="spreadsheet">
+ <F N="../include/orcus/spreadsheet/CMakeLists.txt"/>
+ </Folder>
+ <F N="../include/orcus/CMakeLists.txt"/>
+ </Folder>
+ <F N="../include/CMakeLists.txt"/>
+ </Folder>
+ <Folder Name="../src">
+ <Folder Name="liborcus">
+ <F N="../src/liborcus/CMakeLists.txt"/>
+ </Folder>
+ <Folder Name="parser">
+ <F N="../src/parser/CMakeLists.txt"/>
+ </Folder>
+ <Folder Name="spreadsheet">
+ <F N="../src/spreadsheet/CMakeLists.txt"/>
+ </Folder>
+ <F N="../src/CMakeLists.txt"/>
+ </Folder>
+ </Files>
+</Project>
diff --git a/slickedit/cpp.vpj b/slickedit/cpp.vpj
new file mode 100644
index 0000000..ee3d7c3
--- /dev/null
+++ b/slickedit/cpp.vpj
@@ -0,0 +1,219 @@
+<!DOCTYPE Project SYSTEM "http://www.slickedit.com/dtd/vse/10.0/vpj.dtd">
+<Project
+ Version="10.0"
+ VendorName="SlickEdit"
+ TemplateName="Other C/C++"
+ WorkingDir="."
+ VCSProject="Git:">
+ <Config
+ Name="Debug"
+ Type="cpp"
+ DebugCallbackName="gdb"
+ OutputFile="%bdorcus"
+ CompilerConfigName="Latest Version">
+ <Menu>
+ <Target
+ Name="Compile"
+ MenuCaption="&amp;Compile"
+ CaptureOutputWith="ProcessBuffer"
+ OutputExts="*.o"
+ SaveOption="SaveCurrent"
+ RunFromDir="%rw">
+ <Exec CmdLine='cc -c -g %i %defd -o "%bd%n.o" "%f"'/>
+ </Target>
+ <Target
+ Name="Link"
+ MenuCaption="&amp;Link">
+ <Exec CmdLine='cc -g -o "%o" %f %libs'/>
+ </Target>
+ <Target
+ Name="Build"
+ MenuCaption="&amp;Build"
+ CaptureOutputWith="ProcessBuffer"
+ SaveOption="SaveWorkspaceFiles"
+ RunFromDir="%rw">
+ <Exec CmdLine='"%(VSLICKBIN1)vsbuild" build "%w" "%r"'/>
+ </Target>
+ <Target
+ Name="Rebuild"
+ MenuCaption="&amp;Rebuild"
+ CaptureOutputWith="ProcessBuffer"
+ SaveOption="SaveWorkspaceFiles"
+ RunFromDir="%rw">
+ <Exec CmdLine='"%(VSLICKBIN1)vsbuild" rebuild "%w" "%r"'/>
+ </Target>
+ <Target
+ Name="Debug"
+ MenuCaption="&amp;Debug"
+ SaveOption="SaveNone"
+ BuildFirst="1"
+ CaptureOutputWith="ProcessBuffer"
+ RunFromDir="%rw">
+ <Exec CmdLine='vsdebugio -prog "%o"'/>
+ </Target>
+ <Target
+ Name="Execute"
+ MenuCaption="E&amp;xecute"
+ SaveOption="SaveNone"
+ BuildFirst="1"
+ CaptureOutputWith="ProcessBuffer"
+ RunFromDir="%rw">
+ <Exec CmdLine='"%o"'/>
+ </Target>
+ </Menu>
+ </Config>
+ <Config
+ Name="Release"
+ Type="cpp"
+ DebugCallbackName="gdb"
+ OutputFile="%bdorcus"
+ CompilerConfigName="Latest Version">
+ <Menu>
+ <Target
+ Name="Compile"
+ MenuCaption="&amp;Compile"
+ CaptureOutputWith="ProcessBuffer"
+ SaveOption="SaveCurrent"
+ OutputExts="*.o"
+ RunFromDir="%rw">
+ <Exec CmdLine='cc -c -O %i %defd -o "%bd%n.o" "%f"'/>
+ </Target>
+ <Target
+ Name="Link"
+ MenuCaption="&amp;Link">
+ <Exec CmdLine='cc -O -o "%o" %f %libs'/>
+ </Target>
+ <Target
+ Name="Build"
+ MenuCaption="&amp;Build"
+ CaptureOutputWith="ProcessBuffer"
+ SaveOption="SaveWorkspaceFiles"
+ RunFromDir="%rw">
+ <Exec CmdLine='"%(VSLICKBIN1)vsbuild" build "%w" "%r"'/>
+ </Target>
+ <Target
+ Name="Rebuild"
+ MenuCaption="&amp;Rebuild"
+ CaptureOutputWith="ProcessBuffer"
+ SaveOption="SaveWorkspaceFiles"
+ RunFromDir="%rw">
+ <Exec CmdLine='"%(VSLICKBIN1)vsbuild" rebuild "%w" "%r"'/>
+ </Target>
+ <Target
+ Name="Debug"
+ MenuCaption="&amp;Debug"
+ SaveOption="SaveNone"
+ BuildFirst="1"
+ CaptureOutputWith="ProcessBuffer"
+ RunFromDir="%rw">
+ <Exec CmdLine='vsdebugio -prog "%o"'/>
+ </Target>
+ <Target
+ Name="Execute"
+ MenuCaption="E&amp;xecute"
+ SaveOption="SaveNone"
+ BuildFirst="1"
+ CaptureOutputWith="ProcessBuffer"
+ RunFromDir="%rw">
+ <Exec CmdLine='"%o"'/>
+ </Target>
+ </Menu>
+ </Config>
+ <Rules Name="Compile">
+ <Rule
+ InputExts="*.s"
+ OutputExts="*.o"
+ LinkObject="1">
+ <Exec CmdLine='as -o "%bd%n.o" "%f"'/>
+ </Rule>
+ </Rules>
+ <CustomFolders>
+ <Folder
+ Name="Source Files"
+ Filters="*.c;*.C;*.cc;*.cpp;*.cp;*.cxx;*.c++;*.prg;*.pas;*.dpr;*.asm;*.s;*.bas;*.java;*.cs;*.sc;*.e;*.cob;*.html;*.rc;*.tcl;*.py;*.pl;*.d"></Folder>
+ <Folder
+ Name="Header Files"
+ Filters="*.h;*.H;*.hh;*.hpp;*.hxx;*.inc;*.sh;*.cpy;*.if"></Folder>
+ <Folder
+ Name="Resource Files"
+ Filters="*.ico;*.cur;*.dlg"/>
+ <Folder
+ Name="Bitmaps"
+ Filters="*.bmp"/>
+ <Folder
+ Name="Other Files"
+ Filters=""></Folder>
+ </CustomFolders>
+ <List Name="RTE">
+ </List>
+ <Files AutoFolders="DirectoryView">
+ <Folder Name="../benchmark">
+ <F
+ N="../benchmark/*.cpp"
+ Recurse="1"
+ Excludes="*.tiff;*.tbz;*.pdb;*.avi;*.msi;*.cpgz;*.rpm;*.class;*.a;*.gif;*.taz;*.bin;*.jpg;*.svgz;*.exe;*.mp3;*.jar;*.ico;*.tif;*.txz;*.sl;*.png;*.jpeg;*.tar;*.Z;*.sta;*.xslx;*.gz;*.bz2;*.xz;*.mpeg;*.vpb;*.chm;*.dll;*.7z;*.lib;*.so;*.ex;*.tgz;*.war;*.vtg;*.docx;*.rar;*.o;*.wmv;*.cpio;*.zip;*.bmp;*.suo;*.xlsx;*.7zip;*.winmd;*.obj;*.z;*.tbz2;.svn/;.CVS/;SSCS/;.DS_Store;*.vpw;*.vpj;*.vpwhist;*.vpwhistu;*.vpwwildcardcache"
+ L="1"/>
+ <F
+ N="../benchmark/*.hpp"
+ Recurse="1"
+ Excludes="*.tiff;*.tbz;*.pdb;*.avi;*.msi;*.cpgz;*.rpm;*.class;*.a;*.gif;*.taz;*.bin;*.jpg;*.svgz;*.exe;*.mp3;*.jar;*.ico;*.tif;*.txz;*.sl;*.png;*.jpeg;*.tar;*.Z;*.sta;*.xslx;*.gz;*.bz2;*.xz;*.mpeg;*.vpb;*.chm;*.dll;*.7z;*.lib;*.so;*.ex;*.tgz;*.war;*.vtg;*.docx;*.rar;*.o;*.wmv;*.cpio;*.zip;*.bmp;*.suo;*.xlsx;*.7zip;*.winmd;*.obj;*.z;*.tbz2;.svn/;.CVS/;SSCS/;.DS_Store;*.vpw;*.vpj;*.vpwhist;*.vpwhistu;*.vpwwildcardcache"
+ L="1"/>
+ <F
+ N="../benchmark/*.inl"
+ Recurse="1"
+ Excludes="*.tiff;*.tbz;*.pdb;*.avi;*.msi;*.cpgz;*.rpm;*.class;*.a;*.gif;*.taz;*.bin;*.jpg;*.svgz;*.exe;*.mp3;*.jar;*.ico;*.tif;*.txz;*.sl;*.png;*.jpeg;*.tar;*.Z;*.sta;*.xslx;*.gz;*.bz2;*.xz;*.mpeg;*.vpb;*.chm;*.dll;*.7z;*.lib;*.so;*.ex;*.tgz;*.war;*.vtg;*.docx;*.rar;*.o;*.wmv;*.cpio;*.zip;*.bmp;*.suo;*.xlsx;*.7zip;*.winmd;*.obj;*.z;*.tbz2;.svn/;.CVS/;SSCS/;.DS_Store;*.vpw;*.vpj;*.vpwhist;*.vpwhistu;*.vpwwildcardcache"
+ L="1"/>
+ </Folder>
+ <Folder Name="../doc_example">
+ <F
+ N="../doc_example/*.cpp"
+ Recurse="1"
+ Excludes="*.tiff;*.tbz;*.pdb;*.avi;*.msi;*.cpgz;*.rpm;*.class;*.a;*.gif;*.taz;*.bin;*.jpg;*.svgz;*.exe;*.mp3;*.jar;*.ico;*.tif;*.txz;*.sl;*.png;*.jpeg;*.tar;*.Z;*.sta;*.xslx;*.gz;*.bz2;*.xz;*.mpeg;*.vpb;*.chm;*.dll;*.7z;*.lib;*.so;*.ex;*.tgz;*.war;*.vtg;*.docx;*.rar;*.o;*.wmv;*.cpio;*.zip;*.bmp;*.suo;*.xlsx;*.7zip;*.winmd;*.obj;*.z;*.tbz2;.svn/;.CVS/;SSCS/;.DS_Store;*.vpw;*.vpj;*.vpwhist;*.vpwhistu;*.vpwwildcardcache"
+ L="1"/>
+ <F
+ N="../doc_example/*.hpp"
+ Recurse="1"
+ Excludes="*.tiff;*.tbz;*.pdb;*.avi;*.msi;*.cpgz;*.rpm;*.class;*.a;*.gif;*.taz;*.bin;*.jpg;*.svgz;*.exe;*.mp3;*.jar;*.ico;*.tif;*.txz;*.sl;*.png;*.jpeg;*.tar;*.Z;*.sta;*.xslx;*.gz;*.bz2;*.xz;*.mpeg;*.vpb;*.chm;*.dll;*.7z;*.lib;*.so;*.ex;*.tgz;*.war;*.vtg;*.docx;*.rar;*.o;*.wmv;*.cpio;*.zip;*.bmp;*.suo;*.xlsx;*.7zip;*.winmd;*.obj;*.z;*.tbz2;.svn/;.CVS/;SSCS/;.DS_Store;*.vpw;*.vpj;*.vpwhist;*.vpwhistu;*.vpwwildcardcache"
+ L="1"/>
+ <F
+ N="../doc_example/*.inl"
+ Recurse="1"
+ Excludes="*.tiff;*.tbz;*.pdb;*.avi;*.msi;*.cpgz;*.rpm;*.class;*.a;*.gif;*.taz;*.bin;*.jpg;*.svgz;*.exe;*.mp3;*.jar;*.ico;*.tif;*.txz;*.sl;*.png;*.jpeg;*.tar;*.Z;*.sta;*.xslx;*.gz;*.bz2;*.xz;*.mpeg;*.vpb;*.chm;*.dll;*.7z;*.lib;*.so;*.ex;*.tgz;*.war;*.vtg;*.docx;*.rar;*.o;*.wmv;*.cpio;*.zip;*.bmp;*.suo;*.xlsx;*.7zip;*.winmd;*.obj;*.z;*.tbz2;.svn/;.CVS/;SSCS/;.DS_Store;*.vpw;*.vpj;*.vpwhist;*.vpwhistu;*.vpwwildcardcache"
+ L="1"/>
+ </Folder>
+ <Folder Name="../include">
+ <F
+ N="../include/*.cpp"
+ Recurse="1"
+ Excludes="*.tiff;*.tbz;*.pdb;*.avi;*.msi;*.cpgz;*.rpm;*.class;*.a;*.gif;*.taz;*.bin;*.jpg;*.svgz;*.exe;*.mp3;*.jar;*.ico;*.tif;*.txz;*.sl;*.png;*.jpeg;*.tar;*.Z;*.sta;*.xslx;*.gz;*.bz2;*.xz;*.mpeg;*.vpb;*.chm;*.dll;*.7z;*.lib;*.so;*.ex;*.tgz;*.war;*.vtg;*.docx;*.rar;*.o;*.wmv;*.cpio;*.zip;*.bmp;*.suo;*.xlsx;*.7zip;*.winmd;*.obj;*.z;*.tbz2;.svn/;.CVS/;SSCS/;.DS_Store;*.vpw;*.vpj;*.vpwhist;*.vpwhistu;*.vpwwildcardcache"
+ L="1"/>
+ <F
+ N="../include/*.hpp"
+ Recurse="1"
+ Excludes="*.tiff;*.tbz;*.pdb;*.avi;*.msi;*.cpgz;*.rpm;*.class;*.a;*.gif;*.taz;*.bin;*.jpg;*.svgz;*.exe;*.mp3;*.jar;*.ico;*.tif;*.txz;*.sl;*.png;*.jpeg;*.tar;*.Z;*.sta;*.xslx;*.gz;*.bz2;*.xz;*.mpeg;*.vpb;*.chm;*.dll;*.7z;*.lib;*.so;*.ex;*.tgz;*.war;*.vtg;*.docx;*.rar;*.o;*.wmv;*.cpio;*.zip;*.bmp;*.suo;*.xlsx;*.7zip;*.winmd;*.obj;*.z;*.tbz2;.svn/;.CVS/;SSCS/;.DS_Store;*.vpw;*.vpj;*.vpwhist;*.vpwhistu;*.vpwwildcardcache"
+ L="1"/>
+ <F
+ N="../include/*.inl"
+ Recurse="1"
+ Excludes="*.tiff;*.tbz;*.pdb;*.avi;*.msi;*.cpgz;*.rpm;*.class;*.a;*.gif;*.taz;*.bin;*.jpg;*.svgz;*.exe;*.mp3;*.jar;*.ico;*.tif;*.txz;*.sl;*.png;*.jpeg;*.tar;*.Z;*.sta;*.xslx;*.gz;*.bz2;*.xz;*.mpeg;*.vpb;*.chm;*.dll;*.7z;*.lib;*.so;*.ex;*.tgz;*.war;*.vtg;*.docx;*.rar;*.o;*.wmv;*.cpio;*.zip;*.bmp;*.suo;*.xlsx;*.7zip;*.winmd;*.obj;*.z;*.tbz2;.svn/;.CVS/;SSCS/;.DS_Store;*.vpw;*.vpj;*.vpwhist;*.vpwhistu;*.vpwwildcardcache"
+ L="1"/>
+ </Folder>
+ <Folder Name="../src">
+ <F
+ N="../src/*.cpp"
+ Recurse="1"
+ Excludes="*.tiff;*.tbz;*.pdb;*.avi;*.msi;*.cpgz;*.rpm;*.class;*.a;*.gif;*.taz;*.bin;*.jpg;*.svgz;*.exe;*.mp3;*.jar;*.ico;*.tif;*.txz;*.sl;*.png;*.jpeg;*.tar;*.Z;*.sta;*.xslx;*.gz;*.bz2;*.xz;*.mpeg;*.vpb;*.chm;*.dll;*.7z;*.lib;*.so;*.ex;*.tgz;*.war;*.vtg;*.docx;*.rar;*.o;*.wmv;*.cpio;*.zip;*.bmp;*.suo;*.xlsx;*.7zip;*.winmd;*.obj;*.z;*.tbz2;.svn/;.CVS/;SSCS/;.DS_Store;*.vpw;*.vpj;*.vpwhist;*.vpwhistu;*.vpwwildcardcache"
+ L="1"/>
+ <F
+ N="../src/*.hpp"
+ Recurse="1"
+ Excludes="*.tiff;*.tbz;*.pdb;*.avi;*.msi;*.cpgz;*.rpm;*.class;*.a;*.gif;*.taz;*.bin;*.jpg;*.svgz;*.exe;*.mp3;*.jar;*.ico;*.tif;*.txz;*.sl;*.png;*.jpeg;*.tar;*.Z;*.sta;*.xslx;*.gz;*.bz2;*.xz;*.mpeg;*.vpb;*.chm;*.dll;*.7z;*.lib;*.so;*.ex;*.tgz;*.war;*.vtg;*.docx;*.rar;*.o;*.wmv;*.cpio;*.zip;*.bmp;*.suo;*.xlsx;*.7zip;*.winmd;*.obj;*.z;*.tbz2;.svn/;.CVS/;SSCS/;.DS_Store;*.vpw;*.vpj;*.vpwhist;*.vpwhistu;*.vpwwildcardcache"
+ L="1"/>
+ <F
+ N="../src/*.inl"
+ Recurse="1"
+ Excludes="*.tiff;*.tbz;*.pdb;*.avi;*.msi;*.cpgz;*.rpm;*.class;*.a;*.gif;*.taz;*.bin;*.jpg;*.svgz;*.exe;*.mp3;*.jar;*.ico;*.tif;*.txz;*.sl;*.png;*.jpeg;*.tar;*.Z;*.sta;*.xslx;*.gz;*.bz2;*.xz;*.mpeg;*.vpb;*.chm;*.dll;*.7z;*.lib;*.so;*.ex;*.tgz;*.war;*.vtg;*.docx;*.rar;*.o;*.wmv;*.cpio;*.zip;*.bmp;*.suo;*.xlsx;*.7zip;*.winmd;*.obj;*.z;*.tbz2;.svn/;.CVS/;SSCS/;.DS_Store;*.vpw;*.vpj;*.vpwhist;*.vpwhistu;*.vpwwildcardcache"
+ L="1"/>
+ </Folder>
+ </Files>
+</Project>
diff --git a/slickedit/doc.vpj b/slickedit/doc.vpj
new file mode 100644
index 0000000..0486dff
--- /dev/null
+++ b/slickedit/doc.vpj
@@ -0,0 +1,80 @@
+<!DOCTYPE Project SYSTEM "http://www.slickedit.com/dtd/vse/10.0/vpj.dtd">
+<Project
+ Version="10.0"
+ VendorName="SlickEdit"
+ TemplateName="(Other)"
+ WorkingDir=".">
+ <Config
+ Name="Release"
+ OutputFile=""
+ CompilerConfigName="">
+ <Menu>
+ <Target
+ Name="Compile"
+ MenuCaption="&amp;Compile"
+ CaptureOutputWith="ProcessBuffer"
+ SaveOption="SaveCurrent"
+ RunFromDir="%rw">
+ <Exec/>
+ </Target>
+ <Target
+ Name="Build"
+ MenuCaption="&amp;Build"
+ CaptureOutputWith="ProcessBuffer"
+ SaveOption="SaveWorkspaceFiles"
+ RunFromDir="%rw">
+ <Exec/>
+ </Target>
+ <Target
+ Name="Rebuild"
+ MenuCaption="&amp;Rebuild"
+ CaptureOutputWith="ProcessBuffer"
+ SaveOption="SaveWorkspaceFiles"
+ RunFromDir="%rw">
+ <Exec/>
+ </Target>
+ <Target
+ Name="Debug"
+ MenuCaption="&amp;Debug"
+ SaveOption="SaveNone"
+ RunFromDir="%rw">
+ <Exec/>
+ </Target>
+ <Target
+ Name="Execute"
+ MenuCaption="E&amp;xecute"
+ SaveOption="SaveNone"
+ RunFromDir="%rw">
+ <Exec CmdLine='"doc.exe"'/>
+ </Target>
+ </Menu>
+ </Config>
+ <Files>
+ <Folder
+ Name="Source Files"
+ Filters="*.c;*.C;*.cc;*.cpp;*.cp;*.cxx;*.c++;*.prg;*.pas;*.dpr;*.asm;*.s;*.bas;*.java;*.cs;*.sc;*.scala;*.e;*.cob;*.html;*.rc;*.tcl;*.py;*.pl;*.d;*.m;*.mm;*.go;*.groovy;*.gsh"
+ GUID="{68BE7230-826B-4DB0-BA1E-88414412F173}"/>
+ <Folder
+ Name="Header Files"
+ Filters="*.h;*.H;*.hh;*.hpp;*.hxx;*.h++;*.inc;*.sh;*.cpy;*.if"
+ GUID="{A72B7A0D-11D9-44BA-A3E6-B814DD8957AE}"/>
+ <Folder
+ Name="Resource Files"
+ Filters="*.ico;*.cur;*.dlg"
+ GUID="{EE4C9BB3-126C-4E0C-9DE5-3D1D9A440B1E}"/>
+ <Folder
+ Name="Bitmaps"
+ Filters="*.bmp"
+ GUID="{C028E24C-195E-4D79-B82E-A9904D8D4640}"/>
+ <Folder
+ Name="Other Files"
+ Filters=""
+ GUID="{58BF30C7-CBF2-4454-ABD3-F8D694316022}">
+ <F
+ N="../doc/*.rst"
+ Recurse="1"/>
+ </Folder>
+ </Files>
+ <List Name="RTE">
+ </List>
+</Project>
diff --git a/slickedit/orcus.vpw b/slickedit/orcus.vpw
new file mode 100644
index 0000000..27afa43
--- /dev/null
+++ b/slickedit/orcus.vpw
@@ -0,0 +1,11 @@
+<!DOCTYPE Workspace SYSTEM "http://www.slickedit.com/dtd/vse/10.0/vpw.dtd">
+<Workspace Version="10.0" VendorName="SlickEdit">
+ <Projects>
+ <Project File="cmake.vpj"/>
+ <Project File="cpp.vpj"/>
+ <Project File="doc.vpj"/>
+ <Project File="python.vpj"/>
+ <Project File="sh.vpj"/>
+ <Project File="token-gen.vpj"/>
+ </Projects>
+</Workspace>
diff --git a/slickedit/orcus_cpp.h b/slickedit/orcus_cpp.h
new file mode 100644
index 0000000..5792705
--- /dev/null
+++ b/slickedit/orcus_cpp.h
@@ -0,0 +1,8 @@
+#define IXION_DLLPUBLIC
+
+#define ORCUS_DLLPUBLIC
+
+#define ORCUS_PSR_DLLPUBLIC
+
+#define ORCUS_SPM_DLLPUBLIC
+
diff --git a/slickedit/python.vpj b/slickedit/python.vpj
new file mode 100644
index 0000000..c4a89f0
--- /dev/null
+++ b/slickedit/python.vpj
@@ -0,0 +1,97 @@
+<!DOCTYPE Project SYSTEM "http://www.slickedit.com/dtd/vse/10.0/vpj.dtd">
+<Project
+ Version="10.0"
+ VendorName="SlickEdit"
+ TemplateName="(Other)"
+ WorkingDir=".">
+ <Config
+ Name="Release"
+ OutputFile=""
+ CompilerConfigName="">
+ <Menu>
+ <Target
+ Name="Compile"
+ MenuCaption="&amp;Compile"
+ CaptureOutputWith="ProcessBuffer"
+ SaveOption="SaveCurrent"
+ RunFromDir="%rw">
+ <Exec/>
+ </Target>
+ <Target
+ Name="Build"
+ MenuCaption="&amp;Build"
+ CaptureOutputWith="ProcessBuffer"
+ SaveOption="SaveWorkspaceFiles"
+ RunFromDir="%rw">
+ <Exec/>
+ </Target>
+ <Target
+ Name="Rebuild"
+ MenuCaption="&amp;Rebuild"
+ CaptureOutputWith="ProcessBuffer"
+ SaveOption="SaveWorkspaceFiles"
+ RunFromDir="%rw">
+ <Exec/>
+ </Target>
+ <Target
+ Name="Debug"
+ MenuCaption="&amp;Debug"
+ SaveOption="SaveNone"
+ RunFromDir="%rw">
+ <Exec/>
+ </Target>
+ <Target
+ Name="Execute"
+ MenuCaption="E&amp;xecute"
+ SaveOption="SaveNone"
+ RunFromDir="%rw">
+ <Exec CmdLine='"python.exe"'/>
+ </Target>
+ </Menu>
+ </Config>
+ <Files>
+ <Folder
+ Name="Source Files"
+ Filters="*.c;*.C;*.cc;*.cpp;*.cp;*.cxx;*.c++;*.prg;*.pas;*.dpr;*.asm;*.s;*.bas;*.java;*.cs;*.sc;*.scala;*.e;*.cob;*.html;*.rc;*.tcl;*.py;*.pl;*.d;*.m;*.mm;*.go;*.groovy;*.gsh"
+ GUID="{F5A8F7E8-3CA5-495A-9013-3B118350F9DE}">
+ <F N="../src/python/orcus/__init__.py"/>
+ <F N="../src/python/orcus/tools/__init__.py"/>
+ <F N="../src/python/orcus/tools/bugzilla.py"/>
+ <F N="../src/python/orcus/csv.py"/>
+ <F N="../test/python/file_load_common.py"/>
+ <F N="../src/python/orcus/tools/file_processor.py"/>
+ <F N="../src/python/orcus/gnumeric.py"/>
+ <F N="../src/python/orcus/json.py"/>
+ <F N="../src/python/orcus/ods.py"/>
+ <F N="../misc/file-processor-modules/preview.py"/>
+ <F N="../test/python/test_csv.py"/>
+ <F N="../test/python/test_csv_export.py"/>
+ <F N="../test/python/test_gnumeric.py"/>
+ <F N="../test/python/test_json.py"/>
+ <F N="../test/python/test_module.py"/>
+ <F N="../test/python/test_ods.py"/>
+ <F N="../test/python/test_xls_xml.py"/>
+ <F N="../test/python/test_xlsx.py"/>
+ <F N="../src/python/orcus/xls_xml.py"/>
+ <F N="../src/python/orcus/xlsx.py"/>
+ </Folder>
+ <Folder
+ Name="Header Files"
+ Filters="*.h;*.H;*.hh;*.hpp;*.hxx;*.h++;*.inc;*.sh;*.cpy;*.if"
+ GUID="{07C64958-611E-4D92-9D8B-0FA102D25070}"/>
+ <Folder
+ Name="Resource Files"
+ Filters="*.ico;*.cur;*.dlg"
+ GUID="{13BD4747-B0B1-44E3-A4D9-64773F8FCBE7}"/>
+ <Folder
+ Name="Bitmaps"
+ Filters="*.bmp"
+ GUID="{832B5267-B704-4B1A-B3A1-385517302913}"/>
+ <Folder
+ Name="Other Files"
+ Filters=""
+ GUID="{9E10DE22-363A-4DC3-9212-A71DA6800CDB}"/>
+ </Files>
+ <List Name="RTE">
+ </List>
+</Project>
diff --git a/slickedit/sh.vpj b/slickedit/sh.vpj
new file mode 100644
index 0000000..32881fe
--- /dev/null
+++ b/slickedit/sh.vpj
@@ -0,0 +1,82 @@
+<!DOCTYPE Project SYSTEM "http://www.slickedit.com/dtd/vse/10.0/vpj.dtd">
+<Project
+ Version="10.0"
+ VendorName="SlickEdit"
+ TemplateName="(Other)"
+ WorkingDir=".">
+ <Config
+ Name="Release"
+ OutputFile=""
+ CompilerConfigName="">
+ <Menu>
+ <Target
+ Name="Compile"
+ MenuCaption="&amp;Compile"
+ CaptureOutputWith="ProcessBuffer"
+ SaveOption="SaveCurrent"
+ RunFromDir="%rw">
+ <Exec/>
+ </Target>
+ <Target
+ Name="Build"
+ MenuCaption="&amp;Build"
+ CaptureOutputWith="ProcessBuffer"
+ SaveOption="SaveWorkspaceFiles"
+ RunFromDir="%rw">
+ <Exec/>
+ </Target>
+ <Target
+ Name="Rebuild"
+ MenuCaption="&amp;Rebuild"
+ CaptureOutputWith="ProcessBuffer"
+ SaveOption="SaveWorkspaceFiles"
+ RunFromDir="%rw">
+ <Exec/>
+ </Target>
+ <Target
+ Name="Debug"
+ MenuCaption="&amp;Debug"
+ SaveOption="SaveNone"
+ RunFromDir="%rw">
+ <Exec/>
+ </Target>
+ <Target
+ Name="Execute"
+ MenuCaption="E&amp;xecute"
+ SaveOption="SaveNone"
+ RunFromDir="%rw">
+ <Exec CmdLine='"sh.exe"'/>
+ </Target>
+ </Menu>
+ </Config>
+ <CustomFolders>
+ <Folder
+ Name="Source Files"
+ Filters="*.c;*.C;*.cc;*.cpp;*.cp;*.cxx;*.c++;*.prg;*.pas;*.dpr;*.asm;*.s;*.bas;*.java;*.cs;*.sc;*.scala;*.e;*.cob;*.html;*.rc;*.tcl;*.py;*.pl;*.d;*.m;*.mm;*.go;*.groovy;*.gsh"
+ GUID="{871B3C7A-5835-4B89-941B-A3A00BE4B4F9}"/>
+ <Folder
+ Name="Header Files"
+ Filters="*.h;*.H;*.hh;*.hpp;*.hxx;*.h++;*.inc;*.sh;*.cpy;*.if"
+ GUID="{BE3A4AE3-BB06-40A5-BF18-E7C00AC43BB4}"></Folder>
+ <Folder
+ Name="Resource Files"
+ Filters="*.ico;*.cur;*.dlg"
+ GUID="{3037F078-C30B-4946-9281-F27299396157}"/>
+ <Folder
+ Name="Bitmaps"
+ Filters="*.bmp"
+ GUID="{A99BD58B-508E-4FE8-9D44-3519E2F4242D}"/>
+ <Folder
+ Name="Other Files"
+ Filters=""
+ GUID="{F5391F55-9E73-48D2-92B4-957A6CE89D94}"/>
+ </CustomFolders>
+ <Files AutoFolders="DirectoryView">
+ <Folder Name="../bin">
+ <F N="../bin/env-osx.sh"/>
+ <F N="../bin/gen-test-json-structure-outputs.sh"/>
+ <F N="../bin/run-python.sh"/>
+ <F N="../bin/unpack-zipped-xml.sh"/>
+ </Folder>
+ </Files>
+</Project>
diff --git a/slickedit/token-gen.vpj b/slickedit/token-gen.vpj
new file mode 100644
index 0000000..10ef4c8
--- /dev/null
+++ b/slickedit/token-gen.vpj
@@ -0,0 +1,87 @@
+<!DOCTYPE Project SYSTEM "http://www.slickedit.com/dtd/vse/10.0/vpj.dtd">
+<Project
+ Version="10.0"
+ VendorName="SlickEdit"
+ TemplateName="Python - Empty Project"
+ WorkingDir=".">
+ <CustomFolders>
+ <Folder
+ Name="Source Files"
+ Filters="*.py"></Folder>
+ <Folder
+ Name="Other Files"
+ Filters=""/>
+ </CustomFolders>
+ <Config
+ Name="Debug"
+ DebugCallbackName="pydbgp"
+ Type="python"
+ OutputFile=""
+ AppType="python"
+ CompilerConfigName="">
+ <Menu>
+ <Target
+ Name="Execute"
+ MenuCaption="E&amp;xecute"
+ Dialog="_python_options_form Run"
+ CaptureOutputWith="ProcessBuffer"
+ SaveOption="SaveNone"
+ RunFromDir="%rw"
+ Deletable="0">
+ <Exec CmdLine='python %(SLICKEDIT_PYTHON_EXECUTE_ARGS) "%f"'/>
+ </Target>
+ <Target
+ Name="Debug"
+ MenuCaption="&amp;Debug"
+ Dialog="_python_options_form Debug"
+ CaptureOutputWith="ProcessBuffer"
+ SaveOption="SaveNone"
+ RunFromDir="%rw"
+ Deletable="0">
+ <Exec
+ CmdLine="python_debug"
+ Type="Slick-C"/>
+ </Target>
+ <Target
+ Name="Python Options"
+ MenuCaption="Python &amp;Options"
+ ShowOnMenu="HideIfNoCmdLine"
+ Deletable="0">
+ <Exec
+ CmdLine="pythonoptions"
+ Type="Slick-C"/>
+ </Target>
+ </Menu>
+ <List Name="Python Options">
+ <Item
+ Name="DefaultFile"
+ Value=""/>
+ </List>
+ <List Name="pydbgp Options">
+ <Item
+ Name="ServerHost"
+ Value="127.0.0.1"/>
+ <Item
+ Name="ServerPort"
+ Value="0"/>
+ <Item
+ Name="ListenInBackground"
+ Value="1"/>
+ <Item
+ Name="show_hidden"
+ Value="0"/>
+ </List>
+ </Config>
+ <Files AutoFolders="DirectoryView">
+ <Folder Name="../misc">
+ <Folder Name="xml-tokens">
+ <F N="../misc/xml-tokens/dump-xsd-keys.py"/>
+ <F N="../misc/xml-tokens/gen-gnumeric-tokens.py"/>
+ <F N="../misc/xml-tokens/gen-odf-tokens.py"/>
+ <F N="../misc/xml-tokens/gen-ooxml-tokens.py"/>
+ <F N="../misc/xml-tokens/gen-tokens.py"/>
+ <F N="../misc/xml-tokens/token_util.py"/>
+ </Folder>
+ </Folder>
+ </Files>
+</Project>
diff --git a/src/Makefile.am b/src/Makefile.am
new file mode 100644
index 0000000..4e47d44
--- /dev/null
+++ b/src/Makefile.am
@@ -0,0 +1,721 @@
+SUBDIRS = include test parser mso liborcus spreadsheet
+
+if BUILD_PYTHON
+SUBDIRS += python
+endif
+
+AM_CPPFLAGS = \
+ -I$(top_srcdir)/include \
+ -I$(top_srcdir)/src/include
+
+bin_PROGRAMS =
+
+EXTRA_PROGRAMS = \
+ orcus-test-xml \
+ orcus-env-dump
+
+AM_CPPFLAGS += $(BOOST_CPPFLAGS) $(LIBIXION_CFLAGS)
+
+if HAVE_FILESYSTEM
+AM_CPPFLAGS += "-DHAVE_FILESYSTEM=1"
+endif
+
+if HAVE_EXPERIMENTAL_FILESYSTEM
+AM_CPPFLAGS += "-DHAVE_EXPERIMENTAL_FILESYSTEM=1"
+endif
+
+if HAVE_STATIC_LIB
+AM_CPPFLAGS += -D__ORCUS_STATIC_LIB=1
+endif
+
+# orcus-test-xml
+
+orcus_test_xml_SOURCES = orcus_test_xml.cpp
+orcus_test_xml_LDADD = \
+ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ liborcus/liborcus-@ORCUS_API_VERSION@.la
+
+orcus_test_xml_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS) -DSRCDIR=\""$(top_srcdir)"\"
+
+# orcus-env-dump
+
+orcus_env_dump_SOURCES = orcus_env_dump.cpp
+orcus_env_dump_LDADD = \
+ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ liborcus/liborcus-@ORCUS_API_VERSION@.la
+orcus_env_dump_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+
+TESTS = \
+ orcus-test-xml \
+ orcus-env-dump
+
+if WITH_TOOLS
+
+bin_PROGRAMS += \
+ orcus-css-dump \
+ orcus-zip-dump \
+ orcus-mso-encryption \
+ orcus-detect \
+ orcus-json \
+ orcus-yaml
+
+# orcus-css-dump
+
+orcus_css_dump_SOURCES = \
+ orcus_css_dump.cpp
+
+orcus_css_dump_LDADD = \
+ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ liborcus/liborcus-@ORCUS_API_VERSION@.la
+
+orcus_css_dump_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+
+# orcus-zip-dump
+
+orcus_zip_dump_SOURCES = \
+ orcus_zip_dump.cpp
+
+orcus_zip_dump_LDADD = \
+ parser/liborcus-parser-@ORCUS_API_VERSION@.la
+
+orcus_zip_dump_CPPFLAGS = $(AM_CPPFLAGS)
+
+# orcus-json
+
+orcus_json_SOURCES = \
+ orcus_json_cli.hpp \
+ orcus_json_cli.cpp \
+ cli_global.hpp \
+ cli_global.cpp \
+ orcus_json_cli_map.cpp
+
+orcus_json_LDFLAGS = \
+ $(BOOST_PROGRAM_OPTIONS_LDFLAGS) \
+ $(BOOST_SYSTEM_LDFLAGS)
+
+orcus_json_LDADD = \
+ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ liborcus/liborcus-@ORCUS_API_VERSION@.la \
+ $(BOOST_PROGRAM_OPTIONS_LIBS) \
+ $(BOOST_SYSTEM_LIBS)
+
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+orcus_json_LDADD += -lstdc++fs
+else
+orcus_json_LDFLAGS += $(BOOST_FILESYSTEM_LDFLAGS)
+orcus_json_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
+orcus_json_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+
+# orcus-yaml
+
+orcus_yaml_SOURCES = \
+ orcus_yaml_main.cpp
+
+orcus_yaml_LDFLAGS = \
+ $(BOOST_PROGRAM_OPTIONS_LDFLAGS) \
+ $(BOOST_SYSTEM_LDFLAGS)
+
+orcus_yaml_LDADD = \
+ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ liborcus/liborcus-@ORCUS_API_VERSION@.la \
+ $(BOOST_PROGRAM_OPTIONS_LIBS) \
+ $(BOOST_SYSTEM_LIBS)
+
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+orcus_yaml_LDADD += -lstdc++fs
+else
+orcus_yaml_LDFLAGS += $(BOOST_FILESYSTEM_LDFLAGS)
+orcus_yaml_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
+orcus_yaml_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+
+#----------------------------------------------------------------------------
+
+# orcus-mso-encryption
+
+orcus_mso_encryption_SOURCES = orcus_mso_encryption.cpp
+orcus_mso_encryption_LDFLAGS = $(BOOST_SYSTEM_LDFLAGS)
+orcus_mso_encryption_LDADD = \
+ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ mso/liborcus-mso-@ORCUS_API_VERSION@.la \
+ $(BOOST_SYSTEM_LIBS)
+
+orcus_mso_encryption_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+
+#----------------------------------------------------------------------------
+
+# orcus-detect
+
+orcus_detect_SOURCES = orcus_detect_main.cpp
+orcus_detect_LDFLAGS = \
+ $(BOOST_PROGRAM_OPTIONS_LDFLAGS) \
+ $(BOOST_SYSTEM_LDFLAGS)
+orcus_detect_LDADD = \
+ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ liborcus/liborcus-@ORCUS_API_VERSION@.la \
+ $(BOOST_PROGRAM_OPTIONS_LIBS) \
+ $(BOOST_SYSTEM_LIBS)
+
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+orcus_detect_LDADD += -lstdc++fs
+else
+orcus_detect_LDFLAGS += $(BOOST_FILESYSTEM_LDFLAGS)
+orcus_detect_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
+orcus_detect_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+
+#----------------------------------------------------------------------------
+
+if BUILD_SPREADSHEET_MODEL
+
+orcus_json_LDADD += \
+ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la
+
+bin_PROGRAMS += \
+ orcus-csv orcus-xml
+
+# orcus-csv
+
+orcus_csv_SOURCES = \
+ orcus_filter_global.hpp \
+ orcus_filter_global.cpp \
+ orcus_csv_main.cpp
+
+orcus_csv_LDFLAGS = \
+ $(BOOST_PROGRAM_OPTIONS_LDFLAGS) \
+ $(BOOST_SYSTEM_LDFLAGS)
+orcus_csv_LDADD = \
+ liborcus/liborcus-@ORCUS_API_VERSION@.la \
+ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+ $(BOOST_PROGRAM_OPTIONS_LIBS) \
+ $(BOOST_SYSTEM_LIBS)
+
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+orcus_csv_LDADD += -lstdc++fs
+else
+orcus_csv_LDFLAGS += $(BOOST_FILESYSTEM_LDFLAGS)
+orcus_csv_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
+orcus_csv_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+
+# orcus-xml
+
+orcus_xml_SOURCES = \
+ orcus_filter_global.cpp \
+ cli_global.hpp \
+ cli_global.cpp \
+ orcus_xml_main.cpp
+
+orcus_xml_LDFLAGS = \
+ $(BOOST_PROGRAM_OPTIONS_LDFLAGS) \
+ $(BOOST_SYSTEM_LDFLAGS)
+orcus_xml_LDADD = \
+ liborcus/liborcus-@ORCUS_API_VERSION@.la \
+ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+ $(BOOST_PROGRAM_OPTIONS_LIBS) \
+ $(BOOST_SYSTEM_LIBS)
+
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+orcus_xml_LDADD += -lstdc++fs
+else
+orcus_xml_LDFLAGS += $(BOOST_FILESYSTEM_LDFLAGS)
+orcus_xml_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
+orcus_xml_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+
+if WITH_ODS_FILTER
+
+bin_PROGRAMS += \
+ orcus-ods \
+ orcus-styles-ods
+
+# orcus-ods
+
+orcus_ods_SOURCES = \
+ orcus_filter_global.hpp \
+ orcus_filter_global.cpp \
+ orcus_ods_main.cpp
+
+orcus_ods_LDFLAGS = \
+ $(BOOST_PROGRAM_OPTIONS_LDFLAGS) \
+ $(BOOST_SYSTEM_LDFLAGS)
+orcus_ods_LDADD = \
+ liborcus/liborcus-@ORCUS_API_VERSION@.la \
+ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+ $(BOOST_PROGRAM_OPTIONS_LIBS) \
+ $(BOOST_SYSTEM_LIBS)
+
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+orcus_ods_LDADD += -lstdc++fs
+else
+orcus_ods_LDFLAGS += $(BOOST_FILESYSTEM_LDFLAGS)
+orcus_ods_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
+orcus_ods_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+
+# orcus-styles-ods
+
+orcus_styles_ods_SOURCES = \
+ orcus_filter_global.hpp \
+ orcus_filter_global.cpp \
+ orcus_ods_styles.cpp
+
+orcus_styles_ods_LDFLAGS = \
+ $(BOOST_PROGRAM_OPTIONS_LDFLAGS) \
+ $(BOOST_SYSTEM_LDFLAGS)
+
+orcus_styles_ods_LDADD = \
+ liborcus/liborcus-@ORCUS_API_VERSION@.la \
+ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+ $(BOOST_PROGRAM_OPTIONS_LIBS) \
+ $(BOOST_SYSTEM_LIBS)
+
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+orcus_styles_ods_LDADD += -lstdc++fs
+else
+orcus_styles_ods_LDFLAGS += $(BOOST_FILESYSTEM_LDFLAGS)
+orcus_styles_ods_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
+orcus_styles_ods_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+
+endif # WITH_ODS_FILTER
+
+if WITH_XLSX_FILTER
+
+bin_PROGRAMS += \
+ orcus-xlsx
+
+# orcus-xlsx
+
+orcus_xlsx_SOURCES = \
+ orcus_filter_global.hpp \
+ orcus_filter_global.cpp \
+ orcus_xlsx_main.cpp
+
+orcus_xlsx_LDFLAGS = \
+ $(BOOST_PROGRAM_OPTIONS_LDFLAGS) \
+ $(BOOST_SYSTEM_LDFLAGS)
+orcus_xlsx_LDADD = \
+ liborcus/liborcus-@ORCUS_API_VERSION@.la \
+ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+ $(BOOST_PROGRAM_OPTIONS_LIBS) \
+ $(BOOST_SYSTEM_LIBS)
+
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+orcus_xlsx_LDADD += -lstdc++fs
+else
+orcus_xlsx_LDFLAGS += $(BOOST_FILESYSTEM_LDFLAGS)
+orcus_xlsx_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
+orcus_xlsx_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+
+endif # WITH_XLSX_FILTER
+
+if WITH_XLS_XML_FILTER
+
+bin_PROGRAMS += \
+ orcus-xls-xml
+
+# orcus-xls-xml
+
+orcus_xls_xml_SOURCES = \
+ orcus_filter_global.hpp \
+ orcus_filter_global.cpp \
+ orcus_xls_xml_main.cpp
+
+orcus_xls_xml_LDFLAGS = \
+ $(BOOST_PROGRAM_OPTIONS_LDFLAGS) \
+ $(BOOST_SYSTEM_LDFLAGS)
+orcus_xls_xml_LDADD = \
+ liborcus/liborcus-@ORCUS_API_VERSION@.la \
+ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+ $(BOOST_PROGRAM_OPTIONS_LIBS) \
+ $(BOOST_SYSTEM_LIBS)
+
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+orcus_xls_xml_LDADD += -lstdc++fs
+else
+orcus_xls_xml_LDFLAGS += $(BOOST_FILESYSTEM_LDFLAGS)
+orcus_xls_xml_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
+orcus_xls_xml_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+
+endif # WITH_XLS_XML_FILTER
+
+if WITH_GNUMERIC_FILTER
+
+bin_PROGRAMS += \
+ orcus-gnumeric
+
+# orcus-gnumeric
+
+orcus_gnumeric_SOURCES = \
+ orcus_filter_global.hpp \
+ orcus_filter_global.cpp \
+ orcus_gnumeric_main.cpp
+
+orcus_gnumeric_LDFLAGS = \
+ $(BOOST_PROGRAM_OPTIONS_LDFLAGS) \
+ $(BOOST_SYSTEM_LDFLAGS)
+orcus_gnumeric_LDADD = \
+ liborcus/liborcus-@ORCUS_API_VERSION@.la \
+ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+ $(BOOST_PROGRAM_OPTIONS_LIBS) \
+ $(BOOST_SYSTEM_LIBS)
+
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+orcus_gnumeric_LDADD += -lstdc++fs
+else
+orcus_gnumeric_LDFLAGS += $(BOOST_FILESYSTEM_LDFLAGS)
+orcus_gnumeric_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
+orcus_gnumeric_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+
+endif # WITH_GNUMERIC_FILTER
+
+if WITH_PARQUET_FILTER
+
+bin_PROGRAMS += \
+ orcus-parquet
+
+# orcus-parquet
+
+orcus_parquet_SOURCES = \
+ orcus_filter_global.hpp \
+ orcus_filter_global.cpp \
+ orcus_parquet_main.cpp
+
+orcus_parquet_LDFLAGS = \
+ $(BOOST_PROGRAM_OPTIONS_LDFLAGS) \
+ $(BOOST_FILESYSTEM_LDFLAGS) \
+ $(BOOST_SYSTEM_LDFLAGS)
+orcus_parquet_LDADD = \
+ liborcus/liborcus-@ORCUS_API_VERSION@.la \
+ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+ $(BOOST_PROGRAM_OPTIONS_LIBS) \
+ $(BOOST_FILESYSTEM_LIBS) \
+ $(BOOST_SYSTEM_LIBS)
+
+endif # WITH_PARQUET_FILTER
+
+endif # BUILD_SPREADSHEET_MODEL
+
+endif # WITH_TOOLS
+
+#----------------------------------------------------------------------------
+# Orcus Filter Tests
+#----------------------------------------------------------------------------
+
+if BUILD_SPREADSHEET_MODEL
+
+EXTRA_PROGRAMS += \
+ orcus-test-csv \
+ orcus-test-xml-mapped \
+ orcus-test-json-mapped
+
+# orcus-test-csv
+
+orcus_test_csv_SOURCES = \
+ orcus_test_csv.cpp \
+ orcus_test_global.hpp \
+ orcus_test_global.cpp
+
+orcus_test_csv_LDADD = \
+ liborcus/liborcus-@ORCUS_API_VERSION@.la \
+ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ ./test/liborcus-test.a \
+ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la
+
+orcus_test_csv_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS) -DSRCDIR=\""$(top_srcdir)"\"
+
+# orcus-test-xml-mapped
+
+orcus_test_xml_mapped_SOURCES = \
+ orcus_test_xml_mapped.cpp \
+ orcus_test_global.hpp \
+ orcus_test_global.cpp
+
+orcus_test_xml_mapped_LDFLAGS = \
+ $(BOOST_SYSTEM_LDFLAGS)
+
+orcus_test_xml_mapped_LDADD = \
+ liborcus/liborcus-@ORCUS_API_VERSION@.la \
+ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ ./test/liborcus-test.a \
+ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+ $(BOOST_SYSTEM_LIBS)
+
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+orcus_test_xml_mapped_LDADD += -lstdc++fs
+else
+orcus_test_xml_mapped_LDFLAGS += $(BOOST_FILESYSTEM_LDFLAGS)
+orcus_test_xml_mapped_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
+orcus_test_xml_mapped_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS) -DSRCDIR=\""$(top_srcdir)"\"
+
+# orcus-test-json-mapped
+
+orcus_test_json_mapped_SOURCES = \
+ orcus_test_json_mapped.cpp
+
+orcus_test_json_mapped_LDFLAGS = \
+ $(BOOST_SYSTEM_LDFLAGS)
+
+orcus_test_json_mapped_LDADD = \
+ liborcus/liborcus-@ORCUS_API_VERSION@.la \
+ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+ $(BOOST_SYSTEM_LIBS)
+
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+orcus_test_json_mapped_LDADD += -lstdc++fs
+else
+orcus_test_json_mapped_LDFLAGS += $(BOOST_FILESYSTEM_LDFLAGS)
+orcus_test_json_mapped_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
+orcus_test_json_mapped_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS) -DSRCDIR=\""$(top_srcdir)"\"
+
+TESTS += \
+ orcus-test-csv \
+ orcus-test-xml-mapped \
+ orcus-test-json-mapped
+
+if WITH_ODS_FILTER
+
+EXTRA_PROGRAMS += \
+ orcus-test-ods
+
+# orcus-test-ods
+
+orcus_test_ods_SOURCES = \
+ orcus_test_ods.cpp
+
+orcus_test_ods_LDADD = \
+ liborcus/liborcus-@ORCUS_API_VERSION@.la \
+ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+ $(BOOST_SYSTEM_LIBS) \
+ ./test/liborcus-test.a
+
+orcus_test_ods_LDFLAGS = \
+ $(BOOST_SYSTEM_LDFLAGS)
+
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+orcus_test_ods_LDADD += -lstdc++fs
+else
+orcus_test_ods_LDFLAGS += $(BOOST_FILESYSTEM_LDFLAGS)
+orcus_test_ods_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
+orcus_test_ods_CPPFLAGS = $(AM_CPPFLAGS) \
+ -I$(top_builddir)/lib/liborcus/liborcus.la -DSRCDIR=\""$(top_srcdir)"\"
+
+TESTS += orcus-test-ods
+
+# orcus-test-import-ods
+
+EXTRA_PROGRAMS += \
+ orcus-test-import-ods
+
+orcus_test_import_ods_SOURCES = \
+ orcus_test_import_ods.cpp
+
+orcus_test_import_ods_LDADD = \
+ liborcus/liborcus-@ORCUS_API_VERSION@.la \
+ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+ ./test/liborcus-test.a \
+ $(BOOST_SYSTEM_LIBS)
+
+orcus_test_import_ods_LDFLAGS = \
+ $(BOOST_SYSTEM_LDFLAGS)
+
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+orcus_test_import_ods_LDADD += -lstdc++fs
+else
+orcus_test_import_ods_LDFLAGS += $(BOOST_FILESYSTEM_LDFLAGS)
+orcus_test_import_ods_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
+orcus_test_import_ods_CPPFLAGS = $(AM_CPPFLAGS) \
+ -I$(top_builddir)/lib/liborcus/liborcus.la -DSRCDIR=\""$(top_srcdir)"\"
+
+TESTS += \
+ orcus-test-import-ods
+
+endif # WITH_ODS_FILTER
+
+if WITH_XLSX_FILTER
+
+EXTRA_PROGRAMS += \
+ orcus-test-xlsx
+
+# orcus-test-xlsx
+
+orcus_test_xlsx_SOURCES = \
+ orcus_test_xlsx.cpp
+
+orcus_test_xlsx_LDFLAGS = \
+ $(BOOST_SYSTEM_LDFLAGS)
+
+orcus_test_xlsx_LDADD = \
+ liborcus/liborcus-@ORCUS_API_VERSION@.la \
+ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ test/liborcus-test.a \
+ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+ @LIBIXION_LIBS@ \
+ $(BOOST_SYSTEM_LIBS)
+
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+orcus_test_xlsx_LDADD += -lstdc++fs
+else
+orcus_test_xlsx_LDFLAGS += $(BOOST_FILESYSTEM_LDFLAGS)
+orcus_test_xlsx_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
+orcus_test_xlsx_CPPFLAGS = \
+ @LIBIXION_CFLAGS@ $(AM_CPPFLAGS) \
+ -I$(top_builddir)/lib/liborcus/liborcus.la -DSRCDIR=\""$(top_srcdir)"\"
+
+TESTS += \
+ orcus-test-xlsx
+
+endif # WITH_XLSX_FILTER
+
+if WITH_XLS_XML_FILTER
+
+EXTRA_PROGRAMS += orcus-test-xls-xml
+
+# orcus-test-xls-xml
+
+orcus_test_xls_xml_SOURCES = \
+ orcus_test_xls_xml.cpp \
+ orcus_test_global.cpp
+
+orcus_test_xls_xml_LDADD = \
+ liborcus/liborcus-@ORCUS_API_VERSION@.la \
+ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ ./test/liborcus-test.a \
+ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+ @LIBIXION_LIBS@
+
+orcus_test_xls_xml_CPPFLAGS = \
+ @LIBIXION_CFLAGS@ $(AM_CPPFLAGS) \
+ -I$(top_builddir)/lib/liborcus/liborcus.la -DSRCDIR=\""$(top_srcdir)"\"
+
+TESTS += \
+ orcus-test-xls-xml
+
+endif # WITH_XLS_XML_FILTER
+
+if WITH_GNUMERIC_FILTER
+
+EXTRA_PROGRAMS += orcus-test-gnumeric
+
+orcus_test_gnumeric_SOURCES = \
+ orcus_test_gnumeric.cpp \
+ orcus_test_global.cpp
+
+orcus_test_gnumeric_LDADD = \
+ liborcus/liborcus-@ORCUS_API_VERSION@.la \
+ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ ./test/liborcus-test.a \
+ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+ @LIBIXION_LIBS@ \
+ $(BOOST_FILESYSTEM_LIBS) \
+ $(BOOST_SYSTEM_LIBS)
+
+orcus_test_gnumeric_LDFLAGS = \
+ $(BOOST_FILESYSTEM_LDFLAGS) \
+ $(BOOST_SYSTEM_LDFLAGS)
+
+orcus_test_gnumeric_CPPFLAGS = \
+ @LIBIXION_CFLAGS@ $(AM_CPPFLAGS) \
+ -I$(top_builddir)/lib/liborcus/liborcus.la -DSRCDIR=\""$(top_srcdir)"\"
+
+TESTS += orcus-test-gnumeric
+
+endif # WITH_GNUMERIC_FILTER
+
+if WITH_PARQUET_FILTER
+
+EXTRA_PROGRAMS += orcus-test-parquet
+
+orcus_test_parquet_SOURCES = \
+ orcus_test_parquet.cpp
+
+orcus_test_parquet_LDADD = \
+ liborcus/liborcus-@ORCUS_API_VERSION@.la \
+ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ ./test/liborcus-test.a \
+ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+ @LIBIXION_LIBS@ \
+ $(BOOST_FILESYSTEM_LIBS) \
+ $(BOOST_SYSTEM_LIBS)
+
+orcus_test_parquet_CPPFLAGS = \
+ @LIBIXION_CFLAGS@ $(AM_CPPFLAGS) \
+ -I$(top_builddir)/lib/liborcus/liborcus.la -DSRCDIR=\""$(top_srcdir)"\"
+
+TESTS += \
+ orcus-test-parquet
+
+endif #WITH_PARQUET_FILTER
+
+endif # BUILD_SPREADSHEET_MODEL
+
+distclean-local:
+ rm -rf $(TESTS)
+
+@VALGRIND_CHECK_RULES@
diff --git a/src/Makefile.in b/src/Makefile.in
new file mode 100644
index 0000000..d4386b7
--- /dev/null
+++ b/src/Makefile.in
@@ -0,0 +1,2986 @@
+# Makefile.in generated by automake 1.16.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2021 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.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+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@
+@BUILD_PYTHON_TRUE@am__append_1 = python
+bin_PROGRAMS = $(am__EXEEXT_7) $(am__EXEEXT_8) $(am__EXEEXT_9) \
+ $(am__EXEEXT_10) $(am__EXEEXT_11) $(am__EXEEXT_12) \
+ $(am__EXEEXT_13)
+EXTRA_PROGRAMS = orcus-test-xml$(EXEEXT) orcus-env-dump$(EXEEXT) \
+ $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
+ $(am__EXEEXT_4) $(am__EXEEXT_5) $(am__EXEEXT_6)
+@HAVE_FILESYSTEM_TRUE@am__append_2 = "-DHAVE_FILESYSTEM=1"
+@HAVE_EXPERIMENTAL_FILESYSTEM_TRUE@am__append_3 = "-DHAVE_EXPERIMENTAL_FILESYSTEM=1"
+@HAVE_STATIC_LIB_TRUE@am__append_4 = -D__ORCUS_STATIC_LIB=1
+TESTS = orcus-test-xml$(EXEEXT) orcus-env-dump$(EXEEXT) \
+ $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
+ $(am__EXEEXT_4) $(am__EXEEXT_5) $(am__EXEEXT_6)
+@WITH_TOOLS_TRUE@am__append_5 = \
+@WITH_TOOLS_TRUE@ orcus-css-dump \
+@WITH_TOOLS_TRUE@ orcus-zip-dump \
+@WITH_TOOLS_TRUE@ orcus-mso-encryption \
+@WITH_TOOLS_TRUE@ orcus-detect \
+@WITH_TOOLS_TRUE@ orcus-json \
+@WITH_TOOLS_TRUE@ orcus-yaml
+
+@HAVE_EXPERIMENTAL_FILESYSTEM_TRUE@@HAVE_FILESYSTEM_FALSE@@WITH_TOOLS_TRUE@am__append_6 = -lstdc++fs
+@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@@WITH_TOOLS_TRUE@am__append_7 = $(BOOST_FILESYSTEM_LDFLAGS)
+@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@@WITH_TOOLS_TRUE@am__append_8 = $(BOOST_FILESYSTEM_LIBS)
+@HAVE_EXPERIMENTAL_FILESYSTEM_TRUE@@HAVE_FILESYSTEM_FALSE@@WITH_TOOLS_TRUE@am__append_9 = -lstdc++fs
+@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@@WITH_TOOLS_TRUE@am__append_10 = $(BOOST_FILESYSTEM_LDFLAGS)
+@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@@WITH_TOOLS_TRUE@am__append_11 = $(BOOST_FILESYSTEM_LIBS)
+@HAVE_EXPERIMENTAL_FILESYSTEM_TRUE@@HAVE_FILESYSTEM_FALSE@@WITH_TOOLS_TRUE@am__append_12 = -lstdc++fs
+@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@@WITH_TOOLS_TRUE@am__append_13 = $(BOOST_FILESYSTEM_LDFLAGS)
+@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@@WITH_TOOLS_TRUE@am__append_14 = $(BOOST_FILESYSTEM_LIBS)
+
+#----------------------------------------------------------------------------
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@am__append_15 = \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la
+
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@am__append_16 = \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ orcus-csv orcus-xml
+
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_TRUE@@HAVE_FILESYSTEM_FALSE@@WITH_TOOLS_TRUE@am__append_17 = -lstdc++fs
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@@WITH_TOOLS_TRUE@am__append_18 = $(BOOST_FILESYSTEM_LDFLAGS)
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@@WITH_TOOLS_TRUE@am__append_19 = $(BOOST_FILESYSTEM_LIBS)
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_TRUE@@HAVE_FILESYSTEM_FALSE@@WITH_TOOLS_TRUE@am__append_20 = -lstdc++fs
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@@WITH_TOOLS_TRUE@am__append_21 = $(BOOST_FILESYSTEM_LDFLAGS)
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@@WITH_TOOLS_TRUE@am__append_22 = $(BOOST_FILESYSTEM_LIBS)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@am__append_23 = \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ orcus-ods \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ orcus-styles-ods
+
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_TRUE@@HAVE_FILESYSTEM_FALSE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@am__append_24 = -lstdc++fs
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@am__append_25 = $(BOOST_FILESYSTEM_LDFLAGS)
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@am__append_26 = $(BOOST_FILESYSTEM_LIBS)
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_TRUE@@HAVE_FILESYSTEM_FALSE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@am__append_27 = -lstdc++fs
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@am__append_28 = $(BOOST_FILESYSTEM_LDFLAGS)
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@am__append_29 = $(BOOST_FILESYSTEM_LIBS)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLSX_FILTER_TRUE@am__append_30 = \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLSX_FILTER_TRUE@ orcus-xlsx
+
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_TRUE@@HAVE_FILESYSTEM_FALSE@@WITH_TOOLS_TRUE@@WITH_XLSX_FILTER_TRUE@am__append_31 = -lstdc++fs
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@@WITH_TOOLS_TRUE@@WITH_XLSX_FILTER_TRUE@am__append_32 = $(BOOST_FILESYSTEM_LDFLAGS)
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@@WITH_TOOLS_TRUE@@WITH_XLSX_FILTER_TRUE@am__append_33 = $(BOOST_FILESYSTEM_LIBS)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLS_XML_FILTER_TRUE@am__append_34 = \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLS_XML_FILTER_TRUE@ orcus-xls-xml
+
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_TRUE@@HAVE_FILESYSTEM_FALSE@@WITH_TOOLS_TRUE@@WITH_XLS_XML_FILTER_TRUE@am__append_35 = -lstdc++fs
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@@WITH_TOOLS_TRUE@@WITH_XLS_XML_FILTER_TRUE@am__append_36 = $(BOOST_FILESYSTEM_LDFLAGS)
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@@WITH_TOOLS_TRUE@@WITH_XLS_XML_FILTER_TRUE@am__append_37 = $(BOOST_FILESYSTEM_LIBS)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@@WITH_TOOLS_TRUE@am__append_38 = \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@@WITH_TOOLS_TRUE@ orcus-gnumeric
+
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_TRUE@@HAVE_FILESYSTEM_FALSE@@WITH_GNUMERIC_FILTER_TRUE@@WITH_TOOLS_TRUE@am__append_39 = -lstdc++fs
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@@WITH_GNUMERIC_FILTER_TRUE@@WITH_TOOLS_TRUE@am__append_40 = $(BOOST_FILESYSTEM_LDFLAGS)
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@@WITH_GNUMERIC_FILTER_TRUE@@WITH_TOOLS_TRUE@am__append_41 = $(BOOST_FILESYSTEM_LIBS)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@@WITH_TOOLS_TRUE@am__append_42 = \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@@WITH_TOOLS_TRUE@ orcus-parquet
+
+
+#----------------------------------------------------------------------------
+# Orcus Filter Tests
+#----------------------------------------------------------------------------
+@BUILD_SPREADSHEET_MODEL_TRUE@am__append_43 = \
+@BUILD_SPREADSHEET_MODEL_TRUE@ orcus-test-csv \
+@BUILD_SPREADSHEET_MODEL_TRUE@ orcus-test-xml-mapped \
+@BUILD_SPREADSHEET_MODEL_TRUE@ orcus-test-json-mapped
+
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_TRUE@@HAVE_FILESYSTEM_FALSE@am__append_44 = -lstdc++fs
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@am__append_45 = $(BOOST_FILESYSTEM_LDFLAGS)
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@am__append_46 = $(BOOST_FILESYSTEM_LIBS)
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_TRUE@@HAVE_FILESYSTEM_FALSE@am__append_47 = -lstdc++fs
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@am__append_48 = $(BOOST_FILESYSTEM_LDFLAGS)
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@am__append_49 = $(BOOST_FILESYSTEM_LIBS)
+@BUILD_SPREADSHEET_MODEL_TRUE@am__append_50 = \
+@BUILD_SPREADSHEET_MODEL_TRUE@ orcus-test-csv \
+@BUILD_SPREADSHEET_MODEL_TRUE@ orcus-test-xml-mapped \
+@BUILD_SPREADSHEET_MODEL_TRUE@ orcus-test-json-mapped
+
+
+# orcus-test-import-ods
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@am__append_51 = orcus-test-ods \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@ orcus-test-import-ods
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_TRUE@@HAVE_FILESYSTEM_FALSE@@WITH_ODS_FILTER_TRUE@am__append_52 = -lstdc++fs
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@@WITH_ODS_FILTER_TRUE@am__append_53 = $(BOOST_FILESYSTEM_LDFLAGS)
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@@WITH_ODS_FILTER_TRUE@am__append_54 = $(BOOST_FILESYSTEM_LIBS)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@am__append_55 = orcus-test-ods \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@ orcus-test-import-ods
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_TRUE@@HAVE_FILESYSTEM_FALSE@@WITH_ODS_FILTER_TRUE@am__append_56 = -lstdc++fs
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@@WITH_ODS_FILTER_TRUE@am__append_57 = $(BOOST_FILESYSTEM_LDFLAGS)
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@@WITH_ODS_FILTER_TRUE@am__append_58 = $(BOOST_FILESYSTEM_LIBS)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLSX_FILTER_TRUE@am__append_59 = \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLSX_FILTER_TRUE@ orcus-test-xlsx
+
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_TRUE@@HAVE_FILESYSTEM_FALSE@@WITH_XLSX_FILTER_TRUE@am__append_60 = -lstdc++fs
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@@WITH_XLSX_FILTER_TRUE@am__append_61 = $(BOOST_FILESYSTEM_LDFLAGS)
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@@WITH_XLSX_FILTER_TRUE@am__append_62 = $(BOOST_FILESYSTEM_LIBS)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLSX_FILTER_TRUE@am__append_63 = \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLSX_FILTER_TRUE@ orcus-test-xlsx
+
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLS_XML_FILTER_TRUE@am__append_64 = orcus-test-xls-xml
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLS_XML_FILTER_TRUE@am__append_65 = \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLS_XML_FILTER_TRUE@ orcus-test-xls-xml
+
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@am__append_66 = orcus-test-gnumeric
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@am__append_67 = orcus-test-gnumeric
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@am__append_68 = orcus-test-parquet
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@am__append_69 = \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@ orcus-test-parquet
+
+subdir = src
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
+ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_17.m4 \
+ $(top_srcdir)/m4/boost.m4 $(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)/m4/m4_ax_valgrind_check.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+@BUILD_SPREADSHEET_MODEL_TRUE@am__EXEEXT_1 = orcus-test-csv$(EXEEXT) \
+@BUILD_SPREADSHEET_MODEL_TRUE@ orcus-test-xml-mapped$(EXEEXT) \
+@BUILD_SPREADSHEET_MODEL_TRUE@ orcus-test-json-mapped$(EXEEXT)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@am__EXEEXT_2 = orcus-test-ods$(EXEEXT) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@ orcus-test-import-ods$(EXEEXT)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLSX_FILTER_TRUE@am__EXEEXT_3 = orcus-test-xlsx$(EXEEXT)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLS_XML_FILTER_TRUE@am__EXEEXT_4 = orcus-test-xls-xml$(EXEEXT)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@am__EXEEXT_5 = orcus-test-gnumeric$(EXEEXT)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@am__EXEEXT_6 = orcus-test-parquet$(EXEEXT)
+@WITH_TOOLS_TRUE@am__EXEEXT_7 = orcus-css-dump$(EXEEXT) \
+@WITH_TOOLS_TRUE@ orcus-zip-dump$(EXEEXT) \
+@WITH_TOOLS_TRUE@ orcus-mso-encryption$(EXEEXT) \
+@WITH_TOOLS_TRUE@ orcus-detect$(EXEEXT) orcus-json$(EXEEXT) \
+@WITH_TOOLS_TRUE@ orcus-yaml$(EXEEXT)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@am__EXEEXT_8 = orcus-csv$(EXEEXT) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ orcus-xml$(EXEEXT)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@am__EXEEXT_9 = orcus-ods$(EXEEXT) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ orcus-styles-ods$(EXEEXT)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLSX_FILTER_TRUE@am__EXEEXT_10 = orcus-xlsx$(EXEEXT)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLS_XML_FILTER_TRUE@am__EXEEXT_11 = orcus-xls-xml$(EXEEXT)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@@WITH_TOOLS_TRUE@am__EXEEXT_12 = orcus-gnumeric$(EXEEXT)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@@WITH_TOOLS_TRUE@am__EXEEXT_13 = orcus-parquet$(EXEEXT)
+am__installdirs = "$(DESTDIR)$(bindir)"
+PROGRAMS = $(bin_PROGRAMS)
+am__orcus_css_dump_SOURCES_DIST = orcus_css_dump.cpp
+@WITH_TOOLS_TRUE@am_orcus_css_dump_OBJECTS = \
+@WITH_TOOLS_TRUE@ orcus_css_dump-orcus_css_dump.$(OBJEXT)
+orcus_css_dump_OBJECTS = $(am_orcus_css_dump_OBJECTS)
+@WITH_TOOLS_TRUE@orcus_css_dump_DEPENDENCIES = parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@WITH_TOOLS_TRUE@ liborcus/liborcus-@ORCUS_API_VERSION@.la
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+am__orcus_csv_SOURCES_DIST = orcus_filter_global.hpp \
+ orcus_filter_global.cpp orcus_csv_main.cpp
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@am_orcus_csv_OBJECTS = orcus_csv-orcus_filter_global.$(OBJEXT) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ orcus_csv-orcus_csv_main.$(OBJEXT)
+orcus_csv_OBJECTS = $(am_orcus_csv_OBJECTS)
+am__DEPENDENCIES_1 =
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@@WITH_TOOLS_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@orcus_csv_DEPENDENCIES = liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ $(am__DEPENDENCIES_2)
+orcus_csv_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(orcus_csv_LDFLAGS) $(LDFLAGS) -o $@
+am__orcus_detect_SOURCES_DIST = orcus_detect_main.cpp
+@WITH_TOOLS_TRUE@am_orcus_detect_OBJECTS = \
+@WITH_TOOLS_TRUE@ orcus_detect-orcus_detect_main.$(OBJEXT)
+orcus_detect_OBJECTS = $(am_orcus_detect_OBJECTS)
+@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@@WITH_TOOLS_TRUE@am__DEPENDENCIES_3 = $(am__DEPENDENCIES_1)
+@WITH_TOOLS_TRUE@orcus_detect_DEPENDENCIES = parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@WITH_TOOLS_TRUE@ liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@WITH_TOOLS_TRUE@ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+@WITH_TOOLS_TRUE@ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_3)
+orcus_detect_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(orcus_detect_LDFLAGS) $(LDFLAGS) -o $@
+am_orcus_env_dump_OBJECTS = orcus_env_dump-orcus_env_dump.$(OBJEXT)
+orcus_env_dump_OBJECTS = $(am_orcus_env_dump_OBJECTS)
+orcus_env_dump_DEPENDENCIES = \
+ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ liborcus/liborcus-@ORCUS_API_VERSION@.la
+am__orcus_gnumeric_SOURCES_DIST = orcus_filter_global.hpp \
+ orcus_filter_global.cpp orcus_gnumeric_main.cpp
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@@WITH_TOOLS_TRUE@am_orcus_gnumeric_OBJECTS = orcus_gnumeric-orcus_filter_global.$(OBJEXT) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@@WITH_TOOLS_TRUE@ orcus_gnumeric-orcus_gnumeric_main.$(OBJEXT)
+orcus_gnumeric_OBJECTS = $(am_orcus_gnumeric_OBJECTS)
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@@WITH_GNUMERIC_FILTER_TRUE@@WITH_TOOLS_TRUE@am__DEPENDENCIES_4 = $(am__DEPENDENCIES_1)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@@WITH_TOOLS_TRUE@orcus_gnumeric_DEPENDENCIES = liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@@WITH_TOOLS_TRUE@ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@@WITH_TOOLS_TRUE@ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(am__DEPENDENCIES_4)
+orcus_gnumeric_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(AM_CXXFLAGS) $(CXXFLAGS) $(orcus_gnumeric_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am__orcus_json_SOURCES_DIST = orcus_json_cli.hpp orcus_json_cli.cpp \
+ cli_global.hpp cli_global.cpp orcus_json_cli_map.cpp
+@WITH_TOOLS_TRUE@am_orcus_json_OBJECTS = \
+@WITH_TOOLS_TRUE@ orcus_json-orcus_json_cli.$(OBJEXT) \
+@WITH_TOOLS_TRUE@ orcus_json-cli_global.$(OBJEXT) \
+@WITH_TOOLS_TRUE@ orcus_json-orcus_json_cli_map.$(OBJEXT)
+orcus_json_OBJECTS = $(am_orcus_json_OBJECTS)
+@WITH_TOOLS_TRUE@orcus_json_DEPENDENCIES = parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@WITH_TOOLS_TRUE@ liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@WITH_TOOLS_TRUE@ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+@WITH_TOOLS_TRUE@ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_3) \
+@WITH_TOOLS_TRUE@ $(am__append_15)
+orcus_json_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(orcus_json_LDFLAGS) $(LDFLAGS) -o $@
+am__orcus_mso_encryption_SOURCES_DIST = orcus_mso_encryption.cpp
+@WITH_TOOLS_TRUE@am_orcus_mso_encryption_OBJECTS = orcus_mso_encryption-orcus_mso_encryption.$(OBJEXT)
+orcus_mso_encryption_OBJECTS = $(am_orcus_mso_encryption_OBJECTS)
+@WITH_TOOLS_TRUE@orcus_mso_encryption_DEPENDENCIES = parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@WITH_TOOLS_TRUE@ mso/liborcus-mso-@ORCUS_API_VERSION@.la \
+@WITH_TOOLS_TRUE@ $(am__DEPENDENCIES_1)
+orcus_mso_encryption_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(AM_CXXFLAGS) $(CXXFLAGS) $(orcus_mso_encryption_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am__orcus_ods_SOURCES_DIST = orcus_filter_global.hpp \
+ orcus_filter_global.cpp orcus_ods_main.cpp
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@am_orcus_ods_OBJECTS = orcus_ods-orcus_filter_global.$(OBJEXT) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ orcus_ods-orcus_ods_main.$(OBJEXT)
+orcus_ods_OBJECTS = $(am_orcus_ods_OBJECTS)
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@am__DEPENDENCIES_5 = $(am__DEPENDENCIES_1)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@orcus_ods_DEPENDENCIES = liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(am__DEPENDENCIES_5)
+orcus_ods_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(orcus_ods_LDFLAGS) $(LDFLAGS) -o $@
+am__orcus_parquet_SOURCES_DIST = orcus_filter_global.hpp \
+ orcus_filter_global.cpp orcus_parquet_main.cpp
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@@WITH_TOOLS_TRUE@am_orcus_parquet_OBJECTS = orcus_filter_global.$(OBJEXT) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@@WITH_TOOLS_TRUE@ orcus_parquet_main.$(OBJEXT)
+orcus_parquet_OBJECTS = $(am_orcus_parquet_OBJECTS)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@@WITH_TOOLS_TRUE@orcus_parquet_DEPENDENCIES = liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@@WITH_TOOLS_TRUE@ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@@WITH_TOOLS_TRUE@ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(am__DEPENDENCIES_1)
+orcus_parquet_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(AM_CXXFLAGS) $(CXXFLAGS) $(orcus_parquet_LDFLAGS) $(LDFLAGS) \
+ -o $@
+am__orcus_styles_ods_SOURCES_DIST = orcus_filter_global.hpp \
+ orcus_filter_global.cpp orcus_ods_styles.cpp
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@am_orcus_styles_ods_OBJECTS = orcus_styles_ods-orcus_filter_global.$(OBJEXT) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ orcus_styles_ods-orcus_ods_styles.$(OBJEXT)
+orcus_styles_ods_OBJECTS = $(am_orcus_styles_ods_OBJECTS)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@orcus_styles_ods_DEPENDENCIES = liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(am__DEPENDENCIES_5)
+orcus_styles_ods_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(AM_CXXFLAGS) $(CXXFLAGS) $(orcus_styles_ods_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am__orcus_test_csv_SOURCES_DIST = orcus_test_csv.cpp \
+ orcus_test_global.hpp orcus_test_global.cpp
+@BUILD_SPREADSHEET_MODEL_TRUE@am_orcus_test_csv_OBJECTS = orcus_test_csv-orcus_test_csv.$(OBJEXT) \
+@BUILD_SPREADSHEET_MODEL_TRUE@ orcus_test_csv-orcus_test_global.$(OBJEXT)
+orcus_test_csv_OBJECTS = $(am_orcus_test_csv_OBJECTS)
+@BUILD_SPREADSHEET_MODEL_TRUE@orcus_test_csv_DEPENDENCIES = liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@ ./test/liborcus-test.a \
+@BUILD_SPREADSHEET_MODEL_TRUE@ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la
+am__orcus_test_gnumeric_SOURCES_DIST = orcus_test_gnumeric.cpp \
+ orcus_test_global.cpp
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@am_orcus_test_gnumeric_OBJECTS = orcus_test_gnumeric-orcus_test_gnumeric.$(OBJEXT) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@ orcus_test_gnumeric-orcus_test_global.$(OBJEXT)
+orcus_test_gnumeric_OBJECTS = $(am_orcus_test_gnumeric_OBJECTS)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@orcus_test_gnumeric_DEPENDENCIES = liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@ ./test/liborcus-test.a \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@ $(am__DEPENDENCIES_1)
+orcus_test_gnumeric_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(AM_CXXFLAGS) $(CXXFLAGS) $(orcus_test_gnumeric_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am__orcus_test_import_ods_SOURCES_DIST = orcus_test_import_ods.cpp
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@am_orcus_test_import_ods_OBJECTS = orcus_test_import_ods-orcus_test_import_ods.$(OBJEXT)
+orcus_test_import_ods_OBJECTS = $(am_orcus_test_import_ods_OBJECTS)
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@@WITH_ODS_FILTER_TRUE@am__DEPENDENCIES_6 = $(am__DEPENDENCIES_1)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@orcus_test_import_ods_DEPENDENCIES = liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@ ./test/liborcus-test.a \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@ $(am__DEPENDENCIES_6)
+orcus_test_import_ods_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(AM_CXXFLAGS) $(CXXFLAGS) $(orcus_test_import_ods_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am__orcus_test_json_mapped_SOURCES_DIST = orcus_test_json_mapped.cpp
+@BUILD_SPREADSHEET_MODEL_TRUE@am_orcus_test_json_mapped_OBJECTS = orcus_test_json_mapped-orcus_test_json_mapped.$(OBJEXT)
+orcus_test_json_mapped_OBJECTS = $(am_orcus_test_json_mapped_OBJECTS)
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@am__DEPENDENCIES_7 = $(am__DEPENDENCIES_1)
+@BUILD_SPREADSHEET_MODEL_TRUE@orcus_test_json_mapped_DEPENDENCIES = liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@ $(am__DEPENDENCIES_7)
+orcus_test_json_mapped_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(AM_CXXFLAGS) $(CXXFLAGS) $(orcus_test_json_mapped_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am__orcus_test_ods_SOURCES_DIST = orcus_test_ods.cpp
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@am_orcus_test_ods_OBJECTS = orcus_test_ods-orcus_test_ods.$(OBJEXT)
+orcus_test_ods_OBJECTS = $(am_orcus_test_ods_OBJECTS)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@orcus_test_ods_DEPENDENCIES = liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@ ./test/liborcus-test.a \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@ $(am__DEPENDENCIES_6)
+orcus_test_ods_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(AM_CXXFLAGS) $(CXXFLAGS) $(orcus_test_ods_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am__orcus_test_parquet_SOURCES_DIST = orcus_test_parquet.cpp
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@am_orcus_test_parquet_OBJECTS = orcus_test_parquet-orcus_test_parquet.$(OBJEXT)
+orcus_test_parquet_OBJECTS = $(am_orcus_test_parquet_OBJECTS)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@orcus_test_parquet_DEPENDENCIES = liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@ ./test/liborcus-test.a \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@ $(am__DEPENDENCIES_1)
+am__orcus_test_xls_xml_SOURCES_DIST = orcus_test_xls_xml.cpp \
+ orcus_test_global.cpp
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLS_XML_FILTER_TRUE@am_orcus_test_xls_xml_OBJECTS = orcus_test_xls_xml-orcus_test_xls_xml.$(OBJEXT) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLS_XML_FILTER_TRUE@ orcus_test_xls_xml-orcus_test_global.$(OBJEXT)
+orcus_test_xls_xml_OBJECTS = $(am_orcus_test_xls_xml_OBJECTS)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLS_XML_FILTER_TRUE@orcus_test_xls_xml_DEPENDENCIES = liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLS_XML_FILTER_TRUE@ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLS_XML_FILTER_TRUE@ ./test/liborcus-test.a \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLS_XML_FILTER_TRUE@ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la
+am__orcus_test_xlsx_SOURCES_DIST = orcus_test_xlsx.cpp
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLSX_FILTER_TRUE@am_orcus_test_xlsx_OBJECTS = orcus_test_xlsx-orcus_test_xlsx.$(OBJEXT)
+orcus_test_xlsx_OBJECTS = $(am_orcus_test_xlsx_OBJECTS)
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@@WITH_XLSX_FILTER_TRUE@am__DEPENDENCIES_8 = $(am__DEPENDENCIES_1)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLSX_FILTER_TRUE@orcus_test_xlsx_DEPENDENCIES = liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLSX_FILTER_TRUE@ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLSX_FILTER_TRUE@ test/liborcus-test.a \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLSX_FILTER_TRUE@ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLSX_FILTER_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLSX_FILTER_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLSX_FILTER_TRUE@ $(am__DEPENDENCIES_8)
+orcus_test_xlsx_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(AM_CXXFLAGS) $(CXXFLAGS) $(orcus_test_xlsx_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_orcus_test_xml_OBJECTS = orcus_test_xml-orcus_test_xml.$(OBJEXT)
+orcus_test_xml_OBJECTS = $(am_orcus_test_xml_OBJECTS)
+orcus_test_xml_DEPENDENCIES = \
+ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ liborcus/liborcus-@ORCUS_API_VERSION@.la
+am__orcus_test_xml_mapped_SOURCES_DIST = orcus_test_xml_mapped.cpp \
+ orcus_test_global.hpp orcus_test_global.cpp
+@BUILD_SPREADSHEET_MODEL_TRUE@am_orcus_test_xml_mapped_OBJECTS = orcus_test_xml_mapped-orcus_test_xml_mapped.$(OBJEXT) \
+@BUILD_SPREADSHEET_MODEL_TRUE@ orcus_test_xml_mapped-orcus_test_global.$(OBJEXT)
+orcus_test_xml_mapped_OBJECTS = $(am_orcus_test_xml_mapped_OBJECTS)
+@BUILD_SPREADSHEET_MODEL_TRUE@orcus_test_xml_mapped_DEPENDENCIES = liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@ ./test/liborcus-test.a \
+@BUILD_SPREADSHEET_MODEL_TRUE@ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@ $(am__DEPENDENCIES_7)
+orcus_test_xml_mapped_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(AM_CXXFLAGS) $(CXXFLAGS) $(orcus_test_xml_mapped_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am__orcus_xls_xml_SOURCES_DIST = orcus_filter_global.hpp \
+ orcus_filter_global.cpp orcus_xls_xml_main.cpp
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLS_XML_FILTER_TRUE@am_orcus_xls_xml_OBJECTS = orcus_xls_xml-orcus_filter_global.$(OBJEXT) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLS_XML_FILTER_TRUE@ orcus_xls_xml-orcus_xls_xml_main.$(OBJEXT)
+orcus_xls_xml_OBJECTS = $(am_orcus_xls_xml_OBJECTS)
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@@WITH_TOOLS_TRUE@@WITH_XLS_XML_FILTER_TRUE@am__DEPENDENCIES_9 = $(am__DEPENDENCIES_1)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLS_XML_FILTER_TRUE@orcus_xls_xml_DEPENDENCIES = liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLS_XML_FILTER_TRUE@ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLS_XML_FILTER_TRUE@ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLS_XML_FILTER_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLS_XML_FILTER_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLS_XML_FILTER_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLS_XML_FILTER_TRUE@ $(am__DEPENDENCIES_9)
+orcus_xls_xml_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(AM_CXXFLAGS) $(CXXFLAGS) $(orcus_xls_xml_LDFLAGS) $(LDFLAGS) \
+ -o $@
+am__orcus_xlsx_SOURCES_DIST = orcus_filter_global.hpp \
+ orcus_filter_global.cpp orcus_xlsx_main.cpp
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLSX_FILTER_TRUE@am_orcus_xlsx_OBJECTS = orcus_xlsx-orcus_filter_global.$(OBJEXT) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLSX_FILTER_TRUE@ orcus_xlsx-orcus_xlsx_main.$(OBJEXT)
+orcus_xlsx_OBJECTS = $(am_orcus_xlsx_OBJECTS)
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@@WITH_TOOLS_TRUE@@WITH_XLSX_FILTER_TRUE@am__DEPENDENCIES_10 = $(am__DEPENDENCIES_1)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLSX_FILTER_TRUE@orcus_xlsx_DEPENDENCIES = liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLSX_FILTER_TRUE@ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLSX_FILTER_TRUE@ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLSX_FILTER_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLSX_FILTER_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLSX_FILTER_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLSX_FILTER_TRUE@ $(am__DEPENDENCIES_10)
+orcus_xlsx_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(orcus_xlsx_LDFLAGS) $(LDFLAGS) -o $@
+am__orcus_xml_SOURCES_DIST = orcus_filter_global.cpp cli_global.hpp \
+ cli_global.cpp orcus_xml_main.cpp
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@am_orcus_xml_OBJECTS = orcus_xml-orcus_filter_global.$(OBJEXT) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ orcus_xml-cli_global.$(OBJEXT) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ orcus_xml-orcus_xml_main.$(OBJEXT)
+orcus_xml_OBJECTS = $(am_orcus_xml_OBJECTS)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@orcus_xml_DEPENDENCIES = liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ $(am__DEPENDENCIES_2)
+orcus_xml_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(orcus_xml_LDFLAGS) $(LDFLAGS) -o $@
+am__orcus_yaml_SOURCES_DIST = orcus_yaml_main.cpp
+@WITH_TOOLS_TRUE@am_orcus_yaml_OBJECTS = \
+@WITH_TOOLS_TRUE@ orcus_yaml-orcus_yaml_main.$(OBJEXT)
+orcus_yaml_OBJECTS = $(am_orcus_yaml_OBJECTS)
+@WITH_TOOLS_TRUE@orcus_yaml_DEPENDENCIES = parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@WITH_TOOLS_TRUE@ liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@WITH_TOOLS_TRUE@ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+@WITH_TOOLS_TRUE@ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_3)
+orcus_yaml_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(orcus_yaml_LDFLAGS) $(LDFLAGS) -o $@
+am__orcus_zip_dump_SOURCES_DIST = orcus_zip_dump.cpp
+@WITH_TOOLS_TRUE@am_orcus_zip_dump_OBJECTS = \
+@WITH_TOOLS_TRUE@ orcus_zip_dump-orcus_zip_dump.$(OBJEXT)
+orcus_zip_dump_OBJECTS = $(am_orcus_zip_dump_OBJECTS)
+@WITH_TOOLS_TRUE@orcus_zip_dump_DEPENDENCIES = parser/liborcus-parser-@ORCUS_API_VERSION@.la
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/orcus_css_dump-orcus_css_dump.Po \
+ ./$(DEPDIR)/orcus_csv-orcus_csv_main.Po \
+ ./$(DEPDIR)/orcus_csv-orcus_filter_global.Po \
+ ./$(DEPDIR)/orcus_detect-orcus_detect_main.Po \
+ ./$(DEPDIR)/orcus_env_dump-orcus_env_dump.Po \
+ ./$(DEPDIR)/orcus_filter_global.Po \
+ ./$(DEPDIR)/orcus_gnumeric-orcus_filter_global.Po \
+ ./$(DEPDIR)/orcus_gnumeric-orcus_gnumeric_main.Po \
+ ./$(DEPDIR)/orcus_json-cli_global.Po \
+ ./$(DEPDIR)/orcus_json-orcus_json_cli.Po \
+ ./$(DEPDIR)/orcus_json-orcus_json_cli_map.Po \
+ ./$(DEPDIR)/orcus_mso_encryption-orcus_mso_encryption.Po \
+ ./$(DEPDIR)/orcus_ods-orcus_filter_global.Po \
+ ./$(DEPDIR)/orcus_ods-orcus_ods_main.Po \
+ ./$(DEPDIR)/orcus_parquet_main.Po \
+ ./$(DEPDIR)/orcus_styles_ods-orcus_filter_global.Po \
+ ./$(DEPDIR)/orcus_styles_ods-orcus_ods_styles.Po \
+ ./$(DEPDIR)/orcus_test_csv-orcus_test_csv.Po \
+ ./$(DEPDIR)/orcus_test_csv-orcus_test_global.Po \
+ ./$(DEPDIR)/orcus_test_gnumeric-orcus_test_global.Po \
+ ./$(DEPDIR)/orcus_test_gnumeric-orcus_test_gnumeric.Po \
+ ./$(DEPDIR)/orcus_test_import_ods-orcus_test_import_ods.Po \
+ ./$(DEPDIR)/orcus_test_json_mapped-orcus_test_json_mapped.Po \
+ ./$(DEPDIR)/orcus_test_ods-orcus_test_ods.Po \
+ ./$(DEPDIR)/orcus_test_parquet-orcus_test_parquet.Po \
+ ./$(DEPDIR)/orcus_test_xls_xml-orcus_test_global.Po \
+ ./$(DEPDIR)/orcus_test_xls_xml-orcus_test_xls_xml.Po \
+ ./$(DEPDIR)/orcus_test_xlsx-orcus_test_xlsx.Po \
+ ./$(DEPDIR)/orcus_test_xml-orcus_test_xml.Po \
+ ./$(DEPDIR)/orcus_test_xml_mapped-orcus_test_global.Po \
+ ./$(DEPDIR)/orcus_test_xml_mapped-orcus_test_xml_mapped.Po \
+ ./$(DEPDIR)/orcus_xls_xml-orcus_filter_global.Po \
+ ./$(DEPDIR)/orcus_xls_xml-orcus_xls_xml_main.Po \
+ ./$(DEPDIR)/orcus_xlsx-orcus_filter_global.Po \
+ ./$(DEPDIR)/orcus_xlsx-orcus_xlsx_main.Po \
+ ./$(DEPDIR)/orcus_xml-cli_global.Po \
+ ./$(DEPDIR)/orcus_xml-orcus_filter_global.Po \
+ ./$(DEPDIR)/orcus_xml-orcus_xml_main.Po \
+ ./$(DEPDIR)/orcus_yaml-orcus_yaml_main.Po \
+ ./$(DEPDIR)/orcus_zip_dump-orcus_zip_dump.Po
+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_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+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_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = $(orcus_css_dump_SOURCES) $(orcus_csv_SOURCES) \
+ $(orcus_detect_SOURCES) $(orcus_env_dump_SOURCES) \
+ $(orcus_gnumeric_SOURCES) $(orcus_json_SOURCES) \
+ $(orcus_mso_encryption_SOURCES) $(orcus_ods_SOURCES) \
+ $(orcus_parquet_SOURCES) $(orcus_styles_ods_SOURCES) \
+ $(orcus_test_csv_SOURCES) $(orcus_test_gnumeric_SOURCES) \
+ $(orcus_test_import_ods_SOURCES) \
+ $(orcus_test_json_mapped_SOURCES) $(orcus_test_ods_SOURCES) \
+ $(orcus_test_parquet_SOURCES) $(orcus_test_xls_xml_SOURCES) \
+ $(orcus_test_xlsx_SOURCES) $(orcus_test_xml_SOURCES) \
+ $(orcus_test_xml_mapped_SOURCES) $(orcus_xls_xml_SOURCES) \
+ $(orcus_xlsx_SOURCES) $(orcus_xml_SOURCES) \
+ $(orcus_yaml_SOURCES) $(orcus_zip_dump_SOURCES)
+DIST_SOURCES = $(am__orcus_css_dump_SOURCES_DIST) \
+ $(am__orcus_csv_SOURCES_DIST) $(am__orcus_detect_SOURCES_DIST) \
+ $(orcus_env_dump_SOURCES) $(am__orcus_gnumeric_SOURCES_DIST) \
+ $(am__orcus_json_SOURCES_DIST) \
+ $(am__orcus_mso_encryption_SOURCES_DIST) \
+ $(am__orcus_ods_SOURCES_DIST) \
+ $(am__orcus_parquet_SOURCES_DIST) \
+ $(am__orcus_styles_ods_SOURCES_DIST) \
+ $(am__orcus_test_csv_SOURCES_DIST) \
+ $(am__orcus_test_gnumeric_SOURCES_DIST) \
+ $(am__orcus_test_import_ods_SOURCES_DIST) \
+ $(am__orcus_test_json_mapped_SOURCES_DIST) \
+ $(am__orcus_test_ods_SOURCES_DIST) \
+ $(am__orcus_test_parquet_SOURCES_DIST) \
+ $(am__orcus_test_xls_xml_SOURCES_DIST) \
+ $(am__orcus_test_xlsx_SOURCES_DIST) $(orcus_test_xml_SOURCES) \
+ $(am__orcus_test_xml_mapped_SOURCES_DIST) \
+ $(am__orcus_xls_xml_SOURCES_DIST) \
+ $(am__orcus_xlsx_SOURCES_DIST) $(am__orcus_xml_SOURCES_DIST) \
+ $(am__orcus_yaml_SOURCES_DIST) \
+ $(am__orcus_zip_dump_SOURCES_DIST)
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+ ctags-recursive dvi-recursive html-recursive info-recursive \
+ install-data-recursive install-dvi-recursive \
+ install-exec-recursive install-html-recursive \
+ install-info-recursive install-pdf-recursive \
+ install-ps-recursive install-recursive installcheck-recursive \
+ installdirs-recursive pdf-recursive ps-recursive \
+ tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
+ distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+ $(RECURSIVE_TARGETS) \
+ $(RECURSIVE_CLEAN_TARGETS) \
+ $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+ check recheck distdir distdir-am
+am__extra_recursive_targets = check-valgrind-recursive \
+ check-valgrind-memcheck-recursive \
+ check-valgrind-helgrind-recursive check-valgrind-drd-recursive \
+ check-valgrind-sgcheck-recursive
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+am__tty_colors_dummy = \
+ mgn= red= grn= lgn= blu= brg= std=; \
+ am__color_tests=no
+am__tty_colors = { \
+ $(am__tty_colors_dummy); \
+ if test "X$(AM_COLOR_TESTS)" = Xno; then \
+ am__color_tests=no; \
+ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+ am__color_tests=yes; \
+ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+ am__color_tests=yes; \
+ fi; \
+ if test $$am__color_tests = yes; then \
+ red=''; \
+ grn=''; \
+ lgn=''; \
+ blu=''; \
+ mgn=''; \
+ brg=''; \
+ std=''; \
+ fi; \
+}
+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__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# 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
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# 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. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(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='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)'
+RECHECK_LOGS = $(TEST_LOGS)
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
+DIST_SUBDIRS = include test parser mso liborcus spreadsheet python
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \
+ $(top_srcdir)/test-driver
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+ dir0=`pwd`; \
+ sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+ sed_rest='s,^[^/]*/*,,'; \
+ sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+ sed_butlast='s,/*[^/]*$$,,'; \
+ while test -n "$$dir1"; do \
+ first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+ if test "$$first" != "."; then \
+ if test "$$first" = ".."; then \
+ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+ else \
+ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+ if test "$$first2" = "$$first"; then \
+ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+ else \
+ dir2="../$$dir2"; \
+ fi; \
+ dir0="$$dir0"/"$$first"; \
+ fi; \
+ fi; \
+ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+ done; \
+ reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BOOST_CPPFLAGS = @BOOST_CPPFLAGS@
+BOOST_DATE_TIME_LDFLAGS = @BOOST_DATE_TIME_LDFLAGS@
+BOOST_DATE_TIME_LDPATH = @BOOST_DATE_TIME_LDPATH@
+BOOST_DATE_TIME_LIBS = @BOOST_DATE_TIME_LIBS@
+BOOST_FILESYSTEM_LDFLAGS = @BOOST_FILESYSTEM_LDFLAGS@
+BOOST_FILESYSTEM_LDPATH = @BOOST_FILESYSTEM_LDPATH@
+BOOST_FILESYSTEM_LIBS = @BOOST_FILESYSTEM_LIBS@
+BOOST_IOSTREAMS_LDFLAGS = @BOOST_IOSTREAMS_LDFLAGS@
+BOOST_IOSTREAMS_LDPATH = @BOOST_IOSTREAMS_LDPATH@
+BOOST_IOSTREAMS_LIBS = @BOOST_IOSTREAMS_LIBS@
+BOOST_LDPATH = @BOOST_LDPATH@
+BOOST_PROGRAM_OPTIONS_LDFLAGS = @BOOST_PROGRAM_OPTIONS_LDFLAGS@
+BOOST_PROGRAM_OPTIONS_LDPATH = @BOOST_PROGRAM_OPTIONS_LDPATH@
+BOOST_PROGRAM_OPTIONS_LIBS = @BOOST_PROGRAM_OPTIONS_LIBS@
+BOOST_ROOT = @BOOST_ROOT@
+BOOST_SYSTEM_LDFLAGS = @BOOST_SYSTEM_LDFLAGS@
+BOOST_SYSTEM_LDPATH = @BOOST_SYSTEM_LDPATH@
+BOOST_SYSTEM_LIBS = @BOOST_SYSTEM_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CSCOPE = @CSCOPE@
+CTAGS = @CTAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_VALGRIND_drd = @ENABLE_VALGRIND_drd@
+ENABLE_VALGRIND_helgrind = @ENABLE_VALGRIND_helgrind@
+ENABLE_VALGRIND_memcheck = @ENABLE_VALGRIND_memcheck@
+ENABLE_VALGRIND_sgcheck = @ENABLE_VALGRIND_sgcheck@
+ETAGS = @ETAGS@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+HAVE_CXX17 = @HAVE_CXX17@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+IXION_REQUIRED_API_VERSION = @IXION_REQUIRED_API_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBIXION_CFLAGS = @LIBIXION_CFLAGS@
+LIBIXION_LIBS = @LIBIXION_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MDDS_CFLAGS = @MDDS_CFLAGS@
+MDDS_LIBS = @MDDS_LIBS@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+ORCUS_API_VERSION = @ORCUS_API_VERSION@
+ORCUS_MAJOR_VERSION = @ORCUS_MAJOR_VERSION@
+ORCUS_MICRO_VERSION = @ORCUS_MICRO_VERSION@
+ORCUS_MINOR_VERSION = @ORCUS_MINOR_VERSION@
+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@
+PARQUET_CFLAGS = @PARQUET_CFLAGS@
+PARQUET_LIBS = @PARQUET_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POW_LIB = @POW_LIB@
+PYTHON = @PYTHON@
+PYTHON_CFLAGS = @PYTHON_CFLAGS@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VALGRIND = @VALGRIND@
+VALGRIND_ENABLED = @VALGRIND_ENABLED@
+VERSION = @VERSION@
+ZLIB_CFLAGS = @ZLIB_CFLAGS@
+ZLIB_LIBS = @ZLIB_LIBS@
+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@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+runstatedir = @runstatedir@
+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@
+valgrind_enabled_tools = @valgrind_enabled_tools@
+valgrind_tools = @valgrind_tools@
+SUBDIRS = include test parser mso liborcus spreadsheet $(am__append_1)
+AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/src/include \
+ $(BOOST_CPPFLAGS) $(LIBIXION_CFLAGS) $(am__append_2) \
+ $(am__append_3) $(am__append_4)
+
+# orcus-test-xml
+orcus_test_xml_SOURCES = orcus_test_xml.cpp
+orcus_test_xml_LDADD = \
+ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ liborcus/liborcus-@ORCUS_API_VERSION@.la
+
+orcus_test_xml_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS) -DSRCDIR=\""$(top_srcdir)"\"
+
+# orcus-env-dump
+orcus_env_dump_SOURCES = orcus_env_dump.cpp
+orcus_env_dump_LDADD = \
+ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ liborcus/liborcus-@ORCUS_API_VERSION@.la
+
+orcus_env_dump_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+
+# orcus-css-dump
+@WITH_TOOLS_TRUE@orcus_css_dump_SOURCES = \
+@WITH_TOOLS_TRUE@ orcus_css_dump.cpp
+
+@WITH_TOOLS_TRUE@orcus_css_dump_LDADD = \
+@WITH_TOOLS_TRUE@ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@WITH_TOOLS_TRUE@ liborcus/liborcus-@ORCUS_API_VERSION@.la
+
+@WITH_TOOLS_TRUE@orcus_css_dump_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+
+# orcus-zip-dump
+@WITH_TOOLS_TRUE@orcus_zip_dump_SOURCES = \
+@WITH_TOOLS_TRUE@ orcus_zip_dump.cpp
+
+@WITH_TOOLS_TRUE@orcus_zip_dump_LDADD = \
+@WITH_TOOLS_TRUE@ parser/liborcus-parser-@ORCUS_API_VERSION@.la
+
+@WITH_TOOLS_TRUE@orcus_zip_dump_CPPFLAGS = $(AM_CPPFLAGS)
+
+# orcus-json
+@WITH_TOOLS_TRUE@orcus_json_SOURCES = \
+@WITH_TOOLS_TRUE@ orcus_json_cli.hpp \
+@WITH_TOOLS_TRUE@ orcus_json_cli.cpp \
+@WITH_TOOLS_TRUE@ cli_global.hpp \
+@WITH_TOOLS_TRUE@ cli_global.cpp \
+@WITH_TOOLS_TRUE@ orcus_json_cli_map.cpp
+
+@WITH_TOOLS_TRUE@orcus_json_LDFLAGS = \
+@WITH_TOOLS_TRUE@ $(BOOST_PROGRAM_OPTIONS_LDFLAGS) \
+@WITH_TOOLS_TRUE@ $(BOOST_SYSTEM_LDFLAGS) $(am__append_7)
+@WITH_TOOLS_TRUE@orcus_json_LDADD = parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@WITH_TOOLS_TRUE@ liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@WITH_TOOLS_TRUE@ $(BOOST_PROGRAM_OPTIONS_LIBS) \
+@WITH_TOOLS_TRUE@ $(BOOST_SYSTEM_LIBS) $(am__append_6) \
+@WITH_TOOLS_TRUE@ $(am__append_8) $(am__append_15)
+@WITH_TOOLS_TRUE@orcus_json_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+
+# orcus-yaml
+@WITH_TOOLS_TRUE@orcus_yaml_SOURCES = \
+@WITH_TOOLS_TRUE@ orcus_yaml_main.cpp
+
+@WITH_TOOLS_TRUE@orcus_yaml_LDFLAGS = \
+@WITH_TOOLS_TRUE@ $(BOOST_PROGRAM_OPTIONS_LDFLAGS) \
+@WITH_TOOLS_TRUE@ $(BOOST_SYSTEM_LDFLAGS) $(am__append_10)
+@WITH_TOOLS_TRUE@orcus_yaml_LDADD = parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@WITH_TOOLS_TRUE@ liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@WITH_TOOLS_TRUE@ $(BOOST_PROGRAM_OPTIONS_LIBS) \
+@WITH_TOOLS_TRUE@ $(BOOST_SYSTEM_LIBS) $(am__append_9) \
+@WITH_TOOLS_TRUE@ $(am__append_11)
+@WITH_TOOLS_TRUE@orcus_yaml_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+
+#----------------------------------------------------------------------------
+
+# orcus-mso-encryption
+@WITH_TOOLS_TRUE@orcus_mso_encryption_SOURCES = orcus_mso_encryption.cpp
+@WITH_TOOLS_TRUE@orcus_mso_encryption_LDFLAGS = $(BOOST_SYSTEM_LDFLAGS)
+@WITH_TOOLS_TRUE@orcus_mso_encryption_LDADD = \
+@WITH_TOOLS_TRUE@ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@WITH_TOOLS_TRUE@ mso/liborcus-mso-@ORCUS_API_VERSION@.la \
+@WITH_TOOLS_TRUE@ $(BOOST_SYSTEM_LIBS)
+
+@WITH_TOOLS_TRUE@orcus_mso_encryption_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+
+#----------------------------------------------------------------------------
+
+# orcus-detect
+@WITH_TOOLS_TRUE@orcus_detect_SOURCES = orcus_detect_main.cpp
+@WITH_TOOLS_TRUE@orcus_detect_LDFLAGS = \
+@WITH_TOOLS_TRUE@ $(BOOST_PROGRAM_OPTIONS_LDFLAGS) \
+@WITH_TOOLS_TRUE@ $(BOOST_SYSTEM_LDFLAGS) $(am__append_13)
+@WITH_TOOLS_TRUE@orcus_detect_LDADD = parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@WITH_TOOLS_TRUE@ liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@WITH_TOOLS_TRUE@ $(BOOST_PROGRAM_OPTIONS_LIBS) \
+@WITH_TOOLS_TRUE@ $(BOOST_SYSTEM_LIBS) $(am__append_12) \
+@WITH_TOOLS_TRUE@ $(am__append_14)
+@WITH_TOOLS_TRUE@orcus_detect_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+
+# orcus-csv
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@orcus_csv_SOURCES = \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ orcus_filter_global.hpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ orcus_filter_global.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ orcus_csv_main.cpp
+
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@orcus_csv_LDFLAGS = $(BOOST_PROGRAM_OPTIONS_LDFLAGS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ $(BOOST_SYSTEM_LDFLAGS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ $(am__append_18)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@orcus_csv_LDADD = liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ $(BOOST_PROGRAM_OPTIONS_LIBS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ $(BOOST_SYSTEM_LIBS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ $(am__append_17) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ $(am__append_19)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@orcus_csv_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+
+# orcus-xml
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@orcus_xml_SOURCES = \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ orcus_filter_global.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ cli_global.hpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ cli_global.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ orcus_xml_main.cpp
+
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@orcus_xml_LDFLAGS = $(BOOST_PROGRAM_OPTIONS_LDFLAGS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ $(BOOST_SYSTEM_LDFLAGS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ $(am__append_21)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@orcus_xml_LDADD = liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ $(BOOST_PROGRAM_OPTIONS_LIBS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ $(BOOST_SYSTEM_LIBS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ $(am__append_20) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@ $(am__append_22)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@orcus_xml_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+
+# orcus-ods
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@orcus_ods_SOURCES = \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ orcus_filter_global.hpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ orcus_filter_global.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ orcus_ods_main.cpp
+
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@orcus_ods_LDFLAGS = $(BOOST_PROGRAM_OPTIONS_LDFLAGS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(BOOST_SYSTEM_LDFLAGS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(am__append_25)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@orcus_ods_LDADD = liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(BOOST_PROGRAM_OPTIONS_LIBS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(BOOST_SYSTEM_LIBS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(am__append_24) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(am__append_26)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@orcus_ods_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+
+# orcus-styles-ods
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@orcus_styles_ods_SOURCES = \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ orcus_filter_global.hpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ orcus_filter_global.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ orcus_ods_styles.cpp
+
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@orcus_styles_ods_LDFLAGS = $(BOOST_PROGRAM_OPTIONS_LDFLAGS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(BOOST_SYSTEM_LDFLAGS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(am__append_28)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@orcus_styles_ods_LDADD = liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(BOOST_PROGRAM_OPTIONS_LIBS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(BOOST_SYSTEM_LIBS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(am__append_27) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(am__append_29)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@@WITH_TOOLS_TRUE@orcus_styles_ods_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+
+# orcus-xlsx
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLSX_FILTER_TRUE@orcus_xlsx_SOURCES = \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLSX_FILTER_TRUE@ orcus_filter_global.hpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLSX_FILTER_TRUE@ orcus_filter_global.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLSX_FILTER_TRUE@ orcus_xlsx_main.cpp
+
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLSX_FILTER_TRUE@orcus_xlsx_LDFLAGS = $(BOOST_PROGRAM_OPTIONS_LDFLAGS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLSX_FILTER_TRUE@ $(BOOST_SYSTEM_LDFLAGS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLSX_FILTER_TRUE@ $(am__append_32)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLSX_FILTER_TRUE@orcus_xlsx_LDADD = liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLSX_FILTER_TRUE@ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLSX_FILTER_TRUE@ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLSX_FILTER_TRUE@ $(BOOST_PROGRAM_OPTIONS_LIBS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLSX_FILTER_TRUE@ $(BOOST_SYSTEM_LIBS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLSX_FILTER_TRUE@ $(am__append_31) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLSX_FILTER_TRUE@ $(am__append_33)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLSX_FILTER_TRUE@orcus_xlsx_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+
+# orcus-xls-xml
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLS_XML_FILTER_TRUE@orcus_xls_xml_SOURCES = \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLS_XML_FILTER_TRUE@ orcus_filter_global.hpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLS_XML_FILTER_TRUE@ orcus_filter_global.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLS_XML_FILTER_TRUE@ orcus_xls_xml_main.cpp
+
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLS_XML_FILTER_TRUE@orcus_xls_xml_LDFLAGS = $(BOOST_PROGRAM_OPTIONS_LDFLAGS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLS_XML_FILTER_TRUE@ $(BOOST_SYSTEM_LDFLAGS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLS_XML_FILTER_TRUE@ $(am__append_36)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLS_XML_FILTER_TRUE@orcus_xls_xml_LDADD = liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLS_XML_FILTER_TRUE@ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLS_XML_FILTER_TRUE@ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLS_XML_FILTER_TRUE@ $(BOOST_PROGRAM_OPTIONS_LIBS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLS_XML_FILTER_TRUE@ $(BOOST_SYSTEM_LIBS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLS_XML_FILTER_TRUE@ $(am__append_35) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLS_XML_FILTER_TRUE@ $(am__append_37)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_TOOLS_TRUE@@WITH_XLS_XML_FILTER_TRUE@orcus_xls_xml_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+
+# orcus-gnumeric
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@@WITH_TOOLS_TRUE@orcus_gnumeric_SOURCES = \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@@WITH_TOOLS_TRUE@ orcus_filter_global.hpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@@WITH_TOOLS_TRUE@ orcus_filter_global.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@@WITH_TOOLS_TRUE@ orcus_gnumeric_main.cpp
+
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@@WITH_TOOLS_TRUE@orcus_gnumeric_LDFLAGS = $(BOOST_PROGRAM_OPTIONS_LDFLAGS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(BOOST_SYSTEM_LDFLAGS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(am__append_40)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@@WITH_TOOLS_TRUE@orcus_gnumeric_LDADD = liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@@WITH_TOOLS_TRUE@ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@@WITH_TOOLS_TRUE@ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(BOOST_PROGRAM_OPTIONS_LIBS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(BOOST_SYSTEM_LIBS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(am__append_39) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(am__append_41)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@@WITH_TOOLS_TRUE@orcus_gnumeric_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+
+# orcus-parquet
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@@WITH_TOOLS_TRUE@orcus_parquet_SOURCES = \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@@WITH_TOOLS_TRUE@ orcus_filter_global.hpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@@WITH_TOOLS_TRUE@ orcus_filter_global.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@@WITH_TOOLS_TRUE@ orcus_parquet_main.cpp
+
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@@WITH_TOOLS_TRUE@orcus_parquet_LDFLAGS = \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(BOOST_PROGRAM_OPTIONS_LDFLAGS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(BOOST_FILESYSTEM_LDFLAGS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(BOOST_SYSTEM_LDFLAGS)
+
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@@WITH_TOOLS_TRUE@orcus_parquet_LDADD = \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@@WITH_TOOLS_TRUE@ liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@@WITH_TOOLS_TRUE@ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@@WITH_TOOLS_TRUE@ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(BOOST_PROGRAM_OPTIONS_LIBS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(BOOST_FILESYSTEM_LIBS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@@WITH_TOOLS_TRUE@ $(BOOST_SYSTEM_LIBS)
+
+
+# orcus-test-csv
+@BUILD_SPREADSHEET_MODEL_TRUE@orcus_test_csv_SOURCES = \
+@BUILD_SPREADSHEET_MODEL_TRUE@ orcus_test_csv.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ orcus_test_global.hpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ orcus_test_global.cpp
+
+@BUILD_SPREADSHEET_MODEL_TRUE@orcus_test_csv_LDADD = \
+@BUILD_SPREADSHEET_MODEL_TRUE@ liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@ ./test/liborcus-test.a \
+@BUILD_SPREADSHEET_MODEL_TRUE@ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la
+
+@BUILD_SPREADSHEET_MODEL_TRUE@orcus_test_csv_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS) -DSRCDIR=\""$(top_srcdir)"\"
+
+# orcus-test-xml-mapped
+@BUILD_SPREADSHEET_MODEL_TRUE@orcus_test_xml_mapped_SOURCES = \
+@BUILD_SPREADSHEET_MODEL_TRUE@ orcus_test_xml_mapped.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ orcus_test_global.hpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ orcus_test_global.cpp
+
+@BUILD_SPREADSHEET_MODEL_TRUE@orcus_test_xml_mapped_LDFLAGS = \
+@BUILD_SPREADSHEET_MODEL_TRUE@ $(BOOST_SYSTEM_LDFLAGS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@ $(am__append_45)
+@BUILD_SPREADSHEET_MODEL_TRUE@orcus_test_xml_mapped_LDADD = liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@ ./test/liborcus-test.a \
+@BUILD_SPREADSHEET_MODEL_TRUE@ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@ $(BOOST_SYSTEM_LIBS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@ $(am__append_44) \
+@BUILD_SPREADSHEET_MODEL_TRUE@ $(am__append_46)
+@BUILD_SPREADSHEET_MODEL_TRUE@orcus_test_xml_mapped_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS) -DSRCDIR=\""$(top_srcdir)"\"
+
+# orcus-test-json-mapped
+@BUILD_SPREADSHEET_MODEL_TRUE@orcus_test_json_mapped_SOURCES = \
+@BUILD_SPREADSHEET_MODEL_TRUE@ orcus_test_json_mapped.cpp
+
+@BUILD_SPREADSHEET_MODEL_TRUE@orcus_test_json_mapped_LDFLAGS = \
+@BUILD_SPREADSHEET_MODEL_TRUE@ $(BOOST_SYSTEM_LDFLAGS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@ $(am__append_48)
+@BUILD_SPREADSHEET_MODEL_TRUE@orcus_test_json_mapped_LDADD = liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@ $(BOOST_SYSTEM_LIBS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@ $(am__append_47) \
+@BUILD_SPREADSHEET_MODEL_TRUE@ $(am__append_49)
+@BUILD_SPREADSHEET_MODEL_TRUE@orcus_test_json_mapped_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS) -DSRCDIR=\""$(top_srcdir)"\"
+
+# orcus-test-ods
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@orcus_test_ods_SOURCES = \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@ orcus_test_ods.cpp
+
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@orcus_test_ods_LDADD = liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@ $(BOOST_SYSTEM_LIBS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@ ./test/liborcus-test.a \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@ $(am__append_52) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@ $(am__append_54)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@orcus_test_ods_LDFLAGS = $(BOOST_SYSTEM_LDFLAGS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@ $(am__append_53)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@orcus_test_ods_CPPFLAGS = $(AM_CPPFLAGS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@ -I$(top_builddir)/lib/liborcus/liborcus.la -DSRCDIR=\""$(top_srcdir)"\"
+
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@orcus_test_import_ods_SOURCES = \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@ orcus_test_import_ods.cpp
+
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@orcus_test_import_ods_LDADD = liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@ ./test/liborcus-test.a \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@ $(BOOST_SYSTEM_LIBS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@ $(am__append_56) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@ $(am__append_58)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@orcus_test_import_ods_LDFLAGS = $(BOOST_SYSTEM_LDFLAGS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@ $(am__append_57)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@orcus_test_import_ods_CPPFLAGS = $(AM_CPPFLAGS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_ODS_FILTER_TRUE@ -I$(top_builddir)/lib/liborcus/liborcus.la -DSRCDIR=\""$(top_srcdir)"\"
+
+
+# orcus-test-xlsx
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLSX_FILTER_TRUE@orcus_test_xlsx_SOURCES = \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLSX_FILTER_TRUE@ orcus_test_xlsx.cpp
+
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLSX_FILTER_TRUE@orcus_test_xlsx_LDFLAGS = $(BOOST_SYSTEM_LDFLAGS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLSX_FILTER_TRUE@ $(am__append_61)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLSX_FILTER_TRUE@orcus_test_xlsx_LDADD = liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLSX_FILTER_TRUE@ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLSX_FILTER_TRUE@ test/liborcus-test.a \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLSX_FILTER_TRUE@ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLSX_FILTER_TRUE@ @LIBIXION_LIBS@ \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLSX_FILTER_TRUE@ $(BOOST_SYSTEM_LIBS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLSX_FILTER_TRUE@ $(am__append_60) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLSX_FILTER_TRUE@ $(am__append_62)
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLSX_FILTER_TRUE@orcus_test_xlsx_CPPFLAGS = \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLSX_FILTER_TRUE@ @LIBIXION_CFLAGS@ $(AM_CPPFLAGS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLSX_FILTER_TRUE@ -I$(top_builddir)/lib/liborcus/liborcus.la -DSRCDIR=\""$(top_srcdir)"\"
+
+
+# orcus-test-xls-xml
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLS_XML_FILTER_TRUE@orcus_test_xls_xml_SOURCES = \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLS_XML_FILTER_TRUE@ orcus_test_xls_xml.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLS_XML_FILTER_TRUE@ orcus_test_global.cpp
+
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLS_XML_FILTER_TRUE@orcus_test_xls_xml_LDADD = \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLS_XML_FILTER_TRUE@ liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLS_XML_FILTER_TRUE@ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLS_XML_FILTER_TRUE@ ./test/liborcus-test.a \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLS_XML_FILTER_TRUE@ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLS_XML_FILTER_TRUE@ @LIBIXION_LIBS@
+
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLS_XML_FILTER_TRUE@orcus_test_xls_xml_CPPFLAGS = \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLS_XML_FILTER_TRUE@ @LIBIXION_CFLAGS@ $(AM_CPPFLAGS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_XLS_XML_FILTER_TRUE@ -I$(top_builddir)/lib/liborcus/liborcus.la -DSRCDIR=\""$(top_srcdir)"\"
+
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@orcus_test_gnumeric_SOURCES = \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@ orcus_test_gnumeric.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@ orcus_test_global.cpp
+
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@orcus_test_gnumeric_LDADD = \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@ liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@ ./test/liborcus-test.a \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@ @LIBIXION_LIBS@ \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@ $(BOOST_FILESYSTEM_LIBS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@ $(BOOST_SYSTEM_LIBS)
+
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@orcus_test_gnumeric_LDFLAGS = \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@ $(BOOST_FILESYSTEM_LDFLAGS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@ $(BOOST_SYSTEM_LDFLAGS)
+
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@orcus_test_gnumeric_CPPFLAGS = \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@ @LIBIXION_CFLAGS@ $(AM_CPPFLAGS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_GNUMERIC_FILTER_TRUE@ -I$(top_builddir)/lib/liborcus/liborcus.la -DSRCDIR=\""$(top_srcdir)"\"
+
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@orcus_test_parquet_SOURCES = \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@ orcus_test_parquet.cpp
+
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@orcus_test_parquet_LDADD = \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@ liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@ parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@ ./test/liborcus-test.a \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@ spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@ @LIBIXION_LIBS@ \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@ $(BOOST_FILESYSTEM_LIBS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@ $(BOOST_SYSTEM_LIBS)
+
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@orcus_test_parquet_CPPFLAGS = \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@ @LIBIXION_CFLAGS@ $(AM_CPPFLAGS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@@WITH_PARQUET_FILTER_TRUE@ -I$(top_builddir)/lib/liborcus/liborcus.la -DSRCDIR=\""$(top_srcdir)"\"
+
+all: all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .cpp .lo .log .o .obj .test .test$(EXEEXT) .trs
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign src/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+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
+
+orcus-css-dump$(EXEEXT): $(orcus_css_dump_OBJECTS) $(orcus_css_dump_DEPENDENCIES) $(EXTRA_orcus_css_dump_DEPENDENCIES)
+ @rm -f orcus-css-dump$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(orcus_css_dump_OBJECTS) $(orcus_css_dump_LDADD) $(LIBS)
+
+orcus-csv$(EXEEXT): $(orcus_csv_OBJECTS) $(orcus_csv_DEPENDENCIES) $(EXTRA_orcus_csv_DEPENDENCIES)
+ @rm -f orcus-csv$(EXEEXT)
+ $(AM_V_CXXLD)$(orcus_csv_LINK) $(orcus_csv_OBJECTS) $(orcus_csv_LDADD) $(LIBS)
+
+orcus-detect$(EXEEXT): $(orcus_detect_OBJECTS) $(orcus_detect_DEPENDENCIES) $(EXTRA_orcus_detect_DEPENDENCIES)
+ @rm -f orcus-detect$(EXEEXT)
+ $(AM_V_CXXLD)$(orcus_detect_LINK) $(orcus_detect_OBJECTS) $(orcus_detect_LDADD) $(LIBS)
+
+orcus-env-dump$(EXEEXT): $(orcus_env_dump_OBJECTS) $(orcus_env_dump_DEPENDENCIES) $(EXTRA_orcus_env_dump_DEPENDENCIES)
+ @rm -f orcus-env-dump$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(orcus_env_dump_OBJECTS) $(orcus_env_dump_LDADD) $(LIBS)
+
+orcus-gnumeric$(EXEEXT): $(orcus_gnumeric_OBJECTS) $(orcus_gnumeric_DEPENDENCIES) $(EXTRA_orcus_gnumeric_DEPENDENCIES)
+ @rm -f orcus-gnumeric$(EXEEXT)
+ $(AM_V_CXXLD)$(orcus_gnumeric_LINK) $(orcus_gnumeric_OBJECTS) $(orcus_gnumeric_LDADD) $(LIBS)
+
+orcus-json$(EXEEXT): $(orcus_json_OBJECTS) $(orcus_json_DEPENDENCIES) $(EXTRA_orcus_json_DEPENDENCIES)
+ @rm -f orcus-json$(EXEEXT)
+ $(AM_V_CXXLD)$(orcus_json_LINK) $(orcus_json_OBJECTS) $(orcus_json_LDADD) $(LIBS)
+
+orcus-mso-encryption$(EXEEXT): $(orcus_mso_encryption_OBJECTS) $(orcus_mso_encryption_DEPENDENCIES) $(EXTRA_orcus_mso_encryption_DEPENDENCIES)
+ @rm -f orcus-mso-encryption$(EXEEXT)
+ $(AM_V_CXXLD)$(orcus_mso_encryption_LINK) $(orcus_mso_encryption_OBJECTS) $(orcus_mso_encryption_LDADD) $(LIBS)
+
+orcus-ods$(EXEEXT): $(orcus_ods_OBJECTS) $(orcus_ods_DEPENDENCIES) $(EXTRA_orcus_ods_DEPENDENCIES)
+ @rm -f orcus-ods$(EXEEXT)
+ $(AM_V_CXXLD)$(orcus_ods_LINK) $(orcus_ods_OBJECTS) $(orcus_ods_LDADD) $(LIBS)
+
+orcus-parquet$(EXEEXT): $(orcus_parquet_OBJECTS) $(orcus_parquet_DEPENDENCIES) $(EXTRA_orcus_parquet_DEPENDENCIES)
+ @rm -f orcus-parquet$(EXEEXT)
+ $(AM_V_CXXLD)$(orcus_parquet_LINK) $(orcus_parquet_OBJECTS) $(orcus_parquet_LDADD) $(LIBS)
+
+orcus-styles-ods$(EXEEXT): $(orcus_styles_ods_OBJECTS) $(orcus_styles_ods_DEPENDENCIES) $(EXTRA_orcus_styles_ods_DEPENDENCIES)
+ @rm -f orcus-styles-ods$(EXEEXT)
+ $(AM_V_CXXLD)$(orcus_styles_ods_LINK) $(orcus_styles_ods_OBJECTS) $(orcus_styles_ods_LDADD) $(LIBS)
+
+orcus-test-csv$(EXEEXT): $(orcus_test_csv_OBJECTS) $(orcus_test_csv_DEPENDENCIES) $(EXTRA_orcus_test_csv_DEPENDENCIES)
+ @rm -f orcus-test-csv$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(orcus_test_csv_OBJECTS) $(orcus_test_csv_LDADD) $(LIBS)
+
+orcus-test-gnumeric$(EXEEXT): $(orcus_test_gnumeric_OBJECTS) $(orcus_test_gnumeric_DEPENDENCIES) $(EXTRA_orcus_test_gnumeric_DEPENDENCIES)
+ @rm -f orcus-test-gnumeric$(EXEEXT)
+ $(AM_V_CXXLD)$(orcus_test_gnumeric_LINK) $(orcus_test_gnumeric_OBJECTS) $(orcus_test_gnumeric_LDADD) $(LIBS)
+
+orcus-test-import-ods$(EXEEXT): $(orcus_test_import_ods_OBJECTS) $(orcus_test_import_ods_DEPENDENCIES) $(EXTRA_orcus_test_import_ods_DEPENDENCIES)
+ @rm -f orcus-test-import-ods$(EXEEXT)
+ $(AM_V_CXXLD)$(orcus_test_import_ods_LINK) $(orcus_test_import_ods_OBJECTS) $(orcus_test_import_ods_LDADD) $(LIBS)
+
+orcus-test-json-mapped$(EXEEXT): $(orcus_test_json_mapped_OBJECTS) $(orcus_test_json_mapped_DEPENDENCIES) $(EXTRA_orcus_test_json_mapped_DEPENDENCIES)
+ @rm -f orcus-test-json-mapped$(EXEEXT)
+ $(AM_V_CXXLD)$(orcus_test_json_mapped_LINK) $(orcus_test_json_mapped_OBJECTS) $(orcus_test_json_mapped_LDADD) $(LIBS)
+
+orcus-test-ods$(EXEEXT): $(orcus_test_ods_OBJECTS) $(orcus_test_ods_DEPENDENCIES) $(EXTRA_orcus_test_ods_DEPENDENCIES)
+ @rm -f orcus-test-ods$(EXEEXT)
+ $(AM_V_CXXLD)$(orcus_test_ods_LINK) $(orcus_test_ods_OBJECTS) $(orcus_test_ods_LDADD) $(LIBS)
+
+orcus-test-parquet$(EXEEXT): $(orcus_test_parquet_OBJECTS) $(orcus_test_parquet_DEPENDENCIES) $(EXTRA_orcus_test_parquet_DEPENDENCIES)
+ @rm -f orcus-test-parquet$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(orcus_test_parquet_OBJECTS) $(orcus_test_parquet_LDADD) $(LIBS)
+
+orcus-test-xls-xml$(EXEEXT): $(orcus_test_xls_xml_OBJECTS) $(orcus_test_xls_xml_DEPENDENCIES) $(EXTRA_orcus_test_xls_xml_DEPENDENCIES)
+ @rm -f orcus-test-xls-xml$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(orcus_test_xls_xml_OBJECTS) $(orcus_test_xls_xml_LDADD) $(LIBS)
+
+orcus-test-xlsx$(EXEEXT): $(orcus_test_xlsx_OBJECTS) $(orcus_test_xlsx_DEPENDENCIES) $(EXTRA_orcus_test_xlsx_DEPENDENCIES)
+ @rm -f orcus-test-xlsx$(EXEEXT)
+ $(AM_V_CXXLD)$(orcus_test_xlsx_LINK) $(orcus_test_xlsx_OBJECTS) $(orcus_test_xlsx_LDADD) $(LIBS)
+
+orcus-test-xml$(EXEEXT): $(orcus_test_xml_OBJECTS) $(orcus_test_xml_DEPENDENCIES) $(EXTRA_orcus_test_xml_DEPENDENCIES)
+ @rm -f orcus-test-xml$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(orcus_test_xml_OBJECTS) $(orcus_test_xml_LDADD) $(LIBS)
+
+orcus-test-xml-mapped$(EXEEXT): $(orcus_test_xml_mapped_OBJECTS) $(orcus_test_xml_mapped_DEPENDENCIES) $(EXTRA_orcus_test_xml_mapped_DEPENDENCIES)
+ @rm -f orcus-test-xml-mapped$(EXEEXT)
+ $(AM_V_CXXLD)$(orcus_test_xml_mapped_LINK) $(orcus_test_xml_mapped_OBJECTS) $(orcus_test_xml_mapped_LDADD) $(LIBS)
+
+orcus-xls-xml$(EXEEXT): $(orcus_xls_xml_OBJECTS) $(orcus_xls_xml_DEPENDENCIES) $(EXTRA_orcus_xls_xml_DEPENDENCIES)
+ @rm -f orcus-xls-xml$(EXEEXT)
+ $(AM_V_CXXLD)$(orcus_xls_xml_LINK) $(orcus_xls_xml_OBJECTS) $(orcus_xls_xml_LDADD) $(LIBS)
+
+orcus-xlsx$(EXEEXT): $(orcus_xlsx_OBJECTS) $(orcus_xlsx_DEPENDENCIES) $(EXTRA_orcus_xlsx_DEPENDENCIES)
+ @rm -f orcus-xlsx$(EXEEXT)
+ $(AM_V_CXXLD)$(orcus_xlsx_LINK) $(orcus_xlsx_OBJECTS) $(orcus_xlsx_LDADD) $(LIBS)
+
+orcus-xml$(EXEEXT): $(orcus_xml_OBJECTS) $(orcus_xml_DEPENDENCIES) $(EXTRA_orcus_xml_DEPENDENCIES)
+ @rm -f orcus-xml$(EXEEXT)
+ $(AM_V_CXXLD)$(orcus_xml_LINK) $(orcus_xml_OBJECTS) $(orcus_xml_LDADD) $(LIBS)
+
+orcus-yaml$(EXEEXT): $(orcus_yaml_OBJECTS) $(orcus_yaml_DEPENDENCIES) $(EXTRA_orcus_yaml_DEPENDENCIES)
+ @rm -f orcus-yaml$(EXEEXT)
+ $(AM_V_CXXLD)$(orcus_yaml_LINK) $(orcus_yaml_OBJECTS) $(orcus_yaml_LDADD) $(LIBS)
+
+orcus-zip-dump$(EXEEXT): $(orcus_zip_dump_OBJECTS) $(orcus_zip_dump_DEPENDENCIES) $(EXTRA_orcus_zip_dump_DEPENDENCIES)
+ @rm -f orcus-zip-dump$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(orcus_zip_dump_OBJECTS) $(orcus_zip_dump_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_css_dump-orcus_css_dump.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_csv-orcus_csv_main.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_csv-orcus_filter_global.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_detect-orcus_detect_main.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_env_dump-orcus_env_dump.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_filter_global.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_gnumeric-orcus_filter_global.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_gnumeric-orcus_gnumeric_main.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_json-cli_global.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_json-orcus_json_cli.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_json-orcus_json_cli_map.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_mso_encryption-orcus_mso_encryption.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_ods-orcus_filter_global.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_ods-orcus_ods_main.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_parquet_main.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_styles_ods-orcus_filter_global.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_styles_ods-orcus_ods_styles.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_test_csv-orcus_test_csv.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_test_csv-orcus_test_global.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_test_gnumeric-orcus_test_global.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_test_gnumeric-orcus_test_gnumeric.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_test_import_ods-orcus_test_import_ods.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_test_json_mapped-orcus_test_json_mapped.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_test_ods-orcus_test_ods.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_test_parquet-orcus_test_parquet.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_test_xls_xml-orcus_test_global.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_test_xls_xml-orcus_test_xls_xml.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_test_xlsx-orcus_test_xlsx.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_test_xml-orcus_test_xml.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_test_xml_mapped-orcus_test_global.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_test_xml_mapped-orcus_test_xml_mapped.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_xls_xml-orcus_filter_global.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_xls_xml-orcus_xls_xml_main.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_xlsx-orcus_filter_global.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_xlsx-orcus_xlsx_main.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_xml-cli_global.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_xml-orcus_filter_global.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_xml-orcus_xml_main.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_yaml-orcus_yaml_main.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orcus_zip_dump-orcus_zip_dump.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.cpp.o:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cpp.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cpp.lo:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+orcus_css_dump-orcus_css_dump.o: orcus_css_dump.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_css_dump_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_css_dump-orcus_css_dump.o -MD -MP -MF $(DEPDIR)/orcus_css_dump-orcus_css_dump.Tpo -c -o orcus_css_dump-orcus_css_dump.o `test -f 'orcus_css_dump.cpp' || echo '$(srcdir)/'`orcus_css_dump.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_css_dump-orcus_css_dump.Tpo $(DEPDIR)/orcus_css_dump-orcus_css_dump.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_css_dump.cpp' object='orcus_css_dump-orcus_css_dump.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_css_dump_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_css_dump-orcus_css_dump.o `test -f 'orcus_css_dump.cpp' || echo '$(srcdir)/'`orcus_css_dump.cpp
+
+orcus_css_dump-orcus_css_dump.obj: orcus_css_dump.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_css_dump_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_css_dump-orcus_css_dump.obj -MD -MP -MF $(DEPDIR)/orcus_css_dump-orcus_css_dump.Tpo -c -o orcus_css_dump-orcus_css_dump.obj `if test -f 'orcus_css_dump.cpp'; then $(CYGPATH_W) 'orcus_css_dump.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_css_dump.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_css_dump-orcus_css_dump.Tpo $(DEPDIR)/orcus_css_dump-orcus_css_dump.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_css_dump.cpp' object='orcus_css_dump-orcus_css_dump.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_css_dump_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_css_dump-orcus_css_dump.obj `if test -f 'orcus_css_dump.cpp'; then $(CYGPATH_W) 'orcus_css_dump.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_css_dump.cpp'; fi`
+
+orcus_csv-orcus_filter_global.o: orcus_filter_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_csv_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_csv-orcus_filter_global.o -MD -MP -MF $(DEPDIR)/orcus_csv-orcus_filter_global.Tpo -c -o orcus_csv-orcus_filter_global.o `test -f 'orcus_filter_global.cpp' || echo '$(srcdir)/'`orcus_filter_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_csv-orcus_filter_global.Tpo $(DEPDIR)/orcus_csv-orcus_filter_global.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_filter_global.cpp' object='orcus_csv-orcus_filter_global.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_csv_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_csv-orcus_filter_global.o `test -f 'orcus_filter_global.cpp' || echo '$(srcdir)/'`orcus_filter_global.cpp
+
+orcus_csv-orcus_filter_global.obj: orcus_filter_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_csv_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_csv-orcus_filter_global.obj -MD -MP -MF $(DEPDIR)/orcus_csv-orcus_filter_global.Tpo -c -o orcus_csv-orcus_filter_global.obj `if test -f 'orcus_filter_global.cpp'; then $(CYGPATH_W) 'orcus_filter_global.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_filter_global.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_csv-orcus_filter_global.Tpo $(DEPDIR)/orcus_csv-orcus_filter_global.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_filter_global.cpp' object='orcus_csv-orcus_filter_global.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_csv_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_csv-orcus_filter_global.obj `if test -f 'orcus_filter_global.cpp'; then $(CYGPATH_W) 'orcus_filter_global.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_filter_global.cpp'; fi`
+
+orcus_csv-orcus_csv_main.o: orcus_csv_main.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_csv_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_csv-orcus_csv_main.o -MD -MP -MF $(DEPDIR)/orcus_csv-orcus_csv_main.Tpo -c -o orcus_csv-orcus_csv_main.o `test -f 'orcus_csv_main.cpp' || echo '$(srcdir)/'`orcus_csv_main.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_csv-orcus_csv_main.Tpo $(DEPDIR)/orcus_csv-orcus_csv_main.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_csv_main.cpp' object='orcus_csv-orcus_csv_main.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_csv_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_csv-orcus_csv_main.o `test -f 'orcus_csv_main.cpp' || echo '$(srcdir)/'`orcus_csv_main.cpp
+
+orcus_csv-orcus_csv_main.obj: orcus_csv_main.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_csv_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_csv-orcus_csv_main.obj -MD -MP -MF $(DEPDIR)/orcus_csv-orcus_csv_main.Tpo -c -o orcus_csv-orcus_csv_main.obj `if test -f 'orcus_csv_main.cpp'; then $(CYGPATH_W) 'orcus_csv_main.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_csv_main.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_csv-orcus_csv_main.Tpo $(DEPDIR)/orcus_csv-orcus_csv_main.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_csv_main.cpp' object='orcus_csv-orcus_csv_main.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_csv_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_csv-orcus_csv_main.obj `if test -f 'orcus_csv_main.cpp'; then $(CYGPATH_W) 'orcus_csv_main.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_csv_main.cpp'; fi`
+
+orcus_detect-orcus_detect_main.o: orcus_detect_main.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_detect_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_detect-orcus_detect_main.o -MD -MP -MF $(DEPDIR)/orcus_detect-orcus_detect_main.Tpo -c -o orcus_detect-orcus_detect_main.o `test -f 'orcus_detect_main.cpp' || echo '$(srcdir)/'`orcus_detect_main.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_detect-orcus_detect_main.Tpo $(DEPDIR)/orcus_detect-orcus_detect_main.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_detect_main.cpp' object='orcus_detect-orcus_detect_main.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_detect_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_detect-orcus_detect_main.o `test -f 'orcus_detect_main.cpp' || echo '$(srcdir)/'`orcus_detect_main.cpp
+
+orcus_detect-orcus_detect_main.obj: orcus_detect_main.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_detect_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_detect-orcus_detect_main.obj -MD -MP -MF $(DEPDIR)/orcus_detect-orcus_detect_main.Tpo -c -o orcus_detect-orcus_detect_main.obj `if test -f 'orcus_detect_main.cpp'; then $(CYGPATH_W) 'orcus_detect_main.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_detect_main.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_detect-orcus_detect_main.Tpo $(DEPDIR)/orcus_detect-orcus_detect_main.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_detect_main.cpp' object='orcus_detect-orcus_detect_main.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_detect_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_detect-orcus_detect_main.obj `if test -f 'orcus_detect_main.cpp'; then $(CYGPATH_W) 'orcus_detect_main.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_detect_main.cpp'; fi`
+
+orcus_env_dump-orcus_env_dump.o: orcus_env_dump.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_env_dump_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_env_dump-orcus_env_dump.o -MD -MP -MF $(DEPDIR)/orcus_env_dump-orcus_env_dump.Tpo -c -o orcus_env_dump-orcus_env_dump.o `test -f 'orcus_env_dump.cpp' || echo '$(srcdir)/'`orcus_env_dump.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_env_dump-orcus_env_dump.Tpo $(DEPDIR)/orcus_env_dump-orcus_env_dump.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_env_dump.cpp' object='orcus_env_dump-orcus_env_dump.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_env_dump_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_env_dump-orcus_env_dump.o `test -f 'orcus_env_dump.cpp' || echo '$(srcdir)/'`orcus_env_dump.cpp
+
+orcus_env_dump-orcus_env_dump.obj: orcus_env_dump.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_env_dump_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_env_dump-orcus_env_dump.obj -MD -MP -MF $(DEPDIR)/orcus_env_dump-orcus_env_dump.Tpo -c -o orcus_env_dump-orcus_env_dump.obj `if test -f 'orcus_env_dump.cpp'; then $(CYGPATH_W) 'orcus_env_dump.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_env_dump.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_env_dump-orcus_env_dump.Tpo $(DEPDIR)/orcus_env_dump-orcus_env_dump.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_env_dump.cpp' object='orcus_env_dump-orcus_env_dump.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_env_dump_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_env_dump-orcus_env_dump.obj `if test -f 'orcus_env_dump.cpp'; then $(CYGPATH_W) 'orcus_env_dump.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_env_dump.cpp'; fi`
+
+orcus_gnumeric-orcus_filter_global.o: orcus_filter_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_gnumeric_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_gnumeric-orcus_filter_global.o -MD -MP -MF $(DEPDIR)/orcus_gnumeric-orcus_filter_global.Tpo -c -o orcus_gnumeric-orcus_filter_global.o `test -f 'orcus_filter_global.cpp' || echo '$(srcdir)/'`orcus_filter_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_gnumeric-orcus_filter_global.Tpo $(DEPDIR)/orcus_gnumeric-orcus_filter_global.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_filter_global.cpp' object='orcus_gnumeric-orcus_filter_global.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_gnumeric_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_gnumeric-orcus_filter_global.o `test -f 'orcus_filter_global.cpp' || echo '$(srcdir)/'`orcus_filter_global.cpp
+
+orcus_gnumeric-orcus_filter_global.obj: orcus_filter_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_gnumeric_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_gnumeric-orcus_filter_global.obj -MD -MP -MF $(DEPDIR)/orcus_gnumeric-orcus_filter_global.Tpo -c -o orcus_gnumeric-orcus_filter_global.obj `if test -f 'orcus_filter_global.cpp'; then $(CYGPATH_W) 'orcus_filter_global.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_filter_global.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_gnumeric-orcus_filter_global.Tpo $(DEPDIR)/orcus_gnumeric-orcus_filter_global.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_filter_global.cpp' object='orcus_gnumeric-orcus_filter_global.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_gnumeric_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_gnumeric-orcus_filter_global.obj `if test -f 'orcus_filter_global.cpp'; then $(CYGPATH_W) 'orcus_filter_global.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_filter_global.cpp'; fi`
+
+orcus_gnumeric-orcus_gnumeric_main.o: orcus_gnumeric_main.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_gnumeric_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_gnumeric-orcus_gnumeric_main.o -MD -MP -MF $(DEPDIR)/orcus_gnumeric-orcus_gnumeric_main.Tpo -c -o orcus_gnumeric-orcus_gnumeric_main.o `test -f 'orcus_gnumeric_main.cpp' || echo '$(srcdir)/'`orcus_gnumeric_main.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_gnumeric-orcus_gnumeric_main.Tpo $(DEPDIR)/orcus_gnumeric-orcus_gnumeric_main.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_gnumeric_main.cpp' object='orcus_gnumeric-orcus_gnumeric_main.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_gnumeric_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_gnumeric-orcus_gnumeric_main.o `test -f 'orcus_gnumeric_main.cpp' || echo '$(srcdir)/'`orcus_gnumeric_main.cpp
+
+orcus_gnumeric-orcus_gnumeric_main.obj: orcus_gnumeric_main.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_gnumeric_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_gnumeric-orcus_gnumeric_main.obj -MD -MP -MF $(DEPDIR)/orcus_gnumeric-orcus_gnumeric_main.Tpo -c -o orcus_gnumeric-orcus_gnumeric_main.obj `if test -f 'orcus_gnumeric_main.cpp'; then $(CYGPATH_W) 'orcus_gnumeric_main.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_gnumeric_main.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_gnumeric-orcus_gnumeric_main.Tpo $(DEPDIR)/orcus_gnumeric-orcus_gnumeric_main.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_gnumeric_main.cpp' object='orcus_gnumeric-orcus_gnumeric_main.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_gnumeric_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_gnumeric-orcus_gnumeric_main.obj `if test -f 'orcus_gnumeric_main.cpp'; then $(CYGPATH_W) 'orcus_gnumeric_main.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_gnumeric_main.cpp'; fi`
+
+orcus_json-orcus_json_cli.o: orcus_json_cli.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_json_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_json-orcus_json_cli.o -MD -MP -MF $(DEPDIR)/orcus_json-orcus_json_cli.Tpo -c -o orcus_json-orcus_json_cli.o `test -f 'orcus_json_cli.cpp' || echo '$(srcdir)/'`orcus_json_cli.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_json-orcus_json_cli.Tpo $(DEPDIR)/orcus_json-orcus_json_cli.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_json_cli.cpp' object='orcus_json-orcus_json_cli.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_json_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_json-orcus_json_cli.o `test -f 'orcus_json_cli.cpp' || echo '$(srcdir)/'`orcus_json_cli.cpp
+
+orcus_json-orcus_json_cli.obj: orcus_json_cli.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_json_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_json-orcus_json_cli.obj -MD -MP -MF $(DEPDIR)/orcus_json-orcus_json_cli.Tpo -c -o orcus_json-orcus_json_cli.obj `if test -f 'orcus_json_cli.cpp'; then $(CYGPATH_W) 'orcus_json_cli.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_json_cli.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_json-orcus_json_cli.Tpo $(DEPDIR)/orcus_json-orcus_json_cli.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_json_cli.cpp' object='orcus_json-orcus_json_cli.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_json_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_json-orcus_json_cli.obj `if test -f 'orcus_json_cli.cpp'; then $(CYGPATH_W) 'orcus_json_cli.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_json_cli.cpp'; fi`
+
+orcus_json-cli_global.o: cli_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_json_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_json-cli_global.o -MD -MP -MF $(DEPDIR)/orcus_json-cli_global.Tpo -c -o orcus_json-cli_global.o `test -f 'cli_global.cpp' || echo '$(srcdir)/'`cli_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_json-cli_global.Tpo $(DEPDIR)/orcus_json-cli_global.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cli_global.cpp' object='orcus_json-cli_global.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_json_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_json-cli_global.o `test -f 'cli_global.cpp' || echo '$(srcdir)/'`cli_global.cpp
+
+orcus_json-cli_global.obj: cli_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_json_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_json-cli_global.obj -MD -MP -MF $(DEPDIR)/orcus_json-cli_global.Tpo -c -o orcus_json-cli_global.obj `if test -f 'cli_global.cpp'; then $(CYGPATH_W) 'cli_global.cpp'; else $(CYGPATH_W) '$(srcdir)/cli_global.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_json-cli_global.Tpo $(DEPDIR)/orcus_json-cli_global.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cli_global.cpp' object='orcus_json-cli_global.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_json_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_json-cli_global.obj `if test -f 'cli_global.cpp'; then $(CYGPATH_W) 'cli_global.cpp'; else $(CYGPATH_W) '$(srcdir)/cli_global.cpp'; fi`
+
+orcus_json-orcus_json_cli_map.o: orcus_json_cli_map.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_json_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_json-orcus_json_cli_map.o -MD -MP -MF $(DEPDIR)/orcus_json-orcus_json_cli_map.Tpo -c -o orcus_json-orcus_json_cli_map.o `test -f 'orcus_json_cli_map.cpp' || echo '$(srcdir)/'`orcus_json_cli_map.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_json-orcus_json_cli_map.Tpo $(DEPDIR)/orcus_json-orcus_json_cli_map.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_json_cli_map.cpp' object='orcus_json-orcus_json_cli_map.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_json_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_json-orcus_json_cli_map.o `test -f 'orcus_json_cli_map.cpp' || echo '$(srcdir)/'`orcus_json_cli_map.cpp
+
+orcus_json-orcus_json_cli_map.obj: orcus_json_cli_map.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_json_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_json-orcus_json_cli_map.obj -MD -MP -MF $(DEPDIR)/orcus_json-orcus_json_cli_map.Tpo -c -o orcus_json-orcus_json_cli_map.obj `if test -f 'orcus_json_cli_map.cpp'; then $(CYGPATH_W) 'orcus_json_cli_map.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_json_cli_map.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_json-orcus_json_cli_map.Tpo $(DEPDIR)/orcus_json-orcus_json_cli_map.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_json_cli_map.cpp' object='orcus_json-orcus_json_cli_map.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_json_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_json-orcus_json_cli_map.obj `if test -f 'orcus_json_cli_map.cpp'; then $(CYGPATH_W) 'orcus_json_cli_map.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_json_cli_map.cpp'; fi`
+
+orcus_mso_encryption-orcus_mso_encryption.o: orcus_mso_encryption.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_mso_encryption_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_mso_encryption-orcus_mso_encryption.o -MD -MP -MF $(DEPDIR)/orcus_mso_encryption-orcus_mso_encryption.Tpo -c -o orcus_mso_encryption-orcus_mso_encryption.o `test -f 'orcus_mso_encryption.cpp' || echo '$(srcdir)/'`orcus_mso_encryption.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_mso_encryption-orcus_mso_encryption.Tpo $(DEPDIR)/orcus_mso_encryption-orcus_mso_encryption.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_mso_encryption.cpp' object='orcus_mso_encryption-orcus_mso_encryption.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_mso_encryption_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_mso_encryption-orcus_mso_encryption.o `test -f 'orcus_mso_encryption.cpp' || echo '$(srcdir)/'`orcus_mso_encryption.cpp
+
+orcus_mso_encryption-orcus_mso_encryption.obj: orcus_mso_encryption.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_mso_encryption_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_mso_encryption-orcus_mso_encryption.obj -MD -MP -MF $(DEPDIR)/orcus_mso_encryption-orcus_mso_encryption.Tpo -c -o orcus_mso_encryption-orcus_mso_encryption.obj `if test -f 'orcus_mso_encryption.cpp'; then $(CYGPATH_W) 'orcus_mso_encryption.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_mso_encryption.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_mso_encryption-orcus_mso_encryption.Tpo $(DEPDIR)/orcus_mso_encryption-orcus_mso_encryption.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_mso_encryption.cpp' object='orcus_mso_encryption-orcus_mso_encryption.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_mso_encryption_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_mso_encryption-orcus_mso_encryption.obj `if test -f 'orcus_mso_encryption.cpp'; then $(CYGPATH_W) 'orcus_mso_encryption.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_mso_encryption.cpp'; fi`
+
+orcus_ods-orcus_filter_global.o: orcus_filter_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_ods_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_ods-orcus_filter_global.o -MD -MP -MF $(DEPDIR)/orcus_ods-orcus_filter_global.Tpo -c -o orcus_ods-orcus_filter_global.o `test -f 'orcus_filter_global.cpp' || echo '$(srcdir)/'`orcus_filter_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_ods-orcus_filter_global.Tpo $(DEPDIR)/orcus_ods-orcus_filter_global.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_filter_global.cpp' object='orcus_ods-orcus_filter_global.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_ods_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_ods-orcus_filter_global.o `test -f 'orcus_filter_global.cpp' || echo '$(srcdir)/'`orcus_filter_global.cpp
+
+orcus_ods-orcus_filter_global.obj: orcus_filter_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_ods_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_ods-orcus_filter_global.obj -MD -MP -MF $(DEPDIR)/orcus_ods-orcus_filter_global.Tpo -c -o orcus_ods-orcus_filter_global.obj `if test -f 'orcus_filter_global.cpp'; then $(CYGPATH_W) 'orcus_filter_global.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_filter_global.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_ods-orcus_filter_global.Tpo $(DEPDIR)/orcus_ods-orcus_filter_global.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_filter_global.cpp' object='orcus_ods-orcus_filter_global.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_ods_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_ods-orcus_filter_global.obj `if test -f 'orcus_filter_global.cpp'; then $(CYGPATH_W) 'orcus_filter_global.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_filter_global.cpp'; fi`
+
+orcus_ods-orcus_ods_main.o: orcus_ods_main.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_ods_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_ods-orcus_ods_main.o -MD -MP -MF $(DEPDIR)/orcus_ods-orcus_ods_main.Tpo -c -o orcus_ods-orcus_ods_main.o `test -f 'orcus_ods_main.cpp' || echo '$(srcdir)/'`orcus_ods_main.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_ods-orcus_ods_main.Tpo $(DEPDIR)/orcus_ods-orcus_ods_main.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_ods_main.cpp' object='orcus_ods-orcus_ods_main.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_ods_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_ods-orcus_ods_main.o `test -f 'orcus_ods_main.cpp' || echo '$(srcdir)/'`orcus_ods_main.cpp
+
+orcus_ods-orcus_ods_main.obj: orcus_ods_main.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_ods_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_ods-orcus_ods_main.obj -MD -MP -MF $(DEPDIR)/orcus_ods-orcus_ods_main.Tpo -c -o orcus_ods-orcus_ods_main.obj `if test -f 'orcus_ods_main.cpp'; then $(CYGPATH_W) 'orcus_ods_main.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_ods_main.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_ods-orcus_ods_main.Tpo $(DEPDIR)/orcus_ods-orcus_ods_main.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_ods_main.cpp' object='orcus_ods-orcus_ods_main.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_ods_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_ods-orcus_ods_main.obj `if test -f 'orcus_ods_main.cpp'; then $(CYGPATH_W) 'orcus_ods_main.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_ods_main.cpp'; fi`
+
+orcus_styles_ods-orcus_filter_global.o: orcus_filter_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_styles_ods_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_styles_ods-orcus_filter_global.o -MD -MP -MF $(DEPDIR)/orcus_styles_ods-orcus_filter_global.Tpo -c -o orcus_styles_ods-orcus_filter_global.o `test -f 'orcus_filter_global.cpp' || echo '$(srcdir)/'`orcus_filter_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_styles_ods-orcus_filter_global.Tpo $(DEPDIR)/orcus_styles_ods-orcus_filter_global.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_filter_global.cpp' object='orcus_styles_ods-orcus_filter_global.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_styles_ods_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_styles_ods-orcus_filter_global.o `test -f 'orcus_filter_global.cpp' || echo '$(srcdir)/'`orcus_filter_global.cpp
+
+orcus_styles_ods-orcus_filter_global.obj: orcus_filter_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_styles_ods_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_styles_ods-orcus_filter_global.obj -MD -MP -MF $(DEPDIR)/orcus_styles_ods-orcus_filter_global.Tpo -c -o orcus_styles_ods-orcus_filter_global.obj `if test -f 'orcus_filter_global.cpp'; then $(CYGPATH_W) 'orcus_filter_global.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_filter_global.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_styles_ods-orcus_filter_global.Tpo $(DEPDIR)/orcus_styles_ods-orcus_filter_global.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_filter_global.cpp' object='orcus_styles_ods-orcus_filter_global.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_styles_ods_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_styles_ods-orcus_filter_global.obj `if test -f 'orcus_filter_global.cpp'; then $(CYGPATH_W) 'orcus_filter_global.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_filter_global.cpp'; fi`
+
+orcus_styles_ods-orcus_ods_styles.o: orcus_ods_styles.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_styles_ods_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_styles_ods-orcus_ods_styles.o -MD -MP -MF $(DEPDIR)/orcus_styles_ods-orcus_ods_styles.Tpo -c -o orcus_styles_ods-orcus_ods_styles.o `test -f 'orcus_ods_styles.cpp' || echo '$(srcdir)/'`orcus_ods_styles.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_styles_ods-orcus_ods_styles.Tpo $(DEPDIR)/orcus_styles_ods-orcus_ods_styles.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_ods_styles.cpp' object='orcus_styles_ods-orcus_ods_styles.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_styles_ods_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_styles_ods-orcus_ods_styles.o `test -f 'orcus_ods_styles.cpp' || echo '$(srcdir)/'`orcus_ods_styles.cpp
+
+orcus_styles_ods-orcus_ods_styles.obj: orcus_ods_styles.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_styles_ods_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_styles_ods-orcus_ods_styles.obj -MD -MP -MF $(DEPDIR)/orcus_styles_ods-orcus_ods_styles.Tpo -c -o orcus_styles_ods-orcus_ods_styles.obj `if test -f 'orcus_ods_styles.cpp'; then $(CYGPATH_W) 'orcus_ods_styles.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_ods_styles.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_styles_ods-orcus_ods_styles.Tpo $(DEPDIR)/orcus_styles_ods-orcus_ods_styles.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_ods_styles.cpp' object='orcus_styles_ods-orcus_ods_styles.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_styles_ods_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_styles_ods-orcus_ods_styles.obj `if test -f 'orcus_ods_styles.cpp'; then $(CYGPATH_W) 'orcus_ods_styles.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_ods_styles.cpp'; fi`
+
+orcus_test_csv-orcus_test_csv.o: orcus_test_csv.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_csv_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_test_csv-orcus_test_csv.o -MD -MP -MF $(DEPDIR)/orcus_test_csv-orcus_test_csv.Tpo -c -o orcus_test_csv-orcus_test_csv.o `test -f 'orcus_test_csv.cpp' || echo '$(srcdir)/'`orcus_test_csv.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_test_csv-orcus_test_csv.Tpo $(DEPDIR)/orcus_test_csv-orcus_test_csv.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_test_csv.cpp' object='orcus_test_csv-orcus_test_csv.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_csv_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_test_csv-orcus_test_csv.o `test -f 'orcus_test_csv.cpp' || echo '$(srcdir)/'`orcus_test_csv.cpp
+
+orcus_test_csv-orcus_test_csv.obj: orcus_test_csv.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_csv_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_test_csv-orcus_test_csv.obj -MD -MP -MF $(DEPDIR)/orcus_test_csv-orcus_test_csv.Tpo -c -o orcus_test_csv-orcus_test_csv.obj `if test -f 'orcus_test_csv.cpp'; then $(CYGPATH_W) 'orcus_test_csv.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_test_csv.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_test_csv-orcus_test_csv.Tpo $(DEPDIR)/orcus_test_csv-orcus_test_csv.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_test_csv.cpp' object='orcus_test_csv-orcus_test_csv.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_csv_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_test_csv-orcus_test_csv.obj `if test -f 'orcus_test_csv.cpp'; then $(CYGPATH_W) 'orcus_test_csv.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_test_csv.cpp'; fi`
+
+orcus_test_csv-orcus_test_global.o: orcus_test_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_csv_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_test_csv-orcus_test_global.o -MD -MP -MF $(DEPDIR)/orcus_test_csv-orcus_test_global.Tpo -c -o orcus_test_csv-orcus_test_global.o `test -f 'orcus_test_global.cpp' || echo '$(srcdir)/'`orcus_test_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_test_csv-orcus_test_global.Tpo $(DEPDIR)/orcus_test_csv-orcus_test_global.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_test_global.cpp' object='orcus_test_csv-orcus_test_global.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_csv_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_test_csv-orcus_test_global.o `test -f 'orcus_test_global.cpp' || echo '$(srcdir)/'`orcus_test_global.cpp
+
+orcus_test_csv-orcus_test_global.obj: orcus_test_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_csv_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_test_csv-orcus_test_global.obj -MD -MP -MF $(DEPDIR)/orcus_test_csv-orcus_test_global.Tpo -c -o orcus_test_csv-orcus_test_global.obj `if test -f 'orcus_test_global.cpp'; then $(CYGPATH_W) 'orcus_test_global.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_test_global.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_test_csv-orcus_test_global.Tpo $(DEPDIR)/orcus_test_csv-orcus_test_global.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_test_global.cpp' object='orcus_test_csv-orcus_test_global.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_csv_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_test_csv-orcus_test_global.obj `if test -f 'orcus_test_global.cpp'; then $(CYGPATH_W) 'orcus_test_global.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_test_global.cpp'; fi`
+
+orcus_test_gnumeric-orcus_test_gnumeric.o: orcus_test_gnumeric.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_gnumeric_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_test_gnumeric-orcus_test_gnumeric.o -MD -MP -MF $(DEPDIR)/orcus_test_gnumeric-orcus_test_gnumeric.Tpo -c -o orcus_test_gnumeric-orcus_test_gnumeric.o `test -f 'orcus_test_gnumeric.cpp' || echo '$(srcdir)/'`orcus_test_gnumeric.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_test_gnumeric-orcus_test_gnumeric.Tpo $(DEPDIR)/orcus_test_gnumeric-orcus_test_gnumeric.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_test_gnumeric.cpp' object='orcus_test_gnumeric-orcus_test_gnumeric.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_gnumeric_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_test_gnumeric-orcus_test_gnumeric.o `test -f 'orcus_test_gnumeric.cpp' || echo '$(srcdir)/'`orcus_test_gnumeric.cpp
+
+orcus_test_gnumeric-orcus_test_gnumeric.obj: orcus_test_gnumeric.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_gnumeric_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_test_gnumeric-orcus_test_gnumeric.obj -MD -MP -MF $(DEPDIR)/orcus_test_gnumeric-orcus_test_gnumeric.Tpo -c -o orcus_test_gnumeric-orcus_test_gnumeric.obj `if test -f 'orcus_test_gnumeric.cpp'; then $(CYGPATH_W) 'orcus_test_gnumeric.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_test_gnumeric.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_test_gnumeric-orcus_test_gnumeric.Tpo $(DEPDIR)/orcus_test_gnumeric-orcus_test_gnumeric.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_test_gnumeric.cpp' object='orcus_test_gnumeric-orcus_test_gnumeric.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_gnumeric_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_test_gnumeric-orcus_test_gnumeric.obj `if test -f 'orcus_test_gnumeric.cpp'; then $(CYGPATH_W) 'orcus_test_gnumeric.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_test_gnumeric.cpp'; fi`
+
+orcus_test_gnumeric-orcus_test_global.o: orcus_test_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_gnumeric_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_test_gnumeric-orcus_test_global.o -MD -MP -MF $(DEPDIR)/orcus_test_gnumeric-orcus_test_global.Tpo -c -o orcus_test_gnumeric-orcus_test_global.o `test -f 'orcus_test_global.cpp' || echo '$(srcdir)/'`orcus_test_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_test_gnumeric-orcus_test_global.Tpo $(DEPDIR)/orcus_test_gnumeric-orcus_test_global.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_test_global.cpp' object='orcus_test_gnumeric-orcus_test_global.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_gnumeric_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_test_gnumeric-orcus_test_global.o `test -f 'orcus_test_global.cpp' || echo '$(srcdir)/'`orcus_test_global.cpp
+
+orcus_test_gnumeric-orcus_test_global.obj: orcus_test_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_gnumeric_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_test_gnumeric-orcus_test_global.obj -MD -MP -MF $(DEPDIR)/orcus_test_gnumeric-orcus_test_global.Tpo -c -o orcus_test_gnumeric-orcus_test_global.obj `if test -f 'orcus_test_global.cpp'; then $(CYGPATH_W) 'orcus_test_global.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_test_global.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_test_gnumeric-orcus_test_global.Tpo $(DEPDIR)/orcus_test_gnumeric-orcus_test_global.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_test_global.cpp' object='orcus_test_gnumeric-orcus_test_global.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_gnumeric_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_test_gnumeric-orcus_test_global.obj `if test -f 'orcus_test_global.cpp'; then $(CYGPATH_W) 'orcus_test_global.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_test_global.cpp'; fi`
+
+orcus_test_import_ods-orcus_test_import_ods.o: orcus_test_import_ods.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_import_ods_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_test_import_ods-orcus_test_import_ods.o -MD -MP -MF $(DEPDIR)/orcus_test_import_ods-orcus_test_import_ods.Tpo -c -o orcus_test_import_ods-orcus_test_import_ods.o `test -f 'orcus_test_import_ods.cpp' || echo '$(srcdir)/'`orcus_test_import_ods.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_test_import_ods-orcus_test_import_ods.Tpo $(DEPDIR)/orcus_test_import_ods-orcus_test_import_ods.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_test_import_ods.cpp' object='orcus_test_import_ods-orcus_test_import_ods.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_import_ods_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_test_import_ods-orcus_test_import_ods.o `test -f 'orcus_test_import_ods.cpp' || echo '$(srcdir)/'`orcus_test_import_ods.cpp
+
+orcus_test_import_ods-orcus_test_import_ods.obj: orcus_test_import_ods.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_import_ods_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_test_import_ods-orcus_test_import_ods.obj -MD -MP -MF $(DEPDIR)/orcus_test_import_ods-orcus_test_import_ods.Tpo -c -o orcus_test_import_ods-orcus_test_import_ods.obj `if test -f 'orcus_test_import_ods.cpp'; then $(CYGPATH_W) 'orcus_test_import_ods.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_test_import_ods.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_test_import_ods-orcus_test_import_ods.Tpo $(DEPDIR)/orcus_test_import_ods-orcus_test_import_ods.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_test_import_ods.cpp' object='orcus_test_import_ods-orcus_test_import_ods.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_import_ods_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_test_import_ods-orcus_test_import_ods.obj `if test -f 'orcus_test_import_ods.cpp'; then $(CYGPATH_W) 'orcus_test_import_ods.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_test_import_ods.cpp'; fi`
+
+orcus_test_json_mapped-orcus_test_json_mapped.o: orcus_test_json_mapped.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_json_mapped_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_test_json_mapped-orcus_test_json_mapped.o -MD -MP -MF $(DEPDIR)/orcus_test_json_mapped-orcus_test_json_mapped.Tpo -c -o orcus_test_json_mapped-orcus_test_json_mapped.o `test -f 'orcus_test_json_mapped.cpp' || echo '$(srcdir)/'`orcus_test_json_mapped.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_test_json_mapped-orcus_test_json_mapped.Tpo $(DEPDIR)/orcus_test_json_mapped-orcus_test_json_mapped.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_test_json_mapped.cpp' object='orcus_test_json_mapped-orcus_test_json_mapped.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_json_mapped_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_test_json_mapped-orcus_test_json_mapped.o `test -f 'orcus_test_json_mapped.cpp' || echo '$(srcdir)/'`orcus_test_json_mapped.cpp
+
+orcus_test_json_mapped-orcus_test_json_mapped.obj: orcus_test_json_mapped.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_json_mapped_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_test_json_mapped-orcus_test_json_mapped.obj -MD -MP -MF $(DEPDIR)/orcus_test_json_mapped-orcus_test_json_mapped.Tpo -c -o orcus_test_json_mapped-orcus_test_json_mapped.obj `if test -f 'orcus_test_json_mapped.cpp'; then $(CYGPATH_W) 'orcus_test_json_mapped.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_test_json_mapped.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_test_json_mapped-orcus_test_json_mapped.Tpo $(DEPDIR)/orcus_test_json_mapped-orcus_test_json_mapped.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_test_json_mapped.cpp' object='orcus_test_json_mapped-orcus_test_json_mapped.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_json_mapped_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_test_json_mapped-orcus_test_json_mapped.obj `if test -f 'orcus_test_json_mapped.cpp'; then $(CYGPATH_W) 'orcus_test_json_mapped.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_test_json_mapped.cpp'; fi`
+
+orcus_test_ods-orcus_test_ods.o: orcus_test_ods.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_ods_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_test_ods-orcus_test_ods.o -MD -MP -MF $(DEPDIR)/orcus_test_ods-orcus_test_ods.Tpo -c -o orcus_test_ods-orcus_test_ods.o `test -f 'orcus_test_ods.cpp' || echo '$(srcdir)/'`orcus_test_ods.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_test_ods-orcus_test_ods.Tpo $(DEPDIR)/orcus_test_ods-orcus_test_ods.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_test_ods.cpp' object='orcus_test_ods-orcus_test_ods.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_ods_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_test_ods-orcus_test_ods.o `test -f 'orcus_test_ods.cpp' || echo '$(srcdir)/'`orcus_test_ods.cpp
+
+orcus_test_ods-orcus_test_ods.obj: orcus_test_ods.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_ods_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_test_ods-orcus_test_ods.obj -MD -MP -MF $(DEPDIR)/orcus_test_ods-orcus_test_ods.Tpo -c -o orcus_test_ods-orcus_test_ods.obj `if test -f 'orcus_test_ods.cpp'; then $(CYGPATH_W) 'orcus_test_ods.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_test_ods.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_test_ods-orcus_test_ods.Tpo $(DEPDIR)/orcus_test_ods-orcus_test_ods.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_test_ods.cpp' object='orcus_test_ods-orcus_test_ods.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_ods_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_test_ods-orcus_test_ods.obj `if test -f 'orcus_test_ods.cpp'; then $(CYGPATH_W) 'orcus_test_ods.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_test_ods.cpp'; fi`
+
+orcus_test_parquet-orcus_test_parquet.o: orcus_test_parquet.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_parquet_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_test_parquet-orcus_test_parquet.o -MD -MP -MF $(DEPDIR)/orcus_test_parquet-orcus_test_parquet.Tpo -c -o orcus_test_parquet-orcus_test_parquet.o `test -f 'orcus_test_parquet.cpp' || echo '$(srcdir)/'`orcus_test_parquet.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_test_parquet-orcus_test_parquet.Tpo $(DEPDIR)/orcus_test_parquet-orcus_test_parquet.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_test_parquet.cpp' object='orcus_test_parquet-orcus_test_parquet.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_parquet_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_test_parquet-orcus_test_parquet.o `test -f 'orcus_test_parquet.cpp' || echo '$(srcdir)/'`orcus_test_parquet.cpp
+
+orcus_test_parquet-orcus_test_parquet.obj: orcus_test_parquet.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_parquet_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_test_parquet-orcus_test_parquet.obj -MD -MP -MF $(DEPDIR)/orcus_test_parquet-orcus_test_parquet.Tpo -c -o orcus_test_parquet-orcus_test_parquet.obj `if test -f 'orcus_test_parquet.cpp'; then $(CYGPATH_W) 'orcus_test_parquet.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_test_parquet.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_test_parquet-orcus_test_parquet.Tpo $(DEPDIR)/orcus_test_parquet-orcus_test_parquet.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_test_parquet.cpp' object='orcus_test_parquet-orcus_test_parquet.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_parquet_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_test_parquet-orcus_test_parquet.obj `if test -f 'orcus_test_parquet.cpp'; then $(CYGPATH_W) 'orcus_test_parquet.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_test_parquet.cpp'; fi`
+
+orcus_test_xls_xml-orcus_test_xls_xml.o: orcus_test_xls_xml.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_xls_xml_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_test_xls_xml-orcus_test_xls_xml.o -MD -MP -MF $(DEPDIR)/orcus_test_xls_xml-orcus_test_xls_xml.Tpo -c -o orcus_test_xls_xml-orcus_test_xls_xml.o `test -f 'orcus_test_xls_xml.cpp' || echo '$(srcdir)/'`orcus_test_xls_xml.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_test_xls_xml-orcus_test_xls_xml.Tpo $(DEPDIR)/orcus_test_xls_xml-orcus_test_xls_xml.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_test_xls_xml.cpp' object='orcus_test_xls_xml-orcus_test_xls_xml.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_xls_xml_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_test_xls_xml-orcus_test_xls_xml.o `test -f 'orcus_test_xls_xml.cpp' || echo '$(srcdir)/'`orcus_test_xls_xml.cpp
+
+orcus_test_xls_xml-orcus_test_xls_xml.obj: orcus_test_xls_xml.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_xls_xml_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_test_xls_xml-orcus_test_xls_xml.obj -MD -MP -MF $(DEPDIR)/orcus_test_xls_xml-orcus_test_xls_xml.Tpo -c -o orcus_test_xls_xml-orcus_test_xls_xml.obj `if test -f 'orcus_test_xls_xml.cpp'; then $(CYGPATH_W) 'orcus_test_xls_xml.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_test_xls_xml.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_test_xls_xml-orcus_test_xls_xml.Tpo $(DEPDIR)/orcus_test_xls_xml-orcus_test_xls_xml.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_test_xls_xml.cpp' object='orcus_test_xls_xml-orcus_test_xls_xml.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_xls_xml_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_test_xls_xml-orcus_test_xls_xml.obj `if test -f 'orcus_test_xls_xml.cpp'; then $(CYGPATH_W) 'orcus_test_xls_xml.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_test_xls_xml.cpp'; fi`
+
+orcus_test_xls_xml-orcus_test_global.o: orcus_test_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_xls_xml_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_test_xls_xml-orcus_test_global.o -MD -MP -MF $(DEPDIR)/orcus_test_xls_xml-orcus_test_global.Tpo -c -o orcus_test_xls_xml-orcus_test_global.o `test -f 'orcus_test_global.cpp' || echo '$(srcdir)/'`orcus_test_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_test_xls_xml-orcus_test_global.Tpo $(DEPDIR)/orcus_test_xls_xml-orcus_test_global.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_test_global.cpp' object='orcus_test_xls_xml-orcus_test_global.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_xls_xml_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_test_xls_xml-orcus_test_global.o `test -f 'orcus_test_global.cpp' || echo '$(srcdir)/'`orcus_test_global.cpp
+
+orcus_test_xls_xml-orcus_test_global.obj: orcus_test_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_xls_xml_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_test_xls_xml-orcus_test_global.obj -MD -MP -MF $(DEPDIR)/orcus_test_xls_xml-orcus_test_global.Tpo -c -o orcus_test_xls_xml-orcus_test_global.obj `if test -f 'orcus_test_global.cpp'; then $(CYGPATH_W) 'orcus_test_global.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_test_global.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_test_xls_xml-orcus_test_global.Tpo $(DEPDIR)/orcus_test_xls_xml-orcus_test_global.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_test_global.cpp' object='orcus_test_xls_xml-orcus_test_global.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_xls_xml_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_test_xls_xml-orcus_test_global.obj `if test -f 'orcus_test_global.cpp'; then $(CYGPATH_W) 'orcus_test_global.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_test_global.cpp'; fi`
+
+orcus_test_xlsx-orcus_test_xlsx.o: orcus_test_xlsx.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_xlsx_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_test_xlsx-orcus_test_xlsx.o -MD -MP -MF $(DEPDIR)/orcus_test_xlsx-orcus_test_xlsx.Tpo -c -o orcus_test_xlsx-orcus_test_xlsx.o `test -f 'orcus_test_xlsx.cpp' || echo '$(srcdir)/'`orcus_test_xlsx.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_test_xlsx-orcus_test_xlsx.Tpo $(DEPDIR)/orcus_test_xlsx-orcus_test_xlsx.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_test_xlsx.cpp' object='orcus_test_xlsx-orcus_test_xlsx.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_xlsx_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_test_xlsx-orcus_test_xlsx.o `test -f 'orcus_test_xlsx.cpp' || echo '$(srcdir)/'`orcus_test_xlsx.cpp
+
+orcus_test_xlsx-orcus_test_xlsx.obj: orcus_test_xlsx.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_xlsx_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_test_xlsx-orcus_test_xlsx.obj -MD -MP -MF $(DEPDIR)/orcus_test_xlsx-orcus_test_xlsx.Tpo -c -o orcus_test_xlsx-orcus_test_xlsx.obj `if test -f 'orcus_test_xlsx.cpp'; then $(CYGPATH_W) 'orcus_test_xlsx.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_test_xlsx.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_test_xlsx-orcus_test_xlsx.Tpo $(DEPDIR)/orcus_test_xlsx-orcus_test_xlsx.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_test_xlsx.cpp' object='orcus_test_xlsx-orcus_test_xlsx.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_xlsx_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_test_xlsx-orcus_test_xlsx.obj `if test -f 'orcus_test_xlsx.cpp'; then $(CYGPATH_W) 'orcus_test_xlsx.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_test_xlsx.cpp'; fi`
+
+orcus_test_xml-orcus_test_xml.o: orcus_test_xml.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_xml_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_test_xml-orcus_test_xml.o -MD -MP -MF $(DEPDIR)/orcus_test_xml-orcus_test_xml.Tpo -c -o orcus_test_xml-orcus_test_xml.o `test -f 'orcus_test_xml.cpp' || echo '$(srcdir)/'`orcus_test_xml.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_test_xml-orcus_test_xml.Tpo $(DEPDIR)/orcus_test_xml-orcus_test_xml.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_test_xml.cpp' object='orcus_test_xml-orcus_test_xml.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_xml_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_test_xml-orcus_test_xml.o `test -f 'orcus_test_xml.cpp' || echo '$(srcdir)/'`orcus_test_xml.cpp
+
+orcus_test_xml-orcus_test_xml.obj: orcus_test_xml.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_xml_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_test_xml-orcus_test_xml.obj -MD -MP -MF $(DEPDIR)/orcus_test_xml-orcus_test_xml.Tpo -c -o orcus_test_xml-orcus_test_xml.obj `if test -f 'orcus_test_xml.cpp'; then $(CYGPATH_W) 'orcus_test_xml.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_test_xml.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_test_xml-orcus_test_xml.Tpo $(DEPDIR)/orcus_test_xml-orcus_test_xml.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_test_xml.cpp' object='orcus_test_xml-orcus_test_xml.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_xml_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_test_xml-orcus_test_xml.obj `if test -f 'orcus_test_xml.cpp'; then $(CYGPATH_W) 'orcus_test_xml.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_test_xml.cpp'; fi`
+
+orcus_test_xml_mapped-orcus_test_xml_mapped.o: orcus_test_xml_mapped.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_xml_mapped_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_test_xml_mapped-orcus_test_xml_mapped.o -MD -MP -MF $(DEPDIR)/orcus_test_xml_mapped-orcus_test_xml_mapped.Tpo -c -o orcus_test_xml_mapped-orcus_test_xml_mapped.o `test -f 'orcus_test_xml_mapped.cpp' || echo '$(srcdir)/'`orcus_test_xml_mapped.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_test_xml_mapped-orcus_test_xml_mapped.Tpo $(DEPDIR)/orcus_test_xml_mapped-orcus_test_xml_mapped.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_test_xml_mapped.cpp' object='orcus_test_xml_mapped-orcus_test_xml_mapped.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_xml_mapped_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_test_xml_mapped-orcus_test_xml_mapped.o `test -f 'orcus_test_xml_mapped.cpp' || echo '$(srcdir)/'`orcus_test_xml_mapped.cpp
+
+orcus_test_xml_mapped-orcus_test_xml_mapped.obj: orcus_test_xml_mapped.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_xml_mapped_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_test_xml_mapped-orcus_test_xml_mapped.obj -MD -MP -MF $(DEPDIR)/orcus_test_xml_mapped-orcus_test_xml_mapped.Tpo -c -o orcus_test_xml_mapped-orcus_test_xml_mapped.obj `if test -f 'orcus_test_xml_mapped.cpp'; then $(CYGPATH_W) 'orcus_test_xml_mapped.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_test_xml_mapped.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_test_xml_mapped-orcus_test_xml_mapped.Tpo $(DEPDIR)/orcus_test_xml_mapped-orcus_test_xml_mapped.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_test_xml_mapped.cpp' object='orcus_test_xml_mapped-orcus_test_xml_mapped.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_xml_mapped_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_test_xml_mapped-orcus_test_xml_mapped.obj `if test -f 'orcus_test_xml_mapped.cpp'; then $(CYGPATH_W) 'orcus_test_xml_mapped.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_test_xml_mapped.cpp'; fi`
+
+orcus_test_xml_mapped-orcus_test_global.o: orcus_test_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_xml_mapped_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_test_xml_mapped-orcus_test_global.o -MD -MP -MF $(DEPDIR)/orcus_test_xml_mapped-orcus_test_global.Tpo -c -o orcus_test_xml_mapped-orcus_test_global.o `test -f 'orcus_test_global.cpp' || echo '$(srcdir)/'`orcus_test_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_test_xml_mapped-orcus_test_global.Tpo $(DEPDIR)/orcus_test_xml_mapped-orcus_test_global.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_test_global.cpp' object='orcus_test_xml_mapped-orcus_test_global.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_xml_mapped_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_test_xml_mapped-orcus_test_global.o `test -f 'orcus_test_global.cpp' || echo '$(srcdir)/'`orcus_test_global.cpp
+
+orcus_test_xml_mapped-orcus_test_global.obj: orcus_test_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_xml_mapped_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_test_xml_mapped-orcus_test_global.obj -MD -MP -MF $(DEPDIR)/orcus_test_xml_mapped-orcus_test_global.Tpo -c -o orcus_test_xml_mapped-orcus_test_global.obj `if test -f 'orcus_test_global.cpp'; then $(CYGPATH_W) 'orcus_test_global.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_test_global.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_test_xml_mapped-orcus_test_global.Tpo $(DEPDIR)/orcus_test_xml_mapped-orcus_test_global.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_test_global.cpp' object='orcus_test_xml_mapped-orcus_test_global.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_test_xml_mapped_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_test_xml_mapped-orcus_test_global.obj `if test -f 'orcus_test_global.cpp'; then $(CYGPATH_W) 'orcus_test_global.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_test_global.cpp'; fi`
+
+orcus_xls_xml-orcus_filter_global.o: orcus_filter_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_xls_xml_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_xls_xml-orcus_filter_global.o -MD -MP -MF $(DEPDIR)/orcus_xls_xml-orcus_filter_global.Tpo -c -o orcus_xls_xml-orcus_filter_global.o `test -f 'orcus_filter_global.cpp' || echo '$(srcdir)/'`orcus_filter_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_xls_xml-orcus_filter_global.Tpo $(DEPDIR)/orcus_xls_xml-orcus_filter_global.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_filter_global.cpp' object='orcus_xls_xml-orcus_filter_global.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_xls_xml_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_xls_xml-orcus_filter_global.o `test -f 'orcus_filter_global.cpp' || echo '$(srcdir)/'`orcus_filter_global.cpp
+
+orcus_xls_xml-orcus_filter_global.obj: orcus_filter_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_xls_xml_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_xls_xml-orcus_filter_global.obj -MD -MP -MF $(DEPDIR)/orcus_xls_xml-orcus_filter_global.Tpo -c -o orcus_xls_xml-orcus_filter_global.obj `if test -f 'orcus_filter_global.cpp'; then $(CYGPATH_W) 'orcus_filter_global.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_filter_global.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_xls_xml-orcus_filter_global.Tpo $(DEPDIR)/orcus_xls_xml-orcus_filter_global.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_filter_global.cpp' object='orcus_xls_xml-orcus_filter_global.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_xls_xml_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_xls_xml-orcus_filter_global.obj `if test -f 'orcus_filter_global.cpp'; then $(CYGPATH_W) 'orcus_filter_global.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_filter_global.cpp'; fi`
+
+orcus_xls_xml-orcus_xls_xml_main.o: orcus_xls_xml_main.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_xls_xml_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_xls_xml-orcus_xls_xml_main.o -MD -MP -MF $(DEPDIR)/orcus_xls_xml-orcus_xls_xml_main.Tpo -c -o orcus_xls_xml-orcus_xls_xml_main.o `test -f 'orcus_xls_xml_main.cpp' || echo '$(srcdir)/'`orcus_xls_xml_main.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_xls_xml-orcus_xls_xml_main.Tpo $(DEPDIR)/orcus_xls_xml-orcus_xls_xml_main.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_xls_xml_main.cpp' object='orcus_xls_xml-orcus_xls_xml_main.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_xls_xml_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_xls_xml-orcus_xls_xml_main.o `test -f 'orcus_xls_xml_main.cpp' || echo '$(srcdir)/'`orcus_xls_xml_main.cpp
+
+orcus_xls_xml-orcus_xls_xml_main.obj: orcus_xls_xml_main.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_xls_xml_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_xls_xml-orcus_xls_xml_main.obj -MD -MP -MF $(DEPDIR)/orcus_xls_xml-orcus_xls_xml_main.Tpo -c -o orcus_xls_xml-orcus_xls_xml_main.obj `if test -f 'orcus_xls_xml_main.cpp'; then $(CYGPATH_W) 'orcus_xls_xml_main.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_xls_xml_main.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_xls_xml-orcus_xls_xml_main.Tpo $(DEPDIR)/orcus_xls_xml-orcus_xls_xml_main.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_xls_xml_main.cpp' object='orcus_xls_xml-orcus_xls_xml_main.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_xls_xml_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_xls_xml-orcus_xls_xml_main.obj `if test -f 'orcus_xls_xml_main.cpp'; then $(CYGPATH_W) 'orcus_xls_xml_main.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_xls_xml_main.cpp'; fi`
+
+orcus_xlsx-orcus_filter_global.o: orcus_filter_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_xlsx_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_xlsx-orcus_filter_global.o -MD -MP -MF $(DEPDIR)/orcus_xlsx-orcus_filter_global.Tpo -c -o orcus_xlsx-orcus_filter_global.o `test -f 'orcus_filter_global.cpp' || echo '$(srcdir)/'`orcus_filter_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_xlsx-orcus_filter_global.Tpo $(DEPDIR)/orcus_xlsx-orcus_filter_global.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_filter_global.cpp' object='orcus_xlsx-orcus_filter_global.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_xlsx_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_xlsx-orcus_filter_global.o `test -f 'orcus_filter_global.cpp' || echo '$(srcdir)/'`orcus_filter_global.cpp
+
+orcus_xlsx-orcus_filter_global.obj: orcus_filter_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_xlsx_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_xlsx-orcus_filter_global.obj -MD -MP -MF $(DEPDIR)/orcus_xlsx-orcus_filter_global.Tpo -c -o orcus_xlsx-orcus_filter_global.obj `if test -f 'orcus_filter_global.cpp'; then $(CYGPATH_W) 'orcus_filter_global.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_filter_global.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_xlsx-orcus_filter_global.Tpo $(DEPDIR)/orcus_xlsx-orcus_filter_global.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_filter_global.cpp' object='orcus_xlsx-orcus_filter_global.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_xlsx_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_xlsx-orcus_filter_global.obj `if test -f 'orcus_filter_global.cpp'; then $(CYGPATH_W) 'orcus_filter_global.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_filter_global.cpp'; fi`
+
+orcus_xlsx-orcus_xlsx_main.o: orcus_xlsx_main.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_xlsx_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_xlsx-orcus_xlsx_main.o -MD -MP -MF $(DEPDIR)/orcus_xlsx-orcus_xlsx_main.Tpo -c -o orcus_xlsx-orcus_xlsx_main.o `test -f 'orcus_xlsx_main.cpp' || echo '$(srcdir)/'`orcus_xlsx_main.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_xlsx-orcus_xlsx_main.Tpo $(DEPDIR)/orcus_xlsx-orcus_xlsx_main.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_xlsx_main.cpp' object='orcus_xlsx-orcus_xlsx_main.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_xlsx_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_xlsx-orcus_xlsx_main.o `test -f 'orcus_xlsx_main.cpp' || echo '$(srcdir)/'`orcus_xlsx_main.cpp
+
+orcus_xlsx-orcus_xlsx_main.obj: orcus_xlsx_main.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_xlsx_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_xlsx-orcus_xlsx_main.obj -MD -MP -MF $(DEPDIR)/orcus_xlsx-orcus_xlsx_main.Tpo -c -o orcus_xlsx-orcus_xlsx_main.obj `if test -f 'orcus_xlsx_main.cpp'; then $(CYGPATH_W) 'orcus_xlsx_main.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_xlsx_main.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_xlsx-orcus_xlsx_main.Tpo $(DEPDIR)/orcus_xlsx-orcus_xlsx_main.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_xlsx_main.cpp' object='orcus_xlsx-orcus_xlsx_main.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_xlsx_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_xlsx-orcus_xlsx_main.obj `if test -f 'orcus_xlsx_main.cpp'; then $(CYGPATH_W) 'orcus_xlsx_main.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_xlsx_main.cpp'; fi`
+
+orcus_xml-orcus_filter_global.o: orcus_filter_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_xml_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_xml-orcus_filter_global.o -MD -MP -MF $(DEPDIR)/orcus_xml-orcus_filter_global.Tpo -c -o orcus_xml-orcus_filter_global.o `test -f 'orcus_filter_global.cpp' || echo '$(srcdir)/'`orcus_filter_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_xml-orcus_filter_global.Tpo $(DEPDIR)/orcus_xml-orcus_filter_global.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_filter_global.cpp' object='orcus_xml-orcus_filter_global.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_xml_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_xml-orcus_filter_global.o `test -f 'orcus_filter_global.cpp' || echo '$(srcdir)/'`orcus_filter_global.cpp
+
+orcus_xml-orcus_filter_global.obj: orcus_filter_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_xml_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_xml-orcus_filter_global.obj -MD -MP -MF $(DEPDIR)/orcus_xml-orcus_filter_global.Tpo -c -o orcus_xml-orcus_filter_global.obj `if test -f 'orcus_filter_global.cpp'; then $(CYGPATH_W) 'orcus_filter_global.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_filter_global.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_xml-orcus_filter_global.Tpo $(DEPDIR)/orcus_xml-orcus_filter_global.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_filter_global.cpp' object='orcus_xml-orcus_filter_global.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_xml_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_xml-orcus_filter_global.obj `if test -f 'orcus_filter_global.cpp'; then $(CYGPATH_W) 'orcus_filter_global.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_filter_global.cpp'; fi`
+
+orcus_xml-cli_global.o: cli_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_xml_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_xml-cli_global.o -MD -MP -MF $(DEPDIR)/orcus_xml-cli_global.Tpo -c -o orcus_xml-cli_global.o `test -f 'cli_global.cpp' || echo '$(srcdir)/'`cli_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_xml-cli_global.Tpo $(DEPDIR)/orcus_xml-cli_global.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cli_global.cpp' object='orcus_xml-cli_global.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_xml_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_xml-cli_global.o `test -f 'cli_global.cpp' || echo '$(srcdir)/'`cli_global.cpp
+
+orcus_xml-cli_global.obj: cli_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_xml_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_xml-cli_global.obj -MD -MP -MF $(DEPDIR)/orcus_xml-cli_global.Tpo -c -o orcus_xml-cli_global.obj `if test -f 'cli_global.cpp'; then $(CYGPATH_W) 'cli_global.cpp'; else $(CYGPATH_W) '$(srcdir)/cli_global.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_xml-cli_global.Tpo $(DEPDIR)/orcus_xml-cli_global.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cli_global.cpp' object='orcus_xml-cli_global.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_xml_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_xml-cli_global.obj `if test -f 'cli_global.cpp'; then $(CYGPATH_W) 'cli_global.cpp'; else $(CYGPATH_W) '$(srcdir)/cli_global.cpp'; fi`
+
+orcus_xml-orcus_xml_main.o: orcus_xml_main.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_xml_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_xml-orcus_xml_main.o -MD -MP -MF $(DEPDIR)/orcus_xml-orcus_xml_main.Tpo -c -o orcus_xml-orcus_xml_main.o `test -f 'orcus_xml_main.cpp' || echo '$(srcdir)/'`orcus_xml_main.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_xml-orcus_xml_main.Tpo $(DEPDIR)/orcus_xml-orcus_xml_main.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_xml_main.cpp' object='orcus_xml-orcus_xml_main.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_xml_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_xml-orcus_xml_main.o `test -f 'orcus_xml_main.cpp' || echo '$(srcdir)/'`orcus_xml_main.cpp
+
+orcus_xml-orcus_xml_main.obj: orcus_xml_main.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_xml_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_xml-orcus_xml_main.obj -MD -MP -MF $(DEPDIR)/orcus_xml-orcus_xml_main.Tpo -c -o orcus_xml-orcus_xml_main.obj `if test -f 'orcus_xml_main.cpp'; then $(CYGPATH_W) 'orcus_xml_main.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_xml_main.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_xml-orcus_xml_main.Tpo $(DEPDIR)/orcus_xml-orcus_xml_main.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_xml_main.cpp' object='orcus_xml-orcus_xml_main.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_xml_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_xml-orcus_xml_main.obj `if test -f 'orcus_xml_main.cpp'; then $(CYGPATH_W) 'orcus_xml_main.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_xml_main.cpp'; fi`
+
+orcus_yaml-orcus_yaml_main.o: orcus_yaml_main.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_yaml_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_yaml-orcus_yaml_main.o -MD -MP -MF $(DEPDIR)/orcus_yaml-orcus_yaml_main.Tpo -c -o orcus_yaml-orcus_yaml_main.o `test -f 'orcus_yaml_main.cpp' || echo '$(srcdir)/'`orcus_yaml_main.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_yaml-orcus_yaml_main.Tpo $(DEPDIR)/orcus_yaml-orcus_yaml_main.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_yaml_main.cpp' object='orcus_yaml-orcus_yaml_main.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_yaml_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_yaml-orcus_yaml_main.o `test -f 'orcus_yaml_main.cpp' || echo '$(srcdir)/'`orcus_yaml_main.cpp
+
+orcus_yaml-orcus_yaml_main.obj: orcus_yaml_main.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_yaml_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_yaml-orcus_yaml_main.obj -MD -MP -MF $(DEPDIR)/orcus_yaml-orcus_yaml_main.Tpo -c -o orcus_yaml-orcus_yaml_main.obj `if test -f 'orcus_yaml_main.cpp'; then $(CYGPATH_W) 'orcus_yaml_main.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_yaml_main.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_yaml-orcus_yaml_main.Tpo $(DEPDIR)/orcus_yaml-orcus_yaml_main.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_yaml_main.cpp' object='orcus_yaml-orcus_yaml_main.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_yaml_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_yaml-orcus_yaml_main.obj `if test -f 'orcus_yaml_main.cpp'; then $(CYGPATH_W) 'orcus_yaml_main.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_yaml_main.cpp'; fi`
+
+orcus_zip_dump-orcus_zip_dump.o: orcus_zip_dump.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_zip_dump_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_zip_dump-orcus_zip_dump.o -MD -MP -MF $(DEPDIR)/orcus_zip_dump-orcus_zip_dump.Tpo -c -o orcus_zip_dump-orcus_zip_dump.o `test -f 'orcus_zip_dump.cpp' || echo '$(srcdir)/'`orcus_zip_dump.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_zip_dump-orcus_zip_dump.Tpo $(DEPDIR)/orcus_zip_dump-orcus_zip_dump.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_zip_dump.cpp' object='orcus_zip_dump-orcus_zip_dump.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_zip_dump_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_zip_dump-orcus_zip_dump.o `test -f 'orcus_zip_dump.cpp' || echo '$(srcdir)/'`orcus_zip_dump.cpp
+
+orcus_zip_dump-orcus_zip_dump.obj: orcus_zip_dump.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_zip_dump_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT orcus_zip_dump-orcus_zip_dump.obj -MD -MP -MF $(DEPDIR)/orcus_zip_dump-orcus_zip_dump.Tpo -c -o orcus_zip_dump-orcus_zip_dump.obj `if test -f 'orcus_zip_dump.cpp'; then $(CYGPATH_W) 'orcus_zip_dump.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_zip_dump.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orcus_zip_dump-orcus_zip_dump.Tpo $(DEPDIR)/orcus_zip_dump-orcus_zip_dump.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_zip_dump.cpp' object='orcus_zip_dump-orcus_zip_dump.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(orcus_zip_dump_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o orcus_zip_dump-orcus_zip_dump.obj `if test -f 'orcus_zip_dump.cpp'; then $(CYGPATH_W) 'orcus_zip_dump.cpp'; else $(CYGPATH_W) '$(srcdir)/orcus_zip_dump.cpp'; fi`
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+# (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+ @fail=; \
+ if $(am__make_keepgoing); then \
+ failcom='fail=yes'; \
+ else \
+ failcom='exit 1'; \
+ fi; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+check-valgrind-local:
+check-valgrind-memcheck-local:
+check-valgrind-helgrind-local:
+check-valgrind-drd-local:
+check-valgrind-sgcheck-local:
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ $(am__define_uniq_tagged_files); \
+ 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-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ 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"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+ fi; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ elif test -n "$$redo_logs"; then \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
+ else \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+ fi; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
+ else \
+ color_start= color_end=; \
+ fi; \
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS:
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+orcus-test-xml.log: orcus-test-xml$(EXEEXT)
+ @p='orcus-test-xml$(EXEEXT)'; \
+ b='orcus-test-xml'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+orcus-env-dump.log: orcus-env-dump$(EXEEXT)
+ @p='orcus-env-dump$(EXEEXT)'; \
+ b='orcus-env-dump'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+orcus-test-csv.log: orcus-test-csv$(EXEEXT)
+ @p='orcus-test-csv$(EXEEXT)'; \
+ b='orcus-test-csv'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+orcus-test-xml-mapped.log: orcus-test-xml-mapped$(EXEEXT)
+ @p='orcus-test-xml-mapped$(EXEEXT)'; \
+ b='orcus-test-xml-mapped'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+orcus-test-json-mapped.log: orcus-test-json-mapped$(EXEEXT)
+ @p='orcus-test-json-mapped$(EXEEXT)'; \
+ b='orcus-test-json-mapped'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+orcus-test-ods.log: orcus-test-ods$(EXEEXT)
+ @p='orcus-test-ods$(EXEEXT)'; \
+ b='orcus-test-ods'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+orcus-test-import-ods.log: orcus-test-import-ods$(EXEEXT)
+ @p='orcus-test-import-ods$(EXEEXT)'; \
+ b='orcus-test-import-ods'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+orcus-test-xlsx.log: orcus-test-xlsx$(EXEEXT)
+ @p='orcus-test-xlsx$(EXEEXT)'; \
+ b='orcus-test-xlsx'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+orcus-test-xls-xml.log: orcus-test-xls-xml$(EXEEXT)
+ @p='orcus-test-xls-xml$(EXEEXT)'; \
+ b='orcus-test-xls-xml'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+orcus-test-gnumeric.log: orcus-test-gnumeric$(EXEEXT)
+ @p='orcus-test-gnumeric$(EXEEXT)'; \
+ b='orcus-test-gnumeric'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+orcus-test-parquet.log: orcus-test-parquet$(EXEEXT)
+ @p='orcus-test-parquet$(EXEEXT)'; \
+ b='orcus-test-parquet'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.test$(EXEEXT).log:
+@am__EXEEXT_TRUE@ @p='$<'; \
+@am__EXEEXT_TRUE@ $(am__set_b); \
+@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @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
+ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ $(am__make_dryrun) \
+ || test -d "$(distdir)/$$subdir" \
+ || $(MKDIR_P) "$(distdir)/$$subdir" \
+ || exit 1; \
+ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+ $(am__relativize); \
+ new_distdir=$$reldir; \
+ dir1=$$subdir; dir2="$(top_distdir)"; \
+ $(am__relativize); \
+ new_top_distdir=$$reldir; \
+ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+ ($(am__cd) $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$new_top_distdir" \
+ distdir="$$new_distdir" \
+ am__remove_distdir=: \
+ am__skip_length_check=: \
+ am__skip_mode_fix=: \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-recursive
+all-am: Makefile $(PROGRAMS)
+installdirs: installdirs-recursive
+installdirs-am:
+ for dir in "$(DESTDIR)$(bindir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+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:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -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)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+check-valgrind: check-valgrind-recursive
+
+check-valgrind-am: check-valgrind-local
+
+check-valgrind-drd: check-valgrind-drd-recursive
+
+check-valgrind-drd-am: check-valgrind-drd-local
+
+check-valgrind-helgrind: check-valgrind-helgrind-recursive
+
+check-valgrind-helgrind-am: check-valgrind-helgrind-local
+
+check-valgrind-memcheck: check-valgrind-memcheck-recursive
+
+check-valgrind-memcheck-am: check-valgrind-memcheck-local
+
+check-valgrind-sgcheck: check-valgrind-sgcheck-recursive
+
+check-valgrind-sgcheck-am: check-valgrind-sgcheck-local
+
+clean: clean-recursive
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -f ./$(DEPDIR)/orcus_css_dump-orcus_css_dump.Po
+ -rm -f ./$(DEPDIR)/orcus_csv-orcus_csv_main.Po
+ -rm -f ./$(DEPDIR)/orcus_csv-orcus_filter_global.Po
+ -rm -f ./$(DEPDIR)/orcus_detect-orcus_detect_main.Po
+ -rm -f ./$(DEPDIR)/orcus_env_dump-orcus_env_dump.Po
+ -rm -f ./$(DEPDIR)/orcus_filter_global.Po
+ -rm -f ./$(DEPDIR)/orcus_gnumeric-orcus_filter_global.Po
+ -rm -f ./$(DEPDIR)/orcus_gnumeric-orcus_gnumeric_main.Po
+ -rm -f ./$(DEPDIR)/orcus_json-cli_global.Po
+ -rm -f ./$(DEPDIR)/orcus_json-orcus_json_cli.Po
+ -rm -f ./$(DEPDIR)/orcus_json-orcus_json_cli_map.Po
+ -rm -f ./$(DEPDIR)/orcus_mso_encryption-orcus_mso_encryption.Po
+ -rm -f ./$(DEPDIR)/orcus_ods-orcus_filter_global.Po
+ -rm -f ./$(DEPDIR)/orcus_ods-orcus_ods_main.Po
+ -rm -f ./$(DEPDIR)/orcus_parquet_main.Po
+ -rm -f ./$(DEPDIR)/orcus_styles_ods-orcus_filter_global.Po
+ -rm -f ./$(DEPDIR)/orcus_styles_ods-orcus_ods_styles.Po
+ -rm -f ./$(DEPDIR)/orcus_test_csv-orcus_test_csv.Po
+ -rm -f ./$(DEPDIR)/orcus_test_csv-orcus_test_global.Po
+ -rm -f ./$(DEPDIR)/orcus_test_gnumeric-orcus_test_global.Po
+ -rm -f ./$(DEPDIR)/orcus_test_gnumeric-orcus_test_gnumeric.Po
+ -rm -f ./$(DEPDIR)/orcus_test_import_ods-orcus_test_import_ods.Po
+ -rm -f ./$(DEPDIR)/orcus_test_json_mapped-orcus_test_json_mapped.Po
+ -rm -f ./$(DEPDIR)/orcus_test_ods-orcus_test_ods.Po
+ -rm -f ./$(DEPDIR)/orcus_test_parquet-orcus_test_parquet.Po
+ -rm -f ./$(DEPDIR)/orcus_test_xls_xml-orcus_test_global.Po
+ -rm -f ./$(DEPDIR)/orcus_test_xls_xml-orcus_test_xls_xml.Po
+ -rm -f ./$(DEPDIR)/orcus_test_xlsx-orcus_test_xlsx.Po
+ -rm -f ./$(DEPDIR)/orcus_test_xml-orcus_test_xml.Po
+ -rm -f ./$(DEPDIR)/orcus_test_xml_mapped-orcus_test_global.Po
+ -rm -f ./$(DEPDIR)/orcus_test_xml_mapped-orcus_test_xml_mapped.Po
+ -rm -f ./$(DEPDIR)/orcus_xls_xml-orcus_filter_global.Po
+ -rm -f ./$(DEPDIR)/orcus_xls_xml-orcus_xls_xml_main.Po
+ -rm -f ./$(DEPDIR)/orcus_xlsx-orcus_filter_global.Po
+ -rm -f ./$(DEPDIR)/orcus_xlsx-orcus_xlsx_main.Po
+ -rm -f ./$(DEPDIR)/orcus_xml-cli_global.Po
+ -rm -f ./$(DEPDIR)/orcus_xml-orcus_filter_global.Po
+ -rm -f ./$(DEPDIR)/orcus_xml-orcus_xml_main.Po
+ -rm -f ./$(DEPDIR)/orcus_yaml-orcus_yaml_main.Po
+ -rm -f ./$(DEPDIR)/orcus_zip_dump-orcus_zip_dump.Po
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-local distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -f ./$(DEPDIR)/orcus_css_dump-orcus_css_dump.Po
+ -rm -f ./$(DEPDIR)/orcus_csv-orcus_csv_main.Po
+ -rm -f ./$(DEPDIR)/orcus_csv-orcus_filter_global.Po
+ -rm -f ./$(DEPDIR)/orcus_detect-orcus_detect_main.Po
+ -rm -f ./$(DEPDIR)/orcus_env_dump-orcus_env_dump.Po
+ -rm -f ./$(DEPDIR)/orcus_filter_global.Po
+ -rm -f ./$(DEPDIR)/orcus_gnumeric-orcus_filter_global.Po
+ -rm -f ./$(DEPDIR)/orcus_gnumeric-orcus_gnumeric_main.Po
+ -rm -f ./$(DEPDIR)/orcus_json-cli_global.Po
+ -rm -f ./$(DEPDIR)/orcus_json-orcus_json_cli.Po
+ -rm -f ./$(DEPDIR)/orcus_json-orcus_json_cli_map.Po
+ -rm -f ./$(DEPDIR)/orcus_mso_encryption-orcus_mso_encryption.Po
+ -rm -f ./$(DEPDIR)/orcus_ods-orcus_filter_global.Po
+ -rm -f ./$(DEPDIR)/orcus_ods-orcus_ods_main.Po
+ -rm -f ./$(DEPDIR)/orcus_parquet_main.Po
+ -rm -f ./$(DEPDIR)/orcus_styles_ods-orcus_filter_global.Po
+ -rm -f ./$(DEPDIR)/orcus_styles_ods-orcus_ods_styles.Po
+ -rm -f ./$(DEPDIR)/orcus_test_csv-orcus_test_csv.Po
+ -rm -f ./$(DEPDIR)/orcus_test_csv-orcus_test_global.Po
+ -rm -f ./$(DEPDIR)/orcus_test_gnumeric-orcus_test_global.Po
+ -rm -f ./$(DEPDIR)/orcus_test_gnumeric-orcus_test_gnumeric.Po
+ -rm -f ./$(DEPDIR)/orcus_test_import_ods-orcus_test_import_ods.Po
+ -rm -f ./$(DEPDIR)/orcus_test_json_mapped-orcus_test_json_mapped.Po
+ -rm -f ./$(DEPDIR)/orcus_test_ods-orcus_test_ods.Po
+ -rm -f ./$(DEPDIR)/orcus_test_parquet-orcus_test_parquet.Po
+ -rm -f ./$(DEPDIR)/orcus_test_xls_xml-orcus_test_global.Po
+ -rm -f ./$(DEPDIR)/orcus_test_xls_xml-orcus_test_xls_xml.Po
+ -rm -f ./$(DEPDIR)/orcus_test_xlsx-orcus_test_xlsx.Po
+ -rm -f ./$(DEPDIR)/orcus_test_xml-orcus_test_xml.Po
+ -rm -f ./$(DEPDIR)/orcus_test_xml_mapped-orcus_test_global.Po
+ -rm -f ./$(DEPDIR)/orcus_test_xml_mapped-orcus_test_xml_mapped.Po
+ -rm -f ./$(DEPDIR)/orcus_xls_xml-orcus_filter_global.Po
+ -rm -f ./$(DEPDIR)/orcus_xls_xml-orcus_xls_xml_main.Po
+ -rm -f ./$(DEPDIR)/orcus_xlsx-orcus_filter_global.Po
+ -rm -f ./$(DEPDIR)/orcus_xlsx-orcus_xlsx_main.Po
+ -rm -f ./$(DEPDIR)/orcus_xml-cli_global.Po
+ -rm -f ./$(DEPDIR)/orcus_xml-orcus_filter_global.Po
+ -rm -f ./$(DEPDIR)/orcus_xml-orcus_xml_main.Po
+ -rm -f ./$(DEPDIR)/orcus_yaml-orcus_yaml_main.Po
+ -rm -f ./$(DEPDIR)/orcus_zip_dump-orcus_zip_dump.Po
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS
+
+.MAKE: $(am__recursive_targets) check-am install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
+ am--depfiles check check-TESTS check-am check-valgrind-am \
+ check-valgrind-drd-am check-valgrind-drd-local \
+ check-valgrind-helgrind-am check-valgrind-helgrind-local \
+ check-valgrind-local check-valgrind-memcheck-am \
+ check-valgrind-memcheck-local check-valgrind-sgcheck-am \
+ check-valgrind-sgcheck-local clean clean-binPROGRAMS \
+ clean-generic clean-libtool cscopelist-am ctags ctags-am \
+ distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-local distclean-tags distdir 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-man \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ installdirs-am maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool pdf pdf-am ps ps-am recheck tags tags-am \
+ uninstall uninstall-am uninstall-binPROGRAMS
+
+.PRECIOUS: Makefile
+
+
+distclean-local:
+ rm -rf $(TESTS)
+
+@VALGRIND_CHECK_RULES@
+
+# 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/src/cli_global.cpp b/src/cli_global.cpp
new file mode 100644
index 0000000..85e37c6
--- /dev/null
+++ b/src/cli_global.cpp
@@ -0,0 +1,63 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "cli_global.hpp"
+
+#include <iostream>
+#include <fstream>
+
+#include "filesystem_env.hpp"
+
+namespace po = boost::program_options;
+
+namespace orcus {
+
+output_stream::output_stream(const boost::program_options::variables_map& vm) :
+ m_os(&std::cout)
+{
+ if (!vm.count("output"))
+ // No output parameter given. Output to stdout.
+ return;
+
+ std::string output_path = vm["output"].as<std::string>();
+
+ if (output_path.empty())
+ // Specified output path is empty.
+ return;
+
+ // Check to make sure the output path doesn't point to an existing
+ // directory.
+ if (fs::is_directory(output_path))
+ {
+ std::ostringstream os;
+ os << "Output file path points to an existing directory.";
+ throw std::invalid_argument(os.str());
+ }
+
+ // Output to stdout when output path is not given.
+ m_ofs = std::make_unique<std::ofstream>(output_path.data());
+ m_os = m_ofs.get();
+}
+
+output_stream::output_stream(output_stream&& other) :
+ m_ofs(std::move(other.m_ofs)),
+ m_os(other.m_os)
+{
+ if (m_ofs)
+ m_os = m_ofs.get();
+
+ other.m_os = nullptr;
+}
+
+std::ostream& output_stream::get()
+{
+ return *m_os;
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/cli_global.hpp b/src/cli_global.hpp
new file mode 100644
index 0000000..75f6cf6
--- /dev/null
+++ b/src/cli_global.hpp
@@ -0,0 +1,39 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_CLI_GLOBAL_HPP
+#define INCLUDED_ORCUS_CLI_GLOBAL_HPP
+
+#include <boost/program_options.hpp>
+#include <iosfwd>
+
+namespace orcus {
+
+/**
+ * This class abstracts away an instance of std::ostream. It's either
+ * std::cout (if no output file path is specified) or std::ofstream if an
+ * output file path is specified via CLI.
+ */
+class output_stream
+{
+ std::unique_ptr<std::ofstream> m_ofs;
+ std::ostream* m_os;
+
+public:
+ output_stream(const boost::program_options::variables_map& vm);
+ output_stream(output_stream&& other);
+ output_stream(const output_stream&) = delete;
+ output_stream& operator=(const output_stream&) = delete;
+
+ std::ostream& get();
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/include/Makefile.am b/src/include/Makefile.am
new file mode 100644
index 0000000..e4006c8
--- /dev/null
+++ b/src/include/Makefile.am
@@ -0,0 +1,9 @@
+SUBDIRS = mso
+
+EXTRA_DIST = \
+ cpu_features.hpp \
+ filesystem_env.hpp \
+ mock_spreadsheet.hpp \
+ numeric_parser.hpp \
+ ostream_utils.hpp \
+ test_global.hpp
diff --git a/src/include/Makefile.in b/src/include/Makefile.in
new file mode 100644
index 0000000..9c77c71
--- /dev/null
+++ b/src/include/Makefile.in
@@ -0,0 +1,726 @@
+# Makefile.in generated by automake 1.16.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2021 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.
+
+@SET_MAKE@
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+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@
+subdir = src/include
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
+ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_17.m4 \
+ $(top_srcdir)/m4/boost.m4 $(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)/m4/m4_ax_valgrind_check.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+ ctags-recursive dvi-recursive html-recursive info-recursive \
+ install-data-recursive install-dvi-recursive \
+ install-exec-recursive install-html-recursive \
+ install-info-recursive install-pdf-recursive \
+ install-ps-recursive install-recursive installcheck-recursive \
+ installdirs-recursive pdf-recursive ps-recursive \
+ tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
+ distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+ $(RECURSIVE_TARGETS) \
+ $(RECURSIVE_CLEAN_TARGETS) \
+ $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+ distdir distdir-am
+am__extra_recursive_targets = check-valgrind-recursive \
+ check-valgrind-memcheck-recursive \
+ check-valgrind-helgrind-recursive check-valgrind-drd-recursive \
+ check-valgrind-sgcheck-recursive
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(srcdir)/Makefile.in
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+ dir0=`pwd`; \
+ sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+ sed_rest='s,^[^/]*/*,,'; \
+ sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+ sed_butlast='s,/*[^/]*$$,,'; \
+ while test -n "$$dir1"; do \
+ first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+ if test "$$first" != "."; then \
+ if test "$$first" = ".."; then \
+ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+ else \
+ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+ if test "$$first2" = "$$first"; then \
+ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+ else \
+ dir2="../$$dir2"; \
+ fi; \
+ dir0="$$dir0"/"$$first"; \
+ fi; \
+ fi; \
+ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+ done; \
+ reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BOOST_CPPFLAGS = @BOOST_CPPFLAGS@
+BOOST_DATE_TIME_LDFLAGS = @BOOST_DATE_TIME_LDFLAGS@
+BOOST_DATE_TIME_LDPATH = @BOOST_DATE_TIME_LDPATH@
+BOOST_DATE_TIME_LIBS = @BOOST_DATE_TIME_LIBS@
+BOOST_FILESYSTEM_LDFLAGS = @BOOST_FILESYSTEM_LDFLAGS@
+BOOST_FILESYSTEM_LDPATH = @BOOST_FILESYSTEM_LDPATH@
+BOOST_FILESYSTEM_LIBS = @BOOST_FILESYSTEM_LIBS@
+BOOST_IOSTREAMS_LDFLAGS = @BOOST_IOSTREAMS_LDFLAGS@
+BOOST_IOSTREAMS_LDPATH = @BOOST_IOSTREAMS_LDPATH@
+BOOST_IOSTREAMS_LIBS = @BOOST_IOSTREAMS_LIBS@
+BOOST_LDPATH = @BOOST_LDPATH@
+BOOST_PROGRAM_OPTIONS_LDFLAGS = @BOOST_PROGRAM_OPTIONS_LDFLAGS@
+BOOST_PROGRAM_OPTIONS_LDPATH = @BOOST_PROGRAM_OPTIONS_LDPATH@
+BOOST_PROGRAM_OPTIONS_LIBS = @BOOST_PROGRAM_OPTIONS_LIBS@
+BOOST_ROOT = @BOOST_ROOT@
+BOOST_SYSTEM_LDFLAGS = @BOOST_SYSTEM_LDFLAGS@
+BOOST_SYSTEM_LDPATH = @BOOST_SYSTEM_LDPATH@
+BOOST_SYSTEM_LIBS = @BOOST_SYSTEM_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CSCOPE = @CSCOPE@
+CTAGS = @CTAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_VALGRIND_drd = @ENABLE_VALGRIND_drd@
+ENABLE_VALGRIND_helgrind = @ENABLE_VALGRIND_helgrind@
+ENABLE_VALGRIND_memcheck = @ENABLE_VALGRIND_memcheck@
+ENABLE_VALGRIND_sgcheck = @ENABLE_VALGRIND_sgcheck@
+ETAGS = @ETAGS@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+HAVE_CXX17 = @HAVE_CXX17@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+IXION_REQUIRED_API_VERSION = @IXION_REQUIRED_API_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBIXION_CFLAGS = @LIBIXION_CFLAGS@
+LIBIXION_LIBS = @LIBIXION_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MDDS_CFLAGS = @MDDS_CFLAGS@
+MDDS_LIBS = @MDDS_LIBS@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+ORCUS_API_VERSION = @ORCUS_API_VERSION@
+ORCUS_MAJOR_VERSION = @ORCUS_MAJOR_VERSION@
+ORCUS_MICRO_VERSION = @ORCUS_MICRO_VERSION@
+ORCUS_MINOR_VERSION = @ORCUS_MINOR_VERSION@
+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@
+PARQUET_CFLAGS = @PARQUET_CFLAGS@
+PARQUET_LIBS = @PARQUET_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POW_LIB = @POW_LIB@
+PYTHON = @PYTHON@
+PYTHON_CFLAGS = @PYTHON_CFLAGS@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VALGRIND = @VALGRIND@
+VALGRIND_ENABLED = @VALGRIND_ENABLED@
+VERSION = @VERSION@
+ZLIB_CFLAGS = @ZLIB_CFLAGS@
+ZLIB_LIBS = @ZLIB_LIBS@
+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@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+runstatedir = @runstatedir@
+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@
+valgrind_enabled_tools = @valgrind_enabled_tools@
+valgrind_tools = @valgrind_tools@
+SUBDIRS = mso
+EXTRA_DIST = \
+ cpu_features.hpp \
+ filesystem_env.hpp \
+ mock_spreadsheet.hpp \
+ numeric_parser.hpp \
+ ostream_utils.hpp \
+ test_global.hpp
+
+all: all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/include/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign src/include/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+# (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+ @fail=; \
+ if $(am__make_keepgoing); then \
+ failcom='fail=yes'; \
+ else \
+ failcom='exit 1'; \
+ fi; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+check-valgrind-local:
+check-valgrind-memcheck-local:
+check-valgrind-helgrind-local:
+check-valgrind-drd-local:
+check-valgrind-sgcheck-local:
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ $(am__define_uniq_tagged_files); \
+ 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-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ 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"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @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
+ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ $(am__make_dryrun) \
+ || test -d "$(distdir)/$$subdir" \
+ || $(MKDIR_P) "$(distdir)/$$subdir" \
+ || exit 1; \
+ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+ $(am__relativize); \
+ new_distdir=$$reldir; \
+ dir1=$$subdir; dir2="$(top_distdir)"; \
+ $(am__relativize); \
+ new_top_distdir=$$reldir; \
+ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+ ($(am__cd) $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$new_top_distdir" \
+ distdir="$$new_distdir" \
+ am__remove_distdir=: \
+ am__skip_length_check=: \
+ am__skip_mode_fix=: \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+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:
+
+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)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+check-valgrind: check-valgrind-recursive
+
+check-valgrind-am: check-valgrind-local
+
+check-valgrind-drd: check-valgrind-drd-recursive
+
+check-valgrind-drd-am: check-valgrind-drd-local
+
+check-valgrind-helgrind: check-valgrind-helgrind-recursive
+
+check-valgrind-helgrind-am: check-valgrind-helgrind-local
+
+check-valgrind-memcheck: check-valgrind-memcheck-recursive
+
+check-valgrind-memcheck-am: check-valgrind-memcheck-local
+
+check-valgrind-sgcheck: check-valgrind-sgcheck-recursive
+
+check-valgrind-sgcheck-am: check-valgrind-sgcheck-local
+
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(am__recursive_targets) install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+ check-am check-valgrind-am check-valgrind-drd-am \
+ check-valgrind-drd-local check-valgrind-helgrind-am \
+ check-valgrind-helgrind-local check-valgrind-local \
+ check-valgrind-memcheck-am check-valgrind-memcheck-local \
+ check-valgrind-sgcheck-am check-valgrind-sgcheck-local clean \
+ clean-generic clean-libtool cscopelist-am ctags ctags-am \
+ distclean distclean-generic distclean-libtool distclean-tags \
+ distdir dvi dvi-am html html-am info info-am install \
+ install-am 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-man \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ installdirs-am maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+ ps ps-am tags tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+# 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/src/include/cpu_features.hpp b/src/include/cpu_features.hpp
new file mode 100644
index 0000000..4bdee9c
--- /dev/null
+++ b/src/include/cpu_features.hpp
@@ -0,0 +1,44 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_DETAIL_CPU_FEATURES_HPP
+#define INCLUDED_ORCUS_DETAIL_CPU_FEATURES_HPP
+
+namespace orcus { namespace detail { namespace cpu {
+
+#ifdef __ORCUS_CPU_FEATURES
+
+constexpr bool has_sse42()
+{
+#if defined(__SSE4_2__) || defined(__AVX2__)
+ return true;
+#else
+ return false;
+#endif
+}
+
+constexpr bool has_avx2()
+{
+#ifdef __AVX2__
+ return true;
+#else
+ return false;
+#endif
+}
+
+#else
+
+constexpr bool has_sse42() { return false; }
+constexpr bool has_avx2() { return false; }
+
+#endif
+
+}}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/include/filesystem_env.hpp b/src/include/filesystem_env.hpp
new file mode 100644
index 0000000..fea82b5
--- /dev/null
+++ b/src/include/filesystem_env.hpp
@@ -0,0 +1,23 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#pragma once
+
+#ifdef HAVE_FILESYSTEM
+#include <filesystem>
+namespace fs = std::filesystem;
+#else
+#ifdef HAVE_EXPERIMENTAL_FILESYSTEM
+#include <experimental/filesystem>
+namespace fs = std::experimental::filesystem;
+#else
+#include <boost/filesystem.hpp>
+namespace fs = boost::filesystem;
+#endif
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/include/mock_spreadsheet.hpp b/src/include/mock_spreadsheet.hpp
new file mode 100644
index 0000000..5f6a332
--- /dev/null
+++ b/src/include/mock_spreadsheet.hpp
@@ -0,0 +1,179 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef __ORCUS_SPREADSHEET_MOCK_IMPORT_INTERFACE_HPP__
+#define __ORCUS_SPREADSHEET_MOCK_IMPORT_INTERFACE_HPP__
+
+#include <orcus/spreadsheet/import_interface.hpp>
+#include <orcus/spreadsheet/import_interface_styles.hpp>
+
+namespace orcus { namespace spreadsheet { namespace mock {
+
+class import_shared_strings : public orcus::spreadsheet::iface::import_shared_strings
+{
+public:
+ virtual ~import_shared_strings() override;
+
+ virtual size_t append(std::string_view s) override;
+
+ virtual size_t add(std::string_view s) override;
+
+ virtual void set_segment_font(size_t font_index) override;
+ virtual void set_segment_bold(bool b) override;
+ virtual void set_segment_italic(bool b) override;
+ virtual void set_segment_font_name(std::string_view s) override;
+ virtual void set_segment_font_size(double point) override;
+ virtual void set_segment_font_color(color_elem_t alpha, color_elem_t red, color_elem_t green, color_elem_t blue) override;
+ virtual void append_segment(std::string_view s) override;
+ virtual size_t commit_segments() override;
+};
+
+class import_styles : public orcus::spreadsheet::iface::import_styles
+{
+public:
+ virtual ~import_styles() override;
+
+ // font
+
+ virtual void set_font_count(size_t n) override;
+ virtual iface::import_font_style* start_font_style() override;
+
+ // fill
+
+ virtual void set_fill_count(size_t n) override;
+ virtual iface::import_fill_style* start_fill_style() override;
+
+ // border
+
+ virtual void set_border_count(size_t n) override;
+ virtual iface::import_border_style* start_border_style() override;
+
+ virtual void set_xf_count(xf_category_t cat, size_t n) = 0;
+ virtual void set_cell_style_count(size_t n) override;
+};
+
+class import_sheet_properties : public orcus::spreadsheet::iface::import_sheet_properties
+{
+public:
+ virtual ~import_sheet_properties() override;
+
+ virtual void set_column_width(
+ orcus::spreadsheet::col_t col, orcus::spreadsheet::col_t col_span, double width, orcus::length_unit_t unit) override;
+
+ virtual void set_column_hidden(
+ orcus::spreadsheet::col_t col, orcus::spreadsheet::col_t col_span, bool hidden) override;
+
+ virtual void set_row_height(orcus::spreadsheet::row_t row, double height, orcus::length_unit_t unit) override;
+
+ virtual void set_row_hidden(orcus::spreadsheet::row_t row, bool hidden) override;
+
+ virtual void set_merge_cell_range(const range_t& range) override;
+};
+
+class import_reference_resolver : public orcus::spreadsheet::iface::import_reference_resolver
+{
+public:
+ virtual ~import_reference_resolver() override;
+
+ virtual src_address_t resolve_address(std::string_view address) override;
+
+ virtual src_range_t resolve_range(std::string_view range) override;
+};
+
+class import_array_formula : public orcus::spreadsheet::iface::import_array_formula
+{
+public:
+ virtual ~import_array_formula() override;
+
+ virtual void set_range(const range_t& range) override;
+
+ virtual void set_formula(formula_grammar_t grammar, std::string_view formula) override;
+
+ virtual void set_result_value(row_t row, col_t col, double value) override;
+
+ virtual void set_result_string(row_t row, col_t col, std::string_view value) override;
+
+ virtual void set_result_empty(row_t row, col_t col) override;
+
+ virtual void set_result_bool(row_t row, col_t col, bool value) override;
+
+ virtual void commit() override;
+};
+
+class import_formula : public orcus::spreadsheet::iface::import_formula
+{
+public:
+ virtual ~import_formula() override;
+ virtual void set_position(row_t row, col_t col) override;
+ virtual void set_formula(formula_grammar_t grammar, std::string_view formula) override;
+ virtual void set_shared_formula_index(size_t index) override;
+ virtual void set_result_value(double value) override;
+ virtual void set_result_string(std::string_view value) override;
+ virtual void set_result_bool(bool value) override;
+ virtual void set_result_empty() override;
+ virtual void commit() override;
+};
+
+/**
+ * Interface for sheet.
+ */
+class import_sheet : public orcus::spreadsheet::iface::import_sheet
+{
+public:
+ virtual ~import_sheet() override;
+
+ virtual void set_auto(orcus::spreadsheet::row_t row, orcus::spreadsheet::col_t col, std::string_view s) override;
+
+ virtual void set_string(orcus::spreadsheet::row_t row, orcus::spreadsheet::col_t col, orcus::spreadsheet::string_id_t sindex) override;
+
+ virtual void set_value(orcus::spreadsheet::row_t row, orcus::spreadsheet::col_t col, double value) override;
+
+ virtual void set_bool(orcus::spreadsheet::row_t row, orcus::spreadsheet::col_t col, bool value) override;
+
+ virtual void set_date_time(
+ orcus::spreadsheet::row_t row, orcus::spreadsheet::col_t col,
+ int year, int month, int day, int hours, int minutes, double seconds) override;
+
+ virtual void set_format(orcus::spreadsheet::row_t row, orcus::spreadsheet::col_t col, size_t xf_index) override;
+
+ virtual void set_format(orcus::spreadsheet::row_t row_start, orcus::spreadsheet::col_t col_start,
+ orcus::spreadsheet::row_t row_end, orcus::spreadsheet::col_t col_end, size_t xf_index) override;
+
+ virtual void set_column_format(col_t col, col_t col_span, std::size_t xf_index) override;
+
+ virtual void set_row_format(row_t col, std::size_t xf_index) override;
+
+ virtual void fill_down_cells(row_t src_row, col_t src_col, row_t range_size) override;
+
+ virtual orcus::spreadsheet::range_size_t get_sheet_size() const override;
+};
+
+class import_factory : public orcus::spreadsheet::iface::import_factory
+{
+public:
+ virtual ~import_factory() override;
+
+ virtual orcus::spreadsheet::iface::import_global_settings* get_global_settings() override;
+
+ virtual orcus::spreadsheet::iface::import_shared_strings* get_shared_strings() override;
+
+ virtual orcus::spreadsheet::iface::import_styles* get_styles() override;
+
+ virtual orcus::spreadsheet::iface::import_sheet* append_sheet(
+ orcus::spreadsheet::sheet_t sheet_index, std::string_view name) override;
+
+ virtual orcus::spreadsheet::iface::import_sheet* get_sheet(std::string_view name) override;
+
+ virtual orcus::spreadsheet::iface::import_sheet* get_sheet(orcus::spreadsheet::sheet_t sheet_index) override;
+
+ virtual void finalize() override;
+};
+
+}}}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/include/mso/Makefile.am b/src/include/mso/Makefile.am
new file mode 100644
index 0000000..0865972
--- /dev/null
+++ b/src/include/mso/Makefile.am
@@ -0,0 +1,3 @@
+
+EXTRA_DIST = \
+ encryption_info.hpp
diff --git a/src/include/mso/Makefile.in b/src/include/mso/Makefile.in
new file mode 100644
index 0000000..c4f6e99
--- /dev/null
+++ b/src/include/mso/Makefile.in
@@ -0,0 +1,542 @@
+# Makefile.in generated by automake 1.16.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2021 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.
+
+@SET_MAKE@
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+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@
+subdir = src/include/mso
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
+ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_17.m4 \
+ $(top_srcdir)/m4/boost.m4 $(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)/m4/m4_ax_valgrind_check.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__extra_recursive_targets = check-valgrind-recursive \
+ check-valgrind-memcheck-recursive \
+ check-valgrind-helgrind-recursive check-valgrind-drd-recursive \
+ check-valgrind-sgcheck-recursive
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__DIST_COMMON = $(srcdir)/Makefile.in
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BOOST_CPPFLAGS = @BOOST_CPPFLAGS@
+BOOST_DATE_TIME_LDFLAGS = @BOOST_DATE_TIME_LDFLAGS@
+BOOST_DATE_TIME_LDPATH = @BOOST_DATE_TIME_LDPATH@
+BOOST_DATE_TIME_LIBS = @BOOST_DATE_TIME_LIBS@
+BOOST_FILESYSTEM_LDFLAGS = @BOOST_FILESYSTEM_LDFLAGS@
+BOOST_FILESYSTEM_LDPATH = @BOOST_FILESYSTEM_LDPATH@
+BOOST_FILESYSTEM_LIBS = @BOOST_FILESYSTEM_LIBS@
+BOOST_IOSTREAMS_LDFLAGS = @BOOST_IOSTREAMS_LDFLAGS@
+BOOST_IOSTREAMS_LDPATH = @BOOST_IOSTREAMS_LDPATH@
+BOOST_IOSTREAMS_LIBS = @BOOST_IOSTREAMS_LIBS@
+BOOST_LDPATH = @BOOST_LDPATH@
+BOOST_PROGRAM_OPTIONS_LDFLAGS = @BOOST_PROGRAM_OPTIONS_LDFLAGS@
+BOOST_PROGRAM_OPTIONS_LDPATH = @BOOST_PROGRAM_OPTIONS_LDPATH@
+BOOST_PROGRAM_OPTIONS_LIBS = @BOOST_PROGRAM_OPTIONS_LIBS@
+BOOST_ROOT = @BOOST_ROOT@
+BOOST_SYSTEM_LDFLAGS = @BOOST_SYSTEM_LDFLAGS@
+BOOST_SYSTEM_LDPATH = @BOOST_SYSTEM_LDPATH@
+BOOST_SYSTEM_LIBS = @BOOST_SYSTEM_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CSCOPE = @CSCOPE@
+CTAGS = @CTAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_VALGRIND_drd = @ENABLE_VALGRIND_drd@
+ENABLE_VALGRIND_helgrind = @ENABLE_VALGRIND_helgrind@
+ENABLE_VALGRIND_memcheck = @ENABLE_VALGRIND_memcheck@
+ENABLE_VALGRIND_sgcheck = @ENABLE_VALGRIND_sgcheck@
+ETAGS = @ETAGS@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+HAVE_CXX17 = @HAVE_CXX17@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+IXION_REQUIRED_API_VERSION = @IXION_REQUIRED_API_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBIXION_CFLAGS = @LIBIXION_CFLAGS@
+LIBIXION_LIBS = @LIBIXION_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MDDS_CFLAGS = @MDDS_CFLAGS@
+MDDS_LIBS = @MDDS_LIBS@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+ORCUS_API_VERSION = @ORCUS_API_VERSION@
+ORCUS_MAJOR_VERSION = @ORCUS_MAJOR_VERSION@
+ORCUS_MICRO_VERSION = @ORCUS_MICRO_VERSION@
+ORCUS_MINOR_VERSION = @ORCUS_MINOR_VERSION@
+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@
+PARQUET_CFLAGS = @PARQUET_CFLAGS@
+PARQUET_LIBS = @PARQUET_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POW_LIB = @POW_LIB@
+PYTHON = @PYTHON@
+PYTHON_CFLAGS = @PYTHON_CFLAGS@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VALGRIND = @VALGRIND@
+VALGRIND_ENABLED = @VALGRIND_ENABLED@
+VERSION = @VERSION@
+ZLIB_CFLAGS = @ZLIB_CFLAGS@
+ZLIB_LIBS = @ZLIB_LIBS@
+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@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+runstatedir = @runstatedir@
+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@
+valgrind_enabled_tools = @valgrind_enabled_tools@
+valgrind_tools = @valgrind_tools@
+EXTRA_DIST = \
+ encryption_info.hpp
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/include/mso/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign src/include/mso/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+check-valgrind-local:
+check-valgrind-memcheck-local:
+check-valgrind-helgrind-local:
+check-valgrind-drd-local:
+check-valgrind-sgcheck-local:
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @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
+check-am: all-am
+check: check-am
+all-am: Makefile
+installdirs:
+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:
+
+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)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+check-valgrind: check-valgrind-am
+
+check-valgrind-am: check-valgrind-local
+
+check-valgrind-drd: check-valgrind-drd-am
+
+check-valgrind-drd-am: check-valgrind-drd-local
+
+check-valgrind-helgrind: check-valgrind-helgrind-am
+
+check-valgrind-helgrind-am: check-valgrind-helgrind-local
+
+check-valgrind-memcheck: check-valgrind-memcheck-am
+
+check-valgrind-memcheck-am: check-valgrind-memcheck-local
+
+check-valgrind-sgcheck: check-valgrind-sgcheck-am
+
+check-valgrind-sgcheck-am: check-valgrind-sgcheck-local
+
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+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 Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am check-valgrind-am \
+ check-valgrind-drd-am check-valgrind-drd-local \
+ check-valgrind-helgrind-am check-valgrind-helgrind-local \
+ check-valgrind-local check-valgrind-memcheck-am \
+ check-valgrind-memcheck-local check-valgrind-sgcheck-am \
+ check-valgrind-sgcheck-local clean clean-generic clean-libtool \
+ cscopelist-am ctags-am distclean distclean-generic \
+ distclean-libtool distdir dvi dvi-am html html-am info info-am \
+ install install-am 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-man \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+# 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/src/include/mso/encryption_info.hpp b/src/include/mso/encryption_info.hpp
new file mode 100644
index 0000000..efda244
--- /dev/null
+++ b/src/include/mso/encryption_info.hpp
@@ -0,0 +1,37 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef __ORCUS_MSO_ENCRYPTION_INFO_HPP__
+#define __ORCUS_MSO_ENCRYPTION_INFO_HPP__
+
+#include <orcus/env.hpp>
+
+#include <cstdlib>
+
+namespace orcus { namespace mso {
+
+struct encryption_info_reader_impl;
+
+class ORCUS_MSO_DLLPUBLIC encryption_info_reader
+{
+ encryption_info_reader(const encryption_info_reader&); // disabled
+ encryption_info_reader& operator= (const encryption_info_reader&); // disabled
+
+public:
+ encryption_info_reader();
+ ~encryption_info_reader();
+
+ void read(const char* p, size_t n);
+
+private:
+ encryption_info_reader_impl* mp_impl;
+};
+
+}}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/include/numeric_parser.hpp b/src/include/numeric_parser.hpp
new file mode 100644
index 0000000..fc047b6
--- /dev/null
+++ b/src/include/numeric_parser.hpp
@@ -0,0 +1,216 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_DETAIL_NUMERIC_PARSER_HPP
+#define INCLUDED_ORCUS_DETAIL_NUMERIC_PARSER_HPP
+
+#include <mdds/global.hpp>
+#include <limits>
+#include <cmath>
+
+namespace orcus { namespace detail {
+
+struct generic_parser_trait {};
+
+struct json_parser_trait {};
+
+struct parser_state
+{
+ /** number of digits before the decimal point. */
+ int int_digit_count = 0;
+ /** number of digits after the decimal point. */
+ int frac_digit_count = 0;
+ /** first digit before the decimal point. */
+ char first_int_digit = 0;
+ double parsed_value = 0.0;
+ double divisor = 1.0;
+ bool has_digit = false;
+ bool has_decimal = false;
+ bool negative_sign = false;
+};
+
+template<typename _Trait>
+double make_final_value(const parser_state& state);
+
+template<>
+inline double make_final_value<generic_parser_trait>(const parser_state& state)
+{
+ return state.negative_sign ? -state.parsed_value : state.parsed_value;
+}
+
+template<>
+inline double make_final_value<json_parser_trait>(const parser_state& state)
+{
+ if (state.int_digit_count > 1 && state.first_int_digit == 0)
+ // leading zeros not allowed.
+ return std::numeric_limits<double>::quiet_NaN();
+
+ if (state.has_decimal && (state.frac_digit_count == 0 || state.int_digit_count == 0))
+ // at least one digit is required both before and after the decimal point.
+ return std::numeric_limits<double>::quiet_NaN();
+
+ return state.negative_sign ? -state.parsed_value : state.parsed_value;
+}
+
+template<typename _Trait>
+class numeric_parser
+{
+ using trait_type = _Trait;
+
+ const char* mp_char;
+ const char* mp_end;
+
+ parser_state m_state;
+
+ bool check_sign()
+ {
+ bool negative_sign = false;
+
+ // Check for presence of a sign.
+ if (mp_char != mp_end)
+ {
+ switch (*mp_char)
+ {
+ case '+':
+ ++mp_char;
+ break;
+ case '-':
+ negative_sign = true;
+ ++mp_char;
+ break;
+ default:
+ ;
+ }
+ }
+
+ return negative_sign;
+ }
+
+ /**
+ * Parse the exponent part of a numeric string.
+ *
+ * @return extra divisor to multiply to the original divisor, or 0.0 if the
+ * parsing fails.
+ */
+ double parse_exponent()
+ {
+ const char* p0 = mp_char - 1; // original position to restore to in case of parsing failure. The e needs to be added back as well.
+ double exponent = 0.0;
+ bool valid = false;
+
+ bool negative_sign = check_sign();
+
+ for (; mp_char != mp_end; ++mp_char)
+ {
+ if (*mp_char < '0' || '9' < *mp_char)
+ {
+ // Non-digit encountered.
+ break;
+ }
+
+ valid = true;
+ exponent *= 10.0;
+ exponent += *mp_char - '0';
+ }
+
+ if (!valid)
+ {
+ // Restore the original position on failed parsing.
+ mp_char = p0;
+ return 0.0;
+ }
+
+ if (!negative_sign)
+ exponent = -exponent;
+
+ return std::pow(10.0, exponent);
+ }
+
+public:
+ numeric_parser(const char* p, const char* p_end) :
+ mp_char(p),
+ mp_end(p_end) {}
+
+ /**
+ * Start parsing the string.
+ *
+ * @return a finite value upon successful parsing, else NaN is returned.
+ */
+ double parse()
+ {
+ m_state.negative_sign = check_sign();
+
+ for (; mp_char != mp_end; ++mp_char)
+ {
+ if (*mp_char == '.')
+ {
+ if (m_state.has_decimal)
+ {
+ // Second '.' encountered. Terminate the parsing.
+ m_state.parsed_value /= m_state.divisor;
+ return make_final_value<trait_type>(m_state);
+ }
+
+ m_state.has_decimal = true;
+ continue;
+ }
+
+ if (m_state.has_digit && (*mp_char == 'e' || *mp_char == 'E'))
+ {
+ ++mp_char;
+ double extra_divisor = parse_exponent();
+ if (extra_divisor)
+ m_state.divisor *= extra_divisor;
+ break;
+ }
+
+ if (*mp_char < '0' || '9' < *mp_char)
+ {
+ if (!m_state.has_digit) // without a digit we have no numbers
+ return std::numeric_limits<double>::quiet_NaN();
+
+ m_state.parsed_value /= m_state.divisor;
+ return make_final_value<trait_type>(m_state);
+ }
+
+ m_state.has_digit = true;
+ char digit = *mp_char - '0';
+
+ if (m_state.has_decimal)
+ ++m_state.frac_digit_count;
+ else
+ {
+ if (!m_state.int_digit_count)
+ m_state.first_int_digit = digit;
+
+ ++m_state.int_digit_count;
+ }
+
+ m_state.parsed_value *= 10.0;
+ m_state.parsed_value += digit;
+
+ if (m_state.has_decimal)
+ m_state.divisor *= 10.0;
+ }
+ if (!m_state.has_digit) // without a digit we have no numbers
+ return std::numeric_limits<double>::quiet_NaN();
+
+ m_state.parsed_value /= m_state.divisor;
+ return make_final_value<trait_type>(m_state);
+ }
+
+ const char* get_char_position() const
+ {
+ return mp_char;
+ }
+};
+
+}} // namespace orcus::detail
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/include/ostream_utils.hpp b/src/include/ostream_utils.hpp
new file mode 100644
index 0000000..634b1f5
--- /dev/null
+++ b/src/include/ostream_utils.hpp
@@ -0,0 +1,34 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#pragma once
+
+#include <ostream>
+#include <string_view>
+
+namespace orcus { namespace detail {
+
+class ostream_format_guard
+{
+ std::ostream& m_os;
+ std::ios_base::fmtflags m_flags;
+public:
+ ostream_format_guard(std::ostream& os) :
+ m_os(os)
+ {
+ m_flags = m_os.flags();
+ }
+
+ ~ostream_format_guard()
+ {
+ m_os.setf(m_flags);
+ }
+};
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/include/test_global.hpp b/src/include/test_global.hpp
new file mode 100644
index 0000000..e217086
--- /dev/null
+++ b/src/include/test_global.hpp
@@ -0,0 +1,57 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_TEST_GLOBAL_HPP
+#define INCLUDED_ORCUS_TEST_GLOBAL_HPP
+
+#ifdef NDEBUG
+// release build
+#undef NDEBUG
+#include <cassert>
+#else
+// debug build
+#include <cassert>
+#endif
+
+#include <iostream>
+#include <chrono>
+
+namespace orcus { namespace test {
+
+class stack_printer
+{
+public:
+ explicit stack_printer(const char* msg);
+ ~stack_printer();
+
+private:
+ double get_time() const;
+
+ std::string m_msg;
+ double m_start_time;
+};
+
+class assert_error : public std::exception
+{
+ std::string m_msg;
+
+public:
+ assert_error(const char* filename, size_t line_no, const char* msg);
+
+ virtual const char* what() const noexcept override;
+};
+
+void verify_content(
+ const char* filename, size_t line_no, std::string_view expected, const std::string& actual);
+
+}} // namespace orcus::test
+
+#define ORCUS_TEST_FUNC_SCOPE orcus::test::stack_printer __sp__(__func__)
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/Makefile.am b/src/liborcus/Makefile.am
new file mode 100644
index 0000000..4f42193
--- /dev/null
+++ b/src/liborcus/Makefile.am
@@ -0,0 +1,590 @@
+
+AM_CPPFLAGS = \
+ -I$(top_srcdir)/include \
+ -I$(top_srcdir)/src/include \
+ -I./include $(BOOST_CPPFLAGS)
+
+EXTRA_PROGRAMS = \
+ css-document-tree-test \
+ json-document-tree-test \
+ yaml-document-tree-test \
+ xml-map-tree-test \
+ common-test \
+ dom-tree-test \
+ json-structure-tree-test \
+ json-map-tree-test \
+ xml-structure-tree-test \
+ xpath-parser-test
+
+TESTS =
+
+EXTRA_DIST = \
+ xml_element_types.hpp
+
+if HAVE_STATIC_LIB
+AM_CPPFLAGS += -D__ORCUS_STATIC_LIB=1
+else
+AM_CPPFLAGS += -D__ORCUS_BUILDING_DLL=1
+endif
+
+if HAVE_FILESYSTEM
+AM_CPPFLAGS += "-DHAVE_FILESYSTEM=1"
+endif
+
+if HAVE_EXPERIMENTAL_FILESYSTEM
+AM_CPPFLAGS += "-DHAVE_EXPERIMENTAL_FILESYSTEM=1"
+endif
+
+liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS = \
+ $(ZLIB_CFLAGS)
+
+liborcus_@ORCUS_API_VERSION@_la_LDFLAGS = \
+ -no-undefined $(BOOST_SYSTEM_LDFLAGS)
+
+liborcus_@ORCUS_API_VERSION@_la_LIBADD = \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ $(BOOST_SYSTEM_LIBS) $(ZLIB_LIBS)
+
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+liborcus_@ORCUS_API_VERSION@_la_LDFLAGS += -lstdc++fs
+else
+liborcus_@ORCUS_API_VERSION@_la_LDFLAGS += $(BOOST_FILESYSTEM_LDFLAGS)
+liborcus_@ORCUS_API_VERSION@_la_LIBADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
+AM_CPPFLAGS += -DSRCDIR=\""$(top_srcdir)"\"
+
+lib_LTLIBRARIES = liborcus-@ORCUS_API_VERSION@.la
+liborcus_@ORCUS_API_VERSION@_la_SOURCES = \
+ config.cpp \
+ css_document_tree.cpp \
+ css_selector.cpp \
+ detection_result.hpp \
+ detection_result.cpp \
+ dom_tree.cpp \
+ format_detection.cpp \
+ formula_result.hpp \
+ formula_result.cpp \
+ impl_utils.hpp \
+ info.cpp \
+ interface.cpp \
+ json_document_tree.cpp \
+ json_map_tree.hpp \
+ json_map_tree.cpp \
+ json_structure_mapper.hpp \
+ json_structure_mapper.cpp \
+ json_structure_tree.cpp \
+ json_util.hpp \
+ json_util.cpp \
+ spreadsheet_interface.cpp \
+ orcus_csv.cpp \
+ orcus_json.cpp \
+ orcus_xml.cpp \
+ orcus_xml_impl.hpp \
+ orcus_xml_impl.cpp \
+ orcus_xml_map_def.cpp \
+ measurement.cpp \
+ number_utils.cpp \
+ number_utils.hpp \
+ xml_context_base.hpp \
+ xml_context_base.cpp \
+ xml_context_global.hpp \
+ xml_context_global.cpp \
+ xml_element_types.cpp \
+ xml_element_validator.hpp \
+ xml_element_validator.cpp \
+ xml_empty_context.hpp \
+ xml_empty_context.cpp \
+ xml_map_tree.hpp \
+ xml_map_tree.cpp \
+ xml_stream_handler.hpp \
+ xml_stream_handler.cpp \
+ xml_stream_parser.hpp \
+ xml_stream_parser.cpp \
+ xml_simple_stream_handler.hpp \
+ xml_simple_stream_handler.cpp \
+ xml_structure_mapper.hpp \
+ xml_structure_mapper.cpp \
+ xml_structure_tree.cpp \
+ xml_util.hpp \
+ xml_util.cpp \
+ xpath_parser.cpp \
+ yaml_document_tree.cpp \
+ ooxml_namespace_types.cpp \
+ ooxml_namespace_types.hpp \
+ odf_namespace_types.hpp \
+ odf_namespace_types_hpp.inl \
+ odf_namespace_types.cpp \
+ odf_namespace_types_cpp.inl \
+ gnumeric_namespace_types.hpp \
+ gnumeric_namespace_types.cpp \
+ xls_xml_namespace_types.hpp \
+ xls_xml_namespace_types.cpp \
+ session_context.hpp \
+ session_context.cpp \
+ spreadsheet_impl_types.hpp \
+ spreadsheet_impl_types.cpp \
+ spreadsheet_types.cpp \
+ spreadsheet_iface_util.hpp \
+ spreadsheet_iface_util.cpp \
+ string_helper.hpp \
+ string_helper.cpp
+
+if WITH_XLSX_FILTER
+
+EXTRA_PROGRAMS += \
+ xlsx-sheet-context-test
+
+liborcus_@ORCUS_API_VERSION@_la_SOURCES += \
+ ooxml_content_types.cpp \
+ ooxml_content_types.hpp \
+ ooxml_global.cpp \
+ ooxml_global.hpp \
+ ooxml_schemas.cpp \
+ ooxml_schemas.hpp \
+ ooxml_token_constants.hpp \
+ ooxml_token_constants.inl \
+ ooxml_tokens.cpp \
+ ooxml_tokens.hpp \
+ ooxml_tokens.inl \
+ ooxml_types.hpp \
+ ooxml_types.cpp \
+ opc_context.cpp \
+ opc_context.hpp \
+ opc_reader.cpp \
+ opc_reader.hpp \
+ opc_reader.hpp \
+ opc_token_constants.hpp \
+ opc_token_constants.inl \
+ opc_tokens.inl \
+ orcus_xlsx.cpp \
+ orcus_import_xlsx.cpp \
+ xlsx_shared_strings_context.cpp \
+ xlsx_shared_strings_context.hpp \
+ xlsx_drawing_context.hpp \
+ xlsx_drawing_context.cpp \
+ xlsx_handler.cpp \
+ xlsx_handler.hpp \
+ xlsx_helper.cpp \
+ xlsx_helper.hpp \
+ xlsx_session_data.hpp \
+ xlsx_session_data.cpp \
+ xlsx_revision_context.cpp \
+ xlsx_revision_context.hpp \
+ xlsx_pivot_context.cpp \
+ xlsx_pivot_context.hpp \
+ xlsx_sheet_context.cpp \
+ xlsx_sheet_context.hpp \
+ xlsx_styles_context.cpp \
+ xlsx_styles_context.hpp \
+ xlsx_conditional_format_context.cpp \
+ xlsx_conditional_format_context.hpp \
+ xlsx_table_context.cpp \
+ xlsx_table_context.hpp \
+ xlsx_autofilter_context.cpp \
+ xlsx_autofilter_context.hpp \
+ xlsx_types.hpp \
+ xlsx_types.cpp \
+ xlsx_workbook_context.cpp \
+ xlsx_workbook_context.hpp
+
+# xlsx-sheet-context-test
+
+xlsx_sheet_context_test_SOURCES = \
+ formula_result.cpp \
+ ooxml_global.cpp \
+ ooxml_namespace_types.cpp \
+ ooxml_schemas.cpp \
+ ooxml_tokens.cpp \
+ ooxml_types.cpp \
+ session_context.cpp \
+ spreadsheet_interface.cpp \
+ xlsx_autofilter_context.cpp \
+ xlsx_conditional_format_context.cpp \
+ xlsx_helper.cpp \
+ xlsx_session_data.cpp \
+ xlsx_sheet_context.cpp \
+ xlsx_sheet_context_test.cpp \
+ xlsx_types.cpp \
+ xml_context_base.cpp \
+ xml_context_global.cpp \
+ xml_element_types.cpp \
+ xml_element_validator.cpp \
+ xml_empty_context.cpp \
+ xml_util.cpp
+
+xlsx_sheet_context_test_LDADD = \
+ liborcus-@ORCUS_API_VERSION@.la \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../test/liborcus-test.a
+
+xlsx_sheet_context_test_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+
+TESTS += \
+ xlsx-sheet-context-test
+
+endif # WITH_XLSX_FILTER
+
+if WITH_XLS_XML_FILTER
+
+liborcus_@ORCUS_API_VERSION@_la_SOURCES += \
+ xls_xml_tokens.hpp \
+ xls_xml_tokens.inl \
+ xls_xml_tokens.cpp \
+ xls_xml_token_constants.hpp \
+ xls_xml_token_constants.inl \
+ orcus_xls_xml.cpp \
+ xls_xml_detection_handler.hpp \
+ xls_xml_detection_handler.cpp \
+ xls_xml_handler.hpp \
+ xls_xml_handler.cpp \
+ xls_xml_context.hpp \
+ xls_xml_context.cpp
+
+endif # WITH_XLS_XML_FILTER
+
+if WITH_ODS_FILTER
+
+liborcus_@ORCUS_API_VERSION@_la_SOURCES += \
+ odf_document_styles_context.hpp \
+ odf_document_styles_context.cpp \
+ odf_para_context.hpp \
+ odf_para_context.cpp \
+ odf_styles.hpp \
+ odf_styles.cpp \
+ odf_styles_context.hpp \
+ odf_styles_context.cpp \
+ odf_style_context.hpp \
+ odf_style_context.cpp \
+ odf_number_format_context.hpp \
+ odf_number_format_context.cpp \
+ odf_token_constants.hpp \
+ odf_token_constants.inl \
+ odf_tokens.hpp \
+ odf_tokens.inl \
+ odf_tokens.cpp \
+ ods_content_xml_context.hpp \
+ ods_content_xml_context.cpp \
+ ods_dde_links_context.hpp \
+ ods_dde_links_context.cpp \
+ ods_session_data.hpp \
+ ods_session_data.cpp \
+ odf_helper.hpp \
+ odf_helper.cpp \
+ orcus_ods.cpp \
+ orcus_import_ods.cpp
+
+# odf-helper-test
+
+EXTRA_PROGRAMS += \
+ odf-helper-test
+
+odf_helper_test_SOURCES = \
+ odf_helper.cpp \
+ string_helper.cpp \
+ odf_helper_test.cpp
+
+odf_helper_test_LDADD = \
+ liborcus-@ORCUS_API_VERSION@.la \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la
+
+odf_helper_test_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+
+TESTS += \
+ odf-helper-test
+
+endif # WITH_ODS_FILTER
+
+if WITH_GNUMERIC_FILTER
+
+liborcus_@ORCUS_API_VERSION@_la_SOURCES += \
+ gnumeric_cell_context.cpp \
+ gnumeric_cell_context.hpp \
+ gnumeric_context.cpp \
+ gnumeric_context.hpp \
+ gnumeric_detection_handler.cpp \
+ gnumeric_detection_handler.hpp \
+ gnumeric_filter_context.cpp \
+ gnumeric_filter_context.hpp \
+ gnumeric_handler.cpp \
+ gnumeric_handler.hpp \
+ gnumeric_names_context.cpp \
+ gnumeric_names_context.hpp \
+ gnumeric_sheet_context.cpp \
+ gnumeric_sheet_context.hpp \
+ gnumeric_styles_context.cpp \
+ gnumeric_styles_context.hpp \
+ gnumeric_token_constants.hpp \
+ gnumeric_token_constants.inl \
+ gnumeric_tokens.cpp \
+ gnumeric_tokens.hpp \
+ gnumeric_tokens.inl \
+ gnumeric_types.cpp \
+ gnumeric_types.hpp \
+ gnumeric_value_format_parser.cpp \
+ gnumeric_value_format_parser.hpp \
+ orcus_gnumeric.cpp
+
+liborcus_@ORCUS_API_VERSION@_la_LDFLAGS += \
+ $(BOOST_IOSTREAMS_LDFLAGS)
+
+liborcus_@ORCUS_API_VERSION@_la_LIBADD += \
+ $(BOOST_IOSTREAMS_LIBS)
+
+# gnumeric-cell-context-test
+
+EXTRA_PROGRAMS += \
+ gnumeric-cell-context-test \
+ gnumeric-sheet-context-test
+
+gnumeric_cell_context_test_SOURCES = \
+ number_utils.cpp \
+ session_context.cpp \
+ gnumeric_cell_context_test.cpp \
+ gnumeric_cell_context.cpp \
+ gnumeric_value_format_parser.cpp \
+ xml_context_base.cpp \
+ xml_element_types.cpp \
+ xml_element_validator.cpp \
+ xml_empty_context.cpp \
+ xml_util.cpp \
+ gnumeric_namespace_types.cpp \
+ gnumeric_tokens.cpp \
+ gnumeric_types.cpp \
+ odf_namespace_types.cpp \
+ spreadsheet_interface.cpp
+
+gnumeric_cell_context_test_LDADD = \
+ liborcus-@ORCUS_API_VERSION@.la \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../test/liborcus-test.a
+
+orcus_gnumeric_cell_context_test_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+
+TESTS += gnumeric-cell-context-test
+
+# gnumeric-sheet-context-test
+
+gnumeric_sheet_context_test_SOURCES = \
+ session_context.cpp \
+ gnumeric_sheet_context_test.cpp \
+ gnumeric_sheet_context.cpp \
+ gnumeric_names_context.cpp \
+ gnumeric_cell_context.cpp \
+ gnumeric_filter_context.cpp \
+ gnumeric_styles_context.cpp \
+ gnumeric_value_format_parser.cpp \
+ gnumeric_types.cpp \
+ number_utils.cpp \
+ xml_context_base.cpp \
+ xml_element_types.cpp \
+ xml_element_validator.cpp \
+ xml_empty_context.cpp \
+ xml_util.cpp \
+ gnumeric_namespace_types.cpp \
+ gnumeric_tokens.cpp \
+ odf_namespace_types.cpp \
+ spreadsheet_interface.cpp \
+ string_helper.cpp
+
+gnumeric_sheet_context_test_LDADD = \
+ liborcus-@ORCUS_API_VERSION@.la \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../test/liborcus-test.a
+
+gnumeric_sheet_context_test_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+
+TESTS += gnumeric-sheet-context-test
+
+endif # WITH_GNUMERIC_FILTER
+
+if WITH_PARQUET_FILTER
+
+liborcus_@ORCUS_API_VERSION@_la_SOURCES += \
+ orcus_parquet.cpp
+
+liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS += \
+ $(PARQUET_CFLAGS)
+
+liborcus_@ORCUS_API_VERSION@_la_LDFLAGS += \
+ $(PARQUET_LDFLAGS)
+
+liborcus_@ORCUS_API_VERSION@_la_LIBADD += \
+ $(PARQUET_LIBS)
+
+endif # WITH_PARQUET_FILTER
+
+# css-document-tree-test
+
+css_document_tree_test_SOURCES = \
+ css_document_tree.cpp \
+ css_document_tree_test.cpp
+
+css_document_tree_test_LDADD = \
+ liborcus-@ORCUS_API_VERSION@.la \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ $(BOOST_SYSTEM_LIBS)
+
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+css_document_tree_test_LDADD += -lstdc++fs
+else
+css_document_tree_test_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
+# json-document-tree-test
+
+json_document_tree_test_SOURCES = \
+ json_document_tree.cpp \
+ json_util.cpp \
+ json_document_tree_test.cpp
+
+json_document_tree_test_LDADD = \
+ liborcus-@ORCUS_API_VERSION@.la \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../test/liborcus-test.a \
+ $(BOOST_SYSTEM_LIBS)
+
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+json_document_tree_test_LDADD += -lstdc++fs
+else
+json_document_tree_test_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
+json_document_tree_test_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+
+# yaml-document-tree-test
+
+yaml_document_tree_test_SOURCES = \
+ yaml_document_tree.cpp \
+ json_util.cpp \
+ yaml_document_tree_test.cpp
+
+yaml_document_tree_test_LDADD = \
+ liborcus-@ORCUS_API_VERSION@.la \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ $(BOOST_SYSTEM_LIBS)
+
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+yaml_document_tree_test_LDADD += -lstdc++fs
+else
+yaml_document_tree_test_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
+yaml_document_tree_test_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+
+# xml-map-tree-test
+
+xml_map_tree_test_SOURCES = \
+ xml_map_tree.cpp \
+ xml_map_tree.hpp \
+ xpath_parser.hpp \
+ xpath_parser.cpp \
+ spreadsheet_impl_types.hpp \
+ spreadsheet_impl_types.cpp \
+ xml_map_tree_test.cpp
+
+xml_map_tree_test_LDADD = \
+ liborcus-@ORCUS_API_VERSION@.la \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../test/liborcus-test.a \
+ $(BOOST_SYSTEM_LIBS)
+
+# xml-structure-tree-test
+
+xml_structure_tree_test_SOURCES = \
+ string_helper.cpp \
+ xml_structure_tree.cpp \
+ xml_structure_mapper.cpp \
+ xml_structure_tree_test.cpp
+
+xml_structure_tree_test_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+
+xml_structure_tree_test_LDADD = \
+ liborcus-@ORCUS_API_VERSION@.la \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ $(BOOST_SYSTEM_LIBS)
+
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+xml_structure_tree_test_LDADD += -lstdc++fs
+else
+xml_structure_tree_test_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
+# common-test
+
+common_test_SOURCES = \
+ common_test.cpp
+
+common_test_LDADD = \
+ liborcus-@ORCUS_API_VERSION@.la \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la
+
+# dom-tree-test
+
+dom_tree_test_SOURCES = dom_tree_test.cpp
+dom_tree_test_LDADD = \
+ liborcus-@ORCUS_API_VERSION@.la \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la
+
+# json-structure-tree-test
+
+json_structure_tree_test_SOURCES = json_structure_tree_test.cpp
+json_structure_tree_test_LDADD = \
+ liborcus-@ORCUS_API_VERSION@.la \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ $(BOOST_SYSTEM_LIBS)
+
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+json_structure_tree_test_LDADD += -lstdc++fs
+else
+json_structure_tree_test_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
+# json-map-tree-test
+
+json_map_tree_test_SOURCES = json_map_tree_test.cpp \
+ json_map_tree.cpp \
+ spreadsheet_impl_types.cpp
+json_map_tree_test_LDADD = \
+ liborcus-@ORCUS_API_VERSION@.la \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ $(BOOST_SYSTEM_LIBS)
+
+# xpath-parser-test
+
+xpath_parser_test_SOURCES = \
+ xpath_parser_test.cpp \
+ xpath_parser.cpp
+xpath_parser_test_LDADD = \
+ liborcus-@ORCUS_API_VERSION@.la \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ $(BOOST_SYSTEM_LIBS)
+
+TESTS += \
+ css-document-tree-test \
+ json-document-tree-test \
+ yaml-document-tree-test \
+ xml-map-tree-test \
+ common-test \
+ dom-tree-test \
+ json-structure-tree-test \
+ json-map-tree-test \
+ xml-structure-tree-test \
+ xpath-parser-test
+
+distclean-local:
+ rm -rf $(TESTS)
+
+@VALGRIND_CHECK_RULES@
diff --git a/src/liborcus/Makefile.in b/src/liborcus/Makefile.in
new file mode 100644
index 0000000..2b75863
--- /dev/null
+++ b/src/liborcus/Makefile.in
@@ -0,0 +1,4283 @@
+# Makefile.in generated by automake 1.16.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2021 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.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+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@
+EXTRA_PROGRAMS = css-document-tree-test$(EXEEXT) \
+ json-document-tree-test$(EXEEXT) \
+ yaml-document-tree-test$(EXEEXT) xml-map-tree-test$(EXEEXT) \
+ common-test$(EXEEXT) dom-tree-test$(EXEEXT) \
+ json-structure-tree-test$(EXEEXT) json-map-tree-test$(EXEEXT) \
+ xml-structure-tree-test$(EXEEXT) xpath-parser-test$(EXEEXT) \
+ $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3)
+TESTS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
+ css-document-tree-test$(EXEEXT) \
+ json-document-tree-test$(EXEEXT) \
+ yaml-document-tree-test$(EXEEXT) xml-map-tree-test$(EXEEXT) \
+ common-test$(EXEEXT) dom-tree-test$(EXEEXT) \
+ json-structure-tree-test$(EXEEXT) json-map-tree-test$(EXEEXT) \
+ xml-structure-tree-test$(EXEEXT) xpath-parser-test$(EXEEXT)
+@HAVE_STATIC_LIB_TRUE@am__append_1 = -D__ORCUS_STATIC_LIB=1
+@HAVE_STATIC_LIB_FALSE@am__append_2 = -D__ORCUS_BUILDING_DLL=1
+@HAVE_FILESYSTEM_TRUE@am__append_3 = "-DHAVE_FILESYSTEM=1"
+@HAVE_EXPERIMENTAL_FILESYSTEM_TRUE@am__append_4 = "-DHAVE_EXPERIMENTAL_FILESYSTEM=1"
+@HAVE_EXPERIMENTAL_FILESYSTEM_TRUE@@HAVE_FILESYSTEM_FALSE@am__append_5 = -lstdc++fs
+@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@am__append_6 = $(BOOST_FILESYSTEM_LDFLAGS)
+@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@am__append_7 = $(BOOST_FILESYSTEM_LIBS)
+@WITH_XLSX_FILTER_TRUE@am__append_8 = \
+@WITH_XLSX_FILTER_TRUE@ xlsx-sheet-context-test
+
+@WITH_XLSX_FILTER_TRUE@am__append_9 = \
+@WITH_XLSX_FILTER_TRUE@ ooxml_content_types.cpp \
+@WITH_XLSX_FILTER_TRUE@ ooxml_content_types.hpp \
+@WITH_XLSX_FILTER_TRUE@ ooxml_global.cpp \
+@WITH_XLSX_FILTER_TRUE@ ooxml_global.hpp \
+@WITH_XLSX_FILTER_TRUE@ ooxml_schemas.cpp \
+@WITH_XLSX_FILTER_TRUE@ ooxml_schemas.hpp \
+@WITH_XLSX_FILTER_TRUE@ ooxml_token_constants.hpp \
+@WITH_XLSX_FILTER_TRUE@ ooxml_token_constants.inl \
+@WITH_XLSX_FILTER_TRUE@ ooxml_tokens.cpp \
+@WITH_XLSX_FILTER_TRUE@ ooxml_tokens.hpp \
+@WITH_XLSX_FILTER_TRUE@ ooxml_tokens.inl \
+@WITH_XLSX_FILTER_TRUE@ ooxml_types.hpp \
+@WITH_XLSX_FILTER_TRUE@ ooxml_types.cpp \
+@WITH_XLSX_FILTER_TRUE@ opc_context.cpp \
+@WITH_XLSX_FILTER_TRUE@ opc_context.hpp \
+@WITH_XLSX_FILTER_TRUE@ opc_reader.cpp \
+@WITH_XLSX_FILTER_TRUE@ opc_reader.hpp \
+@WITH_XLSX_FILTER_TRUE@ opc_reader.hpp \
+@WITH_XLSX_FILTER_TRUE@ opc_token_constants.hpp \
+@WITH_XLSX_FILTER_TRUE@ opc_token_constants.inl \
+@WITH_XLSX_FILTER_TRUE@ opc_tokens.inl \
+@WITH_XLSX_FILTER_TRUE@ orcus_xlsx.cpp \
+@WITH_XLSX_FILTER_TRUE@ orcus_import_xlsx.cpp \
+@WITH_XLSX_FILTER_TRUE@ xlsx_shared_strings_context.cpp \
+@WITH_XLSX_FILTER_TRUE@ xlsx_shared_strings_context.hpp \
+@WITH_XLSX_FILTER_TRUE@ xlsx_drawing_context.hpp \
+@WITH_XLSX_FILTER_TRUE@ xlsx_drawing_context.cpp \
+@WITH_XLSX_FILTER_TRUE@ xlsx_handler.cpp \
+@WITH_XLSX_FILTER_TRUE@ xlsx_handler.hpp \
+@WITH_XLSX_FILTER_TRUE@ xlsx_helper.cpp \
+@WITH_XLSX_FILTER_TRUE@ xlsx_helper.hpp \
+@WITH_XLSX_FILTER_TRUE@ xlsx_session_data.hpp \
+@WITH_XLSX_FILTER_TRUE@ xlsx_session_data.cpp \
+@WITH_XLSX_FILTER_TRUE@ xlsx_revision_context.cpp \
+@WITH_XLSX_FILTER_TRUE@ xlsx_revision_context.hpp \
+@WITH_XLSX_FILTER_TRUE@ xlsx_pivot_context.cpp \
+@WITH_XLSX_FILTER_TRUE@ xlsx_pivot_context.hpp \
+@WITH_XLSX_FILTER_TRUE@ xlsx_sheet_context.cpp \
+@WITH_XLSX_FILTER_TRUE@ xlsx_sheet_context.hpp \
+@WITH_XLSX_FILTER_TRUE@ xlsx_styles_context.cpp \
+@WITH_XLSX_FILTER_TRUE@ xlsx_styles_context.hpp \
+@WITH_XLSX_FILTER_TRUE@ xlsx_conditional_format_context.cpp \
+@WITH_XLSX_FILTER_TRUE@ xlsx_conditional_format_context.hpp \
+@WITH_XLSX_FILTER_TRUE@ xlsx_table_context.cpp \
+@WITH_XLSX_FILTER_TRUE@ xlsx_table_context.hpp \
+@WITH_XLSX_FILTER_TRUE@ xlsx_autofilter_context.cpp \
+@WITH_XLSX_FILTER_TRUE@ xlsx_autofilter_context.hpp \
+@WITH_XLSX_FILTER_TRUE@ xlsx_types.hpp \
+@WITH_XLSX_FILTER_TRUE@ xlsx_types.cpp \
+@WITH_XLSX_FILTER_TRUE@ xlsx_workbook_context.cpp \
+@WITH_XLSX_FILTER_TRUE@ xlsx_workbook_context.hpp
+
+@WITH_XLSX_FILTER_TRUE@am__append_10 = \
+@WITH_XLSX_FILTER_TRUE@ xlsx-sheet-context-test
+
+@WITH_XLS_XML_FILTER_TRUE@am__append_11 = \
+@WITH_XLS_XML_FILTER_TRUE@ xls_xml_tokens.hpp \
+@WITH_XLS_XML_FILTER_TRUE@ xls_xml_tokens.inl \
+@WITH_XLS_XML_FILTER_TRUE@ xls_xml_tokens.cpp \
+@WITH_XLS_XML_FILTER_TRUE@ xls_xml_token_constants.hpp \
+@WITH_XLS_XML_FILTER_TRUE@ xls_xml_token_constants.inl \
+@WITH_XLS_XML_FILTER_TRUE@ orcus_xls_xml.cpp \
+@WITH_XLS_XML_FILTER_TRUE@ xls_xml_detection_handler.hpp \
+@WITH_XLS_XML_FILTER_TRUE@ xls_xml_detection_handler.cpp \
+@WITH_XLS_XML_FILTER_TRUE@ xls_xml_handler.hpp \
+@WITH_XLS_XML_FILTER_TRUE@ xls_xml_handler.cpp \
+@WITH_XLS_XML_FILTER_TRUE@ xls_xml_context.hpp \
+@WITH_XLS_XML_FILTER_TRUE@ xls_xml_context.cpp
+
+@WITH_ODS_FILTER_TRUE@am__append_12 = \
+@WITH_ODS_FILTER_TRUE@ odf_document_styles_context.hpp \
+@WITH_ODS_FILTER_TRUE@ odf_document_styles_context.cpp \
+@WITH_ODS_FILTER_TRUE@ odf_para_context.hpp \
+@WITH_ODS_FILTER_TRUE@ odf_para_context.cpp \
+@WITH_ODS_FILTER_TRUE@ odf_styles.hpp \
+@WITH_ODS_FILTER_TRUE@ odf_styles.cpp \
+@WITH_ODS_FILTER_TRUE@ odf_styles_context.hpp \
+@WITH_ODS_FILTER_TRUE@ odf_styles_context.cpp \
+@WITH_ODS_FILTER_TRUE@ odf_style_context.hpp \
+@WITH_ODS_FILTER_TRUE@ odf_style_context.cpp \
+@WITH_ODS_FILTER_TRUE@ odf_number_format_context.hpp \
+@WITH_ODS_FILTER_TRUE@ odf_number_format_context.cpp \
+@WITH_ODS_FILTER_TRUE@ odf_token_constants.hpp \
+@WITH_ODS_FILTER_TRUE@ odf_token_constants.inl \
+@WITH_ODS_FILTER_TRUE@ odf_tokens.hpp \
+@WITH_ODS_FILTER_TRUE@ odf_tokens.inl \
+@WITH_ODS_FILTER_TRUE@ odf_tokens.cpp \
+@WITH_ODS_FILTER_TRUE@ ods_content_xml_context.hpp \
+@WITH_ODS_FILTER_TRUE@ ods_content_xml_context.cpp \
+@WITH_ODS_FILTER_TRUE@ ods_dde_links_context.hpp \
+@WITH_ODS_FILTER_TRUE@ ods_dde_links_context.cpp \
+@WITH_ODS_FILTER_TRUE@ ods_session_data.hpp \
+@WITH_ODS_FILTER_TRUE@ ods_session_data.cpp \
+@WITH_ODS_FILTER_TRUE@ odf_helper.hpp \
+@WITH_ODS_FILTER_TRUE@ odf_helper.cpp \
+@WITH_ODS_FILTER_TRUE@ orcus_ods.cpp \
+@WITH_ODS_FILTER_TRUE@ orcus_import_ods.cpp
+
+
+# odf-helper-test
+@WITH_ODS_FILTER_TRUE@am__append_13 = \
+@WITH_ODS_FILTER_TRUE@ odf-helper-test
+
+@WITH_ODS_FILTER_TRUE@am__append_14 = \
+@WITH_ODS_FILTER_TRUE@ odf-helper-test
+
+@WITH_GNUMERIC_FILTER_TRUE@am__append_15 = \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_cell_context.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_cell_context.hpp \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_context.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_context.hpp \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_detection_handler.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_detection_handler.hpp \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_filter_context.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_filter_context.hpp \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_handler.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_handler.hpp \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_names_context.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_names_context.hpp \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_sheet_context.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_sheet_context.hpp \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_styles_context.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_styles_context.hpp \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_token_constants.hpp \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_token_constants.inl \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_tokens.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_tokens.hpp \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_tokens.inl \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_types.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_types.hpp \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_value_format_parser.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_value_format_parser.hpp \
+@WITH_GNUMERIC_FILTER_TRUE@ orcus_gnumeric.cpp
+
+@WITH_GNUMERIC_FILTER_TRUE@am__append_16 = \
+@WITH_GNUMERIC_FILTER_TRUE@ $(BOOST_IOSTREAMS_LDFLAGS)
+
+@WITH_GNUMERIC_FILTER_TRUE@am__append_17 = \
+@WITH_GNUMERIC_FILTER_TRUE@ $(BOOST_IOSTREAMS_LIBS)
+
+
+# gnumeric-cell-context-test
+@WITH_GNUMERIC_FILTER_TRUE@am__append_18 = \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric-cell-context-test \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric-sheet-context-test
+
+@WITH_GNUMERIC_FILTER_TRUE@am__append_19 = gnumeric-cell-context-test \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric-sheet-context-test
+@WITH_PARQUET_FILTER_TRUE@am__append_20 = \
+@WITH_PARQUET_FILTER_TRUE@ orcus_parquet.cpp
+
+@WITH_PARQUET_FILTER_TRUE@am__append_21 = \
+@WITH_PARQUET_FILTER_TRUE@ $(PARQUET_CFLAGS)
+
+@WITH_PARQUET_FILTER_TRUE@am__append_22 = \
+@WITH_PARQUET_FILTER_TRUE@ $(PARQUET_LDFLAGS)
+
+@WITH_PARQUET_FILTER_TRUE@am__append_23 = \
+@WITH_PARQUET_FILTER_TRUE@ $(PARQUET_LIBS)
+
+@HAVE_EXPERIMENTAL_FILESYSTEM_TRUE@@HAVE_FILESYSTEM_FALSE@am__append_24 = -lstdc++fs
+@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@am__append_25 = $(BOOST_FILESYSTEM_LIBS)
+@HAVE_EXPERIMENTAL_FILESYSTEM_TRUE@@HAVE_FILESYSTEM_FALSE@am__append_26 = -lstdc++fs
+@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@am__append_27 = $(BOOST_FILESYSTEM_LIBS)
+@HAVE_EXPERIMENTAL_FILESYSTEM_TRUE@@HAVE_FILESYSTEM_FALSE@am__append_28 = -lstdc++fs
+@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@am__append_29 = $(BOOST_FILESYSTEM_LIBS)
+@HAVE_EXPERIMENTAL_FILESYSTEM_TRUE@@HAVE_FILESYSTEM_FALSE@am__append_30 = -lstdc++fs
+@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@am__append_31 = $(BOOST_FILESYSTEM_LIBS)
+@HAVE_EXPERIMENTAL_FILESYSTEM_TRUE@@HAVE_FILESYSTEM_FALSE@am__append_32 = -lstdc++fs
+@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@am__append_33 = $(BOOST_FILESYSTEM_LIBS)
+subdir = src/liborcus
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
+ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_17.m4 \
+ $(top_srcdir)/m4/boost.m4 $(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)/m4/m4_ax_valgrind_check.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES = constants.inl
+CONFIG_CLEAN_VPATH_FILES =
+@WITH_XLSX_FILTER_TRUE@am__EXEEXT_1 = \
+@WITH_XLSX_FILTER_TRUE@ xlsx-sheet-context-test$(EXEEXT)
+@WITH_ODS_FILTER_TRUE@am__EXEEXT_2 = odf-helper-test$(EXEEXT)
+@WITH_GNUMERIC_FILTER_TRUE@am__EXEEXT_3 = gnumeric-cell-context-test$(EXEEXT) \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric-sheet-context-test$(EXEEXT)
+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)"
+LTLIBRARIES = $(lib_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1)
+@WITH_GNUMERIC_FILTER_TRUE@am__DEPENDENCIES_3 = $(am__DEPENDENCIES_1)
+@WITH_PARQUET_FILTER_TRUE@am__DEPENDENCIES_4 = $(am__DEPENDENCIES_1)
+liborcus_@ORCUS_API_VERSION@_la_DEPENDENCIES = \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_3) \
+ $(am__DEPENDENCIES_4)
+am__liborcus_@ORCUS_API_VERSION@_la_SOURCES_DIST = config.cpp \
+ css_document_tree.cpp css_selector.cpp detection_result.hpp \
+ detection_result.cpp dom_tree.cpp format_detection.cpp \
+ formula_result.hpp formula_result.cpp impl_utils.hpp info.cpp \
+ interface.cpp json_document_tree.cpp json_map_tree.hpp \
+ json_map_tree.cpp json_structure_mapper.hpp \
+ json_structure_mapper.cpp json_structure_tree.cpp \
+ json_util.hpp json_util.cpp spreadsheet_interface.cpp \
+ orcus_csv.cpp orcus_json.cpp orcus_xml.cpp orcus_xml_impl.hpp \
+ orcus_xml_impl.cpp orcus_xml_map_def.cpp measurement.cpp \
+ number_utils.cpp number_utils.hpp xml_context_base.hpp \
+ xml_context_base.cpp xml_context_global.hpp \
+ xml_context_global.cpp xml_element_types.cpp \
+ xml_element_validator.hpp xml_element_validator.cpp \
+ xml_empty_context.hpp xml_empty_context.cpp xml_map_tree.hpp \
+ xml_map_tree.cpp xml_stream_handler.hpp xml_stream_handler.cpp \
+ xml_stream_parser.hpp xml_stream_parser.cpp \
+ xml_simple_stream_handler.hpp xml_simple_stream_handler.cpp \
+ xml_structure_mapper.hpp xml_structure_mapper.cpp \
+ xml_structure_tree.cpp xml_util.hpp xml_util.cpp \
+ xpath_parser.cpp yaml_document_tree.cpp \
+ ooxml_namespace_types.cpp ooxml_namespace_types.hpp \
+ odf_namespace_types.hpp odf_namespace_types_hpp.inl \
+ odf_namespace_types.cpp odf_namespace_types_cpp.inl \
+ gnumeric_namespace_types.hpp gnumeric_namespace_types.cpp \
+ xls_xml_namespace_types.hpp xls_xml_namespace_types.cpp \
+ session_context.hpp session_context.cpp \
+ spreadsheet_impl_types.hpp spreadsheet_impl_types.cpp \
+ spreadsheet_types.cpp spreadsheet_iface_util.hpp \
+ spreadsheet_iface_util.cpp string_helper.hpp string_helper.cpp \
+ ooxml_content_types.cpp ooxml_content_types.hpp \
+ ooxml_global.cpp ooxml_global.hpp ooxml_schemas.cpp \
+ ooxml_schemas.hpp ooxml_token_constants.hpp \
+ ooxml_token_constants.inl ooxml_tokens.cpp ooxml_tokens.hpp \
+ ooxml_tokens.inl ooxml_types.hpp ooxml_types.cpp \
+ opc_context.cpp opc_context.hpp opc_reader.cpp opc_reader.hpp \
+ opc_token_constants.hpp opc_token_constants.inl opc_tokens.inl \
+ orcus_xlsx.cpp orcus_import_xlsx.cpp \
+ xlsx_shared_strings_context.cpp \
+ xlsx_shared_strings_context.hpp xlsx_drawing_context.hpp \
+ xlsx_drawing_context.cpp xlsx_handler.cpp xlsx_handler.hpp \
+ xlsx_helper.cpp xlsx_helper.hpp xlsx_session_data.hpp \
+ xlsx_session_data.cpp xlsx_revision_context.cpp \
+ xlsx_revision_context.hpp xlsx_pivot_context.cpp \
+ xlsx_pivot_context.hpp xlsx_sheet_context.cpp \
+ xlsx_sheet_context.hpp xlsx_styles_context.cpp \
+ xlsx_styles_context.hpp xlsx_conditional_format_context.cpp \
+ xlsx_conditional_format_context.hpp xlsx_table_context.cpp \
+ xlsx_table_context.hpp xlsx_autofilter_context.cpp \
+ xlsx_autofilter_context.hpp xlsx_types.hpp xlsx_types.cpp \
+ xlsx_workbook_context.cpp xlsx_workbook_context.hpp \
+ xls_xml_tokens.hpp xls_xml_tokens.inl xls_xml_tokens.cpp \
+ xls_xml_token_constants.hpp xls_xml_token_constants.inl \
+ orcus_xls_xml.cpp xls_xml_detection_handler.hpp \
+ xls_xml_detection_handler.cpp xls_xml_handler.hpp \
+ xls_xml_handler.cpp xls_xml_context.hpp xls_xml_context.cpp \
+ odf_document_styles_context.hpp \
+ odf_document_styles_context.cpp odf_para_context.hpp \
+ odf_para_context.cpp odf_styles.hpp odf_styles.cpp \
+ odf_styles_context.hpp odf_styles_context.cpp \
+ odf_style_context.hpp odf_style_context.cpp \
+ odf_number_format_context.hpp odf_number_format_context.cpp \
+ odf_token_constants.hpp odf_token_constants.inl odf_tokens.hpp \
+ odf_tokens.inl odf_tokens.cpp ods_content_xml_context.hpp \
+ ods_content_xml_context.cpp ods_dde_links_context.hpp \
+ ods_dde_links_context.cpp ods_session_data.hpp \
+ ods_session_data.cpp odf_helper.hpp odf_helper.cpp \
+ orcus_ods.cpp orcus_import_ods.cpp gnumeric_cell_context.cpp \
+ gnumeric_cell_context.hpp gnumeric_context.cpp \
+ gnumeric_context.hpp gnumeric_detection_handler.cpp \
+ gnumeric_detection_handler.hpp gnumeric_filter_context.cpp \
+ gnumeric_filter_context.hpp gnumeric_handler.cpp \
+ gnumeric_handler.hpp gnumeric_names_context.cpp \
+ gnumeric_names_context.hpp gnumeric_sheet_context.cpp \
+ gnumeric_sheet_context.hpp gnumeric_styles_context.cpp \
+ gnumeric_styles_context.hpp gnumeric_token_constants.hpp \
+ gnumeric_token_constants.inl gnumeric_tokens.cpp \
+ gnumeric_tokens.hpp gnumeric_tokens.inl gnumeric_types.cpp \
+ gnumeric_types.hpp gnumeric_value_format_parser.cpp \
+ gnumeric_value_format_parser.hpp orcus_gnumeric.cpp \
+ orcus_parquet.cpp
+@WITH_XLSX_FILTER_TRUE@am__objects_1 = liborcus_@ORCUS_API_VERSION@_la-ooxml_content_types.lo \
+@WITH_XLSX_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-ooxml_global.lo \
+@WITH_XLSX_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-ooxml_schemas.lo \
+@WITH_XLSX_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-ooxml_tokens.lo \
+@WITH_XLSX_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-ooxml_types.lo \
+@WITH_XLSX_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-opc_context.lo \
+@WITH_XLSX_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-opc_reader.lo \
+@WITH_XLSX_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-orcus_xlsx.lo \
+@WITH_XLSX_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-orcus_import_xlsx.lo \
+@WITH_XLSX_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-xlsx_shared_strings_context.lo \
+@WITH_XLSX_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-xlsx_drawing_context.lo \
+@WITH_XLSX_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-xlsx_handler.lo \
+@WITH_XLSX_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-xlsx_helper.lo \
+@WITH_XLSX_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-xlsx_session_data.lo \
+@WITH_XLSX_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-xlsx_revision_context.lo \
+@WITH_XLSX_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-xlsx_pivot_context.lo \
+@WITH_XLSX_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-xlsx_sheet_context.lo \
+@WITH_XLSX_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-xlsx_styles_context.lo \
+@WITH_XLSX_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-xlsx_conditional_format_context.lo \
+@WITH_XLSX_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-xlsx_table_context.lo \
+@WITH_XLSX_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-xlsx_autofilter_context.lo \
+@WITH_XLSX_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-xlsx_types.lo \
+@WITH_XLSX_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-xlsx_workbook_context.lo
+@WITH_XLS_XML_FILTER_TRUE@am__objects_2 = liborcus_@ORCUS_API_VERSION@_la-xls_xml_tokens.lo \
+@WITH_XLS_XML_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-orcus_xls_xml.lo \
+@WITH_XLS_XML_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-xls_xml_detection_handler.lo \
+@WITH_XLS_XML_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-xls_xml_handler.lo \
+@WITH_XLS_XML_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-xls_xml_context.lo
+@WITH_ODS_FILTER_TRUE@am__objects_3 = liborcus_@ORCUS_API_VERSION@_la-odf_document_styles_context.lo \
+@WITH_ODS_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-odf_para_context.lo \
+@WITH_ODS_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-odf_styles.lo \
+@WITH_ODS_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-odf_styles_context.lo \
+@WITH_ODS_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-odf_style_context.lo \
+@WITH_ODS_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-odf_number_format_context.lo \
+@WITH_ODS_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-odf_tokens.lo \
+@WITH_ODS_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-ods_content_xml_context.lo \
+@WITH_ODS_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-ods_dde_links_context.lo \
+@WITH_ODS_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-ods_session_data.lo \
+@WITH_ODS_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-odf_helper.lo \
+@WITH_ODS_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-orcus_ods.lo \
+@WITH_ODS_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-orcus_import_ods.lo
+@WITH_GNUMERIC_FILTER_TRUE@am__objects_4 = liborcus_@ORCUS_API_VERSION@_la-gnumeric_cell_context.lo \
+@WITH_GNUMERIC_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-gnumeric_context.lo \
+@WITH_GNUMERIC_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-gnumeric_detection_handler.lo \
+@WITH_GNUMERIC_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-gnumeric_filter_context.lo \
+@WITH_GNUMERIC_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-gnumeric_handler.lo \
+@WITH_GNUMERIC_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-gnumeric_names_context.lo \
+@WITH_GNUMERIC_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-gnumeric_sheet_context.lo \
+@WITH_GNUMERIC_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-gnumeric_styles_context.lo \
+@WITH_GNUMERIC_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-gnumeric_tokens.lo \
+@WITH_GNUMERIC_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-gnumeric_types.lo \
+@WITH_GNUMERIC_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-gnumeric_value_format_parser.lo \
+@WITH_GNUMERIC_FILTER_TRUE@ liborcus_@ORCUS_API_VERSION@_la-orcus_gnumeric.lo
+@WITH_PARQUET_FILTER_TRUE@am__objects_5 = liborcus_@ORCUS_API_VERSION@_la-orcus_parquet.lo
+am_liborcus_@ORCUS_API_VERSION@_la_OBJECTS = \
+ liborcus_@ORCUS_API_VERSION@_la-config.lo \
+ liborcus_@ORCUS_API_VERSION@_la-css_document_tree.lo \
+ liborcus_@ORCUS_API_VERSION@_la-css_selector.lo \
+ liborcus_@ORCUS_API_VERSION@_la-detection_result.lo \
+ liborcus_@ORCUS_API_VERSION@_la-dom_tree.lo \
+ liborcus_@ORCUS_API_VERSION@_la-format_detection.lo \
+ liborcus_@ORCUS_API_VERSION@_la-formula_result.lo \
+ liborcus_@ORCUS_API_VERSION@_la-info.lo \
+ liborcus_@ORCUS_API_VERSION@_la-interface.lo \
+ liborcus_@ORCUS_API_VERSION@_la-json_document_tree.lo \
+ liborcus_@ORCUS_API_VERSION@_la-json_map_tree.lo \
+ liborcus_@ORCUS_API_VERSION@_la-json_structure_mapper.lo \
+ liborcus_@ORCUS_API_VERSION@_la-json_structure_tree.lo \
+ liborcus_@ORCUS_API_VERSION@_la-json_util.lo \
+ liborcus_@ORCUS_API_VERSION@_la-spreadsheet_interface.lo \
+ liborcus_@ORCUS_API_VERSION@_la-orcus_csv.lo \
+ liborcus_@ORCUS_API_VERSION@_la-orcus_json.lo \
+ liborcus_@ORCUS_API_VERSION@_la-orcus_xml.lo \
+ liborcus_@ORCUS_API_VERSION@_la-orcus_xml_impl.lo \
+ liborcus_@ORCUS_API_VERSION@_la-orcus_xml_map_def.lo \
+ liborcus_@ORCUS_API_VERSION@_la-measurement.lo \
+ liborcus_@ORCUS_API_VERSION@_la-number_utils.lo \
+ liborcus_@ORCUS_API_VERSION@_la-xml_context_base.lo \
+ liborcus_@ORCUS_API_VERSION@_la-xml_context_global.lo \
+ liborcus_@ORCUS_API_VERSION@_la-xml_element_types.lo \
+ liborcus_@ORCUS_API_VERSION@_la-xml_element_validator.lo \
+ liborcus_@ORCUS_API_VERSION@_la-xml_empty_context.lo \
+ liborcus_@ORCUS_API_VERSION@_la-xml_map_tree.lo \
+ liborcus_@ORCUS_API_VERSION@_la-xml_stream_handler.lo \
+ liborcus_@ORCUS_API_VERSION@_la-xml_stream_parser.lo \
+ liborcus_@ORCUS_API_VERSION@_la-xml_simple_stream_handler.lo \
+ liborcus_@ORCUS_API_VERSION@_la-xml_structure_mapper.lo \
+ liborcus_@ORCUS_API_VERSION@_la-xml_structure_tree.lo \
+ liborcus_@ORCUS_API_VERSION@_la-xml_util.lo \
+ liborcus_@ORCUS_API_VERSION@_la-xpath_parser.lo \
+ liborcus_@ORCUS_API_VERSION@_la-yaml_document_tree.lo \
+ liborcus_@ORCUS_API_VERSION@_la-ooxml_namespace_types.lo \
+ liborcus_@ORCUS_API_VERSION@_la-odf_namespace_types.lo \
+ liborcus_@ORCUS_API_VERSION@_la-gnumeric_namespace_types.lo \
+ liborcus_@ORCUS_API_VERSION@_la-xls_xml_namespace_types.lo \
+ liborcus_@ORCUS_API_VERSION@_la-session_context.lo \
+ liborcus_@ORCUS_API_VERSION@_la-spreadsheet_impl_types.lo \
+ liborcus_@ORCUS_API_VERSION@_la-spreadsheet_types.lo \
+ liborcus_@ORCUS_API_VERSION@_la-spreadsheet_iface_util.lo \
+ liborcus_@ORCUS_API_VERSION@_la-string_helper.lo \
+ $(am__objects_1) $(am__objects_2) $(am__objects_3) \
+ $(am__objects_4) $(am__objects_5)
+liborcus_@ORCUS_API_VERSION@_la_OBJECTS = \
+ $(am_liborcus_@ORCUS_API_VERSION@_la_OBJECTS)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+liborcus_@ORCUS_API_VERSION@_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) \
+ $(liborcus_@ORCUS_API_VERSION@_la_LDFLAGS) $(LDFLAGS) -o $@
+am_common_test_OBJECTS = common_test.$(OBJEXT)
+common_test_OBJECTS = $(am_common_test_OBJECTS)
+common_test_DEPENDENCIES = liborcus-@ORCUS_API_VERSION@.la \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la
+am_css_document_tree_test_OBJECTS = css_document_tree.$(OBJEXT) \
+ css_document_tree_test.$(OBJEXT)
+css_document_tree_test_OBJECTS = $(am_css_document_tree_test_OBJECTS)
+css_document_tree_test_DEPENDENCIES = liborcus-@ORCUS_API_VERSION@.la \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_2)
+am_dom_tree_test_OBJECTS = dom_tree_test.$(OBJEXT)
+dom_tree_test_OBJECTS = $(am_dom_tree_test_OBJECTS)
+dom_tree_test_DEPENDENCIES = liborcus-@ORCUS_API_VERSION@.la \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la
+am__gnumeric_cell_context_test_SOURCES_DIST = number_utils.cpp \
+ session_context.cpp gnumeric_cell_context_test.cpp \
+ gnumeric_cell_context.cpp gnumeric_value_format_parser.cpp \
+ xml_context_base.cpp xml_element_types.cpp \
+ xml_element_validator.cpp xml_empty_context.cpp xml_util.cpp \
+ gnumeric_namespace_types.cpp gnumeric_tokens.cpp \
+ gnumeric_types.cpp odf_namespace_types.cpp \
+ spreadsheet_interface.cpp
+@WITH_GNUMERIC_FILTER_TRUE@am_gnumeric_cell_context_test_OBJECTS = \
+@WITH_GNUMERIC_FILTER_TRUE@ number_utils.$(OBJEXT) \
+@WITH_GNUMERIC_FILTER_TRUE@ session_context.$(OBJEXT) \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_cell_context_test.$(OBJEXT) \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_cell_context.$(OBJEXT) \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_value_format_parser.$(OBJEXT) \
+@WITH_GNUMERIC_FILTER_TRUE@ xml_context_base.$(OBJEXT) \
+@WITH_GNUMERIC_FILTER_TRUE@ xml_element_types.$(OBJEXT) \
+@WITH_GNUMERIC_FILTER_TRUE@ xml_element_validator.$(OBJEXT) \
+@WITH_GNUMERIC_FILTER_TRUE@ xml_empty_context.$(OBJEXT) \
+@WITH_GNUMERIC_FILTER_TRUE@ xml_util.$(OBJEXT) \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_namespace_types.$(OBJEXT) \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_tokens.$(OBJEXT) \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_types.$(OBJEXT) \
+@WITH_GNUMERIC_FILTER_TRUE@ odf_namespace_types.$(OBJEXT) \
+@WITH_GNUMERIC_FILTER_TRUE@ spreadsheet_interface.$(OBJEXT)
+gnumeric_cell_context_test_OBJECTS = \
+ $(am_gnumeric_cell_context_test_OBJECTS)
+@WITH_GNUMERIC_FILTER_TRUE@gnumeric_cell_context_test_DEPENDENCIES = \
+@WITH_GNUMERIC_FILTER_TRUE@ liborcus-@ORCUS_API_VERSION@.la \
+@WITH_GNUMERIC_FILTER_TRUE@ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@WITH_GNUMERIC_FILTER_TRUE@ ../test/liborcus-test.a
+am__gnumeric_sheet_context_test_SOURCES_DIST = session_context.cpp \
+ gnumeric_sheet_context_test.cpp gnumeric_sheet_context.cpp \
+ gnumeric_names_context.cpp gnumeric_cell_context.cpp \
+ gnumeric_filter_context.cpp gnumeric_styles_context.cpp \
+ gnumeric_value_format_parser.cpp gnumeric_types.cpp \
+ number_utils.cpp xml_context_base.cpp xml_element_types.cpp \
+ xml_element_validator.cpp xml_empty_context.cpp xml_util.cpp \
+ gnumeric_namespace_types.cpp gnumeric_tokens.cpp \
+ odf_namespace_types.cpp spreadsheet_interface.cpp \
+ string_helper.cpp
+@WITH_GNUMERIC_FILTER_TRUE@am_gnumeric_sheet_context_test_OBJECTS = gnumeric_sheet_context_test-session_context.$(OBJEXT) \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_sheet_context_test-gnumeric_sheet_context_test.$(OBJEXT) \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_sheet_context_test-gnumeric_sheet_context.$(OBJEXT) \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_sheet_context_test-gnumeric_names_context.$(OBJEXT) \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_sheet_context_test-gnumeric_cell_context.$(OBJEXT) \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_sheet_context_test-gnumeric_filter_context.$(OBJEXT) \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_sheet_context_test-gnumeric_styles_context.$(OBJEXT) \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_sheet_context_test-gnumeric_value_format_parser.$(OBJEXT) \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_sheet_context_test-gnumeric_types.$(OBJEXT) \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_sheet_context_test-number_utils.$(OBJEXT) \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_sheet_context_test-xml_context_base.$(OBJEXT) \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_sheet_context_test-xml_element_types.$(OBJEXT) \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_sheet_context_test-xml_element_validator.$(OBJEXT) \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_sheet_context_test-xml_empty_context.$(OBJEXT) \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_sheet_context_test-xml_util.$(OBJEXT) \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_sheet_context_test-gnumeric_namespace_types.$(OBJEXT) \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_sheet_context_test-gnumeric_tokens.$(OBJEXT) \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_sheet_context_test-odf_namespace_types.$(OBJEXT) \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_sheet_context_test-spreadsheet_interface.$(OBJEXT) \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_sheet_context_test-string_helper.$(OBJEXT)
+gnumeric_sheet_context_test_OBJECTS = \
+ $(am_gnumeric_sheet_context_test_OBJECTS)
+@WITH_GNUMERIC_FILTER_TRUE@gnumeric_sheet_context_test_DEPENDENCIES = \
+@WITH_GNUMERIC_FILTER_TRUE@ liborcus-@ORCUS_API_VERSION@.la \
+@WITH_GNUMERIC_FILTER_TRUE@ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@WITH_GNUMERIC_FILTER_TRUE@ ../test/liborcus-test.a
+am_json_document_tree_test_OBJECTS = \
+ json_document_tree_test-json_document_tree.$(OBJEXT) \
+ json_document_tree_test-json_util.$(OBJEXT) \
+ json_document_tree_test-json_document_tree_test.$(OBJEXT)
+json_document_tree_test_OBJECTS = \
+ $(am_json_document_tree_test_OBJECTS)
+json_document_tree_test_DEPENDENCIES = \
+ liborcus-@ORCUS_API_VERSION@.la \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../test/liborcus-test.a $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+am_json_map_tree_test_OBJECTS = json_map_tree_test.$(OBJEXT) \
+ json_map_tree.$(OBJEXT) spreadsheet_impl_types.$(OBJEXT)
+json_map_tree_test_OBJECTS = $(am_json_map_tree_test_OBJECTS)
+json_map_tree_test_DEPENDENCIES = liborcus-@ORCUS_API_VERSION@.la \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ $(am__DEPENDENCIES_1)
+am_json_structure_tree_test_OBJECTS = \
+ json_structure_tree_test.$(OBJEXT)
+json_structure_tree_test_OBJECTS = \
+ $(am_json_structure_tree_test_OBJECTS)
+json_structure_tree_test_DEPENDENCIES = \
+ liborcus-@ORCUS_API_VERSION@.la \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_2)
+am__odf_helper_test_SOURCES_DIST = odf_helper.cpp string_helper.cpp \
+ odf_helper_test.cpp
+@WITH_ODS_FILTER_TRUE@am_odf_helper_test_OBJECTS = \
+@WITH_ODS_FILTER_TRUE@ odf_helper_test-odf_helper.$(OBJEXT) \
+@WITH_ODS_FILTER_TRUE@ odf_helper_test-string_helper.$(OBJEXT) \
+@WITH_ODS_FILTER_TRUE@ odf_helper_test-odf_helper_test.$(OBJEXT)
+odf_helper_test_OBJECTS = $(am_odf_helper_test_OBJECTS)
+@WITH_ODS_FILTER_TRUE@odf_helper_test_DEPENDENCIES = \
+@WITH_ODS_FILTER_TRUE@ liborcus-@ORCUS_API_VERSION@.la \
+@WITH_ODS_FILTER_TRUE@ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la
+am__xlsx_sheet_context_test_SOURCES_DIST = formula_result.cpp \
+ ooxml_global.cpp ooxml_namespace_types.cpp ooxml_schemas.cpp \
+ ooxml_tokens.cpp ooxml_types.cpp session_context.cpp \
+ spreadsheet_interface.cpp xlsx_autofilter_context.cpp \
+ xlsx_conditional_format_context.cpp xlsx_helper.cpp \
+ xlsx_session_data.cpp xlsx_sheet_context.cpp \
+ xlsx_sheet_context_test.cpp xlsx_types.cpp \
+ xml_context_base.cpp xml_context_global.cpp \
+ xml_element_types.cpp xml_element_validator.cpp \
+ xml_empty_context.cpp xml_util.cpp
+@WITH_XLSX_FILTER_TRUE@am_xlsx_sheet_context_test_OBJECTS = xlsx_sheet_context_test-formula_result.$(OBJEXT) \
+@WITH_XLSX_FILTER_TRUE@ xlsx_sheet_context_test-ooxml_global.$(OBJEXT) \
+@WITH_XLSX_FILTER_TRUE@ xlsx_sheet_context_test-ooxml_namespace_types.$(OBJEXT) \
+@WITH_XLSX_FILTER_TRUE@ xlsx_sheet_context_test-ooxml_schemas.$(OBJEXT) \
+@WITH_XLSX_FILTER_TRUE@ xlsx_sheet_context_test-ooxml_tokens.$(OBJEXT) \
+@WITH_XLSX_FILTER_TRUE@ xlsx_sheet_context_test-ooxml_types.$(OBJEXT) \
+@WITH_XLSX_FILTER_TRUE@ xlsx_sheet_context_test-session_context.$(OBJEXT) \
+@WITH_XLSX_FILTER_TRUE@ xlsx_sheet_context_test-spreadsheet_interface.$(OBJEXT) \
+@WITH_XLSX_FILTER_TRUE@ xlsx_sheet_context_test-xlsx_autofilter_context.$(OBJEXT) \
+@WITH_XLSX_FILTER_TRUE@ xlsx_sheet_context_test-xlsx_conditional_format_context.$(OBJEXT) \
+@WITH_XLSX_FILTER_TRUE@ xlsx_sheet_context_test-xlsx_helper.$(OBJEXT) \
+@WITH_XLSX_FILTER_TRUE@ xlsx_sheet_context_test-xlsx_session_data.$(OBJEXT) \
+@WITH_XLSX_FILTER_TRUE@ xlsx_sheet_context_test-xlsx_sheet_context.$(OBJEXT) \
+@WITH_XLSX_FILTER_TRUE@ xlsx_sheet_context_test-xlsx_sheet_context_test.$(OBJEXT) \
+@WITH_XLSX_FILTER_TRUE@ xlsx_sheet_context_test-xlsx_types.$(OBJEXT) \
+@WITH_XLSX_FILTER_TRUE@ xlsx_sheet_context_test-xml_context_base.$(OBJEXT) \
+@WITH_XLSX_FILTER_TRUE@ xlsx_sheet_context_test-xml_context_global.$(OBJEXT) \
+@WITH_XLSX_FILTER_TRUE@ xlsx_sheet_context_test-xml_element_types.$(OBJEXT) \
+@WITH_XLSX_FILTER_TRUE@ xlsx_sheet_context_test-xml_element_validator.$(OBJEXT) \
+@WITH_XLSX_FILTER_TRUE@ xlsx_sheet_context_test-xml_empty_context.$(OBJEXT) \
+@WITH_XLSX_FILTER_TRUE@ xlsx_sheet_context_test-xml_util.$(OBJEXT)
+xlsx_sheet_context_test_OBJECTS = \
+ $(am_xlsx_sheet_context_test_OBJECTS)
+@WITH_XLSX_FILTER_TRUE@xlsx_sheet_context_test_DEPENDENCIES = \
+@WITH_XLSX_FILTER_TRUE@ liborcus-@ORCUS_API_VERSION@.la \
+@WITH_XLSX_FILTER_TRUE@ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@WITH_XLSX_FILTER_TRUE@ ../test/liborcus-test.a
+am_xml_map_tree_test_OBJECTS = xml_map_tree.$(OBJEXT) \
+ xpath_parser.$(OBJEXT) spreadsheet_impl_types.$(OBJEXT) \
+ xml_map_tree_test.$(OBJEXT)
+xml_map_tree_test_OBJECTS = $(am_xml_map_tree_test_OBJECTS)
+xml_map_tree_test_DEPENDENCIES = liborcus-@ORCUS_API_VERSION@.la \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../test/liborcus-test.a $(am__DEPENDENCIES_1)
+am_xml_structure_tree_test_OBJECTS = \
+ xml_structure_tree_test-string_helper.$(OBJEXT) \
+ xml_structure_tree_test-xml_structure_tree.$(OBJEXT) \
+ xml_structure_tree_test-xml_structure_mapper.$(OBJEXT) \
+ xml_structure_tree_test-xml_structure_tree_test.$(OBJEXT)
+xml_structure_tree_test_OBJECTS = \
+ $(am_xml_structure_tree_test_OBJECTS)
+xml_structure_tree_test_DEPENDENCIES = \
+ liborcus-@ORCUS_API_VERSION@.la \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_2)
+am_xpath_parser_test_OBJECTS = xpath_parser_test.$(OBJEXT) \
+ xpath_parser.$(OBJEXT)
+xpath_parser_test_OBJECTS = $(am_xpath_parser_test_OBJECTS)
+xpath_parser_test_DEPENDENCIES = liborcus-@ORCUS_API_VERSION@.la \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ $(am__DEPENDENCIES_1)
+am_yaml_document_tree_test_OBJECTS = \
+ yaml_document_tree_test-yaml_document_tree.$(OBJEXT) \
+ yaml_document_tree_test-json_util.$(OBJEXT) \
+ yaml_document_tree_test-yaml_document_tree_test.$(OBJEXT)
+yaml_document_tree_test_OBJECTS = \
+ $(am_yaml_document_tree_test_OBJECTS)
+yaml_document_tree_test_DEPENDENCIES = \
+ liborcus-@ORCUS_API_VERSION@.la \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_2)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/common_test.Po \
+ ./$(DEPDIR)/css_document_tree.Po \
+ ./$(DEPDIR)/css_document_tree_test.Po \
+ ./$(DEPDIR)/dom_tree_test.Po \
+ ./$(DEPDIR)/gnumeric_cell_context.Po \
+ ./$(DEPDIR)/gnumeric_cell_context_test.Po \
+ ./$(DEPDIR)/gnumeric_namespace_types.Po \
+ ./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_cell_context.Po \
+ ./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_filter_context.Po \
+ ./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_names_context.Po \
+ ./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_namespace_types.Po \
+ ./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_sheet_context.Po \
+ ./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_sheet_context_test.Po \
+ ./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_styles_context.Po \
+ ./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_tokens.Po \
+ ./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_types.Po \
+ ./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_value_format_parser.Po \
+ ./$(DEPDIR)/gnumeric_sheet_context_test-number_utils.Po \
+ ./$(DEPDIR)/gnumeric_sheet_context_test-odf_namespace_types.Po \
+ ./$(DEPDIR)/gnumeric_sheet_context_test-session_context.Po \
+ ./$(DEPDIR)/gnumeric_sheet_context_test-spreadsheet_interface.Po \
+ ./$(DEPDIR)/gnumeric_sheet_context_test-string_helper.Po \
+ ./$(DEPDIR)/gnumeric_sheet_context_test-xml_context_base.Po \
+ ./$(DEPDIR)/gnumeric_sheet_context_test-xml_element_types.Po \
+ ./$(DEPDIR)/gnumeric_sheet_context_test-xml_element_validator.Po \
+ ./$(DEPDIR)/gnumeric_sheet_context_test-xml_empty_context.Po \
+ ./$(DEPDIR)/gnumeric_sheet_context_test-xml_util.Po \
+ ./$(DEPDIR)/gnumeric_tokens.Po ./$(DEPDIR)/gnumeric_types.Po \
+ ./$(DEPDIR)/gnumeric_value_format_parser.Po \
+ ./$(DEPDIR)/json_document_tree_test-json_document_tree.Po \
+ ./$(DEPDIR)/json_document_tree_test-json_document_tree_test.Po \
+ ./$(DEPDIR)/json_document_tree_test-json_util.Po \
+ ./$(DEPDIR)/json_map_tree.Po ./$(DEPDIR)/json_map_tree_test.Po \
+ ./$(DEPDIR)/json_structure_tree_test.Po \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-config.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-css_document_tree.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-css_selector.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-detection_result.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-dom_tree.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-format_detection.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-formula_result.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_cell_context.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_context.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_detection_handler.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_filter_context.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_handler.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_names_context.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_namespace_types.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_sheet_context.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_styles_context.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_tokens.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_types.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_value_format_parser.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-info.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-interface.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-json_document_tree.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-json_map_tree.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-json_structure_mapper.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-json_structure_tree.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-json_util.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-measurement.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-number_utils.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_document_styles_context.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_helper.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_namespace_types.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_number_format_context.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_para_context.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_style_context.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_styles.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_styles_context.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_tokens.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ods_content_xml_context.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ods_dde_links_context.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ods_session_data.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_content_types.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_global.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_namespace_types.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_schemas.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_tokens.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_types.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-opc_context.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-opc_reader.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_csv.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_gnumeric.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_import_ods.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_import_xlsx.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_json.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_ods.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_parquet.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_xls_xml.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_xlsx.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_xml.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_xml_impl.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_xml_map_def.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-session_context.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-spreadsheet_iface_util.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-spreadsheet_impl_types.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-spreadsheet_interface.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-spreadsheet_types.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-string_helper.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xls_xml_context.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xls_xml_detection_handler.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xls_xml_handler.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xls_xml_namespace_types.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xls_xml_tokens.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_autofilter_context.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_conditional_format_context.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_drawing_context.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_handler.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_helper.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_pivot_context.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_revision_context.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_session_data.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_shared_strings_context.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_sheet_context.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_styles_context.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_table_context.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_types.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_workbook_context.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_context_base.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_context_global.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_element_types.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_element_validator.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_empty_context.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_map_tree.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_simple_stream_handler.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_stream_handler.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_stream_parser.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_structure_mapper.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_structure_tree.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_util.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xpath_parser.Plo \
+ ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-yaml_document_tree.Plo \
+ ./$(DEPDIR)/number_utils.Po \
+ ./$(DEPDIR)/odf_helper_test-odf_helper.Po \
+ ./$(DEPDIR)/odf_helper_test-odf_helper_test.Po \
+ ./$(DEPDIR)/odf_helper_test-string_helper.Po \
+ ./$(DEPDIR)/odf_namespace_types.Po \
+ ./$(DEPDIR)/session_context.Po \
+ ./$(DEPDIR)/spreadsheet_impl_types.Po \
+ ./$(DEPDIR)/spreadsheet_interface.Po \
+ ./$(DEPDIR)/xlsx_sheet_context_test-formula_result.Po \
+ ./$(DEPDIR)/xlsx_sheet_context_test-ooxml_global.Po \
+ ./$(DEPDIR)/xlsx_sheet_context_test-ooxml_namespace_types.Po \
+ ./$(DEPDIR)/xlsx_sheet_context_test-ooxml_schemas.Po \
+ ./$(DEPDIR)/xlsx_sheet_context_test-ooxml_tokens.Po \
+ ./$(DEPDIR)/xlsx_sheet_context_test-ooxml_types.Po \
+ ./$(DEPDIR)/xlsx_sheet_context_test-session_context.Po \
+ ./$(DEPDIR)/xlsx_sheet_context_test-spreadsheet_interface.Po \
+ ./$(DEPDIR)/xlsx_sheet_context_test-xlsx_autofilter_context.Po \
+ ./$(DEPDIR)/xlsx_sheet_context_test-xlsx_conditional_format_context.Po \
+ ./$(DEPDIR)/xlsx_sheet_context_test-xlsx_helper.Po \
+ ./$(DEPDIR)/xlsx_sheet_context_test-xlsx_session_data.Po \
+ ./$(DEPDIR)/xlsx_sheet_context_test-xlsx_sheet_context.Po \
+ ./$(DEPDIR)/xlsx_sheet_context_test-xlsx_sheet_context_test.Po \
+ ./$(DEPDIR)/xlsx_sheet_context_test-xlsx_types.Po \
+ ./$(DEPDIR)/xlsx_sheet_context_test-xml_context_base.Po \
+ ./$(DEPDIR)/xlsx_sheet_context_test-xml_context_global.Po \
+ ./$(DEPDIR)/xlsx_sheet_context_test-xml_element_types.Po \
+ ./$(DEPDIR)/xlsx_sheet_context_test-xml_element_validator.Po \
+ ./$(DEPDIR)/xlsx_sheet_context_test-xml_empty_context.Po \
+ ./$(DEPDIR)/xlsx_sheet_context_test-xml_util.Po \
+ ./$(DEPDIR)/xml_context_base.Po \
+ ./$(DEPDIR)/xml_element_types.Po \
+ ./$(DEPDIR)/xml_element_validator.Po \
+ ./$(DEPDIR)/xml_empty_context.Po ./$(DEPDIR)/xml_map_tree.Po \
+ ./$(DEPDIR)/xml_map_tree_test.Po \
+ ./$(DEPDIR)/xml_structure_tree_test-string_helper.Po \
+ ./$(DEPDIR)/xml_structure_tree_test-xml_structure_mapper.Po \
+ ./$(DEPDIR)/xml_structure_tree_test-xml_structure_tree.Po \
+ ./$(DEPDIR)/xml_structure_tree_test-xml_structure_tree_test.Po \
+ ./$(DEPDIR)/xml_util.Po ./$(DEPDIR)/xpath_parser.Po \
+ ./$(DEPDIR)/xpath_parser_test.Po \
+ ./$(DEPDIR)/yaml_document_tree_test-json_util.Po \
+ ./$(DEPDIR)/yaml_document_tree_test-yaml_document_tree.Po \
+ ./$(DEPDIR)/yaml_document_tree_test-yaml_document_tree_test.Po
+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_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+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_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = $(liborcus_@ORCUS_API_VERSION@_la_SOURCES) \
+ $(common_test_SOURCES) $(css_document_tree_test_SOURCES) \
+ $(dom_tree_test_SOURCES) $(gnumeric_cell_context_test_SOURCES) \
+ $(gnumeric_sheet_context_test_SOURCES) \
+ $(json_document_tree_test_SOURCES) \
+ $(json_map_tree_test_SOURCES) \
+ $(json_structure_tree_test_SOURCES) $(odf_helper_test_SOURCES) \
+ $(xlsx_sheet_context_test_SOURCES) \
+ $(xml_map_tree_test_SOURCES) \
+ $(xml_structure_tree_test_SOURCES) \
+ $(xpath_parser_test_SOURCES) \
+ $(yaml_document_tree_test_SOURCES)
+DIST_SOURCES = $(am__liborcus_@ORCUS_API_VERSION@_la_SOURCES_DIST) \
+ $(common_test_SOURCES) $(css_document_tree_test_SOURCES) \
+ $(dom_tree_test_SOURCES) \
+ $(am__gnumeric_cell_context_test_SOURCES_DIST) \
+ $(am__gnumeric_sheet_context_test_SOURCES_DIST) \
+ $(json_document_tree_test_SOURCES) \
+ $(json_map_tree_test_SOURCES) \
+ $(json_structure_tree_test_SOURCES) \
+ $(am__odf_helper_test_SOURCES_DIST) \
+ $(am__xlsx_sheet_context_test_SOURCES_DIST) \
+ $(xml_map_tree_test_SOURCES) \
+ $(xml_structure_tree_test_SOURCES) \
+ $(xpath_parser_test_SOURCES) \
+ $(yaml_document_tree_test_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__extra_recursive_targets = check-valgrind-recursive \
+ check-valgrind-memcheck-recursive \
+ check-valgrind-helgrind-recursive check-valgrind-drd-recursive \
+ check-valgrind-sgcheck-recursive
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+am__tty_colors_dummy = \
+ mgn= red= grn= lgn= blu= brg= std=; \
+ am__color_tests=no
+am__tty_colors = { \
+ $(am__tty_colors_dummy); \
+ if test "X$(AM_COLOR_TESTS)" = Xno; then \
+ am__color_tests=no; \
+ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+ am__color_tests=yes; \
+ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+ am__color_tests=yes; \
+ fi; \
+ if test $$am__color_tests = yes; then \
+ red=''; \
+ grn=''; \
+ lgn=''; \
+ blu=''; \
+ mgn=''; \
+ brg=''; \
+ std=''; \
+ fi; \
+}
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# 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
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# 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. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(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='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)'
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/constants.inl.in \
+ $(top_srcdir)/depcomp $(top_srcdir)/test-driver
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BOOST_CPPFLAGS = @BOOST_CPPFLAGS@
+BOOST_DATE_TIME_LDFLAGS = @BOOST_DATE_TIME_LDFLAGS@
+BOOST_DATE_TIME_LDPATH = @BOOST_DATE_TIME_LDPATH@
+BOOST_DATE_TIME_LIBS = @BOOST_DATE_TIME_LIBS@
+BOOST_FILESYSTEM_LDFLAGS = @BOOST_FILESYSTEM_LDFLAGS@
+BOOST_FILESYSTEM_LDPATH = @BOOST_FILESYSTEM_LDPATH@
+BOOST_FILESYSTEM_LIBS = @BOOST_FILESYSTEM_LIBS@
+BOOST_IOSTREAMS_LDFLAGS = @BOOST_IOSTREAMS_LDFLAGS@
+BOOST_IOSTREAMS_LDPATH = @BOOST_IOSTREAMS_LDPATH@
+BOOST_IOSTREAMS_LIBS = @BOOST_IOSTREAMS_LIBS@
+BOOST_LDPATH = @BOOST_LDPATH@
+BOOST_PROGRAM_OPTIONS_LDFLAGS = @BOOST_PROGRAM_OPTIONS_LDFLAGS@
+BOOST_PROGRAM_OPTIONS_LDPATH = @BOOST_PROGRAM_OPTIONS_LDPATH@
+BOOST_PROGRAM_OPTIONS_LIBS = @BOOST_PROGRAM_OPTIONS_LIBS@
+BOOST_ROOT = @BOOST_ROOT@
+BOOST_SYSTEM_LDFLAGS = @BOOST_SYSTEM_LDFLAGS@
+BOOST_SYSTEM_LDPATH = @BOOST_SYSTEM_LDPATH@
+BOOST_SYSTEM_LIBS = @BOOST_SYSTEM_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CSCOPE = @CSCOPE@
+CTAGS = @CTAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_VALGRIND_drd = @ENABLE_VALGRIND_drd@
+ENABLE_VALGRIND_helgrind = @ENABLE_VALGRIND_helgrind@
+ENABLE_VALGRIND_memcheck = @ENABLE_VALGRIND_memcheck@
+ENABLE_VALGRIND_sgcheck = @ENABLE_VALGRIND_sgcheck@
+ETAGS = @ETAGS@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+HAVE_CXX17 = @HAVE_CXX17@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+IXION_REQUIRED_API_VERSION = @IXION_REQUIRED_API_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBIXION_CFLAGS = @LIBIXION_CFLAGS@
+LIBIXION_LIBS = @LIBIXION_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MDDS_CFLAGS = @MDDS_CFLAGS@
+MDDS_LIBS = @MDDS_LIBS@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+ORCUS_API_VERSION = @ORCUS_API_VERSION@
+ORCUS_MAJOR_VERSION = @ORCUS_MAJOR_VERSION@
+ORCUS_MICRO_VERSION = @ORCUS_MICRO_VERSION@
+ORCUS_MINOR_VERSION = @ORCUS_MINOR_VERSION@
+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@
+PARQUET_CFLAGS = @PARQUET_CFLAGS@
+PARQUET_LIBS = @PARQUET_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POW_LIB = @POW_LIB@
+PYTHON = @PYTHON@
+PYTHON_CFLAGS = @PYTHON_CFLAGS@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VALGRIND = @VALGRIND@
+VALGRIND_ENABLED = @VALGRIND_ENABLED@
+VERSION = @VERSION@
+ZLIB_CFLAGS = @ZLIB_CFLAGS@
+ZLIB_LIBS = @ZLIB_LIBS@
+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@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+runstatedir = @runstatedir@
+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@
+valgrind_enabled_tools = @valgrind_enabled_tools@
+valgrind_tools = @valgrind_tools@
+AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/src/include \
+ -I./include $(BOOST_CPPFLAGS) $(am__append_1) $(am__append_2) \
+ $(am__append_3) $(am__append_4) -DSRCDIR=\""$(top_srcdir)"\"
+EXTRA_DIST = \
+ xml_element_types.hpp
+
+liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS = $(ZLIB_CFLAGS) \
+ $(am__append_21)
+liborcus_@ORCUS_API_VERSION@_la_LDFLAGS = -no-undefined \
+ $(BOOST_SYSTEM_LDFLAGS) $(am__append_5) $(am__append_6) \
+ $(am__append_16) $(am__append_22)
+liborcus_@ORCUS_API_VERSION@_la_LIBADD = \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ $(BOOST_SYSTEM_LIBS) $(ZLIB_LIBS) $(am__append_7) \
+ $(am__append_17) $(am__append_23)
+lib_LTLIBRARIES = liborcus-@ORCUS_API_VERSION@.la
+liborcus_@ORCUS_API_VERSION@_la_SOURCES = config.cpp \
+ css_document_tree.cpp css_selector.cpp detection_result.hpp \
+ detection_result.cpp dom_tree.cpp format_detection.cpp \
+ formula_result.hpp formula_result.cpp impl_utils.hpp info.cpp \
+ interface.cpp json_document_tree.cpp json_map_tree.hpp \
+ json_map_tree.cpp json_structure_mapper.hpp \
+ json_structure_mapper.cpp json_structure_tree.cpp \
+ json_util.hpp json_util.cpp spreadsheet_interface.cpp \
+ orcus_csv.cpp orcus_json.cpp orcus_xml.cpp orcus_xml_impl.hpp \
+ orcus_xml_impl.cpp orcus_xml_map_def.cpp measurement.cpp \
+ number_utils.cpp number_utils.hpp xml_context_base.hpp \
+ xml_context_base.cpp xml_context_global.hpp \
+ xml_context_global.cpp xml_element_types.cpp \
+ xml_element_validator.hpp xml_element_validator.cpp \
+ xml_empty_context.hpp xml_empty_context.cpp xml_map_tree.hpp \
+ xml_map_tree.cpp xml_stream_handler.hpp xml_stream_handler.cpp \
+ xml_stream_parser.hpp xml_stream_parser.cpp \
+ xml_simple_stream_handler.hpp xml_simple_stream_handler.cpp \
+ xml_structure_mapper.hpp xml_structure_mapper.cpp \
+ xml_structure_tree.cpp xml_util.hpp xml_util.cpp \
+ xpath_parser.cpp yaml_document_tree.cpp \
+ ooxml_namespace_types.cpp ooxml_namespace_types.hpp \
+ odf_namespace_types.hpp odf_namespace_types_hpp.inl \
+ odf_namespace_types.cpp odf_namespace_types_cpp.inl \
+ gnumeric_namespace_types.hpp gnumeric_namespace_types.cpp \
+ xls_xml_namespace_types.hpp xls_xml_namespace_types.cpp \
+ session_context.hpp session_context.cpp \
+ spreadsheet_impl_types.hpp spreadsheet_impl_types.cpp \
+ spreadsheet_types.cpp spreadsheet_iface_util.hpp \
+ spreadsheet_iface_util.cpp string_helper.hpp string_helper.cpp \
+ $(am__append_9) $(am__append_11) $(am__append_12) \
+ $(am__append_15) $(am__append_20)
+
+# xlsx-sheet-context-test
+@WITH_XLSX_FILTER_TRUE@xlsx_sheet_context_test_SOURCES = \
+@WITH_XLSX_FILTER_TRUE@ formula_result.cpp \
+@WITH_XLSX_FILTER_TRUE@ ooxml_global.cpp \
+@WITH_XLSX_FILTER_TRUE@ ooxml_namespace_types.cpp \
+@WITH_XLSX_FILTER_TRUE@ ooxml_schemas.cpp \
+@WITH_XLSX_FILTER_TRUE@ ooxml_tokens.cpp \
+@WITH_XLSX_FILTER_TRUE@ ooxml_types.cpp \
+@WITH_XLSX_FILTER_TRUE@ session_context.cpp \
+@WITH_XLSX_FILTER_TRUE@ spreadsheet_interface.cpp \
+@WITH_XLSX_FILTER_TRUE@ xlsx_autofilter_context.cpp \
+@WITH_XLSX_FILTER_TRUE@ xlsx_conditional_format_context.cpp \
+@WITH_XLSX_FILTER_TRUE@ xlsx_helper.cpp \
+@WITH_XLSX_FILTER_TRUE@ xlsx_session_data.cpp \
+@WITH_XLSX_FILTER_TRUE@ xlsx_sheet_context.cpp \
+@WITH_XLSX_FILTER_TRUE@ xlsx_sheet_context_test.cpp \
+@WITH_XLSX_FILTER_TRUE@ xlsx_types.cpp \
+@WITH_XLSX_FILTER_TRUE@ xml_context_base.cpp \
+@WITH_XLSX_FILTER_TRUE@ xml_context_global.cpp \
+@WITH_XLSX_FILTER_TRUE@ xml_element_types.cpp \
+@WITH_XLSX_FILTER_TRUE@ xml_element_validator.cpp \
+@WITH_XLSX_FILTER_TRUE@ xml_empty_context.cpp \
+@WITH_XLSX_FILTER_TRUE@ xml_util.cpp
+
+@WITH_XLSX_FILTER_TRUE@xlsx_sheet_context_test_LDADD = \
+@WITH_XLSX_FILTER_TRUE@ liborcus-@ORCUS_API_VERSION@.la \
+@WITH_XLSX_FILTER_TRUE@ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@WITH_XLSX_FILTER_TRUE@ ../test/liborcus-test.a
+
+@WITH_XLSX_FILTER_TRUE@xlsx_sheet_context_test_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+@WITH_ODS_FILTER_TRUE@odf_helper_test_SOURCES = \
+@WITH_ODS_FILTER_TRUE@ odf_helper.cpp \
+@WITH_ODS_FILTER_TRUE@ string_helper.cpp \
+@WITH_ODS_FILTER_TRUE@ odf_helper_test.cpp
+
+@WITH_ODS_FILTER_TRUE@odf_helper_test_LDADD = \
+@WITH_ODS_FILTER_TRUE@ liborcus-@ORCUS_API_VERSION@.la \
+@WITH_ODS_FILTER_TRUE@ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la
+
+@WITH_ODS_FILTER_TRUE@odf_helper_test_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+@WITH_GNUMERIC_FILTER_TRUE@gnumeric_cell_context_test_SOURCES = \
+@WITH_GNUMERIC_FILTER_TRUE@ number_utils.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ session_context.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_cell_context_test.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_cell_context.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_value_format_parser.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ xml_context_base.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ xml_element_types.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ xml_element_validator.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ xml_empty_context.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ xml_util.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_namespace_types.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_tokens.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_types.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ odf_namespace_types.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ spreadsheet_interface.cpp
+
+@WITH_GNUMERIC_FILTER_TRUE@gnumeric_cell_context_test_LDADD = \
+@WITH_GNUMERIC_FILTER_TRUE@ liborcus-@ORCUS_API_VERSION@.la \
+@WITH_GNUMERIC_FILTER_TRUE@ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@WITH_GNUMERIC_FILTER_TRUE@ ../test/liborcus-test.a
+
+@WITH_GNUMERIC_FILTER_TRUE@orcus_gnumeric_cell_context_test_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+
+# gnumeric-sheet-context-test
+@WITH_GNUMERIC_FILTER_TRUE@gnumeric_sheet_context_test_SOURCES = \
+@WITH_GNUMERIC_FILTER_TRUE@ session_context.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_sheet_context_test.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_sheet_context.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_names_context.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_cell_context.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_filter_context.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_styles_context.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_value_format_parser.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_types.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ number_utils.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ xml_context_base.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ xml_element_types.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ xml_element_validator.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ xml_empty_context.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ xml_util.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_namespace_types.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ gnumeric_tokens.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ odf_namespace_types.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ spreadsheet_interface.cpp \
+@WITH_GNUMERIC_FILTER_TRUE@ string_helper.cpp
+
+@WITH_GNUMERIC_FILTER_TRUE@gnumeric_sheet_context_test_LDADD = \
+@WITH_GNUMERIC_FILTER_TRUE@ liborcus-@ORCUS_API_VERSION@.la \
+@WITH_GNUMERIC_FILTER_TRUE@ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@WITH_GNUMERIC_FILTER_TRUE@ ../test/liborcus-test.a
+
+@WITH_GNUMERIC_FILTER_TRUE@gnumeric_sheet_context_test_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+
+# css-document-tree-test
+css_document_tree_test_SOURCES = \
+ css_document_tree.cpp \
+ css_document_tree_test.cpp
+
+css_document_tree_test_LDADD = liborcus-@ORCUS_API_VERSION@.la \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ $(BOOST_SYSTEM_LIBS) $(am__append_24) $(am__append_25)
+
+# json-document-tree-test
+json_document_tree_test_SOURCES = \
+ json_document_tree.cpp \
+ json_util.cpp \
+ json_document_tree_test.cpp
+
+json_document_tree_test_LDADD = liborcus-@ORCUS_API_VERSION@.la \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../test/liborcus-test.a $(BOOST_SYSTEM_LIBS) $(am__append_26) \
+ $(am__append_27)
+json_document_tree_test_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+
+# yaml-document-tree-test
+yaml_document_tree_test_SOURCES = \
+ yaml_document_tree.cpp \
+ json_util.cpp \
+ yaml_document_tree_test.cpp
+
+yaml_document_tree_test_LDADD = liborcus-@ORCUS_API_VERSION@.la \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ $(BOOST_SYSTEM_LIBS) $(am__append_28) $(am__append_29)
+yaml_document_tree_test_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+
+# xml-map-tree-test
+xml_map_tree_test_SOURCES = \
+ xml_map_tree.cpp \
+ xml_map_tree.hpp \
+ xpath_parser.hpp \
+ xpath_parser.cpp \
+ spreadsheet_impl_types.hpp \
+ spreadsheet_impl_types.cpp \
+ xml_map_tree_test.cpp
+
+xml_map_tree_test_LDADD = \
+ liborcus-@ORCUS_API_VERSION@.la \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../test/liborcus-test.a \
+ $(BOOST_SYSTEM_LIBS)
+
+
+# xml-structure-tree-test
+xml_structure_tree_test_SOURCES = \
+ string_helper.cpp \
+ xml_structure_tree.cpp \
+ xml_structure_mapper.cpp \
+ xml_structure_tree_test.cpp
+
+xml_structure_tree_test_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
+xml_structure_tree_test_LDADD = liborcus-@ORCUS_API_VERSION@.la \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ $(BOOST_SYSTEM_LIBS) $(am__append_30) $(am__append_31)
+
+# common-test
+common_test_SOURCES = \
+ common_test.cpp
+
+common_test_LDADD = \
+ liborcus-@ORCUS_API_VERSION@.la \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la
+
+
+# dom-tree-test
+dom_tree_test_SOURCES = dom_tree_test.cpp
+dom_tree_test_LDADD = \
+ liborcus-@ORCUS_API_VERSION@.la \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la
+
+
+# json-structure-tree-test
+json_structure_tree_test_SOURCES = json_structure_tree_test.cpp
+json_structure_tree_test_LDADD = liborcus-@ORCUS_API_VERSION@.la \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ $(BOOST_SYSTEM_LIBS) $(am__append_32) $(am__append_33)
+
+# json-map-tree-test
+json_map_tree_test_SOURCES = json_map_tree_test.cpp \
+ json_map_tree.cpp \
+ spreadsheet_impl_types.cpp
+
+json_map_tree_test_LDADD = \
+ liborcus-@ORCUS_API_VERSION@.la \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ $(BOOST_SYSTEM_LIBS)
+
+
+# xpath-parser-test
+xpath_parser_test_SOURCES = \
+ xpath_parser_test.cpp \
+ xpath_parser.cpp
+
+xpath_parser_test_LDADD = \
+ liborcus-@ORCUS_API_VERSION@.la \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ $(BOOST_SYSTEM_LIBS)
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cpp .lo .log .o .obj .test .test$(EXEEXT) .trs
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/liborcus/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign src/liborcus/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+constants.inl: $(top_builddir)/config.status $(srcdir)/constants.inl.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+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)'; \
+ locs=`for p in $$list; do echo $$p; done | \
+ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+ sort -u`; \
+ test -z "$$locs" || { \
+ echo rm -f $${locs}; \
+ rm -f $${locs}; \
+ }
+
+liborcus-@ORCUS_API_VERSION@.la: $(liborcus_@ORCUS_API_VERSION@_la_OBJECTS) $(liborcus_@ORCUS_API_VERSION@_la_DEPENDENCIES) $(EXTRA_liborcus_@ORCUS_API_VERSION@_la_DEPENDENCIES)
+ $(AM_V_CXXLD)$(liborcus_@ORCUS_API_VERSION@_la_LINK) -rpath $(libdir) $(liborcus_@ORCUS_API_VERSION@_la_OBJECTS) $(liborcus_@ORCUS_API_VERSION@_la_LIBADD) $(LIBS)
+
+common-test$(EXEEXT): $(common_test_OBJECTS) $(common_test_DEPENDENCIES) $(EXTRA_common_test_DEPENDENCIES)
+ @rm -f common-test$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(common_test_OBJECTS) $(common_test_LDADD) $(LIBS)
+
+css-document-tree-test$(EXEEXT): $(css_document_tree_test_OBJECTS) $(css_document_tree_test_DEPENDENCIES) $(EXTRA_css_document_tree_test_DEPENDENCIES)
+ @rm -f css-document-tree-test$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(css_document_tree_test_OBJECTS) $(css_document_tree_test_LDADD) $(LIBS)
+
+dom-tree-test$(EXEEXT): $(dom_tree_test_OBJECTS) $(dom_tree_test_DEPENDENCIES) $(EXTRA_dom_tree_test_DEPENDENCIES)
+ @rm -f dom-tree-test$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(dom_tree_test_OBJECTS) $(dom_tree_test_LDADD) $(LIBS)
+
+gnumeric-cell-context-test$(EXEEXT): $(gnumeric_cell_context_test_OBJECTS) $(gnumeric_cell_context_test_DEPENDENCIES) $(EXTRA_gnumeric_cell_context_test_DEPENDENCIES)
+ @rm -f gnumeric-cell-context-test$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(gnumeric_cell_context_test_OBJECTS) $(gnumeric_cell_context_test_LDADD) $(LIBS)
+
+gnumeric-sheet-context-test$(EXEEXT): $(gnumeric_sheet_context_test_OBJECTS) $(gnumeric_sheet_context_test_DEPENDENCIES) $(EXTRA_gnumeric_sheet_context_test_DEPENDENCIES)
+ @rm -f gnumeric-sheet-context-test$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(gnumeric_sheet_context_test_OBJECTS) $(gnumeric_sheet_context_test_LDADD) $(LIBS)
+
+json-document-tree-test$(EXEEXT): $(json_document_tree_test_OBJECTS) $(json_document_tree_test_DEPENDENCIES) $(EXTRA_json_document_tree_test_DEPENDENCIES)
+ @rm -f json-document-tree-test$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(json_document_tree_test_OBJECTS) $(json_document_tree_test_LDADD) $(LIBS)
+
+json-map-tree-test$(EXEEXT): $(json_map_tree_test_OBJECTS) $(json_map_tree_test_DEPENDENCIES) $(EXTRA_json_map_tree_test_DEPENDENCIES)
+ @rm -f json-map-tree-test$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(json_map_tree_test_OBJECTS) $(json_map_tree_test_LDADD) $(LIBS)
+
+json-structure-tree-test$(EXEEXT): $(json_structure_tree_test_OBJECTS) $(json_structure_tree_test_DEPENDENCIES) $(EXTRA_json_structure_tree_test_DEPENDENCIES)
+ @rm -f json-structure-tree-test$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(json_structure_tree_test_OBJECTS) $(json_structure_tree_test_LDADD) $(LIBS)
+
+odf-helper-test$(EXEEXT): $(odf_helper_test_OBJECTS) $(odf_helper_test_DEPENDENCIES) $(EXTRA_odf_helper_test_DEPENDENCIES)
+ @rm -f odf-helper-test$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(odf_helper_test_OBJECTS) $(odf_helper_test_LDADD) $(LIBS)
+
+xlsx-sheet-context-test$(EXEEXT): $(xlsx_sheet_context_test_OBJECTS) $(xlsx_sheet_context_test_DEPENDENCIES) $(EXTRA_xlsx_sheet_context_test_DEPENDENCIES)
+ @rm -f xlsx-sheet-context-test$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(xlsx_sheet_context_test_OBJECTS) $(xlsx_sheet_context_test_LDADD) $(LIBS)
+
+xml-map-tree-test$(EXEEXT): $(xml_map_tree_test_OBJECTS) $(xml_map_tree_test_DEPENDENCIES) $(EXTRA_xml_map_tree_test_DEPENDENCIES)
+ @rm -f xml-map-tree-test$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(xml_map_tree_test_OBJECTS) $(xml_map_tree_test_LDADD) $(LIBS)
+
+xml-structure-tree-test$(EXEEXT): $(xml_structure_tree_test_OBJECTS) $(xml_structure_tree_test_DEPENDENCIES) $(EXTRA_xml_structure_tree_test_DEPENDENCIES)
+ @rm -f xml-structure-tree-test$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(xml_structure_tree_test_OBJECTS) $(xml_structure_tree_test_LDADD) $(LIBS)
+
+xpath-parser-test$(EXEEXT): $(xpath_parser_test_OBJECTS) $(xpath_parser_test_DEPENDENCIES) $(EXTRA_xpath_parser_test_DEPENDENCIES)
+ @rm -f xpath-parser-test$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(xpath_parser_test_OBJECTS) $(xpath_parser_test_LDADD) $(LIBS)
+
+yaml-document-tree-test$(EXEEXT): $(yaml_document_tree_test_OBJECTS) $(yaml_document_tree_test_DEPENDENCIES) $(EXTRA_yaml_document_tree_test_DEPENDENCIES)
+ @rm -f yaml-document-tree-test$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(yaml_document_tree_test_OBJECTS) $(yaml_document_tree_test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/common_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/css_document_tree.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/css_document_tree_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dom_tree_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnumeric_cell_context.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnumeric_cell_context_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnumeric_namespace_types.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_cell_context.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_filter_context.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_names_context.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_namespace_types.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_sheet_context.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_sheet_context_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_styles_context.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_tokens.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_types.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_value_format_parser.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnumeric_sheet_context_test-number_utils.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnumeric_sheet_context_test-odf_namespace_types.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnumeric_sheet_context_test-session_context.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnumeric_sheet_context_test-spreadsheet_interface.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnumeric_sheet_context_test-string_helper.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnumeric_sheet_context_test-xml_context_base.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnumeric_sheet_context_test-xml_element_types.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnumeric_sheet_context_test-xml_element_validator.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnumeric_sheet_context_test-xml_empty_context.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnumeric_sheet_context_test-xml_util.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnumeric_tokens.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnumeric_types.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnumeric_value_format_parser.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json_document_tree_test-json_document_tree.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json_document_tree_test-json_document_tree_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json_document_tree_test-json_util.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json_map_tree.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json_map_tree_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json_structure_tree_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-config.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-css_document_tree.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-css_selector.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-detection_result.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-dom_tree.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-format_detection.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-formula_result.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_cell_context.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_context.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_detection_handler.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_filter_context.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_handler.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_names_context.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_namespace_types.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_sheet_context.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_styles_context.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_tokens.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_types.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_value_format_parser.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-info.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-interface.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-json_document_tree.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-json_map_tree.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-json_structure_mapper.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-json_structure_tree.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-json_util.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-measurement.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-number_utils.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_document_styles_context.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_helper.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_namespace_types.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_number_format_context.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_para_context.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_style_context.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_styles.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_styles_context.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_tokens.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ods_content_xml_context.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ods_dde_links_context.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ods_session_data.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_content_types.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_global.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_namespace_types.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_schemas.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_tokens.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_types.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-opc_context.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-opc_reader.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_csv.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_gnumeric.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_import_ods.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_import_xlsx.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_json.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_ods.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_parquet.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_xls_xml.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_xlsx.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_xml.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_xml_impl.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_xml_map_def.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-session_context.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-spreadsheet_iface_util.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-spreadsheet_impl_types.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-spreadsheet_interface.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-spreadsheet_types.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-string_helper.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xls_xml_context.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xls_xml_detection_handler.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xls_xml_handler.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xls_xml_namespace_types.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xls_xml_tokens.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_autofilter_context.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_conditional_format_context.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_drawing_context.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_handler.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_helper.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_pivot_context.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_revision_context.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_session_data.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_shared_strings_context.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_sheet_context.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_styles_context.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_table_context.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_types.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_workbook_context.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_context_base.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_context_global.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_element_types.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_element_validator.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_empty_context.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_map_tree.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_simple_stream_handler.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_stream_handler.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_stream_parser.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_structure_mapper.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_structure_tree.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_util.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xpath_parser.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-yaml_document_tree.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/number_utils.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/odf_helper_test-odf_helper.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/odf_helper_test-odf_helper_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/odf_helper_test-string_helper.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/odf_namespace_types.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/session_context.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spreadsheet_impl_types.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spreadsheet_interface.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xlsx_sheet_context_test-formula_result.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xlsx_sheet_context_test-ooxml_global.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xlsx_sheet_context_test-ooxml_namespace_types.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xlsx_sheet_context_test-ooxml_schemas.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xlsx_sheet_context_test-ooxml_tokens.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xlsx_sheet_context_test-ooxml_types.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xlsx_sheet_context_test-session_context.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xlsx_sheet_context_test-spreadsheet_interface.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xlsx_sheet_context_test-xlsx_autofilter_context.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xlsx_sheet_context_test-xlsx_conditional_format_context.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xlsx_sheet_context_test-xlsx_helper.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xlsx_sheet_context_test-xlsx_session_data.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xlsx_sheet_context_test-xlsx_sheet_context.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xlsx_sheet_context_test-xlsx_sheet_context_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xlsx_sheet_context_test-xlsx_types.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xlsx_sheet_context_test-xml_context_base.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xlsx_sheet_context_test-xml_context_global.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xlsx_sheet_context_test-xml_element_types.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xlsx_sheet_context_test-xml_element_validator.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xlsx_sheet_context_test-xml_empty_context.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xlsx_sheet_context_test-xml_util.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xml_context_base.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xml_element_types.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xml_element_validator.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xml_empty_context.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xml_map_tree.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xml_map_tree_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xml_structure_tree_test-string_helper.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xml_structure_tree_test-xml_structure_mapper.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xml_structure_tree_test-xml_structure_tree.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xml_structure_tree_test-xml_structure_tree_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xml_util.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xpath_parser.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xpath_parser_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/yaml_document_tree_test-json_util.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/yaml_document_tree_test-yaml_document_tree.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/yaml_document_tree_test-yaml_document_tree_test.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.cpp.o:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cpp.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cpp.lo:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+liborcus_@ORCUS_API_VERSION@_la-config.lo: config.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-config.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-config.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-config.lo `test -f 'config.cpp' || echo '$(srcdir)/'`config.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-config.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-config.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='config.cpp' object='liborcus_@ORCUS_API_VERSION@_la-config.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-config.lo `test -f 'config.cpp' || echo '$(srcdir)/'`config.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-css_document_tree.lo: css_document_tree.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-css_document_tree.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-css_document_tree.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-css_document_tree.lo `test -f 'css_document_tree.cpp' || echo '$(srcdir)/'`css_document_tree.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-css_document_tree.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-css_document_tree.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='css_document_tree.cpp' object='liborcus_@ORCUS_API_VERSION@_la-css_document_tree.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-css_document_tree.lo `test -f 'css_document_tree.cpp' || echo '$(srcdir)/'`css_document_tree.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-css_selector.lo: css_selector.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-css_selector.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-css_selector.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-css_selector.lo `test -f 'css_selector.cpp' || echo '$(srcdir)/'`css_selector.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-css_selector.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-css_selector.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='css_selector.cpp' object='liborcus_@ORCUS_API_VERSION@_la-css_selector.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-css_selector.lo `test -f 'css_selector.cpp' || echo '$(srcdir)/'`css_selector.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-detection_result.lo: detection_result.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-detection_result.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-detection_result.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-detection_result.lo `test -f 'detection_result.cpp' || echo '$(srcdir)/'`detection_result.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-detection_result.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-detection_result.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='detection_result.cpp' object='liborcus_@ORCUS_API_VERSION@_la-detection_result.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-detection_result.lo `test -f 'detection_result.cpp' || echo '$(srcdir)/'`detection_result.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-dom_tree.lo: dom_tree.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-dom_tree.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-dom_tree.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-dom_tree.lo `test -f 'dom_tree.cpp' || echo '$(srcdir)/'`dom_tree.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-dom_tree.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-dom_tree.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dom_tree.cpp' object='liborcus_@ORCUS_API_VERSION@_la-dom_tree.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-dom_tree.lo `test -f 'dom_tree.cpp' || echo '$(srcdir)/'`dom_tree.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-format_detection.lo: format_detection.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-format_detection.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-format_detection.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-format_detection.lo `test -f 'format_detection.cpp' || echo '$(srcdir)/'`format_detection.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-format_detection.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-format_detection.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='format_detection.cpp' object='liborcus_@ORCUS_API_VERSION@_la-format_detection.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-format_detection.lo `test -f 'format_detection.cpp' || echo '$(srcdir)/'`format_detection.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-formula_result.lo: formula_result.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-formula_result.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-formula_result.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-formula_result.lo `test -f 'formula_result.cpp' || echo '$(srcdir)/'`formula_result.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-formula_result.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-formula_result.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='formula_result.cpp' object='liborcus_@ORCUS_API_VERSION@_la-formula_result.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-formula_result.lo `test -f 'formula_result.cpp' || echo '$(srcdir)/'`formula_result.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-info.lo: info.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-info.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-info.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-info.lo `test -f 'info.cpp' || echo '$(srcdir)/'`info.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-info.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-info.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='info.cpp' object='liborcus_@ORCUS_API_VERSION@_la-info.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-info.lo `test -f 'info.cpp' || echo '$(srcdir)/'`info.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-interface.lo: interface.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-interface.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-interface.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-interface.lo `test -f 'interface.cpp' || echo '$(srcdir)/'`interface.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-interface.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-interface.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='interface.cpp' object='liborcus_@ORCUS_API_VERSION@_la-interface.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-interface.lo `test -f 'interface.cpp' || echo '$(srcdir)/'`interface.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-json_document_tree.lo: json_document_tree.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-json_document_tree.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-json_document_tree.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-json_document_tree.lo `test -f 'json_document_tree.cpp' || echo '$(srcdir)/'`json_document_tree.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-json_document_tree.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-json_document_tree.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='json_document_tree.cpp' object='liborcus_@ORCUS_API_VERSION@_la-json_document_tree.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-json_document_tree.lo `test -f 'json_document_tree.cpp' || echo '$(srcdir)/'`json_document_tree.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-json_map_tree.lo: json_map_tree.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-json_map_tree.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-json_map_tree.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-json_map_tree.lo `test -f 'json_map_tree.cpp' || echo '$(srcdir)/'`json_map_tree.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-json_map_tree.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-json_map_tree.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='json_map_tree.cpp' object='liborcus_@ORCUS_API_VERSION@_la-json_map_tree.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-json_map_tree.lo `test -f 'json_map_tree.cpp' || echo '$(srcdir)/'`json_map_tree.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-json_structure_mapper.lo: json_structure_mapper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-json_structure_mapper.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-json_structure_mapper.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-json_structure_mapper.lo `test -f 'json_structure_mapper.cpp' || echo '$(srcdir)/'`json_structure_mapper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-json_structure_mapper.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-json_structure_mapper.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='json_structure_mapper.cpp' object='liborcus_@ORCUS_API_VERSION@_la-json_structure_mapper.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-json_structure_mapper.lo `test -f 'json_structure_mapper.cpp' || echo '$(srcdir)/'`json_structure_mapper.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-json_structure_tree.lo: json_structure_tree.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-json_structure_tree.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-json_structure_tree.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-json_structure_tree.lo `test -f 'json_structure_tree.cpp' || echo '$(srcdir)/'`json_structure_tree.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-json_structure_tree.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-json_structure_tree.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='json_structure_tree.cpp' object='liborcus_@ORCUS_API_VERSION@_la-json_structure_tree.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-json_structure_tree.lo `test -f 'json_structure_tree.cpp' || echo '$(srcdir)/'`json_structure_tree.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-json_util.lo: json_util.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-json_util.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-json_util.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-json_util.lo `test -f 'json_util.cpp' || echo '$(srcdir)/'`json_util.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-json_util.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-json_util.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='json_util.cpp' object='liborcus_@ORCUS_API_VERSION@_la-json_util.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-json_util.lo `test -f 'json_util.cpp' || echo '$(srcdir)/'`json_util.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-spreadsheet_interface.lo: spreadsheet_interface.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-spreadsheet_interface.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-spreadsheet_interface.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-spreadsheet_interface.lo `test -f 'spreadsheet_interface.cpp' || echo '$(srcdir)/'`spreadsheet_interface.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-spreadsheet_interface.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-spreadsheet_interface.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='spreadsheet_interface.cpp' object='liborcus_@ORCUS_API_VERSION@_la-spreadsheet_interface.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-spreadsheet_interface.lo `test -f 'spreadsheet_interface.cpp' || echo '$(srcdir)/'`spreadsheet_interface.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-orcus_csv.lo: orcus_csv.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-orcus_csv.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_csv.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-orcus_csv.lo `test -f 'orcus_csv.cpp' || echo '$(srcdir)/'`orcus_csv.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_csv.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_csv.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_csv.cpp' object='liborcus_@ORCUS_API_VERSION@_la-orcus_csv.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-orcus_csv.lo `test -f 'orcus_csv.cpp' || echo '$(srcdir)/'`orcus_csv.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-orcus_json.lo: orcus_json.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-orcus_json.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_json.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-orcus_json.lo `test -f 'orcus_json.cpp' || echo '$(srcdir)/'`orcus_json.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_json.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_json.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_json.cpp' object='liborcus_@ORCUS_API_VERSION@_la-orcus_json.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-orcus_json.lo `test -f 'orcus_json.cpp' || echo '$(srcdir)/'`orcus_json.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-orcus_xml.lo: orcus_xml.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-orcus_xml.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_xml.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-orcus_xml.lo `test -f 'orcus_xml.cpp' || echo '$(srcdir)/'`orcus_xml.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_xml.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_xml.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_xml.cpp' object='liborcus_@ORCUS_API_VERSION@_la-orcus_xml.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-orcus_xml.lo `test -f 'orcus_xml.cpp' || echo '$(srcdir)/'`orcus_xml.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-orcus_xml_impl.lo: orcus_xml_impl.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-orcus_xml_impl.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_xml_impl.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-orcus_xml_impl.lo `test -f 'orcus_xml_impl.cpp' || echo '$(srcdir)/'`orcus_xml_impl.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_xml_impl.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_xml_impl.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_xml_impl.cpp' object='liborcus_@ORCUS_API_VERSION@_la-orcus_xml_impl.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-orcus_xml_impl.lo `test -f 'orcus_xml_impl.cpp' || echo '$(srcdir)/'`orcus_xml_impl.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-orcus_xml_map_def.lo: orcus_xml_map_def.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-orcus_xml_map_def.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_xml_map_def.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-orcus_xml_map_def.lo `test -f 'orcus_xml_map_def.cpp' || echo '$(srcdir)/'`orcus_xml_map_def.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_xml_map_def.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_xml_map_def.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_xml_map_def.cpp' object='liborcus_@ORCUS_API_VERSION@_la-orcus_xml_map_def.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-orcus_xml_map_def.lo `test -f 'orcus_xml_map_def.cpp' || echo '$(srcdir)/'`orcus_xml_map_def.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-measurement.lo: measurement.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-measurement.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-measurement.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-measurement.lo `test -f 'measurement.cpp' || echo '$(srcdir)/'`measurement.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-measurement.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-measurement.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='measurement.cpp' object='liborcus_@ORCUS_API_VERSION@_la-measurement.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-measurement.lo `test -f 'measurement.cpp' || echo '$(srcdir)/'`measurement.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-number_utils.lo: number_utils.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-number_utils.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-number_utils.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-number_utils.lo `test -f 'number_utils.cpp' || echo '$(srcdir)/'`number_utils.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-number_utils.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-number_utils.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='number_utils.cpp' object='liborcus_@ORCUS_API_VERSION@_la-number_utils.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-number_utils.lo `test -f 'number_utils.cpp' || echo '$(srcdir)/'`number_utils.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-xml_context_base.lo: xml_context_base.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-xml_context_base.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_context_base.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-xml_context_base.lo `test -f 'xml_context_base.cpp' || echo '$(srcdir)/'`xml_context_base.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_context_base.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_context_base.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_context_base.cpp' object='liborcus_@ORCUS_API_VERSION@_la-xml_context_base.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-xml_context_base.lo `test -f 'xml_context_base.cpp' || echo '$(srcdir)/'`xml_context_base.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-xml_context_global.lo: xml_context_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-xml_context_global.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_context_global.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-xml_context_global.lo `test -f 'xml_context_global.cpp' || echo '$(srcdir)/'`xml_context_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_context_global.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_context_global.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_context_global.cpp' object='liborcus_@ORCUS_API_VERSION@_la-xml_context_global.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-xml_context_global.lo `test -f 'xml_context_global.cpp' || echo '$(srcdir)/'`xml_context_global.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-xml_element_types.lo: xml_element_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-xml_element_types.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_element_types.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-xml_element_types.lo `test -f 'xml_element_types.cpp' || echo '$(srcdir)/'`xml_element_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_element_types.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_element_types.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_element_types.cpp' object='liborcus_@ORCUS_API_VERSION@_la-xml_element_types.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-xml_element_types.lo `test -f 'xml_element_types.cpp' || echo '$(srcdir)/'`xml_element_types.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-xml_element_validator.lo: xml_element_validator.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-xml_element_validator.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_element_validator.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-xml_element_validator.lo `test -f 'xml_element_validator.cpp' || echo '$(srcdir)/'`xml_element_validator.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_element_validator.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_element_validator.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_element_validator.cpp' object='liborcus_@ORCUS_API_VERSION@_la-xml_element_validator.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-xml_element_validator.lo `test -f 'xml_element_validator.cpp' || echo '$(srcdir)/'`xml_element_validator.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-xml_empty_context.lo: xml_empty_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-xml_empty_context.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_empty_context.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-xml_empty_context.lo `test -f 'xml_empty_context.cpp' || echo '$(srcdir)/'`xml_empty_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_empty_context.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_empty_context.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_empty_context.cpp' object='liborcus_@ORCUS_API_VERSION@_la-xml_empty_context.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-xml_empty_context.lo `test -f 'xml_empty_context.cpp' || echo '$(srcdir)/'`xml_empty_context.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-xml_map_tree.lo: xml_map_tree.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-xml_map_tree.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_map_tree.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-xml_map_tree.lo `test -f 'xml_map_tree.cpp' || echo '$(srcdir)/'`xml_map_tree.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_map_tree.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_map_tree.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_map_tree.cpp' object='liborcus_@ORCUS_API_VERSION@_la-xml_map_tree.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-xml_map_tree.lo `test -f 'xml_map_tree.cpp' || echo '$(srcdir)/'`xml_map_tree.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-xml_stream_handler.lo: xml_stream_handler.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-xml_stream_handler.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_stream_handler.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-xml_stream_handler.lo `test -f 'xml_stream_handler.cpp' || echo '$(srcdir)/'`xml_stream_handler.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_stream_handler.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_stream_handler.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_stream_handler.cpp' object='liborcus_@ORCUS_API_VERSION@_la-xml_stream_handler.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-xml_stream_handler.lo `test -f 'xml_stream_handler.cpp' || echo '$(srcdir)/'`xml_stream_handler.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-xml_stream_parser.lo: xml_stream_parser.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-xml_stream_parser.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_stream_parser.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-xml_stream_parser.lo `test -f 'xml_stream_parser.cpp' || echo '$(srcdir)/'`xml_stream_parser.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_stream_parser.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_stream_parser.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_stream_parser.cpp' object='liborcus_@ORCUS_API_VERSION@_la-xml_stream_parser.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-xml_stream_parser.lo `test -f 'xml_stream_parser.cpp' || echo '$(srcdir)/'`xml_stream_parser.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-xml_simple_stream_handler.lo: xml_simple_stream_handler.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-xml_simple_stream_handler.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_simple_stream_handler.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-xml_simple_stream_handler.lo `test -f 'xml_simple_stream_handler.cpp' || echo '$(srcdir)/'`xml_simple_stream_handler.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_simple_stream_handler.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_simple_stream_handler.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_simple_stream_handler.cpp' object='liborcus_@ORCUS_API_VERSION@_la-xml_simple_stream_handler.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-xml_simple_stream_handler.lo `test -f 'xml_simple_stream_handler.cpp' || echo '$(srcdir)/'`xml_simple_stream_handler.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-xml_structure_mapper.lo: xml_structure_mapper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-xml_structure_mapper.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_structure_mapper.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-xml_structure_mapper.lo `test -f 'xml_structure_mapper.cpp' || echo '$(srcdir)/'`xml_structure_mapper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_structure_mapper.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_structure_mapper.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_structure_mapper.cpp' object='liborcus_@ORCUS_API_VERSION@_la-xml_structure_mapper.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-xml_structure_mapper.lo `test -f 'xml_structure_mapper.cpp' || echo '$(srcdir)/'`xml_structure_mapper.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-xml_structure_tree.lo: xml_structure_tree.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-xml_structure_tree.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_structure_tree.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-xml_structure_tree.lo `test -f 'xml_structure_tree.cpp' || echo '$(srcdir)/'`xml_structure_tree.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_structure_tree.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_structure_tree.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_structure_tree.cpp' object='liborcus_@ORCUS_API_VERSION@_la-xml_structure_tree.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-xml_structure_tree.lo `test -f 'xml_structure_tree.cpp' || echo '$(srcdir)/'`xml_structure_tree.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-xml_util.lo: xml_util.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-xml_util.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_util.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-xml_util.lo `test -f 'xml_util.cpp' || echo '$(srcdir)/'`xml_util.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_util.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_util.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_util.cpp' object='liborcus_@ORCUS_API_VERSION@_la-xml_util.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-xml_util.lo `test -f 'xml_util.cpp' || echo '$(srcdir)/'`xml_util.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-xpath_parser.lo: xpath_parser.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-xpath_parser.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xpath_parser.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-xpath_parser.lo `test -f 'xpath_parser.cpp' || echo '$(srcdir)/'`xpath_parser.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xpath_parser.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xpath_parser.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xpath_parser.cpp' object='liborcus_@ORCUS_API_VERSION@_la-xpath_parser.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-xpath_parser.lo `test -f 'xpath_parser.cpp' || echo '$(srcdir)/'`xpath_parser.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-yaml_document_tree.lo: yaml_document_tree.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-yaml_document_tree.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-yaml_document_tree.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-yaml_document_tree.lo `test -f 'yaml_document_tree.cpp' || echo '$(srcdir)/'`yaml_document_tree.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-yaml_document_tree.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-yaml_document_tree.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='yaml_document_tree.cpp' object='liborcus_@ORCUS_API_VERSION@_la-yaml_document_tree.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-yaml_document_tree.lo `test -f 'yaml_document_tree.cpp' || echo '$(srcdir)/'`yaml_document_tree.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-ooxml_namespace_types.lo: ooxml_namespace_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-ooxml_namespace_types.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_namespace_types.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-ooxml_namespace_types.lo `test -f 'ooxml_namespace_types.cpp' || echo '$(srcdir)/'`ooxml_namespace_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_namespace_types.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_namespace_types.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ooxml_namespace_types.cpp' object='liborcus_@ORCUS_API_VERSION@_la-ooxml_namespace_types.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-ooxml_namespace_types.lo `test -f 'ooxml_namespace_types.cpp' || echo '$(srcdir)/'`ooxml_namespace_types.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-odf_namespace_types.lo: odf_namespace_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-odf_namespace_types.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_namespace_types.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-odf_namespace_types.lo `test -f 'odf_namespace_types.cpp' || echo '$(srcdir)/'`odf_namespace_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_namespace_types.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_namespace_types.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='odf_namespace_types.cpp' object='liborcus_@ORCUS_API_VERSION@_la-odf_namespace_types.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-odf_namespace_types.lo `test -f 'odf_namespace_types.cpp' || echo '$(srcdir)/'`odf_namespace_types.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-gnumeric_namespace_types.lo: gnumeric_namespace_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-gnumeric_namespace_types.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_namespace_types.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-gnumeric_namespace_types.lo `test -f 'gnumeric_namespace_types.cpp' || echo '$(srcdir)/'`gnumeric_namespace_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_namespace_types.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_namespace_types.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gnumeric_namespace_types.cpp' object='liborcus_@ORCUS_API_VERSION@_la-gnumeric_namespace_types.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-gnumeric_namespace_types.lo `test -f 'gnumeric_namespace_types.cpp' || echo '$(srcdir)/'`gnumeric_namespace_types.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-xls_xml_namespace_types.lo: xls_xml_namespace_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-xls_xml_namespace_types.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xls_xml_namespace_types.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-xls_xml_namespace_types.lo `test -f 'xls_xml_namespace_types.cpp' || echo '$(srcdir)/'`xls_xml_namespace_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xls_xml_namespace_types.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xls_xml_namespace_types.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xls_xml_namespace_types.cpp' object='liborcus_@ORCUS_API_VERSION@_la-xls_xml_namespace_types.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-xls_xml_namespace_types.lo `test -f 'xls_xml_namespace_types.cpp' || echo '$(srcdir)/'`xls_xml_namespace_types.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-session_context.lo: session_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-session_context.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-session_context.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-session_context.lo `test -f 'session_context.cpp' || echo '$(srcdir)/'`session_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-session_context.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-session_context.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='session_context.cpp' object='liborcus_@ORCUS_API_VERSION@_la-session_context.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-session_context.lo `test -f 'session_context.cpp' || echo '$(srcdir)/'`session_context.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-spreadsheet_impl_types.lo: spreadsheet_impl_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-spreadsheet_impl_types.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-spreadsheet_impl_types.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-spreadsheet_impl_types.lo `test -f 'spreadsheet_impl_types.cpp' || echo '$(srcdir)/'`spreadsheet_impl_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-spreadsheet_impl_types.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-spreadsheet_impl_types.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='spreadsheet_impl_types.cpp' object='liborcus_@ORCUS_API_VERSION@_la-spreadsheet_impl_types.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-spreadsheet_impl_types.lo `test -f 'spreadsheet_impl_types.cpp' || echo '$(srcdir)/'`spreadsheet_impl_types.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-spreadsheet_types.lo: spreadsheet_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-spreadsheet_types.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-spreadsheet_types.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-spreadsheet_types.lo `test -f 'spreadsheet_types.cpp' || echo '$(srcdir)/'`spreadsheet_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-spreadsheet_types.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-spreadsheet_types.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='spreadsheet_types.cpp' object='liborcus_@ORCUS_API_VERSION@_la-spreadsheet_types.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-spreadsheet_types.lo `test -f 'spreadsheet_types.cpp' || echo '$(srcdir)/'`spreadsheet_types.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-spreadsheet_iface_util.lo: spreadsheet_iface_util.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-spreadsheet_iface_util.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-spreadsheet_iface_util.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-spreadsheet_iface_util.lo `test -f 'spreadsheet_iface_util.cpp' || echo '$(srcdir)/'`spreadsheet_iface_util.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-spreadsheet_iface_util.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-spreadsheet_iface_util.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='spreadsheet_iface_util.cpp' object='liborcus_@ORCUS_API_VERSION@_la-spreadsheet_iface_util.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-spreadsheet_iface_util.lo `test -f 'spreadsheet_iface_util.cpp' || echo '$(srcdir)/'`spreadsheet_iface_util.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-string_helper.lo: string_helper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-string_helper.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-string_helper.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-string_helper.lo `test -f 'string_helper.cpp' || echo '$(srcdir)/'`string_helper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-string_helper.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-string_helper.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='string_helper.cpp' object='liborcus_@ORCUS_API_VERSION@_la-string_helper.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-string_helper.lo `test -f 'string_helper.cpp' || echo '$(srcdir)/'`string_helper.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-ooxml_content_types.lo: ooxml_content_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-ooxml_content_types.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_content_types.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-ooxml_content_types.lo `test -f 'ooxml_content_types.cpp' || echo '$(srcdir)/'`ooxml_content_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_content_types.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_content_types.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ooxml_content_types.cpp' object='liborcus_@ORCUS_API_VERSION@_la-ooxml_content_types.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-ooxml_content_types.lo `test -f 'ooxml_content_types.cpp' || echo '$(srcdir)/'`ooxml_content_types.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-ooxml_global.lo: ooxml_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-ooxml_global.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_global.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-ooxml_global.lo `test -f 'ooxml_global.cpp' || echo '$(srcdir)/'`ooxml_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_global.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_global.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ooxml_global.cpp' object='liborcus_@ORCUS_API_VERSION@_la-ooxml_global.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-ooxml_global.lo `test -f 'ooxml_global.cpp' || echo '$(srcdir)/'`ooxml_global.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-ooxml_schemas.lo: ooxml_schemas.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-ooxml_schemas.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_schemas.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-ooxml_schemas.lo `test -f 'ooxml_schemas.cpp' || echo '$(srcdir)/'`ooxml_schemas.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_schemas.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_schemas.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ooxml_schemas.cpp' object='liborcus_@ORCUS_API_VERSION@_la-ooxml_schemas.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-ooxml_schemas.lo `test -f 'ooxml_schemas.cpp' || echo '$(srcdir)/'`ooxml_schemas.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-ooxml_tokens.lo: ooxml_tokens.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-ooxml_tokens.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_tokens.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-ooxml_tokens.lo `test -f 'ooxml_tokens.cpp' || echo '$(srcdir)/'`ooxml_tokens.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_tokens.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_tokens.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ooxml_tokens.cpp' object='liborcus_@ORCUS_API_VERSION@_la-ooxml_tokens.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-ooxml_tokens.lo `test -f 'ooxml_tokens.cpp' || echo '$(srcdir)/'`ooxml_tokens.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-ooxml_types.lo: ooxml_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-ooxml_types.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_types.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-ooxml_types.lo `test -f 'ooxml_types.cpp' || echo '$(srcdir)/'`ooxml_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_types.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_types.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ooxml_types.cpp' object='liborcus_@ORCUS_API_VERSION@_la-ooxml_types.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-ooxml_types.lo `test -f 'ooxml_types.cpp' || echo '$(srcdir)/'`ooxml_types.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-opc_context.lo: opc_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-opc_context.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-opc_context.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-opc_context.lo `test -f 'opc_context.cpp' || echo '$(srcdir)/'`opc_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-opc_context.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-opc_context.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='opc_context.cpp' object='liborcus_@ORCUS_API_VERSION@_la-opc_context.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-opc_context.lo `test -f 'opc_context.cpp' || echo '$(srcdir)/'`opc_context.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-opc_reader.lo: opc_reader.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-opc_reader.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-opc_reader.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-opc_reader.lo `test -f 'opc_reader.cpp' || echo '$(srcdir)/'`opc_reader.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-opc_reader.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-opc_reader.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='opc_reader.cpp' object='liborcus_@ORCUS_API_VERSION@_la-opc_reader.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-opc_reader.lo `test -f 'opc_reader.cpp' || echo '$(srcdir)/'`opc_reader.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-orcus_xlsx.lo: orcus_xlsx.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-orcus_xlsx.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_xlsx.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-orcus_xlsx.lo `test -f 'orcus_xlsx.cpp' || echo '$(srcdir)/'`orcus_xlsx.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_xlsx.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_xlsx.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_xlsx.cpp' object='liborcus_@ORCUS_API_VERSION@_la-orcus_xlsx.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-orcus_xlsx.lo `test -f 'orcus_xlsx.cpp' || echo '$(srcdir)/'`orcus_xlsx.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-orcus_import_xlsx.lo: orcus_import_xlsx.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-orcus_import_xlsx.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_import_xlsx.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-orcus_import_xlsx.lo `test -f 'orcus_import_xlsx.cpp' || echo '$(srcdir)/'`orcus_import_xlsx.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_import_xlsx.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_import_xlsx.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_import_xlsx.cpp' object='liborcus_@ORCUS_API_VERSION@_la-orcus_import_xlsx.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-orcus_import_xlsx.lo `test -f 'orcus_import_xlsx.cpp' || echo '$(srcdir)/'`orcus_import_xlsx.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-xlsx_shared_strings_context.lo: xlsx_shared_strings_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-xlsx_shared_strings_context.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_shared_strings_context.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-xlsx_shared_strings_context.lo `test -f 'xlsx_shared_strings_context.cpp' || echo '$(srcdir)/'`xlsx_shared_strings_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_shared_strings_context.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_shared_strings_context.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xlsx_shared_strings_context.cpp' object='liborcus_@ORCUS_API_VERSION@_la-xlsx_shared_strings_context.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-xlsx_shared_strings_context.lo `test -f 'xlsx_shared_strings_context.cpp' || echo '$(srcdir)/'`xlsx_shared_strings_context.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-xlsx_drawing_context.lo: xlsx_drawing_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-xlsx_drawing_context.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_drawing_context.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-xlsx_drawing_context.lo `test -f 'xlsx_drawing_context.cpp' || echo '$(srcdir)/'`xlsx_drawing_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_drawing_context.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_drawing_context.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xlsx_drawing_context.cpp' object='liborcus_@ORCUS_API_VERSION@_la-xlsx_drawing_context.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-xlsx_drawing_context.lo `test -f 'xlsx_drawing_context.cpp' || echo '$(srcdir)/'`xlsx_drawing_context.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-xlsx_handler.lo: xlsx_handler.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-xlsx_handler.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_handler.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-xlsx_handler.lo `test -f 'xlsx_handler.cpp' || echo '$(srcdir)/'`xlsx_handler.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_handler.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_handler.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xlsx_handler.cpp' object='liborcus_@ORCUS_API_VERSION@_la-xlsx_handler.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-xlsx_handler.lo `test -f 'xlsx_handler.cpp' || echo '$(srcdir)/'`xlsx_handler.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-xlsx_helper.lo: xlsx_helper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-xlsx_helper.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_helper.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-xlsx_helper.lo `test -f 'xlsx_helper.cpp' || echo '$(srcdir)/'`xlsx_helper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_helper.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_helper.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xlsx_helper.cpp' object='liborcus_@ORCUS_API_VERSION@_la-xlsx_helper.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-xlsx_helper.lo `test -f 'xlsx_helper.cpp' || echo '$(srcdir)/'`xlsx_helper.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-xlsx_session_data.lo: xlsx_session_data.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-xlsx_session_data.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_session_data.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-xlsx_session_data.lo `test -f 'xlsx_session_data.cpp' || echo '$(srcdir)/'`xlsx_session_data.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_session_data.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_session_data.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xlsx_session_data.cpp' object='liborcus_@ORCUS_API_VERSION@_la-xlsx_session_data.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-xlsx_session_data.lo `test -f 'xlsx_session_data.cpp' || echo '$(srcdir)/'`xlsx_session_data.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-xlsx_revision_context.lo: xlsx_revision_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-xlsx_revision_context.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_revision_context.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-xlsx_revision_context.lo `test -f 'xlsx_revision_context.cpp' || echo '$(srcdir)/'`xlsx_revision_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_revision_context.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_revision_context.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xlsx_revision_context.cpp' object='liborcus_@ORCUS_API_VERSION@_la-xlsx_revision_context.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-xlsx_revision_context.lo `test -f 'xlsx_revision_context.cpp' || echo '$(srcdir)/'`xlsx_revision_context.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-xlsx_pivot_context.lo: xlsx_pivot_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-xlsx_pivot_context.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_pivot_context.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-xlsx_pivot_context.lo `test -f 'xlsx_pivot_context.cpp' || echo '$(srcdir)/'`xlsx_pivot_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_pivot_context.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_pivot_context.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xlsx_pivot_context.cpp' object='liborcus_@ORCUS_API_VERSION@_la-xlsx_pivot_context.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-xlsx_pivot_context.lo `test -f 'xlsx_pivot_context.cpp' || echo '$(srcdir)/'`xlsx_pivot_context.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-xlsx_sheet_context.lo: xlsx_sheet_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-xlsx_sheet_context.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_sheet_context.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-xlsx_sheet_context.lo `test -f 'xlsx_sheet_context.cpp' || echo '$(srcdir)/'`xlsx_sheet_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_sheet_context.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_sheet_context.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xlsx_sheet_context.cpp' object='liborcus_@ORCUS_API_VERSION@_la-xlsx_sheet_context.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-xlsx_sheet_context.lo `test -f 'xlsx_sheet_context.cpp' || echo '$(srcdir)/'`xlsx_sheet_context.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-xlsx_styles_context.lo: xlsx_styles_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-xlsx_styles_context.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_styles_context.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-xlsx_styles_context.lo `test -f 'xlsx_styles_context.cpp' || echo '$(srcdir)/'`xlsx_styles_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_styles_context.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_styles_context.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xlsx_styles_context.cpp' object='liborcus_@ORCUS_API_VERSION@_la-xlsx_styles_context.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-xlsx_styles_context.lo `test -f 'xlsx_styles_context.cpp' || echo '$(srcdir)/'`xlsx_styles_context.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-xlsx_conditional_format_context.lo: xlsx_conditional_format_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-xlsx_conditional_format_context.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_conditional_format_context.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-xlsx_conditional_format_context.lo `test -f 'xlsx_conditional_format_context.cpp' || echo '$(srcdir)/'`xlsx_conditional_format_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_conditional_format_context.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_conditional_format_context.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xlsx_conditional_format_context.cpp' object='liborcus_@ORCUS_API_VERSION@_la-xlsx_conditional_format_context.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-xlsx_conditional_format_context.lo `test -f 'xlsx_conditional_format_context.cpp' || echo '$(srcdir)/'`xlsx_conditional_format_context.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-xlsx_table_context.lo: xlsx_table_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-xlsx_table_context.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_table_context.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-xlsx_table_context.lo `test -f 'xlsx_table_context.cpp' || echo '$(srcdir)/'`xlsx_table_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_table_context.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_table_context.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xlsx_table_context.cpp' object='liborcus_@ORCUS_API_VERSION@_la-xlsx_table_context.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-xlsx_table_context.lo `test -f 'xlsx_table_context.cpp' || echo '$(srcdir)/'`xlsx_table_context.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-xlsx_autofilter_context.lo: xlsx_autofilter_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-xlsx_autofilter_context.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_autofilter_context.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-xlsx_autofilter_context.lo `test -f 'xlsx_autofilter_context.cpp' || echo '$(srcdir)/'`xlsx_autofilter_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_autofilter_context.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_autofilter_context.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xlsx_autofilter_context.cpp' object='liborcus_@ORCUS_API_VERSION@_la-xlsx_autofilter_context.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-xlsx_autofilter_context.lo `test -f 'xlsx_autofilter_context.cpp' || echo '$(srcdir)/'`xlsx_autofilter_context.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-xlsx_types.lo: xlsx_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-xlsx_types.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_types.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-xlsx_types.lo `test -f 'xlsx_types.cpp' || echo '$(srcdir)/'`xlsx_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_types.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_types.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xlsx_types.cpp' object='liborcus_@ORCUS_API_VERSION@_la-xlsx_types.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-xlsx_types.lo `test -f 'xlsx_types.cpp' || echo '$(srcdir)/'`xlsx_types.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-xlsx_workbook_context.lo: xlsx_workbook_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-xlsx_workbook_context.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_workbook_context.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-xlsx_workbook_context.lo `test -f 'xlsx_workbook_context.cpp' || echo '$(srcdir)/'`xlsx_workbook_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_workbook_context.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_workbook_context.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xlsx_workbook_context.cpp' object='liborcus_@ORCUS_API_VERSION@_la-xlsx_workbook_context.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-xlsx_workbook_context.lo `test -f 'xlsx_workbook_context.cpp' || echo '$(srcdir)/'`xlsx_workbook_context.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-xls_xml_tokens.lo: xls_xml_tokens.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-xls_xml_tokens.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xls_xml_tokens.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-xls_xml_tokens.lo `test -f 'xls_xml_tokens.cpp' || echo '$(srcdir)/'`xls_xml_tokens.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xls_xml_tokens.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xls_xml_tokens.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xls_xml_tokens.cpp' object='liborcus_@ORCUS_API_VERSION@_la-xls_xml_tokens.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-xls_xml_tokens.lo `test -f 'xls_xml_tokens.cpp' || echo '$(srcdir)/'`xls_xml_tokens.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-orcus_xls_xml.lo: orcus_xls_xml.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-orcus_xls_xml.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_xls_xml.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-orcus_xls_xml.lo `test -f 'orcus_xls_xml.cpp' || echo '$(srcdir)/'`orcus_xls_xml.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_xls_xml.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_xls_xml.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_xls_xml.cpp' object='liborcus_@ORCUS_API_VERSION@_la-orcus_xls_xml.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-orcus_xls_xml.lo `test -f 'orcus_xls_xml.cpp' || echo '$(srcdir)/'`orcus_xls_xml.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-xls_xml_detection_handler.lo: xls_xml_detection_handler.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-xls_xml_detection_handler.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xls_xml_detection_handler.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-xls_xml_detection_handler.lo `test -f 'xls_xml_detection_handler.cpp' || echo '$(srcdir)/'`xls_xml_detection_handler.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xls_xml_detection_handler.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xls_xml_detection_handler.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xls_xml_detection_handler.cpp' object='liborcus_@ORCUS_API_VERSION@_la-xls_xml_detection_handler.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-xls_xml_detection_handler.lo `test -f 'xls_xml_detection_handler.cpp' || echo '$(srcdir)/'`xls_xml_detection_handler.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-xls_xml_handler.lo: xls_xml_handler.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-xls_xml_handler.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xls_xml_handler.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-xls_xml_handler.lo `test -f 'xls_xml_handler.cpp' || echo '$(srcdir)/'`xls_xml_handler.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xls_xml_handler.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xls_xml_handler.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xls_xml_handler.cpp' object='liborcus_@ORCUS_API_VERSION@_la-xls_xml_handler.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-xls_xml_handler.lo `test -f 'xls_xml_handler.cpp' || echo '$(srcdir)/'`xls_xml_handler.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-xls_xml_context.lo: xls_xml_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-xls_xml_context.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xls_xml_context.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-xls_xml_context.lo `test -f 'xls_xml_context.cpp' || echo '$(srcdir)/'`xls_xml_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xls_xml_context.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xls_xml_context.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xls_xml_context.cpp' object='liborcus_@ORCUS_API_VERSION@_la-xls_xml_context.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-xls_xml_context.lo `test -f 'xls_xml_context.cpp' || echo '$(srcdir)/'`xls_xml_context.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-odf_document_styles_context.lo: odf_document_styles_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-odf_document_styles_context.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_document_styles_context.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-odf_document_styles_context.lo `test -f 'odf_document_styles_context.cpp' || echo '$(srcdir)/'`odf_document_styles_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_document_styles_context.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_document_styles_context.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='odf_document_styles_context.cpp' object='liborcus_@ORCUS_API_VERSION@_la-odf_document_styles_context.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-odf_document_styles_context.lo `test -f 'odf_document_styles_context.cpp' || echo '$(srcdir)/'`odf_document_styles_context.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-odf_para_context.lo: odf_para_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-odf_para_context.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_para_context.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-odf_para_context.lo `test -f 'odf_para_context.cpp' || echo '$(srcdir)/'`odf_para_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_para_context.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_para_context.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='odf_para_context.cpp' object='liborcus_@ORCUS_API_VERSION@_la-odf_para_context.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-odf_para_context.lo `test -f 'odf_para_context.cpp' || echo '$(srcdir)/'`odf_para_context.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-odf_styles.lo: odf_styles.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-odf_styles.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_styles.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-odf_styles.lo `test -f 'odf_styles.cpp' || echo '$(srcdir)/'`odf_styles.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_styles.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_styles.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='odf_styles.cpp' object='liborcus_@ORCUS_API_VERSION@_la-odf_styles.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-odf_styles.lo `test -f 'odf_styles.cpp' || echo '$(srcdir)/'`odf_styles.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-odf_styles_context.lo: odf_styles_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-odf_styles_context.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_styles_context.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-odf_styles_context.lo `test -f 'odf_styles_context.cpp' || echo '$(srcdir)/'`odf_styles_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_styles_context.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_styles_context.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='odf_styles_context.cpp' object='liborcus_@ORCUS_API_VERSION@_la-odf_styles_context.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-odf_styles_context.lo `test -f 'odf_styles_context.cpp' || echo '$(srcdir)/'`odf_styles_context.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-odf_style_context.lo: odf_style_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-odf_style_context.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_style_context.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-odf_style_context.lo `test -f 'odf_style_context.cpp' || echo '$(srcdir)/'`odf_style_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_style_context.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_style_context.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='odf_style_context.cpp' object='liborcus_@ORCUS_API_VERSION@_la-odf_style_context.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-odf_style_context.lo `test -f 'odf_style_context.cpp' || echo '$(srcdir)/'`odf_style_context.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-odf_number_format_context.lo: odf_number_format_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-odf_number_format_context.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_number_format_context.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-odf_number_format_context.lo `test -f 'odf_number_format_context.cpp' || echo '$(srcdir)/'`odf_number_format_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_number_format_context.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_number_format_context.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='odf_number_format_context.cpp' object='liborcus_@ORCUS_API_VERSION@_la-odf_number_format_context.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-odf_number_format_context.lo `test -f 'odf_number_format_context.cpp' || echo '$(srcdir)/'`odf_number_format_context.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-odf_tokens.lo: odf_tokens.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-odf_tokens.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_tokens.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-odf_tokens.lo `test -f 'odf_tokens.cpp' || echo '$(srcdir)/'`odf_tokens.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_tokens.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_tokens.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='odf_tokens.cpp' object='liborcus_@ORCUS_API_VERSION@_la-odf_tokens.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-odf_tokens.lo `test -f 'odf_tokens.cpp' || echo '$(srcdir)/'`odf_tokens.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-ods_content_xml_context.lo: ods_content_xml_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-ods_content_xml_context.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ods_content_xml_context.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-ods_content_xml_context.lo `test -f 'ods_content_xml_context.cpp' || echo '$(srcdir)/'`ods_content_xml_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ods_content_xml_context.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ods_content_xml_context.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ods_content_xml_context.cpp' object='liborcus_@ORCUS_API_VERSION@_la-ods_content_xml_context.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-ods_content_xml_context.lo `test -f 'ods_content_xml_context.cpp' || echo '$(srcdir)/'`ods_content_xml_context.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-ods_dde_links_context.lo: ods_dde_links_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-ods_dde_links_context.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ods_dde_links_context.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-ods_dde_links_context.lo `test -f 'ods_dde_links_context.cpp' || echo '$(srcdir)/'`ods_dde_links_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ods_dde_links_context.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ods_dde_links_context.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ods_dde_links_context.cpp' object='liborcus_@ORCUS_API_VERSION@_la-ods_dde_links_context.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-ods_dde_links_context.lo `test -f 'ods_dde_links_context.cpp' || echo '$(srcdir)/'`ods_dde_links_context.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-ods_session_data.lo: ods_session_data.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-ods_session_data.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ods_session_data.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-ods_session_data.lo `test -f 'ods_session_data.cpp' || echo '$(srcdir)/'`ods_session_data.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ods_session_data.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ods_session_data.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ods_session_data.cpp' object='liborcus_@ORCUS_API_VERSION@_la-ods_session_data.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-ods_session_data.lo `test -f 'ods_session_data.cpp' || echo '$(srcdir)/'`ods_session_data.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-odf_helper.lo: odf_helper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-odf_helper.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_helper.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-odf_helper.lo `test -f 'odf_helper.cpp' || echo '$(srcdir)/'`odf_helper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_helper.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_helper.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='odf_helper.cpp' object='liborcus_@ORCUS_API_VERSION@_la-odf_helper.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-odf_helper.lo `test -f 'odf_helper.cpp' || echo '$(srcdir)/'`odf_helper.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-orcus_ods.lo: orcus_ods.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-orcus_ods.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_ods.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-orcus_ods.lo `test -f 'orcus_ods.cpp' || echo '$(srcdir)/'`orcus_ods.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_ods.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_ods.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_ods.cpp' object='liborcus_@ORCUS_API_VERSION@_la-orcus_ods.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-orcus_ods.lo `test -f 'orcus_ods.cpp' || echo '$(srcdir)/'`orcus_ods.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-orcus_import_ods.lo: orcus_import_ods.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-orcus_import_ods.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_import_ods.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-orcus_import_ods.lo `test -f 'orcus_import_ods.cpp' || echo '$(srcdir)/'`orcus_import_ods.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_import_ods.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_import_ods.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_import_ods.cpp' object='liborcus_@ORCUS_API_VERSION@_la-orcus_import_ods.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-orcus_import_ods.lo `test -f 'orcus_import_ods.cpp' || echo '$(srcdir)/'`orcus_import_ods.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-gnumeric_cell_context.lo: gnumeric_cell_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-gnumeric_cell_context.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_cell_context.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-gnumeric_cell_context.lo `test -f 'gnumeric_cell_context.cpp' || echo '$(srcdir)/'`gnumeric_cell_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_cell_context.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_cell_context.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gnumeric_cell_context.cpp' object='liborcus_@ORCUS_API_VERSION@_la-gnumeric_cell_context.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-gnumeric_cell_context.lo `test -f 'gnumeric_cell_context.cpp' || echo '$(srcdir)/'`gnumeric_cell_context.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-gnumeric_context.lo: gnumeric_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-gnumeric_context.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_context.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-gnumeric_context.lo `test -f 'gnumeric_context.cpp' || echo '$(srcdir)/'`gnumeric_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_context.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_context.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gnumeric_context.cpp' object='liborcus_@ORCUS_API_VERSION@_la-gnumeric_context.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-gnumeric_context.lo `test -f 'gnumeric_context.cpp' || echo '$(srcdir)/'`gnumeric_context.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-gnumeric_detection_handler.lo: gnumeric_detection_handler.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-gnumeric_detection_handler.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_detection_handler.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-gnumeric_detection_handler.lo `test -f 'gnumeric_detection_handler.cpp' || echo '$(srcdir)/'`gnumeric_detection_handler.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_detection_handler.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_detection_handler.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gnumeric_detection_handler.cpp' object='liborcus_@ORCUS_API_VERSION@_la-gnumeric_detection_handler.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-gnumeric_detection_handler.lo `test -f 'gnumeric_detection_handler.cpp' || echo '$(srcdir)/'`gnumeric_detection_handler.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-gnumeric_filter_context.lo: gnumeric_filter_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-gnumeric_filter_context.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_filter_context.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-gnumeric_filter_context.lo `test -f 'gnumeric_filter_context.cpp' || echo '$(srcdir)/'`gnumeric_filter_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_filter_context.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_filter_context.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gnumeric_filter_context.cpp' object='liborcus_@ORCUS_API_VERSION@_la-gnumeric_filter_context.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-gnumeric_filter_context.lo `test -f 'gnumeric_filter_context.cpp' || echo '$(srcdir)/'`gnumeric_filter_context.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-gnumeric_handler.lo: gnumeric_handler.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-gnumeric_handler.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_handler.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-gnumeric_handler.lo `test -f 'gnumeric_handler.cpp' || echo '$(srcdir)/'`gnumeric_handler.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_handler.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_handler.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gnumeric_handler.cpp' object='liborcus_@ORCUS_API_VERSION@_la-gnumeric_handler.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-gnumeric_handler.lo `test -f 'gnumeric_handler.cpp' || echo '$(srcdir)/'`gnumeric_handler.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-gnumeric_names_context.lo: gnumeric_names_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-gnumeric_names_context.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_names_context.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-gnumeric_names_context.lo `test -f 'gnumeric_names_context.cpp' || echo '$(srcdir)/'`gnumeric_names_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_names_context.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_names_context.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gnumeric_names_context.cpp' object='liborcus_@ORCUS_API_VERSION@_la-gnumeric_names_context.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-gnumeric_names_context.lo `test -f 'gnumeric_names_context.cpp' || echo '$(srcdir)/'`gnumeric_names_context.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-gnumeric_sheet_context.lo: gnumeric_sheet_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-gnumeric_sheet_context.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_sheet_context.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-gnumeric_sheet_context.lo `test -f 'gnumeric_sheet_context.cpp' || echo '$(srcdir)/'`gnumeric_sheet_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_sheet_context.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_sheet_context.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gnumeric_sheet_context.cpp' object='liborcus_@ORCUS_API_VERSION@_la-gnumeric_sheet_context.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-gnumeric_sheet_context.lo `test -f 'gnumeric_sheet_context.cpp' || echo '$(srcdir)/'`gnumeric_sheet_context.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-gnumeric_styles_context.lo: gnumeric_styles_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-gnumeric_styles_context.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_styles_context.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-gnumeric_styles_context.lo `test -f 'gnumeric_styles_context.cpp' || echo '$(srcdir)/'`gnumeric_styles_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_styles_context.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_styles_context.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gnumeric_styles_context.cpp' object='liborcus_@ORCUS_API_VERSION@_la-gnumeric_styles_context.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-gnumeric_styles_context.lo `test -f 'gnumeric_styles_context.cpp' || echo '$(srcdir)/'`gnumeric_styles_context.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-gnumeric_tokens.lo: gnumeric_tokens.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-gnumeric_tokens.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_tokens.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-gnumeric_tokens.lo `test -f 'gnumeric_tokens.cpp' || echo '$(srcdir)/'`gnumeric_tokens.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_tokens.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_tokens.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gnumeric_tokens.cpp' object='liborcus_@ORCUS_API_VERSION@_la-gnumeric_tokens.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-gnumeric_tokens.lo `test -f 'gnumeric_tokens.cpp' || echo '$(srcdir)/'`gnumeric_tokens.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-gnumeric_types.lo: gnumeric_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-gnumeric_types.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_types.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-gnumeric_types.lo `test -f 'gnumeric_types.cpp' || echo '$(srcdir)/'`gnumeric_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_types.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_types.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gnumeric_types.cpp' object='liborcus_@ORCUS_API_VERSION@_la-gnumeric_types.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-gnumeric_types.lo `test -f 'gnumeric_types.cpp' || echo '$(srcdir)/'`gnumeric_types.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-gnumeric_value_format_parser.lo: gnumeric_value_format_parser.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-gnumeric_value_format_parser.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_value_format_parser.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-gnumeric_value_format_parser.lo `test -f 'gnumeric_value_format_parser.cpp' || echo '$(srcdir)/'`gnumeric_value_format_parser.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_value_format_parser.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_value_format_parser.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gnumeric_value_format_parser.cpp' object='liborcus_@ORCUS_API_VERSION@_la-gnumeric_value_format_parser.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-gnumeric_value_format_parser.lo `test -f 'gnumeric_value_format_parser.cpp' || echo '$(srcdir)/'`gnumeric_value_format_parser.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-orcus_gnumeric.lo: orcus_gnumeric.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-orcus_gnumeric.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_gnumeric.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-orcus_gnumeric.lo `test -f 'orcus_gnumeric.cpp' || echo '$(srcdir)/'`orcus_gnumeric.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_gnumeric.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_gnumeric.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_gnumeric.cpp' object='liborcus_@ORCUS_API_VERSION@_la-orcus_gnumeric.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-orcus_gnumeric.lo `test -f 'orcus_gnumeric.cpp' || echo '$(srcdir)/'`orcus_gnumeric.cpp
+
+liborcus_@ORCUS_API_VERSION@_la-orcus_parquet.lo: orcus_parquet.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -MT liborcus_@ORCUS_API_VERSION@_la-orcus_parquet.lo -MD -MP -MF $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_parquet.Tpo -c -o liborcus_@ORCUS_API_VERSION@_la-orcus_parquet.lo `test -f 'orcus_parquet.cpp' || echo '$(srcdir)/'`orcus_parquet.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_parquet.Tpo $(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_parquet.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='orcus_parquet.cpp' object='liborcus_@ORCUS_API_VERSION@_la-orcus_parquet.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_@ORCUS_API_VERSION@_la-orcus_parquet.lo `test -f 'orcus_parquet.cpp' || echo '$(srcdir)/'`orcus_parquet.cpp
+
+gnumeric_sheet_context_test-session_context.o: session_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-session_context.o -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-session_context.Tpo -c -o gnumeric_sheet_context_test-session_context.o `test -f 'session_context.cpp' || echo '$(srcdir)/'`session_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-session_context.Tpo $(DEPDIR)/gnumeric_sheet_context_test-session_context.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='session_context.cpp' object='gnumeric_sheet_context_test-session_context.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-session_context.o `test -f 'session_context.cpp' || echo '$(srcdir)/'`session_context.cpp
+
+gnumeric_sheet_context_test-session_context.obj: session_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-session_context.obj -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-session_context.Tpo -c -o gnumeric_sheet_context_test-session_context.obj `if test -f 'session_context.cpp'; then $(CYGPATH_W) 'session_context.cpp'; else $(CYGPATH_W) '$(srcdir)/session_context.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-session_context.Tpo $(DEPDIR)/gnumeric_sheet_context_test-session_context.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='session_context.cpp' object='gnumeric_sheet_context_test-session_context.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-session_context.obj `if test -f 'session_context.cpp'; then $(CYGPATH_W) 'session_context.cpp'; else $(CYGPATH_W) '$(srcdir)/session_context.cpp'; fi`
+
+gnumeric_sheet_context_test-gnumeric_sheet_context_test.o: gnumeric_sheet_context_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-gnumeric_sheet_context_test.o -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_sheet_context_test.Tpo -c -o gnumeric_sheet_context_test-gnumeric_sheet_context_test.o `test -f 'gnumeric_sheet_context_test.cpp' || echo '$(srcdir)/'`gnumeric_sheet_context_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_sheet_context_test.Tpo $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_sheet_context_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gnumeric_sheet_context_test.cpp' object='gnumeric_sheet_context_test-gnumeric_sheet_context_test.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-gnumeric_sheet_context_test.o `test -f 'gnumeric_sheet_context_test.cpp' || echo '$(srcdir)/'`gnumeric_sheet_context_test.cpp
+
+gnumeric_sheet_context_test-gnumeric_sheet_context_test.obj: gnumeric_sheet_context_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-gnumeric_sheet_context_test.obj -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_sheet_context_test.Tpo -c -o gnumeric_sheet_context_test-gnumeric_sheet_context_test.obj `if test -f 'gnumeric_sheet_context_test.cpp'; then $(CYGPATH_W) 'gnumeric_sheet_context_test.cpp'; else $(CYGPATH_W) '$(srcdir)/gnumeric_sheet_context_test.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_sheet_context_test.Tpo $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_sheet_context_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gnumeric_sheet_context_test.cpp' object='gnumeric_sheet_context_test-gnumeric_sheet_context_test.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-gnumeric_sheet_context_test.obj `if test -f 'gnumeric_sheet_context_test.cpp'; then $(CYGPATH_W) 'gnumeric_sheet_context_test.cpp'; else $(CYGPATH_W) '$(srcdir)/gnumeric_sheet_context_test.cpp'; fi`
+
+gnumeric_sheet_context_test-gnumeric_sheet_context.o: gnumeric_sheet_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-gnumeric_sheet_context.o -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_sheet_context.Tpo -c -o gnumeric_sheet_context_test-gnumeric_sheet_context.o `test -f 'gnumeric_sheet_context.cpp' || echo '$(srcdir)/'`gnumeric_sheet_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_sheet_context.Tpo $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_sheet_context.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gnumeric_sheet_context.cpp' object='gnumeric_sheet_context_test-gnumeric_sheet_context.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-gnumeric_sheet_context.o `test -f 'gnumeric_sheet_context.cpp' || echo '$(srcdir)/'`gnumeric_sheet_context.cpp
+
+gnumeric_sheet_context_test-gnumeric_sheet_context.obj: gnumeric_sheet_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-gnumeric_sheet_context.obj -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_sheet_context.Tpo -c -o gnumeric_sheet_context_test-gnumeric_sheet_context.obj `if test -f 'gnumeric_sheet_context.cpp'; then $(CYGPATH_W) 'gnumeric_sheet_context.cpp'; else $(CYGPATH_W) '$(srcdir)/gnumeric_sheet_context.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_sheet_context.Tpo $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_sheet_context.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gnumeric_sheet_context.cpp' object='gnumeric_sheet_context_test-gnumeric_sheet_context.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-gnumeric_sheet_context.obj `if test -f 'gnumeric_sheet_context.cpp'; then $(CYGPATH_W) 'gnumeric_sheet_context.cpp'; else $(CYGPATH_W) '$(srcdir)/gnumeric_sheet_context.cpp'; fi`
+
+gnumeric_sheet_context_test-gnumeric_names_context.o: gnumeric_names_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-gnumeric_names_context.o -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_names_context.Tpo -c -o gnumeric_sheet_context_test-gnumeric_names_context.o `test -f 'gnumeric_names_context.cpp' || echo '$(srcdir)/'`gnumeric_names_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_names_context.Tpo $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_names_context.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gnumeric_names_context.cpp' object='gnumeric_sheet_context_test-gnumeric_names_context.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-gnumeric_names_context.o `test -f 'gnumeric_names_context.cpp' || echo '$(srcdir)/'`gnumeric_names_context.cpp
+
+gnumeric_sheet_context_test-gnumeric_names_context.obj: gnumeric_names_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-gnumeric_names_context.obj -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_names_context.Tpo -c -o gnumeric_sheet_context_test-gnumeric_names_context.obj `if test -f 'gnumeric_names_context.cpp'; then $(CYGPATH_W) 'gnumeric_names_context.cpp'; else $(CYGPATH_W) '$(srcdir)/gnumeric_names_context.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_names_context.Tpo $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_names_context.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gnumeric_names_context.cpp' object='gnumeric_sheet_context_test-gnumeric_names_context.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-gnumeric_names_context.obj `if test -f 'gnumeric_names_context.cpp'; then $(CYGPATH_W) 'gnumeric_names_context.cpp'; else $(CYGPATH_W) '$(srcdir)/gnumeric_names_context.cpp'; fi`
+
+gnumeric_sheet_context_test-gnumeric_cell_context.o: gnumeric_cell_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-gnumeric_cell_context.o -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_cell_context.Tpo -c -o gnumeric_sheet_context_test-gnumeric_cell_context.o `test -f 'gnumeric_cell_context.cpp' || echo '$(srcdir)/'`gnumeric_cell_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_cell_context.Tpo $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_cell_context.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gnumeric_cell_context.cpp' object='gnumeric_sheet_context_test-gnumeric_cell_context.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-gnumeric_cell_context.o `test -f 'gnumeric_cell_context.cpp' || echo '$(srcdir)/'`gnumeric_cell_context.cpp
+
+gnumeric_sheet_context_test-gnumeric_cell_context.obj: gnumeric_cell_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-gnumeric_cell_context.obj -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_cell_context.Tpo -c -o gnumeric_sheet_context_test-gnumeric_cell_context.obj `if test -f 'gnumeric_cell_context.cpp'; then $(CYGPATH_W) 'gnumeric_cell_context.cpp'; else $(CYGPATH_W) '$(srcdir)/gnumeric_cell_context.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_cell_context.Tpo $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_cell_context.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gnumeric_cell_context.cpp' object='gnumeric_sheet_context_test-gnumeric_cell_context.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-gnumeric_cell_context.obj `if test -f 'gnumeric_cell_context.cpp'; then $(CYGPATH_W) 'gnumeric_cell_context.cpp'; else $(CYGPATH_W) '$(srcdir)/gnumeric_cell_context.cpp'; fi`
+
+gnumeric_sheet_context_test-gnumeric_filter_context.o: gnumeric_filter_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-gnumeric_filter_context.o -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_filter_context.Tpo -c -o gnumeric_sheet_context_test-gnumeric_filter_context.o `test -f 'gnumeric_filter_context.cpp' || echo '$(srcdir)/'`gnumeric_filter_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_filter_context.Tpo $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_filter_context.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gnumeric_filter_context.cpp' object='gnumeric_sheet_context_test-gnumeric_filter_context.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-gnumeric_filter_context.o `test -f 'gnumeric_filter_context.cpp' || echo '$(srcdir)/'`gnumeric_filter_context.cpp
+
+gnumeric_sheet_context_test-gnumeric_filter_context.obj: gnumeric_filter_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-gnumeric_filter_context.obj -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_filter_context.Tpo -c -o gnumeric_sheet_context_test-gnumeric_filter_context.obj `if test -f 'gnumeric_filter_context.cpp'; then $(CYGPATH_W) 'gnumeric_filter_context.cpp'; else $(CYGPATH_W) '$(srcdir)/gnumeric_filter_context.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_filter_context.Tpo $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_filter_context.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gnumeric_filter_context.cpp' object='gnumeric_sheet_context_test-gnumeric_filter_context.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-gnumeric_filter_context.obj `if test -f 'gnumeric_filter_context.cpp'; then $(CYGPATH_W) 'gnumeric_filter_context.cpp'; else $(CYGPATH_W) '$(srcdir)/gnumeric_filter_context.cpp'; fi`
+
+gnumeric_sheet_context_test-gnumeric_styles_context.o: gnumeric_styles_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-gnumeric_styles_context.o -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_styles_context.Tpo -c -o gnumeric_sheet_context_test-gnumeric_styles_context.o `test -f 'gnumeric_styles_context.cpp' || echo '$(srcdir)/'`gnumeric_styles_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_styles_context.Tpo $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_styles_context.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gnumeric_styles_context.cpp' object='gnumeric_sheet_context_test-gnumeric_styles_context.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-gnumeric_styles_context.o `test -f 'gnumeric_styles_context.cpp' || echo '$(srcdir)/'`gnumeric_styles_context.cpp
+
+gnumeric_sheet_context_test-gnumeric_styles_context.obj: gnumeric_styles_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-gnumeric_styles_context.obj -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_styles_context.Tpo -c -o gnumeric_sheet_context_test-gnumeric_styles_context.obj `if test -f 'gnumeric_styles_context.cpp'; then $(CYGPATH_W) 'gnumeric_styles_context.cpp'; else $(CYGPATH_W) '$(srcdir)/gnumeric_styles_context.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_styles_context.Tpo $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_styles_context.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gnumeric_styles_context.cpp' object='gnumeric_sheet_context_test-gnumeric_styles_context.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-gnumeric_styles_context.obj `if test -f 'gnumeric_styles_context.cpp'; then $(CYGPATH_W) 'gnumeric_styles_context.cpp'; else $(CYGPATH_W) '$(srcdir)/gnumeric_styles_context.cpp'; fi`
+
+gnumeric_sheet_context_test-gnumeric_value_format_parser.o: gnumeric_value_format_parser.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-gnumeric_value_format_parser.o -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_value_format_parser.Tpo -c -o gnumeric_sheet_context_test-gnumeric_value_format_parser.o `test -f 'gnumeric_value_format_parser.cpp' || echo '$(srcdir)/'`gnumeric_value_format_parser.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_value_format_parser.Tpo $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_value_format_parser.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gnumeric_value_format_parser.cpp' object='gnumeric_sheet_context_test-gnumeric_value_format_parser.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-gnumeric_value_format_parser.o `test -f 'gnumeric_value_format_parser.cpp' || echo '$(srcdir)/'`gnumeric_value_format_parser.cpp
+
+gnumeric_sheet_context_test-gnumeric_value_format_parser.obj: gnumeric_value_format_parser.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-gnumeric_value_format_parser.obj -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_value_format_parser.Tpo -c -o gnumeric_sheet_context_test-gnumeric_value_format_parser.obj `if test -f 'gnumeric_value_format_parser.cpp'; then $(CYGPATH_W) 'gnumeric_value_format_parser.cpp'; else $(CYGPATH_W) '$(srcdir)/gnumeric_value_format_parser.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_value_format_parser.Tpo $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_value_format_parser.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gnumeric_value_format_parser.cpp' object='gnumeric_sheet_context_test-gnumeric_value_format_parser.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-gnumeric_value_format_parser.obj `if test -f 'gnumeric_value_format_parser.cpp'; then $(CYGPATH_W) 'gnumeric_value_format_parser.cpp'; else $(CYGPATH_W) '$(srcdir)/gnumeric_value_format_parser.cpp'; fi`
+
+gnumeric_sheet_context_test-gnumeric_types.o: gnumeric_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-gnumeric_types.o -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_types.Tpo -c -o gnumeric_sheet_context_test-gnumeric_types.o `test -f 'gnumeric_types.cpp' || echo '$(srcdir)/'`gnumeric_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_types.Tpo $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_types.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gnumeric_types.cpp' object='gnumeric_sheet_context_test-gnumeric_types.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-gnumeric_types.o `test -f 'gnumeric_types.cpp' || echo '$(srcdir)/'`gnumeric_types.cpp
+
+gnumeric_sheet_context_test-gnumeric_types.obj: gnumeric_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-gnumeric_types.obj -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_types.Tpo -c -o gnumeric_sheet_context_test-gnumeric_types.obj `if test -f 'gnumeric_types.cpp'; then $(CYGPATH_W) 'gnumeric_types.cpp'; else $(CYGPATH_W) '$(srcdir)/gnumeric_types.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_types.Tpo $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_types.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gnumeric_types.cpp' object='gnumeric_sheet_context_test-gnumeric_types.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-gnumeric_types.obj `if test -f 'gnumeric_types.cpp'; then $(CYGPATH_W) 'gnumeric_types.cpp'; else $(CYGPATH_W) '$(srcdir)/gnumeric_types.cpp'; fi`
+
+gnumeric_sheet_context_test-number_utils.o: number_utils.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-number_utils.o -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-number_utils.Tpo -c -o gnumeric_sheet_context_test-number_utils.o `test -f 'number_utils.cpp' || echo '$(srcdir)/'`number_utils.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-number_utils.Tpo $(DEPDIR)/gnumeric_sheet_context_test-number_utils.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='number_utils.cpp' object='gnumeric_sheet_context_test-number_utils.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-number_utils.o `test -f 'number_utils.cpp' || echo '$(srcdir)/'`number_utils.cpp
+
+gnumeric_sheet_context_test-number_utils.obj: number_utils.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-number_utils.obj -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-number_utils.Tpo -c -o gnumeric_sheet_context_test-number_utils.obj `if test -f 'number_utils.cpp'; then $(CYGPATH_W) 'number_utils.cpp'; else $(CYGPATH_W) '$(srcdir)/number_utils.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-number_utils.Tpo $(DEPDIR)/gnumeric_sheet_context_test-number_utils.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='number_utils.cpp' object='gnumeric_sheet_context_test-number_utils.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-number_utils.obj `if test -f 'number_utils.cpp'; then $(CYGPATH_W) 'number_utils.cpp'; else $(CYGPATH_W) '$(srcdir)/number_utils.cpp'; fi`
+
+gnumeric_sheet_context_test-xml_context_base.o: xml_context_base.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-xml_context_base.o -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-xml_context_base.Tpo -c -o gnumeric_sheet_context_test-xml_context_base.o `test -f 'xml_context_base.cpp' || echo '$(srcdir)/'`xml_context_base.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-xml_context_base.Tpo $(DEPDIR)/gnumeric_sheet_context_test-xml_context_base.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_context_base.cpp' object='gnumeric_sheet_context_test-xml_context_base.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-xml_context_base.o `test -f 'xml_context_base.cpp' || echo '$(srcdir)/'`xml_context_base.cpp
+
+gnumeric_sheet_context_test-xml_context_base.obj: xml_context_base.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-xml_context_base.obj -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-xml_context_base.Tpo -c -o gnumeric_sheet_context_test-xml_context_base.obj `if test -f 'xml_context_base.cpp'; then $(CYGPATH_W) 'xml_context_base.cpp'; else $(CYGPATH_W) '$(srcdir)/xml_context_base.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-xml_context_base.Tpo $(DEPDIR)/gnumeric_sheet_context_test-xml_context_base.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_context_base.cpp' object='gnumeric_sheet_context_test-xml_context_base.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-xml_context_base.obj `if test -f 'xml_context_base.cpp'; then $(CYGPATH_W) 'xml_context_base.cpp'; else $(CYGPATH_W) '$(srcdir)/xml_context_base.cpp'; fi`
+
+gnumeric_sheet_context_test-xml_element_types.o: xml_element_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-xml_element_types.o -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-xml_element_types.Tpo -c -o gnumeric_sheet_context_test-xml_element_types.o `test -f 'xml_element_types.cpp' || echo '$(srcdir)/'`xml_element_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-xml_element_types.Tpo $(DEPDIR)/gnumeric_sheet_context_test-xml_element_types.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_element_types.cpp' object='gnumeric_sheet_context_test-xml_element_types.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-xml_element_types.o `test -f 'xml_element_types.cpp' || echo '$(srcdir)/'`xml_element_types.cpp
+
+gnumeric_sheet_context_test-xml_element_types.obj: xml_element_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-xml_element_types.obj -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-xml_element_types.Tpo -c -o gnumeric_sheet_context_test-xml_element_types.obj `if test -f 'xml_element_types.cpp'; then $(CYGPATH_W) 'xml_element_types.cpp'; else $(CYGPATH_W) '$(srcdir)/xml_element_types.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-xml_element_types.Tpo $(DEPDIR)/gnumeric_sheet_context_test-xml_element_types.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_element_types.cpp' object='gnumeric_sheet_context_test-xml_element_types.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-xml_element_types.obj `if test -f 'xml_element_types.cpp'; then $(CYGPATH_W) 'xml_element_types.cpp'; else $(CYGPATH_W) '$(srcdir)/xml_element_types.cpp'; fi`
+
+gnumeric_sheet_context_test-xml_element_validator.o: xml_element_validator.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-xml_element_validator.o -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-xml_element_validator.Tpo -c -o gnumeric_sheet_context_test-xml_element_validator.o `test -f 'xml_element_validator.cpp' || echo '$(srcdir)/'`xml_element_validator.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-xml_element_validator.Tpo $(DEPDIR)/gnumeric_sheet_context_test-xml_element_validator.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_element_validator.cpp' object='gnumeric_sheet_context_test-xml_element_validator.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-xml_element_validator.o `test -f 'xml_element_validator.cpp' || echo '$(srcdir)/'`xml_element_validator.cpp
+
+gnumeric_sheet_context_test-xml_element_validator.obj: xml_element_validator.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-xml_element_validator.obj -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-xml_element_validator.Tpo -c -o gnumeric_sheet_context_test-xml_element_validator.obj `if test -f 'xml_element_validator.cpp'; then $(CYGPATH_W) 'xml_element_validator.cpp'; else $(CYGPATH_W) '$(srcdir)/xml_element_validator.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-xml_element_validator.Tpo $(DEPDIR)/gnumeric_sheet_context_test-xml_element_validator.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_element_validator.cpp' object='gnumeric_sheet_context_test-xml_element_validator.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-xml_element_validator.obj `if test -f 'xml_element_validator.cpp'; then $(CYGPATH_W) 'xml_element_validator.cpp'; else $(CYGPATH_W) '$(srcdir)/xml_element_validator.cpp'; fi`
+
+gnumeric_sheet_context_test-xml_empty_context.o: xml_empty_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-xml_empty_context.o -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-xml_empty_context.Tpo -c -o gnumeric_sheet_context_test-xml_empty_context.o `test -f 'xml_empty_context.cpp' || echo '$(srcdir)/'`xml_empty_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-xml_empty_context.Tpo $(DEPDIR)/gnumeric_sheet_context_test-xml_empty_context.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_empty_context.cpp' object='gnumeric_sheet_context_test-xml_empty_context.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-xml_empty_context.o `test -f 'xml_empty_context.cpp' || echo '$(srcdir)/'`xml_empty_context.cpp
+
+gnumeric_sheet_context_test-xml_empty_context.obj: xml_empty_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-xml_empty_context.obj -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-xml_empty_context.Tpo -c -o gnumeric_sheet_context_test-xml_empty_context.obj `if test -f 'xml_empty_context.cpp'; then $(CYGPATH_W) 'xml_empty_context.cpp'; else $(CYGPATH_W) '$(srcdir)/xml_empty_context.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-xml_empty_context.Tpo $(DEPDIR)/gnumeric_sheet_context_test-xml_empty_context.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_empty_context.cpp' object='gnumeric_sheet_context_test-xml_empty_context.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-xml_empty_context.obj `if test -f 'xml_empty_context.cpp'; then $(CYGPATH_W) 'xml_empty_context.cpp'; else $(CYGPATH_W) '$(srcdir)/xml_empty_context.cpp'; fi`
+
+gnumeric_sheet_context_test-xml_util.o: xml_util.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-xml_util.o -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-xml_util.Tpo -c -o gnumeric_sheet_context_test-xml_util.o `test -f 'xml_util.cpp' || echo '$(srcdir)/'`xml_util.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-xml_util.Tpo $(DEPDIR)/gnumeric_sheet_context_test-xml_util.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_util.cpp' object='gnumeric_sheet_context_test-xml_util.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-xml_util.o `test -f 'xml_util.cpp' || echo '$(srcdir)/'`xml_util.cpp
+
+gnumeric_sheet_context_test-xml_util.obj: xml_util.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-xml_util.obj -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-xml_util.Tpo -c -o gnumeric_sheet_context_test-xml_util.obj `if test -f 'xml_util.cpp'; then $(CYGPATH_W) 'xml_util.cpp'; else $(CYGPATH_W) '$(srcdir)/xml_util.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-xml_util.Tpo $(DEPDIR)/gnumeric_sheet_context_test-xml_util.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_util.cpp' object='gnumeric_sheet_context_test-xml_util.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-xml_util.obj `if test -f 'xml_util.cpp'; then $(CYGPATH_W) 'xml_util.cpp'; else $(CYGPATH_W) '$(srcdir)/xml_util.cpp'; fi`
+
+gnumeric_sheet_context_test-gnumeric_namespace_types.o: gnumeric_namespace_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-gnumeric_namespace_types.o -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_namespace_types.Tpo -c -o gnumeric_sheet_context_test-gnumeric_namespace_types.o `test -f 'gnumeric_namespace_types.cpp' || echo '$(srcdir)/'`gnumeric_namespace_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_namespace_types.Tpo $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_namespace_types.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gnumeric_namespace_types.cpp' object='gnumeric_sheet_context_test-gnumeric_namespace_types.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-gnumeric_namespace_types.o `test -f 'gnumeric_namespace_types.cpp' || echo '$(srcdir)/'`gnumeric_namespace_types.cpp
+
+gnumeric_sheet_context_test-gnumeric_namespace_types.obj: gnumeric_namespace_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-gnumeric_namespace_types.obj -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_namespace_types.Tpo -c -o gnumeric_sheet_context_test-gnumeric_namespace_types.obj `if test -f 'gnumeric_namespace_types.cpp'; then $(CYGPATH_W) 'gnumeric_namespace_types.cpp'; else $(CYGPATH_W) '$(srcdir)/gnumeric_namespace_types.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_namespace_types.Tpo $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_namespace_types.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gnumeric_namespace_types.cpp' object='gnumeric_sheet_context_test-gnumeric_namespace_types.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-gnumeric_namespace_types.obj `if test -f 'gnumeric_namespace_types.cpp'; then $(CYGPATH_W) 'gnumeric_namespace_types.cpp'; else $(CYGPATH_W) '$(srcdir)/gnumeric_namespace_types.cpp'; fi`
+
+gnumeric_sheet_context_test-gnumeric_tokens.o: gnumeric_tokens.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-gnumeric_tokens.o -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_tokens.Tpo -c -o gnumeric_sheet_context_test-gnumeric_tokens.o `test -f 'gnumeric_tokens.cpp' || echo '$(srcdir)/'`gnumeric_tokens.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_tokens.Tpo $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_tokens.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gnumeric_tokens.cpp' object='gnumeric_sheet_context_test-gnumeric_tokens.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-gnumeric_tokens.o `test -f 'gnumeric_tokens.cpp' || echo '$(srcdir)/'`gnumeric_tokens.cpp
+
+gnumeric_sheet_context_test-gnumeric_tokens.obj: gnumeric_tokens.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-gnumeric_tokens.obj -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_tokens.Tpo -c -o gnumeric_sheet_context_test-gnumeric_tokens.obj `if test -f 'gnumeric_tokens.cpp'; then $(CYGPATH_W) 'gnumeric_tokens.cpp'; else $(CYGPATH_W) '$(srcdir)/gnumeric_tokens.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_tokens.Tpo $(DEPDIR)/gnumeric_sheet_context_test-gnumeric_tokens.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gnumeric_tokens.cpp' object='gnumeric_sheet_context_test-gnumeric_tokens.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-gnumeric_tokens.obj `if test -f 'gnumeric_tokens.cpp'; then $(CYGPATH_W) 'gnumeric_tokens.cpp'; else $(CYGPATH_W) '$(srcdir)/gnumeric_tokens.cpp'; fi`
+
+gnumeric_sheet_context_test-odf_namespace_types.o: odf_namespace_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-odf_namespace_types.o -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-odf_namespace_types.Tpo -c -o gnumeric_sheet_context_test-odf_namespace_types.o `test -f 'odf_namespace_types.cpp' || echo '$(srcdir)/'`odf_namespace_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-odf_namespace_types.Tpo $(DEPDIR)/gnumeric_sheet_context_test-odf_namespace_types.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='odf_namespace_types.cpp' object='gnumeric_sheet_context_test-odf_namespace_types.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-odf_namespace_types.o `test -f 'odf_namespace_types.cpp' || echo '$(srcdir)/'`odf_namespace_types.cpp
+
+gnumeric_sheet_context_test-odf_namespace_types.obj: odf_namespace_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-odf_namespace_types.obj -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-odf_namespace_types.Tpo -c -o gnumeric_sheet_context_test-odf_namespace_types.obj `if test -f 'odf_namespace_types.cpp'; then $(CYGPATH_W) 'odf_namespace_types.cpp'; else $(CYGPATH_W) '$(srcdir)/odf_namespace_types.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-odf_namespace_types.Tpo $(DEPDIR)/gnumeric_sheet_context_test-odf_namespace_types.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='odf_namespace_types.cpp' object='gnumeric_sheet_context_test-odf_namespace_types.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-odf_namespace_types.obj `if test -f 'odf_namespace_types.cpp'; then $(CYGPATH_W) 'odf_namespace_types.cpp'; else $(CYGPATH_W) '$(srcdir)/odf_namespace_types.cpp'; fi`
+
+gnumeric_sheet_context_test-spreadsheet_interface.o: spreadsheet_interface.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-spreadsheet_interface.o -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-spreadsheet_interface.Tpo -c -o gnumeric_sheet_context_test-spreadsheet_interface.o `test -f 'spreadsheet_interface.cpp' || echo '$(srcdir)/'`spreadsheet_interface.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-spreadsheet_interface.Tpo $(DEPDIR)/gnumeric_sheet_context_test-spreadsheet_interface.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='spreadsheet_interface.cpp' object='gnumeric_sheet_context_test-spreadsheet_interface.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-spreadsheet_interface.o `test -f 'spreadsheet_interface.cpp' || echo '$(srcdir)/'`spreadsheet_interface.cpp
+
+gnumeric_sheet_context_test-spreadsheet_interface.obj: spreadsheet_interface.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-spreadsheet_interface.obj -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-spreadsheet_interface.Tpo -c -o gnumeric_sheet_context_test-spreadsheet_interface.obj `if test -f 'spreadsheet_interface.cpp'; then $(CYGPATH_W) 'spreadsheet_interface.cpp'; else $(CYGPATH_W) '$(srcdir)/spreadsheet_interface.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-spreadsheet_interface.Tpo $(DEPDIR)/gnumeric_sheet_context_test-spreadsheet_interface.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='spreadsheet_interface.cpp' object='gnumeric_sheet_context_test-spreadsheet_interface.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-spreadsheet_interface.obj `if test -f 'spreadsheet_interface.cpp'; then $(CYGPATH_W) 'spreadsheet_interface.cpp'; else $(CYGPATH_W) '$(srcdir)/spreadsheet_interface.cpp'; fi`
+
+gnumeric_sheet_context_test-string_helper.o: string_helper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-string_helper.o -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-string_helper.Tpo -c -o gnumeric_sheet_context_test-string_helper.o `test -f 'string_helper.cpp' || echo '$(srcdir)/'`string_helper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-string_helper.Tpo $(DEPDIR)/gnumeric_sheet_context_test-string_helper.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='string_helper.cpp' object='gnumeric_sheet_context_test-string_helper.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-string_helper.o `test -f 'string_helper.cpp' || echo '$(srcdir)/'`string_helper.cpp
+
+gnumeric_sheet_context_test-string_helper.obj: string_helper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gnumeric_sheet_context_test-string_helper.obj -MD -MP -MF $(DEPDIR)/gnumeric_sheet_context_test-string_helper.Tpo -c -o gnumeric_sheet_context_test-string_helper.obj `if test -f 'string_helper.cpp'; then $(CYGPATH_W) 'string_helper.cpp'; else $(CYGPATH_W) '$(srcdir)/string_helper.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gnumeric_sheet_context_test-string_helper.Tpo $(DEPDIR)/gnumeric_sheet_context_test-string_helper.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='string_helper.cpp' object='gnumeric_sheet_context_test-string_helper.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gnumeric_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gnumeric_sheet_context_test-string_helper.obj `if test -f 'string_helper.cpp'; then $(CYGPATH_W) 'string_helper.cpp'; else $(CYGPATH_W) '$(srcdir)/string_helper.cpp'; fi`
+
+json_document_tree_test-json_document_tree.o: json_document_tree.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_document_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT json_document_tree_test-json_document_tree.o -MD -MP -MF $(DEPDIR)/json_document_tree_test-json_document_tree.Tpo -c -o json_document_tree_test-json_document_tree.o `test -f 'json_document_tree.cpp' || echo '$(srcdir)/'`json_document_tree.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/json_document_tree_test-json_document_tree.Tpo $(DEPDIR)/json_document_tree_test-json_document_tree.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='json_document_tree.cpp' object='json_document_tree_test-json_document_tree.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_document_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o json_document_tree_test-json_document_tree.o `test -f 'json_document_tree.cpp' || echo '$(srcdir)/'`json_document_tree.cpp
+
+json_document_tree_test-json_document_tree.obj: json_document_tree.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_document_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT json_document_tree_test-json_document_tree.obj -MD -MP -MF $(DEPDIR)/json_document_tree_test-json_document_tree.Tpo -c -o json_document_tree_test-json_document_tree.obj `if test -f 'json_document_tree.cpp'; then $(CYGPATH_W) 'json_document_tree.cpp'; else $(CYGPATH_W) '$(srcdir)/json_document_tree.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/json_document_tree_test-json_document_tree.Tpo $(DEPDIR)/json_document_tree_test-json_document_tree.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='json_document_tree.cpp' object='json_document_tree_test-json_document_tree.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_document_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o json_document_tree_test-json_document_tree.obj `if test -f 'json_document_tree.cpp'; then $(CYGPATH_W) 'json_document_tree.cpp'; else $(CYGPATH_W) '$(srcdir)/json_document_tree.cpp'; fi`
+
+json_document_tree_test-json_util.o: json_util.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_document_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT json_document_tree_test-json_util.o -MD -MP -MF $(DEPDIR)/json_document_tree_test-json_util.Tpo -c -o json_document_tree_test-json_util.o `test -f 'json_util.cpp' || echo '$(srcdir)/'`json_util.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/json_document_tree_test-json_util.Tpo $(DEPDIR)/json_document_tree_test-json_util.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='json_util.cpp' object='json_document_tree_test-json_util.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_document_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o json_document_tree_test-json_util.o `test -f 'json_util.cpp' || echo '$(srcdir)/'`json_util.cpp
+
+json_document_tree_test-json_util.obj: json_util.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_document_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT json_document_tree_test-json_util.obj -MD -MP -MF $(DEPDIR)/json_document_tree_test-json_util.Tpo -c -o json_document_tree_test-json_util.obj `if test -f 'json_util.cpp'; then $(CYGPATH_W) 'json_util.cpp'; else $(CYGPATH_W) '$(srcdir)/json_util.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/json_document_tree_test-json_util.Tpo $(DEPDIR)/json_document_tree_test-json_util.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='json_util.cpp' object='json_document_tree_test-json_util.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_document_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o json_document_tree_test-json_util.obj `if test -f 'json_util.cpp'; then $(CYGPATH_W) 'json_util.cpp'; else $(CYGPATH_W) '$(srcdir)/json_util.cpp'; fi`
+
+json_document_tree_test-json_document_tree_test.o: json_document_tree_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_document_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT json_document_tree_test-json_document_tree_test.o -MD -MP -MF $(DEPDIR)/json_document_tree_test-json_document_tree_test.Tpo -c -o json_document_tree_test-json_document_tree_test.o `test -f 'json_document_tree_test.cpp' || echo '$(srcdir)/'`json_document_tree_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/json_document_tree_test-json_document_tree_test.Tpo $(DEPDIR)/json_document_tree_test-json_document_tree_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='json_document_tree_test.cpp' object='json_document_tree_test-json_document_tree_test.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_document_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o json_document_tree_test-json_document_tree_test.o `test -f 'json_document_tree_test.cpp' || echo '$(srcdir)/'`json_document_tree_test.cpp
+
+json_document_tree_test-json_document_tree_test.obj: json_document_tree_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_document_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT json_document_tree_test-json_document_tree_test.obj -MD -MP -MF $(DEPDIR)/json_document_tree_test-json_document_tree_test.Tpo -c -o json_document_tree_test-json_document_tree_test.obj `if test -f 'json_document_tree_test.cpp'; then $(CYGPATH_W) 'json_document_tree_test.cpp'; else $(CYGPATH_W) '$(srcdir)/json_document_tree_test.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/json_document_tree_test-json_document_tree_test.Tpo $(DEPDIR)/json_document_tree_test-json_document_tree_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='json_document_tree_test.cpp' object='json_document_tree_test-json_document_tree_test.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_document_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o json_document_tree_test-json_document_tree_test.obj `if test -f 'json_document_tree_test.cpp'; then $(CYGPATH_W) 'json_document_tree_test.cpp'; else $(CYGPATH_W) '$(srcdir)/json_document_tree_test.cpp'; fi`
+
+odf_helper_test-odf_helper.o: odf_helper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(odf_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT odf_helper_test-odf_helper.o -MD -MP -MF $(DEPDIR)/odf_helper_test-odf_helper.Tpo -c -o odf_helper_test-odf_helper.o `test -f 'odf_helper.cpp' || echo '$(srcdir)/'`odf_helper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/odf_helper_test-odf_helper.Tpo $(DEPDIR)/odf_helper_test-odf_helper.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='odf_helper.cpp' object='odf_helper_test-odf_helper.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(odf_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o odf_helper_test-odf_helper.o `test -f 'odf_helper.cpp' || echo '$(srcdir)/'`odf_helper.cpp
+
+odf_helper_test-odf_helper.obj: odf_helper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(odf_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT odf_helper_test-odf_helper.obj -MD -MP -MF $(DEPDIR)/odf_helper_test-odf_helper.Tpo -c -o odf_helper_test-odf_helper.obj `if test -f 'odf_helper.cpp'; then $(CYGPATH_W) 'odf_helper.cpp'; else $(CYGPATH_W) '$(srcdir)/odf_helper.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/odf_helper_test-odf_helper.Tpo $(DEPDIR)/odf_helper_test-odf_helper.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='odf_helper.cpp' object='odf_helper_test-odf_helper.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(odf_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o odf_helper_test-odf_helper.obj `if test -f 'odf_helper.cpp'; then $(CYGPATH_W) 'odf_helper.cpp'; else $(CYGPATH_W) '$(srcdir)/odf_helper.cpp'; fi`
+
+odf_helper_test-string_helper.o: string_helper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(odf_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT odf_helper_test-string_helper.o -MD -MP -MF $(DEPDIR)/odf_helper_test-string_helper.Tpo -c -o odf_helper_test-string_helper.o `test -f 'string_helper.cpp' || echo '$(srcdir)/'`string_helper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/odf_helper_test-string_helper.Tpo $(DEPDIR)/odf_helper_test-string_helper.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='string_helper.cpp' object='odf_helper_test-string_helper.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(odf_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o odf_helper_test-string_helper.o `test -f 'string_helper.cpp' || echo '$(srcdir)/'`string_helper.cpp
+
+odf_helper_test-string_helper.obj: string_helper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(odf_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT odf_helper_test-string_helper.obj -MD -MP -MF $(DEPDIR)/odf_helper_test-string_helper.Tpo -c -o odf_helper_test-string_helper.obj `if test -f 'string_helper.cpp'; then $(CYGPATH_W) 'string_helper.cpp'; else $(CYGPATH_W) '$(srcdir)/string_helper.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/odf_helper_test-string_helper.Tpo $(DEPDIR)/odf_helper_test-string_helper.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='string_helper.cpp' object='odf_helper_test-string_helper.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(odf_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o odf_helper_test-string_helper.obj `if test -f 'string_helper.cpp'; then $(CYGPATH_W) 'string_helper.cpp'; else $(CYGPATH_W) '$(srcdir)/string_helper.cpp'; fi`
+
+odf_helper_test-odf_helper_test.o: odf_helper_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(odf_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT odf_helper_test-odf_helper_test.o -MD -MP -MF $(DEPDIR)/odf_helper_test-odf_helper_test.Tpo -c -o odf_helper_test-odf_helper_test.o `test -f 'odf_helper_test.cpp' || echo '$(srcdir)/'`odf_helper_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/odf_helper_test-odf_helper_test.Tpo $(DEPDIR)/odf_helper_test-odf_helper_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='odf_helper_test.cpp' object='odf_helper_test-odf_helper_test.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(odf_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o odf_helper_test-odf_helper_test.o `test -f 'odf_helper_test.cpp' || echo '$(srcdir)/'`odf_helper_test.cpp
+
+odf_helper_test-odf_helper_test.obj: odf_helper_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(odf_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT odf_helper_test-odf_helper_test.obj -MD -MP -MF $(DEPDIR)/odf_helper_test-odf_helper_test.Tpo -c -o odf_helper_test-odf_helper_test.obj `if test -f 'odf_helper_test.cpp'; then $(CYGPATH_W) 'odf_helper_test.cpp'; else $(CYGPATH_W) '$(srcdir)/odf_helper_test.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/odf_helper_test-odf_helper_test.Tpo $(DEPDIR)/odf_helper_test-odf_helper_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='odf_helper_test.cpp' object='odf_helper_test-odf_helper_test.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(odf_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o odf_helper_test-odf_helper_test.obj `if test -f 'odf_helper_test.cpp'; then $(CYGPATH_W) 'odf_helper_test.cpp'; else $(CYGPATH_W) '$(srcdir)/odf_helper_test.cpp'; fi`
+
+xlsx_sheet_context_test-formula_result.o: formula_result.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-formula_result.o -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-formula_result.Tpo -c -o xlsx_sheet_context_test-formula_result.o `test -f 'formula_result.cpp' || echo '$(srcdir)/'`formula_result.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-formula_result.Tpo $(DEPDIR)/xlsx_sheet_context_test-formula_result.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='formula_result.cpp' object='xlsx_sheet_context_test-formula_result.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-formula_result.o `test -f 'formula_result.cpp' || echo '$(srcdir)/'`formula_result.cpp
+
+xlsx_sheet_context_test-formula_result.obj: formula_result.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-formula_result.obj -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-formula_result.Tpo -c -o xlsx_sheet_context_test-formula_result.obj `if test -f 'formula_result.cpp'; then $(CYGPATH_W) 'formula_result.cpp'; else $(CYGPATH_W) '$(srcdir)/formula_result.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-formula_result.Tpo $(DEPDIR)/xlsx_sheet_context_test-formula_result.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='formula_result.cpp' object='xlsx_sheet_context_test-formula_result.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-formula_result.obj `if test -f 'formula_result.cpp'; then $(CYGPATH_W) 'formula_result.cpp'; else $(CYGPATH_W) '$(srcdir)/formula_result.cpp'; fi`
+
+xlsx_sheet_context_test-ooxml_global.o: ooxml_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-ooxml_global.o -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-ooxml_global.Tpo -c -o xlsx_sheet_context_test-ooxml_global.o `test -f 'ooxml_global.cpp' || echo '$(srcdir)/'`ooxml_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-ooxml_global.Tpo $(DEPDIR)/xlsx_sheet_context_test-ooxml_global.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ooxml_global.cpp' object='xlsx_sheet_context_test-ooxml_global.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-ooxml_global.o `test -f 'ooxml_global.cpp' || echo '$(srcdir)/'`ooxml_global.cpp
+
+xlsx_sheet_context_test-ooxml_global.obj: ooxml_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-ooxml_global.obj -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-ooxml_global.Tpo -c -o xlsx_sheet_context_test-ooxml_global.obj `if test -f 'ooxml_global.cpp'; then $(CYGPATH_W) 'ooxml_global.cpp'; else $(CYGPATH_W) '$(srcdir)/ooxml_global.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-ooxml_global.Tpo $(DEPDIR)/xlsx_sheet_context_test-ooxml_global.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ooxml_global.cpp' object='xlsx_sheet_context_test-ooxml_global.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-ooxml_global.obj `if test -f 'ooxml_global.cpp'; then $(CYGPATH_W) 'ooxml_global.cpp'; else $(CYGPATH_W) '$(srcdir)/ooxml_global.cpp'; fi`
+
+xlsx_sheet_context_test-ooxml_namespace_types.o: ooxml_namespace_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-ooxml_namespace_types.o -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-ooxml_namespace_types.Tpo -c -o xlsx_sheet_context_test-ooxml_namespace_types.o `test -f 'ooxml_namespace_types.cpp' || echo '$(srcdir)/'`ooxml_namespace_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-ooxml_namespace_types.Tpo $(DEPDIR)/xlsx_sheet_context_test-ooxml_namespace_types.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ooxml_namespace_types.cpp' object='xlsx_sheet_context_test-ooxml_namespace_types.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-ooxml_namespace_types.o `test -f 'ooxml_namespace_types.cpp' || echo '$(srcdir)/'`ooxml_namespace_types.cpp
+
+xlsx_sheet_context_test-ooxml_namespace_types.obj: ooxml_namespace_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-ooxml_namespace_types.obj -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-ooxml_namespace_types.Tpo -c -o xlsx_sheet_context_test-ooxml_namespace_types.obj `if test -f 'ooxml_namespace_types.cpp'; then $(CYGPATH_W) 'ooxml_namespace_types.cpp'; else $(CYGPATH_W) '$(srcdir)/ooxml_namespace_types.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-ooxml_namespace_types.Tpo $(DEPDIR)/xlsx_sheet_context_test-ooxml_namespace_types.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ooxml_namespace_types.cpp' object='xlsx_sheet_context_test-ooxml_namespace_types.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-ooxml_namespace_types.obj `if test -f 'ooxml_namespace_types.cpp'; then $(CYGPATH_W) 'ooxml_namespace_types.cpp'; else $(CYGPATH_W) '$(srcdir)/ooxml_namespace_types.cpp'; fi`
+
+xlsx_sheet_context_test-ooxml_schemas.o: ooxml_schemas.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-ooxml_schemas.o -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-ooxml_schemas.Tpo -c -o xlsx_sheet_context_test-ooxml_schemas.o `test -f 'ooxml_schemas.cpp' || echo '$(srcdir)/'`ooxml_schemas.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-ooxml_schemas.Tpo $(DEPDIR)/xlsx_sheet_context_test-ooxml_schemas.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ooxml_schemas.cpp' object='xlsx_sheet_context_test-ooxml_schemas.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-ooxml_schemas.o `test -f 'ooxml_schemas.cpp' || echo '$(srcdir)/'`ooxml_schemas.cpp
+
+xlsx_sheet_context_test-ooxml_schemas.obj: ooxml_schemas.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-ooxml_schemas.obj -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-ooxml_schemas.Tpo -c -o xlsx_sheet_context_test-ooxml_schemas.obj `if test -f 'ooxml_schemas.cpp'; then $(CYGPATH_W) 'ooxml_schemas.cpp'; else $(CYGPATH_W) '$(srcdir)/ooxml_schemas.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-ooxml_schemas.Tpo $(DEPDIR)/xlsx_sheet_context_test-ooxml_schemas.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ooxml_schemas.cpp' object='xlsx_sheet_context_test-ooxml_schemas.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-ooxml_schemas.obj `if test -f 'ooxml_schemas.cpp'; then $(CYGPATH_W) 'ooxml_schemas.cpp'; else $(CYGPATH_W) '$(srcdir)/ooxml_schemas.cpp'; fi`
+
+xlsx_sheet_context_test-ooxml_tokens.o: ooxml_tokens.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-ooxml_tokens.o -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-ooxml_tokens.Tpo -c -o xlsx_sheet_context_test-ooxml_tokens.o `test -f 'ooxml_tokens.cpp' || echo '$(srcdir)/'`ooxml_tokens.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-ooxml_tokens.Tpo $(DEPDIR)/xlsx_sheet_context_test-ooxml_tokens.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ooxml_tokens.cpp' object='xlsx_sheet_context_test-ooxml_tokens.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-ooxml_tokens.o `test -f 'ooxml_tokens.cpp' || echo '$(srcdir)/'`ooxml_tokens.cpp
+
+xlsx_sheet_context_test-ooxml_tokens.obj: ooxml_tokens.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-ooxml_tokens.obj -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-ooxml_tokens.Tpo -c -o xlsx_sheet_context_test-ooxml_tokens.obj `if test -f 'ooxml_tokens.cpp'; then $(CYGPATH_W) 'ooxml_tokens.cpp'; else $(CYGPATH_W) '$(srcdir)/ooxml_tokens.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-ooxml_tokens.Tpo $(DEPDIR)/xlsx_sheet_context_test-ooxml_tokens.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ooxml_tokens.cpp' object='xlsx_sheet_context_test-ooxml_tokens.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-ooxml_tokens.obj `if test -f 'ooxml_tokens.cpp'; then $(CYGPATH_W) 'ooxml_tokens.cpp'; else $(CYGPATH_W) '$(srcdir)/ooxml_tokens.cpp'; fi`
+
+xlsx_sheet_context_test-ooxml_types.o: ooxml_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-ooxml_types.o -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-ooxml_types.Tpo -c -o xlsx_sheet_context_test-ooxml_types.o `test -f 'ooxml_types.cpp' || echo '$(srcdir)/'`ooxml_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-ooxml_types.Tpo $(DEPDIR)/xlsx_sheet_context_test-ooxml_types.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ooxml_types.cpp' object='xlsx_sheet_context_test-ooxml_types.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-ooxml_types.o `test -f 'ooxml_types.cpp' || echo '$(srcdir)/'`ooxml_types.cpp
+
+xlsx_sheet_context_test-ooxml_types.obj: ooxml_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-ooxml_types.obj -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-ooxml_types.Tpo -c -o xlsx_sheet_context_test-ooxml_types.obj `if test -f 'ooxml_types.cpp'; then $(CYGPATH_W) 'ooxml_types.cpp'; else $(CYGPATH_W) '$(srcdir)/ooxml_types.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-ooxml_types.Tpo $(DEPDIR)/xlsx_sheet_context_test-ooxml_types.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ooxml_types.cpp' object='xlsx_sheet_context_test-ooxml_types.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-ooxml_types.obj `if test -f 'ooxml_types.cpp'; then $(CYGPATH_W) 'ooxml_types.cpp'; else $(CYGPATH_W) '$(srcdir)/ooxml_types.cpp'; fi`
+
+xlsx_sheet_context_test-session_context.o: session_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-session_context.o -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-session_context.Tpo -c -o xlsx_sheet_context_test-session_context.o `test -f 'session_context.cpp' || echo '$(srcdir)/'`session_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-session_context.Tpo $(DEPDIR)/xlsx_sheet_context_test-session_context.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='session_context.cpp' object='xlsx_sheet_context_test-session_context.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-session_context.o `test -f 'session_context.cpp' || echo '$(srcdir)/'`session_context.cpp
+
+xlsx_sheet_context_test-session_context.obj: session_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-session_context.obj -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-session_context.Tpo -c -o xlsx_sheet_context_test-session_context.obj `if test -f 'session_context.cpp'; then $(CYGPATH_W) 'session_context.cpp'; else $(CYGPATH_W) '$(srcdir)/session_context.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-session_context.Tpo $(DEPDIR)/xlsx_sheet_context_test-session_context.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='session_context.cpp' object='xlsx_sheet_context_test-session_context.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-session_context.obj `if test -f 'session_context.cpp'; then $(CYGPATH_W) 'session_context.cpp'; else $(CYGPATH_W) '$(srcdir)/session_context.cpp'; fi`
+
+xlsx_sheet_context_test-spreadsheet_interface.o: spreadsheet_interface.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-spreadsheet_interface.o -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-spreadsheet_interface.Tpo -c -o xlsx_sheet_context_test-spreadsheet_interface.o `test -f 'spreadsheet_interface.cpp' || echo '$(srcdir)/'`spreadsheet_interface.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-spreadsheet_interface.Tpo $(DEPDIR)/xlsx_sheet_context_test-spreadsheet_interface.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='spreadsheet_interface.cpp' object='xlsx_sheet_context_test-spreadsheet_interface.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-spreadsheet_interface.o `test -f 'spreadsheet_interface.cpp' || echo '$(srcdir)/'`spreadsheet_interface.cpp
+
+xlsx_sheet_context_test-spreadsheet_interface.obj: spreadsheet_interface.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-spreadsheet_interface.obj -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-spreadsheet_interface.Tpo -c -o xlsx_sheet_context_test-spreadsheet_interface.obj `if test -f 'spreadsheet_interface.cpp'; then $(CYGPATH_W) 'spreadsheet_interface.cpp'; else $(CYGPATH_W) '$(srcdir)/spreadsheet_interface.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-spreadsheet_interface.Tpo $(DEPDIR)/xlsx_sheet_context_test-spreadsheet_interface.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='spreadsheet_interface.cpp' object='xlsx_sheet_context_test-spreadsheet_interface.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-spreadsheet_interface.obj `if test -f 'spreadsheet_interface.cpp'; then $(CYGPATH_W) 'spreadsheet_interface.cpp'; else $(CYGPATH_W) '$(srcdir)/spreadsheet_interface.cpp'; fi`
+
+xlsx_sheet_context_test-xlsx_autofilter_context.o: xlsx_autofilter_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-xlsx_autofilter_context.o -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-xlsx_autofilter_context.Tpo -c -o xlsx_sheet_context_test-xlsx_autofilter_context.o `test -f 'xlsx_autofilter_context.cpp' || echo '$(srcdir)/'`xlsx_autofilter_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-xlsx_autofilter_context.Tpo $(DEPDIR)/xlsx_sheet_context_test-xlsx_autofilter_context.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xlsx_autofilter_context.cpp' object='xlsx_sheet_context_test-xlsx_autofilter_context.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-xlsx_autofilter_context.o `test -f 'xlsx_autofilter_context.cpp' || echo '$(srcdir)/'`xlsx_autofilter_context.cpp
+
+xlsx_sheet_context_test-xlsx_autofilter_context.obj: xlsx_autofilter_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-xlsx_autofilter_context.obj -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-xlsx_autofilter_context.Tpo -c -o xlsx_sheet_context_test-xlsx_autofilter_context.obj `if test -f 'xlsx_autofilter_context.cpp'; then $(CYGPATH_W) 'xlsx_autofilter_context.cpp'; else $(CYGPATH_W) '$(srcdir)/xlsx_autofilter_context.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-xlsx_autofilter_context.Tpo $(DEPDIR)/xlsx_sheet_context_test-xlsx_autofilter_context.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xlsx_autofilter_context.cpp' object='xlsx_sheet_context_test-xlsx_autofilter_context.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-xlsx_autofilter_context.obj `if test -f 'xlsx_autofilter_context.cpp'; then $(CYGPATH_W) 'xlsx_autofilter_context.cpp'; else $(CYGPATH_W) '$(srcdir)/xlsx_autofilter_context.cpp'; fi`
+
+xlsx_sheet_context_test-xlsx_conditional_format_context.o: xlsx_conditional_format_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-xlsx_conditional_format_context.o -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-xlsx_conditional_format_context.Tpo -c -o xlsx_sheet_context_test-xlsx_conditional_format_context.o `test -f 'xlsx_conditional_format_context.cpp' || echo '$(srcdir)/'`xlsx_conditional_format_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-xlsx_conditional_format_context.Tpo $(DEPDIR)/xlsx_sheet_context_test-xlsx_conditional_format_context.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xlsx_conditional_format_context.cpp' object='xlsx_sheet_context_test-xlsx_conditional_format_context.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-xlsx_conditional_format_context.o `test -f 'xlsx_conditional_format_context.cpp' || echo '$(srcdir)/'`xlsx_conditional_format_context.cpp
+
+xlsx_sheet_context_test-xlsx_conditional_format_context.obj: xlsx_conditional_format_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-xlsx_conditional_format_context.obj -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-xlsx_conditional_format_context.Tpo -c -o xlsx_sheet_context_test-xlsx_conditional_format_context.obj `if test -f 'xlsx_conditional_format_context.cpp'; then $(CYGPATH_W) 'xlsx_conditional_format_context.cpp'; else $(CYGPATH_W) '$(srcdir)/xlsx_conditional_format_context.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-xlsx_conditional_format_context.Tpo $(DEPDIR)/xlsx_sheet_context_test-xlsx_conditional_format_context.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xlsx_conditional_format_context.cpp' object='xlsx_sheet_context_test-xlsx_conditional_format_context.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-xlsx_conditional_format_context.obj `if test -f 'xlsx_conditional_format_context.cpp'; then $(CYGPATH_W) 'xlsx_conditional_format_context.cpp'; else $(CYGPATH_W) '$(srcdir)/xlsx_conditional_format_context.cpp'; fi`
+
+xlsx_sheet_context_test-xlsx_helper.o: xlsx_helper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-xlsx_helper.o -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-xlsx_helper.Tpo -c -o xlsx_sheet_context_test-xlsx_helper.o `test -f 'xlsx_helper.cpp' || echo '$(srcdir)/'`xlsx_helper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-xlsx_helper.Tpo $(DEPDIR)/xlsx_sheet_context_test-xlsx_helper.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xlsx_helper.cpp' object='xlsx_sheet_context_test-xlsx_helper.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-xlsx_helper.o `test -f 'xlsx_helper.cpp' || echo '$(srcdir)/'`xlsx_helper.cpp
+
+xlsx_sheet_context_test-xlsx_helper.obj: xlsx_helper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-xlsx_helper.obj -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-xlsx_helper.Tpo -c -o xlsx_sheet_context_test-xlsx_helper.obj `if test -f 'xlsx_helper.cpp'; then $(CYGPATH_W) 'xlsx_helper.cpp'; else $(CYGPATH_W) '$(srcdir)/xlsx_helper.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-xlsx_helper.Tpo $(DEPDIR)/xlsx_sheet_context_test-xlsx_helper.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xlsx_helper.cpp' object='xlsx_sheet_context_test-xlsx_helper.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-xlsx_helper.obj `if test -f 'xlsx_helper.cpp'; then $(CYGPATH_W) 'xlsx_helper.cpp'; else $(CYGPATH_W) '$(srcdir)/xlsx_helper.cpp'; fi`
+
+xlsx_sheet_context_test-xlsx_session_data.o: xlsx_session_data.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-xlsx_session_data.o -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-xlsx_session_data.Tpo -c -o xlsx_sheet_context_test-xlsx_session_data.o `test -f 'xlsx_session_data.cpp' || echo '$(srcdir)/'`xlsx_session_data.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-xlsx_session_data.Tpo $(DEPDIR)/xlsx_sheet_context_test-xlsx_session_data.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xlsx_session_data.cpp' object='xlsx_sheet_context_test-xlsx_session_data.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-xlsx_session_data.o `test -f 'xlsx_session_data.cpp' || echo '$(srcdir)/'`xlsx_session_data.cpp
+
+xlsx_sheet_context_test-xlsx_session_data.obj: xlsx_session_data.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-xlsx_session_data.obj -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-xlsx_session_data.Tpo -c -o xlsx_sheet_context_test-xlsx_session_data.obj `if test -f 'xlsx_session_data.cpp'; then $(CYGPATH_W) 'xlsx_session_data.cpp'; else $(CYGPATH_W) '$(srcdir)/xlsx_session_data.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-xlsx_session_data.Tpo $(DEPDIR)/xlsx_sheet_context_test-xlsx_session_data.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xlsx_session_data.cpp' object='xlsx_sheet_context_test-xlsx_session_data.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-xlsx_session_data.obj `if test -f 'xlsx_session_data.cpp'; then $(CYGPATH_W) 'xlsx_session_data.cpp'; else $(CYGPATH_W) '$(srcdir)/xlsx_session_data.cpp'; fi`
+
+xlsx_sheet_context_test-xlsx_sheet_context.o: xlsx_sheet_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-xlsx_sheet_context.o -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-xlsx_sheet_context.Tpo -c -o xlsx_sheet_context_test-xlsx_sheet_context.o `test -f 'xlsx_sheet_context.cpp' || echo '$(srcdir)/'`xlsx_sheet_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-xlsx_sheet_context.Tpo $(DEPDIR)/xlsx_sheet_context_test-xlsx_sheet_context.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xlsx_sheet_context.cpp' object='xlsx_sheet_context_test-xlsx_sheet_context.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-xlsx_sheet_context.o `test -f 'xlsx_sheet_context.cpp' || echo '$(srcdir)/'`xlsx_sheet_context.cpp
+
+xlsx_sheet_context_test-xlsx_sheet_context.obj: xlsx_sheet_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-xlsx_sheet_context.obj -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-xlsx_sheet_context.Tpo -c -o xlsx_sheet_context_test-xlsx_sheet_context.obj `if test -f 'xlsx_sheet_context.cpp'; then $(CYGPATH_W) 'xlsx_sheet_context.cpp'; else $(CYGPATH_W) '$(srcdir)/xlsx_sheet_context.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-xlsx_sheet_context.Tpo $(DEPDIR)/xlsx_sheet_context_test-xlsx_sheet_context.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xlsx_sheet_context.cpp' object='xlsx_sheet_context_test-xlsx_sheet_context.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-xlsx_sheet_context.obj `if test -f 'xlsx_sheet_context.cpp'; then $(CYGPATH_W) 'xlsx_sheet_context.cpp'; else $(CYGPATH_W) '$(srcdir)/xlsx_sheet_context.cpp'; fi`
+
+xlsx_sheet_context_test-xlsx_sheet_context_test.o: xlsx_sheet_context_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-xlsx_sheet_context_test.o -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-xlsx_sheet_context_test.Tpo -c -o xlsx_sheet_context_test-xlsx_sheet_context_test.o `test -f 'xlsx_sheet_context_test.cpp' || echo '$(srcdir)/'`xlsx_sheet_context_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-xlsx_sheet_context_test.Tpo $(DEPDIR)/xlsx_sheet_context_test-xlsx_sheet_context_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xlsx_sheet_context_test.cpp' object='xlsx_sheet_context_test-xlsx_sheet_context_test.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-xlsx_sheet_context_test.o `test -f 'xlsx_sheet_context_test.cpp' || echo '$(srcdir)/'`xlsx_sheet_context_test.cpp
+
+xlsx_sheet_context_test-xlsx_sheet_context_test.obj: xlsx_sheet_context_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-xlsx_sheet_context_test.obj -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-xlsx_sheet_context_test.Tpo -c -o xlsx_sheet_context_test-xlsx_sheet_context_test.obj `if test -f 'xlsx_sheet_context_test.cpp'; then $(CYGPATH_W) 'xlsx_sheet_context_test.cpp'; else $(CYGPATH_W) '$(srcdir)/xlsx_sheet_context_test.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-xlsx_sheet_context_test.Tpo $(DEPDIR)/xlsx_sheet_context_test-xlsx_sheet_context_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xlsx_sheet_context_test.cpp' object='xlsx_sheet_context_test-xlsx_sheet_context_test.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-xlsx_sheet_context_test.obj `if test -f 'xlsx_sheet_context_test.cpp'; then $(CYGPATH_W) 'xlsx_sheet_context_test.cpp'; else $(CYGPATH_W) '$(srcdir)/xlsx_sheet_context_test.cpp'; fi`
+
+xlsx_sheet_context_test-xlsx_types.o: xlsx_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-xlsx_types.o -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-xlsx_types.Tpo -c -o xlsx_sheet_context_test-xlsx_types.o `test -f 'xlsx_types.cpp' || echo '$(srcdir)/'`xlsx_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-xlsx_types.Tpo $(DEPDIR)/xlsx_sheet_context_test-xlsx_types.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xlsx_types.cpp' object='xlsx_sheet_context_test-xlsx_types.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-xlsx_types.o `test -f 'xlsx_types.cpp' || echo '$(srcdir)/'`xlsx_types.cpp
+
+xlsx_sheet_context_test-xlsx_types.obj: xlsx_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-xlsx_types.obj -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-xlsx_types.Tpo -c -o xlsx_sheet_context_test-xlsx_types.obj `if test -f 'xlsx_types.cpp'; then $(CYGPATH_W) 'xlsx_types.cpp'; else $(CYGPATH_W) '$(srcdir)/xlsx_types.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-xlsx_types.Tpo $(DEPDIR)/xlsx_sheet_context_test-xlsx_types.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xlsx_types.cpp' object='xlsx_sheet_context_test-xlsx_types.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-xlsx_types.obj `if test -f 'xlsx_types.cpp'; then $(CYGPATH_W) 'xlsx_types.cpp'; else $(CYGPATH_W) '$(srcdir)/xlsx_types.cpp'; fi`
+
+xlsx_sheet_context_test-xml_context_base.o: xml_context_base.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-xml_context_base.o -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-xml_context_base.Tpo -c -o xlsx_sheet_context_test-xml_context_base.o `test -f 'xml_context_base.cpp' || echo '$(srcdir)/'`xml_context_base.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-xml_context_base.Tpo $(DEPDIR)/xlsx_sheet_context_test-xml_context_base.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_context_base.cpp' object='xlsx_sheet_context_test-xml_context_base.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-xml_context_base.o `test -f 'xml_context_base.cpp' || echo '$(srcdir)/'`xml_context_base.cpp
+
+xlsx_sheet_context_test-xml_context_base.obj: xml_context_base.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-xml_context_base.obj -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-xml_context_base.Tpo -c -o xlsx_sheet_context_test-xml_context_base.obj `if test -f 'xml_context_base.cpp'; then $(CYGPATH_W) 'xml_context_base.cpp'; else $(CYGPATH_W) '$(srcdir)/xml_context_base.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-xml_context_base.Tpo $(DEPDIR)/xlsx_sheet_context_test-xml_context_base.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_context_base.cpp' object='xlsx_sheet_context_test-xml_context_base.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-xml_context_base.obj `if test -f 'xml_context_base.cpp'; then $(CYGPATH_W) 'xml_context_base.cpp'; else $(CYGPATH_W) '$(srcdir)/xml_context_base.cpp'; fi`
+
+xlsx_sheet_context_test-xml_context_global.o: xml_context_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-xml_context_global.o -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-xml_context_global.Tpo -c -o xlsx_sheet_context_test-xml_context_global.o `test -f 'xml_context_global.cpp' || echo '$(srcdir)/'`xml_context_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-xml_context_global.Tpo $(DEPDIR)/xlsx_sheet_context_test-xml_context_global.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_context_global.cpp' object='xlsx_sheet_context_test-xml_context_global.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-xml_context_global.o `test -f 'xml_context_global.cpp' || echo '$(srcdir)/'`xml_context_global.cpp
+
+xlsx_sheet_context_test-xml_context_global.obj: xml_context_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-xml_context_global.obj -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-xml_context_global.Tpo -c -o xlsx_sheet_context_test-xml_context_global.obj `if test -f 'xml_context_global.cpp'; then $(CYGPATH_W) 'xml_context_global.cpp'; else $(CYGPATH_W) '$(srcdir)/xml_context_global.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-xml_context_global.Tpo $(DEPDIR)/xlsx_sheet_context_test-xml_context_global.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_context_global.cpp' object='xlsx_sheet_context_test-xml_context_global.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-xml_context_global.obj `if test -f 'xml_context_global.cpp'; then $(CYGPATH_W) 'xml_context_global.cpp'; else $(CYGPATH_W) '$(srcdir)/xml_context_global.cpp'; fi`
+
+xlsx_sheet_context_test-xml_element_types.o: xml_element_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-xml_element_types.o -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-xml_element_types.Tpo -c -o xlsx_sheet_context_test-xml_element_types.o `test -f 'xml_element_types.cpp' || echo '$(srcdir)/'`xml_element_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-xml_element_types.Tpo $(DEPDIR)/xlsx_sheet_context_test-xml_element_types.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_element_types.cpp' object='xlsx_sheet_context_test-xml_element_types.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-xml_element_types.o `test -f 'xml_element_types.cpp' || echo '$(srcdir)/'`xml_element_types.cpp
+
+xlsx_sheet_context_test-xml_element_types.obj: xml_element_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-xml_element_types.obj -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-xml_element_types.Tpo -c -o xlsx_sheet_context_test-xml_element_types.obj `if test -f 'xml_element_types.cpp'; then $(CYGPATH_W) 'xml_element_types.cpp'; else $(CYGPATH_W) '$(srcdir)/xml_element_types.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-xml_element_types.Tpo $(DEPDIR)/xlsx_sheet_context_test-xml_element_types.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_element_types.cpp' object='xlsx_sheet_context_test-xml_element_types.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-xml_element_types.obj `if test -f 'xml_element_types.cpp'; then $(CYGPATH_W) 'xml_element_types.cpp'; else $(CYGPATH_W) '$(srcdir)/xml_element_types.cpp'; fi`
+
+xlsx_sheet_context_test-xml_element_validator.o: xml_element_validator.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-xml_element_validator.o -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-xml_element_validator.Tpo -c -o xlsx_sheet_context_test-xml_element_validator.o `test -f 'xml_element_validator.cpp' || echo '$(srcdir)/'`xml_element_validator.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-xml_element_validator.Tpo $(DEPDIR)/xlsx_sheet_context_test-xml_element_validator.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_element_validator.cpp' object='xlsx_sheet_context_test-xml_element_validator.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-xml_element_validator.o `test -f 'xml_element_validator.cpp' || echo '$(srcdir)/'`xml_element_validator.cpp
+
+xlsx_sheet_context_test-xml_element_validator.obj: xml_element_validator.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-xml_element_validator.obj -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-xml_element_validator.Tpo -c -o xlsx_sheet_context_test-xml_element_validator.obj `if test -f 'xml_element_validator.cpp'; then $(CYGPATH_W) 'xml_element_validator.cpp'; else $(CYGPATH_W) '$(srcdir)/xml_element_validator.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-xml_element_validator.Tpo $(DEPDIR)/xlsx_sheet_context_test-xml_element_validator.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_element_validator.cpp' object='xlsx_sheet_context_test-xml_element_validator.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-xml_element_validator.obj `if test -f 'xml_element_validator.cpp'; then $(CYGPATH_W) 'xml_element_validator.cpp'; else $(CYGPATH_W) '$(srcdir)/xml_element_validator.cpp'; fi`
+
+xlsx_sheet_context_test-xml_empty_context.o: xml_empty_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-xml_empty_context.o -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-xml_empty_context.Tpo -c -o xlsx_sheet_context_test-xml_empty_context.o `test -f 'xml_empty_context.cpp' || echo '$(srcdir)/'`xml_empty_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-xml_empty_context.Tpo $(DEPDIR)/xlsx_sheet_context_test-xml_empty_context.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_empty_context.cpp' object='xlsx_sheet_context_test-xml_empty_context.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-xml_empty_context.o `test -f 'xml_empty_context.cpp' || echo '$(srcdir)/'`xml_empty_context.cpp
+
+xlsx_sheet_context_test-xml_empty_context.obj: xml_empty_context.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-xml_empty_context.obj -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-xml_empty_context.Tpo -c -o xlsx_sheet_context_test-xml_empty_context.obj `if test -f 'xml_empty_context.cpp'; then $(CYGPATH_W) 'xml_empty_context.cpp'; else $(CYGPATH_W) '$(srcdir)/xml_empty_context.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-xml_empty_context.Tpo $(DEPDIR)/xlsx_sheet_context_test-xml_empty_context.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_empty_context.cpp' object='xlsx_sheet_context_test-xml_empty_context.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-xml_empty_context.obj `if test -f 'xml_empty_context.cpp'; then $(CYGPATH_W) 'xml_empty_context.cpp'; else $(CYGPATH_W) '$(srcdir)/xml_empty_context.cpp'; fi`
+
+xlsx_sheet_context_test-xml_util.o: xml_util.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-xml_util.o -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-xml_util.Tpo -c -o xlsx_sheet_context_test-xml_util.o `test -f 'xml_util.cpp' || echo '$(srcdir)/'`xml_util.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-xml_util.Tpo $(DEPDIR)/xlsx_sheet_context_test-xml_util.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_util.cpp' object='xlsx_sheet_context_test-xml_util.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-xml_util.o `test -f 'xml_util.cpp' || echo '$(srcdir)/'`xml_util.cpp
+
+xlsx_sheet_context_test-xml_util.obj: xml_util.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xlsx_sheet_context_test-xml_util.obj -MD -MP -MF $(DEPDIR)/xlsx_sheet_context_test-xml_util.Tpo -c -o xlsx_sheet_context_test-xml_util.obj `if test -f 'xml_util.cpp'; then $(CYGPATH_W) 'xml_util.cpp'; else $(CYGPATH_W) '$(srcdir)/xml_util.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xlsx_sheet_context_test-xml_util.Tpo $(DEPDIR)/xlsx_sheet_context_test-xml_util.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_util.cpp' object='xlsx_sheet_context_test-xml_util.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xlsx_sheet_context_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xlsx_sheet_context_test-xml_util.obj `if test -f 'xml_util.cpp'; then $(CYGPATH_W) 'xml_util.cpp'; else $(CYGPATH_W) '$(srcdir)/xml_util.cpp'; fi`
+
+xml_structure_tree_test-string_helper.o: string_helper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xml_structure_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xml_structure_tree_test-string_helper.o -MD -MP -MF $(DEPDIR)/xml_structure_tree_test-string_helper.Tpo -c -o xml_structure_tree_test-string_helper.o `test -f 'string_helper.cpp' || echo '$(srcdir)/'`string_helper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xml_structure_tree_test-string_helper.Tpo $(DEPDIR)/xml_structure_tree_test-string_helper.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='string_helper.cpp' object='xml_structure_tree_test-string_helper.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xml_structure_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xml_structure_tree_test-string_helper.o `test -f 'string_helper.cpp' || echo '$(srcdir)/'`string_helper.cpp
+
+xml_structure_tree_test-string_helper.obj: string_helper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xml_structure_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xml_structure_tree_test-string_helper.obj -MD -MP -MF $(DEPDIR)/xml_structure_tree_test-string_helper.Tpo -c -o xml_structure_tree_test-string_helper.obj `if test -f 'string_helper.cpp'; then $(CYGPATH_W) 'string_helper.cpp'; else $(CYGPATH_W) '$(srcdir)/string_helper.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xml_structure_tree_test-string_helper.Tpo $(DEPDIR)/xml_structure_tree_test-string_helper.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='string_helper.cpp' object='xml_structure_tree_test-string_helper.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xml_structure_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xml_structure_tree_test-string_helper.obj `if test -f 'string_helper.cpp'; then $(CYGPATH_W) 'string_helper.cpp'; else $(CYGPATH_W) '$(srcdir)/string_helper.cpp'; fi`
+
+xml_structure_tree_test-xml_structure_tree.o: xml_structure_tree.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xml_structure_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xml_structure_tree_test-xml_structure_tree.o -MD -MP -MF $(DEPDIR)/xml_structure_tree_test-xml_structure_tree.Tpo -c -o xml_structure_tree_test-xml_structure_tree.o `test -f 'xml_structure_tree.cpp' || echo '$(srcdir)/'`xml_structure_tree.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xml_structure_tree_test-xml_structure_tree.Tpo $(DEPDIR)/xml_structure_tree_test-xml_structure_tree.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_structure_tree.cpp' object='xml_structure_tree_test-xml_structure_tree.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xml_structure_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xml_structure_tree_test-xml_structure_tree.o `test -f 'xml_structure_tree.cpp' || echo '$(srcdir)/'`xml_structure_tree.cpp
+
+xml_structure_tree_test-xml_structure_tree.obj: xml_structure_tree.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xml_structure_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xml_structure_tree_test-xml_structure_tree.obj -MD -MP -MF $(DEPDIR)/xml_structure_tree_test-xml_structure_tree.Tpo -c -o xml_structure_tree_test-xml_structure_tree.obj `if test -f 'xml_structure_tree.cpp'; then $(CYGPATH_W) 'xml_structure_tree.cpp'; else $(CYGPATH_W) '$(srcdir)/xml_structure_tree.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xml_structure_tree_test-xml_structure_tree.Tpo $(DEPDIR)/xml_structure_tree_test-xml_structure_tree.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_structure_tree.cpp' object='xml_structure_tree_test-xml_structure_tree.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xml_structure_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xml_structure_tree_test-xml_structure_tree.obj `if test -f 'xml_structure_tree.cpp'; then $(CYGPATH_W) 'xml_structure_tree.cpp'; else $(CYGPATH_W) '$(srcdir)/xml_structure_tree.cpp'; fi`
+
+xml_structure_tree_test-xml_structure_mapper.o: xml_structure_mapper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xml_structure_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xml_structure_tree_test-xml_structure_mapper.o -MD -MP -MF $(DEPDIR)/xml_structure_tree_test-xml_structure_mapper.Tpo -c -o xml_structure_tree_test-xml_structure_mapper.o `test -f 'xml_structure_mapper.cpp' || echo '$(srcdir)/'`xml_structure_mapper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xml_structure_tree_test-xml_structure_mapper.Tpo $(DEPDIR)/xml_structure_tree_test-xml_structure_mapper.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_structure_mapper.cpp' object='xml_structure_tree_test-xml_structure_mapper.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xml_structure_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xml_structure_tree_test-xml_structure_mapper.o `test -f 'xml_structure_mapper.cpp' || echo '$(srcdir)/'`xml_structure_mapper.cpp
+
+xml_structure_tree_test-xml_structure_mapper.obj: xml_structure_mapper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xml_structure_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xml_structure_tree_test-xml_structure_mapper.obj -MD -MP -MF $(DEPDIR)/xml_structure_tree_test-xml_structure_mapper.Tpo -c -o xml_structure_tree_test-xml_structure_mapper.obj `if test -f 'xml_structure_mapper.cpp'; then $(CYGPATH_W) 'xml_structure_mapper.cpp'; else $(CYGPATH_W) '$(srcdir)/xml_structure_mapper.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xml_structure_tree_test-xml_structure_mapper.Tpo $(DEPDIR)/xml_structure_tree_test-xml_structure_mapper.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_structure_mapper.cpp' object='xml_structure_tree_test-xml_structure_mapper.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xml_structure_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xml_structure_tree_test-xml_structure_mapper.obj `if test -f 'xml_structure_mapper.cpp'; then $(CYGPATH_W) 'xml_structure_mapper.cpp'; else $(CYGPATH_W) '$(srcdir)/xml_structure_mapper.cpp'; fi`
+
+xml_structure_tree_test-xml_structure_tree_test.o: xml_structure_tree_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xml_structure_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xml_structure_tree_test-xml_structure_tree_test.o -MD -MP -MF $(DEPDIR)/xml_structure_tree_test-xml_structure_tree_test.Tpo -c -o xml_structure_tree_test-xml_structure_tree_test.o `test -f 'xml_structure_tree_test.cpp' || echo '$(srcdir)/'`xml_structure_tree_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xml_structure_tree_test-xml_structure_tree_test.Tpo $(DEPDIR)/xml_structure_tree_test-xml_structure_tree_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_structure_tree_test.cpp' object='xml_structure_tree_test-xml_structure_tree_test.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xml_structure_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xml_structure_tree_test-xml_structure_tree_test.o `test -f 'xml_structure_tree_test.cpp' || echo '$(srcdir)/'`xml_structure_tree_test.cpp
+
+xml_structure_tree_test-xml_structure_tree_test.obj: xml_structure_tree_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xml_structure_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xml_structure_tree_test-xml_structure_tree_test.obj -MD -MP -MF $(DEPDIR)/xml_structure_tree_test-xml_structure_tree_test.Tpo -c -o xml_structure_tree_test-xml_structure_tree_test.obj `if test -f 'xml_structure_tree_test.cpp'; then $(CYGPATH_W) 'xml_structure_tree_test.cpp'; else $(CYGPATH_W) '$(srcdir)/xml_structure_tree_test.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xml_structure_tree_test-xml_structure_tree_test.Tpo $(DEPDIR)/xml_structure_tree_test-xml_structure_tree_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_structure_tree_test.cpp' object='xml_structure_tree_test-xml_structure_tree_test.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xml_structure_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xml_structure_tree_test-xml_structure_tree_test.obj `if test -f 'xml_structure_tree_test.cpp'; then $(CYGPATH_W) 'xml_structure_tree_test.cpp'; else $(CYGPATH_W) '$(srcdir)/xml_structure_tree_test.cpp'; fi`
+
+yaml_document_tree_test-yaml_document_tree.o: yaml_document_tree.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(yaml_document_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT yaml_document_tree_test-yaml_document_tree.o -MD -MP -MF $(DEPDIR)/yaml_document_tree_test-yaml_document_tree.Tpo -c -o yaml_document_tree_test-yaml_document_tree.o `test -f 'yaml_document_tree.cpp' || echo '$(srcdir)/'`yaml_document_tree.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/yaml_document_tree_test-yaml_document_tree.Tpo $(DEPDIR)/yaml_document_tree_test-yaml_document_tree.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='yaml_document_tree.cpp' object='yaml_document_tree_test-yaml_document_tree.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(yaml_document_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o yaml_document_tree_test-yaml_document_tree.o `test -f 'yaml_document_tree.cpp' || echo '$(srcdir)/'`yaml_document_tree.cpp
+
+yaml_document_tree_test-yaml_document_tree.obj: yaml_document_tree.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(yaml_document_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT yaml_document_tree_test-yaml_document_tree.obj -MD -MP -MF $(DEPDIR)/yaml_document_tree_test-yaml_document_tree.Tpo -c -o yaml_document_tree_test-yaml_document_tree.obj `if test -f 'yaml_document_tree.cpp'; then $(CYGPATH_W) 'yaml_document_tree.cpp'; else $(CYGPATH_W) '$(srcdir)/yaml_document_tree.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/yaml_document_tree_test-yaml_document_tree.Tpo $(DEPDIR)/yaml_document_tree_test-yaml_document_tree.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='yaml_document_tree.cpp' object='yaml_document_tree_test-yaml_document_tree.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(yaml_document_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o yaml_document_tree_test-yaml_document_tree.obj `if test -f 'yaml_document_tree.cpp'; then $(CYGPATH_W) 'yaml_document_tree.cpp'; else $(CYGPATH_W) '$(srcdir)/yaml_document_tree.cpp'; fi`
+
+yaml_document_tree_test-json_util.o: json_util.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(yaml_document_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT yaml_document_tree_test-json_util.o -MD -MP -MF $(DEPDIR)/yaml_document_tree_test-json_util.Tpo -c -o yaml_document_tree_test-json_util.o `test -f 'json_util.cpp' || echo '$(srcdir)/'`json_util.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/yaml_document_tree_test-json_util.Tpo $(DEPDIR)/yaml_document_tree_test-json_util.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='json_util.cpp' object='yaml_document_tree_test-json_util.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(yaml_document_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o yaml_document_tree_test-json_util.o `test -f 'json_util.cpp' || echo '$(srcdir)/'`json_util.cpp
+
+yaml_document_tree_test-json_util.obj: json_util.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(yaml_document_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT yaml_document_tree_test-json_util.obj -MD -MP -MF $(DEPDIR)/yaml_document_tree_test-json_util.Tpo -c -o yaml_document_tree_test-json_util.obj `if test -f 'json_util.cpp'; then $(CYGPATH_W) 'json_util.cpp'; else $(CYGPATH_W) '$(srcdir)/json_util.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/yaml_document_tree_test-json_util.Tpo $(DEPDIR)/yaml_document_tree_test-json_util.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='json_util.cpp' object='yaml_document_tree_test-json_util.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(yaml_document_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o yaml_document_tree_test-json_util.obj `if test -f 'json_util.cpp'; then $(CYGPATH_W) 'json_util.cpp'; else $(CYGPATH_W) '$(srcdir)/json_util.cpp'; fi`
+
+yaml_document_tree_test-yaml_document_tree_test.o: yaml_document_tree_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(yaml_document_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT yaml_document_tree_test-yaml_document_tree_test.o -MD -MP -MF $(DEPDIR)/yaml_document_tree_test-yaml_document_tree_test.Tpo -c -o yaml_document_tree_test-yaml_document_tree_test.o `test -f 'yaml_document_tree_test.cpp' || echo '$(srcdir)/'`yaml_document_tree_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/yaml_document_tree_test-yaml_document_tree_test.Tpo $(DEPDIR)/yaml_document_tree_test-yaml_document_tree_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='yaml_document_tree_test.cpp' object='yaml_document_tree_test-yaml_document_tree_test.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(yaml_document_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o yaml_document_tree_test-yaml_document_tree_test.o `test -f 'yaml_document_tree_test.cpp' || echo '$(srcdir)/'`yaml_document_tree_test.cpp
+
+yaml_document_tree_test-yaml_document_tree_test.obj: yaml_document_tree_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(yaml_document_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT yaml_document_tree_test-yaml_document_tree_test.obj -MD -MP -MF $(DEPDIR)/yaml_document_tree_test-yaml_document_tree_test.Tpo -c -o yaml_document_tree_test-yaml_document_tree_test.obj `if test -f 'yaml_document_tree_test.cpp'; then $(CYGPATH_W) 'yaml_document_tree_test.cpp'; else $(CYGPATH_W) '$(srcdir)/yaml_document_tree_test.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/yaml_document_tree_test-yaml_document_tree_test.Tpo $(DEPDIR)/yaml_document_tree_test-yaml_document_tree_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='yaml_document_tree_test.cpp' object='yaml_document_tree_test-yaml_document_tree_test.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(yaml_document_tree_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o yaml_document_tree_test-yaml_document_tree_test.obj `if test -f 'yaml_document_tree_test.cpp'; then $(CYGPATH_W) 'yaml_document_tree_test.cpp'; else $(CYGPATH_W) '$(srcdir)/yaml_document_tree_test.cpp'; fi`
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+check-valgrind-local:
+check-valgrind-memcheck-local:
+check-valgrind-helgrind-local:
+check-valgrind-drd-local:
+check-valgrind-sgcheck-local:
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ 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-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ 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"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+ fi; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ elif test -n "$$redo_logs"; then \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
+ else \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+ fi; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
+ else \
+ color_start= color_end=; \
+ fi; \
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS:
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+xlsx-sheet-context-test.log: xlsx-sheet-context-test$(EXEEXT)
+ @p='xlsx-sheet-context-test$(EXEEXT)'; \
+ b='xlsx-sheet-context-test'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+odf-helper-test.log: odf-helper-test$(EXEEXT)
+ @p='odf-helper-test$(EXEEXT)'; \
+ b='odf-helper-test'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+gnumeric-cell-context-test.log: gnumeric-cell-context-test$(EXEEXT)
+ @p='gnumeric-cell-context-test$(EXEEXT)'; \
+ b='gnumeric-cell-context-test'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+gnumeric-sheet-context-test.log: gnumeric-sheet-context-test$(EXEEXT)
+ @p='gnumeric-sheet-context-test$(EXEEXT)'; \
+ b='gnumeric-sheet-context-test'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+css-document-tree-test.log: css-document-tree-test$(EXEEXT)
+ @p='css-document-tree-test$(EXEEXT)'; \
+ b='css-document-tree-test'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+json-document-tree-test.log: json-document-tree-test$(EXEEXT)
+ @p='json-document-tree-test$(EXEEXT)'; \
+ b='json-document-tree-test'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+yaml-document-tree-test.log: yaml-document-tree-test$(EXEEXT)
+ @p='yaml-document-tree-test$(EXEEXT)'; \
+ b='yaml-document-tree-test'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+xml-map-tree-test.log: xml-map-tree-test$(EXEEXT)
+ @p='xml-map-tree-test$(EXEEXT)'; \
+ b='xml-map-tree-test'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+common-test.log: common-test$(EXEEXT)
+ @p='common-test$(EXEEXT)'; \
+ b='common-test'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+dom-tree-test.log: dom-tree-test$(EXEEXT)
+ @p='dom-tree-test$(EXEEXT)'; \
+ b='dom-tree-test'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+json-structure-tree-test.log: json-structure-tree-test$(EXEEXT)
+ @p='json-structure-tree-test$(EXEEXT)'; \
+ b='json-structure-tree-test'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+json-map-tree-test.log: json-map-tree-test$(EXEEXT)
+ @p='json-map-tree-test$(EXEEXT)'; \
+ b='json-map-tree-test'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+xml-structure-tree-test.log: xml-structure-tree-test$(EXEEXT)
+ @p='xml-structure-tree-test$(EXEEXT)'; \
+ b='xml-structure-tree-test'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+xpath-parser-test.log: xpath-parser-test$(EXEEXT)
+ @p='xpath-parser-test$(EXEEXT)'; \
+ b='xpath-parser-test'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.test$(EXEEXT).log:
+@am__EXEEXT_TRUE@ @p='$<'; \
+@am__EXEEXT_TRUE@ $(am__set_b); \
+@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @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
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES)
+install-EXTRAPROGRAMS: install-libLTLIBRARIES
+
+installdirs:
+ for dir in "$(DESTDIR)$(libdir)"; 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:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -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)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+check-valgrind: check-valgrind-am
+
+check-valgrind-am: check-valgrind-local
+
+check-valgrind-drd: check-valgrind-drd-am
+
+check-valgrind-drd-am: check-valgrind-drd-local
+
+check-valgrind-helgrind: check-valgrind-helgrind-am
+
+check-valgrind-helgrind-am: check-valgrind-helgrind-local
+
+check-valgrind-memcheck: check-valgrind-memcheck-am
+
+check-valgrind-memcheck-am: check-valgrind-memcheck-local
+
+check-valgrind-sgcheck: check-valgrind-sgcheck-am
+
+check-valgrind-sgcheck-am: check-valgrind-sgcheck-local
+
+clean: clean-am
+
+clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -f ./$(DEPDIR)/common_test.Po
+ -rm -f ./$(DEPDIR)/css_document_tree.Po
+ -rm -f ./$(DEPDIR)/css_document_tree_test.Po
+ -rm -f ./$(DEPDIR)/dom_tree_test.Po
+ -rm -f ./$(DEPDIR)/gnumeric_cell_context.Po
+ -rm -f ./$(DEPDIR)/gnumeric_cell_context_test.Po
+ -rm -f ./$(DEPDIR)/gnumeric_namespace_types.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_cell_context.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_filter_context.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_names_context.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_namespace_types.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_sheet_context.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_sheet_context_test.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_styles_context.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_tokens.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_types.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_value_format_parser.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-number_utils.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-odf_namespace_types.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-session_context.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-spreadsheet_interface.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-string_helper.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-xml_context_base.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-xml_element_types.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-xml_element_validator.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-xml_empty_context.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-xml_util.Po
+ -rm -f ./$(DEPDIR)/gnumeric_tokens.Po
+ -rm -f ./$(DEPDIR)/gnumeric_types.Po
+ -rm -f ./$(DEPDIR)/gnumeric_value_format_parser.Po
+ -rm -f ./$(DEPDIR)/json_document_tree_test-json_document_tree.Po
+ -rm -f ./$(DEPDIR)/json_document_tree_test-json_document_tree_test.Po
+ -rm -f ./$(DEPDIR)/json_document_tree_test-json_util.Po
+ -rm -f ./$(DEPDIR)/json_map_tree.Po
+ -rm -f ./$(DEPDIR)/json_map_tree_test.Po
+ -rm -f ./$(DEPDIR)/json_structure_tree_test.Po
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-config.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-css_document_tree.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-css_selector.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-detection_result.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-dom_tree.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-format_detection.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-formula_result.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_cell_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_detection_handler.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_filter_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_handler.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_names_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_namespace_types.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_sheet_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_styles_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_tokens.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_types.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_value_format_parser.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-info.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-interface.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-json_document_tree.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-json_map_tree.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-json_structure_mapper.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-json_structure_tree.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-json_util.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-measurement.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-number_utils.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_document_styles_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_helper.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_namespace_types.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_number_format_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_para_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_style_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_styles.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_styles_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_tokens.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ods_content_xml_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ods_dde_links_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ods_session_data.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_content_types.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_global.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_namespace_types.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_schemas.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_tokens.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_types.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-opc_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-opc_reader.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_csv.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_gnumeric.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_import_ods.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_import_xlsx.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_json.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_ods.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_parquet.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_xls_xml.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_xlsx.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_xml.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_xml_impl.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_xml_map_def.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-session_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-spreadsheet_iface_util.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-spreadsheet_impl_types.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-spreadsheet_interface.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-spreadsheet_types.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-string_helper.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xls_xml_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xls_xml_detection_handler.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xls_xml_handler.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xls_xml_namespace_types.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xls_xml_tokens.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_autofilter_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_conditional_format_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_drawing_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_handler.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_helper.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_pivot_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_revision_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_session_data.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_shared_strings_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_sheet_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_styles_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_table_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_types.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_workbook_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_context_base.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_context_global.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_element_types.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_element_validator.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_empty_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_map_tree.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_simple_stream_handler.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_stream_handler.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_stream_parser.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_structure_mapper.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_structure_tree.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_util.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xpath_parser.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-yaml_document_tree.Plo
+ -rm -f ./$(DEPDIR)/number_utils.Po
+ -rm -f ./$(DEPDIR)/odf_helper_test-odf_helper.Po
+ -rm -f ./$(DEPDIR)/odf_helper_test-odf_helper_test.Po
+ -rm -f ./$(DEPDIR)/odf_helper_test-string_helper.Po
+ -rm -f ./$(DEPDIR)/odf_namespace_types.Po
+ -rm -f ./$(DEPDIR)/session_context.Po
+ -rm -f ./$(DEPDIR)/spreadsheet_impl_types.Po
+ -rm -f ./$(DEPDIR)/spreadsheet_interface.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-formula_result.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-ooxml_global.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-ooxml_namespace_types.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-ooxml_schemas.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-ooxml_tokens.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-ooxml_types.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-session_context.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-spreadsheet_interface.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-xlsx_autofilter_context.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-xlsx_conditional_format_context.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-xlsx_helper.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-xlsx_session_data.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-xlsx_sheet_context.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-xlsx_sheet_context_test.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-xlsx_types.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-xml_context_base.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-xml_context_global.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-xml_element_types.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-xml_element_validator.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-xml_empty_context.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-xml_util.Po
+ -rm -f ./$(DEPDIR)/xml_context_base.Po
+ -rm -f ./$(DEPDIR)/xml_element_types.Po
+ -rm -f ./$(DEPDIR)/xml_element_validator.Po
+ -rm -f ./$(DEPDIR)/xml_empty_context.Po
+ -rm -f ./$(DEPDIR)/xml_map_tree.Po
+ -rm -f ./$(DEPDIR)/xml_map_tree_test.Po
+ -rm -f ./$(DEPDIR)/xml_structure_tree_test-string_helper.Po
+ -rm -f ./$(DEPDIR)/xml_structure_tree_test-xml_structure_mapper.Po
+ -rm -f ./$(DEPDIR)/xml_structure_tree_test-xml_structure_tree.Po
+ -rm -f ./$(DEPDIR)/xml_structure_tree_test-xml_structure_tree_test.Po
+ -rm -f ./$(DEPDIR)/xml_util.Po
+ -rm -f ./$(DEPDIR)/xpath_parser.Po
+ -rm -f ./$(DEPDIR)/xpath_parser_test.Po
+ -rm -f ./$(DEPDIR)/yaml_document_tree_test-json_util.Po
+ -rm -f ./$(DEPDIR)/yaml_document_tree_test-yaml_document_tree.Po
+ -rm -f ./$(DEPDIR)/yaml_document_tree_test-yaml_document_tree_test.Po
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-local distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-libLTLIBRARIES
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+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 ./$(DEPDIR)/common_test.Po
+ -rm -f ./$(DEPDIR)/css_document_tree.Po
+ -rm -f ./$(DEPDIR)/css_document_tree_test.Po
+ -rm -f ./$(DEPDIR)/dom_tree_test.Po
+ -rm -f ./$(DEPDIR)/gnumeric_cell_context.Po
+ -rm -f ./$(DEPDIR)/gnumeric_cell_context_test.Po
+ -rm -f ./$(DEPDIR)/gnumeric_namespace_types.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_cell_context.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_filter_context.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_names_context.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_namespace_types.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_sheet_context.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_sheet_context_test.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_styles_context.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_tokens.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_types.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-gnumeric_value_format_parser.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-number_utils.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-odf_namespace_types.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-session_context.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-spreadsheet_interface.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-string_helper.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-xml_context_base.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-xml_element_types.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-xml_element_validator.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-xml_empty_context.Po
+ -rm -f ./$(DEPDIR)/gnumeric_sheet_context_test-xml_util.Po
+ -rm -f ./$(DEPDIR)/gnumeric_tokens.Po
+ -rm -f ./$(DEPDIR)/gnumeric_types.Po
+ -rm -f ./$(DEPDIR)/gnumeric_value_format_parser.Po
+ -rm -f ./$(DEPDIR)/json_document_tree_test-json_document_tree.Po
+ -rm -f ./$(DEPDIR)/json_document_tree_test-json_document_tree_test.Po
+ -rm -f ./$(DEPDIR)/json_document_tree_test-json_util.Po
+ -rm -f ./$(DEPDIR)/json_map_tree.Po
+ -rm -f ./$(DEPDIR)/json_map_tree_test.Po
+ -rm -f ./$(DEPDIR)/json_structure_tree_test.Po
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-config.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-css_document_tree.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-css_selector.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-detection_result.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-dom_tree.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-format_detection.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-formula_result.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_cell_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_detection_handler.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_filter_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_handler.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_names_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_namespace_types.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_sheet_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_styles_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_tokens.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_types.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-gnumeric_value_format_parser.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-info.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-interface.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-json_document_tree.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-json_map_tree.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-json_structure_mapper.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-json_structure_tree.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-json_util.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-measurement.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-number_utils.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_document_styles_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_helper.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_namespace_types.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_number_format_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_para_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_style_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_styles.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_styles_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-odf_tokens.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ods_content_xml_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ods_dde_links_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ods_session_data.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_content_types.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_global.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_namespace_types.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_schemas.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_tokens.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-ooxml_types.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-opc_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-opc_reader.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_csv.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_gnumeric.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_import_ods.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_import_xlsx.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_json.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_ods.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_parquet.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_xls_xml.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_xlsx.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_xml.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_xml_impl.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-orcus_xml_map_def.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-session_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-spreadsheet_iface_util.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-spreadsheet_impl_types.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-spreadsheet_interface.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-spreadsheet_types.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-string_helper.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xls_xml_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xls_xml_detection_handler.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xls_xml_handler.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xls_xml_namespace_types.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xls_xml_tokens.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_autofilter_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_conditional_format_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_drawing_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_handler.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_helper.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_pivot_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_revision_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_session_data.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_shared_strings_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_sheet_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_styles_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_table_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_types.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xlsx_workbook_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_context_base.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_context_global.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_element_types.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_element_validator.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_empty_context.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_map_tree.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_simple_stream_handler.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_stream_handler.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_stream_parser.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_structure_mapper.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_structure_tree.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xml_util.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-xpath_parser.Plo
+ -rm -f ./$(DEPDIR)/liborcus_@ORCUS_API_VERSION@_la-yaml_document_tree.Plo
+ -rm -f ./$(DEPDIR)/number_utils.Po
+ -rm -f ./$(DEPDIR)/odf_helper_test-odf_helper.Po
+ -rm -f ./$(DEPDIR)/odf_helper_test-odf_helper_test.Po
+ -rm -f ./$(DEPDIR)/odf_helper_test-string_helper.Po
+ -rm -f ./$(DEPDIR)/odf_namespace_types.Po
+ -rm -f ./$(DEPDIR)/session_context.Po
+ -rm -f ./$(DEPDIR)/spreadsheet_impl_types.Po
+ -rm -f ./$(DEPDIR)/spreadsheet_interface.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-formula_result.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-ooxml_global.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-ooxml_namespace_types.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-ooxml_schemas.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-ooxml_tokens.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-ooxml_types.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-session_context.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-spreadsheet_interface.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-xlsx_autofilter_context.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-xlsx_conditional_format_context.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-xlsx_helper.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-xlsx_session_data.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-xlsx_sheet_context.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-xlsx_sheet_context_test.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-xlsx_types.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-xml_context_base.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-xml_context_global.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-xml_element_types.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-xml_element_validator.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-xml_empty_context.Po
+ -rm -f ./$(DEPDIR)/xlsx_sheet_context_test-xml_util.Po
+ -rm -f ./$(DEPDIR)/xml_context_base.Po
+ -rm -f ./$(DEPDIR)/xml_element_types.Po
+ -rm -f ./$(DEPDIR)/xml_element_validator.Po
+ -rm -f ./$(DEPDIR)/xml_empty_context.Po
+ -rm -f ./$(DEPDIR)/xml_map_tree.Po
+ -rm -f ./$(DEPDIR)/xml_map_tree_test.Po
+ -rm -f ./$(DEPDIR)/xml_structure_tree_test-string_helper.Po
+ -rm -f ./$(DEPDIR)/xml_structure_tree_test-xml_structure_mapper.Po
+ -rm -f ./$(DEPDIR)/xml_structure_tree_test-xml_structure_tree.Po
+ -rm -f ./$(DEPDIR)/xml_structure_tree_test-xml_structure_tree_test.Po
+ -rm -f ./$(DEPDIR)/xml_util.Po
+ -rm -f ./$(DEPDIR)/xpath_parser.Po
+ -rm -f ./$(DEPDIR)/xpath_parser_test.Po
+ -rm -f ./$(DEPDIR)/yaml_document_tree_test-json_util.Po
+ -rm -f ./$(DEPDIR)/yaml_document_tree_test-yaml_document_tree.Po
+ -rm -f ./$(DEPDIR)/yaml_document_tree_test-yaml_document_tree_test.Po
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-libLTLIBRARIES
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-TESTS \
+ check-am check-valgrind-am check-valgrind-drd-am \
+ check-valgrind-drd-local check-valgrind-helgrind-am \
+ check-valgrind-helgrind-local check-valgrind-local \
+ check-valgrind-memcheck-am check-valgrind-memcheck-local \
+ check-valgrind-sgcheck-am check-valgrind-sgcheck-local clean \
+ clean-generic clean-libLTLIBRARIES clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-local distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ 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-man install-pdf install-pdf-am 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 tags tags-am \
+ uninstall uninstall-am uninstall-libLTLIBRARIES
+
+.PRECIOUS: Makefile
+
+
+distclean-local:
+ rm -rf $(TESTS)
+
+@VALGRIND_CHECK_RULES@
+
+# 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/src/liborcus/common_test.cpp b/src/liborcus/common_test.cpp
new file mode 100644
index 0000000..8e4f4c7
--- /dev/null
+++ b/src/liborcus/common_test.cpp
@@ -0,0 +1,245 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/measurement.hpp>
+#include <orcus/spreadsheet/types.hpp>
+
+#include <cstdlib>
+#include <cassert>
+#include <iostream>
+#include <sstream>
+#include <cmath>
+
+using namespace std;
+using namespace orcus;
+
+void test_date_time_conversion()
+{
+ struct {
+ const char* str;
+ int year;
+ int month;
+ int day;
+ int hour;
+ int minute;
+ double second;
+ } tests[] = {
+ { "2011-02-12", 2011, 2, 12, 0, 0, 0.0 },
+ { "1934-12-23T21:34:56.69", 1934, 12, 23, 21, 34, 56.69 },
+ };
+
+ for (size_t i = 0, n = sizeof(tests)/sizeof(tests[0]); i < n; ++i)
+ {
+ std::string_view str(tests[i].str);
+ date_time_t ret = date_time_t::from_chars(str);
+ cout << "original: " << str << endl;
+ cout << "converted: year=" << ret.year << ", month=" << ret.month << ", day="
+ << ret.day << ", hour=" << ret.hour << ", minute=" << ret.minute << ", second=" << ret.second << endl;
+ assert(ret.year == tests[i].year);
+ assert(ret.month == tests[i].month);
+ assert(ret.day == tests[i].day);
+ assert(ret.hour == tests[i].hour);
+ assert(ret.minute == tests[i].minute);
+ assert(ret.second == tests[i].second);
+ }
+}
+
+string to_string(length_unit_t unit)
+{
+ switch (unit)
+ {
+ case length_unit_t::centimeter:
+ return "centimeter";
+ case length_unit_t::inch:
+ return "inch";
+ case length_unit_t::point:
+ return "point";
+ case length_unit_t::twip:
+ return "twip";
+ case length_unit_t::unknown:
+ default:
+ ;
+ }
+ return "unknown";
+}
+
+void test_measurement_conversion()
+{
+ struct {
+ const char* str;
+ double expected;
+ size_t decimals;
+ length_unit_t unit;
+ } tests[] = {
+ { "12.34", 12.34, 2, length_unit_t::unknown },
+ { "35", 35, 0, length_unit_t::unknown },
+ { "0.69825", 0.69825, 5, length_unit_t::unknown },
+ { ".1592", 0.1592, 4, length_unit_t::unknown },
+ { "5", 5.0, 0, length_unit_t::unknown },
+ { "-3", -3.0, 0, length_unit_t::unknown },
+ { "-3.456", -3.456, 3, length_unit_t::unknown },
+ { "-.987", -0.987, 3, length_unit_t::unknown },
+ { "-100.987.", -100.987, 3, length_unit_t::unknown }, // Second decimal point should stop the parsing.
+
+ { "12.345in", 12.345, 3, length_unit_t::inch },
+ { "120.30001cm", 120.30001, 5, length_unit_t::centimeter },
+ { "3.12mm", 3.12, 2, length_unit_t::millimeter },
+ { "32.681pt", 32.681, 2, length_unit_t::point },
+ { "0.1234px", 0.1234, 4, length_unit_t::pixel },
+ };
+
+ for (size_t i = 0, n = sizeof(tests)/sizeof(tests[0]); i < n; ++i)
+ {
+ length_t ret = to_length(tests[i].str);
+ cout << "original: '" << tests[i].str << "', converted: " << ret.value
+ << " (" << to_string(ret.unit) << "), expected: "
+ << tests[i].expected << " (" << to_string(tests[i].unit) << ")" << endl;
+
+ // Check for double-precision equality without the rounding error.
+ double factor = 1.0;
+ for (size_t j = 0; j < tests[i].decimals; ++j)
+ factor *= 10.0;
+
+ double converted = round(ret.value * factor);
+ double expected = round(tests[i].expected * factor);
+ assert(converted == expected);
+
+ assert(ret.unit == tests[i].unit);
+ }
+}
+
+void test_measurement_conversion_2()
+{
+ struct check
+ {
+ length_unit_t from;
+ length_unit_t to;
+ double original;
+ double expected;
+ };
+
+ std::vector<check> checks =
+ {
+ { length_unit_t::millimeter, length_unit_t::twip, 254.0, 14400.0 },
+ };
+
+ for (const check& c : checks)
+ {
+ // without volatile, sometimes the following assert evaluates to false on 32-bit debian platforms.
+ volatile double observed = convert(c.original, c.from, c.to);
+ assert(observed == c.expected);
+ }
+}
+
+void test_string2number_conversion()
+{
+ struct {
+ const char* str;
+ double expected;
+ size_t decimals;
+ size_t end_pos;
+ } tests[] = {
+ { "1.2", 1.2, 1, 3 },
+ { "1.2a", 1.2, 1, 3 },
+ { "1.2.", 1.2, 1, 3 },
+ { "1.3456", 1.3456, 4, 6 },
+ { "-10.345", -10.345, 3, 7 },
+ { "-10.345-", -10.345, 3, 7 },
+ { "1.2E-2", 1.2E-2, 3, 6 },
+ { "1.26E+3", 1.26E+3, 1, 7 },
+ };
+
+ for (size_t i = 0, n = sizeof(tests)/sizeof(tests[0]); i < n; ++i)
+ {
+ const char* p = tests[i].str;
+ const char* p_parse_ended = nullptr;
+ double converted = to_double(p, &p_parse_ended);
+ cout << "original: '" << tests[i].str << "', converted: " << converted
+ << ", expected: " << tests[i].expected << endl;
+
+ // Check for double-precision equality without the rounding error.
+ double factor = 1.0;
+ for (size_t j = 0; j < tests[i].decimals; ++j)
+ factor *= 10.0;
+
+ converted = round(converted * factor);
+ double expected = round(tests[i].expected * factor);
+ assert(converted == expected);
+
+ // Check the end parse position.
+ const char* pos_expected = p + tests[i].end_pos;
+ assert(pos_expected == p_parse_ended);
+ }
+}
+
+void test_string2long_conversion()
+{
+ struct {
+ const char* str;
+ long expected;
+ size_t end_pos;
+ } tests[] = {
+ { "1", 1, 1 },
+ { "12", 12, 2 },
+ { "13.4", 13, 2 },
+ { "-23", -23, 3 },
+ { "678abc", 678, 3 },
+ };
+
+ for (size_t i = 0, n = sizeof(tests)/sizeof(tests[0]); i < n; ++i)
+ {
+ const char* p = tests[i].str;
+ const char* p_parse_ended = nullptr;
+ long converted = to_long(p, &p_parse_ended);
+ cout << "original: '" << tests[i].str << "', converted: " << converted
+ << ", expected: " << tests[i].expected << endl;
+
+ assert(converted == tests[i].expected);
+
+ // Check the end parse position.
+ const char* pos_expected = p + tests[i].end_pos;
+ assert(pos_expected == p_parse_ended);
+ }
+}
+
+void test_spreadsheet_types()
+{
+ std::vector<spreadsheet::error_value_t> values =
+ {
+ spreadsheet::error_value_t::div0,
+ spreadsheet::error_value_t::na,
+ spreadsheet::error_value_t::name,
+ spreadsheet::error_value_t::null,
+ spreadsheet::error_value_t::num,
+ spreadsheet::error_value_t::ref,
+ spreadsheet::error_value_t::value
+ };
+
+ for (spreadsheet::error_value_t ev : values)
+ {
+ // Round-trip each enum value.
+ std::ostringstream os;
+ os << ev;
+ std::string s = os.str();
+ auto converted = spreadsheet::to_error_value_enum(s);
+ assert(converted == ev);
+ }
+}
+
+int main()
+{
+ test_date_time_conversion();
+ test_measurement_conversion();
+ test_measurement_conversion_2();
+ test_string2number_conversion();
+ test_string2long_conversion();
+ test_spreadsheet_types();
+
+ return EXIT_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/config.cpp b/src/liborcus/config.cpp
new file mode 100644
index 0000000..9195e02
--- /dev/null
+++ b/src/liborcus/config.cpp
@@ -0,0 +1,54 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/config.hpp"
+
+namespace orcus {
+
+config::config(format_t input) :
+ input_format(input),
+ debug(false),
+ structure_check(true)
+{
+ // Initialize format-specific config settings below.
+
+ switch (input_format)
+ {
+ case format_t::csv:
+ {
+ csv_config csv;
+ csv.header_row_size = 0;
+ csv.split_to_multiple_sheets = false;
+ data = csv;
+ break;
+ }
+ case format_t::gnumeric:
+ case format_t::ods:
+ case format_t::xls_xml:
+ case format_t::xlsx:
+ case format_t::unknown:
+ default:
+ ;
+ }
+}
+
+json_config::json_config() :
+ output_format(dump_format_t::none),
+ preserve_object_order(true),
+ resolve_references(false),
+ persistent_string_values(true) {}
+
+json_config::~json_config() {}
+
+yaml_config::yaml_config() :
+ output_format(output_format_type::none) {}
+
+yaml_config::~yaml_config() {}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/constants.inl.in b/src/liborcus/constants.inl.in
new file mode 100644
index 0000000..da93f77
--- /dev/null
+++ b/src/liborcus/constants.inl.in
@@ -0,0 +1,4 @@
+
+#define ORCUS_MAJOR_VERSION @ORCUS_MAJOR_VERSION@
+#define ORCUS_MINOR_VERSION @ORCUS_MINOR_VERSION@
+#define ORCUS_MICRO_VERSION @ORCUS_MICRO_VERSION@
diff --git a/src/liborcus/css_document_tree.cpp b/src/liborcus/css_document_tree.cpp
new file mode 100644
index 0000000..6960084
--- /dev/null
+++ b/src/liborcus/css_document_tree.cpp
@@ -0,0 +1,647 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/css_document_tree.hpp>
+#include <orcus/css_parser.hpp>
+#include <orcus/string_pool.hpp>
+
+#define ORCUS_DEBUG_CSS_DOCTREE 0
+
+#include <iostream>
+#include <unordered_map>
+#include <map>
+#include <algorithm>
+#include <iterator>
+#include <string_view>
+
+namespace orcus {
+
+namespace {
+
+struct selector_type
+{
+ css_selector_t selector;
+ css::pseudo_element_t pseudo_element;
+};
+
+class parser_handler
+{
+ css_document_tree& m_doc;
+ std::vector<selector_type> m_cur_selector_group;
+ css_properties_t m_cur_properties;
+ std::string_view m_cur_prop_name;
+ std::vector<css_property_value_t> m_cur_prop_values;
+ css_selector_t m_cur_selector; /// current selector
+ css_simple_selector_t m_cur_simple_selector;
+ css::pseudo_element_t m_cur_pseudo_element;
+ css::combinator_t m_cur_combinator;
+ bool m_in_prop:1;
+public:
+ parser_handler(css_document_tree& doc) :
+ m_doc(doc),
+ m_cur_pseudo_element(0),
+ m_cur_combinator(css::combinator_t::descendant),
+ m_in_prop(false) {}
+
+ void at_rule_name(std::string_view name)
+ {
+#if ORCUS_DEBUG_CSS_DOCTREE
+ cout << "@" << name;
+#else
+ (void)name;
+#endif
+ }
+
+ void simple_selector_type(std::string_view type)
+ {
+ m_cur_simple_selector.name = type;
+ }
+
+ void simple_selector_class(std::string_view cls)
+ {
+ m_cur_simple_selector.classes.insert(cls);
+ }
+
+ void simple_selector_pseudo_element(css::pseudo_element_t pe)
+ {
+ // Only the one applied to the last simple selector is valid.
+ m_cur_pseudo_element |= pe;
+ }
+
+ void simple_selector_pseudo_class(css::pseudo_class_t pc)
+ {
+ m_cur_simple_selector.pseudo_classes |= pc;
+ }
+
+ void simple_selector_id(std::string_view id)
+ {
+ m_cur_simple_selector.id = id;
+ }
+
+ void end_simple_selector()
+ {
+ if (m_cur_selector.first.empty())
+ m_cur_selector.first = m_cur_simple_selector;
+ else
+ {
+ css_chained_simple_selector_t css;
+ css.combinator = m_cur_combinator;
+ css.simple_selector = m_cur_simple_selector;
+ m_cur_selector.chained.push_back(css);
+ }
+
+ m_cur_simple_selector.clear();
+ }
+
+ void end_selector()
+ {
+#if ORCUS_DEBUG_CSS_DOCTREE
+ cout << m_cur_selector << "|";
+#endif
+ selector_type sel;
+ sel.selector = m_cur_selector;
+ sel.pseudo_element = m_cur_pseudo_element;
+ m_cur_selector_group.push_back(sel);
+ m_cur_selector.clear();
+ m_cur_pseudo_element = 0;
+ }
+
+ void combinator(css::combinator_t combinator)
+ {
+ m_cur_combinator = combinator;
+ }
+
+ void property_name(std::string_view name)
+ {
+ m_cur_prop_name = name;
+#if ORCUS_DEBUG_CSS_DOCTREE
+ cout << name << ":";
+#endif
+ }
+
+ void value(std::string_view s)
+ {
+ m_cur_prop_values.push_back(s);
+#if ORCUS_DEBUG_CSS_DOCTREE
+ cout << " '" << s << "'";
+#endif
+ }
+
+ void rgb(uint8_t red, uint8_t green, uint8_t blue)
+ {
+#if ORCUS_DEBUG_CSS_DOCTREE
+ cout << " rgb(" << (int)red << ',' << (int)green << ',' << (int)blue << ')';
+#endif
+ css_property_value_t val;
+ val.type = css::property_value_t::rgb;
+ val.value = css::rgba_color_t{red, green, blue, 0.0};
+ m_cur_prop_values.push_back(val);
+ }
+
+ void rgba(uint8_t red, uint8_t green, uint8_t blue, double alpha)
+ {
+#if ORCUS_DEBUG_CSS_DOCTREE
+ cout << " rgba(" << (int)red << ',' << (int)green << ',' << (int)blue << ',' << alpha << ')';
+#endif
+ css_property_value_t val;
+ val.type = css::property_value_t::rgba;
+ val.value = css::rgba_color_t{red, green, blue, alpha};
+ m_cur_prop_values.push_back(val);
+ }
+
+ void hsl(uint8_t hue, uint8_t sat, uint8_t light)
+ {
+#if ORCUS_DEBUG_CSS_DOCTREE
+ cout << "hsl(" << (int)hue << ',' << (int)sat << ',' << (int)light << ')';
+#endif
+ css_property_value_t val;
+ val.type = css::property_value_t::hsl;
+ val.value = css::hsla_color_t{hue, sat, light, 0.0};
+ m_cur_prop_values.push_back(val);
+ }
+
+ void hsla(uint8_t hue, uint8_t sat, uint8_t light, double alpha)
+ {
+#if ORCUS_DEBUG_CSS_DOCTREE
+ cout << "hsla(" << (int)hue << ',' << (int)sat << ',' << (int)light << ',' << alpha << ')';
+#endif
+ css_property_value_t val;
+ val.type = css::property_value_t::hsla;
+ val.value = css::hsla_color_t{hue, sat, light, alpha};
+ m_cur_prop_values.push_back(val);
+ }
+
+ void url(std::string_view url)
+ {
+#if ORCUS_DEBUG_CSS_DOCTREE
+ cout << " url(" << url << ")";
+#endif
+ css_property_value_t val;
+ val.type = orcus::css::property_value_t::url;
+ val.value = url;
+ m_cur_prop_values.push_back(val);
+ }
+
+ void begin_parse()
+ {
+#if ORCUS_DEBUG_CSS_DOCTREE
+ cout << "========" << endl;
+#endif
+ }
+
+ void end_parse()
+ {
+#if ORCUS_DEBUG_CSS_DOCTREE
+ cout << "========" << endl;
+#endif
+ }
+
+ void begin_block()
+ {
+#if ORCUS_DEBUG_CSS_DOCTREE
+ cout << endl << "{" << endl;
+#endif
+ m_in_prop = true;
+ }
+
+ void end_block()
+ {
+#if ORCUS_DEBUG_CSS_DOCTREE
+ cout << "}" << endl;
+#endif
+ m_in_prop = false;
+
+ // Push the property set and selector group to the document tree.
+
+ std::vector<selector_type>::iterator it = m_cur_selector_group.begin(), ite = m_cur_selector_group.end();
+ for (; it != ite; ++it)
+ m_doc.insert_properties(it->selector, it->pseudo_element, m_cur_properties);
+
+ m_cur_selector_group.clear();
+ m_cur_properties.clear();
+ }
+
+ void begin_property()
+ {
+#if ORCUS_DEBUG_CSS_DOCTREE
+ if (m_in_prop)
+ cout << " ";
+ cout << "* ";
+#endif
+ }
+
+ void end_property()
+ {
+ m_cur_properties.insert(
+ css_properties_t::value_type(m_cur_prop_name, m_cur_prop_values));
+ m_cur_prop_name = std::string_view{};
+ m_cur_prop_values.clear();
+#if ORCUS_DEBUG_CSS_DOCTREE
+ cout << endl;
+#endif
+ }
+};
+
+struct simple_selector_node;
+
+typedef std::unordered_map<
+ css_simple_selector_t, simple_selector_node, css_simple_selector_t::hash> simple_selectors_type;
+
+typedef std::map<css::combinator_t, simple_selectors_type> combinators_type;
+
+struct simple_selector_node
+{
+ css_pseudo_element_properties_t properties;
+ combinators_type children;
+};
+
+css_simple_selector_t intern(string_pool& sp, const css_simple_selector_t& sel)
+{
+ css_simple_selector_t interned;
+
+ if (!sel.name.empty())
+ interned.name = sp.intern(sel.name).first;
+ if (!sel.id.empty())
+ interned.id = sp.intern(sel.id).first;
+
+ css_simple_selector_t::classes_type::const_iterator it = sel.classes.begin(), ite = sel.classes.end();
+ for (; it != ite; ++it)
+ interned.classes.insert(sp.intern(*it).first);
+
+ interned.pseudo_classes = sel.pseudo_classes;
+
+ return interned;
+}
+
+css_selector_t intern(string_pool& sp, const css_selector_t& sel)
+{
+ css_selector_t interned;
+ interned.first = intern(sp, sel.first);
+
+ css_selector_t::chained_type::const_iterator it = sel.chained.begin(), ite = sel.chained.end();
+ for (; it != ite; ++it)
+ {
+ const css_chained_simple_selector_t& cs = *it;
+ css_chained_simple_selector_t cs_interned;
+ cs_interned.combinator = cs.combinator;
+ cs_interned.simple_selector = intern(sp, cs.simple_selector);
+ interned.chained.push_back(cs_interned);
+ }
+
+ return interned;
+}
+
+class intern_inserter
+{
+ string_pool& m_sp;
+ std::vector<css_property_value_t>& m_dest;
+public:
+ intern_inserter(string_pool& sp, std::vector<css_property_value_t>& dest) :
+ m_sp(sp), m_dest(dest) {}
+
+ void operator() (const css_property_value_t& v) const
+ {
+ switch (v.type)
+ {
+ case css::property_value_t::string:
+ case css::property_value_t::url:
+ {
+ // String value needs interning.
+ css_property_value_t interned = v;
+ auto s = std::get<std::string_view>(v.value);
+ interned.value = m_sp.intern(s).first;
+ m_dest.push_back(interned);
+ break;
+ }
+ default:
+ m_dest.push_back(v);
+ }
+ }
+};
+
+void store_properties(
+ string_pool& sp, css_pseudo_element_properties_t& store,
+ css::pseudo_element_t pseudo_flags, const css_properties_t& props)
+{
+ css_pseudo_element_properties_t::iterator it_store = store.find(pseudo_flags);
+ if (it_store == store.end())
+ {
+ // No storage for this pseudo flag value. Create a new one.
+ std::pair<css_pseudo_element_properties_t::iterator, bool> r =
+ store.insert(
+ css_pseudo_element_properties_t::value_type(
+ pseudo_flags, css_properties_t()));
+ if (!r.second)
+ // insertion failed.
+ return;
+
+ it_store = r.first;
+ }
+
+ css_properties_t& prop_store = it_store->second;
+
+ css_properties_t::const_iterator it = props.begin(), ite = props.end();
+ for (; it != ite; ++it)
+ {
+ std::string_view key = sp.intern(it->first).first;
+ std::vector<css_property_value_t> vals;
+ for_each(it->second.begin(), it->second.end(), intern_inserter(sp, vals));
+ prop_store[key] = vals;
+ }
+}
+
+simple_selector_node* get_or_create_simple_selector_node(
+ simple_selectors_type& store, const css_simple_selector_t& ss)
+{
+ simple_selectors_type::iterator it = store.find(ss);
+ if (it == store.end())
+ {
+ // Insert this root selector.
+ std::pair<simple_selectors_type::iterator, bool> r =
+ store.insert(
+ simple_selectors_type::value_type(
+ ss, simple_selector_node()));
+
+ if (!r.second)
+ // Insertion failed.
+ return nullptr;
+
+ it = r.first;
+ }
+
+ return &it->second;
+}
+
+const simple_selector_node* get_simple_selector_node(
+ const simple_selectors_type& store, const css_simple_selector_t& ss)
+{
+ simple_selectors_type::const_iterator it = store.find(ss);
+ return it == store.end() ? nullptr : &it->second;
+}
+
+simple_selectors_type* get_or_create_simple_selectors_type(
+ combinators_type& store, css::combinator_t combinator)
+{
+ combinators_type::iterator it = store.find(combinator);
+ if (it == store.end())
+ {
+ // Insert new combinator.
+ std::pair<combinators_type::iterator, bool> r =
+ store.insert(
+ combinators_type::value_type(
+ combinator, simple_selectors_type()));
+ if (!r.second)
+ // Insertion failed.
+ return nullptr;
+
+ it = r.first;
+ }
+
+ return &it->second;
+}
+
+const simple_selectors_type* get_simple_selectors_type(
+ const combinators_type& store, css::combinator_t combinator)
+{
+ combinators_type::const_iterator it = store.find(combinator);
+ return it == store.end() ? nullptr : &it->second;
+}
+
+void dump_pseudo_elements(css::pseudo_element_t elem)
+{
+ if (!elem)
+ return;
+
+ if (elem & css::pseudo_element_after)
+ std::cout << "::after";
+ if (elem & css::pseudo_element_before)
+ std::cout << "::before";
+ if (elem & css::pseudo_element_first_letter)
+ std::cout << "::first-letter";
+ if (elem & css::pseudo_element_first_line)
+ std::cout << "::first-line";
+ if (elem & css::pseudo_element_selection)
+ std::cout << "::selection";
+ if (elem & css::pseudo_element_backdrop)
+ std::cout << "::backdrop";
+}
+
+void dump_properties(const css_properties_t& props)
+{
+ std::cout << '{' << std::endl;
+ css_properties_t::const_iterator it = props.begin(), ite = props.end();
+ for (; it != ite; ++it)
+ {
+ std::cout << " * " << it->first << ": ";
+ const std::vector<css_property_value_t>& vals = it->second;
+ std::copy(vals.begin(), vals.end(), std::ostream_iterator<css_property_value_t>(std::cout, " "));
+ std::cout << ';' << std::endl;
+ }
+ std::cout << '}' << std::endl;
+}
+
+void dump_all_properties(const css_selector_t& selector, const css_pseudo_element_properties_t& properties)
+{
+ css_pseudo_element_properties_t::const_iterator it_prop = properties.begin(), ite_prop = properties.end();
+ for (; it_prop != ite_prop; ++it_prop)
+ {
+ const css_properties_t& prop = it_prop->second;
+ if (prop.empty())
+ continue;
+
+ std::cout << selector;
+ dump_pseudo_elements(it_prop->first);
+ std::cout << std::endl;
+ dump_properties(prop);
+ }
+}
+
+void dump_chained_recursive(
+ css_selector_t& selector, css::combinator_t op, const simple_selectors_type& ss)
+{
+ simple_selectors_type::const_iterator it_ss = ss.begin(), ite_ss = ss.end();
+ for (; it_ss != ite_ss; ++it_ss)
+ {
+ css_chained_simple_selector_t chained_ss;
+ chained_ss.combinator = op;
+ chained_ss.simple_selector = it_ss->first;
+ selector.chained.push_back(chained_ss);
+
+ const simple_selector_node& node = it_ss->second;
+ dump_all_properties(selector, node.properties);
+
+ combinators_type::const_iterator it_comb = node.children.begin(), ite_comb = node.children.end();
+ for (; it_comb != ite_comb; ++it_comb)
+ dump_chained_recursive(selector, it_comb->first, it_comb->second);
+
+ selector.chained.pop_back();
+ }
+}
+
+const css_pseudo_element_properties_t* get_properties_map(
+ const simple_selectors_type& root, const css_selector_t& selector)
+{
+ const simple_selector_node* node = get_simple_selector_node(root, selector.first);
+ if (!node)
+ return nullptr;
+
+ if (!selector.chained.empty())
+ {
+ // Follow the chain to find the right node to store new properties.
+ css_selector_t::chained_type::const_iterator it_chain = selector.chained.begin();
+ css_selector_t::chained_type::const_iterator ite_chain = selector.chained.end();
+ const combinators_type* combos = &node->children;
+ for (; it_chain != ite_chain; ++it_chain)
+ {
+ const css_chained_simple_selector_t& css = *it_chain;
+ const simple_selectors_type* ss = get_simple_selectors_type(*combos, css.combinator);
+ if (!ss)
+ return nullptr;
+
+ node = get_simple_selector_node(*ss, css.simple_selector);
+ if (!node)
+ return nullptr;
+
+ combos = &node->children;
+ }
+ }
+
+ assert(node);
+ return &node->properties;
+}
+
+}
+
+css_document_tree::insertion_error::insertion_error(const std::string& msg) :
+ general_error(msg) {}
+
+struct css_document_tree::impl
+{
+ string_pool m_string_pool;
+ simple_selectors_type m_root;
+};
+
+css_document_tree::css_document_tree() : mp_impl(std::make_unique<impl>())
+{
+}
+
+css_document_tree::css_document_tree(css_document_tree&& other) :
+ mp_impl(std::move(other.mp_impl))
+{
+ other.mp_impl = std::make_unique<impl>();
+}
+
+css_document_tree::~css_document_tree() = default;
+
+css_document_tree& css_document_tree::operator=(css_document_tree&& other)
+{
+ css_document_tree tmp(std::move(other));
+ swap(tmp);
+
+ return *this;
+}
+
+void css_document_tree::load(std::string_view stream)
+{
+ if (stream.empty())
+ return;
+
+ parser_handler handler(*this);
+ css_parser<parser_handler> parser(stream, handler);
+ parser.parse();
+}
+
+void css_document_tree::insert_properties(
+ const css_selector_t& selector,
+ css::pseudo_element_t pseudo_elem,
+ const css_properties_t& props)
+{
+ if (props.empty())
+ return;
+
+ css_selector_t selector_interned = intern(mp_impl->m_string_pool, selector);
+
+ // See if the root selector already exists.
+ simple_selector_node* node =
+ get_or_create_simple_selector_node(mp_impl->m_root, selector_interned.first);
+
+ if (!node)
+ throw insertion_error("failed to find or create the root simple selector node.");
+
+ if (!selector_interned.chained.empty())
+ {
+ // Follow the chain to find the right node to store new properties.
+ css_selector_t::chained_type::iterator it_chain = selector_interned.chained.begin();
+ css_selector_t::chained_type::iterator ite_chain = selector_interned.chained.end();
+ combinators_type* combos = &node->children;
+ for (; it_chain != ite_chain; ++it_chain)
+ {
+ css_chained_simple_selector_t& css = *it_chain;
+ simple_selectors_type* ss = get_or_create_simple_selectors_type(*combos, css.combinator);
+ if (!ss)
+ throw insertion_error("failed to find or create the simple selectors type by combinator.");
+
+ node = get_or_create_simple_selector_node(*ss, css.simple_selector);
+ if (!node)
+ throw insertion_error("failed to find or create the simple selector node.");
+
+ combos = &node->children;
+ }
+ }
+
+ // We found the right node to store the properties.
+ assert(node);
+ store_properties(mp_impl->m_string_pool, node->properties, pseudo_elem, props);
+}
+
+const css_properties_t* css_document_tree::get_properties(
+ const css_selector_t& selector, css::pseudo_element_t pseudo_elem) const
+{
+ const css_pseudo_element_properties_t* prop_map = get_properties_map(mp_impl->m_root, selector);
+ if (!prop_map)
+ return nullptr;
+
+ css_pseudo_element_properties_t::const_iterator it = prop_map->find(pseudo_elem);
+ if (it == prop_map->end())
+ return nullptr;
+
+ return &it->second;
+}
+
+const css_pseudo_element_properties_t*
+css_document_tree::get_all_properties(const css_selector_t& selector) const
+{
+ return get_properties_map(mp_impl->m_root, selector);
+}
+
+void css_document_tree::dump() const
+{
+ css_selector_t selector;
+
+ const simple_selectors_type& ss = mp_impl->m_root;
+ simple_selectors_type::const_iterator it_ss = ss.begin(), ite_ss = ss.end();
+ for (; it_ss != ite_ss; ++it_ss)
+ {
+ selector.first = it_ss->first;
+
+ const simple_selector_node& node = it_ss->second;
+ dump_all_properties(selector, node.properties);
+
+ combinators_type::const_iterator it_comb = node.children.begin(), ite_comb = node.children.end();
+ for (; it_comb != ite_comb; ++it_comb)
+ dump_chained_recursive(selector, it_comb->first, it_comb->second);
+ }
+}
+
+void css_document_tree::swap(css_document_tree& other) noexcept
+{
+ mp_impl.swap(other.mp_impl);
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/css_document_tree_test.cpp b/src/liborcus/css_document_tree_test.cpp
new file mode 100644
index 0000000..085ae14
--- /dev/null
+++ b/src/liborcus/css_document_tree_test.cpp
@@ -0,0 +1,690 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/css_document_tree.hpp>
+#include <orcus/css_types.hpp>
+#include <orcus/css_parser_base.hpp>
+#include <orcus/stream.hpp>
+
+#include <cstdlib>
+#include <cassert>
+#include <iostream>
+#include <sstream>
+#include <iterator>
+
+#include "filesystem_env.hpp"
+
+using namespace orcus;
+
+bool check_prop(const css_properties_t& props, std::string_view key, std::string_view val)
+{
+ css_properties_t::const_iterator it = props.find(key);
+ if (it == props.end())
+ {
+ std::cout << "property '" << key << "' not found" << std::endl;
+ return false;
+ }
+
+ // Chain all property values into a single string delimited by a " ".
+ const std::vector<css_property_value_t>& vals = it->second;
+ std::ostringstream os;
+ if (vals.size() > 1)
+ {
+ auto it_end = vals.end();
+ std::advance(it_end, -1);
+ std::copy(vals.begin(), it_end, std::ostream_iterator<css_property_value_t>(os, " "));
+ }
+ os << vals.back();
+
+ std::string val_stored = os.str();
+ if (val != val_stored)
+ {
+ std::cout << "property '" << key << "' is expected to have value '"
+ << val << "' but '" << val_stored << "' is found." << std::endl;
+ return false;
+ }
+
+ return true;
+}
+
+using check_properties_type = std::vector<std::pair<std::string, std::string>>;
+
+bool check_props(const css_properties_t& props, check_properties_type expected)
+{
+ bool pass = true;
+
+ for (const auto& [key, value] : expected)
+ {
+ bool res = check_prop(props, key, value);
+ if (!res)
+ pass = false;
+ }
+
+ return pass;
+}
+
+css_document_tree load_document(const fs::path& path)
+{
+ std::cout << path << std::endl;
+ file_content content(path.string());
+ css_document_tree doc;
+ doc.load(content.str());
+
+ return doc;
+}
+
+void test_css_invalids()
+{
+ // Get all yaml files in this directory.
+ fs::path dirpath(SRCDIR"/test/css/invalids/");
+ fs::directory_iterator it_end;
+
+ size_t file_count = 0;
+
+ for (fs::directory_iterator it(dirpath); it != it_end; ++it)
+ {
+ fs::path path = it->path();
+ if (!fs::is_regular_file(path))
+ continue;
+
+ if (path.extension().string() != ".css")
+ continue;
+
+ std::cout << "parsing invalid file " << path.filename().string() << "..." << std::endl;
+
+ ++file_count;
+
+ file_content content(path.string().data());
+ css_document_tree doc;
+
+ try
+ {
+ doc.load(content.str());
+ assert(!"css::parse_error was not thrown, but expected to be.");
+ }
+ catch (const parse_error&)
+ {
+ // This is expected.
+ }
+ }
+
+ assert(file_count > 0);
+}
+
+void test_css_simple_selector_equality()
+{
+ css_simple_selector_t left;
+ css_simple_selector_t right;
+ assert(left == right);
+
+ left.classes.insert("one");
+ assert(left != right);
+ right.classes.insert("one");
+ assert(left == right);
+
+ left.classes.insert("two");
+ assert(left != right);
+ right.classes.insert("two");
+ assert(left == right);
+
+ left.classes.insert("three");
+ assert(left != right);
+ right.classes.insert("three");
+ assert(left == right);
+}
+
+void test_css_empty()
+{
+ fs::path path = SRCDIR"/test/css/empty.css";
+ std::cout << path << std::endl;
+
+ file_content content(path.string());
+ css_document_tree doc;
+ doc.load(content.str());
+}
+
+void test_css_parse_basic1()
+{
+ css_document_tree doc = load_document(SRCDIR"/test/css/basic1.css");
+
+ css_selector_t selector;
+ selector.first.name = "table";
+
+ const css_properties_t* props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 2);
+ assert(check_prop(*props, "width", "auto"));
+ assert(check_prop(*props, "height", "500px"));
+
+ selector.first.name = "td";
+ props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 2);
+ assert(check_prop(*props, "color", "gray"));
+ assert(check_prop(*props, "background-color", "yellow"));
+
+ // This selector doesn't exist in the document tree.
+ selector.first.name = "tr";
+ props = doc.get_properties(selector, 0);
+ assert(!props);
+}
+
+void test_css_parse_basic2()
+{
+ css_document_tree doc = load_document(SRCDIR"/test/css/basic2.css");
+
+ css_selector_t selector;
+ selector.first.name = "div";
+ selector.first.classes.insert("foo");
+
+ const css_properties_t* props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "border", "solid 1px"));
+
+ selector.clear();
+ selector.first.classes.insert("warning");
+
+ props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 2);
+ assert(check_prop(*props, "background-color", "red"));
+ assert(check_prop(*props, "font-weight", "900"));
+}
+
+void test_css_parse_basic3()
+{
+ css_document_tree doc = load_document(SRCDIR"/test/css/basic3.css");
+
+ css_selector_t selector;
+ selector.first.name = "html";
+
+ const css_properties_t* props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "height", "100%"));
+
+ selector.first.name = "body";
+ props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "height", "100%"));
+
+ {
+ // h1, h2, h3 and h4 all have identical set of properties.
+ const char* names[] = { "h1", "h2", "h3", "h4" };
+ std::size_t n = std::size(names);
+
+ for (size_t i = 0; i < n; ++i)
+ {
+ selector.first.name = names[i];
+ props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 2);
+ assert(check_prop(*props, "font-variant", "small-caps"));
+ assert(check_prop(*props, "padding", "2.5em"));
+ }
+ }
+}
+
+void test_css_parse_basic4()
+{
+ css_document_tree doc = load_document(SRCDIR"/test/css/basic4.css");
+
+ css_selector_t selector;
+ selector.first.name = "h1";
+
+ const css_properties_t* props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "margin", "0.5in"));
+
+ selector.first.name = "h2";
+ props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "line-height", "3cm"));
+
+ selector.first.name = "h3";
+ props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "word-spacing", "4mm"));
+
+ selector.first.name = "h4";
+ props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "font-size", "1pc"));
+
+ selector.first.name = "p";
+ props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "font-size", "12px"));
+}
+
+void test_css_parse_basic5()
+{
+ css_document_tree doc = load_document(SRCDIR"/test/css/basic5.css");
+
+ css_selector_t selector;
+ selector.first.classes.insert("info");
+
+ const css_properties_t* props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "word-spacing", "normal"));
+}
+
+void test_css_parse_basic6()
+{
+ css_document_tree doc = load_document(SRCDIR"/test/css/basic6.css");
+
+ css_selector_t selector;
+ selector.first.name = "h1";
+ selector.first.id = "chapter1";
+
+ const css_properties_t* props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "text-align", "center"));
+
+ selector.first.id = "z98y";
+ props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "letter-spacing", "0.5em"));
+
+ selector.clear();
+ selector.first.id = "id_global";
+ props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "margin", "10px"));
+}
+
+void test_css_parse_basic7()
+{
+ css_document_tree doc = load_document(SRCDIR"/test/css/basic7.css");
+
+ css_selector_t selector;
+ selector.first.classes.insert("one");
+ selector.first.classes.insert("two");
+ selector.first.classes.insert("three");
+
+ const css_properties_t* props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "color", "blue"));
+
+ selector.first.classes.clear();
+ selector.first.classes.insert("one");
+ props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "color", "aqua"));
+
+ selector.first.classes.clear();
+ selector.first.classes.insert("two");
+ props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "color", "azure"));
+
+ selector.first.classes.insert("one"); // one two
+ props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "color", "brown"));
+
+ selector.first.clear();
+ selector.first.name = "span";
+ selector.first.classes.insert("button");
+ props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "border", "solid 1px gray"));
+
+ selector.first.classes.insert("selected"); // button selected
+ props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "border", "solid 4px red"));
+}
+
+void test_css_parse_basic8()
+{
+ css_document_tree doc = load_document(SRCDIR"/test/css/basic8.css");
+
+ css_selector_t selector;
+ selector.first.classes.insert("ribbon");
+ const css_properties_t* props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "background-color", "#5BC8F7"));
+
+ props = doc.get_properties(selector, css::pseudo_element_after);
+ assert(props);
+ assert(props->size() == 4);
+ assert(check_prop(*props, "content", "Look at this orange box."));
+ assert(check_prop(*props, "background-color", "#FFBA10"));
+ assert(check_prop(*props, "border-color", "black"));
+ assert(check_prop(*props, "border-style", "dotted"));
+
+ props = doc.get_properties(selector, css::pseudo_element_before);
+ assert(!props); // it doesn't exist for this pseudo element.
+
+ props = doc.get_properties(
+ selector,
+ css::pseudo_element_after|css::pseudo_element_selection);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "content", "Selected orange box."));
+
+ // Get all properties for all pseudo element flag combos.
+ const css_pseudo_element_properties_t* all_props = doc.get_all_properties(selector);
+ assert(all_props);
+ assert(all_props->size() == 3);
+
+ // Check the properties for no pseudo element flag.
+ css_pseudo_element_properties_t::const_iterator it = all_props->find(0);
+ assert(it != all_props->end());
+ props = &it->second;
+ assert(props->size() == 1);
+ assert(check_prop(*props, "background-color", "#5BC8F7"));
+
+ // ::after pseudo element
+ it = all_props->find(css::pseudo_element_after);
+ assert(it != all_props->end());
+ props = &it->second;
+ assert(props->size() == 4);
+ assert(check_prop(*props, "content", "Look at this orange box."));
+ assert(check_prop(*props, "background-color", "#FFBA10"));
+ assert(check_prop(*props, "border-color", "black"));
+ assert(check_prop(*props, "border-style", "dotted"));
+
+ // ::after::selection pseudo element pair.
+ it = all_props->find(css::pseudo_element_after|css::pseudo_element_selection);
+ assert(it != all_props->end());
+ props = &it->second;
+ assert(check_prop(*props, "content", "Selected orange box."));
+}
+
+void test_css_parse_basic9()
+{
+ css_document_tree doc = load_document(SRCDIR"/test/css/basic9.css");
+
+ css_selector_t selector;
+ selector.first.name = "a";
+ selector.first.pseudo_classes = css::pseudo_class_link;
+
+ const css_properties_t* props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "color", "#FF0000"));
+
+ selector.first.pseudo_classes = css::pseudo_class_visited;
+ props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "color", "#00FF00"));
+
+ selector.first.pseudo_classes = css::pseudo_class_hover;
+ props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "color", "#FF00FF"));
+
+ selector.first.pseudo_classes = css::pseudo_class_active;
+ props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "color", "#0000FF"));
+}
+
+void test_css_parse_basic10()
+{
+ css_document_tree doc = load_document(SRCDIR"/test/css/basic10.css");
+
+ css_selector_t selector;
+ selector.first.classes.insert("foo");
+
+ const css_properties_t* props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 2);
+ assert(check_prop(*props, "background-color", "rgb(12,230,222)"));
+ assert(check_prop(*props, "border", "solid 5px rgba(30,12,0,0.79)"));
+}
+
+void test_css_parse_basic11()
+{
+ css_document_tree doc = load_document(SRCDIR"/test/css/basic11.css");
+
+ css_selector_t selector;
+ selector.first.classes.insert("callout");
+
+ const css_properties_t* props = doc.get_properties(selector, css::pseudo_element_before);
+ assert(props);
+ assert(props->size() == 5);
+ assert(check_prop(*props, "content", ""));
+ assert(check_prop(*props, "width", "0px"));
+ assert(check_prop(*props, "height", "0px"));
+ assert(check_prop(*props, "border", "0.8em solid transparent"));
+ assert(check_prop(*props, "position", "absolute"));
+}
+
+void test_css_parse_basic12()
+{
+ css_document_tree doc = load_document(SRCDIR"/test/css/basic12.css");
+
+ css_selector_t selector;
+ selector.first.name = "div";
+
+ const css_properties_t* props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "background-image", "url(https://mdn.mozillademos.org/files/6457/mdn_logo_only_color.png)"));
+
+ selector.first.name = "p";
+ props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "background-image", "none"));
+
+ selector.first.name = "div";
+ selector.first.classes.insert("img1");
+
+ props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "background-image", "url(http://www.rabiakhan.com/Gallery/background.jpg)"));
+
+ selector.first.classes.clear();
+ selector.first.classes.insert("img2");
+
+ props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "background-image", "url(http://www.tgraphic.com/userimages/Gallery/Backgrounds/TGraphic_com-Full-Wallpapers-Backgrounds_Colorful_C_1920_33.jpg)"));
+}
+
+void test_css_parse_basic13()
+{
+ css_document_tree doc = load_document(SRCDIR"/test/css/basic13.css");
+
+ css_selector_t selector;
+ selector.first.id = "p1";
+
+ const css_properties_t* props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "background-color", "hsl(120,100,50)"));
+
+ selector.first.id = "p2";
+ props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "background-color", "hsl(120,100,75)"));
+
+ selector.first.id = "p3";
+ props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "background-color", "hsl(120,100,25)"));
+
+ selector.first.id = "p4";
+ props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "background-color", "hsl(120,60,70)"));
+}
+
+void test_css_parse_basic14()
+{
+ css_document_tree doc = load_document(SRCDIR"/test/css/basic14.css");
+
+ css_selector_t selector;
+ selector.first.id = "p1";
+
+ const css_properties_t* props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "background-color", "hsla(120,100,50,0.3)"));
+
+ selector.first.id = "p2";
+ props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "background-color", "hsla(120,100,75,0.3)"));
+
+ selector.first.id = "p3";
+ props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "background-color", "hsla(120,100,25,0.3)"));
+
+ selector.first.id = "p4";
+ props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "background-color", "hsla(120,60,70,0.3)"));
+}
+
+void test_css_parse_chained1()
+{
+ css_document_tree doc = load_document(SRCDIR"/test/css/chained1.css");
+
+ css_selector_t selector;
+ selector.first.name = "div";
+ css_simple_selector_t ss;
+ ss.name = "p";
+ selector.chained.push_back(ss);
+
+ // div p
+ const css_properties_t* props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "background-color", "yellow"));
+
+ // div > p
+ selector.chained.back().combinator = css::combinator_t::direct_child;
+ props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "background-color", "blue"));
+
+ // div + p
+ selector.chained.back().combinator = css::combinator_t::next_sibling;
+ props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 1);
+ assert(check_prop(*props, "background-color", "red"));
+}
+
+void test_css_parse_chained2()
+{
+ css_document_tree doc = load_document(SRCDIR"/test/css/chained2.css");
+
+ // Build selector '#id1 table.data td'.
+ css_selector_t selector;
+ selector.first.id = "id1";
+
+ css_simple_selector_t ss;
+ ss.name = "table";
+ ss.classes.insert("data");
+ selector.chained.push_back(ss);
+
+ ss.clear();
+ ss.name = "td";
+ selector.chained.push_back(ss);
+
+ const css_properties_t* props = doc.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 2);
+ assert(check_prop(*props, "background-color", "aquamarine"));
+ assert(check_prop(*props, "border", "solid 2px"));
+}
+
+void test_css_parse_utf8_1()
+{
+ css_document_tree doc = load_document(SRCDIR"/test/css/utf8-1.css");
+
+ css_document_tree doc2;
+ doc2 = std::move(doc); // test the move assignment operator.
+
+ css_selector_t selector;
+ selector.first.classes.insert("style17");
+
+ const css_properties_t* props = doc2.get_properties(selector, 0);
+ assert(props);
+ assert(props->size() == 11);
+
+ check_properties_type expected = {
+ { "mso-pattern", "auto none" },
+ { "background", "#EDEDED" },
+ { "mso-style-name", "20% - 强调文字颜色 3" },
+ { "color", "#000000" },
+ { "font-size", "11.0pt" },
+ { "font-weight", "400" },
+ { "font-style", "normal" },
+ { "font-family", "宋体" },
+ { "text-decoration", "none" },
+ { "mso-generic-font-family", "auto" },
+ { "mso-font-charset", "0" },
+ };
+
+ assert(check_props(*props, expected));
+}
+
+int main()
+{
+ test_css_invalids();
+ test_css_simple_selector_equality();
+ test_css_empty();
+ test_css_parse_basic1();
+ test_css_parse_basic2();
+ test_css_parse_basic3();
+ test_css_parse_basic4();
+ test_css_parse_basic5();
+ test_css_parse_basic6();
+ test_css_parse_basic7();
+ test_css_parse_basic8();
+ test_css_parse_basic9();
+ test_css_parse_basic10();
+ test_css_parse_basic11();
+ test_css_parse_basic12();
+ test_css_parse_basic13();
+ test_css_parse_basic14();
+ test_css_parse_chained1();
+ test_css_parse_chained2();
+ test_css_parse_utf8_1();
+
+ return EXIT_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/css_selector.cpp b/src/liborcus/css_selector.cpp
new file mode 100644
index 0000000..b7b63f3
--- /dev/null
+++ b/src/liborcus/css_selector.cpp
@@ -0,0 +1,214 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/css_selector.hpp"
+
+namespace orcus {
+
+css_simple_selector_t::css_simple_selector_t() :
+ pseudo_classes(0) {}
+
+void css_simple_selector_t::clear()
+{
+ name = std::string_view{};
+ id = std::string_view{};
+ classes.clear();
+ pseudo_classes = 0;
+}
+
+bool css_simple_selector_t::empty() const
+{
+ return name.empty() && id.empty() && classes.empty() && !pseudo_classes;
+}
+
+bool css_simple_selector_t::operator== (const css_simple_selector_t& r) const
+{
+ if (name != r.name)
+ return false;
+
+ if (id != r.id)
+ return false;
+
+ if (classes != r.classes)
+ return false;
+
+ return pseudo_classes == r.pseudo_classes;
+}
+
+bool css_simple_selector_t::operator!= (const css_simple_selector_t& r) const
+{
+ return !operator==(r);
+}
+
+size_t css_simple_selector_t::hash::operator() (const css_simple_selector_t& ss) const
+{
+ std::hash<std::string_view> h;
+
+ size_t val = h(ss.name);
+ val += h(ss.id);
+
+ for (std::string_view s : ss.classes)
+ val += h(s);
+
+ val += ss.pseudo_classes;
+
+ return val;
+}
+
+bool css_chained_simple_selector_t::operator== (const css_chained_simple_selector_t& r) const
+{
+ return combinator == r.combinator && simple_selector == r.simple_selector;
+}
+
+css_chained_simple_selector_t::css_chained_simple_selector_t() :
+ combinator(css::combinator_t::descendant) {}
+
+css_chained_simple_selector_t::css_chained_simple_selector_t(const css_simple_selector_t& ss) :
+ combinator(css::combinator_t::descendant), simple_selector(ss) {}
+
+css_chained_simple_selector_t::css_chained_simple_selector_t(
+ css::combinator_t op, const css_simple_selector_t& ss) :
+ combinator(op), simple_selector(ss) {}
+
+void css_selector_t::clear()
+{
+ first.clear();
+ chained.clear();
+}
+
+bool css_selector_t::operator== (const css_selector_t& r) const
+{
+ return first == r.first && chained == r.chained;
+}
+
+css_property_value_t::css_property_value_t() :
+ type(css::property_value_t::none), value{std::string_view{}} {}
+
+css_property_value_t::css_property_value_t(const css_property_value_t& r) :
+ type(r.type), value(r.value)
+{
+}
+
+css_property_value_t::css_property_value_t(std::string_view _str) :
+ type(css::property_value_t::string), value(_str) {}
+
+css_property_value_t& css_property_value_t::operator= (const css_property_value_t& r)
+{
+ type = r.type;
+ value = r.value;
+ return *this;
+}
+
+void css_property_value_t::swap(css_property_value_t& r)
+{
+ std::swap(type, r.type);
+ std::swap(value, r.value);
+}
+
+std::ostream& operator<< (std::ostream& os, const css_simple_selector_t& v)
+{
+ os << v.name;
+ css_simple_selector_t::classes_type::const_iterator it = v.classes.begin(), ite = v.classes.end();
+ for (; it != ite; ++it)
+ os << '.' << *it;
+ if (!v.id.empty())
+ os << '#' << v.id;
+ if (v.pseudo_classes)
+ os << css::pseudo_class_to_string(v.pseudo_classes);
+ return os;
+}
+
+std::ostream& operator<< (std::ostream& os, const css_selector_t& v)
+{
+ os << v.first;
+ css_selector_t::chained_type::const_iterator it = v.chained.begin(), ite = v.chained.end();
+ for (; it != ite; ++it)
+ {
+ const css_chained_simple_selector_t& css = *it;
+ os << ' ';
+ switch (css.combinator)
+ {
+ case css::combinator_t::direct_child:
+ os << "> ";
+ break;
+ case css::combinator_t::next_sibling:
+ os << "+ ";
+ break;
+ case css::combinator_t::descendant:
+ default:
+ ;
+ }
+ os << css.simple_selector;
+ }
+ return os;
+}
+
+std::ostream& operator<< (std::ostream& os, const css_property_value_t& v)
+{
+ const char* sep = ",";
+
+ switch (v.type)
+ {
+ case css::property_value_t::hsl:
+ {
+ auto c = std::get<css::hsla_color_t>(v.value);
+ os << "hsl("
+ << (int)c.hue << sep
+ << (int)c.saturation << sep
+ << (int)c.lightness
+ << ")";
+ break;
+ }
+ case css::property_value_t::hsla:
+ {
+ auto c = std::get<css::hsla_color_t>(v.value);
+ os << "hsla("
+ << (int)c.hue << sep
+ << (int)c.saturation << sep
+ << (int)c.lightness << sep
+ << c.alpha
+ << ")";
+ break;
+ }
+ case css::property_value_t::rgb:
+ {
+ auto c = std::get<css::rgba_color_t>(v.value);
+ os << "rgb("
+ << (int)c.red << sep
+ << (int)c.green << sep
+ << (int)c.blue
+ << ")";
+ break;
+ }
+ case css::property_value_t::rgba:
+ {
+ auto c = std::get<css::rgba_color_t>(v.value);
+ os << "rgba("
+ << (int)c.red << sep
+ << (int)c.green << sep
+ << (int)c.blue << sep
+ << c.alpha
+ << ")";
+ break;
+ }
+ case css::property_value_t::string:
+ os << std::get<std::string_view>(v.value);
+ break;
+ case css::property_value_t::url:
+ os << "url(" << std::get<std::string_view>(v.value) << ")";
+ break;
+ case css::property_value_t::none:
+ default:
+ ;
+ }
+
+ return os;
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/detection_result.cpp b/src/liborcus/detection_result.cpp
new file mode 100644
index 0000000..b49f645
--- /dev/null
+++ b/src/liborcus/detection_result.cpp
@@ -0,0 +1,20 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "detection_result.hpp"
+
+namespace orcus {
+
+detection_result::detection_result(bool result) : m_result(result) {}
+
+bool detection_result::get_result() const
+{
+ return m_result;
+}
+
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/detection_result.hpp b/src/liborcus/detection_result.hpp
new file mode 100644
index 0000000..bb87941
--- /dev/null
+++ b/src/liborcus/detection_result.hpp
@@ -0,0 +1,26 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef ORCUS_DETECTION_RESULT_HPP
+#define ORCUS_DETECTION_RESULT_HPP
+
+namespace orcus {
+
+class detection_result
+{
+ bool m_result;
+
+public:
+ detection_result(bool result);
+
+ bool get_result() const;
+};
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/dom_tree.cpp b/src/liborcus/dom_tree.cpp
new file mode 100644
index 0000000..9e7a764
--- /dev/null
+++ b/src/liborcus/dom_tree.cpp
@@ -0,0 +1,741 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/dom_tree.hpp>
+#include <orcus/exception.hpp>
+#include <orcus/xml_namespace.hpp>
+#include <orcus/sax_ns_parser.hpp>
+#include <orcus/string_pool.hpp>
+
+#include <iostream>
+#include <sstream>
+#include <cassert>
+#include <unordered_map>
+#include <vector>
+#include <algorithm>
+#include <deque>
+
+namespace orcus {
+
+namespace dom {
+
+namespace {
+
+/**
+ * Escape certain characters with backslash (\).
+ */
+void escape(std::ostream& os, std::string_view val)
+{
+ if (val.empty())
+ return;
+
+ const char* p = val.data();
+ const char* p_end = p + val.size();
+ for (; p != p_end; ++p)
+ {
+ if (*p == '"')
+ os << "\\\"";
+ else if (*p == '\\')
+ os << "\\\\";
+ else
+ os << *p;
+ }
+}
+
+struct attr
+{
+ dom::entity_name name;
+ std::string_view value;
+
+ attr(xmlns_id_t _ns, std::string_view _name, std::string_view _value);
+};
+
+struct entity_name_hash
+{
+ std::size_t operator()(const entity_name& v) const
+ {
+ return std::hash<std::string_view>{}(v.name) ^ reinterpret_cast<std::size_t>(v.ns);
+ }
+};
+
+using attrs_type = std::vector<attr>;
+using attr_map_type = std::unordered_map<entity_name, size_t, entity_name_hash>;
+
+struct declaration
+{
+ attrs_type attrs;
+ attr_map_type attr_map;
+};
+
+enum class node_type { element, content };
+
+struct element;
+
+struct node
+{
+ const element* parent;
+ node_type type;
+
+ node(node_type _type) : parent(nullptr), type(_type) {}
+
+ virtual ~node() = 0;
+ virtual void print(std::ostream& os, const xmlns_context& cxt) const = 0;
+};
+
+typedef std::vector<std::unique_ptr<node>> nodes_type;
+
+struct element : public node
+{
+ entity_name name;
+ attrs_type attrs;
+ attr_map_type attr_map;
+ nodes_type child_nodes;
+ std::vector<size_t> child_elem_positions;
+
+ element() = delete;
+ element(xmlns_id_t _ns, std::string_view _name);
+ virtual void print(std::ostream& os, const xmlns_context& cxt) const;
+ virtual ~element();
+};
+
+struct content : public node
+{
+ std::string_view value;
+
+ content(std::string_view _value);
+ virtual void print(std::ostream& os, const xmlns_context& cxt) const;
+ virtual ~content();
+};
+
+void print(std::ostream& os, const entity_name& name, const xmlns_context& cxt)
+{
+ if (name.ns)
+ {
+ size_t index = cxt.get_index(name.ns);
+ if (index != INDEX_NOT_FOUND)
+ os << "ns" << index << ':';
+ }
+ os << name.name;
+}
+
+void print(std::ostream& os, const attr& at, const xmlns_context& cxt)
+{
+ dom::print(os, at.name, cxt);
+ os << "=\"";
+ escape(os, at.value);
+ os << '"';
+}
+
+attr::attr(xmlns_id_t _ns, std::string_view _name, std::string_view _value) :
+ name(_ns, _name), value(_value) {}
+
+node::~node() {}
+
+element::element(xmlns_id_t _ns, std::string_view _name) :
+ node(node_type::element), name(_ns, _name) {}
+
+void element::print(std::ostream& os, const xmlns_context& cxt) const
+{
+ dom::print(os, name, cxt);
+}
+
+element::~element() = default;
+
+content::content(std::string_view _value) : node(node_type::content), value(_value) {}
+
+void content::print(std::ostream& os, const xmlns_context& /*cxt*/) const
+{
+ os << '"';
+ escape(os, value);
+ os << '"';
+}
+
+content::~content() = default;
+
+} // anonymous namespace
+
+entity_name::entity_name() : ns(XMLNS_UNKNOWN_ID) {}
+
+entity_name::entity_name(std::string_view _name) :
+ ns(XMLNS_UNKNOWN_ID), name(_name) {}
+
+entity_name::entity_name(xmlns_id_t _ns, std::string_view _name) :
+ ns(_ns), name(_name) {}
+
+bool entity_name::operator== (const entity_name& other) const
+{
+ return ns == other.ns && name == other.name;
+}
+
+bool entity_name::operator!= (const entity_name& other) const
+{
+ return !operator==(other);
+}
+
+struct const_node::impl
+{
+ node_t type;
+
+ union
+ {
+ const dom::declaration* decl;
+ const dom::element* elem;
+
+ struct
+ {
+ const char* p;
+ size_t n;
+
+ } str;
+
+ } value;
+
+ impl() : type(node_t::unset) {}
+
+ impl(const impl& other) : type(other.type)
+ {
+ switch (type)
+ {
+ case node_t::declaration:
+ value.decl = other.value.decl;
+ break;
+ case node_t::element:
+ value.elem = other.value.elem;
+ break;
+ case node_t::unset:
+ default:
+ ;
+ }
+ }
+
+ impl(const dom::element* _elem) : type(node_t::element)
+ {
+ value.elem = _elem;
+ }
+
+ impl(const dom::declaration* _decl) : type(node_t::declaration)
+ {
+ value.decl = _decl;
+ }
+};
+
+const_node::const_node(std::unique_ptr<impl>&& _impl) : mp_impl(std::move(_impl)) {}
+const_node::const_node() : mp_impl(std::make_unique<impl>()) {}
+const_node::const_node(const const_node& other) : mp_impl(std::make_unique<impl>(*other.mp_impl)) {}
+const_node::const_node(const_node&& other) : mp_impl(std::move(other.mp_impl)) {}
+const_node::~const_node() {}
+
+node_t const_node::type() const
+{
+ return mp_impl->type;
+}
+
+size_t const_node::child_count() const
+{
+ switch (mp_impl->type)
+ {
+ case node_t::element:
+ {
+ const dom::element* p = mp_impl->value.elem;
+ return p->child_elem_positions.size();
+ }
+ default:
+ ;
+ }
+
+ return 0;
+}
+
+const_node const_node::child(size_t index) const
+{
+ switch (mp_impl->type)
+ {
+ case node_t::element:
+ {
+ const dom::element* p = mp_impl->value.elem;
+
+ size_t elem_pos = p->child_elem_positions.at(index);
+ assert(elem_pos < p->child_nodes.size());
+
+ const dom::node* child_node = p->child_nodes[elem_pos].get();
+ assert(child_node->type == node_type::element);
+
+ auto v = std::make_unique<impl>(static_cast<const dom::element*>(child_node));
+ return const_node(std::move(v));
+ }
+ default:
+ ;
+ }
+ return const_node();
+}
+
+entity_name const_node::name() const
+{
+ switch (mp_impl->type)
+ {
+ case node_t::element:
+ {
+ const dom::element* p = mp_impl->value.elem;
+ return p->name;
+ }
+ default:
+ ;
+ }
+
+ return entity_name();
+}
+
+std::string_view const_node::attribute(const entity_name& name) const
+{
+ switch (mp_impl->type)
+ {
+ case node_t::element:
+ {
+ const dom::element* p = mp_impl->value.elem;
+ auto it = p->attr_map.find(name);
+ if (it == p->attr_map.end())
+ break;
+
+ size_t pos = it->second;
+ assert(pos < p->attrs.size());
+ return p->attrs[pos].value;
+ }
+ default:
+ ;
+ }
+
+ return std::string_view();
+}
+
+std::string_view const_node::attribute(std::string_view name) const
+{
+ switch (mp_impl->type)
+ {
+ case node_t::declaration:
+ {
+ const dom::declaration* p = mp_impl->value.decl;
+ auto it = p->attr_map.find(name);
+ if (it == p->attr_map.end())
+ return std::string_view();
+
+ size_t pos = it->second;
+ assert(pos < p->attrs.size());
+ return p->attrs[pos].value;
+ }
+ default:
+ ;
+ }
+
+ return attribute(entity_name(name));
+}
+
+size_t const_node::attribute_count() const
+{
+ switch (mp_impl->type)
+ {
+ case node_t::declaration:
+ {
+ const dom::declaration* p = mp_impl->value.decl;
+ return p->attrs.size();
+ }
+ case node_t::element:
+ {
+ const dom::element* p = mp_impl->value.elem;
+ return p->attrs.size();
+ }
+ default:
+ ;
+ }
+ return 0;
+}
+
+const_node const_node::parent() const
+{
+ if (mp_impl->type != node_t::element)
+ return const_node();
+
+ const dom::element* p = mp_impl->value.elem->parent;
+ if (!p)
+ return const_node();
+
+ auto v = std::make_unique<impl>(p);
+ return const_node(std::move(v));
+}
+
+void const_node::swap(const_node& other)
+{
+ mp_impl.swap(other.mp_impl);
+}
+
+const_node& const_node::operator= (const const_node& other)
+{
+ const_node tmp(other);
+ swap(tmp);
+ return *this;
+}
+
+bool const_node::operator== (const const_node& other) const
+{
+ if (mp_impl->type != other.mp_impl->type)
+ return false;
+
+ switch (mp_impl->type)
+ {
+ case node_t::unset:
+ return true;
+ case node_t::declaration:
+ return mp_impl->value.decl == other.mp_impl->value.decl;
+ case node_t::element:
+ return mp_impl->value.elem == other.mp_impl->value.elem;
+ default:
+ ;
+ }
+
+ return false;
+}
+
+bool const_node::operator!= (const const_node& other) const
+{
+ return !operator==(other);
+}
+
+/**
+ * This impl class also serves as the handler for the sax_ns_parser.
+ */
+struct document_tree::impl
+{
+ typedef std::vector<dom::element*> element_stack_type;
+ typedef std::unordered_map<std::string_view, dom::declaration> declarations_type;
+
+ xmlns_context& m_ns_cxt;
+ string_pool m_pool;
+
+ std::unique_ptr<sax::doctype_declaration> m_doctype;
+
+ std::string_view m_cur_decl_name;
+ declarations_type m_decls;
+ dom::attrs_type m_doc_attrs;
+ dom::attrs_type m_cur_attrs;
+ dom::attr_map_type m_cur_attr_map;
+ element_stack_type m_elem_stack;
+ std::unique_ptr<dom::element> m_root;
+
+ impl(xmlns_context& cxt) : m_ns_cxt(cxt) {}
+
+ void start_declaration(std::string_view name)
+ {
+ m_cur_decl_name = name;
+ }
+
+ void end_declaration(std::string_view name);
+ void start_element(const sax_ns_parser_element& elem);
+ void end_element(const sax_ns_parser_element& elem);
+ void characters(std::string_view val, bool transient);
+ void doctype(const sax::doctype_declaration& dtd);
+
+ void attribute(std::string_view name, std::string_view val)
+ {
+ set_attribute(XMLNS_UNKNOWN_ID, name, val);
+ }
+
+ void attribute(const sax_ns_parser_attribute& attr)
+ {
+ set_attribute(attr.ns, attr.name, attr.value);
+ }
+
+ void set_attribute(xmlns_id_t ns, std::string_view name, std::string_view val);
+};
+
+void document_tree::impl::end_declaration(std::string_view name)
+{
+ assert(m_cur_decl_name == name);
+
+ dom::declaration decl;
+ decl.attrs.swap(m_cur_attrs);
+ decl.attr_map.swap(m_cur_attr_map);
+
+ declarations_type::iterator it = m_decls.find(name);
+ if (it == m_decls.end())
+ {
+ // Insert a new entry for this name.
+ std::pair<declarations_type::iterator,bool> r =
+ m_decls.insert(
+ declarations_type::value_type(
+ m_pool.intern(name).first, std::move(decl)));
+
+ if (!r.second)
+ // Insertion failed.
+ throw general_error("dom_tree::end_declaration: failed to insert a new declaration entry.");
+ }
+ else
+ it->second = std::move(decl);
+}
+
+void document_tree::impl::start_element(const sax_ns_parser_element& elem)
+{
+ xmlns_id_t ns = elem.ns;
+ std::string_view name = elem.name;
+
+ // These strings must be persistent.
+ std::string_view name_safe = m_pool.intern(name).first;
+
+ dom::element* p = nullptr;
+ if (!m_root)
+ {
+ // This must be the root element!
+ m_root = std::make_unique<dom::element>(ns, name_safe);
+ m_elem_stack.push_back(m_root.get());
+ p = m_elem_stack.back();
+ p->attrs.swap(m_cur_attrs);
+ p->attr_map.swap(m_cur_attr_map);
+ return;
+ }
+
+ // Append new element as a child element of the current element.
+ p = m_elem_stack.back();
+
+ size_t elem_pos = p->child_nodes.size();
+ p->child_elem_positions.push_back(elem_pos);
+
+ p->child_nodes.push_back(std::make_unique<dom::element>(ns, name_safe));
+ const dom::element* parent = p;
+ p = static_cast<dom::element*>(p->child_nodes.back().get());
+ p->parent = parent;
+ p->attrs.swap(m_cur_attrs);
+ p->attr_map.swap(m_cur_attr_map);
+
+ m_elem_stack.push_back(p);
+}
+
+void document_tree::impl::end_element(const sax_ns_parser_element& elem)
+{
+ xmlns_id_t ns = elem.ns;
+ std::string_view name = elem.name;
+
+ const dom::element* p = m_elem_stack.back();
+ if (p->name.ns != ns || p->name.name != name)
+ throw general_error("non-matching end element.");
+
+ m_elem_stack.pop_back();
+}
+
+void document_tree::impl::characters(std::string_view val, bool /*transient*/)
+{
+ if (m_elem_stack.empty())
+ // No root element has been encountered. Ignore this.
+ return;
+
+ std::string_view val2 = trim(val);
+ if (val2.empty())
+ return;
+
+ dom::element* p = m_elem_stack.back();
+ val2 = m_pool.intern(val2).first; // Make sure the string is persistent.
+ auto child = std::make_unique<dom::content>(val2);
+ child->parent = p;
+ p->child_nodes.push_back(std::move(child));
+}
+
+void document_tree::impl::set_attribute(xmlns_id_t ns, std::string_view name, std::string_view val)
+{
+ // These strings must be persistent.
+ std::string_view name2 = m_pool.intern(name).first;
+ std::string_view val2 = m_pool.intern(val).first;
+
+ size_t pos = m_cur_attrs.size();
+ m_cur_attrs.push_back(dom::attr(ns, name2, val2));
+ m_cur_attr_map.insert({dom::entity_name(ns, name2), pos});
+}
+
+void document_tree::impl::doctype(const sax::doctype_declaration& dtd)
+{
+ m_doctype = std::make_unique<sax::doctype_declaration>(dtd); // make a copy.
+
+ sax::doctype_declaration& this_dtd = *m_doctype;
+ string_pool& pool = m_pool;
+
+ // Intern the strings.
+ this_dtd.root_element = pool.intern(dtd.root_element).first;
+ this_dtd.fpi = pool.intern(dtd.fpi).first;
+ this_dtd.uri = pool.intern(dtd.uri).first;
+}
+
+document_tree::document_tree(xmlns_context& cxt) :
+ mp_impl(std::make_unique<impl>(cxt)) {}
+
+document_tree::document_tree(document_tree&& other) :
+ mp_impl(std::move(other.mp_impl))
+{
+ other.mp_impl = std::make_unique<impl>(mp_impl->m_ns_cxt);
+}
+
+document_tree::~document_tree() {}
+
+void document_tree::load(std::string_view strm)
+{
+ sax_ns_parser<impl> parser(strm, mp_impl->m_ns_cxt, *mp_impl);
+ parser.parse();
+}
+
+dom::const_node document_tree::root() const
+{
+ const dom::element* p = mp_impl->m_root.get();
+ auto v = std::make_unique<const_node::impl>(p);
+ return dom::const_node(std::move(v));
+}
+
+dom::const_node document_tree::declaration(std::string_view name) const
+{
+ impl::declarations_type::const_iterator it = mp_impl->m_decls.find(name);
+ if (it == mp_impl->m_decls.end())
+ return dom::const_node();
+
+ const dom::declaration* decl = &it->second;
+ auto v = std::make_unique<dom::const_node::impl>(decl);
+ return dom::const_node(std::move(v));
+}
+
+void document_tree::swap(document_tree& other)
+{
+ mp_impl.swap(other.mp_impl);
+}
+
+const sax::doctype_declaration* document_tree::get_doctype() const
+{
+ return mp_impl->m_doctype.get();
+}
+
+namespace {
+
+struct scope
+{
+ typedef std::vector<const dom::node*> nodes_type;
+ std::string name;
+ nodes_type nodes;
+ nodes_type::const_iterator current_pos;
+
+ scope(const scope&) = delete;
+ scope& operator=(const scope&) = delete;
+
+ scope(const std::string& _name, dom::node* _node) :
+ name(_name)
+ {
+ nodes.push_back(_node);
+ current_pos = nodes.begin();
+ }
+
+ scope(const std::string& _name) : name(_name) {}
+};
+
+typedef std::deque<scope> scopes_type;
+
+void print_scope(std::ostream& os, const scopes_type& scopes)
+{
+ if (scopes.empty())
+ throw general_error("scope stack shouldn't be empty while dumping tree.");
+
+ // Skip the first scope which is root.
+ scopes_type::const_iterator it = scopes.begin(), it_end = scopes.end();
+ for (++it; it != it_end; ++it)
+ os << "/" << it->name;
+}
+
+}
+
+void document_tree::dump_compact(std::ostream& os) const
+{
+ if (!mp_impl->m_root)
+ return;
+
+ // Dump namespaces first.
+ mp_impl->m_ns_cxt.dump(os);
+
+ scopes_type scopes;
+
+ scopes.emplace_back(std::string(), mp_impl->m_root.get());
+ while (!scopes.empty())
+ {
+ bool new_scope = false;
+
+ // Iterate through all elements in the current scope.
+ scope& cur_scope = scopes.back();
+ for (; cur_scope.current_pos != cur_scope.nodes.end(); ++cur_scope.current_pos)
+ {
+ const dom::node* this_node = *cur_scope.current_pos;
+ assert(this_node);
+ print_scope(os, scopes);
+ if (this_node->type == dom::node_type::content)
+ {
+ // This is a text content.
+ this_node->print(os, mp_impl->m_ns_cxt);
+ os << std::endl;
+ continue;
+ }
+
+ assert(this_node->type == dom::node_type::element);
+ const dom::element* elem = static_cast<const dom::element*>(this_node);
+ os << "/";
+ elem->print(os, mp_impl->m_ns_cxt);
+ os << std::endl;
+
+ {
+ // Dump attributes.
+ dom::attrs_type attrs = elem->attrs;
+ std::sort(attrs.begin(), attrs.end(),
+ [](const dom::attr& left, const dom::attr& right) -> bool
+ {
+ return left.name.name < right.name.name;
+ }
+ );
+
+ for (const dom::attr& a : attrs)
+ {
+ print_scope(os, scopes);
+ os << "/";
+ elem->print(os, mp_impl->m_ns_cxt);
+ os << "@";
+ dom::print(os, a, mp_impl->m_ns_cxt);
+ os << std::endl;
+ }
+ }
+
+ if (elem->child_nodes.empty())
+ continue;
+
+ // This element has child nodes. Push a new scope and populate it
+ // with all child elements, but skip content nodes.
+ scope::nodes_type nodes;
+ for (const std::unique_ptr<dom::node>& p : elem->child_nodes)
+ nodes.push_back(p.get());
+
+ assert(!nodes.empty());
+
+ // Push a new scope, and restart the loop with the new scope.
+ ++cur_scope.current_pos;
+ std::ostringstream elem_name;
+ elem->print(elem_name, mp_impl->m_ns_cxt);
+ scopes.emplace_back(elem_name.str());
+ scope& child_scope = scopes.back();
+ child_scope.nodes.swap(nodes);
+ child_scope.current_pos = child_scope.nodes.begin();
+
+ new_scope = true;
+ break;
+ }
+
+ if (new_scope)
+ continue;
+
+ scopes.pop_back();
+ }
+}
+
+} // namespace dom
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/dom_tree_test.cpp b/src/liborcus/dom_tree_test.cpp
new file mode 100644
index 0000000..5ce5418
--- /dev/null
+++ b/src/liborcus/dom_tree_test.cpp
@@ -0,0 +1,123 @@
+
+#include <orcus/dom_tree.hpp>
+#include <orcus/stream.hpp>
+#include <orcus/xml_namespace.hpp>
+#include <cassert>
+#include <iostream>
+
+using namespace orcus::dom;
+
+struct doctree
+{
+ orcus::xmlns_repository repo;
+ orcus::xmlns_context cxt;
+ orcus::dom::document_tree tree;
+
+ doctree(std::string_view content) : repo(), cxt(repo.create_context()), tree(cxt)
+ {
+ tree.load(content);
+ }
+};
+
+std::unique_ptr<doctree> load_document_tree(std::string_view content)
+{
+ std::unique_ptr<doctree> ret = std::make_unique<doctree>(content);
+ return ret;
+}
+
+std::unique_ptr<doctree> load_document_tree_from_file(const char* filepath)
+{
+ orcus::file_content content(filepath);
+ return load_document_tree(content.str());
+}
+
+void test_encoded_attr()
+{
+ std::string content = "<?xml version=\"1.0\"?><root attr=\"&amp;;\"/>";
+ auto doctree = load_document_tree(content);
+ const_node root = doctree->tree.root();
+ doctree->tree.dump_compact(std::cout);
+ std::cout << __FILE__ << "#" << __LINE__ << " (:test_encoded_attr): " << root.attribute("attr") << std::endl;
+ assert(root.attribute("attr") == "&;");
+}
+
+void test_declaration()
+{
+ auto doctree = load_document_tree_from_file(SRCDIR"/test/xml/osm/street-in-aizu.osm");
+
+ const_node decl = doctree->tree.declaration("xml");
+ assert(decl.type() == node_t::declaration);
+ assert(decl.attribute("version") == "1.0");
+ assert(decl.attribute("encoding") == "UTF-8");
+
+ const_node copied = decl;
+ assert(copied == decl);
+}
+
+void test_attributes()
+{
+ auto doctree = load_document_tree_from_file(SRCDIR"/test/xml/osm/street-in-aizu.osm");
+
+ const_node root = doctree->tree.root();
+ assert(root.name() == entity_name("osm"));
+ assert(root.type() == node_t::element);
+ assert(root.attribute("version") == "0.6");
+ assert(root.attribute("generator") == "CGImap 0.6.1 (1984 thorn-02.openstreetmap.org)");
+ assert(root.attribute("copyright") == "OpenStreetMap and contributors");
+ assert(root.attribute("attribution") == "http://www.openstreetmap.org/copyright");
+ assert(root.attribute("license") == "http://opendatacommons.org/licenses/odbl/1-0/");
+ assert(root.attribute("no-such-attribute").empty());
+ assert(root.attribute_count() == 5);
+}
+
+void test_element_hierarchy()
+{
+ auto doctree = load_document_tree_from_file(SRCDIR"/test/xml/osm/street-in-aizu.osm");
+
+ const_node root = doctree->tree.root();
+ assert(root.name() == entity_name("osm"));
+ assert(root.child_count() > 0);
+ assert(root.parent().type() == node_t::unset);
+
+ const_node elem = root.child(0);
+ assert(elem != root);
+ assert(elem.type() == node_t::element);
+ assert(elem.name() == entity_name("bounds"));
+ assert(elem.attribute("minlat") == "37.4793300");
+ assert(elem.attribute("minlon") == "139.9158300");
+ assert(elem.attribute("maxlat") == "37.4798000");
+ assert(elem.attribute("maxlon") == "139.9162300");
+ assert(elem.attribute_count() == 4);
+ assert(elem.child_count() == 0);
+ assert(elem.parent() == root);
+
+ const_node copied_elem = elem;
+ assert(copied_elem == elem);
+
+ elem = root.child(5);
+ assert(elem.name() == entity_name("node"));
+ assert(elem.attribute("user") == "jun_meguro");
+ assert(elem.child_count() == 1);
+ elem = elem.child(0);
+ assert(elem.name() == entity_name("tag"));
+ assert(elem.attribute("k") == "highway");
+ assert(elem.attribute("v") == "crossing");
+
+ // Make sure the number of child elements are accurate.
+ size_t n_elems = root.child_count();
+ for (size_t i = 0; i < n_elems; ++i)
+ {
+ auto child = root.child(i);
+ assert(child.type() == node_t::element);
+ }
+}
+
+int main()
+{
+ test_encoded_attr();
+ test_declaration();
+ test_attributes();
+ test_element_hierarchy();
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/liborcus/format_detection.cpp b/src/liborcus/format_detection.cpp
new file mode 100644
index 0000000..e685362
--- /dev/null
+++ b/src/liborcus/format_detection.cpp
@@ -0,0 +1,135 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifdef __ORCUS_ODS
+#define ODS_ENABLED 1
+#else
+#define ODS_ENABLED 0
+#endif
+
+#ifdef __ORCUS_XLSX
+#define XLSX_ENABLED 1
+#else
+#define XLSX_ENABLED 0
+#endif
+
+#ifdef __ORCUS_GNUMERIC
+#define GNUMERIC_ENABLED 1
+#else
+#define GNUMERIC_ENABLED 0
+#endif
+
+#ifdef __ORCUS_XLS_XML
+#define XLS_XML_ENABLED 1
+#else
+#define XLS_XML_ENABLED 0
+#endif
+
+#ifdef __ORCUS_PARQUET
+#define PARQUET_ENABLED 1
+#else
+#define PARQUET_ENABLED 0
+#endif
+
+#include <orcus/format_detection.hpp>
+#include <orcus/orcus_csv.hpp>
+
+#if ODS_ENABLED
+#include <orcus/orcus_ods.hpp>
+#endif
+#if XLSX_ENABLED
+#include <orcus/orcus_xlsx.hpp>
+#endif
+#if GNUMERIC_ENABLED
+#include <orcus/orcus_gnumeric.hpp>
+#endif
+#if XLS_XML_ENABLED
+#include <orcus/orcus_xls_xml.hpp>
+#endif
+#if PARQUET_ENABLED
+#include <orcus/orcus_parquet.hpp>
+#endif
+
+#include <stdexcept>
+
+namespace ss = orcus::spreadsheet;
+
+namespace orcus {
+
+format_t detect(std::string_view strm) try
+{
+ const auto* p = reinterpret_cast<const unsigned char*>(strm.data());
+
+#if ODS_ENABLED
+ if (orcus_ods::detect(p, strm.size()))
+ return format_t::ods;
+#endif
+#if XLSX_ENABLED
+ if (orcus_xlsx::detect(p, strm.size()))
+ return format_t::xlsx;
+#endif
+#if GNUMERIC_ENABLED
+ if (orcus_gnumeric::detect(p, strm.size()))
+ return format_t::gnumeric;
+#endif
+#if XLS_XML_ENABLED
+ if (orcus_xls_xml::detect(p, strm.size()))
+ return format_t::xls_xml;
+#endif
+#if PARQUET_ENABLED
+ if (orcus_parquet::detect(p, strm.size()))
+ return format_t::parquet;
+#endif
+
+ return format_t::unknown;
+}
+catch (const std::exception&)
+{
+ return format_t::unknown;
+}
+catch (...)
+{
+ return format_t::unknown;
+}
+
+std::shared_ptr<iface::import_filter> create_filter(format_t type, ss::iface::import_factory* factory)
+{
+ if (!factory)
+ throw std::invalid_argument("pointer to import factory instance must not be null");
+ switch (type)
+ {
+#if ODS_ENABLED
+ case format_t::ods:
+ return std::allocate_shared<orcus_ods>(std::allocator<orcus_ods>{}, factory);
+#endif
+#if XLSX_ENABLED
+ case format_t::xlsx:
+ return std::allocate_shared<orcus_xlsx>(std::allocator<orcus_xlsx>{}, factory);
+#endif
+#if GNUMERIC_ENABLED
+ case format_t::gnumeric:
+ return std::allocate_shared<orcus_gnumeric>(std::allocator<orcus_gnumeric>{}, factory);
+#endif
+#if XLS_XML_ENABLED
+ case format_t::xls_xml:
+ return std::allocate_shared<orcus_xls_xml>(std::allocator<orcus_xls_xml>{}, factory);
+#endif
+#if PARQUET_ENABLED
+ case format_t::parquet:
+ return std::allocate_shared<orcus_parquet>(std::allocator<orcus_parquet>{}, factory);
+#endif
+ case format_t::csv:
+ return std::allocate_shared<orcus_csv>(std::allocator<orcus_csv>{}, factory);
+ case format_t::unknown:
+ default:;
+ }
+ return {};
+}
+
+} // namespace orcus
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/formula_result.cpp b/src/liborcus/formula_result.cpp
new file mode 100644
index 0000000..bdde523
--- /dev/null
+++ b/src/liborcus/formula_result.cpp
@@ -0,0 +1,120 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "formula_result.hpp"
+
+#include <ostream>
+
+namespace orcus {
+
+formula_result::formula_result() : type(result_type::empty) {}
+formula_result::formula_result(const formula_result& r) :
+ type(r.type)
+{
+ switch (type)
+ {
+ case result_type::numeric:
+ value_numeric = r.value_numeric;
+ break;
+ case result_type::boolean:
+ value_boolean = r.value_boolean;
+ break;
+ case result_type::string:
+ value_string.p = r.value_string.p;
+ value_string.n = r.value_string.n;
+ break;
+ case result_type::empty:
+ default:
+ ;
+ }
+}
+
+formula_result::formula_result(double v) : type(result_type::numeric), value_numeric(v) {}
+formula_result::formula_result(const char* p, size_t n) :
+ type(result_type::string)
+{
+ value_string.p = p;
+ value_string.n = n;
+}
+
+formula_result::formula_result(bool b) : type(result_type::boolean), value_boolean(b) {}
+
+size_t range_formula_results::to_array_pos(size_t row, size_t col) const
+{
+ return row * m_cols + col;
+}
+
+range_formula_results::range_formula_results(size_t rows, size_t cols) :
+ m_store(rows*cols), m_rows(rows), m_cols(cols) {}
+
+void range_formula_results::set(size_t row, size_t col, const formula_result& v)
+{
+ size_t pos = to_array_pos(row, col);
+ m_store[pos] = v;
+}
+
+const formula_result& range_formula_results::get(size_t row, size_t col) const
+{
+ size_t pos = to_array_pos(row, col);
+ return m_store[pos];
+}
+
+size_t range_formula_results::row_size() const
+{
+ return m_rows;
+}
+
+size_t range_formula_results::col_size() const
+{
+ return m_cols;
+}
+
+std::ostream& operator<< (std::ostream& os, const formula_result& v)
+{
+ switch (v.type)
+ {
+ case formula_result::result_type::numeric:
+ os << v.value_numeric;
+ break;
+ case formula_result::result_type::boolean:
+ os << v.value_boolean;
+ break;
+ case formula_result::result_type::string:
+ os << std::string_view(v.value_string.p, v.value_string.n);
+ break;
+ case formula_result::result_type::empty:
+ break;
+ }
+ return os;
+}
+
+std::ostream& operator<< (std::ostream& os, const orcus::range_formula_results& res)
+{
+ os << "{ ";
+ size_t col_pos = 0;
+ for (const formula_result& v : res.m_store)
+ {
+ if (col_pos == res.m_cols)
+ {
+ os << " | ";
+ col_pos = 0;
+ }
+ else if (col_pos > 0)
+ os << ", ";
+
+ os << v;
+ ++col_pos;
+ }
+
+ os << " }";
+
+ return os;
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/formula_result.hpp b/src/liborcus/formula_result.hpp
new file mode 100644
index 0000000..14665b3
--- /dev/null
+++ b/src/liborcus/formula_result.hpp
@@ -0,0 +1,72 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_FORMULA_RESULT_HPP
+#define INCLUDED_ORCUS_FORMULA_RESULT_HPP
+
+#include <vector>
+#include <cstdlib>
+#include <iosfwd>
+
+namespace orcus {
+
+/**
+ * Stores cached formula result. Note that when the result is of string
+ * type, it only stores a pointer to the string buffer but the instance of
+ * this class does not own the buffer.
+ */
+struct formula_result
+{
+ enum class result_type { empty, numeric, string, boolean };
+
+ result_type type;
+
+ union
+ {
+ double value_numeric;
+ bool value_boolean;
+ struct { const char* p; size_t n; } value_string;
+ };
+
+ formula_result();
+ formula_result(const formula_result& r);
+ formula_result(double v);
+ formula_result(const char* p, size_t n);
+ formula_result(bool b);
+};
+
+class range_formula_results
+{
+ friend std::ostream& operator<< (std::ostream&, const range_formula_results&);
+
+ std::vector<formula_result> m_store;
+ size_t m_rows;
+ size_t m_cols;
+
+ size_t to_array_pos(size_t row, size_t col) const;
+
+public:
+ range_formula_results() = delete;
+ range_formula_results(const range_formula_results&) = delete;
+ range_formula_results(size_t rows, size_t cols);
+
+ void set(size_t row, size_t col, const formula_result& v);
+ const formula_result& get(size_t row, size_t col) const;
+
+ size_t row_size() const;
+ size_t col_size() const;
+};
+
+std::ostream& operator<< (std::ostream& os, const formula_result& v);
+std::ostream& operator<< (std::ostream& os, const orcus::range_formula_results& res);
+
+}
+
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/gnumeric_cell_context.cpp b/src/liborcus/gnumeric_cell_context.cpp
new file mode 100644
index 0000000..07b82bc
--- /dev/null
+++ b/src/liborcus/gnumeric_cell_context.cpp
@@ -0,0 +1,377 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "gnumeric_token_constants.hpp"
+#include "gnumeric_namespace_types.hpp"
+#include "gnumeric_cell_context.hpp"
+#include "gnumeric_value_format_parser.hpp"
+
+#include <orcus/spreadsheet/import_interface.hpp>
+#include <orcus/measurement.hpp>
+
+#include <fstream>
+#include <algorithm>
+
+namespace ss = orcus::spreadsheet;
+
+namespace orcus {
+
+gnumeric_cell_context::gnumeric_cell_context(
+ session_context& session_cxt, const tokens& tokens, ss::iface::import_factory* factory) :
+ xml_context_base(session_cxt, tokens),
+ mp_factory(factory),
+ mp_sheet(nullptr)
+{
+}
+
+gnumeric_cell_context::~gnumeric_cell_context() = default;
+
+void gnumeric_cell_context::start_element(
+ xmlns_id_t ns, xml_token_t name, const xml_token_attrs_t& attrs)
+{
+ push_stack(ns, name);
+
+ if (ns == NS_gnumeric_gnm)
+ {
+ switch (name)
+ {
+ case XML_Cell:
+ start_cell(attrs);
+ break;
+ default:
+ warn_unhandled();
+ }
+ }
+ else
+ warn_unhandled();
+}
+
+bool gnumeric_cell_context::end_element(xmlns_id_t ns, xml_token_t name)
+{
+ if (ns == NS_gnumeric_gnm)
+ {
+ switch (name)
+ {
+ case XML_Cell:
+ end_cell();
+ break;
+ default:
+ ;
+ }
+ }
+ return pop_stack(ns, name);
+}
+
+void gnumeric_cell_context::characters(std::string_view str, bool transient)
+{
+ m_chars = str;
+ if (transient)
+ m_chars = intern(m_chars);
+}
+
+void gnumeric_cell_context::reset(ss::iface::import_sheet* sheet)
+{
+ m_cell_data.reset();
+ m_chars = std::string_view{};
+ mp_sheet = sheet;
+ m_pool.clear();
+}
+
+void gnumeric_cell_context::start_cell(const xml_token_attrs_t& attrs)
+{
+ m_cell_data = cell_data{};
+ m_cell_data->type = cell_type_formula;
+ m_format_segments.clear();
+
+ for (const auto& attr : attrs)
+ {
+ switch (attr.name)
+ {
+ case XML_Row:
+ m_cell_data->row = to_long(attr.value);
+ break;
+ case XML_Col:
+ m_cell_data->col = to_long(attr.value);
+ break;
+ case XML_ValueType:
+ {
+ auto v = to_long(attr.value);
+ m_cell_data->type = cell_type_value;
+ m_cell_data->value_type = static_cast<gnumeric_value_type>(v);
+ break;
+ }
+ case XML_ValueFormat:
+ {
+ auto v = attr.value;
+ if (attr.transient)
+ v = m_pool.intern(v).first;
+
+ gnumeric_value_format_parser parser(v);
+
+ try
+ {
+ parser.parse();
+ }
+ catch (const parse_error& e)
+ {
+ std::ostringstream os;
+ os << "failed to parse a value format string: '" << v << "' (reason=" << e.what() << ")";
+ warn(os.str());
+ break;
+ }
+
+ m_format_segments = parser.pop_segments();
+ break;
+ }
+ case XML_ExprID:
+ m_cell_data->shared_formula_id = to_long(attr.value);
+ m_cell_data->type = cell_type_shared_formula;
+ break;
+ case XML_Rows:
+ m_cell_data->type = cell_type_value;
+ m_cell_data->value_type = vt_array;
+ m_cell_data->array_rows = to_long(attr.value);
+ break;
+ case XML_Cols:
+ m_cell_data->type = cell_type_value;
+ m_cell_data->value_type = vt_array;
+ m_cell_data->array_cols = to_long(attr.value);
+ break;
+ }
+ }
+}
+
+void gnumeric_cell_context::end_cell()
+{
+ if (!m_cell_data)
+ return;
+
+ if (!mp_sheet)
+ return;
+
+ ss::col_t col = m_cell_data->col;
+ ss::row_t row = m_cell_data->row;
+
+ switch (m_cell_data->type)
+ {
+ case cell_type_value:
+ {
+ if (!m_cell_data->value_type)
+ break;
+
+ switch (*m_cell_data->value_type)
+ {
+ case vt_boolean:
+ {
+ bool val = to_bool(m_chars);
+ mp_sheet->set_bool(row, col, val);
+ break;
+ }
+ case vt_float:
+ {
+ double val = to_double(m_chars);
+ mp_sheet->set_value(row, col, val);
+ break;
+ }
+ case vt_string:
+ {
+ push_string(row, col);
+ break;
+ }
+ case vt_array:
+ {
+ ss::range_t range;
+ range.first.column = col;
+ range.first.row = row;
+ range.last.column = col + m_cell_data->array_cols - 1;
+ range.last.row = row + m_cell_data->array_rows - 1;
+
+ ss::iface::import_array_formula* af = mp_sheet->get_array_formula();
+ if (!af)
+ break;
+
+ if (m_chars.empty() || m_chars[0] != '=')
+ // formula string should start with a '='
+ break;
+
+ af->set_range(range);
+ af->set_formula(ss::formula_grammar_t::gnumeric, m_chars.substr(1));
+ af->commit();
+ break;
+ }
+ default:
+ {
+ std::ostringstream os;
+ os << "unhandled cell value type (" << *m_cell_data->value_type << ")";
+ warn(os.str());
+ }
+ }
+ break;
+ }
+ case cell_type_formula:
+ {
+ ss::iface::import_formula* xformula = mp_sheet->get_formula();
+ if (!xformula)
+ break;
+
+ if (m_chars.empty() || m_chars[0] != '=')
+ // formula string should start with a '='
+ break;
+
+ xformula->set_position(row, col);
+ xformula->set_formula(ss::formula_grammar_t::gnumeric, m_chars.substr(1));
+ xformula->commit();
+ break;
+ }
+ case cell_type_shared_formula:
+ {
+ ss::iface::import_formula* xformula = mp_sheet->get_formula();
+ if (!xformula)
+ break;
+
+ xformula->set_position(row, col);
+
+ if (!m_chars.empty() && m_chars[0] == '=')
+ xformula->set_formula(ss::formula_grammar_t::gnumeric, m_chars.substr(1));
+
+ xformula->set_shared_formula_index(m_cell_data->shared_formula_id);
+ xformula->commit();
+ break;
+ }
+ case cell_type_unknown:
+ {
+ std::ostringstream os;
+ os << "cell type is unknown (row=" << row << "; col=" << col << ")";
+ warn(os.str());
+ break;
+ }
+ }
+
+ m_cell_data.reset();
+}
+
+void gnumeric_cell_context::push_string(ss::row_t row, ss::col_t col)
+{
+ ss::iface::import_shared_strings* shared_strings = mp_factory->get_shared_strings();
+ if (!shared_strings)
+ return;
+
+ if (m_format_segments.empty())
+ {
+ // unformatted text
+ std::size_t sid = shared_strings->add(m_chars);
+ mp_sheet->set_string(row, col, sid);
+ return;
+ }
+
+ for (const auto& [start, end] : build_format_segment_ranges())
+ {
+ assert(start < end);
+
+ auto t = m_chars.substr(start, end - start);
+
+ // TODO: use segment tree to eliminate this inner loop
+ for (const gnumeric_value_format_segment& vfs : m_format_segments)
+ {
+ if (vfs.value.empty())
+ continue;
+
+ if (start < vfs.start || vfs.end < end)
+ continue;
+
+ // we have format information
+ switch (vfs.type)
+ {
+ case gnumeric_value_format_type::bold:
+ {
+ bool v = to_bool(vfs.value);
+ shared_strings->set_segment_bold(v);
+ break;
+ }
+ case gnumeric_value_format_type::italic:
+ {
+ bool v = to_bool(vfs.value);
+ shared_strings->set_segment_italic(v);
+ break;
+ }
+ case gnumeric_value_format_type::color:
+ {
+ // [red]x[green]x[blue]
+ auto color = parse_gnumeric_rgb_8x(vfs.value);
+ if (color)
+ shared_strings->set_segment_font_color(255, color->red, color->green, color->blue);
+ break;
+ }
+ case gnumeric_value_format_type::family:
+ {
+ if (!vfs.value.empty())
+ shared_strings->set_segment_font_name(vfs.value);
+ break;
+ }
+ case gnumeric_value_format_type::size:
+ {
+ const char* p_end = nullptr;
+ double v = to_double(vfs.value, &p_end);
+ if (p_end > vfs.value.data())
+ {
+ // font size here is stored in 1024ths of a point, likely coming from Pango
+ v /= 1024.0;
+ shared_strings->set_segment_font_size(v);
+ }
+ break;
+ }
+ default:
+ {
+ std::ostringstream os;
+ os << "unsupported format segment type (" << int(vfs.type) << ")";
+ warn(os.str());
+ }
+ }
+ }
+
+ shared_strings->append_segment(t);
+ }
+
+ std::size_t sid = shared_strings->commit_segments();
+ mp_sheet->set_string(row, col, sid);
+}
+
+std::vector<std::pair<std::size_t, std::size_t>> gnumeric_cell_context::build_format_segment_ranges() const
+{
+ if (m_format_segments.empty())
+ return {};
+
+ std::vector<std::size_t> pts;
+ pts.push_back(0);
+ pts.push_back(m_chars.size());
+ for (const auto& seg : m_format_segments)
+ {
+ pts.push_back(seg.start);
+ pts.push_back(seg.end);
+ }
+
+ std::sort(pts.begin(), pts.end());
+ auto last = std::unique(pts.begin(), pts.end());
+ pts.erase(last, pts.end());
+ assert(pts.size() > 2u);
+
+ std::vector<std::pair<std::size_t, std::size_t>> ranges;
+
+ auto it = pts.begin();
+ auto start = *it;
+ for (++it; it != pts.end(); ++it)
+ {
+ auto end = *it;
+ ranges.emplace_back(start, end);
+ start = end;
+ }
+
+ return ranges;
+}
+
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/gnumeric_cell_context.hpp b/src/liborcus/gnumeric_cell_context.hpp
new file mode 100644
index 0000000..b3c5f85
--- /dev/null
+++ b/src/liborcus/gnumeric_cell_context.hpp
@@ -0,0 +1,85 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_GNUMERIC_CELL_CONTEXT_HPP
+#define INCLUDED_ORCUS_GNUMERIC_CELL_CONTEXT_HPP
+
+#include "xml_context_base.hpp"
+#include "gnumeric_types.hpp"
+
+#include <orcus/spreadsheet/types.hpp>
+#include <orcus/string_pool.hpp>
+
+#include <mdds/flat_segment_tree.hpp>
+
+#include <optional>
+
+namespace orcus {
+
+namespace spreadsheet { namespace iface {
+
+class import_factory;
+class import_sheet;
+
+}}
+
+struct gnumeric_cell_data;
+
+class gnumeric_cell_context : public xml_context_base
+{
+ enum cell_type
+ {
+ cell_type_unknown,
+ cell_type_value,
+ cell_type_formula,
+ cell_type_shared_formula,
+ };
+
+ struct cell_data
+ {
+ cell_type type = cell_type_unknown;
+ std::optional<gnumeric_value_type> value_type;
+ spreadsheet::row_t row = 0;
+ spreadsheet::col_t col = 0;
+ spreadsheet::row_t array_rows = 0;
+ spreadsheet::col_t array_cols = 0;
+ std::size_t shared_formula_id = 0;
+ };
+
+public:
+ gnumeric_cell_context(
+ session_context& session_cxt, const tokens& tokens,
+ spreadsheet::iface::import_factory* factory);
+ virtual ~gnumeric_cell_context() override;
+
+ virtual void start_element(xmlns_id_t ns, xml_token_t name, const xml_token_attrs_t& attrs) override;
+ virtual bool end_element(xmlns_id_t ns, xml_token_t name) override;
+ virtual void characters(std::string_view str, bool transient) override;
+
+ void reset(spreadsheet::iface::import_sheet* sheet);
+
+private:
+ void start_cell(const xml_token_attrs_t& attrs);
+ void end_cell();
+ void push_string(spreadsheet::row_t row, spreadsheet::col_t col);
+
+ std::vector<std::pair<std::size_t, std::size_t>> build_format_segment_ranges() const;
+
+private:
+ spreadsheet::iface::import_factory* mp_factory;
+ spreadsheet::iface::import_sheet* mp_sheet;
+
+ std::vector<gnumeric_value_format_segment> m_format_segments;
+ std::optional<cell_data> m_cell_data;
+ std::string_view m_chars;
+ string_pool m_pool;
+};
+
+} // namespace orcus
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/gnumeric_cell_context_test.cpp b/src/liborcus/gnumeric_cell_context_test.cpp
new file mode 100644
index 0000000..80d612c
--- /dev/null
+++ b/src/liborcus/gnumeric_cell_context_test.cpp
@@ -0,0 +1,386 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "gnumeric_cell_context.hpp"
+#include "gnumeric_tokens.hpp"
+#include "gnumeric_namespace_types.hpp"
+#include "gnumeric_token_constants.hpp"
+#include "mock_spreadsheet.hpp"
+#include "session_context.hpp"
+#include <orcus/types.hpp>
+
+#include <iostream>
+#include <string>
+#include <cstdlib>
+
+using namespace orcus;
+using namespace std;
+using namespace orcus::spreadsheet;
+using namespace orcus::spreadsheet::mock;
+
+namespace {
+
+class mock_array_formula : public import_array_formula
+{
+public:
+ virtual void set_range(const range_t& range) override
+ {
+ assert(range.first.row == 19);
+ assert(range.first.column == 111);
+ assert(range.last.row == 20);
+ assert(range.last.column == 113);
+ }
+
+ virtual void set_formula(formula_grammar_t grammar, std::string_view formula) override
+ {
+ assert(grammar == formula_grammar_t::gnumeric);
+ assert(formula == "arrayFormula");
+ }
+
+ virtual void set_result_bool(row_t, col_t, bool) override
+ {
+ }
+
+ virtual void set_result_empty(row_t, col_t) override
+ {
+ }
+
+ virtual void set_result_string(row_t, col_t, std::string_view) override
+ {
+ }
+
+ virtual void set_result_value(row_t, col_t, double) override
+ {
+ }
+
+ virtual void commit() override
+ {
+ }
+};
+
+class mock_formula : public import_formula
+{
+public:
+ virtual void set_position(row_t row, col_t col) override
+ {
+ assert(row == 9);
+ assert(col == 11);
+ }
+
+ virtual void set_formula(formula_grammar_t grammar, std::string_view formula) override
+ {
+ assert(grammar == formula_grammar_t::gnumeric);
+ assert(formula == "formula");
+ }
+
+ virtual void set_shared_formula_index(size_t) override
+ {
+ }
+
+ virtual void set_result_bool(bool) override
+ {
+ }
+
+ virtual void set_result_empty() override
+ {
+ }
+
+ virtual void set_result_string(std::string_view) override
+ {
+ }
+
+ virtual void set_result_value(double) override
+ {
+ }
+
+ virtual void commit() override
+ {
+ }
+};
+
+class mock_sheet : public import_sheet
+{
+ mock_formula m_formula;
+ mock_array_formula m_array_formula;
+public:
+ virtual void set_value(row_t row, col_t col, double val) override
+ {
+ assert(row == 1);
+ assert(col == 2);
+ assert(val == 5.0);
+ }
+
+ virtual void set_bool(row_t row, col_t col, bool val) override
+ {
+ assert(row == 31);
+ assert(col == 32);
+ assert(val == true);
+ }
+
+ virtual void set_string(row_t row, col_t col, string_id_t id) override
+ {
+ assert(row == 10);
+ assert(col == 321);
+ assert(id == 2);
+ }
+
+ virtual iface::import_array_formula* get_array_formula() override
+ {
+ return &m_array_formula;
+ }
+
+ virtual iface::import_formula* get_formula() override
+ {
+ return &m_formula;
+ }
+};
+
+class mock_shared_strings : public import_shared_strings
+{
+public:
+ virtual size_t add(std::string_view s) override
+ {
+ assert(s.size() == 14);
+ assert(s == "14 char string");
+ return 2;
+ }
+};
+
+class mock_factory : public import_factory
+{
+public:
+ virtual iface::import_shared_strings* get_shared_strings()
+ {
+ return &m_shared_strings;
+ }
+
+private:
+ mock_shared_strings m_shared_strings;
+};
+
+void test_cell_value()
+{
+ mock_sheet sheet;
+ import_factory factory;
+ session_context cxt;
+
+ orcus::gnumeric_cell_context context(cxt, orcus::gnumeric_tokens, &factory);
+ context.reset(&sheet);
+
+ orcus::xmlns_id_t ns = NS_gnumeric_gnm;
+ orcus::xml_token_t elem = XML_Cell;
+ orcus::xml_token_attrs_t attrs;
+ attrs.push_back(xml_token_attr_t(NS_gnumeric_gnm, XML_Row, "1", false));
+ attrs.push_back(xml_token_attr_t(NS_gnumeric_gnm, XML_Col, "2", false));
+ attrs.push_back(xml_token_attr_t(NS_gnumeric_gnm, XML_ValueType, "40", false));
+ context.start_element(ns, elem, attrs);
+ context.characters("5", false);
+ context.end_element(ns, elem);
+}
+
+void test_cell_bool()
+{
+ mock_sheet sheet;
+ import_factory factory;
+ session_context cxt;
+
+ orcus::gnumeric_cell_context context(cxt, orcus::gnumeric_tokens, &factory);
+ context.reset(&sheet);
+
+ orcus::xmlns_id_t ns = NS_gnumeric_gnm;
+ orcus::xml_token_t elem = XML_Cell;
+ orcus::xml_token_attrs_t attrs;
+ attrs.push_back(xml_token_attr_t(NS_gnumeric_gnm, XML_Row, "31", false));
+ attrs.push_back(xml_token_attr_t(NS_gnumeric_gnm, XML_Col, "32", false));
+ attrs.push_back(xml_token_attr_t(NS_gnumeric_gnm, XML_ValueType, "20", false));
+ context.start_element(ns, elem, attrs);
+ context.characters("TRUE", false);
+ context.end_element(ns, elem);
+}
+
+void test_cell_string()
+{
+ mock_sheet sheet;
+ mock_factory factory;
+ session_context cxt;
+
+ orcus::gnumeric_cell_context context(cxt, orcus::gnumeric_tokens, &factory);
+ context.reset(&sheet);
+
+ orcus::xmlns_id_t ns = NS_gnumeric_gnm;
+ orcus::xml_token_t elem = XML_Cell;
+ orcus::xml_token_attrs_t attrs;
+ attrs.push_back(xml_token_attr_t(NS_gnumeric_gnm, XML_Row, "10", false));
+ attrs.push_back(xml_token_attr_t(NS_gnumeric_gnm, XML_Col, "321", false));
+ attrs.push_back(xml_token_attr_t(NS_gnumeric_gnm, XML_ValueType, "60", false));
+ context.start_element(ns, elem, attrs);
+ context.characters("14 char string", false);
+ context.end_element(ns, elem);
+}
+
+void test_shared_formula_with_string()
+{
+ class mock_formula_local : public import_formula
+ {
+ public:
+ void set_position(row_t row, col_t col) override
+ {
+ assert(row == 5);
+ assert(col == 15);
+ }
+
+ void set_formula(formula_grammar_t grammar, std::string_view formula) override
+ {
+ assert(grammar == formula_grammar_t::gnumeric);
+ assert(formula == "basicFormulaString");
+ }
+
+ void set_shared_formula_index(size_t index) override
+ {
+ assert(index == 2);
+ }
+
+ void commit() override
+ {
+ }
+ };
+
+ class mock_sheet_local : public import_sheet
+ {
+ mock_formula_local m_formula;
+ public:
+ virtual iface::import_formula* get_formula()
+ {
+ return &m_formula;
+ }
+ };
+
+ mock_sheet_local sheet;
+ mock_factory factory;
+ session_context cxt;
+
+ orcus::gnumeric_cell_context context(cxt, orcus::gnumeric_tokens, &factory);
+ context.reset(&sheet);
+
+ orcus::xmlns_id_t ns = NS_gnumeric_gnm;
+ orcus::xml_token_t elem = XML_Cell;
+ orcus::xml_token_attrs_t attrs;
+
+ attrs.push_back(xml_token_attr_t(NS_gnumeric_gnm, XML_Row, "5", false));
+ attrs.push_back(xml_token_attr_t(NS_gnumeric_gnm, XML_Col, "15", false));
+ attrs.push_back(xml_token_attr_t(NS_gnumeric_gnm, XML_ExprID, "2", false));
+
+ context.start_element(ns, elem, attrs);
+ context.characters("=basicFormulaString", false);
+ context.end_element(ns, elem);
+}
+
+void test_shared_formula_without_string()
+{
+ class mock_formula_local : public import_formula
+ {
+ public:
+ void set_position(row_t row, col_t col) override
+ {
+ assert(row == 6);
+ assert(col == 16);
+ }
+
+ void set_shared_formula_index(size_t index) override
+ {
+ assert(index == 3);
+ }
+
+ void commit() override
+ {
+ }
+ };
+
+ class mock_sheet_local : public import_sheet
+ {
+ mock_formula_local m_formula;
+ public:
+ virtual iface::import_formula* get_formula()
+ {
+ return &m_formula;
+ }
+ };
+
+ mock_sheet_local sheet;
+ mock_factory factory;
+ session_context cxt;
+
+ orcus::gnumeric_cell_context context(cxt, orcus::gnumeric_tokens, &factory);
+ context.reset(&sheet);
+
+ orcus::xmlns_id_t ns = NS_gnumeric_gnm;
+ orcus::xml_token_t elem = XML_Cell;
+ orcus::xml_token_attrs_t attrs;
+
+ attrs.push_back(xml_token_attr_t(NS_gnumeric_gnm, XML_Row, "6", false));
+ attrs.push_back(xml_token_attr_t(NS_gnumeric_gnm, XML_Col, "16", false));
+ attrs.push_back(xml_token_attr_t(NS_gnumeric_gnm, XML_ExprID, "3", false));
+
+ context.start_element(ns, elem, attrs);
+ context.end_element(ns, elem);
+}
+
+void test_cell_formula()
+{
+ mock_sheet sheet;
+ mock_factory factory;
+ session_context cxt;
+
+ orcus::gnumeric_cell_context context(cxt, orcus::gnumeric_tokens, &factory);
+ context.reset(&sheet);
+
+ orcus::xmlns_id_t ns = NS_gnumeric_gnm;
+ orcus::xml_token_t elem = XML_Cell;
+ orcus::xml_token_attrs_t attrs;
+ attrs.push_back(xml_token_attr_t(NS_gnumeric_gnm, XML_Row, "9", false));
+ attrs.push_back(xml_token_attr_t(NS_gnumeric_gnm, XML_Col, "11", false));
+ context.start_element(ns, elem, attrs);
+ context.characters("=formula", false);
+ context.end_element(ns, elem);
+}
+
+void test_cell_array_formula()
+{
+ mock_sheet sheet;
+ mock_factory factory;
+ session_context cxt;
+
+ orcus::gnumeric_cell_context context(cxt, orcus::gnumeric_tokens, &factory);
+ context.reset(&sheet);
+
+ orcus::xmlns_id_t ns = NS_gnumeric_gnm;
+ orcus::xml_token_t elem = XML_Cell;
+ orcus::xml_token_attrs_t attrs;
+ attrs.push_back(xml_token_attr_t(NS_gnumeric_gnm, XML_Row, "19", false));
+ attrs.push_back(xml_token_attr_t(NS_gnumeric_gnm, XML_Col, "111", false));
+ attrs.push_back(xml_token_attr_t(NS_gnumeric_gnm, XML_Rows, "2", false));
+ attrs.push_back(xml_token_attr_t(NS_gnumeric_gnm, XML_Cols, "3", false));
+ context.start_element(ns, elem, attrs);
+ context.characters("arrayFormula", false);
+ context.end_element(ns, elem);
+}
+
+}
+
+int main()
+{
+ test_cell_value();
+ test_cell_bool();
+ test_cell_string();
+ test_shared_formula_with_string();
+ test_shared_formula_without_string();
+ test_cell_formula();
+ test_cell_array_formula();
+
+ return EXIT_SUCCESS;
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/gnumeric_context.cpp b/src/liborcus/gnumeric_context.cpp
new file mode 100644
index 0000000..33c8d44
--- /dev/null
+++ b/src/liborcus/gnumeric_context.cpp
@@ -0,0 +1,453 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "gnumeric_context.hpp"
+#include "gnumeric_token_constants.hpp"
+#include "gnumeric_namespace_types.hpp"
+#include "gnumeric_sheet_context.hpp"
+#include "impl_utils.hpp"
+
+#include <orcus/spreadsheet/import_interface.hpp>
+#include <orcus/spreadsheet/import_interface_styles.hpp>
+
+#include <fstream>
+#include <algorithm>
+
+namespace ss = orcus::spreadsheet;
+
+namespace orcus {
+
+namespace {
+
+std::size_t import_font_style(ss::iface::import_styles& istyles, const gnumeric_style& style)
+{
+ ss::iface::import_font_style* ifont = istyles.start_font_style();
+ ENSURE_INTERFACE(ifont, import_font_style);
+
+ if (style.font_name)
+ ifont->set_name(*style.font_name);
+
+ if (style.font_unit)
+ ifont->set_size(*style.font_unit);
+
+ if (style.bold)
+ ifont->set_bold(*style.bold);
+
+ if (style.italic)
+ ifont->set_italic(*style.italic);
+
+ if (style.underline)
+ {
+ if (*style.underline)
+ ifont->set_underline(ss::underline_t::single_line);
+ else
+ ifont->set_underline(ss::underline_t::none);
+ }
+
+ if (style.strikethrough)
+ {
+ if (*style.strikethrough)
+ {
+ ifont->set_strikethrough_style(ss::strikethrough_style_t::solid);
+ ifont->set_strikethrough_type(ss::strikethrough_type_t::single_type);
+ ifont->set_strikethrough_width(ss::strikethrough_width_t::width_auto);
+ }
+ else
+ {
+ ifont->set_strikethrough_style(ss::strikethrough_style_t::none);
+ ifont->set_strikethrough_type(ss::strikethrough_type_t::none);
+ }
+ }
+
+ if (style.fore)
+ ifont->set_color(255, style.fore->red, style.fore->green, style.fore->blue);
+
+ return ifont->commit();
+}
+
+std::optional<std::size_t> import_fill_style(
+ ss::iface::import_styles& istyles, const gnumeric_style& style)
+{
+ if (style.pattern == ss::fill_pattern_t::none)
+ return {};
+
+ ss::iface::import_fill_style* ifill = istyles.start_fill_style();
+ ENSURE_INTERFACE(ifill, import_fill_style);
+
+ ifill->set_pattern_type(style.pattern);
+
+ if (style.back)
+ ifill->set_fg_color(
+ 255,
+ style.back->red,
+ style.back->green,
+ style.back->blue);
+
+ if (style.pattern_color)
+ ifill->set_bg_color(
+ 255,
+ style.pattern_color->red,
+ style.pattern_color->green,
+ style.pattern_color->blue);
+
+ return ifill->commit();
+}
+
+std::optional<std::size_t> import_border_styles(
+ ss::iface::import_styles& istyles, const gnumeric_style& style)
+{
+ ss::iface::import_border_style* iborder = istyles.start_border_style();
+ ENSURE_INTERFACE(iborder, import_border_style);
+
+ auto func_import_border = [&iborder](ss::border_direction_t dir, const gnumeric_style::border_type& border)
+ {
+ bool has_style = false;
+
+ if (border.style)
+ {
+ iborder->set_style(dir, to_standard_type(*border.style));
+ has_style = true;
+ }
+
+ if (border.color)
+ {
+ iborder->set_color(
+ dir, 255, border.color->red, border.color->green, border.color->blue);
+ has_style = true;
+ }
+
+ return has_style;
+ };
+
+ bool has_style = false;
+
+ if (func_import_border(ss::border_direction_t::top, style.border_top))
+ has_style = true;
+
+ if (func_import_border(ss::border_direction_t::bottom, style.border_bottom))
+ has_style = true;
+
+ if (func_import_border(ss::border_direction_t::left, style.border_left))
+ has_style = true;
+
+ if (func_import_border(ss::border_direction_t::right, style.border_right))
+ has_style = true;
+
+ if (func_import_border(ss::border_direction_t::diagonal_bl_tr, style.border_bl_tr))
+ has_style = true;
+
+ if (func_import_border(ss::border_direction_t::diagonal_tl_br, style.border_br_tl))
+ has_style = true;
+
+ if (!has_style)
+ return {};
+
+ return iborder->commit();
+}
+
+std::optional<std::size_t> import_number_format(
+ ss::iface::import_styles& istyles, const gnumeric_style& style)
+{
+ if (!style.number_format)
+ return {};
+
+ ss::iface::import_number_format* inumfmt = istyles.start_number_format();
+ ENSURE_INTERFACE(inumfmt, import_number_format);
+
+ inumfmt->set_code(*style.number_format);
+ return inumfmt->commit();
+}
+
+} // anonymous namespace
+
+gnumeric_content_xml_context::gnumeric_content_xml_context(
+ session_context& session_cxt, const tokens& tokens, spreadsheet::iface::import_factory* factory) :
+ xml_context_base(session_cxt, tokens),
+ mp_factory(factory),
+ m_sheet_pos(0),
+ m_cxt_names(session_cxt, tokens, factory),
+ m_cxt_sheet(session_cxt, tokens, factory)
+{
+ static const xml_element_validator::rule rules[] = {
+ // parent element -> child element
+ { XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN, NS_gnumeric_gnm, XML_Workbook }, // root element
+ { NS_gnumeric_gnm, XML_SheetNameIndex, NS_gnumeric_gnm, XML_SheetName },
+ { NS_gnumeric_gnm, XML_Sheets, NS_gnumeric_gnm, XML_Sheet },
+ { NS_gnumeric_gnm, XML_Workbook, NS_gnumeric_gnm, XML_Names },
+ { NS_gnumeric_gnm, XML_Workbook, NS_gnumeric_gnm, XML_SheetNameIndex },
+ { NS_gnumeric_gnm, XML_Workbook, NS_gnumeric_gnm, XML_Sheets },
+ };
+
+ init_element_validator(rules, std::size(rules));
+
+ register_child(&m_cxt_names);
+ register_child(&m_cxt_sheet);
+}
+
+gnumeric_content_xml_context::~gnumeric_content_xml_context() = default;
+
+xml_context_base* gnumeric_content_xml_context::create_child_context(xmlns_id_t ns, xml_token_t name)
+{
+ if (ns == NS_gnumeric_gnm)
+ {
+ switch (name)
+ {
+ case XML_Sheet:
+ {
+ m_cxt_sheet.reset(m_sheet_pos++);
+ return &m_cxt_sheet;
+ }
+ case XML_Names:
+ {
+ m_cxt_names.reset();
+ return &m_cxt_names;
+ }
+ }
+ }
+
+ return nullptr;
+}
+
+void gnumeric_content_xml_context::end_child_context(
+ xmlns_id_t ns, xml_token_t name, xml_context_base* child)
+{
+ if (ns == NS_gnumeric_gnm)
+ {
+ switch (name)
+ {
+ case XML_Sheet:
+ {
+ assert(child == &m_cxt_sheet);
+ end_sheet();
+ break;
+ }
+ case XML_Names:
+ {
+ assert(child == &m_cxt_names);
+ end_names();
+ break;
+ }
+ }
+ }
+}
+
+void gnumeric_content_xml_context::start_element(xmlns_id_t ns, xml_token_t name, const xml_token_attrs_t& /*attrs*/)
+{
+ push_stack(ns, name);
+
+ if (ns == NS_gnumeric_gnm)
+ {
+ switch (name)
+ {
+ case XML_SheetNameIndex:
+ m_sheet_pos = 0;
+ break;
+ case XML_SheetName:
+ break;
+ case XML_Sheets:
+ m_sheet_pos = 0;
+ break;
+ default:
+ warn_unhandled();
+ }
+ }
+ else
+ warn_unhandled();
+}
+
+bool gnumeric_content_xml_context::end_element(xmlns_id_t ns, xml_token_t name)
+{
+ if (ns == NS_gnumeric_gnm)
+ {
+ switch (name)
+ {
+ case XML_Sheets:
+ end_sheets();
+ break;
+ }
+ }
+ return pop_stack(ns, name);
+}
+
+void gnumeric_content_xml_context::characters(std::string_view str, bool /*transient*/)
+{
+ if (str.empty())
+ return;
+
+ const auto [ns, name] = get_current_element();
+
+ if (ns == NS_gnumeric_gnm)
+ {
+ switch (name)
+ {
+ case XML_SheetName:
+ {
+ auto* p = mp_factory->append_sheet(m_sheet_pos++, str);
+ if (!p)
+ {
+ std::ostringstream os;
+ os << "failed to append a new sheet named '" << str << "'";
+ warn(os.str());
+ }
+
+ break;
+ }
+ }
+ }
+}
+
+void gnumeric_content_xml_context::end_names()
+{
+ ss::iface::import_named_expression* named_exp = mp_factory->get_named_expression();
+ if (!named_exp)
+ return;
+
+ for (const auto& name : m_cxt_names.get_names())
+ {
+ try
+ {
+ named_exp->set_base_position(name.position);
+ named_exp->set_named_expression(name.name, name.value);
+ named_exp->commit();
+ }
+ catch (const std::exception& e)
+ {
+ std::ostringstream os;
+ os << "failed to commit a named expression named '" << name.name
+ << "': (reason='" << e.what() << "'; value='" << name.value << "')";
+ warn(os.str());
+ }
+ }
+}
+
+void gnumeric_content_xml_context::end_sheet()
+{
+ m_styles.push_back(m_cxt_sheet.pop_styles());
+}
+
+void gnumeric_content_xml_context::end_sheets()
+{
+ import_styles();
+}
+
+void gnumeric_content_xml_context::import_styles()
+{
+ ss::iface::import_styles* istyles = mp_factory->get_styles();
+ if (!istyles)
+ return;
+
+ std::size_t xf_count = 1; // one for the default style
+ for (const auto& sheet_styles : m_styles)
+ xf_count += sheet_styles.size();
+
+ istyles->set_xf_count(ss::xf_category_t::cell, xf_count);
+
+ import_default_styles(istyles);
+ import_cell_styles(istyles);
+}
+
+void gnumeric_content_xml_context::import_default_styles(ss::iface::import_styles* istyles)
+{
+ assert(istyles);
+
+ ss::iface::import_font_style* ifont = istyles->start_font_style();
+ ENSURE_INTERFACE(ifont, imort_font_style);
+ std::size_t id = ifont->commit();
+ assert(id == 0);
+
+ ss::iface::import_fill_style* ifill = istyles->start_fill_style();
+ ENSURE_INTERFACE(ifill, imort_fill_style);
+ id = ifill->commit();
+ assert(id == 0);
+
+ ss::iface::import_border_style* iborder = istyles->start_border_style();
+ ENSURE_INTERFACE(iborder, imort_border_style);
+ id = iborder->commit();
+ assert(id == 0);
+
+ ss::iface::import_cell_protection* iprotection = istyles->start_cell_protection();
+ ENSURE_INTERFACE(iprotection, imort_cell_protection);
+ id = iprotection->commit();
+ assert(id == 0);
+
+ ss::iface::import_number_format* inumfmt = istyles->start_number_format();
+ ENSURE_INTERFACE(inumfmt, import_number_format);
+ id = inumfmt->commit();
+ assert(id == 0);
+
+ ss::iface::import_xf* ixf = istyles->start_xf(ss::xf_category_t::cell);
+ ENSURE_INTERFACE(ixf, import_xf);
+ id = ixf->commit();
+ assert(id == 0);
+
+ ss::iface::import_cell_style* xstyle = istyles->start_cell_style();
+ ENSURE_INTERFACE(xstyle, import_cell_style);
+ xstyle->set_xf(0);
+ xstyle->commit();
+}
+
+void gnumeric_content_xml_context::import_cell_styles(ss::iface::import_styles* istyles)
+{
+ assert(istyles);
+
+ for (const auto& sheet_styles : m_styles)
+ {
+ for (const gnumeric_style& style : sheet_styles)
+ {
+ assert(style.valid()); // should be validated before insertion
+
+ ss::iface::import_sheet* isheet = mp_factory->get_sheet(style.sheet);
+ if (!isheet)
+ continue;
+
+ std::size_t id_font = import_font_style(*istyles, style);
+ auto id_fill = import_fill_style(*istyles, style);
+ auto id_border = import_border_styles(*istyles, style);
+ auto id_numfmt = import_number_format(*istyles, style);
+
+ ss::iface::import_xf* ixf = istyles->start_xf(ss::xf_category_t::cell);
+ ENSURE_INTERFACE(ixf, import_xf);
+
+ ixf->set_font(id_font);
+
+ if (id_fill)
+ ixf->set_fill(*id_fill);
+
+ if (id_border)
+ ixf->set_border(*id_border);
+
+ if (id_numfmt)
+ ixf->set_number_format(*id_numfmt);
+
+ bool apply_alignment =
+ style.hor_align != ss::hor_alignment_t::unknown ||
+ style.ver_align != ss::ver_alignment_t::unknown ||
+ style.wrap_text;
+
+ ixf->set_apply_alignment(apply_alignment);
+
+ if (style.hor_align != ss::hor_alignment_t::unknown)
+ ixf->set_horizontal_alignment(style.hor_align);
+
+ if (style.ver_align != ss::ver_alignment_t::unknown)
+ ixf->set_vertical_alignment(style.ver_align);
+
+ if (style.wrap_text)
+ ixf->set_wrap_text(*style.wrap_text);
+
+ std::size_t xfid = ixf->commit();
+ isheet->set_format(
+ style.region.first.row, style.region.first.column,
+ style.region.last.row, style.region.last.column,
+ xfid);
+ }
+ }
+}
+
+} // namespace orcus
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/gnumeric_context.hpp b/src/liborcus/gnumeric_context.hpp
new file mode 100644
index 0000000..f6d066c
--- /dev/null
+++ b/src/liborcus/gnumeric_context.hpp
@@ -0,0 +1,67 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_GNUMERICCONTEXT_HPP
+#define INCLUDED_ORCUS_GNUMERICCONTEXT_HPP
+
+#include "xml_context_base.hpp"
+#include "gnumeric_sheet_context.hpp"
+#include "gnumeric_names_context.hpp"
+#include "gnumeric_types.hpp"
+
+#include <orcus/spreadsheet/types.hpp>
+
+#include <vector>
+
+namespace orcus {
+
+namespace spreadsheet { namespace iface {
+
+class import_factory;
+class import_sheet;
+class import_styles;
+
+}}
+
+class gnumeric_content_xml_context : public xml_context_base
+{
+public:
+ gnumeric_content_xml_context(
+ session_context& session_cxt, const tokens& tokens,
+ spreadsheet::iface::import_factory* factory);
+
+ virtual ~gnumeric_content_xml_context() override;
+
+ virtual xml_context_base* create_child_context(xmlns_id_t ns, xml_token_t name) override;
+ virtual void end_child_context(xmlns_id_t ns, xml_token_t name, xml_context_base* child) override;
+ virtual void start_element(xmlns_id_t ns, xml_token_t name, const xml_token_attrs_t& attrs) override;
+ virtual bool end_element(xmlns_id_t ns, xml_token_t name) override;
+ virtual void characters(std::string_view str, bool transient) override;
+
+private:
+ void end_names();
+ void end_sheet();
+ void end_sheets();
+
+ void import_styles();
+ void import_default_styles(spreadsheet::iface::import_styles* istyles);
+ void import_cell_styles(spreadsheet::iface::import_styles* istyles);
+
+private:
+ spreadsheet::iface::import_factory* mp_factory;
+ spreadsheet::sheet_t m_sheet_pos;
+
+ gnumeric_names_context m_cxt_names;
+ gnumeric_sheet_context m_cxt_sheet;
+
+ std::vector<std::vector<gnumeric_style>> m_styles;
+};
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/gnumeric_detection_handler.cpp b/src/liborcus/gnumeric_detection_handler.cpp
new file mode 100644
index 0000000..1f0606e
--- /dev/null
+++ b/src/liborcus/gnumeric_detection_handler.cpp
@@ -0,0 +1,83 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "gnumeric_detection_handler.hpp"
+#include "gnumeric_namespace_types.hpp"
+#include "gnumeric_token_constants.hpp"
+#include "xml_context_base.hpp"
+#include "detection_result.hpp"
+
+namespace orcus {
+
+namespace {
+
+/**
+ * Check the xml structure up to the first <gnm:Sheet> element. If all the
+ * structure check passes up to that point, we call it "detected".
+ */
+class gnumeric_detection_context : public xml_context_base
+{
+public:
+ gnumeric_detection_context(session_context& session_cxt, const tokens& tokens) :
+ xml_context_base(session_cxt, tokens) {}
+
+ virtual xml_context_base* create_child_context(xmlns_id_t, xml_token_t) { return nullptr; }
+ virtual void characters(std::string_view, bool) {}
+ virtual void end_child_context(xmlns_id_t, xml_token_t, xml_context_base*) {}
+
+ virtual void start_element(xmlns_id_t ns, xml_token_t name, const::std::vector<xml_token_attr_t>& /*attrs*/)
+ {
+ xml_token_pair_t parent = push_stack(ns, name);
+ if (ns == NS_gnumeric_gnm)
+ {
+ switch (name)
+ {
+ case XML_Workbook:
+ xml_element_expected(parent, XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN);
+ break;
+ case XML_Version:
+ case XML_Attributes:
+ case XML_Calculation:
+ case XML_SheetNameIndex:
+ case XML_Geometry:
+ case XML_Sheets:
+ xml_element_expected(parent, NS_gnumeric_gnm, XML_Workbook);
+ break;
+ case XML_Attribute:
+ xml_element_expected(parent, NS_gnumeric_gnm, XML_Attributes);
+ break;
+ case XML_SheetName:
+ xml_element_expected(parent, NS_gnumeric_gnm, XML_SheetNameIndex);
+ break;
+ case XML_Sheet:
+ xml_element_expected(parent, NS_gnumeric_gnm, XML_Sheets);
+ throw detection_result(true);
+ break;
+ default:
+ ;
+ }
+ }
+ }
+
+ virtual bool end_element(xmlns_id_t ns, xml_token_t name)
+ {
+ return pop_stack(ns, name);
+ }
+};
+
+}
+
+gnumeric_detection_handler::gnumeric_detection_handler(session_context& session_cxt, const tokens& t) :
+ xml_stream_handler(session_cxt, t, std::make_unique<gnumeric_detection_context>(session_cxt, t)) {}
+
+gnumeric_detection_handler::~gnumeric_detection_handler() {}
+
+void gnumeric_detection_handler::start_document() {}
+void gnumeric_detection_handler::end_document() {}
+
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/gnumeric_detection_handler.hpp b/src/liborcus/gnumeric_detection_handler.hpp
new file mode 100644
index 0000000..e7644a3
--- /dev/null
+++ b/src/liborcus/gnumeric_detection_handler.hpp
@@ -0,0 +1,31 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef ORCUS_GNUMERIC_DETECTION_HANDLER_HPP
+#define ORCUS_GNUMERIC_DETECTION_HANDLER_HPP
+
+#include "xml_stream_handler.hpp"
+
+namespace orcus {
+
+struct session_context;
+class tokens;
+
+class gnumeric_detection_handler : public xml_stream_handler
+{
+public:
+ gnumeric_detection_handler(session_context& session_cxt, const tokens& t);
+ virtual ~gnumeric_detection_handler();
+
+ virtual void start_document();
+ virtual void end_document();
+};
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/gnumeric_filter_context.cpp b/src/liborcus/gnumeric_filter_context.cpp
new file mode 100644
index 0000000..f15d2a0
--- /dev/null
+++ b/src/liborcus/gnumeric_filter_context.cpp
@@ -0,0 +1,256 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "gnumeric_filter_context.hpp"
+#include "gnumeric_token_constants.hpp"
+#include "gnumeric_namespace_types.hpp"
+
+#include <orcus/spreadsheet/import_interface.hpp>
+#include <orcus/measurement.hpp>
+
+#include <iostream>
+#include <optional>
+
+namespace ss = orcus::spreadsheet;
+
+namespace orcus {
+
+namespace {
+
+enum gnumeric_filter_field_op_t
+{
+ filter_equal,
+ filter_greaterThan,
+ filter_lessThan,
+ filter_greaterThanEqual,
+ filter_lessThanEqual,
+ filter_notEqual,
+ filter_op_invalid
+};
+
+enum gnumeric_filter_field_type_t
+{
+ filter_expr,
+ filter_blanks,
+ filter_nonblanks,
+ filter_type_invalid
+};
+
+} // anonymous namespace
+
+gnumeric_filter_context::gnumeric_filter_context(
+ session_context& session_cxt, const tokens& tokens,
+ ss::iface::import_factory* factory) :
+ xml_context_base(session_cxt, tokens),
+ mp_factory(factory)
+{
+ static const xml_element_validator::rule rules[] = {
+ // parent element -> child element
+ { XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN, NS_gnumeric_gnm, XML_Filter }, // root element
+ { NS_gnumeric_gnm, XML_Filter, NS_gnumeric_gnm, XML_Field },
+ };
+
+ init_element_validator(rules, std::size(rules));
+}
+
+gnumeric_filter_context::~gnumeric_filter_context() = default;
+
+void gnumeric_filter_context::start_element(
+ xmlns_id_t ns, xml_token_t name, const std::vector<xml_token_attr_t>& attrs)
+{
+ push_stack(ns, name);
+
+ if (ns == NS_gnumeric_gnm)
+ {
+ switch (name)
+ {
+ case XML_Filter:
+ {
+ start_filter(attrs);
+ break;
+ }
+ case XML_Field:
+ {
+ start_field(attrs);
+ break;
+ }
+ default:
+ warn_unhandled();
+ }
+ }
+ else
+ warn_unhandled();
+}
+
+bool gnumeric_filter_context::end_element(xmlns_id_t ns, xml_token_t name)
+{
+ if (ns == NS_gnumeric_gnm)
+ {
+ switch (name)
+ {
+ case XML_Filter:
+ end_filter();
+ break;
+ case XML_Field:
+ end_field();
+ break;
+ }
+ }
+
+ return pop_stack(ns, name);
+}
+
+void gnumeric_filter_context::reset(spreadsheet::iface::import_sheet* sheet)
+{
+ mp_sheet = sheet;
+ mp_auto_filter = nullptr;
+}
+
+void gnumeric_filter_context::start_filter(const xml_token_attrs_t& attrs)
+{
+ if (!mp_sheet)
+ return;
+
+ ss::iface::import_reference_resolver* resolver =
+ mp_factory->get_reference_resolver(ss::formula_ref_context_t::global);
+
+ if (!resolver)
+ return;
+
+ mp_auto_filter = mp_sheet->get_auto_filter();
+ if (!mp_auto_filter)
+ return;
+
+ std::optional<spreadsheet::range_t> area;
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ switch (attr.name)
+ {
+ case XML_Area:
+ area = to_rc_range(resolver->resolve_range(attr.value));
+ break;
+ default:
+ ;
+ }
+ }
+
+ if (!area)
+ {
+ mp_auto_filter = nullptr;
+ return;
+ }
+
+ mp_auto_filter->set_range(*area);
+}
+
+void gnumeric_filter_context::start_field(const xml_token_attrs_t& attrs)
+{
+ if (!mp_auto_filter)
+ return;
+
+ gnumeric_filter_field_type_t filter_field_type = filter_type_invalid;
+ gnumeric_filter_field_op_t filter_op = filter_op_invalid;
+
+ ss::col_t col = -1;
+ std::string_view filter_value_type;
+ std::string_view filter_value;
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ switch (attr.name)
+ {
+ case XML_Index:
+ {
+ col = to_long(attr.value.data());
+ break;
+ }
+ case XML_Type:
+ {
+ if (attr.value == "expr")
+ filter_field_type = filter_expr;
+ else if (attr.value == "blanks")
+ filter_field_type = filter_blanks;
+ else if (attr.value == "nonblanks")
+ filter_field_type = filter_nonblanks;
+ break;
+ }
+ case XML_Op0:
+ {
+ if (attr.value == "eq")
+ filter_op = filter_equal;
+ else if (attr.value == "gt")
+ filter_op = filter_greaterThan;
+ else if (attr.value == "lt")
+ filter_op = filter_lessThan;
+ else if (attr.value == "gte")
+ filter_op = filter_greaterThanEqual;
+ else if (attr.value == "lte")
+ filter_op = filter_lessThanEqual;
+ else if (attr.value == "ne")
+ filter_op = filter_notEqual;
+ break;
+ }
+ case XML_Value0:
+ {
+ filter_value_type = attr.value;
+ break;
+ }
+ case XML_ValueType0:
+ {
+ filter_value = attr.value;
+ break;
+ }
+ }
+ }
+
+ if (col < 0)
+ return;
+
+ mp_auto_filter->set_column(col);
+
+ switch (filter_field_type)
+ {
+ case filter_expr:
+ {
+ // only equal supported in API yet
+ if (filter_op != filter_equal)
+ return;
+
+ // import condition for integer (30), double(40) and string (60)
+ if (filter_value_type == "30" ||
+ filter_value_type == "40" ||
+ filter_value_type == "60" )
+ {
+ mp_auto_filter->append_column_match_value(filter_value);
+ }
+ break;
+ }
+ case filter_blanks:
+ break;
+ case filter_nonblanks:
+ break;
+ case filter_type_invalid:
+ break;
+ }
+}
+
+void gnumeric_filter_context::end_filter()
+{
+ if (mp_auto_filter)
+ mp_auto_filter->commit();
+}
+
+void gnumeric_filter_context::end_field()
+{
+ if (mp_auto_filter)
+ mp_auto_filter->commit_column();
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/gnumeric_filter_context.hpp b/src/liborcus/gnumeric_filter_context.hpp
new file mode 100644
index 0000000..b8c794b
--- /dev/null
+++ b/src/liborcus/gnumeric_filter_context.hpp
@@ -0,0 +1,54 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#pragma once
+
+#include "xml_context_base.hpp"
+
+#include <orcus/spreadsheet/types.hpp>
+
+namespace orcus {
+
+namespace spreadsheet { namespace iface {
+
+class import_factory;
+class import_sheet;
+class import_auto_filter;
+
+}}
+
+class gnumeric_filter_context : public xml_context_base
+{
+public:
+ gnumeric_filter_context(
+ session_context& session_cxt, const tokens& tokens,
+ spreadsheet::iface::import_factory* factory);
+ virtual ~gnumeric_filter_context() override;
+
+ virtual void start_element(xmlns_id_t ns, xml_token_t name, const std::vector<xml_token_attr_t>& attrs) override;
+
+ virtual bool end_element(xmlns_id_t ns, xml_token_t name) override;
+
+ void reset(spreadsheet::iface::import_sheet* sheet);
+
+private:
+ void start_filter(const xml_token_attrs_t& attrs);
+ void start_field(const xml_token_attrs_t& attrs);
+
+ void end_filter();
+ void end_field();
+
+
+private:
+ spreadsheet::iface::import_factory* mp_factory = nullptr;
+ spreadsheet::iface::import_sheet* mp_sheet = nullptr;
+ spreadsheet::iface::import_auto_filter* mp_auto_filter = nullptr;
+};
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/gnumeric_handler.cpp b/src/liborcus/gnumeric_handler.cpp
new file mode 100644
index 0000000..67e428f
--- /dev/null
+++ b/src/liborcus/gnumeric_handler.cpp
@@ -0,0 +1,32 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "gnumeric_handler.hpp"
+#include "gnumeric_context.hpp"
+
+namespace orcus {
+
+gnumeric_content_xml_handler::gnumeric_content_xml_handler(
+ session_context& session_cxt, const tokens& t, spreadsheet::iface::import_factory* factory) :
+ xml_stream_handler(session_cxt, t, std::make_unique<gnumeric_content_xml_context>(session_cxt, t, factory))
+{
+}
+
+gnumeric_content_xml_handler::~gnumeric_content_xml_handler()
+{
+}
+
+void gnumeric_content_xml_handler::start_document()
+{
+}
+
+void gnumeric_content_xml_handler::end_document()
+{
+}
+
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/gnumeric_handler.hpp b/src/liborcus/gnumeric_handler.hpp
new file mode 100644
index 0000000..1c389c3
--- /dev/null
+++ b/src/liborcus/gnumeric_handler.hpp
@@ -0,0 +1,36 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef __ORCUS_GNUMERICHANDLER_HPP__
+#define __ORCUS_GNUMERICHANDLER_HPP__
+
+#include "xml_stream_handler.hpp"
+
+namespace orcus {
+
+struct session_context;
+class tokens;
+
+namespace spreadsheet { namespace iface { class import_factory; }}
+
+/**
+ * Handler for parsing the content.xml part.
+ */
+class gnumeric_content_xml_handler : public xml_stream_handler
+{
+public:
+ gnumeric_content_xml_handler(session_context& session_cxt, const tokens& t, spreadsheet::iface::import_factory* factory);
+ virtual ~gnumeric_content_xml_handler();
+
+ virtual void start_document();
+ virtual void end_document();
+};
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/gnumeric_names_context.cpp b/src/liborcus/gnumeric_names_context.cpp
new file mode 100644
index 0000000..9c008af
--- /dev/null
+++ b/src/liborcus/gnumeric_names_context.cpp
@@ -0,0 +1,110 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "gnumeric_names_context.hpp"
+#include "gnumeric_token_constants.hpp"
+#include "gnumeric_namespace_types.hpp"
+
+#include <orcus/spreadsheet/import_interface.hpp>
+
+#include <iostream>
+
+namespace ss = orcus::spreadsheet;
+
+namespace orcus {
+
+gnumeric_names_context::gnumeric_names_context(
+ session_context& session_cxt, const tokens& tokens,
+ spreadsheet::iface::import_factory* factory) :
+ xml_context_base(session_cxt, tokens),
+ mp_factory(factory)
+{
+ static const xml_element_validator::rule rules[] = {
+ // parent element -> child element
+ { XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN, NS_gnumeric_gnm, XML_Names }, // root element
+ { NS_gnumeric_gnm, XML_Names, NS_gnumeric_gnm, XML_Name },
+ { NS_gnumeric_gnm, XML_Name, NS_gnumeric_gnm, XML_name },
+ { NS_gnumeric_gnm, XML_Name, NS_gnumeric_gnm, XML_value },
+ { NS_gnumeric_gnm, XML_Name, NS_gnumeric_gnm, XML_position },
+ };
+
+ init_element_validator(rules, std::size(rules));
+}
+
+gnumeric_names_context::~gnumeric_names_context() = default;
+
+void gnumeric_names_context::start_element(
+ xmlns_id_t ns, xml_token_t name, const std::vector<xml_token_attr_t>& /*attrs*/)
+{
+ push_stack(ns, name);
+
+ if (ns == NS_gnumeric_gnm)
+ {
+ switch (name)
+ {
+ case XML_Name:
+ m_current_name.reset();
+ break;
+ }
+ }
+}
+
+bool gnumeric_names_context::end_element(xmlns_id_t ns, xml_token_t name)
+{
+ if (ns == NS_gnumeric_gnm)
+ {
+ switch (name)
+ {
+ case XML_Name:
+ m_named_exps.push_back(m_current_name);
+ break;
+ }
+ }
+ return pop_stack(ns, name);
+}
+
+void gnumeric_names_context::characters(std::string_view str, bool transient)
+{
+ const auto [ns, name] = get_current_element();
+
+ if (ns == NS_gnumeric_gnm)
+ {
+ switch (name)
+ {
+ case XML_name:
+ m_current_name.name = transient ? intern(str) : str;
+ break;
+ case XML_value:
+ m_current_name.value = transient ? intern(str) : str;
+ break;
+ case XML_position:
+ {
+ ss::iface::import_reference_resolver* resolver =
+ mp_factory->get_reference_resolver(ss::formula_ref_context_t::global);
+
+ if (resolver)
+ m_current_name.position = resolver->resolve_address(str);
+
+ break;
+ }
+ }
+ }
+}
+
+void gnumeric_names_context::reset()
+{
+ m_named_exps.clear();
+}
+
+const std::vector<gnumeric_named_exp>& gnumeric_names_context::get_names() const
+{
+ return m_named_exps;
+}
+
+} // namespace orcus
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/gnumeric_names_context.hpp b/src/liborcus/gnumeric_names_context.hpp
new file mode 100644
index 0000000..1fb0416
--- /dev/null
+++ b/src/liborcus/gnumeric_names_context.hpp
@@ -0,0 +1,49 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#pragma once
+
+#include "xml_context_base.hpp"
+#include "gnumeric_types.hpp"
+
+#include <vector>
+
+namespace orcus {
+
+namespace spreadsheet { namespace iface {
+
+class import_factory;
+
+}}
+
+class gnumeric_names_context : public xml_context_base
+{
+public:
+ gnumeric_names_context(
+ session_context& session_cxt, const tokens& tokens,
+ spreadsheet::iface::import_factory* factory);
+
+ virtual ~gnumeric_names_context() override;
+
+ virtual void start_element(
+ xmlns_id_t ns, xml_token_t name, const std::vector<xml_token_attr_t>& attrs) override;
+ virtual bool end_element(xmlns_id_t ns, xml_token_t name) override;
+ virtual void characters(std::string_view str, bool transient) override;
+
+ void reset();
+
+ const std::vector<gnumeric_named_exp>& get_names() const;
+
+private:
+ spreadsheet::iface::import_factory* mp_factory = nullptr;
+ std::vector<gnumeric_named_exp> m_named_exps;
+ gnumeric_named_exp m_current_name;
+};
+
+} // namespace orcus
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/gnumeric_namespace_types.cpp b/src/liborcus/gnumeric_namespace_types.cpp
new file mode 100644
index 0000000..1ff0ec9
--- /dev/null
+++ b/src/liborcus/gnumeric_namespace_types.cpp
@@ -0,0 +1,38 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "gnumeric_namespace_types.hpp"
+#include "odf_namespace_types.hpp"
+
+namespace orcus {
+
+const xmlns_id_t NS_gnumeric_dc = "http://purl.org/dc/elements/1.1/";
+const xmlns_id_t NS_gnumeric_gnm = "http://www.gnumeric.org/v10.dtd";
+const xmlns_id_t NS_gnumeric_ooo = "http://openoffice.org/2004/office";
+const xmlns_id_t NS_gnumeric_xlink = "http://www.w3.org/1999/xlink";
+const xmlns_id_t NS_gnumeric_xsi = "http://www.w3.org/2001/XMLSchema-instance";
+
+namespace {
+
+xmlns_id_t gnumeric_ns[] = {
+ NS_gnumeric_dc,
+ NS_gnumeric_gnm,
+ NS_gnumeric_ooo,
+ NS_gnumeric_xlink,
+ NS_gnumeric_xsi,
+
+ NS_odf_meta,
+ NS_odf_office,
+ nullptr
+};
+
+}
+
+const xmlns_id_t* NS_gnumeric_all = gnumeric_ns;
+
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/gnumeric_namespace_types.hpp b/src/liborcus/gnumeric_namespace_types.hpp
new file mode 100644
index 0000000..2d6b7ab
--- /dev/null
+++ b/src/liborcus/gnumeric_namespace_types.hpp
@@ -0,0 +1,26 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef __ORCUS_GNUMERIC_NAMESPACE_TYPES_HPP__
+#define __ORCUS_GNUMERIC_NAMESPACE_TYPES_HPP__
+
+#include "orcus/types.hpp"
+
+namespace orcus {
+
+extern const xmlns_id_t NS_gnumeric_dc;
+extern const xmlns_id_t NS_gnumeric_gnm;
+extern const xmlns_id_t NS_gnumeric_ooo;
+extern const xmlns_id_t NS_gnumeric_xlink;
+extern const xmlns_id_t NS_gnumeric_xsi;
+
+extern const xmlns_id_t* NS_gnumeric_all;
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/gnumeric_sheet_context.cpp b/src/liborcus/gnumeric_sheet_context.cpp
new file mode 100644
index 0000000..aecca4c
--- /dev/null
+++ b/src/liborcus/gnumeric_sheet_context.cpp
@@ -0,0 +1,819 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "gnumeric_sheet_context.hpp"
+#include "gnumeric_cell_context.hpp"
+#include "gnumeric_token_constants.hpp"
+#include "gnumeric_namespace_types.hpp"
+#include "impl_utils.hpp"
+
+#include <orcus/spreadsheet/import_interface.hpp>
+#include <orcus/spreadsheet/import_interface_styles.hpp>
+#include <orcus/measurement.hpp>
+
+namespace ss = orcus::spreadsheet;
+
+namespace orcus {
+
+namespace {
+
+ss::condition_operator_t get_condition_operator(int val)
+{
+ switch (val)
+ {
+ case 0:
+ return ss::condition_operator_t::between;
+ case 1:
+ return ss::condition_operator_t::not_between;
+ case 2:
+ return ss::condition_operator_t::equal;
+ case 3:
+ return ss::condition_operator_t::not_equal;
+ case 4:
+ return ss::condition_operator_t::greater;
+ case 5:
+ return ss::condition_operator_t::less;
+ case 6:
+ return ss::condition_operator_t::greater_equal;
+ case 7:
+ return ss::condition_operator_t::less_equal;
+ case 8:
+ return ss::condition_operator_t::expression;
+ case 9:
+ case 10:
+ case 11:
+ case 12:
+ case 13:
+ case 14:
+ case 15:
+ break;
+ case 16:
+ return ss::condition_operator_t::contains;
+ case 17:
+ return ss::condition_operator_t::not_contains;
+ case 18:
+ return ss::condition_operator_t::begins_with;
+ case 19:
+ break;
+ case 20:
+ return ss::condition_operator_t::ends_with;
+ case 21:
+ break;
+ case 22:
+ return ss::condition_operator_t::contains_error;
+ case 23:
+ return ss::condition_operator_t::contains_no_error;
+ default:
+ break;
+ }
+ return ss::condition_operator_t::unknown;
+}
+
+} // anonymous namespace
+
+gnumeric_sheet_context::gnumeric_sheet_context(
+ session_context& session_cxt, const tokens& tokens, ss::iface::import_factory* factory) :
+ xml_context_base(session_cxt, tokens),
+ mp_factory(factory),
+ m_cxt_cell(session_cxt, tokens, factory),
+ m_cxt_filter(session_cxt, tokens, factory),
+ m_cxt_names(session_cxt, tokens, factory),
+ m_cxt_styles(session_cxt, tokens, factory)
+{
+ static const xml_element_validator::rule rules[] = {
+ // parent element -> child element
+ { XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN, NS_gnumeric_gnm, XML_Sheet }, // root element
+ { NS_gnumeric_gnm, XML_Cells, NS_gnumeric_gnm, XML_Cell },
+ { NS_gnumeric_gnm, XML_Cols, NS_gnumeric_gnm, XML_ColInfo },
+ { NS_gnumeric_gnm, XML_MergedRegions, NS_gnumeric_gnm, XML_Merge },
+ { NS_gnumeric_gnm, XML_Rows, NS_gnumeric_gnm, XML_RowInfo },
+ { NS_gnumeric_gnm, XML_Sheet, NS_gnumeric_gnm, XML_Cells },
+ { NS_gnumeric_gnm, XML_Sheet, NS_gnumeric_gnm, XML_Cols },
+ { NS_gnumeric_gnm, XML_Sheet, NS_gnumeric_gnm, XML_Filters },
+ { NS_gnumeric_gnm, XML_Sheet, NS_gnumeric_gnm, XML_MergedRegions },
+ { NS_gnumeric_gnm, XML_Sheet, NS_gnumeric_gnm, XML_Name },
+ { NS_gnumeric_gnm, XML_Sheet, NS_gnumeric_gnm, XML_Names },
+ { NS_gnumeric_gnm, XML_Sheet, NS_gnumeric_gnm, XML_Rows },
+ { NS_gnumeric_gnm, XML_Sheet, NS_gnumeric_gnm, XML_Selections },
+ { NS_gnumeric_gnm, XML_Sheet, NS_gnumeric_gnm, XML_SheetLayout },
+ { NS_gnumeric_gnm, XML_Sheet, NS_gnumeric_gnm, XML_Styles },
+ };
+
+ init_element_validator(rules, std::size(rules));
+
+ register_child(&m_cxt_cell);
+ register_child(&m_cxt_filter);
+ register_child(&m_cxt_names);
+ register_child(&m_cxt_styles);
+}
+
+gnumeric_sheet_context::~gnumeric_sheet_context() = default;
+
+xml_context_base* gnumeric_sheet_context::create_child_context(xmlns_id_t ns, xml_token_t name)
+{
+ if (ns == NS_gnumeric_gnm)
+ {
+ switch (name)
+ {
+ case XML_Cells:
+ {
+ m_cxt_cell.reset(mp_sheet);
+ return &m_cxt_cell;
+ }
+ case XML_Filter:
+ {
+ m_cxt_filter.reset(mp_sheet);
+ return &m_cxt_filter;
+ }
+ case XML_Names:
+ {
+ m_cxt_names.reset();
+ return &m_cxt_names;
+ }
+ case XML_Styles:
+ {
+ m_cxt_styles.reset(m_sheet);
+ return &m_cxt_styles;
+ }
+ }
+ }
+
+ return nullptr;
+}
+
+void gnumeric_sheet_context::end_child_context(xmlns_id_t ns, xml_token_t name, xml_context_base* child)
+{
+ if (ns == NS_gnumeric_gnm)
+ {
+ switch (name)
+ {
+ case XML_Names:
+ {
+ assert(child == &m_cxt_names);
+ end_names();
+ break;
+ }
+ case XML_Styles:
+ {
+ assert(child == &m_cxt_styles);
+ end_styles();
+ break;
+ }
+ }
+ }
+}
+
+void gnumeric_sheet_context::start_element(xmlns_id_t ns, xml_token_t name, const xml_token_attrs_t& attrs)
+{
+ push_stack(ns, name);
+
+ if (ns == NS_gnumeric_gnm)
+ {
+ switch (name)
+ {
+ case XML_Font:
+ start_font(attrs);
+ break;
+ case XML_Merge:
+ m_merge_area = std::string_view{};
+ break;
+ case XML_Name:
+ start_name(attrs);
+ break;
+ case XML_Style:
+ start_style(attrs);
+ break;
+ case XML_StyleRegion:
+ start_style_region(attrs);
+ break;
+ case XML_ColInfo:
+ start_col(attrs);
+ break;
+ case XML_RowInfo:
+ start_row(attrs);
+ break;
+ case XML_Condition:
+ {
+ if (!m_region_data->contains_conditional_format)
+ {
+ m_region_data->contains_conditional_format = true;
+ end_style(false);
+ }
+ start_condition(attrs);
+ break;
+ }
+ case XML_Expression0:
+ case XML_Expression1:
+ break;
+ default:
+ warn_unhandled();
+ }
+ }
+ else
+ warn_unhandled();
+}
+
+bool gnumeric_sheet_context::end_element(xmlns_id_t ns, xml_token_t name)
+{
+ if (ns == NS_gnumeric_gnm)
+ {
+ switch(name)
+ {
+ case XML_Font:
+ end_font();
+ break;
+ case XML_Merge:
+ end_merge();
+ break;
+ case XML_Name:
+ end_name();
+ break;
+ case XML_Style:
+ {
+ xml_token_pair_t parent = get_parent_element();
+ if (parent.second == XML_Condition)
+ {
+ end_style(true);
+ }
+ else
+ {
+ // The conditional format entry contains a mandatory style element
+ // Therefore when we have a conditional format the end_style method
+ // is already called in start_element of the XML_Condition case.
+ if (!m_region_data->contains_conditional_format)
+ {
+ end_style(false);
+ }
+ }
+ break;
+ }
+ case XML_StyleRegion:
+ end_style_region();
+ break;
+ case XML_Condition:
+ end_condition();
+ break;
+ case XML_Expression0:
+ case XML_Expression1:
+ end_expression();
+ break;
+ }
+ }
+
+ return pop_stack(ns, name);
+}
+
+void gnumeric_sheet_context::characters(std::string_view str, bool transient)
+{
+ const auto [ns, name] = get_current_element();
+
+ if (ns == NS_gnumeric_gnm)
+ {
+ switch (name)
+ {
+ case XML_Merge:
+ {
+ m_merge_area = transient ? intern(str) : str;
+ break;
+ }
+ case XML_Name:
+ {
+ m_name = transient ? intern(str) : str;
+ break;
+ }
+ default:
+ m_chars = transient ? intern(str) : str;
+ }
+ }
+ else
+ {
+ m_chars = transient ? intern(str) : str;
+ }
+}
+
+void gnumeric_sheet_context::reset(ss::sheet_t sheet)
+{
+ mp_sheet = nullptr;
+ mp_xf = nullptr;
+ m_sheet = sheet;
+
+ m_region_data.reset();
+
+ m_front_color.red = 0;
+ m_front_color.green = 0;
+ m_front_color.blue = 0;
+
+ m_chars = std::string_view{};
+ m_name = std::string_view{};
+ m_merge_area = std::string_view{};
+}
+
+std::vector<gnumeric_style> gnumeric_sheet_context::pop_styles()
+{
+ return std::move(m_styles);
+}
+
+void gnumeric_sheet_context::start_font(const xml_token_attrs_t& attrs)
+{
+ auto* styles = mp_factory->get_styles();
+ if (!styles)
+ return;
+
+ auto* font_style = styles->start_font_style();
+ ENSURE_INTERFACE(font_style, import_font_style);
+
+ for (const auto& attr : attrs)
+ {
+ switch (attr.name)
+ {
+ case XML_Unit:
+ {
+ double n = atoi(attr.value.data());
+ font_style->set_size(n);
+ break;
+ }
+ case XML_Bold:
+ {
+ bool b = atoi(attr.value.data()) != 0;
+ font_style->set_bold(b);
+ break;
+ }
+ case XML_Italic:
+ {
+ bool b = atoi(attr.value.data()) != 0;
+ font_style->set_italic(b);
+ break;
+ }
+ case XML_Underline:
+ {
+ int n = atoi(attr.value.data());
+ switch (n)
+ {
+ case 0:
+ font_style->set_underline(ss::underline_t::none);
+ break;
+ case 1:
+ font_style->set_underline(ss::underline_t::single_line);
+ break;
+ case 2:
+ font_style->set_underline(ss::underline_t::double_line);
+ break;
+ }
+ break;
+ }
+ }
+ }
+}
+
+void gnumeric_sheet_context::start_col(const xml_token_attrs_t& attrs)
+{
+ if (!mp_sheet)
+ return;
+
+ ss::iface::import_sheet_properties* sheet_props = mp_sheet->get_sheet_properties();
+ if (!sheet_props)
+ return;
+
+ long col = 0;
+ long col_span = 1;
+ double col_width = 0.0;
+ bool col_hidden = false;
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ switch (attr.name)
+ {
+ case XML_No:
+ {
+ col = to_long(attr.value);
+ break;
+ }
+ case XML_Unit:
+ {
+ col_width = to_double(attr.value);
+ break;
+ }
+ case XML_Count:
+ {
+ col_span = to_long(attr.value);
+ break;
+ }
+ case XML_Hidden:
+ {
+ col_hidden = to_bool(attr.value);
+ break;
+ }
+ }
+ }
+
+ sheet_props->set_column_width(col, col_span, col_width, length_unit_t::point);
+ sheet_props->set_column_hidden(col, col_span, col_hidden);
+}
+
+void gnumeric_sheet_context::start_row(const xml_token_attrs_t& attrs)
+{
+ if (!mp_sheet)
+ return;
+
+ ss::iface::import_sheet_properties* sheet_props = mp_sheet->get_sheet_properties();
+ if (!sheet_props)
+ return;
+
+ long row = 0;
+ long row_span = 1;
+ double row_height = 0.0;
+ bool row_hidden = false;
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ switch (attr.name)
+ {
+ case XML_No:
+ {
+ row = to_long(attr.value);
+ break;
+ }
+ case XML_Unit:
+ {
+ row_height = to_double(attr.value);
+ break;
+ }
+ case XML_Count:
+ {
+ row_span = to_long(attr.value);
+ break;
+ }
+ case XML_Hidden:
+ {
+ row_hidden = to_bool(attr.value);
+ break;
+ }
+ }
+ }
+
+ for (long i = 0; i < row_span; ++i)
+ {
+ sheet_props->set_row_height(row + i, row_height, length_unit_t::point);
+ sheet_props->set_row_hidden(row + i, row_hidden);
+ }
+}
+
+void gnumeric_sheet_context::start_style(const xml_token_attrs_t& attrs)
+{
+ auto* styles = mp_factory->get_styles();
+ if (!styles)
+ return;
+
+ auto* fill_style = styles->start_fill_style();
+ ENSURE_INTERFACE(fill_style, import_fill_style);
+
+ auto* cell_protection = styles->start_cell_protection();
+ ENSURE_INTERFACE(cell_protection, import_cell_protection);
+
+ auto* number_format = styles->start_number_format();
+ ENSURE_INTERFACE(number_format, import_number_format);
+
+ mp_xf = styles->start_xf(ss::xf_category_t::cell);
+ ENSURE_INTERFACE(mp_xf, import_xf);
+
+ bool fill_set = false;
+ bool protection_set = false;
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ switch (attr.name)
+ {
+ case XML_Fore:
+ {
+ auto color = parse_gnumeric_rgb(attr.value);
+ if (!color)
+ break;
+
+ fill_style->set_fg_color(255, color->red, color->green, color->blue);
+ fill_set = true;
+ m_front_color = *color;
+ break;
+ }
+ case XML_Back:
+ {
+ auto color = parse_gnumeric_rgb(attr.value);
+ if (!color)
+ break;
+
+ fill_style->set_bg_color(255, color->red, color->green, color->blue);
+ fill_set = true;
+ break;
+ }
+ case XML_Hidden:
+ {
+ bool b = atoi(attr.value.data());
+ cell_protection->set_hidden(b);
+
+ protection_set = true;
+ break;
+ }
+ case XML_Locked:
+ {
+ bool b = atoi(attr.value.data());
+ cell_protection->set_locked(b);
+
+ protection_set = true;
+ break;
+ }
+ case XML_Format:
+ {
+ if (attr.value != "General")
+ {
+ number_format->set_code(attr.value);
+ std::size_t index = number_format->commit();
+ mp_xf->set_number_format(index);
+ }
+ break;
+ }
+ case XML_HAlign:
+ {
+ ss::hor_alignment_t hor_alignment = ss::hor_alignment_t::unknown;
+ if (attr.value == "GNM_HALIGN_CENTER")
+ hor_alignment = ss::hor_alignment_t::center;
+ else if (attr.value == "GNM_HALIGN_RIGHT")
+ hor_alignment = ss::hor_alignment_t::right;
+ else if (attr.value == "GNM_HALIGN_LEFT")
+ hor_alignment = ss::hor_alignment_t::left;
+ else if (attr.value == "GNM_HALIGN_JUSTIFY")
+ hor_alignment = ss::hor_alignment_t::justified;
+ else if (attr.value == "GNM_HALIGN_DISTRIBUTED")
+ hor_alignment = ss::hor_alignment_t::distributed;
+ else if (attr.value == "GNM_HALIGN_FILL")
+ hor_alignment = ss::hor_alignment_t::filled;
+
+ if (hor_alignment != ss::hor_alignment_t::unknown)
+ mp_xf->set_apply_alignment(true);
+ mp_xf->set_horizontal_alignment(hor_alignment);
+ break;
+ }
+ case XML_VAlign:
+ {
+ ss::ver_alignment_t ver_alignment = ss::ver_alignment_t::unknown;
+ if (attr.value == "GNM_VALIGN_BOTTOM")
+ ver_alignment = ss::ver_alignment_t::bottom;
+ else if (attr.value == "GNM_VALIGN_TOP")
+ ver_alignment = ss::ver_alignment_t::top;
+ else if (attr.value == "GNM_VALIGN_CENTER")
+ ver_alignment = ss::ver_alignment_t::middle;
+ else if (attr.value == "GNM_VALIGN_JUSTIFY")
+ ver_alignment = ss::ver_alignment_t::justified;
+ else if (attr.value == "GNM_VALIGN_DISTRIBUTED")
+ ver_alignment = ss::ver_alignment_t::distributed;
+
+ if (ver_alignment != ss::ver_alignment_t::unknown)
+ mp_xf->set_apply_alignment(true);
+ mp_xf->set_vertical_alignment(ver_alignment);
+ break;
+ }
+ }
+ }
+
+ if (fill_set)
+ {
+ size_t fill_id = fill_style->commit();
+ mp_xf->set_fill(fill_id);
+ }
+ if (protection_set)
+ {
+ size_t protection_id = cell_protection->commit();
+ mp_xf->set_protection(protection_id);
+ }
+}
+
+void gnumeric_sheet_context::start_style_region(const xml_token_attrs_t& attrs)
+{
+ m_region_data = style_region{};
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ switch (attr.name)
+ {
+ case XML_startCol:
+ {
+ size_t n = atoi(attr.value.data());
+ m_region_data->start_col = n;
+ break;
+ }
+ case XML_startRow:
+ {
+ size_t n = atoi(attr.value.data());
+ m_region_data->start_row = n;
+ break;
+ }
+ case XML_endCol:
+ {
+ size_t n = atoi(attr.value.data());
+ m_region_data->end_col = n;
+ break;
+ }
+ case XML_endRow:
+ {
+ size_t n = atoi(attr.value.data());
+ m_region_data->end_row = n;
+ break;
+ }
+ default:
+ ;
+ }
+ }
+}
+
+void gnumeric_sheet_context::start_condition(const xml_token_attrs_t& attrs)
+{
+ if (!mp_sheet)
+ return;
+
+ ss::iface::import_conditional_format* cond_format =
+ mp_sheet->get_conditional_format();
+
+ if (!cond_format)
+ return;
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ switch (attr.name)
+ {
+ case XML_Operator:
+ {
+ int val = atoi(attr.value.data());
+ ss::condition_operator_t op = get_condition_operator(val);
+ cond_format->set_operator(op);
+ break;
+ }
+ }
+ }
+}
+
+void gnumeric_sheet_context::start_name(const xml_token_attrs_t& /*attrs*/)
+{
+ m_name = std::string_view{};
+}
+
+void gnumeric_sheet_context::end_font()
+{
+ ss::iface::import_styles* styles = mp_factory->get_styles();
+ if (!styles)
+ return;
+
+ auto* font_style = styles->start_font_style();
+ ENSURE_INTERFACE(font_style, import_font_style);
+
+ font_style->set_color(0, m_front_color.red, m_front_color.green, m_front_color.blue);
+ font_style->set_name(m_chars);
+ size_t font_id = font_style->commit();
+
+ assert(mp_xf);
+ mp_xf->set_font(font_id);
+}
+
+void gnumeric_sheet_context::end_style(bool conditional_format)
+{
+ ss::iface::import_styles* styles = mp_factory->get_styles();
+ if (!styles)
+ return;
+
+ assert(mp_xf);
+ size_t xf_id = mp_xf->commit();
+ if (!conditional_format)
+ {
+ m_region_data->xf_id = xf_id;
+ }
+ else if (mp_sheet)
+ {
+ ss::iface::import_conditional_format* cond_format =
+ mp_sheet->get_conditional_format();
+ if (cond_format)
+ {
+ cond_format->set_xf_id(xf_id);
+ }
+ }
+}
+
+void gnumeric_sheet_context::end_style_region()
+{
+ if (!mp_sheet)
+ return;
+
+ mp_sheet->set_format(m_region_data->start_row, m_region_data->start_col,
+ m_region_data->end_row, m_region_data->end_col, m_region_data->xf_id);
+
+ if (m_region_data->contains_conditional_format)
+ {
+ ss::iface::import_conditional_format* cond_format =
+ mp_sheet->get_conditional_format();
+ if (cond_format)
+ {
+ cond_format->set_range(m_region_data->start_row, m_region_data->start_col,
+ m_region_data->end_row, m_region_data->end_col);
+ cond_format->commit_format();
+ }
+ }
+ m_region_data.reset();
+}
+
+void gnumeric_sheet_context::end_condition()
+{
+ if (!mp_sheet)
+ return;
+
+ ss::iface::import_conditional_format* cond_format =
+ mp_sheet->get_conditional_format();
+ if (cond_format)
+ {
+ cond_format->commit_entry();
+ }
+}
+
+void gnumeric_sheet_context::end_expression()
+{
+ if (!mp_sheet)
+ return;
+
+ ss::iface::import_conditional_format* cond_format =
+ mp_sheet->get_conditional_format();
+ if (cond_format)
+ {
+ cond_format->set_formula(m_chars);
+ cond_format->commit_condition();
+ }
+}
+
+void gnumeric_sheet_context::end_merge()
+{
+ if (!mp_sheet || m_merge_area.empty())
+ return;
+
+ auto* sp = mp_sheet->get_sheet_properties();
+ if (!sp)
+ return;
+
+ auto* resolver = mp_factory->get_reference_resolver(ss::formula_ref_context_t::global);
+ if (!resolver)
+ return;
+
+ try
+ {
+ ss::range_t range = to_rc_range(resolver->resolve_range(m_merge_area));
+ sp->set_merge_cell_range(range);
+ }
+ catch (const invalid_arg_error& e)
+ {
+ std::ostringstream os;
+ os << "failed to parse a merged area '" << m_merge_area << "': " << e.what();
+ warn(os.str());
+ }
+}
+
+void gnumeric_sheet_context::end_name()
+{
+ if (m_name.empty())
+ return;
+
+ mp_sheet = mp_factory->get_sheet(m_name);
+ m_name = std::string_view{};
+}
+
+void gnumeric_sheet_context::end_names()
+{
+ if (!mp_sheet)
+ return;
+
+ ss::iface::import_named_expression* named_exp = mp_sheet->get_named_expression();
+ if (!named_exp)
+ return;
+
+ for (const auto& name : m_cxt_names.get_names())
+ {
+ try
+ {
+ named_exp->set_base_position(name.position);
+ named_exp->set_named_expression(name.name, name.value);
+ named_exp->commit();
+ }
+ catch (const std::exception& e)
+ {
+ std::ostringstream os;
+ os << "failed to commit a named expression named '" << name.name
+ << "': (reason='" << e.what() << "'; value='" << name.value << "')";
+ warn(os.str());
+ }
+ }
+}
+
+void gnumeric_sheet_context::end_styles()
+{
+ m_styles = m_cxt_styles.pop_styles();
+}
+
+} // namespace orcus
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/gnumeric_sheet_context.hpp b/src/liborcus/gnumeric_sheet_context.hpp
new file mode 100644
index 0000000..70b8f89
--- /dev/null
+++ b/src/liborcus/gnumeric_sheet_context.hpp
@@ -0,0 +1,112 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_GNUMERIC_SHEET_CONTEXT_HPP
+#define INCLUDED_ORCUS_GNUMERIC_SHEET_CONTEXT_HPP
+
+#include "xml_context_base.hpp"
+#include "gnumeric_cell_context.hpp"
+#include "gnumeric_filter_context.hpp"
+#include "gnumeric_names_context.hpp"
+#include "gnumeric_styles_context.hpp"
+#include "gnumeric_types.hpp"
+
+#include <orcus/spreadsheet/types.hpp>
+
+#include <memory>
+#include <optional>
+
+namespace orcus {
+
+namespace spreadsheet { namespace iface {
+
+class import_factory;
+class import_sheet;
+class import_auto_filter;
+class import_xf;
+
+}}
+
+class gnumeric_sheet_context : public xml_context_base
+{
+ struct style_region
+ {
+ spreadsheet::row_t start_row = 0;
+ spreadsheet::row_t end_row = 0;
+ spreadsheet::col_t start_col = 0;
+ spreadsheet::col_t end_col = 0;
+
+ std::size_t xf_id = 0;
+ bool contains_conditional_format = false;
+ };
+
+public:
+ gnumeric_sheet_context(
+ session_context& session_cxt, const tokens& tokens,
+ spreadsheet::iface::import_factory* factory);
+
+ virtual ~gnumeric_sheet_context() override;
+
+ virtual xml_context_base* create_child_context(xmlns_id_t ns, xml_token_t name) override;
+ virtual void end_child_context(xmlns_id_t ns, xml_token_t name, xml_context_base* child) override;
+
+ virtual void start_element(xmlns_id_t ns, xml_token_t name, const xml_token_attrs_t& attrs) override;
+ virtual bool end_element(xmlns_id_t ns, xml_token_t name) override;
+ virtual void characters(std::string_view str, bool transient) override;
+
+ void reset(spreadsheet::sheet_t sheet);
+
+ std::vector<gnumeric_style> pop_styles();
+
+private:
+ void start_style_region(const xml_token_attrs_t& attrs);
+ void start_style(const xml_token_attrs_t& attrs);
+ void start_font(const xml_token_attrs_t& attrs);
+ void start_col(const xml_token_attrs_t& attrs);
+ void start_row(const xml_token_attrs_t& attrs);
+ void start_condition(const xml_token_attrs_t& attrs);
+ void start_name(const xml_token_attrs_t& attrs);
+
+ void end_style(bool conditional_format);
+ void end_font();
+ void end_style_region();
+ void end_condition();
+ void end_expression();
+ void end_merge();
+ void end_name();
+ void end_names();
+ void end_styles();
+
+private:
+ spreadsheet::iface::import_factory* mp_factory = nullptr;
+ spreadsheet::iface::import_sheet* mp_sheet = nullptr;
+ spreadsheet::iface::import_xf* mp_xf = nullptr;
+ spreadsheet::sheet_t m_sheet = -1;
+
+ std::optional<style_region> m_region_data;
+
+ spreadsheet::color_rgb_t m_front_color;
+
+ /**
+ * Used for temporary storage of characters
+ */
+ std::string_view m_chars;
+ std::string_view m_name;
+ std::string_view m_merge_area;
+
+ gnumeric_cell_context m_cxt_cell;
+ gnumeric_filter_context m_cxt_filter;
+ gnumeric_names_context m_cxt_names;
+ gnumeric_styles_context m_cxt_styles;
+
+ std::vector<gnumeric_style> m_styles;
+};
+
+} // namespace orcus
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/gnumeric_sheet_context_test.cpp b/src/liborcus/gnumeric_sheet_context_test.cpp
new file mode 100644
index 0000000..685357d
--- /dev/null
+++ b/src/liborcus/gnumeric_sheet_context_test.cpp
@@ -0,0 +1,119 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "gnumeric_sheet_context.hpp"
+#include "gnumeric_tokens.hpp"
+#include "gnumeric_namespace_types.hpp"
+#include "gnumeric_token_constants.hpp"
+#include "mock_spreadsheet.hpp"
+#include "session_context.hpp"
+#include "orcus/types.hpp"
+
+#include <iostream>
+#include <string>
+#include <cstdlib>
+
+using namespace orcus;
+using namespace std;
+using namespace orcus::spreadsheet;
+using namespace orcus::spreadsheet::mock;
+
+class mock_sheet_properties : public import_sheet_properties
+{
+public:
+ virtual void set_column_width(col_t col, col_t col_span, double size, length_unit_t unit)
+ {
+ assert(col == 2);
+ assert(col_span == 1);
+ assert(size == 37.3);
+ assert(unit == length_unit_t::point);
+ }
+
+ virtual void set_column_hidden(col_t, col_t, bool)
+ {
+ }
+
+ virtual void set_row_height(row_t row, double size, length_unit_t unit)
+ {
+ assert(row == 4);
+ assert(size == 7.3);
+ assert(unit == length_unit_t::point);
+ }
+
+ virtual void set_row_hidden(row_t, bool)
+ {
+ }
+};
+
+class mock_sheet : public import_sheet
+{
+public:
+ virtual iface::import_sheet_properties* get_sheet_properties()
+ {
+ return &m_mock_properties;
+ }
+
+ virtual range_size_t get_sheet_size() const
+ {
+ range_size_t ret;
+ ret.rows = ret.columns = 0;
+ return ret;
+ }
+
+private:
+ mock_sheet_properties m_mock_properties;
+};
+
+class mock_factory : public import_factory
+{
+public:
+ virtual iface::import_sheet* get_sheet(std::string_view) override
+ {
+ return &m_mock_sheet;
+ }
+
+private:
+ mock_sheet m_mock_sheet;
+};
+
+void test_column_width()
+{
+ mock_factory factory;
+ session_context cxt;
+
+ orcus::gnumeric_sheet_context context(cxt, orcus::gnumeric_tokens, &factory);
+ context.reset(0);
+ orcus::xmlns_id_t ns = NS_gnumeric_gnm;
+ orcus::xml_token_t parent = XML_Sheet;
+ orcus::xml_token_attrs_t parent_attr;
+ context.start_element(ns, parent, parent_attr);
+ {
+ orcus::xml_token_t elem = XML_Name;
+ orcus::xml_token_attrs_t attrs;
+ context.start_element(ns, elem, attrs);
+ context.characters("test", false);
+ context.end_element(ns, elem);
+ }
+ {
+ orcus::xml_token_t elem = XML_ColInfo;
+ orcus::xml_token_attrs_t attrs;
+ attrs.push_back(xml_token_attr_t(ns, XML_No, "2", false));
+ attrs.push_back(xml_token_attr_t(ns, XML_Unit, "37.3", false));
+ attrs.push_back(xml_token_attr_t(ns, XML_Unit, "37.3", false));
+ context.start_element(ns, elem, attrs);
+ context.end_element(ns, elem);
+ }
+ context.end_element(ns, parent);
+}
+
+int main()
+{
+ test_column_width();
+
+ return EXIT_SUCCESS;
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/gnumeric_styles_context.cpp b/src/liborcus/gnumeric_styles_context.cpp
new file mode 100644
index 0000000..b2c6058
--- /dev/null
+++ b/src/liborcus/gnumeric_styles_context.cpp
@@ -0,0 +1,342 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "gnumeric_styles_context.hpp"
+#include "gnumeric_token_constants.hpp"
+#include "gnumeric_namespace_types.hpp"
+
+#include <orcus/measurement.hpp>
+#include <mdds/sorted_string_map.hpp>
+
+namespace ss = orcus::spreadsheet;
+
+namespace orcus {
+
+namespace {
+
+namespace hor_align {
+
+using map_type = mdds::sorted_string_map<ss::hor_alignment_t, mdds::string_view_map_entry>;
+
+// Keys must be sorted.
+constexpr map_type::entry entries[] = {
+ { "GNM_HALIGN_CENTER", ss::hor_alignment_t::center },
+ { "GNM_HALIGN_DISTRIBUTED", ss::hor_alignment_t::distributed },
+ { "GNM_HALIGN_GENERAL", ss::hor_alignment_t::unknown },
+ { "GNM_HALIGN_JUSTIFY", ss::hor_alignment_t::justified },
+ { "GNM_HALIGN_LEFT", ss::hor_alignment_t::left },
+ { "GNM_HALIGN_RIGHT", ss::hor_alignment_t::right },
+};
+
+const map_type& get()
+{
+ static const map_type mt(entries, std::size(entries), ss::hor_alignment_t::unknown);
+ return mt;
+}
+
+} // namespace hor_align
+
+namespace ver_align {
+
+using map_type = mdds::sorted_string_map<ss::ver_alignment_t, mdds::string_view_map_entry>;
+
+// Keys must be sorted.
+constexpr map_type::entry entries[] = {
+ { "GNM_VALIGN_BOTTOM", ss::ver_alignment_t::bottom },
+ { "GNM_VALIGN_CENTER", ss::ver_alignment_t::middle },
+ { "GNM_VALIGN_DISTRIBUTED", ss::ver_alignment_t::distributed },
+ { "GNM_VALIGN_JUSTIFY", ss::ver_alignment_t::justified },
+ { "GNM_VALIGN_TOP", ss::ver_alignment_t::top },
+};
+
+const map_type& get()
+{
+ static const map_type mt(entries, std::size(entries), ss::ver_alignment_t::unknown);
+ return mt;
+}
+
+} // namespace ver_align
+
+ss::fill_pattern_t to_fill_pattern(std::size_t v)
+{
+ constexpr ss::fill_pattern_t patterns[] = {
+ ss::fill_pattern_t::none,
+ ss::fill_pattern_t::solid,
+ // TODO: add more as we establish more mapping rules
+ };
+
+ return (v < std::size(patterns)) ? patterns[v] : ss::fill_pattern_t::none;
+}
+
+gnumeric_style::border_type parse_border_attributes(const xml_token_attrs_t& attrs)
+{
+ gnumeric_style::border_type ret;
+
+ for (const auto& attr : attrs)
+ {
+ if (attr.ns == XMLNS_UNKNOWN_ID)
+ {
+ switch (attr.name)
+ {
+ case XML_Style:
+ {
+ const char* p_end = nullptr;
+ long v = to_long(attr.value, &p_end);
+ if (attr.value.data() < p_end)
+ ret.style = static_cast<gnumeric_border_type>(v);
+ break;
+ }
+ case XML_Color:
+ {
+ ret.color = parse_gnumeric_rgb(attr.value);
+ break;
+ }
+ }
+ }
+ }
+
+ return ret;
+}
+
+} // anonymous namespace
+
+gnumeric_styles_context::gnumeric_styles_context(
+ session_context& session_cxt, const tokens& tokens,
+ ss::iface::import_factory* factory) :
+ xml_context_base(session_cxt, tokens),
+ mp_factory(factory)
+{
+ static const xml_element_validator::rule rules[] = {
+ // parent element -> child element
+ { XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN, NS_gnumeric_gnm, XML_Styles }, // root element
+ { NS_gnumeric_gnm, XML_Style, NS_gnumeric_gnm, XML_Font },
+ { NS_gnumeric_gnm, XML_Style, NS_gnumeric_gnm, XML_StyleBorder },
+ { NS_gnumeric_gnm, XML_StyleBorder, NS_gnumeric_gnm, XML_Bottom },
+ { NS_gnumeric_gnm, XML_StyleBorder, NS_gnumeric_gnm, XML_Diagonal },
+ { NS_gnumeric_gnm, XML_StyleBorder, NS_gnumeric_gnm, XML_Left },
+ { NS_gnumeric_gnm, XML_StyleBorder, NS_gnumeric_gnm, XML_Rev_Diagonal },
+ { NS_gnumeric_gnm, XML_StyleBorder, NS_gnumeric_gnm, XML_Right },
+ { NS_gnumeric_gnm, XML_StyleBorder, NS_gnumeric_gnm, XML_Top },
+ { NS_gnumeric_gnm, XML_StyleRegion, NS_gnumeric_gnm, XML_Style },
+ { NS_gnumeric_gnm, XML_Styles, NS_gnumeric_gnm, XML_StyleRegion },
+ };
+
+ init_element_validator(rules, std::size(rules));
+}
+
+gnumeric_styles_context::~gnumeric_styles_context() = default;
+
+void gnumeric_styles_context::start_element(
+ xmlns_id_t ns, xml_token_t name, const std::vector<xml_token_attr_t>& attrs)
+{
+ push_stack(ns, name);
+
+ if (ns == NS_gnumeric_gnm)
+ {
+ switch (name)
+ {
+ case XML_StyleRegion:
+ start_style_region(attrs);
+ break;
+ case XML_StyleBorder:
+ break;
+ case XML_Style:
+ start_style(attrs);
+ break;
+ case XML_Top:
+ {
+ m_current_style.border_top = parse_border_attributes(attrs);
+ break;
+ }
+ case XML_Bottom:
+ {
+ m_current_style.border_bottom = parse_border_attributes(attrs);
+ break;
+ }
+ case XML_Left:
+ {
+ m_current_style.border_left = parse_border_attributes(attrs);
+ break;
+ }
+ case XML_Right:
+ {
+ m_current_style.border_right = parse_border_attributes(attrs);
+ break;
+ }
+ case XML_Diagonal:
+ {
+ m_current_style.border_bl_tr = parse_border_attributes(attrs);
+ break;
+ }
+ case XML_Rev_Diagonal:
+ {
+ m_current_style.border_br_tl = parse_border_attributes(attrs);
+ break;
+ }
+ case XML_Font:
+ start_font(attrs);
+ break;
+ default:
+ warn_unhandled();
+ }
+ }
+ else
+ warn_unhandled();
+}
+
+bool gnumeric_styles_context::end_element(xmlns_id_t ns, xml_token_t name)
+{
+ if (ns == NS_gnumeric_gnm)
+ {
+ switch (name)
+ {
+ case XML_StyleRegion:
+ end_style_region();
+ break;
+ }
+ }
+ return pop_stack(ns, name);
+}
+
+void gnumeric_styles_context::characters(std::string_view str, bool transient)
+{
+ const auto [ns, name] = get_current_element();
+
+ if (ns == NS_gnumeric_gnm)
+ {
+ switch (name)
+ {
+ case XML_Font:
+ {
+ if (transient)
+ str = intern(str);
+ m_current_style.font_name = str;
+ break;
+ }
+ }
+ }
+}
+
+void gnumeric_styles_context::reset(ss::sheet_t sheet)
+{
+ m_sheet = sheet;
+ m_styles.clear();
+ m_current_style = gnumeric_style{};
+}
+
+std::vector<gnumeric_style> gnumeric_styles_context::pop_styles()
+{
+ return std::move(m_styles);
+}
+
+void gnumeric_styles_context::start_style_region(const std::vector<xml_token_attr_t>& attrs)
+{
+ m_current_style = gnumeric_style{};
+ m_current_style.sheet = m_sheet;
+
+ for (const auto& attr : attrs)
+ {
+ switch (attr.name)
+ {
+ case XML_startCol:
+ m_current_style.region.first.column = to_long(attr.value);
+ break;
+ case XML_startRow:
+ m_current_style.region.first.row = to_long(attr.value);
+ break;
+ case XML_endCol:
+ m_current_style.region.last.column = to_long(attr.value);
+ break;
+ case XML_endRow:
+ m_current_style.region.last.row = to_long(attr.value);
+ break;
+ }
+ }
+}
+
+void gnumeric_styles_context::start_style(const std::vector<xml_token_attr_t>& attrs)
+{
+ for (const auto& attr : attrs)
+ {
+ switch (attr.name)
+ {
+ case XML_HAlign:
+ m_current_style.hor_align = hor_align::get().find(attr.value);
+ break;
+ case XML_VAlign:
+ m_current_style.ver_align = ver_align::get().find(attr.value);
+ break;
+ case XML_WrapText:
+ m_current_style.wrap_text = to_bool(attr.value);
+ break;
+ case XML_Fore:
+ m_current_style.fore = parse_gnumeric_rgb(attr.value);
+ break;
+ case XML_Back:
+ m_current_style.back = parse_gnumeric_rgb(attr.value);
+ break;
+ case XML_PatternColor:
+ m_current_style.pattern_color = parse_gnumeric_rgb(attr.value);
+ break;
+ case XML_Shade:
+ m_current_style.pattern = to_fill_pattern(to_long(attr.value));
+ break;
+ case XML_Format:
+ {
+ auto v = attr.transient ? intern(attr.value) : attr.value;
+ m_current_style.number_format = v;
+ break;
+ }
+ }
+ }
+}
+
+void gnumeric_styles_context::start_font(const std::vector<xml_token_attr_t>& attrs)
+{
+ for (const auto& attr : attrs)
+ {
+ switch (attr.name)
+ {
+ case XML_Unit:
+ {
+ const char* p_end = nullptr;
+ double v = to_double(attr.value, &p_end);
+ if (attr.value.data() < p_end)
+ m_current_style.font_unit = v;
+ break;
+ }
+ case XML_Bold:
+ m_current_style.bold = to_bool(attr.value);
+ break;
+ case XML_Italic:
+ m_current_style.italic = to_bool(attr.value);
+ break;
+ case XML_Underline:
+ m_current_style.underline = to_bool(attr.value);
+ break;
+ case XML_StrikeThrough:
+ m_current_style.strikethrough = to_bool(attr.value);
+ break;
+ case XML_Script:
+ {
+ auto v = to_long(attr.value);
+ m_current_style.script = static_cast<gnumeric_script_type>(v);
+ break;
+ }
+ }
+ }
+}
+
+void gnumeric_styles_context::end_style_region()
+{
+ if (m_current_style.valid())
+ m_styles.push_back(m_current_style);
+}
+
+} // namespace orcus
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/gnumeric_styles_context.hpp b/src/liborcus/gnumeric_styles_context.hpp
new file mode 100644
index 0000000..1675b48
--- /dev/null
+++ b/src/liborcus/gnumeric_styles_context.hpp
@@ -0,0 +1,59 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#pragma once
+
+#include "xml_context_base.hpp"
+#include "gnumeric_types.hpp"
+
+#include <orcus/spreadsheet/types.hpp>
+
+namespace orcus {
+
+namespace spreadsheet { namespace iface {
+
+class import_factory;
+
+}}
+
+class gnumeric_styles_context : public xml_context_base
+{
+public:
+ gnumeric_styles_context(
+ session_context& session_cxt, const tokens& tokens,
+ spreadsheet::iface::import_factory* factory);
+ virtual ~gnumeric_styles_context() override;
+
+ virtual void start_element(
+ xmlns_id_t ns, xml_token_t name, const std::vector<xml_token_attr_t>& attrs) override;
+
+ virtual bool end_element(xmlns_id_t ns, xml_token_t name) override;
+
+ virtual void characters(std::string_view str, bool transient) override;
+
+ void reset(spreadsheet::sheet_t sheet);
+
+ std::vector<gnumeric_style> pop_styles();
+
+private:
+ void start_style_region(const std::vector<xml_token_attr_t>& attrs);
+ void start_style(const std::vector<xml_token_attr_t>& attrs);
+ void start_font(const std::vector<xml_token_attr_t>& attrs);
+
+ void end_style_region();
+
+private:
+ spreadsheet::iface::import_factory* mp_factory = nullptr;
+ spreadsheet::sheet_t m_sheet = -1;
+
+ std::vector<gnumeric_style> m_styles;
+ gnumeric_style m_current_style;
+};
+
+} // namespace orcus
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/gnumeric_token_constants.hpp b/src/liborcus/gnumeric_token_constants.hpp
new file mode 100644
index 0000000..7e94fb5
--- /dev/null
+++ b/src/liborcus/gnumeric_token_constants.hpp
@@ -0,0 +1,21 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef __ORCUS_GNUMERIC_TOKEN_CONSTANTS_HPP__
+#define __ORCUS_GNUMERIC_TOKEN_CONSTANTS_HPP__
+
+#include "orcus/types.hpp"
+
+namespace orcus {
+
+#include "gnumeric_token_constants.inl"
+
+}
+
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/gnumeric_token_constants.inl b/src/liborcus/gnumeric_token_constants.inl
new file mode 100644
index 0000000..4043f22
--- /dev/null
+++ b/src/liborcus/gnumeric_token_constants.inl
@@ -0,0 +1,258 @@
+// This file has been auto-generated. Do not hand-edit this.
+
+const xml_token_t XML_AllowBlank = 1;
+const xml_token_t XML_AnswerR = 2;
+const xml_token_t XML_Area = 3;
+const xml_token_t XML_ArrowShapeA = 4;
+const xml_token_t XML_ArrowShapeB = 5;
+const xml_token_t XML_ArrowShapeC = 6;
+const xml_token_t XML_Attribute = 7;
+const xml_token_t XML_Attributes = 8;
+const xml_token_t XML_Author = 9;
+const xml_token_t XML_AutoScale = 10;
+const xml_token_t XML_Back = 11;
+const xml_token_t XML_Bold = 12;
+const xml_token_t XML_Bottom = 13;
+const xml_token_t XML_Calculation = 14;
+const xml_token_t XML_Cell = 15;
+const xml_token_t XML_CellComment = 16;
+const xml_token_t XML_Cells = 17;
+const xml_token_t XML_CellsStr = 18;
+const xml_token_t XML_Col = 19;
+const xml_token_t XML_ColInfo = 20;
+const xml_token_t XML_Collapsed = 21;
+const xml_token_t XML_Color = 22;
+const xml_token_t XML_Cols = 23;
+const xml_token_t XML_Comment = 24;
+const xml_token_t XML_Condition = 25;
+const xml_token_t XML_Constr = 26;
+const xml_token_t XML_Content = 27;
+const xml_token_t XML_Count = 28;
+const xml_token_t XML_CursorCol = 29;
+const xml_token_t XML_CursorRow = 30;
+const xml_token_t XML_DateConvention = 31;
+const xml_token_t XML_DefaultSizePts = 32;
+const xml_token_t XML_Diagonal = 33;
+const xml_token_t XML_Direction = 34;
+const xml_token_t XML_Discr = 35;
+const xml_token_t XML_DisplayFormulas = 36;
+const xml_token_t XML_DisplayOutlines = 37;
+const xml_token_t XML_EnableIteration = 38;
+const xml_token_t XML_Epoch = 39;
+const xml_token_t XML_ExprConvention = 40;
+const xml_token_t XML_ExprID = 41;
+const xml_token_t XML_Expression0 = 42;
+const xml_token_t XML_Expression1 = 43;
+const xml_token_t XML_Field = 44;
+const xml_token_t XML_FillColor = 45;
+const xml_token_t XML_Filter = 46;
+const xml_token_t XML_Filters = 47;
+const xml_token_t XML_FloatDigits = 48;
+const xml_token_t XML_FloatRadix = 49;
+const xml_token_t XML_Font = 50;
+const xml_token_t XML_Footer = 51;
+const xml_token_t XML_Fore = 52;
+const xml_token_t XML_Format = 53;
+const xml_token_t XML_FreezePanes = 54;
+const xml_token_t XML_FrozenTopLeft = 55;
+const xml_token_t XML_Full = 56;
+const xml_token_t XML_Geometry = 57;
+const xml_token_t XML_GogObject = 58;
+const xml_token_t XML_GridColor = 59;
+const xml_token_t XML_HAlign = 60;
+const xml_token_t XML_HardSize = 61;
+const xml_token_t XML_Header = 62;
+const xml_token_t XML_Height = 63;
+const xml_token_t XML_Hidden = 64;
+const xml_token_t XML_HideColHeader = 65;
+const xml_token_t XML_HideGrid = 66;
+const xml_token_t XML_HideRowHeader = 67;
+const xml_token_t XML_HideZero = 68;
+const xml_token_t XML_HyperLink = 69;
+const xml_token_t XML_Inc = 70;
+const xml_token_t XML_Indent = 71;
+const xml_token_t XML_Index = 72;
+const xml_token_t XML_Input = 73;
+const xml_token_t XML_InputMessage = 74;
+const xml_token_t XML_Inputs = 75;
+const xml_token_t XML_Italic = 76;
+const xml_token_t XML_IterationTolerance = 77;
+const xml_token_t XML_Label = 78;
+const xml_token_t XML_LabelFormat = 79;
+const xml_token_t XML_Lcol = 80;
+const xml_token_t XML_Left = 81;
+const xml_token_t XML_LimitsR = 82;
+const xml_token_t XML_Locked = 83;
+const xml_token_t XML_Lrow = 84;
+const xml_token_t XML_Major = 85;
+const xml_token_t XML_ManualRecalc = 86;
+const xml_token_t XML_MarginA = 87;
+const xml_token_t XML_MarginB = 88;
+const xml_token_t XML_Margins = 89;
+const xml_token_t XML_Max = 90;
+const xml_token_t XML_MaxCol = 91;
+const xml_token_t XML_MaxIter = 92;
+const xml_token_t XML_MaxIterations = 93;
+const xml_token_t XML_MaxRow = 94;
+const xml_token_t XML_MaxTime = 95;
+const xml_token_t XML_Merge = 96;
+const xml_token_t XML_MergedRegions = 97;
+const xml_token_t XML_Message = 98;
+const xml_token_t XML_Middle = 99;
+const xml_token_t XML_Min = 100;
+const xml_token_t XML_Minor = 101;
+const xml_token_t XML_ModelType = 102;
+const xml_token_t XML_Name = 103;
+const xml_token_t XML_Names = 104;
+const xml_token_t XML_No = 105;
+const xml_token_t XML_NonNeg = 106;
+const xml_token_t XML_ObjectAnchorType = 107;
+const xml_token_t XML_ObjectBound = 108;
+const xml_token_t XML_ObjectOffset = 109;
+const xml_token_t XML_Objects = 110;
+const xml_token_t XML_Op0 = 111;
+const xml_token_t XML_Op1 = 112;
+const xml_token_t XML_Operator = 113;
+const xml_token_t XML_Orient = 114;
+const xml_token_t XML_OutlineColor = 115;
+const xml_token_t XML_OutlineLevel = 116;
+const xml_token_t XML_OutlineSymbolsBelow = 117;
+const xml_token_t XML_OutlineSymbolsRight = 118;
+const xml_token_t XML_Output = 119;
+const xml_token_t XML_Page = 120;
+const xml_token_t XML_PatternColor = 121;
+const xml_token_t XML_PerformR = 122;
+const xml_token_t XML_Points = 123;
+const xml_token_t XML_PrefUnit = 124;
+const xml_token_t XML_Print = 125;
+const xml_token_t XML_PrintInformation = 126;
+const xml_token_t XML_ProblemType = 127;
+const xml_token_t XML_ProgramR = 128;
+const xml_token_t XML_Protected = 129;
+const xml_token_t XML_RTL_Layout = 130;
+const xml_token_t XML_Rcol = 131;
+const xml_token_t XML_Rev_Diagonal = 132;
+const xml_token_t XML_Right = 133;
+const xml_token_t XML_Rotation = 134;
+const xml_token_t XML_Row = 135;
+const xml_token_t XML_RowInfo = 136;
+const xml_token_t XML_Rows = 137;
+const xml_token_t XML_Rrow = 138;
+const xml_token_t XML_Scale = 139;
+const xml_token_t XML_Scenario = 140;
+const xml_token_t XML_Scenarios = 141;
+const xml_token_t XML_Script = 142;
+const xml_token_t XML_SelectedTab = 143;
+const xml_token_t XML_Selection = 144;
+const xml_token_t XML_Selections = 145;
+const xml_token_t XML_SensitivityR = 146;
+const xml_token_t XML_Shade = 147;
+const xml_token_t XML_Sheet = 148;
+const xml_token_t XML_SheetLayout = 149;
+const xml_token_t XML_SheetName = 150;
+const xml_token_t XML_SheetNameIndex = 151;
+const xml_token_t XML_SheetObjectBonobo = 152;
+const xml_token_t XML_SheetObjectFilled = 153;
+const xml_token_t XML_SheetObjectGraph = 154;
+const xml_token_t XML_SheetObjectImage = 155;
+const xml_token_t XML_SheetWidgetButton = 156;
+const xml_token_t XML_SheetWidgetCheckbox = 157;
+const xml_token_t XML_SheetWidgetCombo = 158;
+const xml_token_t XML_SheetWidgetFrame = 159;
+const xml_token_t XML_SheetWidgetLabel = 160;
+const xml_token_t XML_SheetWidgetList = 161;
+const xml_token_t XML_SheetWidgetScrollbar = 162;
+const xml_token_t XML_SheetWidgetSlider = 163;
+const xml_token_t XML_SheetWidgetSpinbutton = 164;
+const xml_token_t XML_SheetWidgetToggleButton = 165;
+const xml_token_t XML_Sheets = 166;
+const xml_token_t XML_ShowIter = 167;
+const xml_token_t XML_ShrinkToFit = 168;
+const xml_token_t XML_Solver = 169;
+const xml_token_t XML_StrikeThrough = 170;
+const xml_token_t XML_Style = 171;
+const xml_token_t XML_StyleBorder = 172;
+const xml_token_t XML_StyleRegion = 173;
+const xml_token_t XML_Styles = 174;
+const xml_token_t XML_TabColor = 175;
+const xml_token_t XML_TabTextColor = 176;
+const xml_token_t XML_TargetCol = 177;
+const xml_token_t XML_TargetRow = 178;
+const xml_token_t XML_Text = 179;
+const xml_token_t XML_TextFormat = 180;
+const xml_token_t XML_Title = 181;
+const xml_token_t XML_Top = 182;
+const xml_token_t XML_TopLeft = 183;
+const xml_token_t XML_Type = 184;
+const xml_token_t XML_UIData = 185;
+const xml_token_t XML_Underline = 186;
+const xml_token_t XML_UnfrozenTopLeft = 187;
+const xml_token_t XML_Unit = 188;
+const xml_token_t XML_UseDropdown = 189;
+const xml_token_t XML_VAlign = 190;
+const xml_token_t XML_Validation = 191;
+const xml_token_t XML_Value = 192;
+const xml_token_t XML_Value0 = 193;
+const xml_token_t XML_Value1 = 194;
+const xml_token_t XML_ValueFormat = 195;
+const xml_token_t XML_ValueType = 196;
+const xml_token_t XML_ValueType0 = 197;
+const xml_token_t XML_ValueType1 = 198;
+const xml_token_t XML_Version = 199;
+const xml_token_t XML_Visibility = 200;
+const xml_token_t XML_Width = 201;
+const xml_token_t XML_Workbook = 202;
+const xml_token_t XML_WrapText = 203;
+const xml_token_t XML_Zoom = 204;
+const xml_token_t XML_bottom = 205;
+const xml_token_t XML_break = 206;
+const xml_token_t XML_cols = 207;
+const xml_token_t XML_count = 208;
+const xml_token_t XML_crop_bottom = 209;
+const xml_token_t XML_crop_left = 210;
+const xml_token_t XML_crop_right = 211;
+const xml_token_t XML_crop_top = 212;
+const xml_token_t XML_data = 213;
+const xml_token_t XML_dimension = 214;
+const xml_token_t XML_do_not_print = 215;
+const xml_token_t XML_draft = 216;
+const xml_token_t XML_endCol = 217;
+const xml_token_t XML_endRow = 218;
+const xml_token_t XML_even_if_only_styles = 219;
+const xml_token_t XML_footer = 220;
+const xml_token_t XML_grid = 221;
+const xml_token_t XML_hPageBreaks = 222;
+const xml_token_t XML_hcenter = 223;
+const xml_token_t XML_header = 224;
+const xml_token_t XML_id = 225;
+const xml_token_t XML_image_type = 226;
+const xml_token_t XML_items = 227;
+const xml_token_t XML_left = 228;
+const xml_token_t XML_monochrome = 229;
+const xml_token_t XML_name = 230;
+const xml_token_t XML_order = 231;
+const xml_token_t XML_orientation = 232;
+const xml_token_t XML_paper = 233;
+const xml_token_t XML_percentage = 234;
+const xml_token_t XML_pos = 235;
+const xml_token_t XML_position = 236;
+const xml_token_t XML_print_to_uri = 237;
+const xml_token_t XML_print_range = 238;
+const xml_token_t XML_property = 239;
+const xml_token_t XML_repeat_left = 240;
+const xml_token_t XML_repeat_top = 241;
+const xml_token_t XML_right = 242;
+const xml_token_t XML_role = 243;
+const xml_token_t XML_rows = 244;
+const xml_token_t XML_size_bytes = 245;
+const xml_token_t XML_startCol = 246;
+const xml_token_t XML_startRow = 247;
+const xml_token_t XML_target = 248;
+const xml_token_t XML_tip = 249;
+const xml_token_t XML_titles = 250;
+const xml_token_t XML_top = 251;
+const xml_token_t XML_type = 252;
+const xml_token_t XML_vPageBreaks = 253;
+const xml_token_t XML_value = 254;
+const xml_token_t XML_vcenter = 255;
+
diff --git a/src/liborcus/gnumeric_tokens.cpp b/src/liborcus/gnumeric_tokens.cpp
new file mode 100644
index 0000000..99eaa1d
--- /dev/null
+++ b/src/liborcus/gnumeric_tokens.cpp
@@ -0,0 +1,20 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "gnumeric_tokens.hpp"
+
+namespace orcus {
+
+namespace {
+
+#include "gnumeric_tokens.inl"
+
+}
+
+tokens gnumeric_tokens = tokens(token_names, token_name_count);
+
+}/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/gnumeric_tokens.hpp b/src/liborcus/gnumeric_tokens.hpp
new file mode 100644
index 0000000..2ce6016
--- /dev/null
+++ b/src/liborcus/gnumeric_tokens.hpp
@@ -0,0 +1,23 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef __ORCUS_GNUMERIC_TOKENS_HPP__
+#define __ORCUS_GNUMERIC_TOKENS_HPP__
+
+#include "orcus/tokens.hpp"
+
+namespace orcus {
+
+/**
+ * Singleton instance containing all GNUMERIC tokens.
+ */
+extern tokens gnumeric_tokens;
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/gnumeric_tokens.inl b/src/liborcus/gnumeric_tokens.inl
new file mode 100644
index 0000000..297065b
--- /dev/null
+++ b/src/liborcus/gnumeric_tokens.inl
@@ -0,0 +1,263 @@
+// This file has been auto-generated. Do not hand-edit this.
+
+const char* token_names[] = {
+ "??", // 0
+ "AllowBlank", // 1
+ "AnswerR", // 2
+ "Area", // 3
+ "ArrowShapeA", // 4
+ "ArrowShapeB", // 5
+ "ArrowShapeC", // 6
+ "Attribute", // 7
+ "Attributes", // 8
+ "Author", // 9
+ "AutoScale", // 10
+ "Back", // 11
+ "Bold", // 12
+ "Bottom", // 13
+ "Calculation", // 14
+ "Cell", // 15
+ "CellComment", // 16
+ "Cells", // 17
+ "CellsStr", // 18
+ "Col", // 19
+ "ColInfo", // 20
+ "Collapsed", // 21
+ "Color", // 22
+ "Cols", // 23
+ "Comment", // 24
+ "Condition", // 25
+ "Constr", // 26
+ "Content", // 27
+ "Count", // 28
+ "CursorCol", // 29
+ "CursorRow", // 30
+ "DateConvention", // 31
+ "DefaultSizePts", // 32
+ "Diagonal", // 33
+ "Direction", // 34
+ "Discr", // 35
+ "DisplayFormulas", // 36
+ "DisplayOutlines", // 37
+ "EnableIteration", // 38
+ "Epoch", // 39
+ "ExprConvention", // 40
+ "ExprID", // 41
+ "Expression0", // 42
+ "Expression1", // 43
+ "Field", // 44
+ "FillColor", // 45
+ "Filter", // 46
+ "Filters", // 47
+ "FloatDigits", // 48
+ "FloatRadix", // 49
+ "Font", // 50
+ "Footer", // 51
+ "Fore", // 52
+ "Format", // 53
+ "FreezePanes", // 54
+ "FrozenTopLeft", // 55
+ "Full", // 56
+ "Geometry", // 57
+ "GogObject", // 58
+ "GridColor", // 59
+ "HAlign", // 60
+ "HardSize", // 61
+ "Header", // 62
+ "Height", // 63
+ "Hidden", // 64
+ "HideColHeader", // 65
+ "HideGrid", // 66
+ "HideRowHeader", // 67
+ "HideZero", // 68
+ "HyperLink", // 69
+ "Inc", // 70
+ "Indent", // 71
+ "Index", // 72
+ "Input", // 73
+ "InputMessage", // 74
+ "Inputs", // 75
+ "Italic", // 76
+ "IterationTolerance", // 77
+ "Label", // 78
+ "LabelFormat", // 79
+ "Lcol", // 80
+ "Left", // 81
+ "LimitsR", // 82
+ "Locked", // 83
+ "Lrow", // 84
+ "Major", // 85
+ "ManualRecalc", // 86
+ "MarginA", // 87
+ "MarginB", // 88
+ "Margins", // 89
+ "Max", // 90
+ "MaxCol", // 91
+ "MaxIter", // 92
+ "MaxIterations", // 93
+ "MaxRow", // 94
+ "MaxTime", // 95
+ "Merge", // 96
+ "MergedRegions", // 97
+ "Message", // 98
+ "Middle", // 99
+ "Min", // 100
+ "Minor", // 101
+ "ModelType", // 102
+ "Name", // 103
+ "Names", // 104
+ "No", // 105
+ "NonNeg", // 106
+ "ObjectAnchorType", // 107
+ "ObjectBound", // 108
+ "ObjectOffset", // 109
+ "Objects", // 110
+ "Op0", // 111
+ "Op1", // 112
+ "Operator", // 113
+ "Orient", // 114
+ "OutlineColor", // 115
+ "OutlineLevel", // 116
+ "OutlineSymbolsBelow", // 117
+ "OutlineSymbolsRight", // 118
+ "Output", // 119
+ "Page", // 120
+ "PatternColor", // 121
+ "PerformR", // 122
+ "Points", // 123
+ "PrefUnit", // 124
+ "Print", // 125
+ "PrintInformation", // 126
+ "ProblemType", // 127
+ "ProgramR", // 128
+ "Protected", // 129
+ "RTL_Layout", // 130
+ "Rcol", // 131
+ "Rev-Diagonal", // 132
+ "Right", // 133
+ "Rotation", // 134
+ "Row", // 135
+ "RowInfo", // 136
+ "Rows", // 137
+ "Rrow", // 138
+ "Scale", // 139
+ "Scenario", // 140
+ "Scenarios", // 141
+ "Script", // 142
+ "SelectedTab", // 143
+ "Selection", // 144
+ "Selections", // 145
+ "SensitivityR", // 146
+ "Shade", // 147
+ "Sheet", // 148
+ "SheetLayout", // 149
+ "SheetName", // 150
+ "SheetNameIndex", // 151
+ "SheetObjectBonobo", // 152
+ "SheetObjectFilled", // 153
+ "SheetObjectGraph", // 154
+ "SheetObjectImage", // 155
+ "SheetWidgetButton", // 156
+ "SheetWidgetCheckbox", // 157
+ "SheetWidgetCombo", // 158
+ "SheetWidgetFrame", // 159
+ "SheetWidgetLabel", // 160
+ "SheetWidgetList", // 161
+ "SheetWidgetScrollbar", // 162
+ "SheetWidgetSlider", // 163
+ "SheetWidgetSpinbutton", // 164
+ "SheetWidgetToggleButton", // 165
+ "Sheets", // 166
+ "ShowIter", // 167
+ "ShrinkToFit", // 168
+ "Solver", // 169
+ "StrikeThrough", // 170
+ "Style", // 171
+ "StyleBorder", // 172
+ "StyleRegion", // 173
+ "Styles", // 174
+ "TabColor", // 175
+ "TabTextColor", // 176
+ "TargetCol", // 177
+ "TargetRow", // 178
+ "Text", // 179
+ "TextFormat", // 180
+ "Title", // 181
+ "Top", // 182
+ "TopLeft", // 183
+ "Type", // 184
+ "UIData", // 185
+ "Underline", // 186
+ "UnfrozenTopLeft", // 187
+ "Unit", // 188
+ "UseDropdown", // 189
+ "VAlign", // 190
+ "Validation", // 191
+ "Value", // 192
+ "Value0", // 193
+ "Value1", // 194
+ "ValueFormat", // 195
+ "ValueType", // 196
+ "ValueType0", // 197
+ "ValueType1", // 198
+ "Version", // 199
+ "Visibility", // 200
+ "Width", // 201
+ "Workbook", // 202
+ "WrapText", // 203
+ "Zoom", // 204
+ "bottom", // 205
+ "break", // 206
+ "cols", // 207
+ "count", // 208
+ "crop-bottom", // 209
+ "crop-left", // 210
+ "crop-right", // 211
+ "crop-top", // 212
+ "data", // 213
+ "dimension", // 214
+ "do_not_print", // 215
+ "draft", // 216
+ "endCol", // 217
+ "endRow", // 218
+ "even_if_only_styles", // 219
+ "footer", // 220
+ "grid", // 221
+ "hPageBreaks", // 222
+ "hcenter", // 223
+ "header", // 224
+ "id", // 225
+ "image-type", // 226
+ "items", // 227
+ "left", // 228
+ "monochrome", // 229
+ "name", // 230
+ "order", // 231
+ "orientation", // 232
+ "paper", // 233
+ "percentage", // 234
+ "pos", // 235
+ "position", // 236
+ "print-to-uri", // 237
+ "print_range", // 238
+ "property", // 239
+ "repeat_left", // 240
+ "repeat_top", // 241
+ "right", // 242
+ "role", // 243
+ "rows", // 244
+ "size-bytes", // 245
+ "startCol", // 246
+ "startRow", // 247
+ "target", // 248
+ "tip", // 249
+ "titles", // 250
+ "top", // 251
+ "type", // 252
+ "vPageBreaks", // 253
+ "value", // 254
+ "vcenter" // 255
+};
+
+size_t token_name_count = 256;
+
diff --git a/src/liborcus/gnumeric_types.cpp b/src/liborcus/gnumeric_types.cpp
new file mode 100644
index 0000000..c02627a
--- /dev/null
+++ b/src/liborcus/gnumeric_types.cpp
@@ -0,0 +1,174 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "gnumeric_types.hpp"
+#include "number_utils.hpp"
+
+#include <mdds/sorted_string_map.hpp>
+
+namespace ss = orcus::spreadsheet;
+
+namespace orcus {
+
+namespace value_format_type {
+
+using map_type = mdds::sorted_string_map<gnumeric_value_format_type, mdds::string_view_map_entry>;
+
+// Keys must be sorted.
+constexpr map_type::entry entries[] = {
+ { "bold", gnumeric_value_format_type::bold },
+ { "color", gnumeric_value_format_type::color },
+ { "family", gnumeric_value_format_type::family },
+ { "italic", gnumeric_value_format_type::italic },
+ { "size", gnumeric_value_format_type::size },
+ { "strikethrough", gnumeric_value_format_type::strikethrough },
+ { "subscript", gnumeric_value_format_type::subscript },
+ { "superscript", gnumeric_value_format_type::superscript },
+ { "underline", gnumeric_value_format_type::underline },
+};
+
+const map_type& get()
+{
+ static const map_type mt(entries, std::size(entries), gnumeric_value_format_type::unknown);
+ return mt;
+}
+
+} // namespace value_format_type
+
+ss::border_style_t to_standard_type(gnumeric_border_type v)
+{
+ switch (v)
+ {
+ case gnumeric_border_type::border_none:
+ return ss::border_style_t::none;
+ case gnumeric_border_type::border_thin:
+ return ss::border_style_t::thin;
+ case gnumeric_border_type::border_medium:
+ return ss::border_style_t::medium;
+ case gnumeric_border_type::border_dashed:
+ return ss::border_style_t::dashed;
+ case gnumeric_border_type::border_dotted:
+ return ss::border_style_t::dotted;
+ case gnumeric_border_type::border_thick:
+ return ss::border_style_t::thick;
+ case gnumeric_border_type::border_double:
+ return ss::border_style_t::double_border;
+ case gnumeric_border_type::border_hair:
+ return ss::border_style_t::hair;
+ case gnumeric_border_type::border_medium_dash:
+ return ss::border_style_t::medium_dashed;
+ case gnumeric_border_type::border_dash_dot:
+ return ss::border_style_t::dash_dot;
+ case gnumeric_border_type::border_medium_dash_dot:
+ return ss::border_style_t::medium_dash_dot;
+ case gnumeric_border_type::border_dash_dot_dot:
+ return ss::border_style_t::dash_dot_dot;
+ case gnumeric_border_type::border_medium_dash_dot_dot:
+ return ss::border_style_t::medium_dash_dot_dot;
+ case gnumeric_border_type::border_slanted_dash_dot:
+ return ss::border_style_t::slant_dash_dot;
+ }
+
+ return ss::border_style_t::unknown;
+}
+
+gnumeric_value_format_type to_gnumeric_value_format_type(std::string_view s)
+{
+ return value_format_type::get().find(s);
+}
+
+void gnumeric_named_exp::reset()
+{
+ name = std::string_view{};
+ value = std::string_view{};
+ position = {0, 0, 0};
+}
+
+bool gnumeric_style::valid() const
+{
+ if (sheet < 0)
+ return false;
+
+ if (region.first.column < 0 || region.first.row < 0 || region.last.column < 0 || region.last.row < 0)
+ return false;
+
+ return true;
+}
+
+std::optional<spreadsheet::color_rgb_t> parse_gnumeric_rgb(std::string_view v)
+{
+ ss::color_rgb_t color;
+
+ auto pos = v.find(':');
+ if (pos == v.npos)
+ return {};
+
+ std::string_view seg = v.substr(0, pos);
+
+ std::optional<std::uint16_t> elem = hex_to_uint16(seg);
+ if (!elem)
+ return {};
+
+ color.red = *elem >> 8; // 16-bit to 8-bit
+ v = v.substr(pos + 1);
+ pos = v.find(':');
+ if (pos == v.npos)
+ return {};
+
+ seg = v.substr(0, pos);
+ elem = hex_to_uint16(seg);
+ if (!elem)
+ return {};
+
+ color.green = *elem >> 8;
+ v = v.substr(pos + 1);
+ elem = hex_to_uint16(v);
+ if (!elem)
+ return {};
+
+ color.blue = *elem >> 8;
+ return color;
+}
+
+std::optional<spreadsheet::color_rgb_t> parse_gnumeric_rgb_8x(std::string_view v)
+{
+ ss::color_rgb_t color;
+
+ auto pos = v.find('x');
+ if (pos == v.npos)
+ return {};
+
+ std::string_view seg = v.substr(0, pos);
+
+ std::optional<std::uint16_t> elem = hex_to_uint8(seg);
+ if (!elem)
+ return {};
+
+ color.red = *elem;
+ v = v.substr(pos + 1);
+ pos = v.find('x');
+ if (pos == v.npos)
+ return {};
+
+ seg = v.substr(0, pos);
+ elem = hex_to_uint8(seg);
+ if (!elem)
+ return {};
+
+ color.green = *elem;
+ v = v.substr(pos + 1);
+ elem = hex_to_uint8(v);
+ if (!elem)
+ return {};
+
+ color.blue = *elem;
+ return color;
+}
+
+} // namespace orcus
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/gnumeric_types.hpp b/src/liborcus/gnumeric_types.hpp
new file mode 100644
index 0000000..1d8b928
--- /dev/null
+++ b/src/liborcus/gnumeric_types.hpp
@@ -0,0 +1,149 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#pragma once
+
+#include <orcus/spreadsheet/types.hpp>
+
+#include <string_view>
+#include <optional>
+
+namespace orcus {
+
+/**
+ * Values are as specified in the Gnumeric source code.
+ */
+enum gnumeric_value_type
+{
+ vt_empty = 10,
+ vt_boolean = 20,
+ vt_float = 40,
+ vt_error = 50,
+ vt_string = 60,
+ vt_cellrange = 70,
+ vt_array = 80
+};
+
+/**
+ * Values are as specified in the Gnumeric source code (see
+ * GnmStyleBorderType).
+ */
+enum class gnumeric_border_type
+{
+ border_none = 0x0,
+ border_thin = 0x1,
+ border_medium = 0x2,
+ border_dashed = 0x3,
+ border_dotted = 0x4,
+ border_thick = 0x5,
+ border_double = 0x6,
+ border_hair = 0x7,
+ border_medium_dash = 0x8,
+ border_dash_dot = 0x9,
+ border_medium_dash_dot = 0xA,
+ border_dash_dot_dot = 0xB,
+ border_medium_dash_dot_dot = 0xC,
+ border_slanted_dash_dot = 0xD,
+};
+
+spreadsheet::border_style_t to_standard_type(gnumeric_border_type v);
+
+enum class gnumeric_value_format_type
+{
+ unknown,
+ bold,
+ color,
+ family,
+ italic,
+ size,
+ strikethrough,
+ subscript,
+ superscript,
+ underline,
+};
+
+gnumeric_value_format_type to_gnumeric_value_format_type(std::string_view s);
+
+struct gnumeric_value_format_segment
+{
+ gnumeric_value_format_type type = gnumeric_value_format_type::unknown;
+ std::string_view value;
+ std::size_t start = 0;
+ std::size_t end = 0;
+};
+
+enum gnumeric_script_type
+{
+ gnm_script_none = 0,
+ gnm_script_super = 1,
+ gnm_script_sub = -1
+};
+
+struct gnumeric_named_exp
+{
+ std::string_view name;
+ std::string_view value;
+ spreadsheet::src_address_t position = {0, 0, 0};
+
+ void reset();
+};
+
+struct gnumeric_style
+{
+ struct border_type
+ {
+ std::optional<gnumeric_border_type> style;
+ std::optional<spreadsheet::color_rgb_t> color;
+ };
+
+ spreadsheet::sheet_t sheet = -1;
+ spreadsheet::range_t region = {{-1, -1}, {-1, -1}};
+ spreadsheet::hor_alignment_t hor_align = spreadsheet::hor_alignment_t::unknown;
+ spreadsheet::ver_alignment_t ver_align = spreadsheet::ver_alignment_t::unknown;
+
+ std::optional<std::string_view> font_name;
+ std::optional<double> font_unit;
+
+ std::optional<bool> wrap_text;
+ std::optional<bool> bold;
+ std::optional<bool> italic;
+ std::optional<bool> underline;
+ std::optional<bool> strikethrough;
+ std::optional<gnumeric_script_type> script; // TODO : not supported yet
+
+ std::optional<spreadsheet::color_rgb_t> fore;
+ std::optional<spreadsheet::color_rgb_t> back;
+ std::optional<spreadsheet::color_rgb_t> pattern_color;
+ spreadsheet::fill_pattern_t pattern = spreadsheet::fill_pattern_t::none;
+
+ std::optional<std::string_view> number_format;
+
+ border_type border_top;
+ border_type border_bottom;
+ border_type border_left;
+ border_type border_right;
+ border_type border_bl_tr; // bottom-left to top-right (diagonal)
+ border_type border_br_tl; // top-left to bottom-right (rev-diagonal)
+
+ bool valid() const;
+};
+
+/**
+ * Parse an RGB color encoded as 'RRRR:GGGG:BBBB', each element being a 16-bit
+ * hex value.
+ */
+std::optional<spreadsheet::color_rgb_t> parse_gnumeric_rgb(std::string_view v);
+
+/**
+ * Parse an RGB color encoded as 'RRxGGxBB', each element being an 8-bit hex
+ * value.
+ */
+std::optional<spreadsheet::color_rgb_t> parse_gnumeric_rgb_8x(std::string_view v);
+
+} // namespace orcus
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/gnumeric_value_format_parser.cpp b/src/liborcus/gnumeric_value_format_parser.cpp
new file mode 100644
index 0000000..014068e
--- /dev/null
+++ b/src/liborcus/gnumeric_value_format_parser.cpp
@@ -0,0 +1,131 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "gnumeric_value_format_parser.hpp"
+#include <orcus/exception.hpp>
+#include <orcus/measurement.hpp>
+
+#include <cassert>
+#include <sstream>
+
+#include <boost/numeric/conversion/cast.hpp>
+
+using boost::numeric_cast;
+
+namespace orcus {
+
+std::size_t gnumeric_value_format_parser::get_pos() const
+{
+ return std::distance(m_head, m_cur);
+}
+
+void gnumeric_value_format_parser::segment()
+{
+ // segment: [type=value:start:end]
+
+ assert(*m_cur == '[');
+ const char* p0 = nullptr;
+ std::size_t pos = 0;
+
+ gnumeric_value_format_segment seg;
+
+ for (++m_cur; m_cur != m_end; ++m_cur)
+ {
+ if (!p0)
+ p0 = m_cur;
+
+ switch (*m_cur)
+ {
+ case ']':
+ {
+ if (pos != 2)
+ throw parse_error("value format segment is not formatted properly", get_pos());
+
+ auto n = std::distance(p0, m_cur);
+ std::string_view s{p0, numeric_cast<std::size_t>(n)};
+ if (s.empty())
+ throw parse_error("segment value is empty", get_pos());
+
+ seg.end = to_long(s);
+ m_segments.push_back(std::move(seg));
+ return;
+ }
+ case '=':
+ {
+ auto n = std::distance(p0, m_cur);
+ std::string_view s{p0, numeric_cast<std::size_t>(n)};
+ seg.type = to_gnumeric_value_format_type(s);
+ if (seg.type == gnumeric_value_format_type::unknown)
+ {
+ std::ostringstream os;
+ os << "invalid value format type '" << s << "'";
+ throw parse_error(os.str(), get_pos());
+ }
+
+ p0 = nullptr;
+ break;
+ }
+ case ':':
+ {
+ auto n = std::distance(p0, m_cur);
+ std::string_view s{p0, numeric_cast<std::size_t>(n)};
+
+ switch (pos)
+ {
+ case 0:
+ seg.value = s;
+ break;
+ case 1:
+ seg.start = to_long(s);
+ break;
+ default:
+ throw parse_error("too many value partitions", get_pos());
+ }
+
+ p0 = nullptr;
+ ++pos;
+ break;
+ }
+ }
+ }
+
+ throw parse_error("']' was never reached", get_pos());
+}
+
+gnumeric_value_format_parser::gnumeric_value_format_parser(std::string_view format) :
+ m_head(format.data()), m_cur(m_head), m_end(m_head + format.size())
+{
+}
+
+void gnumeric_value_format_parser::parse()
+{
+ if (m_cur == m_end)
+ return;
+
+ // @[segment][segment][segment]...
+
+ if (*m_cur++ != '@')
+ throw parse_error("first character must be '@'", get_pos());
+
+ for (; m_cur != m_end; ++m_cur)
+ {
+ if (*m_cur != '[')
+ throw parse_error("'[' was expected", get_pos());
+
+ segment();
+ assert(*m_cur == ']');
+ }
+}
+
+std::vector<gnumeric_value_format_segment> gnumeric_value_format_parser::pop_segments()
+{
+ return std::move(m_segments);
+}
+
+} // namespace orcus
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/gnumeric_value_format_parser.hpp b/src/liborcus/gnumeric_value_format_parser.hpp
new file mode 100644
index 0000000..83cc6dd
--- /dev/null
+++ b/src/liborcus/gnumeric_value_format_parser.hpp
@@ -0,0 +1,46 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#pragma once
+
+#include <string_view>
+#include <vector>
+
+#include "gnumeric_types.hpp"
+
+namespace orcus {
+
+class gnumeric_value_format_parser
+{
+ const char* m_head = nullptr;
+ const char* m_cur = nullptr;
+ const char* m_end = nullptr;
+
+ std::vector<gnumeric_value_format_segment> m_segments;
+
+private:
+ std::size_t get_pos() const;
+
+ void segment();
+
+public:
+ /**
+ * Constructor.
+ *
+ * @param format Format string containing one or more format segments. Make
+ * sure the source of this string is persisent!
+ */
+ gnumeric_value_format_parser(std::string_view format);
+
+ void parse();
+
+ std::vector<gnumeric_value_format_segment> pop_segments();
+};
+
+} // namespace orcus
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/impl_utils.hpp b/src/liborcus/impl_utils.hpp
new file mode 100644
index 0000000..9b8cd2e
--- /dev/null
+++ b/src/liborcus/impl_utils.hpp
@@ -0,0 +1,18 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#pragma once
+
+#define ENSURE_INTERFACE(PTR, NAME) \
+ do \
+ { \
+ if (!PTR) \
+ throw orcus::interface_error( \
+ "implementer must provide a concrete instance of " #NAME "."); \
+ } while (false)
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/info.cpp b/src/liborcus/info.cpp
new file mode 100644
index 0000000..ae571f5
--- /dev/null
+++ b/src/liborcus/info.cpp
@@ -0,0 +1,31 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/info.hpp"
+
+#include "constants.inl"
+
+namespace orcus {
+
+int get_version_major()
+{
+ return ORCUS_MAJOR_VERSION;
+}
+
+int get_version_minor()
+{
+ return ORCUS_MINOR_VERSION;
+}
+
+int get_version_micro()
+{
+ return ORCUS_MICRO_VERSION;
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/interface.cpp b/src/liborcus/interface.cpp
new file mode 100644
index 0000000..2b743a2
--- /dev/null
+++ b/src/liborcus/interface.cpp
@@ -0,0 +1,37 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/interface.hpp"
+#include "orcus/config.hpp"
+
+namespace orcus { namespace iface {
+
+struct import_filter::impl
+{
+ orcus::config m_config;
+
+ impl(format_t input) : m_config(input) {}
+};
+
+import_filter::import_filter(format_t input) : mp_impl(std::make_unique<impl>(input)) {}
+
+import_filter::~import_filter() = default;
+
+void import_filter::set_config(const config& v)
+{
+ mp_impl->m_config = v;
+}
+
+const config& import_filter::get_config() const
+{
+ return mp_impl->m_config;
+}
+
+document_dumper::~document_dumper() = default;
+
+}}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/json_document_tree.cpp b/src/liborcus/json_document_tree.cpp
new file mode 100644
index 0000000..009aa08
--- /dev/null
+++ b/src/liborcus/json_document_tree.cpp
@@ -0,0 +1,1777 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/json_document_tree.hpp>
+#include <orcus/json_parser.hpp>
+#include <orcus/config.hpp>
+#include <orcus/stream.hpp>
+#include <orcus/string_pool.hpp>
+
+#include "json_util.hpp"
+
+#include <string>
+#include <vector>
+#include <unordered_map>
+#include <sstream>
+#include <string_view>
+#include <limits>
+#include <iostream>
+#include <deque>
+
+#include <boost/current_function.hpp>
+#include <boost/pool/object_pool.hpp>
+
+#include "filesystem_env.hpp"
+
+namespace orcus { namespace json {
+
+namespace {
+
+struct json_value_object;
+struct json_value_array;
+
+}
+
+struct document_resource
+{
+ string_pool str_pool;
+ boost::object_pool<json_value> obj_pool;
+ boost::object_pool<json_value_object> obj_pool_jvo;
+ boost::object_pool<json_value_array> obj_pool_jva;
+};
+
+namespace detail {
+
+enum class node_t : int
+{
+ // These must have the same values as their public counterparts.
+ unset = static_cast<int>(json::node_t::unset),
+ string = static_cast<int>(json::node_t::string),
+ number = static_cast<int>(json::node_t::number),
+ object = static_cast<int>(json::node_t::object),
+ array = static_cast<int>(json::node_t::array),
+ boolean_true = static_cast<int>(json::node_t::boolean_true),
+ boolean_false = static_cast<int>(json::node_t::boolean_false),
+ null = static_cast<int>(json::node_t::null),
+
+ /**
+ * Value that represents a single key-value pair. This is an internal
+ * only type, and only to be used in the initializer.
+ */
+ key_value = 10,
+
+ /**
+ * Implicit array initialized with a {} instead of explicit array().
+ */
+ array_implicit = 11,
+};
+
+std::ostream& operator<< (std::ostream& os, node_t nt)
+{
+ static const char* unknown = "???";
+
+ static std::vector<const char*> values =
+ {
+ "unset", // 0
+ "string", // 1
+ "number", // 2
+ "object", // 3
+ "array", // 4
+ "boolean_true", // 5
+ "boolean_false", // 6
+ "null", // 7
+ unknown, // 8
+ unknown, // 9
+ "key_value", // 10
+ "array_implicit", // 11
+ };
+
+ size_t nt_value = size_t(nt);
+
+ if (nt_value < values.size())
+ os << values[nt_value];
+ else
+ os << unknown;
+
+ return os;
+}
+
+}
+
+document_error::document_error(const std::string& msg) :
+ general_error("json::document_error", msg) {}
+
+document_error::~document_error() = default;
+
+key_value_error::key_value_error(const std::string& msg) :
+ document_error(msg) {}
+
+key_value_error::~key_value_error() = default;
+
+struct json_value final
+{
+ detail::node_t type;
+ json_value* parent;
+
+ union
+ {
+ double numeric;
+
+ struct
+ {
+ const char* p;
+ size_t n;
+
+ } str;
+
+ struct
+ {
+ const char* key;
+ size_t n_key;
+ json_value* value;
+
+ } kvp; // key-value pair
+
+ json_value_object* object;
+ json_value_array* array;
+
+ } value;
+
+ json_value(const json_value&) = delete;
+ json_value& operator= (const json_value&) = delete;
+
+ json_value() : type(detail::node_t::unset), parent(nullptr) {}
+ json_value(detail::node_t _type) : type(_type), parent(nullptr) {}
+ ~json_value() {}
+};
+
+namespace {
+
+const char* tab = " ";
+const char quote = '"';
+
+const xmlns_id_t NS_orcus_json_xml = "http://schemas.kohei.us/orcus/2015/json";
+
+struct json_value_array
+{
+ std::vector<json_value*> value_array;
+};
+
+struct json_value_object
+{
+ using object_type = std::unordered_map<std::string_view, json_value*>;
+
+ std::vector<std::string_view> key_order;
+ object_type value_object;
+
+ bool has_ref;
+
+ json_value_object() : has_ref(false) {}
+
+ void swap(json_value_object& src)
+ {
+ key_order.swap(src.key_order);
+ value_object.swap(src.value_object);
+ }
+};
+
+void dump_repeat(std::ostringstream& os, const char* s, int repeat)
+{
+ for (int i = 0; i < repeat; ++i)
+ os << s;
+}
+
+void dump_item(
+ std::ostringstream& os, const std::string_view* key, const json_value* val,
+ int level, bool sep);
+
+void dump_value(std::ostringstream& os, const json_value* v, int level, const std::string_view* key = nullptr)
+{
+ dump_repeat(os, tab, level);
+
+ if (key)
+ os << quote << *key << quote << ": ";
+
+ switch (v->type)
+ {
+ case detail::node_t::array:
+ {
+ auto& vals = v->value.array->value_array;
+ os << "[" << std::endl;
+ size_t n = vals.size();
+ size_t pos = 0;
+ for (auto it = vals.begin(), ite = vals.end(); it != ite; ++it, ++pos)
+ dump_item(os, nullptr, *it, level, pos < (n-1));
+
+ dump_repeat(os, tab, level);
+ os << "]";
+ }
+ break;
+ case detail::node_t::boolean_false:
+ os << "false";
+ break;
+ case detail::node_t::boolean_true:
+ os << "true";
+ break;
+ case detail::node_t::null:
+ os << "null";
+ break;
+ case detail::node_t::number:
+ os << v->value.numeric;
+ break;
+ case detail::node_t::object:
+ {
+ const std::vector<std::string_view>& key_order = v->value.object->key_order;
+ auto& vals = v->value.object->value_object;
+ os << "{" << std::endl;
+ size_t n = vals.size();
+
+ if (key_order.empty())
+ {
+ // Dump object's children unordered.
+ size_t pos = 0;
+ for (auto it = vals.begin(), ite = vals.end(); it != ite; ++it, ++pos)
+ {
+ std::string_view this_key = it->first;
+ auto& this_val = it->second;
+
+ dump_item(os, &this_key, this_val, level, pos < (n-1));
+ }
+ }
+ else
+ {
+ // Dump them based on key's original ordering.
+ size_t pos = 0;
+ for (auto it = key_order.begin(), ite = key_order.end(); it != ite; ++it, ++pos)
+ {
+ std::string_view this_key = *it;
+ auto val_pos = vals.find(this_key);
+ assert(val_pos != vals.end());
+
+ dump_item(os, &this_key, val_pos->second, level, pos < (n-1));
+ }
+ }
+
+ dump_repeat(os, tab, level);
+ os << "}";
+ }
+ break;
+ case detail::node_t::string:
+ json::dump_string(
+ os,
+ std::string(v->value.str.p, v->value.str.n));
+ break;
+ case detail::node_t::unset:
+ default:
+ ;
+ }
+}
+
+void dump_item(
+ std::ostringstream& os, const std::string_view* key, const json_value* val,
+ int level, bool sep)
+{
+ dump_value(os, val, level+1, key);
+ if (sep)
+ os << ",";
+ os << std::endl;
+}
+
+std::string dump_json_tree(const json_value* root)
+{
+ if (root->type == detail::node_t::unset)
+ return std::string();
+
+ std::ostringstream os;
+ dump_value(os, root, 0);
+ return os.str();
+}
+
+void dump_string_xml(std::ostringstream& os, std::string_view s)
+{
+ const char* p = s.data();
+ const char* p_end = p + s.size();
+ for (; p != p_end; ++p)
+ {
+ char c = *p;
+ switch (c)
+ {
+ case '"':
+ os << "&quot;";
+ break;
+ case '<':
+ os << "&lt;";
+ break;
+ case '>':
+ os << "&gt;";
+ break;
+ case '&':
+ os << "&amp;";
+ break;
+ case '\'':
+ os << "&apos;";
+ break;
+ default:
+ os << c;
+ }
+ }
+}
+
+void dump_object_item_xml(
+ std::ostringstream& os, std::string_view key, const json_value* val, int level);
+
+void dump_value_xml(std::ostringstream& os, const json_value* v, int level)
+{
+ switch (v->type)
+ {
+ case detail::node_t::array:
+ {
+ os << "<array";
+ if (level == 0)
+ os << " xmlns=\"" << NS_orcus_json_xml << "\"";
+ os << ">";
+
+ auto& vals = v->value.array->value_array;
+
+ for (auto it = vals.begin(), ite = vals.end(); it != ite; ++it)
+ {
+ os << "<item>";
+ dump_value_xml(os, *it, level+1);
+ os << "</item>";
+ }
+
+ os << "</array>";
+ }
+ break;
+ case detail::node_t::boolean_false:
+ os << "<false/>";
+ break;
+ case detail::node_t::boolean_true:
+ os << "<true/>";
+ break;
+ case detail::node_t::null:
+ os << "<null/>";
+ break;
+ case detail::node_t::number:
+ os << "<number value=\"";
+ os << v->value.numeric;
+ os << "\"/>";
+ break;
+ case detail::node_t::object:
+ {
+ os << "<object";
+ if (level == 0)
+ os << " xmlns=\"" << NS_orcus_json_xml << "\"";
+ os << ">";
+
+ const json_value_object& jvo = *v->value.object;
+ auto& key_order = jvo.key_order;
+ auto& vals = jvo.value_object;
+
+ if (key_order.empty())
+ {
+ // Dump object's children unordered.
+ for (auto it = vals.begin(), ite = vals.end(); it != ite; ++it)
+ {
+ auto& key = it->first;
+ auto& val = it->second;
+ dump_object_item_xml(os, key, val, level);
+ }
+ }
+ else
+ {
+ // Dump them based on key's original ordering.
+ for (auto it = key_order.begin(), ite = key_order.end(); it != ite; ++it)
+ {
+ auto& key = *it;
+ auto val_pos = vals.find(key);
+ assert(val_pos != vals.end());
+
+ dump_object_item_xml(os, key, val_pos->second, level);
+ }
+ }
+
+ os << "</object>";
+ }
+ break;
+ case detail::node_t::string:
+ os << "<string value=\"";
+ dump_string_xml(os, std::string_view(v->value.str.p, v->value.str.n));
+ os << "\"/>";
+ break;
+ case detail::node_t::unset:
+ default:
+ ;
+ }
+}
+
+class yaml_dumper
+{
+ enum class write_type { unspecified, indent, linebreak, value };
+
+ std::size_t m_indent_length = 0;
+ write_type m_last_write = write_type::unspecified;
+
+ void reset()
+ {
+ m_indent_length = 0;
+ m_last_write = write_type::unspecified;
+ }
+
+ static bool needs_quote(std::string_view s)
+ {
+ char c_prev = 0;
+
+ for (char c : s)
+ {
+ switch (c)
+ {
+ case '#':
+ return true;
+ case ' ':
+ if (c_prev == ':')
+ return true;
+ }
+
+ c_prev = c;
+ }
+
+ return false;
+ }
+
+public:
+ std::string dump(const json_value* root)
+ {
+ if (!root || root->type == detail::node_t::unset)
+ return std::string();
+
+ reset();
+
+ std::ostringstream os;
+ os << "---" << std::endl;
+ write_value(os, root);
+ return os.str();
+ }
+
+private:
+ void write_indent(std::ostringstream& os)
+ {
+ m_last_write = write_type::indent;
+
+ for (std::size_t i = 0; i < m_indent_length; ++i)
+ os << ' ';
+ }
+
+ void write_linebreak(std::ostringstream& os)
+ {
+ if (m_last_write == write_type::linebreak)
+ return;
+
+ m_last_write = write_type::linebreak;
+ os << std::endl;
+ }
+
+ void write_string(std::ostringstream& os, std::string_view s)
+ {
+ bool quote_value = needs_quote(s);
+
+ if (quote_value)
+ os << '"';
+
+ os << s;
+
+ if (quote_value)
+ os << '"';
+ }
+
+ void write_value(std::ostringstream& os, const json_value* v)
+ {
+ m_last_write = write_type::value;
+ detail::node_t parent_type = v->parent ? v->parent->type : detail::node_t::unset;
+
+ switch (v->type)
+ {
+ case detail::node_t::array:
+ {
+ if (parent_type != detail::node_t::unset)
+ write_linebreak(os);
+
+ for (const json_value* cv : v->value.array->value_array)
+ {
+ write_indent(os);
+ os << "- ";
+ m_indent_length += 2;
+ write_value(os, cv);
+ m_indent_length -= 2;
+ write_linebreak(os);
+ }
+ break;
+ }
+ case detail::node_t::boolean_false:
+ os << "false";
+ break;
+ case detail::node_t::boolean_true:
+ os << "true";
+ break;
+ case detail::node_t::null:
+ os << "null";
+ break;
+ case detail::node_t::number:
+ {
+ os << v->value.numeric;
+ break;
+ }
+ case detail::node_t::object:
+ {
+ const json_value_object& jvo = *v->value.object;
+ const std::vector<std::string_view>& key_order = jvo.key_order;
+ const json_value_object::object_type& vals = jvo.value_object;
+
+ std::deque<std::tuple<std::string_view, const json_value*>> key_values;
+
+ if (key_order.empty())
+ {
+ // Dump object's children unordered.
+ for (const auto& val : vals)
+ key_values.emplace_back(val.first, val.second);
+ }
+ else
+ {
+ // Dump them based on key's original ordering.
+ for (std::string_view key : key_order)
+ {
+ auto val_pos = vals.find(key);
+ assert(val_pos != vals.end());
+ key_values.emplace_back(key, val_pos->second);
+ }
+ }
+
+ if (key_values.empty())
+ break;
+
+ auto write_key_value = [this, &os](std::string_view key, const json_value* value)
+ {
+ std::size_t indent_add = 2;
+ write_string(os, key);
+ os << ": ";
+ m_indent_length += indent_add;
+ write_value(os, value);
+ m_indent_length -= indent_add;
+ write_linebreak(os);
+ };
+
+ if (parent_type == detail::node_t::array)
+ {
+ // Parent is an array. Continue on the "bullet" line.
+ write_key_value(std::get<0>(key_values[0]), std::get<1>(key_values[0]));
+ key_values.pop_front();
+ }
+ else if (parent_type != detail::node_t::unset)
+ write_linebreak(os);
+
+ for (auto& [key, value] : key_values)
+ {
+ write_indent(os);
+ write_key_value(key, value);
+ }
+
+ break;
+ }
+ case detail::node_t::string:
+ {
+ write_string(os, {v->value.str.p, v->value.str.n});
+ break;
+ }
+ case detail::node_t::unset:
+ default:
+ ;
+ }
+ }
+};
+
+void dump_object_item_xml(
+ std::ostringstream& os, std::string_view key, const json_value* val, int level)
+{
+ os << "<item name=\"";
+ dump_string_xml(os, key);
+ os << "\">";
+ dump_value_xml(os, val, level+1);
+ os << "</item>";
+}
+
+std::string dump_xml_tree(const json_value* root)
+{
+ if (root->type == detail::node_t::unset)
+ return std::string();
+
+ std::ostringstream os;
+ os << "<?xml version=\"1.0\"?>" << std::endl;
+ dump_value_xml(os, root, 0);
+ os << std::endl;
+ return os.str();
+}
+
+struct parser_stack
+{
+ std::string_view key;
+ json_value* node;
+
+ parser_stack(json_value* _node) : node(_node) {}
+};
+
+struct external_ref
+{
+ std::string_view path;
+ json_value_object* dest;
+
+ external_ref(std::string_view _path, json_value_object* _dest) :
+ path(_path), dest(_dest) {}
+};
+
+class parser_handler
+{
+ json_value* m_root;
+ const json_config& m_config;
+
+ std::vector<parser_stack> m_stack;
+ std::vector<external_ref> m_external_refs;
+
+ document_resource& m_res;
+
+ json_value* push_value(json_value* value)
+ {
+ assert(!m_stack.empty());
+ parser_stack& cur = m_stack.back();
+
+ switch (cur.node->type)
+ {
+ case detail::node_t::array:
+ {
+ json_value_array* jva = cur.node->value.array;
+ value->parent = cur.node;
+ jva->value_array.push_back(value);
+ return jva->value_array.back();
+ }
+ case detail::node_t::object:
+ {
+ std::string_view key = cur.key;
+ json_value_object* jvo = cur.node->value.object;
+ value->parent = cur.node;
+
+ if (m_config.resolve_references &&
+ key == "$ref" && value->type == detail::node_t::string)
+ {
+ std::string_view sv(value->value.str.p, value->value.str.n);
+ if (!jvo->has_ref && !sv.empty() && sv[0] != '#')
+ {
+ // Store the external reference path and the destination
+ // object for later processing.
+ m_external_refs.emplace_back(sv, jvo);
+ jvo->has_ref = true;
+ }
+ }
+
+ if (m_config.preserve_object_order)
+ jvo->key_order.push_back(key);
+
+ auto r = jvo->value_object.insert(std::make_pair(key, value));
+
+ if (!r.second)
+ throw document_error("adding the same key twice");
+
+ return r.first->second;
+ }
+ default:
+ break;
+ }
+
+ std::ostringstream os;
+ os << BOOST_CURRENT_FUNCTION << ": unstackable JSON value type.";
+ throw document_error(os.str());
+ }
+
+public:
+ parser_handler(const json_config& config, document_resource& res) :
+ m_root(nullptr), m_config(config), m_res(res) {}
+
+ void begin_parse()
+ {
+ m_root = nullptr;
+ }
+
+ void end_parse()
+ {
+ }
+
+ void begin_array()
+ {
+ if (m_root)
+ {
+ json_value* jv = m_res.obj_pool.construct(detail::node_t::array);
+ jv->value.array = m_res.obj_pool_jva.construct();
+ jv = push_value(jv);
+ assert(jv && jv->type == detail::node_t::array);
+ m_stack.push_back(parser_stack(jv));
+ }
+ else
+ {
+ m_root = m_res.obj_pool.construct(detail::node_t::array);
+ m_root->value.array = m_res.obj_pool_jva.construct();
+ m_stack.push_back(parser_stack(m_root));
+ }
+ }
+
+ void end_array()
+ {
+ assert(!m_stack.empty());
+ m_stack.pop_back();
+ }
+
+ void begin_object()
+ {
+ if (m_root)
+ {
+ json_value* jv = m_res.obj_pool.construct(detail::node_t::object);
+ jv->value.object = m_res.obj_pool_jvo.construct();
+ jv = push_value(jv);
+ assert(jv && jv->type == detail::node_t::object);
+ m_stack.push_back(parser_stack(jv));
+ }
+ else
+ {
+ m_root = m_res.obj_pool.construct(detail::node_t::object);
+ m_root->value.object = m_res.obj_pool_jvo.construct();
+ m_stack.push_back(parser_stack(m_root));
+ }
+ }
+
+ void object_key(std::string_view key, bool transient)
+ {
+ parser_stack& cur = m_stack.back();
+ cur.key = key;
+ if (m_config.persistent_string_values || transient)
+ // The tree manages the life cycle of this string value.
+ cur.key = m_res.str_pool.intern(cur.key).first;
+ }
+
+ void end_object()
+ {
+ assert(!m_stack.empty());
+ m_stack.pop_back();
+ }
+
+ void boolean_true()
+ {
+ push_value(m_res.obj_pool.construct(detail::node_t::boolean_true));
+ }
+
+ void boolean_false()
+ {
+ push_value(m_res.obj_pool.construct(detail::node_t::boolean_false));
+ }
+
+ void null()
+ {
+ push_value(m_res.obj_pool.construct(detail::node_t::null));
+ }
+
+ void string(std::string_view s, bool transient)
+ {
+ if (m_config.persistent_string_values || transient)
+ // The tree manages the life cycle of this string value.
+ s = m_res.str_pool.intern(s).first;
+
+ json_value* jv = m_res.obj_pool.construct(detail::node_t::string);
+ jv->value.str.p = s.data();
+ jv->value.str.n = s.size();
+ push_value(jv);
+ }
+
+ void number(double val)
+ {
+ json_value* jv = m_res.obj_pool.construct(detail::node_t::number);
+ jv->value.numeric = val;
+ push_value(jv);
+ }
+
+ json_value* get_root()
+ {
+ return m_root;
+ }
+
+ const std::vector<external_ref>& get_external_refs() const
+ {
+ return m_external_refs;
+ }
+};
+
+} // anonymous namespace
+
+struct const_node::impl
+{
+ const document_tree* m_doc;
+ json_value* m_node;
+
+ impl(const document_tree* doc, json_value* jv) : m_doc(doc), m_node(jv) {}
+ impl(const impl& other) : m_doc(other.m_doc), m_node(other.m_node) {}
+};
+
+const_node::const_node(const document_tree* doc, json_value* jv) : mp_impl(std::make_unique<impl>(doc, jv)) {}
+const_node::const_node(std::unique_ptr<impl>&& p) : mp_impl(std::move(p)) {}
+const_node::const_node(const const_node& other) : mp_impl(std::make_unique<impl>(*other.mp_impl)) {}
+const_node::const_node(const_node&& rhs) : mp_impl(std::move(rhs.mp_impl)) {}
+const_node::~const_node() {}
+
+const_node& const_node::operator=(const const_node& other)
+{
+ if (this == &other)
+ return *this;
+
+ const_node tmp(other);
+ mp_impl.swap(tmp.mp_impl);
+ return *this;
+}
+
+const_node& const_node::operator=(const_node&& other)
+{
+ if (this == &other)
+ return *this;
+
+ mp_impl = std::move(other.mp_impl);
+ return *this;
+}
+
+uintptr_t const_node::identity() const
+{
+ return reinterpret_cast<uintptr_t>(mp_impl->m_node);
+}
+
+const_node_iterator const_node::begin() const
+{
+ if (mp_impl->m_node->type != detail::node_t::array)
+ throw document_error("const_node::begin: this method only supports array nodes.");
+
+ return const_node_iterator(mp_impl->m_doc, *this, true);
+}
+
+const_node_iterator const_node::end() const
+{
+ if (mp_impl->m_node->type != detail::node_t::array)
+ throw document_error("const_node::end: this method only supports array nodes.");
+
+ return const_node_iterator(mp_impl->m_doc, *this, false);
+}
+
+node_t const_node::type() const
+{
+ // Convert it back to the public enum type.
+ return static_cast<node_t>(mp_impl->m_node->type);
+}
+
+size_t const_node::child_count() const
+{
+ switch (mp_impl->m_node->type)
+ {
+ case detail::node_t::object:
+ return mp_impl->m_node->value.object->value_object.size();
+ case detail::node_t::array:
+ return mp_impl->m_node->value.array->value_array.size();
+ case detail::node_t::string:
+ case detail::node_t::number:
+ case detail::node_t::boolean_true:
+ case detail::node_t::boolean_false:
+ case detail::node_t::null:
+ case detail::node_t::unset:
+ default:
+ ;
+ }
+ return 0;
+}
+
+std::vector<std::string_view> const_node::keys() const
+{
+ if (mp_impl->m_node->type != detail::node_t::object)
+ throw document_error("node::keys: this node is not of object type.");
+
+ const json_value_object* jvo = mp_impl->m_node->value.object;
+ if (!jvo->key_order.empty())
+ // Prefer to use key_order when it's populated.
+ return jvo->key_order;
+
+ std::vector<std::string_view> keys;
+
+ for (const auto& n : jvo->value_object)
+ keys.push_back(n.first);
+
+ return keys;
+}
+
+std::string_view const_node::key(size_t index) const
+{
+ if (mp_impl->m_node->type != detail::node_t::object)
+ throw document_error("node::key: this node is not of object type.");
+
+ const json_value_object* jvo = mp_impl->m_node->value.object;
+ if (index >= jvo->key_order.size())
+ throw std::out_of_range("node::key: index is out-of-range.");
+
+ return jvo->key_order[index];
+}
+
+bool const_node::has_key(std::string_view key) const
+{
+ if (mp_impl->m_node->type != detail::node_t::object)
+ return false;
+
+ const json_value_object* jvo = mp_impl->m_node->value.object;
+ const json_value_object::object_type& children = jvo->value_object;
+
+ return children.count(key) != 0;
+}
+
+const_node const_node::child(size_t index) const
+{
+ switch (mp_impl->m_node->type)
+ {
+ case detail::node_t::object:
+ {
+ // This works only when the key order is preserved.
+ const json_value_object* jvo = mp_impl->m_node->value.object;
+ if (index >= jvo->key_order.size())
+ throw std::out_of_range("node::child: index is out-of-range");
+
+ std::string_view key = jvo->key_order[index];
+ auto it = jvo->value_object.find(key);
+ assert(it != jvo->value_object.end());
+ return const_node(mp_impl->m_doc, it->second);
+ }
+ break;
+ case detail::node_t::array:
+ {
+ const json_value_array* jva = mp_impl->m_node->value.array;
+ if (index >= jva->value_array.size())
+ throw std::out_of_range("node::child: index is out-of-range");
+
+ return const_node(mp_impl->m_doc, jva->value_array[index]);
+ }
+ break;
+ case detail::node_t::string:
+ case detail::node_t::number:
+ case detail::node_t::boolean_true:
+ case detail::node_t::boolean_false:
+ case detail::node_t::null:
+ case detail::node_t::unset:
+ default:
+ throw document_error("node::child: this node cannot have child nodes.");
+ }
+}
+
+const_node const_node::child(std::string_view key) const
+{
+ if (mp_impl->m_node->type != detail::node_t::object)
+ throw document_error("node::child: this node is not of object type.");
+
+ const json_value_object* jvo = mp_impl->m_node->value.object;
+ auto it = jvo->value_object.find(key);
+ if (it == jvo->value_object.end())
+ {
+ std::ostringstream os;
+ os << "node::child: this object does not have a key labeled '" << key << "'";
+ throw document_error(os.str());
+ }
+
+ return const_node(mp_impl->m_doc, it->second);
+}
+
+const_node const_node::parent() const
+{
+ if (!mp_impl->m_node->parent)
+ throw document_error("node::parent: this node has no parent.");
+
+ return const_node(mp_impl->m_doc, mp_impl->m_node->parent);
+}
+
+const_node const_node::back() const
+{
+ if (mp_impl->m_node->type != detail::node_t::array)
+ throw document_error("const_node::child: this node is not of array type.");
+
+ const json_value_array* jva = mp_impl->m_node->value.array;
+ if (jva->value_array.empty())
+ throw document_error("const_node::child: this node has no children.");
+
+ return const_node(mp_impl->m_doc, jva->value_array.back());
+}
+
+std::string_view const_node::string_value() const
+{
+ if (mp_impl->m_node->type != detail::node_t::string)
+ throw document_error("node::key: current node is not of string type.");
+
+ return std::string_view(mp_impl->m_node->value.str.p, mp_impl->m_node->value.str.n);
+}
+
+double const_node::numeric_value() const
+{
+ if (mp_impl->m_node->type != detail::node_t::number)
+ throw document_error("node::key: current node is not of numeric type.");
+
+ return mp_impl->m_node->value.numeric;
+}
+
+node::node(const document_tree* doc, json_value* jv) : const_node(doc, jv) {}
+node::node(const_node&& rhs) : const_node(std::move(rhs)) {}
+node::node(const node& other) : const_node(other) {}
+node::node(node&& rhs) : const_node(rhs) {}
+node::~node() {}
+
+node& node::operator=(const node& other)
+{
+ if (this == &other)
+ return *this;
+
+ node tmp(other);
+ mp_impl.swap(tmp.mp_impl);
+ return *this;
+}
+
+node& node::operator=(const detail::init::node& v)
+{
+ document_resource& res =
+ const_cast<document_resource&>(mp_impl->m_doc->get_resource());
+
+ v.store_to_node(res, mp_impl->m_node);
+
+ return *this;
+}
+
+node node::operator[](std::string_view key)
+{
+ if (mp_impl->m_node->type != detail::node_t::object)
+ throw document_error("node::operator[]: the node must be of object type.");
+
+ json_value_object* jvo = const_cast<json_value_object*>(mp_impl->m_node->value.object);
+ auto it = jvo->value_object.find(key);
+ if (it == jvo->value_object.end())
+ {
+ // This object doesn't have the specified key. Create a new empty node
+ // on the fly.
+ document_resource& res =
+ const_cast<document_resource&>(mp_impl->m_doc->get_resource());
+ json_value* jv = res.obj_pool.construct(detail::node_t::unset);
+ jv->parent = mp_impl->m_node;
+ auto r = jvo->value_object.insert(std::make_pair(key, jv));
+ it = r.first;
+ }
+
+ return node(mp_impl->m_doc, it->second);
+}
+
+node node::child(size_t index)
+{
+ const_node cn = const_node::child(index);
+ return node(std::move(cn));
+}
+
+node node::child(std::string_view key)
+{
+ const_node cn = const_node::child(key);
+ return node(std::move(cn));
+}
+
+node node::parent()
+{
+ const_node cn = const_node::parent();
+ return node(std::move(cn));
+}
+
+node node::back()
+{
+ const_node cn = const_node::back();
+ return node(std::move(cn));
+}
+
+void node::push_back(const detail::init::node& v)
+{
+ if (mp_impl->m_node->type != detail::node_t::array)
+ {
+ std::ostringstream os;
+ os << "node::push_back: the node must be of array type, but the value of this node type is '" << mp_impl->m_node->type << "'.";
+ throw document_error(os.str());
+ }
+
+ json_value_array* jva = mp_impl->m_node->value.array;
+ const document_resource& res = mp_impl->m_doc->get_resource();
+ jva->value_array.push_back(v.to_json_value(const_cast<document_resource&>(res)));
+}
+
+struct const_node_iterator::impl
+{
+ const document_tree* m_doc;
+ std::vector<json_value*>::const_iterator m_pos;
+ std::vector<json_value*>::const_iterator m_end;
+ const_node m_current_node;
+
+ impl() : m_doc(nullptr), m_current_node(nullptr, nullptr) {}
+
+ impl(const impl& other) :
+ m_doc(other.m_doc),
+ m_pos(other.m_pos),
+ m_end(other.m_end),
+ m_current_node(other.m_current_node) {}
+
+ impl(const document_tree* doc, const const_node& v, bool begin) :
+ m_doc(doc), m_current_node(nullptr, nullptr)
+ {
+ const json_value_array* jva = v.mp_impl->m_node->value.array;
+ m_pos = begin ? jva->value_array.cbegin() : jva->value_array.cend();
+ m_end = jva->value_array.cend();
+
+ if (m_pos != m_end)
+ m_current_node = const_node(m_doc, *m_pos);
+ }
+
+ void update_current()
+ {
+ m_current_node = const_node(m_doc, m_pos == m_end ? nullptr : *m_pos);
+ }
+};
+
+const_node_iterator::const_node_iterator() :
+ mp_impl(std::make_unique<impl>()) {}
+
+const_node_iterator::const_node_iterator(const const_node_iterator& other) :
+ mp_impl(std::make_unique<impl>(*other.mp_impl)) {}
+
+const_node_iterator::const_node_iterator(const document_tree* doc, const const_node& v, bool begin) :
+ mp_impl(std::make_unique<impl>(doc, v, begin)) {}
+
+const_node_iterator::~const_node_iterator() {}
+
+const const_node& const_node_iterator::operator*() const
+{
+ return mp_impl->m_current_node;
+}
+
+const const_node* const_node_iterator::operator->() const
+{
+ return &mp_impl->m_current_node;
+}
+
+const_node_iterator& const_node_iterator::operator++()
+{
+ ++mp_impl->m_pos;
+ mp_impl->update_current();
+ return *this;
+}
+
+const_node_iterator const_node_iterator::operator++(int)
+{
+ const_node_iterator tmp(*this);
+ ++mp_impl->m_pos;
+ mp_impl->update_current();
+ return tmp;
+}
+
+const_node_iterator& const_node_iterator::operator--()
+{
+ --mp_impl->m_pos;
+ mp_impl->update_current();
+ return *this;
+}
+
+const_node_iterator const_node_iterator::operator--(int)
+{
+ const_node_iterator tmp(*this);
+ --mp_impl->m_pos;
+ mp_impl->update_current();
+ return tmp;
+}
+
+bool const_node_iterator::operator== (const const_node_iterator& other) const
+{
+ return mp_impl->m_pos == other.mp_impl->m_pos && mp_impl->m_end == other.mp_impl->m_end;
+}
+
+bool const_node_iterator::operator!= (const const_node_iterator& other) const
+{
+ return !operator==(other);
+}
+
+const_node_iterator& const_node_iterator::operator= (const const_node_iterator& other)
+{
+ mp_impl->m_doc = other.mp_impl->m_doc;
+ mp_impl->m_pos = other.mp_impl->m_pos;
+ mp_impl->m_end = other.mp_impl->m_end;
+ mp_impl->update_current();
+
+ return *this;
+}
+
+array::array() {}
+array::array(array&& other) : m_vs(std::move(other.m_vs)) {}
+array::array(std::initializer_list<detail::init::node> vs)
+{
+ for (const detail::init::node& v : vs)
+ m_vs.push_back(std::move(const_cast<detail::init::node&>(v)));
+}
+
+array::~array() {}
+
+object::object() {}
+object::object(object&& /*other*/) {}
+object::~object() {}
+
+namespace {
+
+json_value* aggregate_nodes(document_resource& res, std::vector<json_value*> nodes, bool object)
+{
+ bool preserve_object_order = true;
+
+ if (object)
+ {
+ json_value* jv = res.obj_pool.construct(detail::node_t::object);
+ jv->value.object = res.obj_pool_jvo.construct();
+ json_value_object* jvo = jv->value.object;
+
+ for (json_value* const_node : nodes)
+ {
+ if (const_node->type != detail::node_t::key_value)
+ throw document_error("key-value pair was expected.");
+
+ auto& kvp = const_node->value.kvp;
+
+ if (preserve_object_order)
+ jvo->key_order.emplace_back(kvp.key, kvp.n_key);
+
+ kvp.value->parent = jv;
+ auto r = jvo->value_object.insert(
+ std::make_pair(std::string_view(kvp.key, kvp.n_key), kvp.value));
+
+ if (!r.second)
+ throw document_error("adding the same key twice");
+ }
+
+ return jv;
+ }
+
+ json_value* jv = res.obj_pool.construct(detail::node_t::array);
+ jv->value.array = res.obj_pool_jva.construct();
+ json_value_array* jva = jv->value.array;
+
+ for (json_value* const_node : nodes)
+ {
+ if (const_node->type == detail::node_t::key_value)
+ throw document_error("key-value pair was not expected.");
+
+ const_node->parent = jv;
+ jva->value_array.push_back(const_node);
+ }
+
+ return jv;
+}
+
+void aggregate_nodes_to_object(
+ document_resource& res, std::vector<json_value*> nodes, json_value* parent)
+{
+ bool preserve_object_order = true;
+
+ json_value_object* jvo = res.obj_pool_jvo.construct();
+ parent->value.object = jvo;
+
+ for (json_value* const_node : nodes)
+ {
+ if (const_node->type != detail::node_t::key_value)
+ throw document_error("key-value pair was expected.");
+
+ auto& kvp = const_node->value.kvp;
+
+ if (preserve_object_order)
+ jvo->key_order.emplace_back(kvp.key, kvp.n_key);
+
+ kvp.value->parent = parent;
+ auto r = jvo->value_object.insert(
+ std::make_pair(std::string_view(kvp.key, kvp.n_key), kvp.value));
+
+ if (!r.second)
+ throw document_error("adding the same key twice");
+ }
+}
+
+void aggregate_nodes_to_array(
+ document_resource& res, std::vector<json_value*> nodes, json_value* parent)
+{
+ json_value_array* jva = res.obj_pool_jva.construct();
+ parent->value.array = jva;
+
+ for (json_value* const_node : nodes)
+ {
+ if (const_node->type == detail::node_t::key_value)
+ throw document_error("key-value pair was not expected.");
+
+ const_node->parent = parent;
+ jva->value_array.push_back(const_node);
+ }
+}
+
+#ifndef NDEBUG
+
+/**
+ * Verify that the parent pointers stored in the child objects point to
+ * their real parent object.
+ */
+void verify_parent_pointers(const json_value* jv, bool object)
+{
+ if (object)
+ {
+ json_value_object* jvo = jv->value.object;
+ for (const auto& child : jvo->value_object)
+ {
+ const json_value& cv = *child.second;
+ assert(cv.parent == jv);
+ }
+ }
+ else
+ {
+ json_value_array* jva = jv->value.array;
+ for (const auto& child : jva->value_array)
+ {
+ const json_value& cv = *child;
+ assert(cv.parent == jv);
+ }
+ }
+}
+
+#endif
+
+} // anonymous namespace
+
+namespace detail { namespace init {
+
+struct node::impl
+{
+ detail::node_t m_type;
+
+ union
+ {
+ double m_value_number;
+ const char* m_value_string;
+ };
+
+ std::vector<detail::init::node> m_value_array;
+
+ impl() : m_type(detail::node_t::unset) {}
+ impl(double v) : m_type(detail::node_t::number), m_value_number(v) {}
+ impl(int v) : m_type(detail::node_t::number), m_value_number(v) {}
+ impl(bool b) : m_type(b ? detail::node_t::boolean_true : detail::node_t::boolean_false) {}
+ impl(decltype(nullptr)) : m_type(detail::node_t::null) {}
+ impl(const char* p) : m_type(detail::node_t::string), m_value_string(p) {}
+ impl(const std::string& s) : m_type(detail::node_t::string), m_value_string(s.data()) {}
+
+ impl(std::initializer_list<detail::init::node> vs) :
+ m_type(detail::node_t::array_implicit)
+ {
+ for (const detail::init::node& v : vs)
+ m_value_array.push_back(std::move(const_cast<detail::init::node&>(v)));
+
+ // If the list has two elements, and the first element is of type string,
+ // we treat this as object's key-value pair.
+
+ if (m_value_array.size() != 2)
+ return;
+
+ const detail::init::node& v0 = *m_value_array.begin();
+ if (v0.mp_impl->m_type == detail::node_t::string)
+ m_type = detail::node_t::key_value;
+ }
+
+ impl(json::array array) :
+ m_type(detail::node_t::array),
+ m_value_array(std::move(array.m_vs))
+ {}
+
+ impl(json::object /*obj*/) :
+ m_type(detail::node_t::object) {}
+};
+
+node::node(double v) : mp_impl(std::make_unique<impl>(v)) {}
+node::node(int v) : mp_impl(std::make_unique<impl>(v)) {}
+node::node(bool b) : mp_impl(std::make_unique<impl>(b)) {}
+node::node(std::nullptr_t) : mp_impl(std::make_unique<impl>(nullptr)) {}
+node::node(const char* p) : mp_impl(std::make_unique<impl>(p)) {}
+node::node(const std::string& s) : mp_impl(std::make_unique<impl>(s)) {}
+node::node(std::initializer_list<detail::init::node> vs) : mp_impl(std::make_unique<impl>(std::move(vs))) {}
+node::node(json::array array) : mp_impl(std::make_unique<impl>(std::move(array))) {}
+node::node(json::object obj) : mp_impl(std::make_unique<impl>(std::move(obj))) {}
+
+node::node(node&& other) : mp_impl(std::move(other.mp_impl)) {}
+node::~node() {}
+
+json::node_t node::type() const
+{
+ return static_cast<json::node_t>(mp_impl->m_type);
+}
+
+json_value* node::to_json_value(document_resource& res) const
+{
+ json_value* jv = nullptr;
+
+ switch (mp_impl->m_type)
+ {
+ case detail::node_t::key_value:
+ {
+ assert(mp_impl->m_value_array.size() == 2);
+ auto it = mp_impl->m_value_array.begin();
+ const detail::init::node& key_node = *it;
+ assert(key_node.mp_impl->m_type == detail::node_t::string);
+ std::string_view key = res.str_pool.intern(key_node.mp_impl->m_value_string).first;
+ ++it;
+ json_value* value = it->to_json_value(res);
+ if (value->type == detail::node_t::key_value)
+ throw key_value_error("nested key-value pairs are not allowed.");
+
+ ++it;
+ assert(it == mp_impl->m_value_array.end());
+
+ jv = res.obj_pool.construct(mp_impl->m_type);
+ jv->value.kvp.key = key.data();
+ jv->value.kvp.n_key = key.size();
+ jv->value.kvp.value = value;
+ break;
+ }
+ case detail::node_t::array:
+ {
+ std::vector<json_value*> nodes;
+ for (const detail::init::node& v2 : mp_impl->m_value_array)
+ {
+ json_value* r = v2.to_json_value(res);
+ nodes.push_back(r);
+ }
+
+ jv = aggregate_nodes(res, std::move(nodes), false);
+#ifndef NDEBUG
+ verify_parent_pointers(jv, false);
+#endif
+ break;
+ }
+ case detail::node_t::array_implicit:
+ {
+ std::vector<json_value*> nodes;
+ bool object = !mp_impl->m_value_array.empty();
+ for (const detail::init::node& v2 : mp_impl->m_value_array)
+ {
+ json_value* r = v2.to_json_value(res);
+ if (r->type != detail::node_t::key_value)
+ object = false;
+ nodes.push_back(r);
+ }
+
+ jv = aggregate_nodes(res, std::move(nodes), object);
+#ifndef NDEBUG
+ verify_parent_pointers(jv, object);
+#endif
+ break;
+ }
+ case detail::node_t::object:
+ {
+ // Currently only empty object instance is allowed.
+ assert(mp_impl->m_value_array.size() == 0);
+ jv = res.obj_pool.construct(mp_impl->m_type);
+ jv->value.object = res.obj_pool_jvo.construct();
+ break;
+ }
+ case detail::node_t::string:
+ {
+ std::string_view s = res.str_pool.intern(mp_impl->m_value_string).first;
+ jv = res.obj_pool.construct(mp_impl->m_type);
+ jv->value.str.p = s.data();
+ jv->value.str.n = s.size();
+ break;
+ }
+ case detail::node_t::number:
+ jv = res.obj_pool.construct(mp_impl->m_type);
+ jv->value.numeric = mp_impl->m_value_number;
+ break;
+ case detail::node_t::boolean_true:
+ case detail::node_t::boolean_false:
+ case detail::node_t::null:
+ jv = res.obj_pool.construct(mp_impl->m_type);
+ break;
+ case detail::node_t::unset:
+ default:
+ {
+ std::ostringstream os;
+ os << "unknown node type (type=" << int(mp_impl->m_type) << ")";
+ throw document_error(os.str());
+ }
+ }
+
+ return jv;
+}
+
+void node::store_to_node(document_resource& res, json_value* parent) const
+{
+ parent->type = mp_impl->m_type;
+
+ switch (mp_impl->m_type)
+ {
+ case detail::node_t::unset:
+ throw document_error("node type is unset.");
+ case detail::node_t::string:
+ {
+ std::string_view s = res.str_pool.intern(mp_impl->m_value_string).first;
+ parent->value.str.p = s.data();
+ parent->value.str.n = s.size();
+ break;
+ }
+ case detail::node_t::number:
+ parent->value.numeric = mp_impl->m_value_number;
+ break;
+ case detail::node_t::object:
+ {
+ // Currently only empty object instance is allowed.
+ assert(mp_impl->m_value_array.size() == 0);
+ parent->value.object = res.obj_pool_jvo.construct();
+ break;
+ }
+ case detail::node_t::array_implicit:
+ {
+ std::vector<json_value*> nodes;
+ bool object = true;
+ for (const detail::init::node& v2 : mp_impl->m_value_array)
+ {
+ json_value* r = v2.to_json_value(res);
+ if (r->type != detail::node_t::key_value)
+ object = false;
+ nodes.push_back(r);
+ }
+
+ if (object)
+ {
+ parent->type = detail::node_t::object;
+ aggregate_nodes_to_object(res, std::move(nodes), parent);
+ }
+ else
+ {
+ parent->type = detail::node_t::array;
+ aggregate_nodes_to_array(res, std::move(nodes), parent);
+ }
+
+ break;
+ }
+ case detail::node_t::array:
+ {
+ std::vector<json_value*> nodes;
+ for (const detail::init::node& v2 : mp_impl->m_value_array)
+ {
+ json_value* r = v2.to_json_value(res);
+ nodes.push_back(r);
+ }
+
+ aggregate_nodes_to_array(res, std::move(nodes), parent);
+ break;
+ }
+ case detail::node_t::boolean_true:
+ case detail::node_t::boolean_false:
+ case detail::node_t::null:
+ break;
+ case detail::node_t::key_value:
+ // fall-through
+ default:
+ {
+ std::ostringstream os;
+ os << "unknown node type (" << (int)mp_impl->m_type << ")";
+ throw document_error(os.str());
+ }
+ }
+}
+
+}} // namespace detail::init
+
+struct document_tree::impl
+{
+ json::json_value* m_root;
+ std::unique_ptr<document_resource> m_own_res;
+ document_resource& m_res;
+
+ impl() : m_root(nullptr), m_own_res(std::make_unique<document_resource>()), m_res(*m_own_res) {}
+ impl(document_resource& res) : m_root(nullptr), m_res(res) {}
+};
+
+const document_resource& document_tree::get_resource() const
+{
+ return mp_impl->m_res;
+}
+
+document_tree::document_tree() : mp_impl(std::make_unique<impl>()) {}
+document_tree::document_tree(document_tree&& other) : mp_impl(std::move(other.mp_impl)) {}
+document_tree::document_tree(document_resource& res) : mp_impl(std::make_unique<impl>(res)) {}
+
+document_tree::document_tree(std::initializer_list<detail::init::node> vs) :
+ mp_impl(std::make_unique<impl>())
+{
+ std::vector<json_value*> nodes;
+ bool object = true;
+ for (const detail::init::node& v : vs)
+ {
+ json_value* r = v.to_json_value(mp_impl->m_res);
+ if (r->type != detail::node_t::key_value)
+ object = false;
+ nodes.push_back(r);
+ }
+
+ mp_impl->m_root = aggregate_nodes(mp_impl->m_res, std::move(nodes), object);
+}
+
+document_tree::document_tree(array vs) : mp_impl(std::make_unique<impl>())
+{
+ json_value_array* jva = mp_impl->m_res.obj_pool_jva.construct();
+ mp_impl->m_root = mp_impl->m_res.obj_pool.construct(detail::node_t::array);
+ mp_impl->m_root->value.array = jva;
+
+ for (const detail::init::node& v : vs.m_vs)
+ {
+ json_value* r = v.to_json_value(mp_impl->m_res);
+ jva->value_array.push_back(r);
+ }
+}
+
+document_tree::document_tree(object /*obj*/) : mp_impl(std::make_unique<impl>())
+{
+ mp_impl->m_root = mp_impl->m_res.obj_pool.construct(detail::node_t::object);
+ mp_impl->m_root->value.object = mp_impl->m_res.obj_pool_jvo.construct();
+}
+
+document_tree::~document_tree() {}
+
+document_tree& document_tree::operator= (std::initializer_list<detail::init::node> vs)
+{
+ document_tree tmp(std::move(vs));
+ swap(tmp);
+ return *this;
+}
+
+document_tree& document_tree::operator= (array vs)
+{
+ document_tree tmp(std::move(vs));
+ swap(tmp);
+ return *this;
+}
+
+document_tree& document_tree::operator= (object obj)
+{
+ document_tree tmp(std::move(obj));
+ swap(tmp);
+ return *this;
+}
+
+void document_tree::load(std::string_view stream, const json_config& config)
+{
+ json::parser_handler hdl(config, mp_impl->m_res);
+ json_parser<json::parser_handler> parser(stream, hdl);
+ parser.parse();
+ mp_impl->m_root = hdl.get_root();
+
+ auto& external_refs = hdl.get_external_refs();
+
+ json_config ext_config = config;
+ // The stream will get destroyed after each parsing of an external json file.
+ ext_config.persistent_string_values = true;
+
+ fs::path parent_dir = config.input_path;
+ parent_dir = parent_dir.parent_path();
+ for (auto it = external_refs.begin(), ite = external_refs.end(); it != ite; ++it)
+ {
+ fs::path extfile = std::string{it->path};
+ fs::path extpath = parent_dir;
+ extpath /= extfile;
+
+ // Get the stream content from the path.
+ file_content ext_content(extpath.string().data());
+
+ ext_config.input_path = extpath.string();
+ document_tree doc(mp_impl->m_res);
+ try
+ {
+ doc.load(ext_content.str(), ext_config);
+ }
+ catch (const parse_error& e)
+ {
+ std::ostringstream os;
+ os << "Error while parsing " << extpath.string() << std::endl;
+ os << create_parse_error_output(ext_content.str(), e.offset()) << std::endl;
+ os << e.what();
+
+ // Re-throw as general_error to avoid getting caught as parse
+ // error by the parent caller.
+ throw general_error(os.str());
+ }
+
+ json::json_value* root = doc.mp_impl->m_root;
+ if (root->type == detail::node_t::object)
+ {
+ json::json_value_object* jvo_src = root->value.object;
+ json::json_value_object* jvo_dest = it->dest;
+ if (jvo_dest->value_object.size() == 1)
+ {
+ // Swap with the referenced object only when the destination
+ // has one child value i.e. it only has '$ref'.
+ jvo_dest->swap(*jvo_src);
+ jvo_dest->has_ref = false;
+ }
+ }
+ }
+}
+
+json::const_node document_tree::get_document_root() const
+{
+ json::json_value* p = mp_impl->m_root;
+ if (!p)
+ throw document_error("document tree is empty");
+
+ return json::const_node(this, p);
+}
+
+json::node document_tree::get_document_root()
+{
+ json::json_value* p = mp_impl->m_root;
+ if (!p)
+ throw document_error("document tree is empty");
+
+ return json::node(this, p);
+}
+
+std::string document_tree::dump() const
+{
+ if (!mp_impl->m_root)
+ return std::string();
+
+ return json::dump_json_tree(mp_impl->m_root);
+}
+
+std::string document_tree::dump_xml() const
+{
+ if (!mp_impl->m_root)
+ return std::string();
+
+ return json::dump_xml_tree(mp_impl->m_root);
+}
+
+std::string document_tree::dump_yaml() const
+{
+ json::yaml_dumper dumper;
+ return dumper.dump(mp_impl->m_root);
+}
+
+void document_tree::swap(document_tree& other)
+{
+ std::swap(mp_impl, other.mp_impl);
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/json_document_tree_test.cpp b/src/liborcus/json_document_tree_test.cpp
new file mode 100644
index 0000000..3ab6876
--- /dev/null
+++ b/src/liborcus/json_document_tree_test.cpp
@@ -0,0 +1,862 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "test_global.hpp"
+
+#include <orcus/stream.hpp>
+#include <orcus/json_document_tree.hpp>
+#include <orcus/json_parser_base.hpp>
+#include <orcus/config.hpp>
+#include <orcus/xml_namespace.hpp>
+#include <orcus/dom_tree.hpp>
+
+#include "filesystem_env.hpp"
+
+#include <cassert>
+#include <cstdlib>
+#include <iostream>
+#include <cmath>
+#include <cstring>
+
+using namespace orcus;
+
+fs::path json_test_dirs[] = {
+ SRCDIR"/test/json/basic1",
+ SRCDIR"/test/json/basic2",
+ SRCDIR"/test/json/basic3",
+ SRCDIR"/test/json/basic4",
+ SRCDIR"/test/json/empty-array-1",
+ SRCDIR"/test/json/empty-array-2",
+ SRCDIR"/test/json/empty-array-3",
+ SRCDIR"/test/json/nested1",
+ SRCDIR"/test/json/nested2",
+ SRCDIR"/test/json/swagger",
+ SRCDIR"/test/json/to-yaml-1",
+};
+
+fs::path json_test_refs_dirs[] = {
+ SRCDIR"/test/json/refs1",
+};
+
+bool string_expected(const json::const_node& node, const char* expected)
+{
+ if (node.type() != json::node_t::string)
+ return false;
+
+ if (node.string_value() == expected)
+ return true;
+
+ std::cerr << "expected='" << expected << "', actual='" << node.string_value() << "'" << std::endl;
+ return false;
+}
+
+bool number_expected(
+ const json::const_node& node, double expected,
+ double decimal = 0.0, double exponent = 0.0)
+{
+ if (node.type() != json::node_t::number)
+ return false;
+
+ double actual = node.numeric_value();
+ if (!decimal || !exponent)
+ return actual == expected;
+
+ // Remove the exponent component.
+ actual /= std::pow(10.0, exponent);
+ expected /= std::pow(10.0, exponent);
+
+ // Only compare down to the specified decimal place.
+ actual *= std::pow(10.0, decimal);
+ expected *= std::pow(10.0, decimal);
+
+ actual = std::round(actual);
+ expected = std::round(expected);
+
+ if (actual == expected)
+ return true;
+
+ std::cerr << "expected=" << expected << ", actual=" << actual << std::endl;
+ return false;
+}
+
+std::string dump_check_content(const json::document_tree& doc)
+{
+ std::string xml_strm = doc.dump_xml();
+ assert(!xml_strm.empty());
+
+ xmlns_repository repo;
+ xmlns_context cxt = repo.create_context();
+ dom::document_tree dom(cxt);
+ dom.load(xml_strm);
+
+ std::ostringstream os;
+ dom.dump_compact(os);
+ return os.str();
+}
+
+bool compare_check_contents(const file_content& expected, const std::string& actual)
+{
+ std::string_view _expected(expected.data(), expected.size());
+ std::string_view _actual(actual.data(), actual.size());
+ _expected = trim(_expected);
+ _actual = trim(_actual);
+
+ if (_expected != _actual)
+ {
+ std::size_t pos = locate_first_different_char(_expected, _actual);
+ std::cout << create_parse_error_output(_expected, pos) << std::endl;
+ std::cout << create_parse_error_output(_actual, pos) << std::endl;
+ }
+
+ return _expected == _actual;
+}
+
+void verify_input(json_config& test_config, const fs::path& basedir)
+{
+ fs::path json_file = basedir / "input.json";
+ test_config.input_path = json_file.string();
+
+ std::cout << "* verify input: " << json_file << std::endl;
+
+ file_content content(json_file.string());
+ json::document_tree doc;
+ doc.load(content.str(), test_config);
+
+ fs::path check_file = basedir / "check.txt";
+ file_content check_master(check_file.string());
+ std::string check_doc = dump_check_content(doc);
+
+ bool result = compare_check_contents(check_master, check_doc);
+ assert(result);
+
+ if (fs::path outpath = basedir / "output.yaml"; fs::is_regular_file(outpath))
+ {
+ // Test the yaml output.
+ std::cout << " * yaml output: " << outpath << std::endl;
+
+ file_content expected(outpath.string());
+ std::string actual = doc.dump_yaml();
+
+ test::verify_content(__FILE__, __LINE__, expected.str(), actual);
+ }
+}
+
+void test_json_parse()
+{
+ json_config test_config;
+
+ for (std::size_t i = 0; i < std::size(json_test_dirs); ++i)
+ {
+ fs::path basedir = json_test_dirs[i];
+ verify_input(test_config, basedir);
+ }
+}
+
+void test_json_resolve_refs()
+{
+ json_config test_config;
+ test_config.resolve_references = true;
+
+ for (size_t i = 0; i < std::size(json_test_refs_dirs); ++i)
+ {
+ fs::path basedir = json_test_refs_dirs[i];
+ verify_input(test_config, basedir);
+ }
+}
+
+void test_json_parse_empty()
+{
+ json_config test_config;
+
+ const char* tests[] = {
+ "{}",
+ "[]",
+ "{\"key1\": {}, \"key2\": {}}"
+ };
+
+ for (size_t i = 0; i < std::size(tests); ++i)
+ {
+ const char* test = tests[i];
+ std::cout << "JSON stream: '" << test << "' (" << std::strlen(test) << ")" << std::endl;
+ json::document_tree doc;
+ try
+ {
+ doc.load(test, test_config);
+ }
+ catch (const parse_error& e)
+ {
+ std::cout << create_parse_error_output(test, e.offset()) << std::endl;
+ std::cout << e.what() << std::endl;
+ assert(false);
+ }
+ }
+}
+
+void test_json_parse_invalid()
+{
+ json_config test_config;
+
+ const char* invalids[] = {
+ "[foo]",
+ "[qwerty]",
+ "[1,2] null",
+ "{\"key\" 1: 12}",
+ "[1,,2]",
+ "\"key\": {\"inner\": 12}"
+ };
+
+ for (std::size_t i = 0; i < std::size(invalids); ++i)
+ {
+ const char* invalid_json = invalids[i];
+ json::document_tree doc;
+ try
+ {
+ doc.load(invalid_json, test_config);
+ std::cerr << "Invalid JSON expression is parsed as valid: '" << invalid_json << "'" << std::endl;
+ assert(false);
+ }
+ catch (const parse_error& e)
+ {
+ // works as expected.
+ std::cout << "invalid expression tested: " << invalid_json << std::endl;
+ std::cout << "error message received: " << e.what() << std::endl;
+ }
+ }
+}
+
+std::unique_ptr<json::document_tree> get_doc_tree(const char* filepath)
+{
+ json_config test_config;
+
+ std::cout << filepath << std::endl;
+ file_content content(filepath);
+ std::cout << "--- original" << std::endl;
+ std::cout << content.str() << std::endl;
+
+ auto doc = std::make_unique<json::document_tree>();
+ doc->load(content.str(), test_config);
+
+ return doc;
+}
+
+void dump_and_load(
+ const json::document_tree& doc, const std::function<void(json::const_node)>& test_func)
+{
+ json::document_tree doc2;
+ std::string dumped = doc.dump();
+ std::cout << "--- dumped" << std::endl;
+ std::cout << dumped << std::endl;
+ doc2.load(dumped, json_config());
+ json::const_node node = doc2.get_document_root();
+ test_func(node);
+}
+
+void test_json_traverse_basic1()
+{
+ auto test_func = [](json::const_node node)
+ {
+ assert(node.type() == json::node_t::array);
+ assert(node.child_count() == 3);
+ assert(node.child(0).type() == json::node_t::boolean_true);
+ assert(node.child(1).type() == json::node_t::boolean_false);
+ assert(node.child(2).type() == json::node_t::null);
+
+ // Move to child node and move back.
+ json::const_node node2 = node.child(0).parent();
+ assert(node.identity() == node2.identity());
+ };
+
+ const char* filepath = SRCDIR"/test/json/basic1/input.json";
+ std::unique_ptr<json::document_tree> doc = get_doc_tree(filepath);
+ json::const_node node = doc->get_document_root();
+ test_func(node);
+ dump_and_load(*doc, test_func);
+}
+
+void test_json_traverse_basic2()
+{
+ auto test_func = [](json::const_node node)
+ {
+ assert(node.type() == json::node_t::array);
+ assert(node.child_count() == 14);
+
+ assert(string_expected(node.child(0), "I am string"));
+ assert(string_expected(node.child(1), "me too"));
+ assert(string_expected(node.child(2), ""));
+ assert(string_expected(node.child(3), "\\"));
+ assert(string_expected(node.child(4), "/"));
+ assert(string_expected(node.child(5), "\\b"));
+ assert(string_expected(node.child(6), "\\f"));
+ assert(string_expected(node.child(7), "\\n"));
+ assert(string_expected(node.child(8), "\\r"));
+ assert(string_expected(node.child(9), "\\t"));
+ assert(string_expected(node.child(10), "\"quoted\""));
+ assert(string_expected(node.child(11), "http://www.google.com"));
+ assert(string_expected(node.child(12), "one \\n two \\n three"));
+ assert(string_expected(node.child(13), "front segment 'single quote' and \"double quote\" end segment"));
+ };
+
+ const char* filepath = SRCDIR"/test/json/basic2/input.json";
+ std::unique_ptr<json::document_tree> doc = get_doc_tree(filepath);
+ json::const_node node = doc->get_document_root();
+ test_func(node);
+ dump_and_load(*doc, test_func);
+}
+
+void test_json_traverse_basic3()
+{
+ auto test_func = [](json::const_node node)
+ {
+ assert(node.type() == json::node_t::array);
+ assert(node.child_count() == 9);
+
+ assert(number_expected(node.child(0), 0.0));
+ assert(number_expected(node.child(1), 1.0));
+ assert(number_expected(node.child(2), 2.0));
+ assert(number_expected(node.child(3), 15.0));
+ assert(number_expected(node.child(4), 12.34));
+ assert(number_expected(node.child(5), -0.12));
+ assert(number_expected(node.child(6), 1.2e+22, 1.0, 22.0));
+ assert(number_expected(node.child(7), 1.11e-7, 2.0, -7.0));
+ assert(number_expected(node.child(8), 11E2));
+ };
+
+ const char* filepath = SRCDIR"/test/json/basic3/input.json";
+ std::unique_ptr<json::document_tree> doc = get_doc_tree(filepath);
+ json::const_node node = doc->get_document_root();
+ test_func(node);
+ dump_and_load(*doc, test_func);
+}
+
+void test_json_traverse_basic4()
+{
+ auto test_func = [](json::const_node node)
+ {
+ assert(node.type() == json::node_t::object);
+ auto keys = node.keys();
+ assert(keys.size() == 3);
+ for (auto it = keys.begin(), ite = keys.end(); it != ite; ++it)
+ {
+ std::string_view key = *it;
+ json::const_node child = node.child(key);
+ if (key == "int")
+ assert(number_expected(child, 12.0));
+ else if (key == "float")
+ assert(number_expected(child, 0.125));
+ else if (key == "string")
+ assert(string_expected(child, "blah..."));
+ else
+ assert(!"unexpected key");
+ }
+ };
+
+ const char* filepath = SRCDIR"/test/json/basic4/input.json";
+ std::unique_ptr<json::document_tree> doc = get_doc_tree(filepath);
+ json::const_node node = doc->get_document_root();
+ test_func(node);
+ dump_and_load(*doc, test_func);
+}
+
+void test_json_traverse_nested1()
+{
+ auto test_func = [](json::const_node node)
+ {
+ uintptr_t root_id = node.identity();
+
+ assert(node.type() == json::node_t::object);
+ assert(node.child_count() == 1);
+
+ node = node.child(0);
+ assert(node.type() == json::node_t::array);
+ assert(node.child_count() == 3);
+
+ assert(number_expected(node.child(0), 1.0));
+ assert(number_expected(node.child(1), 2.0));
+ assert(number_expected(node.child(2), 3.0));
+
+ node = node.parent();
+ assert(node.identity() == root_id);
+ };
+
+ const char* filepath = SRCDIR"/test/json/nested1/input.json";
+ std::unique_ptr<json::document_tree> doc = get_doc_tree(filepath);
+ json::const_node node = doc->get_document_root();
+ test_func(node);
+ dump_and_load(*doc, test_func);
+}
+
+void test_json_traverse_nested2()
+{
+ auto test_func = [](json::const_node node)
+ {
+ assert(node.type() == json::node_t::array);
+ assert(node.child_count() == 3);
+
+ node = node.child(0);
+ assert(node.type() == json::node_t::object);
+ assert(number_expected(node.child("value"), 1.0));
+ node = node.parent();
+
+ node = node.child(1);
+ assert(node.type() == json::node_t::object);
+ assert(number_expected(node.child("value"), 2.0));
+ node = node.parent();
+
+ node = node.child(2);
+ assert(node.type() == json::node_t::object);
+ assert(number_expected(node.child("value"), 3.0));
+ node = node.parent();
+ };
+
+ const char* filepath = SRCDIR"/test/json/nested2/input.json";
+ std::unique_ptr<json::document_tree> doc = get_doc_tree(filepath);
+ json::const_node node = doc->get_document_root();
+ test_func(node);
+ dump_and_load(*doc, test_func);
+}
+
+void test_json_init_list_flat1()
+{
+ json::document_tree doc = { 1.0, 2.0, 3.0, 4.0 };
+ json::const_node node = doc.get_document_root();
+ assert(node.type() == json::node_t::array);
+ assert(node.child_count() == 4);
+
+ node = node.child(0);
+ assert(node.type() == json::node_t::number);
+ assert(node.numeric_value() == 1.0);
+ node = node.parent();
+
+ node = node.child(1);
+ assert(node.type() == json::node_t::number);
+ assert(node.numeric_value() == 2.0);
+ node = node.parent();
+
+ node = node.child(2);
+ assert(node.type() == json::node_t::number);
+ assert(node.numeric_value() == 3.0);
+ node = node.parent();
+
+ node = node.child(3);
+ assert(node.type() == json::node_t::number);
+ assert(node.numeric_value() == 4.0);
+ node = node.parent();
+
+ // Use iterators.
+ auto it = node.begin();
+ assert(it->type() == json::node_t::number);
+ assert(it->numeric_value() == 1.0);
+ ++it;
+ assert(it->type() == json::node_t::number);
+ assert(it->numeric_value() == 2.0);
+ auto test = it++; // post increment
+ assert(test->numeric_value() == 2.0);
+ assert(it->type() == json::node_t::number);
+ assert(it->numeric_value() == 3.0);
+ test = ++it; // pre increment
+ assert(test->numeric_value() == 4.0);
+ ++it;
+ assert(it == node.end());
+ --it;
+ assert(it->numeric_value() == 4.0);
+ test = it--;
+ assert(test->numeric_value() == 4.0);
+ assert(it->numeric_value() == 3.0);
+
+ doc = { nullptr };
+ node = doc.get_document_root();
+ assert(node.type() == json::node_t::array);
+ assert(node.child_count() == 1);
+
+ node = node.child(0);
+ assert(node.type() == json::node_t::null);
+
+ doc = { true, false };
+ node = doc.get_document_root();
+ assert(node.type() == json::node_t::array);
+ assert(node.child_count() == 2);
+
+ node = node.child(0);
+ assert(node.type() == json::node_t::boolean_true);
+ node = node.parent();
+
+ node = node.child(1);
+ assert(node.type() == json::node_t::boolean_false);
+ node = node.parent();
+
+ doc = { "A", "B", "C" };
+ node = doc.get_document_root();
+ assert(node.type() == json::node_t::array);
+ assert(node.child_count() == 3);
+
+ node = node.child(0);
+ assert(node.type() == json::node_t::string);
+ assert(node.string_value() == "A");
+ node = node.parent();
+
+ node = node.child(1);
+ assert(node.type() == json::node_t::string);
+ assert(node.string_value() == "B");
+ node = node.parent();
+
+ node = node.child(2);
+ assert(node.type() == json::node_t::string);
+ assert(node.string_value() == "C");
+}
+
+void test_json_init_list_nested1()
+{
+ json::document_tree doc = {
+ { true, false, nullptr },
+ { 1.1, 2.2, "text" }
+ };
+
+ json::const_node node = doc.get_document_root();
+ assert(node.type() == json::node_t::array);
+ assert(node.child_count() == 2);
+
+ node = node.child(0);
+ assert(node.type() == json::node_t::array);
+ assert(node.child_count() == 3);
+ assert(node.child(0).type() == json::node_t::boolean_true);
+ assert(node.child(1).type() == json::node_t::boolean_false);
+ assert(node.child(2).type() == json::node_t::null);
+ node = node.parent();
+
+ node = node.child(1);
+ assert(node.type() == json::node_t::array);
+ assert(node.child_count() == 3);
+ assert(node.child(0).type() == json::node_t::number);
+ assert(node.child(0).numeric_value() == 1.1);
+ assert(node.child(1).type() == json::node_t::number);
+ assert(node.child(1).numeric_value() == 2.2);
+ assert(node.child(2).type() == json::node_t::string);
+ assert(node.child(2).string_value() == "text");
+}
+
+void test_json_init_list_object1()
+{
+ json::document_tree doc = {
+ { "key1", 1.2 },
+ { "key2", "some text" },
+ };
+
+ json::const_node node = doc.get_document_root();
+ assert(node.type() == json::node_t::object);
+ assert(node.child_count() == 2);
+ assert(node.key(0) == "key1");
+ assert(node.key(1) == "key2");
+
+ node = node.child("key1");
+ assert(node.type() == json::node_t::number);
+ assert(node.numeric_value() == 1.2);
+ node = node.parent();
+
+ node = node.child("key2");
+ assert(node.type() == json::node_t::string);
+ assert(node.string_value() == "some text");
+}
+
+void test_json_init_list_object2()
+{
+ // nested objects.
+ json::document_tree doc = {
+ { "parent1",
+ {
+ { "child1", true },
+ { "child2", false },
+ { "child3", 123.4 },
+ }
+ },
+ { "parent2", "not-nested" },
+ };
+
+ json::const_node node = doc.get_document_root();
+ assert(node.type() == json::node_t::object);
+ assert(node.child_count() == 2);
+ assert(node.key(0) == "parent1");
+ assert(node.key(1) == "parent2");
+
+ node = node.child("parent1");
+ assert(node.type() == json::node_t::object);
+ assert(node.child_count() == 3);
+ assert(node.key(0) == "child1");
+ assert(node.key(1) == "child2");
+ assert(node.key(2) == "child3");
+
+ assert(node.child("child1").type() == json::node_t::boolean_true);
+ assert(node.child("child2").type() == json::node_t::boolean_false);
+ assert(node.child("child3").type() == json::node_t::number);
+ assert(node.child("child3").numeric_value() == 123.4);
+
+ node = node.parent();
+
+ node = node.child("parent2");
+ assert(node.type() == json::node_t::string);
+ assert(node.string_value() == "not-nested");
+}
+
+void test_json_init_list_explicit_array()
+{
+ try
+ {
+ // This structure is too ambiguous and cannot be implicitly
+ // determined.
+ json::document_tree doc = {
+ { "array", { "one", 987.0 } }
+ };
+ assert(!"key_value_error was not thrown");
+ }
+ catch (const json::key_value_error&)
+ {
+ // expected.
+ }
+
+ // Explicitly define an array instead.
+ json::document_tree doc = {
+ { "array", json::array({ "one", 987.0 }) }
+ };
+
+ json::node node = doc.get_document_root();
+ assert(node.type() == json::node_t::object);
+ assert(node.child_count() == 1);
+ assert(node.key(0) == "array");
+
+ node = node.child(0);
+ assert(node.type() == json::node_t::array);
+ assert(node.child_count() == 2);
+ assert(node.child(0).string_value() == "one");
+ assert(node.child(1).numeric_value() == 987.0);
+
+ doc = json::array({1, 2, 3});
+ node = doc.get_document_root();
+ assert(node.type() == json::node_t::array);
+ assert(node.child_count() == 3);
+ assert(node.child(0).numeric_value() == 1.0);
+ assert(node.child(1).numeric_value() == 2.0);
+ assert(node.child(2).numeric_value() == 3.0);
+
+ node.push_back(4);
+ node.push_back(5);
+ assert(node.child_count() == 5);
+ assert(node.child(3).numeric_value() == 4.0);
+ assert(node.child(4).numeric_value() == 5.0);
+
+ // empty JSON with array root.
+ json::document_tree doc2 = json::array();
+ node = doc2.get_document_root();
+ assert(node.type() == json::node_t::array);
+ assert(node.child_count() == 0);
+
+ // Assigning a non-const node to a const one should work.
+ json::const_node cnode = node;
+ assert(node.type() == json::node_t::array);
+ assert(node.child_count() == 0);
+}
+
+void test_json_init_list_explicit_object()
+{
+ json::document_tree doc = json::object();
+ json::node node = doc.get_document_root();
+ assert(node.type() == json::node_t::object);
+ assert(node.child_count() == 0);
+
+ // Initialize with an array of 3 empty objects.
+ doc = {
+ json::object(),
+ json::object(),
+ json::object()
+ };
+
+ node = doc.get_document_root();
+ assert(node.type() == json::node_t::array);
+ assert(node.child_count() == 3);
+
+ for (size_t i = 0; i < 3; ++i)
+ {
+ node = node.child(i);
+ assert(node.type() == json::node_t::object);
+ assert(node.child_count() == 0);
+ node = node.parent();
+ }
+}
+
+void test_json_init_root_object_add_child()
+{
+ json::document_tree doc = json::object();
+ json::node node = doc.get_document_root();
+ assert(node.type() == json::node_t::object);
+ assert(node.child_count() == 0);
+
+ node["child1"] = 1.0;
+
+ assert(node.child_count() == 1);
+
+ node = node.child("child1");
+ assert(node.type() == json::node_t::number);
+ assert(node.numeric_value() == 1.0);
+
+ node = node.parent();
+ node["child2"] = "foo";
+
+ assert(node.child_count() == 2);
+
+ node = node.child("child2");
+ assert(node.type() == json::node_t::string);
+ assert(node.string_value() == "foo");
+
+ node = node.parent();
+
+ // Access to child via [] operator.
+ node = node["child1"];
+ assert(node.type() == json::node_t::number);
+ assert(node.numeric_value() == 1.0);
+
+ node = node.parent();
+ node["child3"] = { true, false };
+
+ node = node.child("child3");
+ assert(node.type() == json::node_t::array);
+ assert(node.child_count() == 2);
+
+ node = node.child(0);
+ assert(node.type() == json::node_t::boolean_true);
+
+ // Move up to the parent array.
+ node = node.parent();
+ assert(node.type() == json::node_t::array);
+ assert(node.child_count() == 2);
+
+ // Move down to the other child node.
+ node = node.child(1);
+ assert(node.type() == json::node_t::boolean_false);
+
+ // Move up to the root node.
+ node = node.parent().parent();
+ assert(node.type() == json::node_t::object);
+ assert(node.child_count() == 3);
+
+ node["child1"] = true; // overwrite an existing node.
+ node = node.child("child1");
+ assert(node.type() == json::node_t::boolean_true);
+
+ // direct assignment.
+ node = false;
+ assert(node.type() == json::node_t::boolean_false);
+
+ node = node.parent().child("child1"); // make sure the link is still intact.
+ assert(node.type() == json::node_t::boolean_false);
+
+ node = node.parent();
+ node["null-child"] = nullptr;
+
+ node = node.child("null-child");
+ assert(node.type() == json::node_t::null);
+
+ node = node.parent();
+ node["object-child"] = json::object();
+
+ node = node.child("object-child");
+ assert(node.type() == json::node_t::object);
+ assert(node.child_count() == 0);
+
+ node["array"] = json::array({true, false, nullptr});
+
+ node = node.child("array");
+ assert(node.type() == json::node_t::array);
+ assert(node.child_count() == 3);
+
+ node = node.parent();
+ node["nested-object"] =
+ {
+ { "key1", "foo" },
+ { "key2", 12.34 }
+ };
+
+ node = node.child("nested-object");
+ assert(node.type() == json::node_t::object);
+ assert(node.child_count() == 2);
+ assert(node.child("key1").string_value() == "foo");
+ assert(node.child("key2").numeric_value() == 12.34);
+}
+
+void test_json_init_empty_array()
+{
+ json::document_tree doc = json::array();
+ json::node node = doc.get_document_root();
+ assert(node.type() == json::node_t::array);
+
+ doc = {
+ { "key1", json::array({true, false}) },
+ { "key2", json::array() } // empty array
+ };
+
+ node = doc.get_document_root();
+ assert(node.type() == json::node_t::object);
+ node = node["key1"];
+ assert(node.type() == json::node_t::array);
+ node = node.parent()["key2"];
+ assert(node.type() == json::node_t::array);
+}
+
+void test_json_dynamic_object_keys()
+{
+ json::document_tree doc = json::object();
+ json::node root = doc.get_document_root();
+
+ /* {"test": [1.2, 1.3]} */
+ auto node = root["test"];
+ node = json::array();
+ node.push_back(1.2);
+ node.push_back(1.3);
+
+ // Dump the doc as a string and reload it.
+ doc.load(doc.dump(), json_config());
+ root = doc.get_document_root();
+ assert(root.type() == json::node_t::object);
+ node = root["test"];
+ assert(node.type() == json::node_t::array);
+ assert(node.child_count() == 2u);
+ assert(node.child(0).numeric_value() == 1.2);
+ assert(node.child(1).numeric_value() == 1.3);
+}
+
+int main()
+{
+ try
+ {
+ test_json_parse();
+ test_json_resolve_refs();
+ test_json_parse_empty();
+ test_json_parse_invalid();
+ test_json_traverse_basic1();
+ test_json_traverse_basic2();
+ test_json_traverse_basic3();
+ test_json_traverse_basic4();
+ test_json_traverse_nested1();
+ test_json_traverse_nested2();
+
+ test_json_init_list_flat1();
+ test_json_init_list_nested1();
+ test_json_init_list_object1();
+ test_json_init_list_object2();
+ test_json_init_list_explicit_array();
+ test_json_init_list_explicit_object();
+ test_json_init_root_object_add_child();
+ test_json_init_empty_array();
+ test_json_dynamic_object_keys();
+ }
+ catch (const orcus::general_error& e)
+ {
+ std::cerr << e.what() << std::endl;
+ return EXIT_FAILURE;
+ }
+
+ return EXIT_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/json_map_tree.cpp b/src/liborcus/json_map_tree.cpp
new file mode 100644
index 0000000..294e782
--- /dev/null
+++ b/src/liborcus/json_map_tree.cpp
@@ -0,0 +1,786 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "json_map_tree.hpp"
+#include "orcus/measurement.hpp"
+
+#include <iostream>
+#include <sstream>
+
+namespace orcus {
+
+constexpr json_map_tree::child_position_type json_map_tree::node_child_default_position;
+
+namespace {
+
+void throw_path_error(const char* file, int line, std::string_view path)
+{
+ std::ostringstream os;
+ os << file << "#" << line << ": failed to link this path '" << path << "'";
+ throw json_map_tree::path_error(os.str());
+}
+
+enum class json_path_token_t { unknown, array_pos, object_key, end };
+
+struct json_path_token_value_t
+{
+ json_path_token_t type = json_path_token_t::unknown;
+
+ union
+ {
+ json_map_tree::child_position_type array_pos = json_map_tree::node_child_default_position;
+
+ struct
+ {
+ const char* p;
+ size_t n;
+
+ } str;
+
+ } value;
+
+ json_path_token_value_t(json_path_token_t _type) : type(_type) {}
+
+ json_path_token_value_t(json_map_tree::child_position_type array_pos): type(json_path_token_t::array_pos)
+ {
+ value.array_pos = array_pos;
+ }
+
+ json_path_token_value_t(const char* p, size_t n) : type(json_path_token_t::object_key)
+ {
+ value.str.p = p;
+ value.str.n = n;
+ }
+};
+
+std::string_view get_last_object_key(const std::vector<json_path_token_value_t>& stack)
+{
+ if (stack.size() < 2)
+ return std::string_view{};
+
+ auto it = stack.rbegin();
+ ++it;
+ const json_path_token_value_t& t2 = *it;
+ if (t2.type != json_path_token_t::object_key)
+ return std::string_view{};
+
+ return std::string_view{t2.value.str.p, t2.value.str.n};
+}
+
+class json_path_parser
+{
+ const char* mp_cur;
+ const char* mp_end;
+
+public:
+
+ json_path_parser(std::string_view path) :
+ mp_cur(path.data()),
+ mp_end(mp_cur + path.size())
+ {
+ assert(!path.empty());
+ assert(path[0] == '$');
+ ++mp_cur; // skip the first '$'.
+ }
+
+ json_path_token_value_t next()
+ {
+ if (mp_cur == mp_end)
+ return json_path_token_t::end;
+
+ if (*mp_cur == '[')
+ return next_pos();
+
+ return json_path_token_t::unknown;
+ }
+
+ json_path_token_value_t next_object_key()
+ {
+ assert(*mp_cur == '\'');
+ ++mp_cur;
+ const char* p_head = mp_cur;
+
+ for (; mp_cur != mp_end && *mp_cur != '\''; ++mp_cur)
+ {
+ // Skip until we reach the closing quote.
+ }
+
+ if (*mp_cur != '\'')
+ return json_path_token_t::unknown;
+
+ size_t n = std::distance(p_head, mp_cur);
+
+ ++mp_cur; // Skip the quote.
+ if (*mp_cur != ']')
+ return json_path_token_t::unknown;
+
+ ++mp_cur; // Skip the ']'.
+
+ return json_path_token_value_t(p_head, n);
+ }
+
+ json_path_token_value_t next_pos()
+ {
+ assert(*mp_cur == '[');
+ ++mp_cur; // Skip the '['.
+
+ if (mp_cur == mp_end)
+ return json_path_token_t::unknown;
+
+ if (*mp_cur == '\'')
+ return next_object_key();
+
+ const char* p_head = mp_cur;
+
+ for (; mp_cur != mp_end; ++mp_cur)
+ {
+ if (*mp_cur != ']')
+ continue;
+
+ if (p_head == mp_cur)
+ {
+ // empty brackets.
+ ++mp_cur;
+ return json_map_tree::node_child_default_position;
+ }
+
+ const char* p_parse_ended = nullptr;
+ std::size_t n = mp_cur - p_head;
+ long pos = to_long({p_head, n}, &p_parse_ended);
+
+ if (p_parse_ended != mp_cur)
+ // Parsing failed.
+ break;
+
+ if (pos < 0)
+ // array position cannot be negative.
+ break;
+
+ ++mp_cur; // skip the ']'.
+ return pos;
+ }
+
+ return json_path_token_t::unknown;
+ }
+};
+
+} // anonymous namespace
+
+json_map_tree::path_error::path_error(const std::string& msg) :
+ general_error(msg) {}
+
+json_map_tree::cell_reference_type::cell_reference_type(const cell_position_t& _pos) :
+ pos(_pos) {}
+
+json_map_tree::range_reference_type::range_reference_type(const cell_position_t& _pos) :
+ pos(_pos), row_position(0), row_header(false) {}
+
+json_map_tree::node::node() {}
+json_map_tree::node::node(node&& other) :
+ type(other.type)
+{
+ value.children = nullptr;
+
+ switch (type)
+ {
+ case map_node_type::array:
+ value.children = other.value.children;
+ other.value.children = nullptr;
+ break;
+ case map_node_type::cell_ref:
+ value.cell_ref = other.value.cell_ref;
+ other.value.cell_ref = nullptr;
+ break;
+ case map_node_type::range_field_ref:
+ value.range_field_ref = other.value.range_field_ref;
+ other.value.range_field_ref = nullptr;
+ default:
+ ;
+ }
+
+ other.type = map_node_type::unknown;
+
+ row_group = other.row_group;
+ other.row_group = nullptr;
+
+ anchored_fields = std::move(other.anchored_fields);
+}
+
+json_map_tree::node& json_map_tree::node::get_or_create_child_node(child_position_type pos)
+{
+ node_children_type& children = *value.children;
+
+ auto it = children.lower_bound(pos); // get the first position where pos <= k is true.
+
+ if (it == children.end() || children.key_comp()(pos, it->first))
+ {
+ // Insert a new array child node of unspecified type at the specified position.
+ it = children.insert(
+ it, node_children_type::value_type(pos, node()));
+ }
+
+ assert(it->first == pos);
+ return it->second;
+}
+
+json_map_tree::walker::scope::scope(node* _p) : p(_p), array_position(0) {}
+
+json_map_tree::walker::walker(const json_map_tree& parent) : m_parent(parent) {}
+
+json_map_tree::node* json_map_tree::walker::push_node(input_node_type nt)
+{
+ if (!m_unlinked_stack.empty())
+ {
+ // We're still in the unlinked region.
+ m_unlinked_stack.push_back(nt);
+ return nullptr;
+ }
+
+ if (m_stack.empty())
+ {
+ if (!m_parent.m_root)
+ {
+ // Tree is empty.
+ m_unlinked_stack.push_back(nt);
+ return nullptr;
+ }
+
+ node* p = m_parent.m_root.get();
+
+ if (!is_equivalent(nt, p->type))
+ {
+ // Different node type.
+ m_unlinked_stack.push_back(nt);
+ return nullptr;
+ }
+
+ m_stack.push_back(p);
+ return m_stack.back().p;
+ }
+
+ scope& cur_scope = m_stack.back();
+
+ switch (cur_scope.p->type)
+ {
+ case json_map_tree::map_node_type::array:
+ {
+ node_children_type& node_children = *cur_scope.p->value.children;
+
+ auto it = node_children.find(cur_scope.array_position++);
+ if (it == node_children.end())
+ it = node_children.find(json_map_tree::node_child_default_position);
+
+ if (it == node_children.end())
+ {
+ // This array node has no children.
+ m_unlinked_stack.push_back(nt);
+ return nullptr;
+ }
+
+ node* p = &it->second;
+
+ if (!is_equivalent(nt, p->type))
+ {
+ // Different node type.
+ m_unlinked_stack.push_back(nt);
+ return nullptr;
+ }
+
+ m_stack.push_back(p);
+ return m_stack.back().p;
+ }
+ case json_map_tree::map_node_type::object:
+ {
+ node_children_type& node_children = *cur_scope.p->value.children;
+ auto it = node_children.find(cur_scope.array_position);
+ if (it == node_children.end())
+ {
+ // The currently specified key does not exist in this object.
+ m_unlinked_stack.push_back(nt);
+ return nullptr;
+ }
+
+ node* p = &it->second;
+
+ if (!is_equivalent(nt, p->type))
+ {
+ // Different node type.
+ m_unlinked_stack.push_back(nt);
+ return nullptr;
+ }
+
+ m_stack.push_back(p);
+ return m_stack.back().p;
+ }
+ default:
+ ;
+ }
+
+ m_unlinked_stack.push_back(nt);
+ return nullptr;
+}
+
+json_map_tree::node* json_map_tree::walker::pop_node(input_node_type nt)
+{
+ if (!m_unlinked_stack.empty())
+ {
+ // We're in the unlinked region. Pop a node from the unlinked stack.
+ if (m_unlinked_stack.back() != nt)
+ throw general_error("Closing node is of different type than the opening node in the unlinked node stack.");
+
+ m_unlinked_stack.pop_back();
+
+ if (!m_unlinked_stack.empty())
+ // We are still in the unlinked region.
+ return nullptr;
+
+ return m_stack.empty() ? nullptr : m_stack.back().p;
+ }
+
+ if (m_stack.empty())
+ throw general_error("A node was popped while the stack was empty.");
+
+ if (!is_equivalent(nt, m_stack.back().p->type))
+ throw general_error("Closing node is of different type than the opening node in the linked node stack.");
+
+ m_stack.pop_back();
+ return m_stack.empty() ? nullptr : m_stack.back().p;
+}
+
+void json_map_tree::walker::set_object_key(const char* p, size_t n)
+{
+ if (!m_unlinked_stack.empty())
+ return;
+
+ if (m_stack.empty())
+ return;
+
+ scope& cur_scope = m_stack.back();
+ if (cur_scope.p->type != map_node_type::object)
+ return;
+
+ std::string_view pooled = m_parent.m_str_pool.intern({p, n}).first;
+ cur_scope.array_position = reinterpret_cast<child_position_type>(pooled.data());
+}
+
+json_map_tree::json_map_tree() {}
+json_map_tree::~json_map_tree() {}
+
+json_map_tree::walker json_map_tree::get_tree_walker() const
+{
+ return walker(*this);
+}
+
+void json_map_tree::set_cell_link(std::string_view path, const cell_position_t& pos)
+{
+ path_stack_type stack = get_or_create_destination_node(path);
+ if (stack.node_stack.empty())
+ return;
+
+ node* p = stack.node_stack.back();
+ if (p->type != map_node_type::unknown)
+ {
+ std::ostringstream os;
+ os << "this path is not linkable: '" << path << '\'';
+ throw path_error(os.str());
+ }
+
+ p->type = map_node_type::cell_ref;
+ p->value.cell_ref = m_cell_ref_pool.construct(pos);
+
+ // Ensure that this tree owns the instance of the string.
+ p->value.cell_ref->pos.sheet = m_str_pool.intern(p->value.cell_ref->pos.sheet).first;
+}
+
+const json_map_tree::node* json_map_tree::get_link(std::string_view path) const
+{
+ return get_destination_node(path);
+}
+
+void json_map_tree::start_range(const cell_position_t& pos, bool row_header)
+{
+ m_current_range.pos = pos;
+ m_current_range.fields.clear();
+ m_current_range.row_groups.clear();
+ m_current_range.row_header = row_header;
+}
+
+void json_map_tree::append_field_link(std::string_view path, std::string_view label)
+{
+ m_current_range.fields.emplace_back(path, label);
+}
+
+void json_map_tree::set_range_row_group(std::string_view path)
+{
+ m_current_range.row_groups.push_back(path);
+}
+
+void json_map_tree::commit_range()
+{
+ range_reference_type* ref = &get_range_reference(m_current_range.pos);
+ ref->row_header = m_current_range.row_header;
+ spreadsheet::col_t column_pos = 0;
+
+ for (std::string_view path : m_current_range.row_groups)
+ {
+ path_stack_type stack = get_or_create_destination_node(path);
+ if (stack.node_stack.empty())
+ throw_path_error(__FILE__, __LINE__, path);
+
+ stack.node_stack.back()->row_group = ref;
+ }
+
+ long unlabeled_field_count = 0;
+
+ for (const auto& field : m_current_range.fields)
+ {
+ std::string_view path = field.first;
+ std::string_view label = field.second;
+
+ path_stack_type stack = get_or_create_destination_node(path);
+ if (stack.node_stack.empty() || stack.node_stack.back()->type != map_node_type::unknown)
+ throw_path_error(__FILE__, __LINE__, path);
+
+ node* p = stack.node_stack.back();
+ p->type = map_node_type::range_field_ref;
+ p->value.range_field_ref = m_range_field_ref_pool.construct();
+ p->value.range_field_ref->column_pos = column_pos++;
+ p->value.range_field_ref->ref = ref;
+
+ if (!label.empty())
+ {
+ // A custom label is specified. This one takes precedence.
+ p->value.range_field_ref->label = m_str_pool.intern(label).first;
+ }
+ else if (stack.dest_key.empty())
+ {
+ // This field is probably associated with an array.
+ std::ostringstream os;
+ os << "field " << unlabeled_field_count++;
+ p->value.range_field_ref->label = m_str_pool.intern(os.str()).first;
+ }
+ else
+ // This field is associated with an object key. Use its key as the label.
+ p->value.range_field_ref->label = m_str_pool.intern(stack.dest_key).first;
+
+ ref->fields.push_back(p->value.range_field_ref);
+
+ // Find the first row group node ancountered going up from the field
+ // node, and anchor itself to it.
+ for (auto it = stack.node_stack.rbegin(); it != stack.node_stack.rend(); ++it)
+ {
+ node* anchor_node = *it;
+ if (anchor_node->row_group)
+ {
+ anchor_node->anchored_fields.push_back(p);
+ break;
+ }
+ }
+ }
+}
+
+json_map_tree::range_ref_store_type& json_map_tree::get_range_references()
+{
+ return m_range_refs;
+}
+
+json_map_tree::range_reference_type& json_map_tree::get_range_reference(const cell_position_t& pos)
+{
+ auto it = m_range_refs.lower_bound(pos);
+ if (it == m_range_refs.end() || m_range_refs.key_comp()(m_current_range.pos, it->first))
+ {
+ // Ensure that we own the sheet name instance before storing it.
+ m_current_range.pos.sheet = m_str_pool.intern(m_current_range.pos.sheet).first;
+
+ it = m_range_refs.insert(
+ it, range_ref_store_type::value_type(
+ m_current_range.pos, range_reference_type(m_current_range.pos)));
+ }
+
+ return it->second;
+}
+
+const json_map_tree::node* json_map_tree::get_destination_node(std::string_view path) const
+{
+ if (!m_root)
+ // The tree is empty.
+ return nullptr;
+
+ if (path.empty() || path[0] != '$')
+ // A valid path must begin with a '$'.
+ return nullptr;
+
+ json_path_parser parser(path);
+ const node* cur_node = m_root.get();
+
+ for (json_path_token_value_t t = parser.next(); t.type != json_path_token_t::unknown; t = parser.next())
+ {
+ switch (t.type)
+ {
+ case json_path_token_t::array_pos:
+ {
+ if (cur_node->type != map_node_type::array)
+ return nullptr;
+
+ auto it = cur_node->value.children->find(t.value.array_pos);
+ if (it == cur_node->value.children->end())
+ return nullptr;
+
+ cur_node = &it->second;
+ break;
+ }
+ case json_path_token_t::object_key:
+ {
+ if (cur_node->type != map_node_type::object)
+ return nullptr;
+
+ child_position_type pos = to_key_position(t.value.str.p, t.value.str.n);
+
+ auto it = cur_node->value.children->find(pos);
+ if (it == cur_node->value.children->end())
+ return nullptr;
+
+ cur_node = &it->second;
+ break;
+ }
+ case json_path_token_t::end:
+ return cur_node;
+ case json_path_token_t::unknown:
+ default:
+ // Something has gone wrong. Bail out.
+ break;
+ }
+ }
+
+ // If this code path reaches here, something has gone wrong.
+ return nullptr;
+}
+
+json_map_tree::path_stack_type json_map_tree::get_or_create_destination_node(std::string_view path)
+{
+ path_stack_type stack;
+
+ if (path.empty() || path[0] != '$')
+ // A valid path must begin with a '$'.
+ return stack;
+
+ json_path_parser parser(path);
+ json_path_token_value_t t = parser.next();
+
+ std::vector<json_path_token_value_t> token_stack;
+ token_stack.push_back(t);
+
+ switch (t.type)
+ {
+ case json_path_token_t::array_pos:
+ {
+ // Insert or re-use an array node and its child at specified position.
+
+ if (m_root)
+ {
+ if (m_root->type == map_node_type::unknown)
+ {
+ m_root->type = map_node_type::array;
+ m_root->value.children = m_node_children_pool.construct();
+ }
+
+ if (m_root->type != map_node_type::array)
+ throw path_error("root node was expected to be of type array, but is not.");
+ }
+ else
+ {
+ m_root = std::make_unique<node>();
+ m_root->type = map_node_type::array;
+ m_root->value.children = m_node_children_pool.construct();
+ }
+
+ stack.node_stack.push_back(m_root.get());
+ node* p = &stack.node_stack.back()->get_or_create_child_node(t.value.array_pos);
+ stack.node_stack.push_back(p);
+ break;
+ }
+ case json_path_token_t::object_key:
+ {
+ if (m_root)
+ {
+ if (m_root->type == map_node_type::unknown)
+ {
+ m_root->type = map_node_type::object;
+ m_root->value.children = m_node_children_pool.construct();
+ }
+
+ if (m_root->type != map_node_type::object)
+ throw path_error("root node was expected to be of type array, but is not.");
+ }
+ else
+ {
+ m_root = std::make_unique<node>();
+ m_root->type = map_node_type::object;
+ m_root->value.children = m_node_children_pool.construct();
+ }
+
+ stack.node_stack.push_back(m_root.get());
+ child_position_type pos = to_key_position(t.value.str.p, t.value.str.n);
+ node* p = &stack.node_stack.back()->get_or_create_child_node(pos);
+ stack.node_stack.push_back(p);
+ break;
+ }
+ case json_path_token_t::end:
+ {
+ if (!m_root)
+ {
+ m_root = std::make_unique<node>();
+ m_root->type = map_node_type::unknown;
+ }
+
+ stack.node_stack.push_back(m_root.get());
+ return stack;
+ }
+ default:
+ // Something has gone wrong. Bail out.
+ stack.node_stack.clear();
+ return stack;
+ }
+
+ for (t = parser.next(); t.type != json_path_token_t::unknown; t = parser.next())
+ {
+ token_stack.push_back(t);
+ node* cur_node = stack.node_stack.back();
+
+ switch (t.type)
+ {
+ case json_path_token_t::array_pos:
+ {
+ switch (cur_node->type)
+ {
+ case map_node_type::array:
+ // Do nothing.
+ break;
+ case map_node_type::unknown:
+ // Turn this node into an array node.
+ cur_node->type = map_node_type::array;
+ cur_node->value.children = m_node_children_pool.construct();
+ break;
+ default:
+ throw_path_error(__FILE__, __LINE__, path);
+ }
+ node* p = &stack.node_stack.back()->get_or_create_child_node(t.value.array_pos);
+ stack.node_stack.push_back(p);
+ break;
+ }
+ case json_path_token_t::object_key:
+ {
+ switch (cur_node->type)
+ {
+ case map_node_type::object:
+ // Do nothing.
+ break;
+ case map_node_type::unknown:
+ // Turn this node into an object node.
+ cur_node->type = map_node_type::object;
+ cur_node->value.children = m_node_children_pool.construct();
+ break;
+ default:
+ throw_path_error(__FILE__, __LINE__, path);
+ }
+
+ // For an object children, we use the memory address of a
+ // pooled key string as its position.
+ child_position_type pos = to_key_position(t.value.str.p, t.value.str.n);
+ node* p = &stack.node_stack.back()->get_or_create_child_node(pos);
+ stack.node_stack.push_back(p);
+ break;
+ }
+ case json_path_token_t::end:
+ {
+ assert(token_stack.size() >= 2);
+ stack.dest_key = get_last_object_key(token_stack);
+
+ return stack;
+ }
+ case json_path_token_t::unknown:
+ default:
+ // Something has gone wrong. Bail out.
+ break;
+ }
+ }
+
+ // If this code path reaches here, something has gone wrong.
+ stack.node_stack.clear();
+ return stack;
+}
+
+json_map_tree::child_position_type json_map_tree::to_key_position(const char* p, size_t n) const
+{
+ std::string_view pooled_key = m_str_pool.intern({p, n}).first;
+ child_position_type pos = reinterpret_cast<child_position_type>(pooled_key.data());
+ return pos;
+}
+
+bool json_map_tree::is_equivalent(input_node_type input_node, map_node_type map_node)
+{
+ uint8_t left = (0x0F & uint8_t(input_node));
+ uint8_t right = (0x0F & uint8_t(map_node));
+ return left == right;
+}
+
+std::ostream& operator<< (std::ostream& os, json_map_tree::input_node_type nt)
+{
+ os << "(input-node-type: ";
+
+ switch (nt)
+ {
+ case json_map_tree::input_node_type::array:
+ os << "array";
+ break;
+ case json_map_tree::input_node_type::object:
+ os << "object";
+ break;
+ case json_map_tree::input_node_type::value:
+ os << "value";
+ break;
+ case json_map_tree::input_node_type::unknown:
+ os << "unknown";
+ break;
+ }
+
+ os << ')';
+
+ return os;
+}
+
+std::ostream& operator<< (std::ostream& os, json_map_tree::map_node_type nt)
+{
+ os << "(map-node-type: ";
+
+ switch (nt)
+ {
+ case json_map_tree::map_node_type::array:
+ os << "array";
+ break;
+ case json_map_tree::map_node_type::cell_ref:
+ os << "cell-ref";
+ break;
+ case json_map_tree::map_node_type::object:
+ os << "object";
+ break;
+ case json_map_tree::map_node_type::range_field_ref:
+ os << "range-field-ref";
+ break;
+ case json_map_tree::map_node_type::unknown:
+ os << "unknown";
+ break;
+ }
+
+ os << ')';
+
+ return os;
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/json_map_tree.hpp b/src/liborcus/json_map_tree.hpp
new file mode 100644
index 0000000..9470af0
--- /dev/null
+++ b/src/liborcus/json_map_tree.hpp
@@ -0,0 +1,197 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "spreadsheet_impl_types.hpp"
+#include "orcus/string_pool.hpp"
+#include "orcus/exception.hpp"
+
+#include <boost/pool/object_pool.hpp>
+#include <memory>
+#include <map>
+#include <vector>
+#include <iosfwd>
+
+namespace orcus {
+
+using spreadsheet::detail::cell_position_t;
+
+class json_map_tree
+{
+public:
+ using child_position_type = std::uintptr_t;
+
+ static constexpr child_position_type node_child_default_position = -1;
+
+ /**
+ * Error indicating improper path.
+ */
+ class path_error : public general_error
+ {
+ public:
+ path_error(const std::string& msg);
+ };
+
+ struct node;
+ struct range_reference_type;
+ using node_children_type = std::map<child_position_type, node>;
+ using range_ref_store_type = std::map<cell_position_t, range_reference_type>;
+
+ /** Types of nodes in the json input tree. */
+ enum class input_node_type { unknown = 0x00, array = 0x01, object = 0x02, value = 0x04 };
+
+ /**
+ * Types of nodes in the map tree. The lower 4-bits specify the input
+ * node type which are kept in sync with the input_node_type values. The
+ * next 4-bits specify the link type.
+ */
+ enum class map_node_type { unknown = 0x00, array = 0x01, object = 0x02, cell_ref = 0x14, range_field_ref = 0x24 };
+
+ struct cell_reference_type
+ {
+ cell_position_t pos;
+
+ cell_reference_type(const cell_position_t& _pos);
+ };
+
+ struct range_field_reference_type;
+
+ struct range_reference_type
+ {
+ cell_position_t pos;
+ std::vector<const range_field_reference_type*> fields;
+ spreadsheet::row_t row_position;
+ bool row_header;
+
+ range_reference_type(const cell_position_t& _pos);
+ };
+
+ /** Represents a field within a range reference. */
+ struct range_field_reference_type
+ {
+ range_reference_type* ref;
+ spreadsheet::col_t column_pos;
+ std::string_view label;
+ };
+
+ struct node
+ {
+ map_node_type type = map_node_type::unknown;
+
+ union
+ {
+ node_children_type* children = nullptr;
+ cell_reference_type* cell_ref;
+ range_field_reference_type* range_field_ref;
+
+ } value;
+
+ /**
+ * The node is a row-group node (node that defines a row boundary)
+ * if this value is set to a non-null value. If this is not null, it
+ * points to the range_reference instance it belongs to.
+ */
+ range_reference_type* row_group = nullptr;
+
+ std::vector<node*> anchored_fields;
+
+ node(const node&) = delete;
+ node& operator=(const node&) = delete;
+
+ node();
+ node(node&& other);
+
+ node& get_or_create_child_node(child_position_type pos);
+ };
+
+ class walker
+ {
+ friend class json_map_tree;
+
+ struct scope
+ {
+ node* p;
+ child_position_type array_position;
+
+ scope(node* _p);
+ };
+
+ using stack_type = std::vector<scope>;
+ using unlinked_stack_type = std::vector<input_node_type>;
+
+ const json_map_tree& m_parent;
+ stack_type m_stack;
+ unlinked_stack_type m_unlinked_stack;
+
+ walker(const json_map_tree& parent);
+ public:
+
+ node* push_node(input_node_type nt);
+ node* pop_node(input_node_type nt);
+
+ void set_object_key(const char* p, size_t n);
+ };
+
+ json_map_tree();
+ ~json_map_tree();
+
+ walker get_tree_walker() const;
+
+ void set_cell_link(std::string_view path, const cell_position_t& pos);
+
+ const node* get_link(std::string_view path) const;
+
+ void start_range(const cell_position_t& pos, bool row_header);
+ void append_field_link(std::string_view path, std::string_view label);
+ void set_range_row_group(std::string_view path);
+ void commit_range();
+
+ range_ref_store_type& get_range_references();
+
+private:
+ range_reference_type& get_range_reference(const cell_position_t& pos);
+
+ const node* get_destination_node(std::string_view path) const;
+
+ struct path_stack_type
+ {
+ std::vector<node*> node_stack;
+ std::string_view dest_key; //< object key associated with the destination value (if applicable)
+ };
+
+ path_stack_type get_or_create_destination_node(std::string_view path);
+
+ child_position_type to_key_position(const char* p, size_t n) const;
+
+ static bool is_equivalent(input_node_type input_node, map_node_type map_node);
+
+private:
+ boost::object_pool<node_children_type> m_node_children_pool;
+ boost::object_pool<cell_reference_type> m_cell_ref_pool;
+ boost::object_pool<range_field_reference_type> m_range_field_ref_pool;
+
+ mutable string_pool m_str_pool;
+
+ std::unique_ptr<node> m_root;
+
+ range_ref_store_type m_range_refs;
+
+ struct
+ {
+ cell_position_t pos;
+ std::vector<std::pair<std::string_view, std::string_view>> fields; // path, label
+ std::vector<std::string_view> row_groups;
+ bool row_header;
+
+ } m_current_range;
+};
+
+std::ostream& operator<< (std::ostream& os, json_map_tree::input_node_type nt);
+std::ostream& operator<< (std::ostream& os, json_map_tree::map_node_type nt);
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/json_map_tree_test.cpp b/src/liborcus/json_map_tree_test.cpp
new file mode 100644
index 0000000..6100bd9
--- /dev/null
+++ b/src/liborcus/json_map_tree_test.cpp
@@ -0,0 +1,130 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "json_map_tree.hpp"
+
+#include <cassert>
+#include <iostream>
+
+using namespace orcus;
+using namespace std;
+
+void test_link_array_values()
+{
+ json_map_tree tree;
+
+ cell_position_t pos("sheet", 0, 0);
+
+ tree.set_cell_link("$[0]", pos);
+ pos.row = 1;
+ tree.set_cell_link("$[][0]", pos);
+
+ const json_map_tree::node* p = tree.get_link("$[0]");
+ assert(p);
+ assert(p->type == json_map_tree::map_node_type::cell_ref);
+ assert(p->value.cell_ref->pos == cell_position_t("sheet", 0, 0));
+
+ p = tree.get_link("$[][0]");
+ assert(p);
+ assert(p->type == json_map_tree::map_node_type::cell_ref);
+ assert(p->value.cell_ref->pos == cell_position_t("sheet", 1, 0));
+}
+
+void test_link_object_values()
+{
+ struct entry
+ {
+ const char* path;
+ cell_position_t pos;
+ };
+
+ std::vector<entry> entries =
+ {
+ { "$[]['id']", cell_position_t("sheet", 2, 3) },
+ { "$[]['name']", cell_position_t("sheet", 2, 4) },
+ { "$[]['address']", cell_position_t("sheet", 2, 5) },
+ };
+
+ json_map_tree tree;
+
+ for (const entry& e : entries)
+ tree.set_cell_link(e.path, e.pos);
+
+ for (const entry& e : entries)
+ {
+ const json_map_tree::node* p = tree.get_link(e.path);
+ assert(p);
+ assert(p->type == json_map_tree::map_node_type::cell_ref);
+ assert(e.pos == p->value.cell_ref->pos);
+ }
+}
+
+void test_link_object_root()
+{
+ json_map_tree tree;
+
+ const char* path = "$['root'][2]";
+ cell_position_t pos("sheet", 3, 4);
+ tree.set_cell_link(path, pos);
+
+ const json_map_tree::node* p = tree.get_link(path);
+ assert(p);
+ assert(p->type == json_map_tree::map_node_type::cell_ref);
+ assert(p->value.cell_ref->pos == pos);
+}
+
+void test_link_range_fields()
+{
+ json_map_tree tree;
+
+ cell_position_t pos("sheet", 1, 2);
+
+ tree.start_range(pos, false);
+ tree.append_field_link("$[][0]", std::string_view{});
+ tree.append_field_link("$[][1]", std::string_view{});
+ tree.append_field_link("$[][2]", std::string_view{});
+ tree.set_range_row_group("$[]");
+ tree.commit_range();
+
+ const json_map_tree::node* p = tree.get_link("$[][0]");
+ assert(p);
+ assert(p->type == json_map_tree::map_node_type::range_field_ref);
+ assert(p->value.range_field_ref->column_pos == 0);
+
+ p = tree.get_link("$[][1]");
+ assert(p);
+ assert(p->type == json_map_tree::map_node_type::range_field_ref);
+ assert(p->value.range_field_ref->column_pos == 1);
+
+ p = tree.get_link("$[][2]");
+ assert(p);
+ assert(p->type == json_map_tree::map_node_type::range_field_ref);
+ assert(p->value.range_field_ref->column_pos == 2);
+
+ // Check the range reference data itself.
+ const json_map_tree::range_reference_type* ref = p->value.range_field_ref->ref;
+ assert(ref->fields.size() == 3);
+ assert(ref->pos == pos);
+
+ // Make sure the row group is set.
+ p = tree.get_link("$[]");
+ assert(p);
+ assert(p->type == json_map_tree::map_node_type::array);
+ assert(p->row_group == ref);
+}
+
+int main()
+{
+ test_link_array_values();
+ test_link_object_values();
+ test_link_object_root();
+ test_link_range_fields();
+
+ return EXIT_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/json_structure_mapper.cpp b/src/liborcus/json_structure_mapper.cpp
new file mode 100644
index 0000000..09a9e97
--- /dev/null
+++ b/src/liborcus/json_structure_mapper.cpp
@@ -0,0 +1,77 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "json_structure_mapper.hpp"
+
+#include <algorithm>
+#include <sstream>
+#include <cassert>
+
+namespace orcus { namespace json { namespace detail {
+
+structure_mapper::structure_mapper(structure_tree::range_handler_type rh, const json::structure_tree::walker& walker) :
+ m_walker(walker),
+ m_range_handler(std::move(rh)),
+ m_repeat_count(0) {}
+
+void structure_mapper::run()
+{
+ reset();
+ traverse(0);
+}
+
+void structure_mapper::reset()
+{
+ m_walker.root();
+ m_current_range.paths.clear();
+ m_current_range.row_groups.clear();
+ m_repeat_count = 0;
+}
+
+void structure_mapper::push_range()
+{
+ m_range_handler(std::move(m_current_range));
+
+ m_current_range.paths.clear();
+ m_current_range.row_groups.clear();
+}
+
+void structure_mapper::traverse(size_t /*pos*/)
+{
+ json::structure_tree::node_properties node = m_walker.get_node();
+
+ if (node.repeat)
+ {
+ ++m_repeat_count;
+ m_current_range.row_groups.push_back(m_walker.build_row_group_path());
+ }
+
+ if (m_repeat_count && node.type == json::structure_tree::node_type::value)
+ {
+ for (std::string path : m_walker.build_field_paths())
+ m_current_range.paths.push_back(std::move(path));
+ }
+
+ for (size_t i = 0, n = m_walker.child_count(); i < n; ++i)
+ {
+ m_walker.descend(i);
+ traverse(i);
+ m_walker.ascend();
+ }
+
+ if (node.repeat)
+ {
+ --m_repeat_count;
+
+ if (!m_repeat_count)
+ push_range();
+ }
+}
+
+}}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/json_structure_mapper.hpp b/src/liborcus/json_structure_mapper.hpp
new file mode 100644
index 0000000..6dfdd08
--- /dev/null
+++ b/src/liborcus/json_structure_mapper.hpp
@@ -0,0 +1,37 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/json_structure_tree.hpp"
+
+#include <vector>
+#include <functional>
+
+namespace orcus { namespace json { namespace detail {
+
+class structure_mapper
+{
+public:
+ structure_mapper(json::structure_tree::range_handler_type rh, const json::structure_tree::walker& walker);
+
+ void run();
+
+private:
+ void reset();
+ void push_range();
+ void traverse(size_t pos);
+
+private:
+ json::structure_tree::walker m_walker;
+ json::structure_tree::range_handler_type m_range_handler;
+ size_t m_repeat_count;
+ json::table_range_t m_current_range;
+
+};
+
+}}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/json_structure_tree.cpp b/src/liborcus/json_structure_tree.cpp
new file mode 100644
index 0000000..862b4de
--- /dev/null
+++ b/src/liborcus/json_structure_tree.cpp
@@ -0,0 +1,720 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/json_structure_tree.hpp>
+#include <orcus/json_parser.hpp>
+#include <orcus/string_pool.hpp>
+
+#include "json_structure_mapper.hpp"
+
+#include <vector>
+#include <memory>
+#include <algorithm>
+#include <map>
+#include <functional>
+
+#include <boost/pool/object_pool.hpp>
+
+namespace orcus { namespace json {
+
+namespace {
+
+struct structure_node;
+
+using node_children_type = std::vector<structure_node*>;
+using node_type = structure_tree::node_type;
+using array_positions_type = std::map<int32_t, bool>;
+
+/**
+ * Only pick those array positions that are marked "valid" - the associated
+ * boolean value is true.
+ */
+std::vector<int32_t> to_valid_array_positions(const array_positions_type& array_positions)
+{
+ std::vector<int32_t> aps;
+
+ for (const auto& e : array_positions)
+ {
+ if (e.second)
+ aps.push_back(e.first);
+ }
+
+ return aps;
+}
+
+/**
+ * Represents a node inside a JSON structure tree.
+ */
+struct structure_node
+{
+ bool repeat = false;
+
+ node_type type = node_type::unknown;
+
+ node_children_type children;
+
+ /**
+ * The number of child nodes in the source data tree, not to be confused
+ * with the number of child nodes in the structure tree.
+ */
+ int32_t child_count = 0;
+
+ std::string_view name; //< value of a key for a object key node.
+
+ /**
+ * For a value node that is an immediate child of an array node, these
+ * positions are the positions of the parent array that values always
+ * occur in the source data tree.
+ */
+ array_positions_type array_positions;
+
+ structure_node(node_type _type) : type(_type) {}
+
+ bool operator== (const structure_node& other) const
+ {
+ if (type != other.type)
+ return false;
+
+ if (type != node_type::object_key)
+ return true;
+
+ return name == other.name;
+ }
+
+ bool operator< (const structure_node& other) const
+ {
+ if (type != other.type)
+ return type < other.type;
+
+ if (name != other.name)
+ return name < other.name;
+
+ return true;
+ }
+};
+
+struct parse_scope
+{
+ structure_node& node;
+
+ int32_t child_count = 0;
+
+ parse_scope(structure_node& _node) : node(_node) {}
+};
+
+using parse_scopes_type = std::vector<parse_scope>;
+
+/**
+ * Represents a scope during structure tree traversal.
+ */
+struct scope
+{
+ const structure_node& node;
+ node_children_type::const_iterator current_pos;
+
+ scope(const structure_node& _node) :
+ node(_node),
+ current_pos(node.children.begin()) {}
+};
+
+using scope_stack_type = std::vector<scope>;
+
+void print_scope(std::ostream& os, const scope& s)
+{
+ switch (s.node.type)
+ {
+ case node_type::array:
+ os << "array";
+ break;
+ case node_type::object:
+ os << "object";
+ break;
+ case node_type::object_key:
+ os << "['" << s.node.name << "']";
+ break;
+ default:
+ os << "???";
+ }
+
+ if (s.node.repeat)
+ os << "(*)";
+
+ if (s.node.type == node_type::array && s.node.child_count)
+ os << '[' << s.node.child_count << ']';
+}
+
+void print_scopes(std::ostream& os, const scope_stack_type& scopes)
+{
+ auto it = scopes.cbegin();
+ auto ite = scopes.cend();
+
+ os << '$';
+ print_scope(os, *it);
+
+ for (++it; it != ite; ++it)
+ {
+ if (it->node.type != node_type::object_key)
+ os << '.';
+ print_scope(os, *it);
+ }
+}
+
+structure_tree::node_properties to_node_properties(const structure_node& sn)
+{
+ structure_tree::node_properties np;
+ np.type = sn.type;
+ np.repeat = sn.repeat;
+ return np;
+}
+
+} // anonymous namespace
+
+struct structure_tree::impl
+{
+ boost::object_pool<structure_node> m_node_store;
+ structure_node* m_root;
+ parse_scopes_type m_stack;
+ string_pool m_pool;
+
+ impl() : m_root(nullptr) {}
+ ~impl() {}
+
+ void begin_parse() {}
+
+ void end_parse() {}
+
+ void begin_array()
+ {
+ push_stack(node_type::array);
+ }
+
+ void end_array()
+ {
+ pop_stack();
+ }
+
+ void begin_object()
+ {
+ push_stack(node_type::object);
+ }
+
+ void object_key(std::string_view key, bool transient)
+ {
+ structure_node node(node_type::object_key);
+ node.name = key;
+
+ if (transient)
+ node.name = m_pool.intern(node.name).first;
+
+ push_stack(node);
+ }
+
+ void end_object()
+ {
+ pop_stack();
+ }
+
+ void boolean_true()
+ {
+ push_value();
+ }
+
+ void boolean_false()
+ {
+ push_value();
+ }
+
+ void null()
+ {
+ push_value();
+ }
+
+ void string(std::string_view /*val*/, bool /*transient*/)
+ {
+ push_value();
+ }
+
+ void number(double /*val*/)
+ {
+ push_value();
+ }
+
+ void normalize_tree()
+ {
+ if (!m_root)
+ return;
+
+ std::function<void(structure_node&)> descend = [&descend](structure_node& node)
+ {
+ if (node.children.empty())
+ return;
+
+ // Sort all children.
+ std::sort(node.children.begin(), node.children.end(),
+ [](const structure_node* left, const structure_node* right) -> bool
+ {
+ return *left < *right;
+ }
+ );
+
+ for (structure_node* child : node.children)
+ descend(*child);
+ };
+
+ descend(*m_root);
+ }
+
+ void dump_compact(std::ostream& os) const
+ {
+ if (!m_root)
+ return;
+
+ scope_stack_type scopes;
+ scopes.emplace_back(*m_root);
+
+ while (!scopes.empty())
+ {
+ scope& cur_scope = scopes.back();
+
+ bool new_scope = false;
+
+ for (; cur_scope.current_pos != cur_scope.node.children.end(); ++cur_scope.current_pos)
+ {
+ const structure_node& cur_node = **cur_scope.current_pos;
+
+ if (cur_node.type == node_type::value)
+ {
+ assert(cur_node.children.empty());
+
+ // Print all its parent scopes.
+ print_scopes(os, scopes);
+
+ // Print the value node at the end.
+ os << ".value";
+
+ // Print array positions if applicable.
+ std::vector<int32_t> aps = to_valid_array_positions(cur_node.array_positions);
+
+ if (!aps.empty())
+ {
+ os << '[';
+ auto it = aps.cbegin();
+ os << *it;
+ for (++it; it != aps.cend(); ++it)
+ os << ',' << *it;
+ os << ']';
+ }
+
+ os << std::endl;
+ continue;
+ }
+
+ if (cur_node.children.empty())
+ continue;
+
+ // This node has child nodes. Push a new scope and trigger a new inner loop.
+
+ ++cur_scope.current_pos; // Don't forget to move to the next sibling for when we return to this scope.
+ scopes.emplace_back(cur_node);
+ new_scope = true;
+ break;
+ }
+
+ if (new_scope)
+ continue;
+
+ scopes.pop_back();
+ }
+ }
+
+private:
+
+ parse_scope& get_current_scope()
+ {
+ assert(!m_stack.empty());
+ return m_stack.back();
+ }
+
+ bool is_node_repeatable(const structure_node& node) const
+ {
+ const structure_node& cur = m_stack.back().node;
+
+ if (cur.type != node_type::array)
+ return false;
+
+ return node.type == node_type::array || node.type == node_type::object;
+ }
+
+ void push_stack(const structure_node& node)
+ {
+ if (!m_root)
+ {
+ // This is the very first node.
+ assert(node.type != node_type::object_key);
+ m_root = m_node_store.construct(node.type);
+ m_stack.emplace_back(*m_root);
+ return;
+ }
+
+ parse_scope& cur_scope = get_current_scope();
+ structure_node& cur_node = cur_scope.node;
+
+ // Record the position of this new child in case the parent is an
+ // array and the new node is a value node.
+
+ int32_t array_pos = -1;
+
+ if (cur_node.type == node_type::array)
+ {
+ array_pos = cur_scope.child_count;
+
+ if (node.type != node_type::value)
+ {
+ // See if this array has a child value node.
+ auto it = std::find_if(
+ cur_node.children.begin(), cur_node.children.end(),
+ [](const structure_node* p) -> bool { return p->type == node_type::value; }
+ );
+
+ if (it != cur_node.children.end())
+ {
+ // It has a child value node. See if this value node has
+ // this array position recorded. If yes, turn it off
+ // since this position is not always a value.
+ array_positions_type& aps = (*it)->array_positions;
+ auto it_array_pos = aps.find(array_pos);
+ if (it_array_pos != aps.end())
+ it_array_pos->second = false;
+ }
+
+ array_pos = -1;
+ }
+ }
+
+ ++cur_scope.child_count;
+
+ {
+ // See if the current node has a child node of the specified type.
+ auto it = std::find_if(cur_node.children.begin(), cur_node.children.end(),
+ [&node](const structure_node* p) -> bool
+ {
+ return *p == node;
+ }
+ );
+
+ if (it == cur_node.children.end())
+ {
+ // current node doesn't have a child of specified type. Add one.
+ cur_node.children.push_back(m_node_store.construct(node));
+ m_stack.emplace_back(*cur_node.children.back());
+ }
+ else
+ {
+ // current node does have a child of specified type.
+ bool repeat = is_node_repeatable(node);
+ structure_node& child = **it;
+ child.repeat = repeat;
+ m_stack.emplace_back(child);
+ }
+ }
+
+ if (array_pos >= 0)
+ {
+ array_positions_type& aps = m_stack.back().node.array_positions;
+ int32_t min_pos = aps.empty() ? 0 : aps.begin()->first;
+ if (array_pos >= min_pos)
+ {
+ auto it = aps.lower_bound(array_pos);
+
+ if (it == aps.end() || aps.key_comp()(array_pos, it->first))
+ {
+ // Insert a new array child node of unspecified type at the specified position.
+ aps.insert(
+ it, array_positions_type::value_type(array_pos, true));
+ }
+ }
+ }
+ }
+
+ void push_value()
+ {
+ push_stack(node_type::value);
+ pop_stack();
+ }
+
+ void pop_stack()
+ {
+ parse_scope& cur_scope = get_current_scope();
+ structure_node& cur_node = cur_scope.node;
+ if (cur_scope.child_count > cur_node.child_count)
+ cur_node.child_count = cur_scope.child_count;
+
+ m_stack.pop_back();
+
+ if (!m_stack.empty() && get_current_scope().node.type == node_type::object_key)
+ // Object key is a special non-leaf node that can only have one child.
+ m_stack.pop_back();
+ }
+};
+
+struct structure_tree::walker::impl
+{
+ using stack_type = std::vector<const structure_node*>;
+
+ const structure_tree::impl* parent_impl;
+
+ stack_type stack;
+
+ impl() : parent_impl(nullptr) {}
+
+ impl(const structure_tree::impl* _parent_impl) : parent_impl(_parent_impl) {}
+
+ impl(const structure_tree::walker::impl& other) :
+ parent_impl(other.parent_impl) {}
+
+ void check_tree()
+ {
+ if (!parent_impl)
+ throw json_structure_error(
+ "This walker is not associated with any json_structure_tree instance.");
+
+ if (!parent_impl->m_root)
+ throw json_structure_error("Empty tree.");
+ }
+
+ void check_stack()
+ {
+ check_tree();
+
+ if (stack.empty())
+ throw json_structure_error(
+ "Walker stack is empty. Most likely caused by not calling root() to start the traversal.");
+ }
+};
+
+structure_tree::walker::walker() : mp_impl(std::make_unique<impl>()) {}
+structure_tree::walker::walker(const walker& other) : mp_impl(std::make_unique<impl>(*other.mp_impl)) {}
+structure_tree::walker::walker(const structure_tree::impl* parent_impl) : mp_impl(std::make_unique<impl>(parent_impl)) {}
+structure_tree::walker::~walker() {}
+
+void structure_tree::walker::root()
+{
+ mp_impl->check_tree();
+
+ mp_impl->stack.clear();
+ mp_impl->stack.push_back(mp_impl->parent_impl->m_root);
+}
+
+void structure_tree::walker::descend(size_t child_pos)
+{
+ mp_impl->check_stack();
+ assert(!mp_impl->stack.empty());
+
+ const structure_node* p = mp_impl->stack.back();
+ assert(p);
+
+ if (child_pos >= p->children.size())
+ {
+ std::ostringstream os;
+ os << "Specified child position of " << child_pos << " exceeds the child count of " << p->children.size() << '.';
+ throw json_structure_error(os.str());
+ }
+
+ p = p->children[child_pos];
+ assert(p);
+ mp_impl->stack.push_back(p);
+}
+
+void structure_tree::walker::ascend()
+{
+ mp_impl->check_stack();
+ assert(!mp_impl->stack.empty());
+
+ if (mp_impl->stack.size() == 1u)
+ throw json_structure_error("You cannot ascend from the root node.");
+
+ mp_impl->stack.pop_back();
+}
+
+size_t structure_tree::walker::child_count() const
+{
+ mp_impl->check_stack();
+ assert(!mp_impl->stack.empty());
+
+ const structure_node* p = mp_impl->stack.back();
+ return p->children.size();
+}
+
+structure_tree::node_properties structure_tree::walker::get_node() const
+{
+ mp_impl->check_stack();
+ assert(!mp_impl->stack.empty());
+
+ const structure_node* p = mp_impl->stack.back();
+ assert(p);
+ return to_node_properties(*p);
+}
+
+std::vector<std::string> structure_tree::walker::build_field_paths() const
+{
+ mp_impl->check_stack();
+ assert(!mp_impl->stack.empty());
+
+ if (mp_impl->stack.empty() || mp_impl->stack.back()->type != node_type::value)
+ throw json_structure_error("You can only build field paths to value node.");
+
+ std::ostringstream os;
+ os << '$';
+
+ auto it = mp_impl->stack.cbegin(), ite = mp_impl->stack.cend();
+
+ const structure_node* p = nullptr;
+ const structure_node* p_prev = *it;
+
+ for (++it; it != ite; ++it, p_prev = p)
+ {
+ p = *it;
+
+ switch (p_prev->type)
+ {
+ case structure_tree::node_type::array:
+ if (p->type != structure_tree::node_type::value)
+ os << "[]";
+ break;
+ case structure_tree::node_type::object_key:
+ os << "['" << p_prev->name << "']";
+ break;
+ default:
+ ;
+ }
+ }
+
+ if (p_prev->type == structure_tree::node_type::value && !p->array_positions.empty())
+ {
+ // non-empty array positions implies that the parent is an array.
+ std::vector<int32_t> aps = to_valid_array_positions(p->array_positions);
+ if (!aps.empty())
+ {
+ std::vector<std::string> ret;
+ std::string base = os.str();
+ for (int32_t ap : aps)
+ {
+ std::ostringstream path;
+ path << base << '[' << ap << ']';
+ ret.push_back(path.str());
+ }
+
+ return ret;
+ }
+ }
+
+ return std::vector<std::string>(1u, os.str());
+}
+
+std::string structure_tree::walker::build_row_group_path() const
+{
+ mp_impl->check_stack();
+
+ if (mp_impl->stack.size() < 2u)
+ throw json_structure_error("Current node is root - it doesn't have a parent.");
+
+ if (!mp_impl->stack.back()->repeat)
+ throw json_structure_error(
+ "Current node is not a repeating node. Only the parent node of a repeating node can be a row group.");
+
+ {
+ auto it = mp_impl->stack.crbegin();
+ ++it;
+ if ((*it)->type != structure_tree::node_type::array)
+ throw json_structure_error(
+ "Parent node of the current node is not of array type, but it should be.");
+ }
+
+ std::ostringstream os;
+ os << '$';
+
+ auto it = mp_impl->stack.cbegin(), ite = mp_impl->stack.cend();
+ ite -= 2; // jump to the parent node, and we don't include the last node in the path output.
+
+ for (; it != ite; ++it)
+ {
+ const structure_node* p = *it;
+
+ switch (p->type)
+ {
+ case structure_tree::node_type::array:
+ os << "[]";
+ break;
+ case structure_tree::node_type::object_key:
+ os << "['" << p->name << "']";
+ break;
+ default:
+ ;
+ }
+ }
+
+ return os.str();
+}
+
+structure_tree::structure_tree() : mp_impl(std::make_unique<impl>()) {}
+structure_tree::~structure_tree() {}
+
+void structure_tree::parse(std::string_view stream)
+{
+ json_parser<impl> parser(stream, *mp_impl);
+ parser.parse();
+}
+
+void structure_tree::normalize_tree()
+{
+ mp_impl->normalize_tree();
+}
+
+void structure_tree::dump_compact(std::ostream& os) const
+{
+ mp_impl->dump_compact(os);
+}
+
+structure_tree::walker structure_tree::get_walker() const
+{
+ return walker(mp_impl.get());
+}
+
+void structure_tree::process_ranges(range_handler_type rh) const
+{
+ detail::structure_mapper mapper(rh, get_walker());
+ mapper.run();
+}
+
+std::ostream& operator<< (std::ostream& os, structure_tree::node_type nt)
+{
+
+ switch (nt)
+ {
+ case structure_tree::node_type::array:
+ os << "structure_tree::node_type::array";
+ break;
+ case structure_tree::node_type::object:
+ os << "structure_tree::node_type::object";
+ break;
+ case structure_tree::node_type::object_key:
+ os << "structure_tree::node_type::object_key";
+ break;
+ case structure_tree::node_type::unknown:
+ os << "structure_tree::node_type::unknown";
+ break;
+ case structure_tree::node_type::value:
+ os << "structure_tree::node_type::value";
+ break;
+ }
+
+ return os;
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/json_structure_tree_test.cpp b/src/liborcus/json_structure_tree_test.cpp
new file mode 100644
index 0000000..60a0598
--- /dev/null
+++ b/src/liborcus/json_structure_tree_test.cpp
@@ -0,0 +1,201 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/json_structure_tree.hpp>
+#include <orcus/stream.hpp>
+#include <orcus/parser_global.hpp>
+#include "filesystem_env.hpp"
+
+#include <vector>
+#include <sstream>
+#include <cassert>
+#include <unordered_set>
+
+using namespace orcus;
+
+std::vector<const char*> base_dirs = {
+ SRCDIR"/test/json-structure/arrays-in-object/",
+ SRCDIR"/test/json-structure/nested-arrays/",
+ SRCDIR"/test/json-structure/nested-arrays-mixed/",
+ SRCDIR"/test/json-structure/nested-arrays-mixed-2/",
+ SRCDIR"/test/json-structure/repeat-objects/",
+ SRCDIR"/test/json-structure/repeat-objects-2/",
+ SRCDIR"/test/json-structure/multiple-ranges/",
+};
+
+/**
+ * All json contents under this directory have no value nodes. Since the
+ * structure output of a JSON content only dumps value nodes, the output
+ * string should be empty when the source content does not have any value
+ * nodes.
+ */
+void test_no_value_nodes()
+{
+ fs::path base_dir(SRCDIR"/test/json-structure/no-value-nodes");
+
+ for (const fs::path& p : fs::directory_iterator(base_dir))
+ {
+ if (!fs::is_regular_file(p))
+ continue;
+
+ if (p.extension().string() != ".json")
+ continue;
+
+ file_content strm(p.string().data());
+ json::structure_tree tree;
+ tree.parse(strm.str());
+ tree.normalize_tree();
+ std::ostringstream os;
+ tree.dump_compact(os);
+
+ assert(os.str().empty());
+ }
+}
+
+void test_basic()
+{
+ for (const char* base_dir : base_dirs)
+ {
+ std::string filepath(base_dir);
+ filepath.append("input.json");
+
+ file_content strm(filepath.data());
+ assert(!strm.empty());
+ json::structure_tree tree;
+ tree.parse(strm.str());
+ tree.normalize_tree();
+ std::ostringstream os;
+ tree.dump_compact(os);
+ std::string data_content = os.str();
+
+ // Check the dump content against known datum.
+ filepath = base_dir;
+ filepath.append("check.txt");
+ file_content strm_check(filepath.data());
+ assert(!strm_check.empty());
+
+ // They should be identical, plus or minus leading/trailing whitespaces.
+ std::string_view s1(data_content.data(), data_content.size());
+ std::string_view s2 = strm_check.str();
+ assert(trim(s1) == trim(s2));
+ }
+}
+
+void test_automatic_range_detection()
+{
+ using detected_group_type = std::unordered_set<std::string>;
+ using detected_groups_type = std::vector<detected_group_type>;
+
+ struct check
+ {
+ fs::path filepath;
+ detected_groups_type expected_groups;
+ };
+
+ std::vector<check> checks =
+ {
+ {
+ SRCDIR"/test/json-structure/arrays-in-object/input.json",
+ {
+ {
+ "row-group:$['rows']",
+ "path:$['rows'][]['name']",
+ "path:$['rows'][]['age']",
+ "path:$['rows'][]['error']",
+ }
+ }
+ },
+ {
+ SRCDIR"/test/json-structure/repeat-objects/input.json",
+ {
+ {
+ "path:$[]['name']",
+ "path:$[]['age']",
+ "row-group:$",
+ }
+ }
+ },
+ {
+ SRCDIR"/test/json-structure/repeat-objects-2/input.json",
+ {
+ {
+ "path:$[]['name']",
+ "path:$[]['age']",
+ "path:$[]['props']['alpha']",
+ "path:$[]['props']['beta']",
+ "path:$[]['props']['gamma']",
+ "path:$[]['props']['theta']",
+ "row-group:$",
+ }
+ }
+ },
+ {
+ SRCDIR"/test/json-structure/multiple-ranges/input.json",
+ {
+ {
+ "path:$['data'][]['category']",
+ "path:$['data'][]['region']",
+ "path:$['data'][]['records'][]['id']",
+ "path:$['data'][]['records'][]['ref']",
+ "row-group:$['data']",
+ "row-group:$['data'][]['records']",
+ },
+ {
+ "path:$['misc'][][0]",
+ "path:$['misc'][][1]",
+ "path:$['misc'][][2]",
+ "row-group:$['misc']",
+ }
+ }
+ },
+ };
+
+ for (const check& c : checks)
+ {
+ file_content strm(c.filepath.string().data());
+ assert(!strm.empty());
+ json::structure_tree tree;
+ tree.parse(strm.str());
+
+ detected_groups_type observed_groups;
+
+ json::structure_tree::range_handler_type rh = [&observed_groups](json::table_range_t&& range)
+ {
+ detected_group_type observed;
+ for (const std::string& s : range.row_groups)
+ {
+ std::ostringstream os;
+ os << "row-group:" << s;
+ observed.insert(os.str());
+ }
+
+ for (const std::string& s : range.paths)
+ {
+ std::ostringstream os;
+ os << "path:" << s;
+ observed.insert(os.str());
+ }
+
+ observed_groups.push_back(std::move(observed));
+ };
+
+ tree.process_ranges(rh);
+
+ assert(observed_groups == c.expected_groups);
+ }
+}
+
+int main()
+{
+ test_no_value_nodes();
+ test_basic();
+ test_automatic_range_detection();
+
+ return EXIT_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/json_util.cpp b/src/liborcus/json_util.cpp
new file mode 100644
index 0000000..b031cbe
--- /dev/null
+++ b/src/liborcus/json_util.cpp
@@ -0,0 +1,27 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/json_global.hpp"
+
+#include <sstream>
+
+namespace orcus { namespace json {
+
+namespace {
+
+const char quote = '"';
+
+}
+
+void dump_string(std::ostringstream& os, const std::string& s)
+{
+ os << quote << escape_string(s) << quote;
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/json_util.hpp b/src/liborcus/json_util.hpp
new file mode 100644
index 0000000..00917a2
--- /dev/null
+++ b/src/liborcus/json_util.hpp
@@ -0,0 +1,21 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_JSON_UTIL_HPP
+#define INCLUDED_ORCUS_JSON_UTIL_HPP
+
+#include <sstream>
+
+namespace orcus { namespace json {
+
+void dump_string(std::ostringstream& os, const std::string& s);
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/measurement.cpp b/src/liborcus/measurement.cpp
new file mode 100644
index 0000000..f034595
--- /dev/null
+++ b/src/liborcus/measurement.cpp
@@ -0,0 +1,214 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/measurement.hpp>
+#include <orcus/exception.hpp>
+#include <orcus/parser_global.hpp>
+
+#include <mdds/sorted_string_map.hpp>
+#include <mdds/global.hpp>
+
+#include <sstream>
+
+namespace orcus {
+
+double to_double(std::string_view s, const char** p_parse_ended)
+{
+ const char* p = s.data();
+ double value;
+ const char* p_last = parse_numeric(p, p + s.size(), value);
+ if (p_parse_ended)
+ *p_parse_ended = p_last;
+
+ return value;
+}
+
+long to_long(std::string_view s, const char** p_parse_ended)
+{
+ long value;
+ const char* p_last = parse_integer(s.data(), s.data() + s.size(), value);
+ if (p_parse_ended)
+ *p_parse_ended = p_last;
+
+ return value;
+}
+
+bool to_bool(std::string_view s)
+{
+ size_t n = s.size();
+ if (n == 1)
+ // Any single char other than '0' is true.
+ return s[0] != '0';
+
+ return s == "true" || s == "TRUE";
+}
+
+namespace {
+
+namespace length {
+
+using map_type = mdds::sorted_string_map<length_unit_t, mdds::string_view_map_entry>;
+
+// Keys must be sorted.
+constexpr map_type::entry entries[] =
+{
+ { "cm", length_unit_t::centimeter },
+ { "in", length_unit_t::inch },
+ { "mm", length_unit_t::millimeter },
+ { "pt", length_unit_t::point },
+ { "px", length_unit_t::pixel }
+};
+
+const map_type& get()
+{
+ static map_type mt(entries, std::size(entries), length_unit_t::unknown);
+ return mt;
+}
+
+} // namespace length
+
+} // anonymous namespace
+
+length_t to_length(std::string_view str)
+{
+ length_t ret;
+ if (str.empty())
+ return ret;
+
+ const char* p = str.data();
+ const char* p_start = p;
+ const char* p_end = p_start + str.size();
+ p = parse_numeric(p, p_end, ret.value);
+
+ std::string_view tail(p, p_end-p);
+ ret.unit = length::get().find(tail);
+
+ return ret;
+}
+
+namespace {
+
+double convert_inch(double value, length_unit_t unit_to)
+{
+ switch (unit_to)
+ {
+ case length_unit_t::twip:
+ // inches to twips : 1 twip = 1/1440 inches
+ return value * 1440.0;
+ default:
+ ;
+ }
+
+ throw general_error("convert_inch: unsupported unit of measurement.");
+}
+
+double convert_point(double value, length_unit_t unit_to)
+{
+ switch (unit_to)
+ {
+ case length_unit_t::twip:
+ // 20 twips = 1 point
+ return value * 20.0;
+ default:
+ ;
+ }
+
+ throw general_error("convert_point: unsupported unit of measurement.");
+}
+
+double convert_centimeter(double value, length_unit_t unit_to)
+{
+ switch (unit_to)
+ {
+ case length_unit_t::twip:
+ // centimeters to twips : 2.54 cm = 1 inch = 1440 twips
+ return value / 2.54 * 1440.0;
+ default:
+ ;
+ }
+
+ throw general_error("convert_centimeter: unsupported unit of measurement.");
+}
+
+double convert_millimeter(double value, length_unit_t unit_to)
+{
+ switch (unit_to)
+ {
+ case length_unit_t::twip:
+ // millimeters to twips : 25.4 mm = 1 inch = 1440 twips
+ return value / 25.4 * 1440.0;
+ default:
+ ;
+ }
+
+ throw general_error("convert_millimeter: unsupported unit of measurement.");
+}
+
+double convert_twip(double value, length_unit_t unit_to)
+{
+ switch (unit_to)
+ {
+ case length_unit_t::inch:
+ // twips to inches : 1 twip = 1/1440 inches
+ return value / 1440.0;
+ case length_unit_t::point:
+ // 1 twip = 1/1440 inches = 72/1440 points = 1/20 points
+ return value / 20.0;
+ default:
+ ;
+ }
+ throw general_error("convert_twip: unsupported unit of measurement.");
+}
+
+/**
+ * Since Excel's column width is based on the maximum digit width of font
+ * used as the "Normal" style font, it's impossible to convert it accurately
+ * without the font information.
+ */
+double convert_xlsx_column_digit(double value, length_unit_t unit_to)
+{
+ // Convert to centimeters first. Here, we'll just assume that a single
+ // digit always equals 1.9 millimeters. TODO: find a better way to convert
+ // this.
+ value *= 0.19;
+ return convert_centimeter(value, unit_to);
+}
+
+}
+
+double convert(double value, length_unit_t unit_from, length_unit_t unit_to)
+{
+ if (value == 0.0)
+ return value;
+
+ switch (unit_from)
+ {
+ case length_unit_t::point:
+ return convert_point(value, unit_to);
+ case length_unit_t::inch:
+ return convert_inch(value, unit_to);
+ case length_unit_t::centimeter:
+ return convert_centimeter(value, unit_to);
+ case length_unit_t::millimeter:
+ return convert_millimeter(value, unit_to);
+ case length_unit_t::twip:
+ return convert_twip(value, unit_to);
+ case length_unit_t::xlsx_column_digit:
+ return convert_xlsx_column_digit(value, unit_to);
+ default:
+ ;
+ }
+
+ std::ostringstream os;
+ os << "convert: unsupported unit of measurement (from "
+ << static_cast<int>(unit_from) << " to "
+ << static_cast<int>(unit_to) << ") (value=" << value << ")";
+ throw general_error(os.str());
+}
+
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/number_utils.cpp b/src/liborcus/number_utils.cpp
new file mode 100644
index 0000000..8e669ae
--- /dev/null
+++ b/src/liborcus/number_utils.cpp
@@ -0,0 +1,74 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "number_utils.hpp"
+
+namespace orcus {
+
+namespace {
+
+std::optional<std::uint8_t> char_to_uint8(char c)
+{
+ std::uint8_t v;
+ if ('0' <= c && c <= '9')
+ {
+ v = c - '0';
+ return v;
+ }
+
+ if ('A' <= c && c <= 'F')
+ {
+ v = c - 'A' + 10;
+ return v;
+ }
+
+ if ('a' <= c && c <= 'f')
+ {
+ v = c - 'a' + 10;
+ return v;
+ }
+
+ return {};
+}
+
+template<typename IntT>
+std::optional<IntT> hex_to_uint(std::string_view s)
+{
+ static_assert(std::is_integral_v<IntT>);
+
+ constexpr std::size_t expected_len = sizeof(IntT) * 2u;
+ if (s.size() > expected_len)
+ return {};
+
+ IntT value = 0;
+ for (char c : s)
+ {
+ value = value << 4;
+ auto v = char_to_uint8(c);
+ if (!v)
+ return {};
+ value += *v;
+ }
+
+ return value;
+}
+
+} // anonymous namespace
+
+std::optional<std::uint8_t> hex_to_uint8(std::string_view s)
+{
+ return hex_to_uint<std::uint8_t>(s);
+}
+
+std::optional<std::uint16_t> hex_to_uint16(std::string_view s)
+{
+ return hex_to_uint<std::uint16_t>(s);
+}
+
+} // namespace orcus
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/number_utils.hpp b/src/liborcus/number_utils.hpp
new file mode 100644
index 0000000..acb4c3a
--- /dev/null
+++ b/src/liborcus/number_utils.hpp
@@ -0,0 +1,22 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#pragma once
+
+#include <string_view>
+#include <optional>
+#include <cstdint>
+
+namespace orcus {
+
+std::optional<std::uint8_t> hex_to_uint8(std::string_view s);
+
+std::optional<std::uint16_t> hex_to_uint16(std::string_view s);
+
+} // namespace orcus
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/odf_document_styles_context.cpp b/src/liborcus/odf_document_styles_context.cpp
new file mode 100644
index 0000000..957e55f
--- /dev/null
+++ b/src/liborcus/odf_document_styles_context.cpp
@@ -0,0 +1,73 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "odf_document_styles_context.hpp"
+#include "odf_token_constants.hpp"
+#include "odf_namespace_types.hpp"
+
+#include <orcus/spreadsheet/import_interface_styles.hpp>
+
+#include <iostream>
+
+namespace ss = orcus::spreadsheet;
+
+namespace orcus {
+
+document_styles_context::document_styles_context(session_context& session_cxt, const tokens& tk, odf_styles_map_type& styles_map, ss::iface::import_styles* xstyles) :
+ xml_context_base(session_cxt, tk),
+ m_styles_map(styles_map),
+ mp_styles(xstyles),
+ m_cxt_styles(session_cxt, tk, xstyles)
+{
+ register_child(&m_cxt_styles);
+}
+
+xml_context_base* document_styles_context::create_child_context(xmlns_id_t ns, xml_token_t name)
+{
+ if (ns == NS_odf_office && name == XML_styles)
+ {
+ m_cxt_styles.reset();
+ return &m_cxt_styles;
+ }
+
+ return nullptr;
+}
+
+void document_styles_context::end_child_context(xmlns_id_t ns, xml_token_t name, xml_context_base* child)
+{
+ if (ns == NS_odf_office && name == XML_styles)
+ {
+ assert(child == &m_cxt_styles);
+ auto new_styles = m_cxt_styles.pop_styles();
+ merge(m_styles_map, new_styles);
+ assert(new_styles.empty());
+ }
+}
+
+void document_styles_context::start_element(xmlns_id_t ns, xml_token_t name, const std::vector<xml_token_attr_t>& attrs)
+{
+ auto parent = push_stack(ns, name);
+ (void)parent;
+
+ (void)attrs;
+
+ warn_unhandled();
+}
+
+bool document_styles_context::end_element(xmlns_id_t ns, xml_token_t name)
+{
+ return pop_stack(ns, name);
+}
+
+void document_styles_context::characters(std::string_view /*str*/, bool /*transient*/)
+{
+}
+
+
+} // namespace orcus
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/odf_document_styles_context.hpp b/src/liborcus/odf_document_styles_context.hpp
new file mode 100644
index 0000000..4deecb5
--- /dev/null
+++ b/src/liborcus/odf_document_styles_context.hpp
@@ -0,0 +1,50 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#pragma once
+
+#include "xml_context_base.hpp"
+#include "odf_styles.hpp"
+#include "odf_styles_context.hpp"
+
+namespace orcus {
+
+namespace spreadsheet { namespace iface {
+
+class import_styles;
+
+}}
+
+/**
+ * Context that handles the <office:document-styles> element scope.
+ *
+ * <office:document-styles> is the root element of styles.xml stream inside an
+ * ODF document.
+ */
+class document_styles_context : public xml_context_base
+{
+public:
+ document_styles_context(
+ session_context& session_cxt, const tokens& tk,
+ odf_styles_map_type& styles_map, spreadsheet::iface::import_styles* xstyles);
+
+ xml_context_base* create_child_context(xmlns_id_t ns, xml_token_t name) override;
+ void end_child_context(xmlns_id_t ns, xml_token_t name, xml_context_base* child) override;
+ void start_element(xmlns_id_t ns, xml_token_t name, const std::vector<xml_token_attr_t>& attrs) override;
+ bool end_element(xmlns_id_t ns, xml_token_t name) override;
+ void characters(std::string_view str, bool transient) override;
+
+private:
+ odf_styles_map_type& m_styles_map;
+ spreadsheet::iface::import_styles* mp_styles = nullptr;
+
+ styles_context m_cxt_styles;
+};
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/odf_helper.cpp b/src/liborcus/odf_helper.cpp
new file mode 100644
index 0000000..7198b74
--- /dev/null
+++ b/src/liborcus/odf_helper.cpp
@@ -0,0 +1,260 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "odf_helper.hpp"
+#include "string_helper.hpp"
+#include <orcus/spreadsheet/types.hpp>
+#include <orcus/measurement.hpp>
+#include <mdds/sorted_string_map.hpp>
+#include <mdds/global.hpp>
+#include <orcus/spreadsheet/styles.hpp>
+
+namespace ss = orcus::spreadsheet;
+
+namespace orcus {
+
+namespace {
+
+namespace border_style {
+
+using map_type = mdds::sorted_string_map<spreadsheet::border_style_t, mdds::string_view_map_entry>;
+
+// Keys must be sorted.
+constexpr map_type::entry entries[] =
+{
+ { "dash-dot", spreadsheet::border_style_t::dash_dot },
+ { "dash-dot-dot", spreadsheet::border_style_t::dash_dot_dot },
+ { "dashed", spreadsheet::border_style_t::dashed },
+ { "dotted", spreadsheet::border_style_t::dotted },
+ { "double-thin", spreadsheet::border_style_t::double_thin },
+ { "fine-dashed", spreadsheet::border_style_t::fine_dashed },
+ { "none", spreadsheet::border_style_t::none },
+ { "solid", spreadsheet::border_style_t::solid },
+};
+
+const map_type& get()
+{
+ static const map_type mt(entries, std::size(entries), ss::border_style_t::unknown);
+ return mt;
+}
+
+} // namespace border_style
+
+namespace underline_width {
+
+using map_type = mdds::sorted_string_map<spreadsheet::underline_width_t, mdds::string_view_map_entry>;
+
+// Keys must be sorted.
+constexpr map_type::entry entries[] =
+{
+ { "auto", ss::underline_width_t::automatic },
+ { "bold", ss::underline_width_t::bold },
+ { "dash", ss::underline_width_t::dash },
+ { "medium", ss::underline_width_t::medium },
+ { "thick", ss::underline_width_t::thick },
+ { "thin", ss::underline_width_t::thin },
+};
+
+const map_type& get()
+{
+ static const map_type mt(entries, std::size(entries), ss::underline_width_t::none);
+ return mt;
+}
+
+} // namespace underline_width
+
+namespace underline_style {
+
+using map_type = mdds::sorted_string_map<ss::underline_t, mdds::string_view_map_entry>;
+
+// Keys must be sorted.
+constexpr map_type::entry entries[] =
+{
+ { "dash", ss::underline_t::dash },
+ { "dot-dash", ss::underline_t::dot_dash },
+ { "dot-dot-dash", ss::underline_t::dot_dot_dash },
+ { "dotted", ss::underline_t::dotted },
+ { "long-dash", ss::underline_t::long_dash },
+ { "none", ss::underline_t::none },
+ { "solid", ss::underline_t::single_line },
+ { "wave", ss::underline_t::wave }
+};
+
+const map_type& get()
+{
+ static map_type mt(entries, std::size(entries), ss::underline_t::none);
+ return mt;
+}
+
+} // namespace underline_style
+
+namespace hor_align {
+
+using map_type = mdds::sorted_string_map<spreadsheet::hor_alignment_t, mdds::string_view_map_entry>;
+
+// Keys must be sorted.
+constexpr map_type::entry entries[] =
+{
+ { "center", spreadsheet::hor_alignment_t::center },
+ { "end", spreadsheet::hor_alignment_t::right },
+ { "justified", spreadsheet::hor_alignment_t::justified },
+ { "start", spreadsheet::hor_alignment_t::left }
+};
+
+const map_type& get()
+{
+ static map_type mt(entries, std::size(entries), ss::hor_alignment_t::unknown);
+ return mt;
+}
+
+} // namespace hor_align
+
+namespace ver_align {
+
+using map_type = mdds::sorted_string_map<spreadsheet::ver_alignment_t, mdds::string_view_map_entry>;
+
+// Keys must be sorted.
+constexpr map_type::entry entries[] =
+{
+ { "bottom", spreadsheet::ver_alignment_t::bottom },
+ { "justified", spreadsheet::ver_alignment_t::justified },
+ { "middle", spreadsheet::ver_alignment_t::middle },
+ { "top", spreadsheet::ver_alignment_t::top }
+};
+
+const map_type& get()
+{
+ static map_type mt(entries, std::size(entries), ss::ver_alignment_t::unknown);
+ return mt;
+}
+
+} // namespace ver_align
+
+bool is_valid_hex_digit(const char& character, orcus::spreadsheet::color_elem_t& val)
+{
+ if ('0' <= character && character <= '9')
+ {
+ val += character - '0';
+ return true;
+ }
+
+ if ('A' <= character && character <= 'F')
+ {
+ val += character - 'A' + 10;
+ return true;
+ }
+
+ if ('a' <= character && character <= 'f')
+ {
+ val += character - 'a' + 10;
+ return true;
+ }
+
+ return false;
+}
+
+// converts two characters starting at index to a color value
+bool convert_color_digits(std::string_view value, orcus::spreadsheet::color_elem_t& color_val, size_t index)
+{
+ const char& high_val = value[index];
+ color_val = 0;
+ if (!is_valid_hex_digit(high_val, color_val))
+ return false;
+ color_val *= 16;
+ const char& low_val = value[++index];
+ return is_valid_hex_digit(low_val, color_val);
+}
+
+} // anonymous namespace
+
+bool odf::convert_fo_color(
+ std::string_view value,
+ spreadsheet::color_elem_t& red,
+ spreadsheet::color_elem_t& green,
+ spreadsheet::color_elem_t& blue)
+{
+ auto color = convert_fo_color(value);
+ if (!color)
+ return false;
+
+ red = color->red;
+ green = color->green;
+ blue = color->blue;
+ return true;
+}
+
+std::optional<spreadsheet::color_rgb_t> odf::convert_fo_color(std::string_view value)
+{
+ std::optional<spreadsheet::color_rgb_t> ret;
+
+ // first character needs to be '#'
+ if (value.size() != 7)
+ return ret;
+
+ if (value[0] != '#')
+ return ret;
+
+ spreadsheet::color_rgb_t color;
+ if (!convert_color_digits(value, color.red, 1))
+ return ret;
+
+ if (!convert_color_digits(value, color.green, 3))
+ return ret;
+
+ if (!convert_color_digits(value, color.blue, 5))
+ return ret;
+
+ return color;
+}
+
+orcus::odf::border_details_t odf::extract_border_details(std::string_view value)
+{
+ border_details_t border_details;
+
+ auto detail = orcus::string_helper::split_string(value,' ');
+
+ for (const auto& sub_detail : detail)
+ {
+ if (sub_detail[0] == '#')
+ convert_fo_color(sub_detail, border_details.red, border_details.green, border_details.blue);
+ else if (sub_detail[0] >= '0' && sub_detail[0] <='9')
+ border_details.border_width = orcus::to_length(sub_detail);
+ else // This has to be a style
+ border_details.border_style = border_style::get().find(sub_detail);
+ }
+ return border_details;
+}
+
+ss::underline_width_t odf::extract_underline_width(std::string_view value)
+{
+ // TODO: style:text-underline-width also allows:
+ // * percent value
+ // * positive integer
+ // * positive length
+ // As we encounter real-life examples of these values, we should add code to
+ // handle them here. For now, we only handle enumerated values.
+ return underline_width::get().find(value);
+}
+
+orcus::spreadsheet::underline_t odf::extract_underline_style(std::string_view value)
+{
+ return underline_style::get().find(value);
+}
+
+ss::hor_alignment_t odf::extract_hor_alignment_style(std::string_view value)
+{
+ return hor_align::get().find(value);
+}
+
+spreadsheet::ver_alignment_t odf::extract_ver_alignment_style(std::string_view value)
+{
+ return ver_align::get().find(value);
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/odf_helper.hpp b/src/liborcus/odf_helper.hpp
new file mode 100644
index 0000000..eb95692
--- /dev/null
+++ b/src/liborcus/odf_helper.hpp
@@ -0,0 +1,55 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_ODF_HELPER_HPP
+#define INCLUDED_ORCUS_ODF_HELPER_HPP
+
+#include <orcus/spreadsheet/types.hpp>
+#include <orcus/measurement.hpp>
+#include <orcus/spreadsheet/styles.hpp>
+
+#include <optional>
+
+namespace orcus { namespace odf {
+
+struct border_details_t
+{
+ spreadsheet::border_style_t border_style = spreadsheet::border_style_t::unknown;
+
+ spreadsheet::color_elem_t red = 0;
+ spreadsheet::color_elem_t green = 0;
+ spreadsheet::color_elem_t blue = 0;
+
+ length_t border_width;
+};
+
+bool convert_fo_color(
+ std::string_view value,
+ spreadsheet::color_elem_t& red,
+ spreadsheet::color_elem_t& green,
+ spreadsheet::color_elem_t& blue);
+
+std::optional<spreadsheet::color_rgb_t> convert_fo_color(std::string_view value);
+
+/**
+ * extracts border style, width and colors from a string value.
+ */
+border_details_t extract_border_details(std::string_view value);
+
+spreadsheet::underline_width_t extract_underline_width(std::string_view value);
+
+spreadsheet::underline_t extract_underline_style(std::string_view value);
+
+spreadsheet::hor_alignment_t extract_hor_alignment_style(std::string_view value);
+
+spreadsheet::ver_alignment_t extract_ver_alignment_style(std::string_view value);
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/odf_helper_test.cpp b/src/liborcus/odf_helper_test.cpp
new file mode 100644
index 0000000..803644c
--- /dev/null
+++ b/src/liborcus/odf_helper_test.cpp
@@ -0,0 +1,51 @@
+#include "odf_helper.hpp"
+
+#include <orcus/spreadsheet/types.hpp>
+
+#include <cassert>
+
+using namespace orcus::spreadsheet;
+
+namespace {
+
+void test_color_conversion(const char* input, bool valid,
+ color_elem_t red_expected, color_elem_t green_expected, color_elem_t blue_expected)
+{
+ color_elem_t red, green, blue;
+ bool valid_result = orcus::odf::convert_fo_color(input, red, green, blue);
+
+ assert(valid == valid_result);
+ if (valid)
+ {
+ assert(red_expected == red);
+ assert(green_expected == green);
+ assert(blue_expected == blue);
+ }
+}
+
+}
+
+int main()
+{
+ struct
+ {
+ const char* input;
+ bool valid;
+ orcus::spreadsheet::color_elem_t red;
+ orcus::spreadsheet::color_elem_t green;
+ orcus::spreadsheet::color_elem_t blue;
+ } data[] = {
+ { "not valid", false, 0, 0, 0},
+ { "#000000", true, 0, 0, 0},
+ { "#0000", false, 0, 0, 0},
+ { "#abcdef", true, 0xab, 0xcd, 0xef},
+ { "#ABCDEF", true, 0xab, 0xcd, 0xef},
+ { "#123456", true, 0x12, 0x34, 0x56}
+ };
+
+ for (size_t i = 0; i < sizeof(data)/sizeof(data[0]); ++i)
+ {
+ test_color_conversion(data[i].input, data[i].valid, data[i].red, data[i].green, data[i].blue);
+ }
+ return 0;
+}
diff --git a/src/liborcus/odf_namespace_types.cpp b/src/liborcus/odf_namespace_types.cpp
new file mode 100644
index 0000000..ae768db
--- /dev/null
+++ b/src/liborcus/odf_namespace_types.cpp
@@ -0,0 +1,12 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "odf_namespace_types.hpp"
+
+#include "odf_namespace_types_cpp.inl"
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/odf_namespace_types.hpp b/src/liborcus/odf_namespace_types.hpp
new file mode 100644
index 0000000..5dce680
--- /dev/null
+++ b/src/liborcus/odf_namespace_types.hpp
@@ -0,0 +1,16 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef __ORCUS_ODF_NAMESPACE_TYPES_HPP__
+#define __ORCUS_ODF_NAMESPACE_TYPES_HPP__
+
+#include "orcus/types.hpp"
+
+#include "odf_namespace_types_hpp.inl"
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/odf_namespace_types_cpp.inl b/src/liborcus/odf_namespace_types_cpp.inl
new file mode 100644
index 0000000..8b0dc1f
--- /dev/null
+++ b/src/liborcus/odf_namespace_types_cpp.inl
@@ -0,0 +1,63 @@
+namespace orcus {
+
+const xmlns_id_t NS_odf_anim = "urn:oasis:names:tc:opendocument:xmlns:animation:1.0";
+const xmlns_id_t NS_odf_chart = "urn:oasis:names:tc:opendocument:xmlns:chart:1.0";
+const xmlns_id_t NS_odf_config = "urn:oasis:names:tc:opendocument:xmlns:config:1.0";
+const xmlns_id_t NS_odf_db = "urn:oasis:names:tc:opendocument:xmlns:database:1.0";
+const xmlns_id_t NS_odf_dc = "http://purl.org/dc/elements/1.1/";
+const xmlns_id_t NS_odf_dr3d = "urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0";
+const xmlns_id_t NS_odf_draw = "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0";
+const xmlns_id_t NS_odf_fo = "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0";
+const xmlns_id_t NS_odf_form = "urn:oasis:names:tc:opendocument:xmlns:form:1.0";
+const xmlns_id_t NS_odf_grddl = "http://www.w3.org/2003/g/data-view#";
+const xmlns_id_t NS_odf_math = "http://www.w3.org/1998/Math/MathML";
+const xmlns_id_t NS_odf_meta = "urn:oasis:names:tc:opendocument:xmlns:meta:1.0";
+const xmlns_id_t NS_odf_number = "urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0";
+const xmlns_id_t NS_odf_office = "urn:oasis:names:tc:opendocument:xmlns:office:1.0";
+const xmlns_id_t NS_odf_presentation = "urn:oasis:names:tc:opendocument:xmlns:presentation:1.0";
+const xmlns_id_t NS_odf_script = "urn:oasis:names:tc:opendocument:xmlns:script:1.0";
+const xmlns_id_t NS_odf_smil = "urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0";
+const xmlns_id_t NS_odf_style = "urn:oasis:names:tc:opendocument:xmlns:style:1.0";
+const xmlns_id_t NS_odf_svg = "urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0";
+const xmlns_id_t NS_odf_table = "urn:oasis:names:tc:opendocument:xmlns:table:1.0";
+const xmlns_id_t NS_odf_text = "urn:oasis:names:tc:opendocument:xmlns:text:1.0";
+const xmlns_id_t NS_odf_xforms = "http://www.w3.org/2002/xforms";
+const xmlns_id_t NS_odf_xhtml = "http://www.w3.org/1999/xhtml";
+const xmlns_id_t NS_odf_xlink = "http://www.w3.org/1999/xlink";
+
+namespace {
+
+const xmlns_id_t odf_ns[] = {
+ NS_odf_anim,
+ NS_odf_chart,
+ NS_odf_config,
+ NS_odf_db,
+ NS_odf_dc,
+ NS_odf_dr3d,
+ NS_odf_draw,
+ NS_odf_fo,
+ NS_odf_form,
+ NS_odf_grddl,
+ NS_odf_math,
+ NS_odf_meta,
+ NS_odf_number,
+ NS_odf_office,
+ NS_odf_presentation,
+ NS_odf_script,
+ NS_odf_smil,
+ NS_odf_style,
+ NS_odf_svg,
+ NS_odf_table,
+ NS_odf_text,
+ NS_odf_xforms,
+ NS_odf_xhtml,
+ NS_odf_xlink,
+ nullptr
+};
+
+} // anonymous
+
+const xmlns_id_t* NS_odf_all = odf_ns;
+
+}
+
diff --git a/src/liborcus/odf_namespace_types_hpp.inl b/src/liborcus/odf_namespace_types_hpp.inl
new file mode 100644
index 0000000..a80c917
--- /dev/null
+++ b/src/liborcus/odf_namespace_types_hpp.inl
@@ -0,0 +1,31 @@
+namespace orcus {
+
+extern const xmlns_id_t NS_odf_anim;
+extern const xmlns_id_t NS_odf_chart;
+extern const xmlns_id_t NS_odf_config;
+extern const xmlns_id_t NS_odf_db;
+extern const xmlns_id_t NS_odf_dc;
+extern const xmlns_id_t NS_odf_dr3d;
+extern const xmlns_id_t NS_odf_draw;
+extern const xmlns_id_t NS_odf_fo;
+extern const xmlns_id_t NS_odf_form;
+extern const xmlns_id_t NS_odf_grddl;
+extern const xmlns_id_t NS_odf_math;
+extern const xmlns_id_t NS_odf_meta;
+extern const xmlns_id_t NS_odf_number;
+extern const xmlns_id_t NS_odf_office;
+extern const xmlns_id_t NS_odf_presentation;
+extern const xmlns_id_t NS_odf_script;
+extern const xmlns_id_t NS_odf_smil;
+extern const xmlns_id_t NS_odf_style;
+extern const xmlns_id_t NS_odf_svg;
+extern const xmlns_id_t NS_odf_table;
+extern const xmlns_id_t NS_odf_text;
+extern const xmlns_id_t NS_odf_xforms;
+extern const xmlns_id_t NS_odf_xhtml;
+extern const xmlns_id_t NS_odf_xlink;
+
+extern const xmlns_id_t* NS_odf_all;
+
+}
+
diff --git a/src/liborcus/odf_number_format_context.cpp b/src/liborcus/odf_number_format_context.cpp
new file mode 100644
index 0000000..d224a64
--- /dev/null
+++ b/src/liborcus/odf_number_format_context.cpp
@@ -0,0 +1,1126 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "odf_number_format_context.hpp"
+#include "odf_namespace_types.hpp"
+#include "odf_token_constants.hpp"
+#include "odf_helper.hpp"
+#include "ods_session_data.hpp"
+#include "impl_utils.hpp"
+
+#include <orcus/measurement.hpp>
+#include <orcus/spreadsheet/import_interface.hpp>
+#include <orcus/spreadsheet/import_interface_styles.hpp>
+#include <orcus/spreadsheet/styles.hpp>
+
+#include <iostream>
+#include <algorithm>
+#include <string>
+
+namespace ss = orcus::spreadsheet;
+
+namespace orcus {
+
+namespace {
+
+enum class date_style_type
+{
+ unknown = 0,
+ short_symbol,
+ long_symbol
+};
+
+date_style_type to_date_style(std::string_view s)
+{
+ constexpr std::pair<std::string_view, date_style_type> entries[] = {
+ { "short", date_style_type::short_symbol },
+ { "long", date_style_type::long_symbol },
+ };
+
+ for (const auto& entry : entries)
+ {
+ if (s == entry.first)
+ return entry.second;
+ }
+
+ return date_style_type::unknown;
+}
+
+struct parse_result
+{
+ bool success = true;
+ std::string error_message;
+};
+
+date_style_type parse_attrs_for_date_style(const std::vector<xml_token_attr_t>& attrs)
+{
+ for (const auto& attr : attrs)
+ {
+ if (attr.ns == NS_odf_number)
+ {
+ switch (attr.name)
+ {
+ case XML_style:
+ return to_date_style(attr.value);
+ }
+ }
+ }
+
+ return date_style_type::unknown;
+}
+
+void parse_element_time_short_long(const std::vector<xml_token_attr_t>& attrs, char c, odf_number_format& style)
+{
+ style.code += c;
+
+ if (parse_attrs_for_date_style(attrs) == date_style_type::long_symbol)
+ style.code += c;
+}
+
+void parse_element_number(const std::vector<xml_token_attr_t>& attrs, odf_number_format& style)
+{
+ bool grouping = false;
+ long decimal_places = 0;
+ long min_integer_digits = 0;
+
+ for (const auto& attr : attrs)
+ {
+ if (attr.ns == NS_odf_number)
+ {
+ switch (attr.name)
+ {
+ case XML_decimal_places:
+ {
+ decimal_places = to_long(attr.value);
+ break;
+ }
+ case XML_grouping:
+ grouping = to_bool(attr.value);
+ break;
+ case XML_min_integer_digits:
+ min_integer_digits = to_long(attr.value);
+ break;
+ default:;
+ }
+ }
+ }
+
+ if (grouping)
+ {
+ if (min_integer_digits < 4)
+ {
+ style.code += "#,";
+
+ for (long i = 0; i < 3 - min_integer_digits; ++i)
+ style.code += "#";
+
+ for (long i = 0; i < min_integer_digits; ++i)
+ style.code += "0";
+ }
+ else
+ {
+ std::string temporary_code;
+
+ for (long i = 0; i < min_integer_digits; ++i)
+ {
+ if (i % 3 == 0 && i != 0)
+ temporary_code += ",";
+
+ temporary_code += "0";
+ }
+
+ std::reverse(temporary_code.begin(), temporary_code.end());
+ style.code += temporary_code;
+ }
+ }
+ else
+ {
+ if (min_integer_digits == 0)
+ style.code += "#";
+
+ for (long i = 0; i < min_integer_digits; ++i)
+ style.code += "0";
+ }
+
+ if (decimal_places > 0)
+ {
+ style.code += ".";
+ for (long i = 0; i < decimal_places; ++i)
+ style.code += "0";
+ }
+}
+
+void parse_element_text_properties(const std::vector<xml_token_attr_t>& attrs, odf_number_format& style)
+{
+ std::string_view color;
+
+ for (const auto& attr : attrs)
+ {
+ if (attr.ns == NS_odf_fo)
+ {
+ switch (attr.name)
+ {
+ case XML_color:
+ {
+ if (attr.value == "#000000")
+ color = "BLACK";
+ if (attr.value == "#ff0000")
+ color = "RED";
+ if (attr.value == "#00ff00")
+ color = "GREEN";
+ if (attr.value == "#0000ff")
+ color = "BLUE";
+ if (attr.value == "#ffff00")
+ color = "YELLOW";
+ if (attr.value == "#00ffff")
+ color = "CYAN";
+ if (attr.value == "#ff00ff")
+ color = "MAGENTA";
+ if (attr.value == "#ffffff")
+ color = "WHITE";
+ }
+ }
+ }
+ }
+
+ if (!color.empty())
+ {
+ std::ostringstream os;
+ os << '[' << color << ']';
+ style.code += os.str();
+ }
+}
+
+parse_result parse_element_map(session_context& cxt, const std::vector<xml_token_attr_t>& attrs, odf_number_format& style)
+{
+ parse_result res;
+
+ std::string_view comp; // comparison operator e.g. <, >, >=, ...
+ std::string_view value; // right-hand value
+ std::string_view style_name; // style name associated with the mapped rule
+
+ for (const auto& attr : attrs)
+ {
+ if (attr.ns == NS_odf_style)
+ {
+ switch (attr.name)
+ {
+ case XML_apply_style_name:
+ {
+ style_name = attr.value;
+ break;
+ }
+ case XML_condition:
+ {
+ // value()[comp][rvalue] e.g. 'value()>=0'
+ constexpr std::string_view prefix = "value()";
+
+ // check if the attribute value starts with 'value()'
+ if (attr.value.compare(0, prefix.size(), prefix) == 0)
+ {
+ auto pos_value = attr.value.find_first_not_of("<>=", prefix.size());
+
+ comp = attr.value.substr(prefix.size(), pos_value - prefix.size());
+ value = attr.value.substr(pos_value);
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ if (comp.empty() || value.empty() || style_name.empty())
+ {
+ res.success = false;
+ return res;
+ }
+
+ // fetch the code associated with the mapped rule
+ auto& numfmts = cxt.get_data<ods_session_data>().number_formats;
+ std::string_view code = numfmts.get_code(style_name);
+
+ if (code.empty())
+ {
+ res.success = false;
+ std::ostringstream os;
+ os << "code stored for the number format style named '" << style_name << "' exists, but is empty.";
+ res.error_message = os.str();
+ return res;
+ }
+
+ // prepend the mapped rule to the current code
+ std::ostringstream os;
+ os << '[' << comp << value << ']' << code << ';' << style.code;
+ style.code = os.str();
+
+ return res;
+}
+
+} // anonymous namespace
+
+date_style_context::date_style_context(session_context& session_cxt, const tokens& tk) :
+ xml_context_base(session_cxt, tk)
+{
+ static const xml_element_validator::rule rules[] = {
+ // parent element -> child element
+ { XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN, NS_odf_number, XML_date_style }, // root element
+ { NS_odf_number, XML_date_style, NS_odf_number, XML_day },
+ { NS_odf_number, XML_date_style, NS_odf_number, XML_month },
+ { NS_odf_number, XML_date_style, NS_odf_number, XML_text },
+ { NS_odf_number, XML_date_style, NS_odf_number, XML_year },
+ };
+
+ init_element_validator(rules, std::size(rules));
+}
+
+void date_style_context::start_element(xmlns_id_t ns, xml_token_t name, const std::vector<xml_token_attr_t>& attrs)
+{
+ push_stack(ns, name);
+
+ if (ns == NS_odf_number)
+ {
+ switch (name)
+ {
+ case XML_date_style:
+ start_element_date_style(attrs);
+ break;
+ case XML_month:
+ start_element_month(attrs);
+ break;
+ case XML_day:
+ start_element_day(attrs);
+ break;
+ case XML_year:
+ start_element_year(attrs);
+ break;
+ case XML_text:
+ m_text_stream = std::ostringstream{};
+ break;
+ default:
+ warn_unhandled();
+ }
+ }
+ else
+ warn_unhandled();
+}
+
+bool date_style_context::end_element(xmlns_id_t ns, xml_token_t name)
+{
+ if (ns == NS_odf_number)
+ {
+ switch (name)
+ {
+ case XML_text:
+ m_current_style->code += m_text_stream.str();
+ break;
+ }
+ }
+ return pop_stack(ns, name);
+}
+
+void date_style_context::characters(std::string_view str, bool /*transient*/)
+{
+ m_text_stream << str;
+}
+
+void date_style_context::reset()
+{
+ m_current_style = std::make_unique<odf_number_format>();
+}
+
+std::unique_ptr<odf_number_format> date_style_context::pop_style()
+{
+ return std::move(m_current_style);
+}
+
+void date_style_context::start_element_date_style(const std::vector<xml_token_attr_t>& attrs)
+{
+ for (const auto& attr : attrs)
+ {
+ if (attr.ns == NS_odf_style)
+ {
+ switch (attr.name)
+ {
+ case XML_name:
+ m_current_style->name = intern(attr);
+ break;
+ }
+ }
+ }
+}
+
+void date_style_context::start_element_month(const std::vector<xml_token_attr_t>& attrs)
+{
+ auto style = date_style_type::unknown;
+ bool textual = false;
+
+ for (const auto& attr : attrs)
+ {
+ if (attr.ns == NS_odf_number)
+ {
+ switch (attr.name)
+ {
+ case XML_style:
+ style = to_date_style(attr.value);
+ break;
+ case XML_textual:
+ textual = to_bool(attr.value);
+ break;
+ }
+ }
+ }
+
+ m_current_style->code += 'M';
+
+ if (style == date_style_type::long_symbol)
+ m_current_style->code += 'M';
+
+ if (textual)
+ m_current_style->code += 'M';
+
+ if (style == date_style_type::long_symbol && textual)
+ m_current_style->code += 'M';
+}
+
+void date_style_context::start_element_day(const std::vector<xml_token_attr_t>& attrs)
+{
+ m_current_style->code += 'D';
+
+ if (parse_attrs_for_date_style(attrs) == date_style_type::long_symbol)
+ m_current_style->code += 'D';
+}
+
+void date_style_context::start_element_year(const std::vector<xml_token_attr_t>& attrs)
+{
+ m_current_style->code += "YY";
+
+ if (parse_attrs_for_date_style(attrs) == date_style_type::long_symbol)
+ m_current_style->code += "YY";
+}
+
+time_style_context::time_style_context(session_context& session_cxt, const tokens& tk) :
+ xml_context_base(session_cxt, tk)
+{
+ static const xml_element_validator::rule rules[] = {
+ // parent element -> child element
+ { XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN, NS_odf_number, XML_time_style }, // root element
+ { NS_odf_number, XML_time_style, NS_odf_number, XML_hours },
+ { NS_odf_number, XML_time_style, NS_odf_number, XML_minutes },
+ { NS_odf_number, XML_time_style, NS_odf_number, XML_seconds },
+ { NS_odf_number, XML_time_style, NS_odf_number, XML_text },
+ { NS_odf_number, XML_time_style, NS_odf_number, XML_am_pm },
+ };
+
+ init_element_validator(rules, std::size(rules));
+}
+
+void time_style_context::start_element(xmlns_id_t ns, xml_token_t name, const std::vector<xml_token_attr_t>& attrs)
+{
+ push_stack(ns, name);
+
+ if (ns == NS_odf_number)
+ {
+ switch (name)
+ {
+ case XML_time_style:
+ start_element_time_style(attrs);
+ break;
+ case XML_hours:
+ parse_element_time_short_long(attrs, 'H', *m_current_style);
+ break;
+ case XML_minutes:
+ parse_element_time_short_long(attrs, 'M', *m_current_style);
+ break;
+ case XML_seconds:
+ start_element_seconds(attrs);
+ break;
+ case XML_text:
+ m_text_stream = std::ostringstream{};
+ break;
+ case XML_am_pm:
+ m_current_style->code += "AM/PM";
+ break;
+ default:
+ warn_unhandled();
+ }
+ }
+ else
+ warn_unhandled();
+}
+
+bool time_style_context::end_element(xmlns_id_t ns, xml_token_t name)
+{
+ if (ns == NS_odf_number)
+ {
+ switch (name)
+ {
+ case XML_text:
+ m_current_style->code += m_text_stream.str();
+ break;
+ }
+ }
+
+ return pop_stack(ns, name);
+}
+
+void time_style_context::characters(std::string_view str, bool /*transient*/)
+{
+ m_text_stream << str;
+}
+
+void time_style_context::reset()
+{
+ m_current_style = std::make_unique<odf_number_format>();
+}
+
+std::unique_ptr<odf_number_format> time_style_context::pop_style()
+{
+ return std::move(m_current_style);
+}
+
+void time_style_context::start_element_time_style(const std::vector<xml_token_attr_t>& attrs)
+{
+ for (const auto& attr : attrs)
+ {
+ if (attr.ns == NS_odf_style && attr.name == XML_name)
+ m_current_style->name = intern(attr);
+ }
+}
+
+void time_style_context::start_element_seconds(const std::vector<xml_token_attr_t>& attrs)
+{
+ auto style = date_style_type::unknown;
+ std::optional<std::size_t> decimal_places;
+
+ for (const auto& attr : attrs)
+ {
+ if (attr.ns == NS_odf_number)
+ {
+ switch (attr.name)
+ {
+ case XML_style:
+ style = to_date_style(attr.value);
+ break;
+ case XML_decimal_places:
+ decimal_places = to_long(attr.value);
+ break;
+ }
+ }
+ }
+
+ m_current_style->code += 'S';
+
+ if (style == date_style_type::long_symbol)
+ m_current_style->code += 'S';
+
+ if (decimal_places && *decimal_places > 0)
+ m_current_style->code += std::string{"S", *decimal_places};
+}
+
+percentage_style_context::percentage_style_context(session_context& session_cxt, const tokens& tk) :
+ xml_context_base(session_cxt, tk)
+{
+ static const xml_element_validator::rule rules[] = {
+ // parent element -> child element
+ { XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN, NS_odf_number, XML_percentage_style }, // root element
+ { NS_odf_number, XML_percentage_style, NS_odf_number, XML_number },
+ { NS_odf_number, XML_percentage_style, NS_odf_number, XML_text },
+ };
+
+ init_element_validator(rules, std::size(rules));
+}
+
+void percentage_style_context::start_element(xmlns_id_t ns, xml_token_t name, const std::vector<xml_token_attr_t>& attrs)
+{
+ push_stack(ns, name);
+
+ if (ns == NS_odf_number)
+ {
+ switch (name)
+ {
+ case XML_percentage_style:
+ {
+ for (const auto& attr : attrs)
+ {
+ if (attr.ns == NS_odf_style && attr.name == XML_name)
+ m_current_style->name = intern(attr);
+ }
+ break;
+ }
+ case XML_number:
+ {
+ parse_element_number(attrs, *m_current_style);
+ break;
+ }
+ case XML_text:
+ m_text_stream = std::ostringstream{};
+ break;
+ default:
+ warn_unhandled();
+ }
+ }
+ else
+ warn_unhandled();
+}
+
+bool percentage_style_context::end_element(xmlns_id_t ns, xml_token_t name)
+{
+ if (ns == NS_odf_number)
+ {
+ switch (name)
+ {
+ case XML_text:
+ m_current_style->code += m_text_stream.str();
+ break;
+ }
+ }
+ return pop_stack(ns, name);
+}
+
+void percentage_style_context::characters(std::string_view str, bool /*transient*/)
+{
+ m_text_stream << str;
+}
+
+void percentage_style_context::reset()
+{
+ m_current_style = std::make_unique<odf_number_format>();
+}
+
+std::unique_ptr<odf_number_format> percentage_style_context::pop_style()
+{
+ return std::move(m_current_style);
+}
+
+boolean_style_context::boolean_style_context(session_context& session_cxt, const tokens& tk) :
+ xml_context_base(session_cxt, tk)
+{
+ static const xml_element_validator::rule rules[] = {
+ // parent element -> child element
+ { XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN, NS_odf_number, XML_boolean_style }, // root element
+ { NS_odf_number, XML_boolean_style, NS_odf_number, XML_boolean },
+ };
+
+ init_element_validator(rules, std::size(rules));
+}
+
+void boolean_style_context::start_element(xmlns_id_t ns, xml_token_t name, const std::vector<xml_token_attr_t>& attrs)
+{
+ push_stack(ns, name);
+
+ if (ns == NS_odf_number)
+ {
+ switch (name)
+ {
+ case XML_boolean_style:
+ {
+ for (const auto& attr : attrs)
+ {
+ if (attr.ns == NS_odf_style && attr.name == XML_name)
+ m_current_style->name = intern(attr);
+ }
+ break;
+ }
+ case XML_boolean:
+ {
+ m_current_style->code += "BOOLEAN";
+ break;
+ }
+ default:
+ warn_unhandled();
+ }
+ }
+ else
+ warn_unhandled();
+}
+
+bool boolean_style_context::end_element(xmlns_id_t ns, xml_token_t name)
+{
+ return pop_stack(ns, name);
+}
+
+void boolean_style_context::reset()
+{
+ m_current_style = std::make_unique<odf_number_format>();
+}
+
+std::unique_ptr<odf_number_format> boolean_style_context::pop_style()
+{
+ return std::move(m_current_style);
+}
+
+text_style_context::text_style_context(session_context& session_cxt, const tokens& tk) :
+ xml_context_base(session_cxt, tk)
+{
+ static const xml_element_validator::rule rules[] = {
+ // parent element -> child element
+ { XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN, NS_odf_number, XML_text_style }, // root element
+ { NS_odf_number, XML_text_style, NS_odf_number, XML_text },
+ { NS_odf_number, XML_text_style, NS_odf_number, XML_text_content },
+ };
+
+ init_element_validator(rules, std::size(rules));
+}
+
+void text_style_context::start_element(xmlns_id_t ns, xml_token_t name, const std::vector<xml_token_attr_t>& attrs)
+{
+ push_stack(ns, name);
+
+ if (ns == NS_odf_number)
+ {
+ switch (name)
+ {
+ case XML_text_style:
+ {
+ for (const auto& attr : attrs)
+ {
+ if (attr.ns == NS_odf_style && attr.name == XML_name)
+ m_current_style->name = intern(attr);
+ }
+ break;
+ }
+ case XML_text_content:
+ {
+ m_current_style->code += '@';
+ break;
+ }
+ case XML_text:
+ m_text_stream = std::ostringstream{};
+ break;
+ default:
+ warn_unhandled();
+ }
+ }
+ else
+ warn_unhandled();
+}
+
+bool text_style_context::end_element(xmlns_id_t ns, xml_token_t name)
+{
+ if (ns == NS_odf_number)
+ {
+ switch (name)
+ {
+ case XML_text:
+ m_current_style->code += m_text_stream.str();
+ break;
+ }
+ }
+ return pop_stack(ns, name);
+}
+
+void text_style_context::characters(std::string_view str, bool /*transient*/)
+{
+ m_text_stream << str;
+}
+
+void text_style_context::reset()
+{
+ m_current_style = std::make_unique<odf_number_format>();
+}
+
+std::unique_ptr<odf_number_format> text_style_context::pop_style()
+{
+ return std::move(m_current_style);
+}
+
+number_style_context::number_style_context(session_context& session_cxt, const tokens& tk) :
+ xml_context_base(session_cxt, tk)
+{
+ static const xml_element_validator::rule rules[] = {
+ // parent element -> child element
+ { XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN, NS_odf_number, XML_number_style }, // root element
+ { NS_odf_number, XML_number_style, NS_odf_number, XML_fraction },
+ { NS_odf_number, XML_number_style, NS_odf_number, XML_number },
+ { NS_odf_number, XML_number_style, NS_odf_number, XML_scientific_number },
+ { NS_odf_number, XML_number_style, NS_odf_number, XML_text },
+ { NS_odf_number, XML_number_style, NS_odf_style, XML_map },
+ { NS_odf_number, XML_number_style, NS_odf_style, XML_text_properties },
+ };
+
+ init_element_validator(rules, std::size(rules));
+}
+
+void number_style_context::start_element(xmlns_id_t ns, xml_token_t name, const std::vector<xml_token_attr_t>& attrs)
+{
+ push_stack(ns, name);
+
+ if (ns == NS_odf_number)
+ {
+ switch (name)
+ {
+ case XML_fraction:
+ start_element_fraction(attrs);
+ break;
+ case XML_number_style:
+ start_element_number_style(attrs);
+ break;
+ case XML_number:
+ parse_element_number(attrs, *m_current_style);
+ break;
+ case XML_scientific_number:
+ start_element_scientific_number(attrs);
+ break;
+ case XML_text:
+ m_text_stream = std::ostringstream{};
+ break;
+ default:
+ warn_unhandled();
+ }
+ }
+ else if (ns == NS_odf_style)
+ {
+ switch (name)
+ {
+ case XML_text_properties:
+ parse_element_text_properties(attrs, *m_current_style);
+ break;
+ case XML_map:
+ {
+ auto res = parse_element_map(get_session_context(), attrs, *m_current_style);
+ if (!res.success && get_config().debug)
+ warn(res.error_message);
+
+ break;
+ }
+ default:
+ warn_unhandled();
+ }
+ }
+ else
+ warn_unhandled();
+}
+
+bool number_style_context::end_element(xmlns_id_t ns, xml_token_t name)
+{
+ if (ns == NS_odf_number)
+ {
+ switch (name)
+ {
+ case XML_text:
+ m_current_style->code += m_text_stream.str();
+ break;
+ default:;
+ }
+ }
+
+ return pop_stack(ns, name);
+}
+
+void number_style_context::characters(std::string_view str, bool /*transient*/)
+{
+ m_text_stream << str;
+}
+
+void number_style_context::reset()
+{
+ m_current_style = std::make_unique<odf_number_format>();
+ m_text_stream = std::ostringstream{};
+ m_country_code = std::string_view{};
+ m_language = std::string_view{};
+}
+
+std::unique_ptr<odf_number_format> number_style_context::pop_style()
+{
+ return std::move(m_current_style);
+}
+
+void number_style_context::start_element_fraction(const std::vector<xml_token_attr_t>& attrs)
+{
+ std::size_t min_integer_digits = 0;
+ std::size_t min_numerator_digits = 0;
+ std::size_t min_denominator_digits = 0;
+
+ std::optional<std::string_view> denominator_value;
+
+ for (const auto& attr : attrs)
+ {
+ if (attr.ns == NS_odf_number)
+ {
+ switch (attr.name)
+ {
+ case XML_min_integer_digits:
+ min_integer_digits = to_long(attr.value);
+ break;
+ case XML_min_numerator_digits:
+ min_numerator_digits = to_long(attr.value);
+ break;
+ case XML_min_denominator_digits:
+ min_denominator_digits = to_long(attr.value);
+ break;
+ case XML_denominator_value:
+ {
+ denominator_value = attr.value;
+ break;
+ }
+ }
+ }
+ }
+
+ if (min_integer_digits > 0)
+ {
+ m_current_style->code += std::string{"#", min_integer_digits};
+ m_current_style->code += ' ';
+ }
+
+ if (min_numerator_digits > 0)
+ m_current_style->code += std::string{"?", min_numerator_digits};
+
+ m_current_style->code += '/';
+
+ if (denominator_value)
+ m_current_style->code += *denominator_value;
+ else if (min_denominator_digits > 0)
+ m_current_style->code += std::string{"?", min_denominator_digits};
+}
+
+void number_style_context::start_element_number_style(const std::vector<xml_token_attr_t>& attrs)
+{
+ for (const xml_token_attr_t& attr: attrs)
+ {
+ if (attr.ns == NS_odf_number)
+ {
+ switch (attr.name)
+ {
+ case XML_country:
+ m_country_code = attr.value;
+ break;
+ case XML_language:
+ m_language = attr.value;
+ break;
+ default:
+ ;
+ }
+ }
+ else if (attr.ns == NS_odf_style)
+ {
+ switch (attr.name)
+ {
+ case XML_name:
+ m_current_style->name = attr.value;
+ break;
+ default:
+ ;
+ }
+ }
+ }
+}
+
+void number_style_context::start_element_scientific_number(const std::vector<xml_token_attr_t>& attrs)
+{
+ long decimal_places = 0;
+ long min_exponent_digits = 0;
+ long min_integer_digits = 0;
+ bool grouping = false;
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.ns == NS_odf_number)
+ {
+ switch (attr.name)
+ {
+ case XML_decimal_places:
+ decimal_places = to_long(attr.value);
+ break;
+ case XML_grouping:
+ grouping = to_bool(attr.value);
+ break;
+ case XML_min_exponent_digits:
+ min_exponent_digits = to_long(attr.value);
+ break;
+ case XML_min_integer_digits:
+ min_integer_digits = to_long(attr.value);
+ break;
+ }
+ }
+ }
+
+ if (grouping)
+ {
+ if (min_integer_digits < 4)
+ {
+ m_current_style->code += "#,";
+
+ for (long i = 0; i < 3 - min_integer_digits; ++i)
+ {
+ m_current_style->code += "#";
+ }
+
+ for (long i = 0; i < min_integer_digits; ++i)
+ {
+ m_current_style->code += "0";
+ }
+ }
+ else
+ {
+ std::string temporary_code;
+ for (long i = 0; i < min_integer_digits; ++i)
+ {
+ if (i % 3 == 0 && i != 0)
+ temporary_code += ",";
+
+ temporary_code += "0";
+ }
+
+ std::reverse(temporary_code.begin(), temporary_code.end());
+ m_current_style->code += temporary_code;
+ }
+ }
+ else
+ {
+ if (min_integer_digits == 0)
+ m_current_style->code += "#";
+
+ for (long i = 0; i < min_integer_digits; ++i)
+ m_current_style->code += "0";
+ }
+
+ m_current_style->code += ".";
+
+ for (long i = 0; i < decimal_places; ++i)
+ m_current_style->code += "0";
+
+ m_current_style->code += "E+";
+
+ for (long i = 0; i < min_exponent_digits; ++i)
+ m_current_style->code += "0";
+}
+
+currency_style_context::currency_style_context(session_context& session_cxt, const tokens& tk) :
+ xml_context_base(session_cxt, tk)
+{
+ static const xml_element_validator::rule rules[] = {
+ // parent element -> child element
+ { XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN, NS_odf_number, XML_currency_style }, // root element
+ { NS_odf_number, XML_currency_style, NS_odf_number, XML_currency_symbol },
+ { NS_odf_number, XML_currency_style, NS_odf_number, XML_number },
+ { NS_odf_number, XML_currency_style, NS_odf_number, XML_text },
+ { NS_odf_number, XML_currency_style, NS_odf_style, XML_map },
+ { NS_odf_number, XML_currency_style, NS_odf_style, XML_text_properties },
+ };
+
+ init_element_validator(rules, std::size(rules));
+}
+
+void currency_style_context::start_element(xmlns_id_t ns, xml_token_t name, const std::vector<xml_token_attr_t>& attrs)
+{
+ push_stack(ns, name);
+
+ if (ns == NS_odf_number)
+ {
+ switch (name)
+ {
+ case XML_currency_style:
+ start_element_currency_style(attrs);
+ break;
+ case XML_currency_symbol:
+ m_text_stream = std::ostringstream{};
+ break;
+ case XML_number:
+ parse_element_number(attrs, *m_current_style);
+ break;
+ case XML_text:
+ m_text_stream = std::ostringstream{};
+ break;
+ default:
+ warn_unhandled();
+ }
+ }
+ else if (ns == NS_odf_style)
+ {
+ switch (name)
+ {
+ case XML_map:
+ {
+ auto res = parse_element_map(get_session_context(), attrs, *m_current_style);
+ if (!res.success && get_config().debug)
+ warn(res.error_message);
+
+ break;
+ }
+ case XML_text_properties:
+ parse_element_text_properties(attrs, *m_current_style);
+ break;
+ default:
+ warn_unhandled();
+ }
+ }
+ else
+ warn_unhandled();
+}
+
+bool currency_style_context::end_element(xmlns_id_t ns, xml_token_t name)
+{
+ if (ns == NS_odf_number)
+ {
+ switch (name)
+ {
+ case XML_currency_symbol:
+ {
+ std::ostringstream os;
+ os << m_current_style->code << "[$" << m_text_stream.str() << ']';
+ m_current_style->code = os.str();
+ break;
+ }
+ case XML_text:
+ m_current_style->code += m_text_stream.str();
+ break;
+ }
+ }
+
+ return pop_stack(ns, name);
+}
+
+void currency_style_context::characters(std::string_view str, bool /*transient*/)
+{
+ m_text_stream << str;
+}
+
+void currency_style_context::reset()
+{
+ m_current_style = std::make_unique<odf_number_format>();
+}
+
+std::unique_ptr<odf_number_format> currency_style_context::pop_style()
+{
+ return std::move(m_current_style);
+}
+
+void currency_style_context::start_element_currency_style(const std::vector<xml_token_attr_t>& attrs)
+{
+ for (const auto& attr : attrs)
+ {
+ if (attr.ns == NS_odf_style)
+ {
+ switch (attr.name)
+ {
+ case XML_name:
+ m_current_style->name = intern(attr);
+ break;
+ case XML_volatile:
+ m_current_style->is_volatile = to_bool(attr.value);
+ break;
+ }
+ }
+ else if (attr.ns == NS_odf_number)
+ {
+ switch (attr.name)
+ {
+ case XML_language:
+ m_language = intern(attr);
+ break;
+ case XML_country:
+ m_country_code = intern(attr);
+ break;
+ }
+ }
+ }
+}
+
+} // namespace orcus
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/odf_number_format_context.hpp b/src/liborcus/odf_number_format_context.hpp
new file mode 100644
index 0000000..c91c817
--- /dev/null
+++ b/src/liborcus/odf_number_format_context.hpp
@@ -0,0 +1,180 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef ODF_NUMBER_FORMATTING_CONTEXT_HPP
+#define ODF_NUMBER_FORMATTING_CONTEXT_HPP
+
+#include "xml_context_base.hpp"
+#include "odf_styles.hpp"
+
+#include "orcus/string_pool.hpp"
+
+namespace orcus {
+
+namespace spreadsheet { namespace iface {
+ class import_styles;
+}}
+
+class date_style_context : public xml_context_base
+{
+public:
+ date_style_context(session_context& session_cxt, const tokens& tk);
+
+ void start_element(xmlns_id_t ns, xml_token_t name, const std::vector<xml_token_attr_t>& attrs) override;
+ bool end_element(xmlns_id_t ns, xml_token_t name) override;
+ void characters(std::string_view str, bool transient) override;
+
+ void reset();
+
+ std::unique_ptr<odf_number_format> pop_style();
+
+private:
+ void start_element_date_style(const std::vector<xml_token_attr_t>& attrs);
+ void start_element_month(const std::vector<xml_token_attr_t>& attrs);
+ void start_element_day(const std::vector<xml_token_attr_t>& attrs);
+ void start_element_year(const std::vector<xml_token_attr_t>& attrs);
+
+private:
+ std::unique_ptr<odf_number_format> m_current_style;
+ std::ostringstream m_text_stream;
+};
+
+class time_style_context : public xml_context_base
+{
+public:
+ time_style_context(session_context& session_cxt, const tokens& tk);
+
+ void start_element(xmlns_id_t ns, xml_token_t name, const std::vector<xml_token_attr_t>& attrs) override;
+ bool end_element(xmlns_id_t ns, xml_token_t name) override;
+ void characters(std::string_view str, bool transient) override;
+
+ void reset();
+
+ std::unique_ptr<odf_number_format> pop_style();
+
+private:
+ void start_element_time_style(const std::vector<xml_token_attr_t>& attrs);
+ void start_element_seconds(const std::vector<xml_token_attr_t>& attrs);
+
+private:
+ std::unique_ptr<odf_number_format> m_current_style;
+ std::ostringstream m_text_stream;
+};
+
+class percentage_style_context : public xml_context_base
+{
+public:
+ percentage_style_context(session_context& session_cxt, const tokens& tk);
+
+ void start_element(xmlns_id_t ns, xml_token_t name, const std::vector<xml_token_attr_t>& attrs) override;
+ bool end_element(xmlns_id_t ns, xml_token_t name) override;
+ void characters(std::string_view str, bool transient) override;
+
+ void reset();
+
+ std::unique_ptr<odf_number_format> pop_style();
+
+private:
+ std::unique_ptr<odf_number_format> m_current_style;
+ std::ostringstream m_text_stream;
+};
+
+class boolean_style_context : public xml_context_base
+{
+public:
+ boolean_style_context(session_context& session_cxt, const tokens& tk);
+
+ void start_element(xmlns_id_t ns, xml_token_t name, const std::vector<xml_token_attr_t>& attrs) override;
+ bool end_element(xmlns_id_t ns, xml_token_t name) override;
+
+ void reset();
+
+ std::unique_ptr<odf_number_format> pop_style();
+
+private:
+ std::unique_ptr<odf_number_format> m_current_style;
+};
+
+class text_style_context : public xml_context_base
+{
+public:
+ text_style_context(session_context& session_cxt, const tokens& tk);
+
+ void start_element(xmlns_id_t ns, xml_token_t name, const std::vector<xml_token_attr_t>& attrs) override;
+ bool end_element(xmlns_id_t ns, xml_token_t name) override;
+ void characters(std::string_view str, bool transient) override;
+
+ void reset();
+
+ std::unique_ptr<odf_number_format> pop_style();
+
+private:
+ std::unique_ptr<odf_number_format> m_current_style;
+ std::ostringstream m_text_stream;
+};
+
+/**
+ * Context for <number:number-style> scope.
+ */
+class number_style_context : public xml_context_base
+{
+public:
+ number_style_context(session_context& session_cxt, const tokens& tk);
+
+ void start_element(xmlns_id_t ns, xml_token_t name, const std::vector<xml_token_attr_t>& attrs) override;
+ bool end_element(xmlns_id_t ns, xml_token_t name) override;
+ void characters(std::string_view str, bool transient) override;
+
+ void reset();
+
+ std::unique_ptr<odf_number_format> pop_style();
+
+private:
+ void start_element_fraction(const std::vector<xml_token_attr_t>& attrs);
+ void start_element_number_style(const std::vector<xml_token_attr_t>& attrs);
+ void start_element_scientific_number(const std::vector<xml_token_attr_t>& attrs);
+
+private:
+ std::unique_ptr<odf_number_format> m_current_style;
+ std::ostringstream m_text_stream;
+
+ std::string_view m_country_code; // TODO: handle this
+ std::string_view m_language; // TODO: handle this
+};
+
+/**
+ * Context for <number:currency-style> element scope.
+ */
+class currency_style_context : public xml_context_base
+{
+public:
+ currency_style_context(session_context& session_cxt, const tokens& tk);
+
+ void start_element(xmlns_id_t ns, xml_token_t name, const std::vector<xml_token_attr_t>& attrs) override;
+ bool end_element(xmlns_id_t ns, xml_token_t name) override;
+ void characters(std::string_view str, bool transient) override;
+
+ void reset();
+
+ std::unique_ptr<odf_number_format> pop_style();
+
+private:
+ void start_element_currency_style(const std::vector<xml_token_attr_t>& attrs);
+
+private:
+ std::unique_ptr<odf_number_format> m_current_style;
+ std::ostringstream m_text_stream;
+
+ std::string_view m_country_code; // TODO: handle this
+ std::string_view m_language; // TODO: handle this
+};
+
+} // namespace orcus
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/odf_para_context.cpp b/src/liborcus/odf_para_context.cpp
new file mode 100644
index 0000000..ad4b193
--- /dev/null
+++ b/src/liborcus/odf_para_context.cpp
@@ -0,0 +1,165 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "odf_para_context.hpp"
+#include "odf_token_constants.hpp"
+#include "odf_namespace_types.hpp"
+#include "xml_context_global.hpp"
+
+#include "orcus/spreadsheet/import_interface.hpp"
+#include "orcus/exception.hpp"
+
+#include <iostream>
+#include <cassert>
+
+namespace orcus {
+
+text_para_context::text_para_context(
+ session_context& session_cxt, const tokens& tokens,
+ spreadsheet::iface::import_shared_strings* ssb, odf_styles_map_type& styles) :
+ xml_context_base(session_cxt, tokens),
+ mp_sstrings(ssb), m_styles(styles),
+ m_string_index(0), m_has_content(false)
+{
+}
+
+text_para_context::~text_para_context() = default;
+
+xml_context_base* text_para_context::create_child_context(xmlns_id_t /*ns*/, xml_token_t /*name*/)
+{
+ return nullptr;
+}
+
+void text_para_context::end_child_context(xmlns_id_t /*ns*/, xml_token_t /*name*/, xml_context_base* /*child*/)
+{
+ // not implemented yet.
+}
+
+void text_para_context::start_element(xmlns_id_t ns, xml_token_t name, const xml_token_attrs_t& attrs)
+{
+ xml_token_pair_t parent = push_stack(ns, name);
+ if (ns == NS_odf_text)
+ {
+ switch (name)
+ {
+ case XML_p:
+ // paragraph
+ xml_element_expected(parent, XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN);
+ break;
+ case XML_span:
+ {
+ // text span.
+ xml_element_expected(parent, NS_odf_text, XML_p);
+ flush_segment();
+ std::string_view style_name =
+ for_each(attrs.begin(), attrs.end(), single_attr_getter(m_pool, NS_odf_text, XML_style_name)).get_value();
+ m_span_stack.push_back(style_name);
+
+ }
+ break;
+ case XML_s:
+ // control character. ignored for now.
+ break;
+ default:
+ warn_unhandled();
+ }
+ }
+ else
+ warn_unhandled();
+}
+
+bool text_para_context::end_element(xmlns_id_t ns, xml_token_t name)
+{
+ if (ns == NS_odf_text)
+ {
+ switch (name)
+ {
+ case XML_p:
+ {
+ // paragraph
+ flush_segment();
+ if (mp_sstrings)
+ m_string_index = mp_sstrings->commit_segments();
+ }
+ break;
+ case XML_span:
+ {
+ // text span.
+ if (m_span_stack.empty())
+ throw xml_structure_error("</text:span> encountered without matching opening element.");
+
+ flush_segment();
+ m_span_stack.pop_back();
+ }
+ break;
+ default:
+ ;
+ }
+ }
+ return pop_stack(ns, name);
+}
+
+void text_para_context::characters(std::string_view str, bool transient)
+{
+ if (transient)
+ m_contents.push_back(m_pool.intern(str).first);
+ else
+ m_contents.push_back(str);
+}
+
+void text_para_context::reset()
+{
+ m_string_index = 0;
+ m_has_content = false;
+ m_pool.clear();
+ m_contents.clear();
+}
+
+size_t text_para_context::get_string_index() const
+{
+ return m_string_index;
+}
+
+bool text_para_context::empty() const
+{
+ return !m_has_content;
+}
+
+void text_para_context::flush_segment()
+{
+ if (m_contents.empty())
+ // No content to flush.
+ return;
+
+ m_has_content = true;
+
+ const odf_style* style = nullptr;
+ if (!m_span_stack.empty())
+ {
+ std::string_view style_name = m_span_stack.back();
+ auto it = m_styles.find(style_name);
+ if (it != m_styles.end())
+ style = it->second.get();
+ }
+
+ if (mp_sstrings)
+ {
+ if (style && style->family == style_family_text)
+ {
+ const auto& data = std::get<odf_style::text>(style->data);
+ mp_sstrings->set_segment_font(data.font);
+ }
+
+ for (std::string_view ps : m_contents)
+ mp_sstrings->append_segment(ps);
+ }
+
+ m_contents.clear();
+}
+
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/odf_para_context.hpp b/src/liborcus/odf_para_context.hpp
new file mode 100644
index 0000000..42bdb7d
--- /dev/null
+++ b/src/liborcus/odf_para_context.hpp
@@ -0,0 +1,62 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef ORCUS_PARACONTEXT_HPP
+#define ORCUS_PARACONTEXT_HPP
+
+#include "xml_context_base.hpp"
+#include "odf_styles.hpp"
+
+#include "orcus/string_pool.hpp"
+
+#include <vector>
+
+namespace orcus {
+
+namespace spreadsheet { namespace iface { class import_shared_strings; }}
+
+/**
+ * This class handles <text:p> contexts.
+ */
+class text_para_context : public xml_context_base
+{
+public:
+ text_para_context(
+ session_context& session_cxt, const tokens& tokens,
+ spreadsheet::iface::import_shared_strings* ssb, odf_styles_map_type& styles);
+ virtual ~text_para_context();
+
+ virtual xml_context_base* create_child_context(xmlns_id_t ns, xml_token_t name);
+ virtual void end_child_context(xmlns_id_t ns, xml_token_t name, xml_context_base* child);
+
+ virtual void start_element(xmlns_id_t ns, xml_token_t name, const xml_token_attrs_t& attrs);
+ virtual bool end_element(xmlns_id_t ns, xml_token_t name);
+ virtual void characters(std::string_view str, bool transient);
+
+ void reset();
+
+ size_t get_string_index() const;
+ bool empty() const;
+
+private:
+ void flush_segment();
+
+private:
+ spreadsheet::iface::import_shared_strings* mp_sstrings;
+ odf_styles_map_type& m_styles;
+
+ string_pool m_pool;
+ std::vector<std::string_view> m_span_stack; /// stack of text spans.
+ std::vector<std::string_view> m_contents;
+ size_t m_string_index;
+ bool m_has_content;
+};
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/odf_style_context.cpp b/src/liborcus/odf_style_context.cpp
new file mode 100644
index 0000000..70953a1
--- /dev/null
+++ b/src/liborcus/odf_style_context.cpp
@@ -0,0 +1,774 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "odf_style_context.hpp"
+#include "impl_utils.hpp"
+#include "odf_namespace_types.hpp"
+#include "odf_token_constants.hpp"
+#include "odf_helper.hpp"
+#include "session_context.hpp"
+#include "ods_session_data.hpp"
+
+#include <mdds/sorted_string_map.hpp>
+
+#include <orcus/spreadsheet/import_interface_styles.hpp>
+
+namespace ss = orcus::spreadsheet;
+
+namespace orcus {
+
+namespace {
+
+namespace style_family {
+
+using map_type = mdds::sorted_string_map<odf_style_family>;
+
+constexpr map_type::entry entries[] =
+{
+ { MDDS_ASCII("graphic"), style_family_graphic },
+ { MDDS_ASCII("paragraph"), style_family_paragraph },
+ { MDDS_ASCII("table"), style_family_table },
+ { MDDS_ASCII("table-cell"), style_family_table_cell },
+ { MDDS_ASCII("table-column"), style_family_table_column },
+ { MDDS_ASCII("table-row"), style_family_table_row },
+ { MDDS_ASCII("text"), style_family_text }
+};
+
+const map_type& get()
+{
+ static const map_type mt(entries, std::size(entries), style_family_unknown);
+ return mt;
+}
+
+} // namespace style_family
+
+odf_style_family to_style_family(std::string_view val)
+{
+ return style_family::get().find(val.data(), val.size());
+}
+
+std::string_view to_string(odf_style_family family)
+{
+ static constexpr std::string_view unknown_str = "unknown";
+
+ for (const auto& entry : style_family::entries)
+ {
+ if (entry.value == family)
+ return {entry.key, entry.key_length};
+ }
+
+ return unknown_str;
+}
+
+namespace st_style {
+
+typedef mdds::sorted_string_map<ss::strikethrough_style_t> map_type;
+
+// Keys must be sorted.
+constexpr map_type::entry entries[] =
+{
+ { MDDS_ASCII("dash"), ss::strikethrough_style_t::dash },
+ { MDDS_ASCII("dot-dash"), ss::strikethrough_style_t::dot_dash },
+ { MDDS_ASCII("dot-dot-dash"), ss::strikethrough_style_t::dot_dot_dash },
+ { MDDS_ASCII("dotted"), ss::strikethrough_style_t::dotted },
+ { MDDS_ASCII("long-dash"), ss::strikethrough_style_t::long_dash },
+ { MDDS_ASCII("none"), ss::strikethrough_style_t::none },
+ { MDDS_ASCII("solid"), ss::strikethrough_style_t::solid },
+ { MDDS_ASCII("wave"), ss::strikethrough_style_t::wave },
+};
+
+const map_type& get()
+{
+ static const map_type mt(entries, std::size(entries), ss::strikethrough_style_t::none);
+ return mt;
+}
+
+} // namespace st_style
+
+} // anonymous namespace
+
+style_context::style_context(session_context& session_cxt, const tokens& tk, ss::iface::import_styles* iface_styles) :
+ xml_context_base(session_cxt, tk),
+ mp_styles(iface_styles)
+{
+}
+
+void style_context::start_element(xmlns_id_t ns, xml_token_t name, const std::vector<xml_token_attr_t>& attrs)
+{
+ xml_token_pair_t parent = push_stack(ns, name);
+
+ if (ns == NS_odf_style)
+ {
+ switch (name)
+ {
+ case XML_style:
+ {
+ xml_element_expected(parent, XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN);
+
+ std::string_view style_name;
+ std::string_view display_style_name;
+ std::string_view parent_style_name;
+ std::optional<std::string_view> data_style_name;
+ odf_style_family family = style_family_unknown;
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.ns == NS_odf_style)
+ {
+ switch (attr.name)
+ {
+ case XML_name:
+ style_name = intern(attr.value);
+ break;
+ case XML_display_name:
+ display_style_name = intern(attr.value);
+ break;
+ case XML_family:
+ family = to_style_family(attr.value);
+ break;
+ case XML_parent_style_name:
+ parent_style_name = intern(attr.value);
+ break;
+ case XML_data_style_name:
+ data_style_name = attr.value; // no need to intern
+ break;
+ }
+ }
+ }
+
+ m_current_style = std::make_unique<odf_style>(
+ style_name, display_style_name, family, parent_style_name);
+
+ if (data_style_name && family == style_family_table_cell)
+ {
+ const auto& ods_data = get_session_context().get_data<ods_session_data>();
+ const auto& numfmt_name2id = ods_data.number_formats.name2id_map;
+
+ if (auto it = numfmt_name2id.find(*data_style_name); it != numfmt_name2id.end())
+ {
+ // record the number format id associated with the name.
+ auto& data = std::get<odf_style::cell>(m_current_style->data);
+ data.number_format = it->second;
+ }
+ else
+ {
+ if (get_config().debug)
+ {
+ std::ostringstream os;
+ os << "no number style found for the data style name of '" << *data_style_name << "'";
+ warn(os.str());
+ }
+ }
+ }
+ break;
+ }
+ case XML_table_column_properties:
+ {
+ xml_element_expected(parent, NS_odf_style, XML_style);
+ assert(m_current_style->family == style_family_table_column);
+
+ for (const xml_token_attr_t& attr: attrs)
+ {
+ if (attr.ns == NS_odf_style)
+ {
+ switch (attr.name)
+ {
+ case XML_column_width:
+ {
+ std::get<odf_style::column>(m_current_style->data).width = to_length(attr.value);
+ break;
+ }
+ }
+ }
+ }
+
+ break;
+ }
+ case XML_table_row_properties:
+ {
+ xml_element_expected(parent, NS_odf_style, XML_style);
+ assert(m_current_style->family == style_family_table_row);
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.ns == NS_odf_style)
+ {
+ switch (attr.name)
+ {
+ case XML_row_height:
+ {
+ auto& data = std::get<odf_style::row>(m_current_style->data);
+ data.height = to_length(attr.value);
+ data.height_set = true;
+ break;
+ }
+ }
+ }
+ }
+
+ break;
+ }
+ case XML_table_properties:
+ xml_element_expected(parent, NS_odf_style, XML_style);
+ break;
+ case XML_paragraph_properties:
+ start_paragraph_properties(parent, attrs);
+ break;
+ case XML_text_properties:
+ start_text_properties(parent, attrs);
+ break;
+ case XML_table_cell_properties:
+ start_table_cell_properties(parent, attrs);
+ break;
+ default:
+ warn_unhandled();
+ }
+ }
+ else
+ warn_unhandled();
+}
+
+bool style_context::end_element(xmlns_id_t ns, xml_token_t name)
+{
+ return pop_stack(ns, name);
+}
+
+void style_context::reset()
+{
+ m_current_style.reset();
+}
+
+std::unique_ptr<odf_style> style_context::pop_style()
+{
+ return std::move(m_current_style);
+}
+
+void style_context::characters(std::string_view /*str*/, bool /*transient*/)
+{
+}
+
+void style_context::start_paragraph_properties(const xml_token_pair_t& parent, const xml_token_attrs_t& attrs)
+{
+ xml_element_expected(parent, NS_odf_style, XML_style);
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.ns == NS_odf_fo)
+ {
+ switch (attr.name)
+ {
+ case XML_text_align:
+ {
+ auto v = odf::extract_hor_alignment_style(attr.value);
+
+ switch (m_current_style->family)
+ {
+ case style_family_table_cell:
+ {
+ auto& data = std::get<odf_style::cell>(m_current_style->data);
+ data.hor_align = v;
+ break;
+ }
+ case style_family_paragraph:
+ {
+ auto& data = std::get<odf_style::paragraph>(m_current_style->data);
+ data.hor_align = v;
+ break;
+ }
+ default:
+ {
+ if (get_config().debug)
+ {
+ std::ostringstream os;
+ os << "unhandled fo:text-align attribute (family=" << to_string(m_current_style->family) << ")";
+ warn(os.str());
+ }
+ }
+ }
+ break;
+ }
+ default:
+ ;
+ }
+ }
+ }
+}
+
+void style_context::start_text_properties(const xml_token_pair_t& parent, const xml_token_attrs_t& attrs)
+{
+ static const xml_elem_set_t expected = {
+ { NS_odf_style, XML_style },
+ { NS_odf_text, XML_list_level_style_number },
+ { NS_odf_text, XML_list_level_style_bullet },
+ };
+ xml_element_expected(parent, expected);
+
+ if (parent != xml_token_pair_t(NS_odf_style, XML_style))
+ // TODO : handle this properly in the future.
+ return;
+
+ // NB: no need to intern the font names since they are consumed at the end
+ // of this function.
+ std::optional<std::string_view> font_name;
+ std::optional<std::string_view> font_name_asian;
+ std::optional<std::string_view> font_name_complex;
+ std::optional<length_t> font_size;
+ std::optional<length_t> font_size_asian;
+ std::optional<length_t> font_size_complex;
+ std::optional<bool> bold;
+ std::optional<bool> bold_asian;
+ std::optional<bool> bold_complex;
+ std::optional<bool> italic;
+ std::optional<bool> italic_asian;
+ std::optional<bool> italic_complex;
+ std::optional<ss::color_rgb_t> color;
+
+ std::optional<ss::color_rgb_t> underline_color;
+ std::optional<ss::underline_t> underline_style;
+ std::optional<ss::underline_type_t> underline_type;
+ std::optional<ss::underline_width_t> underline_width;
+ std::optional<ss::underline_mode_t> underline_mode;
+
+ std::optional<ss::strikethrough_style_t> strikethrough_style;
+ std::optional<ss::strikethrough_type_t> strikethrough_type;
+ std::optional<ss::strikethrough_width_t> strikethrough_width;
+ std::optional<ss::strikethrough_text_t> strikethrough_text;
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.ns == NS_odf_style)
+ {
+ switch (attr.name)
+ {
+ case XML_font_name:
+ font_name = attr.value;
+ break;
+ case XML_font_name_asian:
+ font_name_asian = attr.value;
+ break;
+ case XML_font_name_complex:
+ font_name_complex = attr.value;
+ break;
+ case XML_font_size_asian:
+ font_size_asian = to_length(attr.value);
+ break;
+ case XML_font_size_complex:
+ font_size_complex = to_length(attr.value);
+ break;
+ case XML_font_style_asian:
+ italic_asian = attr.value == "italic";
+ break;
+ case XML_font_style_complex:
+ italic_complex = attr.value == "italic";
+ break;
+ case XML_font_weight_asian:
+ bold_asian = attr.value == "bold";
+ break;
+ case XML_font_weight_complex:
+ bold_complex = attr.value == "bold";
+ break;
+ case XML_text_underline_color:
+ if (attr.value != "font-color")
+ underline_color = odf::convert_fo_color(attr.value);
+ break;
+ case XML_text_underline_mode:
+ if (attr.value == "skip-white-space")
+ underline_mode = ss::underline_mode_t::skip_white_space;
+ else
+ underline_mode = ss::underline_mode_t::continuous;
+ break;
+ case XML_text_underline_width:
+ {
+ underline_width = odf::extract_underline_width(attr.value);
+ break;
+ }
+ case XML_text_underline_style:
+ {
+ underline_style = odf::extract_underline_style(attr.value);
+ break;
+ }
+ case XML_text_underline_type:
+ {
+ if (attr.value == "none")
+ underline_type = ss::underline_type_t::none;
+ else if (attr.value == "single")
+ underline_type = ss::underline_type_t::single_type;
+ else if (attr.value == "double")
+ underline_type = ss::underline_type_t::double_type;
+ break;
+ }
+ case XML_text_line_through_style:
+ {
+ strikethrough_style = st_style::get().find(attr.value.data(), attr.value.size());
+ break;
+ }
+ case XML_text_line_through_type:
+ {
+ if (attr.value == "single")
+ strikethrough_type = ss::strikethrough_type_t::single_type;
+ else if (attr.value == "double")
+ strikethrough_type = ss::strikethrough_type_t::double_type;
+ else
+ strikethrough_type = ss::strikethrough_type_t::unknown;
+ break;
+ }
+ case XML_text_line_through_width:
+ {
+ if (attr.value == "bold")
+ strikethrough_width = ss::strikethrough_width_t::bold;
+ else
+ strikethrough_width = ss::strikethrough_width_t::unknown;
+ break;
+ }
+ case XML_text_line_through_text:
+ {
+ if (attr.value == "/")
+ strikethrough_text = ss::strikethrough_text_t::slash;
+ else if (attr.value == "X")
+ strikethrough_text = ss::strikethrough_text_t::cross;
+ else
+ strikethrough_text = ss::strikethrough_text_t::unknown;
+ break;
+ }
+ }
+ }
+ else if (attr.ns == NS_odf_fo)
+ {
+ switch (attr.name)
+ {
+ case XML_font_size:
+ font_size = to_length(attr.value);
+ break;
+ case XML_font_style:
+ italic = attr.value == "italic";
+ break;
+ case XML_font_weight:
+ bold = attr.value == "bold";
+ break;
+ case XML_color:
+ color = odf::convert_fo_color(attr.value);
+ break;
+ }
+ }
+ }
+
+ // Commit the font data.
+ auto* font_style = mp_styles->start_font_style();
+ ENSURE_INTERFACE(font_style, import_font_style);
+
+ if (font_name)
+ font_style->set_name(*font_name);
+
+ if (font_name_asian)
+ font_style->set_name_asian(*font_name_asian);
+
+ if (font_name_complex)
+ font_style->set_name_complex(*font_name_complex);
+
+ if (font_size && font_size->unit == length_unit_t::point)
+ font_style->set_size(font_size->value);
+
+ if (font_size_asian && font_size_asian->unit == length_unit_t::point)
+ font_style->set_size_asian(font_size_asian->value);
+
+ if (font_size_complex && font_size_complex->unit == length_unit_t::point)
+ font_style->set_size_complex(font_size_complex->value);
+
+ if (bold)
+ font_style->set_bold(*bold);
+
+ if (bold_asian)
+ font_style->set_bold_asian(*bold_asian);
+
+ if (bold_complex)
+ font_style->set_bold_complex(*bold_complex);
+
+ if (italic)
+ font_style->set_italic(*italic);
+
+ if (italic_asian)
+ font_style->set_italic_asian(*italic_asian);
+
+ if (italic_complex)
+ font_style->set_italic_complex(*italic_complex);
+
+ if (color)
+ font_style->set_color(255, color->red, color->green, color->blue);
+
+ if (underline_color)
+ // Separate underline color is specified.
+ font_style->set_underline_color(255, underline_color->red, underline_color->green, underline_color->blue);
+
+ if (underline_width)
+ font_style->set_underline_width(*underline_width);
+
+ if (underline_style)
+ font_style->set_underline(*underline_style);
+
+ if (underline_type)
+ font_style->set_underline_type(*underline_type);
+
+ if (underline_mode)
+ font_style->set_underline_mode(*underline_mode);
+
+ if (strikethrough_style)
+ font_style->set_strikethrough_style(*strikethrough_style);
+
+ if (strikethrough_type)
+ font_style->set_strikethrough_type(*strikethrough_type);
+
+ if (strikethrough_width)
+ font_style->set_strikethrough_width(*strikethrough_width);
+
+ if (strikethrough_text)
+ font_style->set_strikethrough_text(*strikethrough_text);
+
+ size_t font_id = font_style->commit();
+
+ switch (m_current_style->family)
+ {
+ case style_family_table_cell:
+ {
+ auto& data = std::get<odf_style::cell>(m_current_style->data);
+ data.font = font_id;
+ break;
+ }
+ case style_family_text:
+ {
+ auto& data = std::get<odf_style::text>(m_current_style->data);
+ data.font = font_id;
+ break;
+ }
+ default:
+ ;
+ }
+}
+
+void style_context::start_table_cell_properties(const xml_token_pair_t& parent, const xml_token_attrs_t& attrs)
+{
+ xml_element_expected(parent, NS_odf_style, XML_style);
+
+ if (m_current_style->family != style_family_table_cell)
+ throw xml_structure_error("expected table_cell family style in cell_properties element");
+
+ if (!mp_styles)
+ return;
+
+ auto& data = std::get<odf_style::cell>(m_current_style->data);
+
+ std::optional<spreadsheet::color_rgb_t> bg_color;
+
+ std::optional<bool> locked;
+ std::optional<bool> hidden;
+ std::optional<bool> formula_hidden;
+ std::optional<bool> print_content;
+
+ bool cell_protection_set = false;
+
+ using border_map_type = std::map<ss::border_direction_t, odf::border_details_t>;
+ border_map_type border_styles;
+
+ ss::ver_alignment_t ver_alignment = ss::ver_alignment_t::unknown;
+ std::optional<bool> wrap_text;
+ std::optional<bool> shrink_to_fit;
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.ns == NS_odf_fo)
+ {
+ switch (attr.name)
+ {
+ case XML_background_color:
+ bg_color = odf::convert_fo_color(attr.value);
+ break;
+ case XML_border:
+ {
+ odf::border_details_t border_details = odf::extract_border_details(attr.value);
+
+ const ss::border_direction_t dirs[] =
+ {
+ ss::border_direction_t::top,
+ ss::border_direction_t::bottom,
+ ss::border_direction_t::left,
+ ss::border_direction_t::right
+ };
+
+ for (const auto dir : dirs)
+ border_styles.insert_or_assign(dir, border_details);
+
+ break;
+ }
+ case XML_border_top:
+ {
+ odf::border_details_t border_details = odf::extract_border_details(attr.value);
+ border_styles.insert_or_assign(ss::border_direction_t::top, border_details);
+ break;
+ }
+ case XML_border_bottom:
+ {
+ odf::border_details_t border_details = odf::extract_border_details(attr.value);
+ border_styles.insert_or_assign(ss::border_direction_t::bottom, border_details);
+ break;
+ }
+ case XML_border_left:
+ {
+ odf::border_details_t border_details = odf::extract_border_details(attr.value);
+ border_styles.insert_or_assign(ss::border_direction_t::left, border_details);
+ break;
+ }
+ case XML_border_right:
+ {
+ odf::border_details_t border_details = odf::extract_border_details(attr.value);
+ border_styles.insert_or_assign(ss::border_direction_t::right, border_details);
+ break;
+ }
+ case XML_diagonal_bl_tr:
+ {
+ odf::border_details_t border_details = odf::extract_border_details(attr.value);
+ border_styles.insert_or_assign(ss::border_direction_t::diagonal_bl_tr, border_details);
+ break;
+ }
+ case XML_diagonal_tl_br:
+ {
+ odf::border_details_t border_details = odf::extract_border_details(attr.value);
+ border_styles.insert_or_assign(ss::border_direction_t::diagonal_tl_br, border_details);
+ break;
+ }
+ case XML_wrap_option:
+ {
+ wrap_text = (attr.value == "wrap");
+ break;
+ }
+ default:
+ ;
+ }
+ }
+ else if (attr.ns == NS_odf_style)
+ {
+ switch (attr.name)
+ {
+ case XML_print_content:
+ {
+ cell_protection_set = true;
+ print_content = to_bool(attr.value);
+ break;
+ }
+ case XML_cell_protect:
+ {
+ if (attr.value == "protected")
+ {
+ cell_protection_set = true;
+ locked = true;
+ }
+ else if (attr.value == "hidden-and-protected")
+ {
+ cell_protection_set = true;
+ locked = true;
+ hidden = true;
+ }
+ else if (attr.value == "formula-hidden")
+ {
+ cell_protection_set = true;
+ formula_hidden = true;
+ }
+ else if (attr.value == "protected formula-hidden" || attr.value == "formula-hidden protected")
+ {
+ cell_protection_set = true;
+ formula_hidden = true;
+ locked = true;
+ }
+ else if (attr.value == "none")
+ {
+ cell_protection_set = true;
+ locked = false;
+ hidden = false;
+ formula_hidden = false;
+ }
+ break;
+ }
+ case XML_vertical_align:
+ ver_alignment = odf::extract_ver_alignment_style(attr.value);
+ break;
+ case XML_shrink_to_fit:
+ shrink_to_fit = to_bool(attr.value);
+ break;
+ default:
+ ;
+ }
+ }
+ }
+
+ std::size_t fill_id = 0;
+ std::size_t border_id = 0;
+ std::size_t cell_protection_id = 0;
+
+ if (bg_color)
+ {
+ auto* fill_style = mp_styles->start_fill_style();
+ ENSURE_INTERFACE(fill_style, import_fill_style);
+
+ fill_style->set_pattern_type(ss::fill_pattern_t::solid);
+ fill_style->set_fg_color(255, bg_color->red, bg_color->green, bg_color->blue);
+ fill_id = fill_style->commit();
+ }
+
+ if (!border_styles.empty())
+ {
+ auto* border_style = mp_styles->start_border_style();
+ ENSURE_INTERFACE(border_style, import_border_style);
+
+ for (const auto& [dir, details] : border_styles)
+ {
+ border_style->set_color(dir, 255, details.red, details.green, details.blue);
+ border_style->set_style(dir, details.border_style);
+ border_style->set_width(dir, details.border_width.value, details.border_width.unit);
+ }
+
+ border_id = border_style->commit();
+ }
+
+ if (cell_protection_set)
+ {
+ auto* cell_protection = mp_styles->start_cell_protection();
+ ENSURE_INTERFACE(cell_protection, import_cell_protection);
+
+ if (hidden)
+ cell_protection->set_hidden(*hidden);
+
+ if (locked)
+ cell_protection->set_locked(*locked);
+
+ if (print_content)
+ cell_protection->set_print_content(*print_content);
+
+ if (formula_hidden)
+ cell_protection->set_formula_hidden(*formula_hidden);
+
+ cell_protection_id = cell_protection->commit();
+ }
+
+ switch (m_current_style->family)
+ {
+ case style_family_table_cell:
+ {
+ data.fill = fill_id;
+ data.border = border_id;
+ data.protection = cell_protection_id;
+ data.ver_align = ver_alignment;
+ data.wrap_text = wrap_text;
+ data.shrink_to_fit = shrink_to_fit;
+ break;
+ }
+ default:
+ ;
+ }
+}
+
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/odf_style_context.hpp b/src/liborcus/odf_style_context.hpp
new file mode 100644
index 0000000..4a33948
--- /dev/null
+++ b/src/liborcus/odf_style_context.hpp
@@ -0,0 +1,51 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#pragma once
+
+#include "xml_context_base.hpp"
+#include "odf_styles.hpp"
+
+#include <memory>
+
+namespace orcus {
+
+namespace spreadsheet { namespace iface {
+ class import_styles;
+}}
+
+/**
+ * Context for <style:style> element scope.
+ *
+ * This context populates one odf_style instance that represents a single set
+ * of style properties.
+ */
+class style_context : public xml_context_base
+{
+public:
+ style_context(session_context& session_cxt, const tokens& tk, spreadsheet::iface::import_styles* iface_styles);
+
+ void start_element(xmlns_id_t ns, xml_token_t name, const std::vector<xml_token_attr_t>& attrs) override;
+ void characters(std::string_view str, bool transient) override;
+ bool end_element(xmlns_id_t ns, xml_token_t name) override;
+
+ void reset();
+ std::unique_ptr<odf_style> pop_style();
+
+private:
+ void start_paragraph_properties(const xml_token_pair_t& parent, const xml_token_attrs_t& attrs);
+ void start_text_properties(const xml_token_pair_t& parent, const xml_token_attrs_t& attrs);
+ void start_table_cell_properties(const xml_token_pair_t& parent, const xml_token_attrs_t& attrs);
+
+private:
+ spreadsheet::iface::import_styles* mp_styles = nullptr;
+ std::unique_ptr<odf_style> m_current_style;
+};
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/odf_styles.cpp b/src/liborcus/odf_styles.cpp
new file mode 100644
index 0000000..814d468
--- /dev/null
+++ b/src/liborcus/odf_styles.cpp
@@ -0,0 +1,110 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "odf_styles.hpp"
+
+#include <stdexcept>
+
+namespace orcus {
+
+odf_style::odf_style() : family(style_family_unknown) {}
+odf_style::odf_style(std::string_view _name, std::string_view _display_name, odf_style_family _family, std::string_view parent) :
+ name(_name),
+ display_name(_display_name),
+ family(_family),
+ parent_name(parent)
+{
+ switch (family)
+ {
+ case style_family_table_column:
+ data = column{};
+ break;
+ case style_family_table_row:
+ data = row{};
+ break;
+ case style_family_table_cell:
+ data = cell{};
+ break;
+ case style_family_table:
+ data = table{};
+ break;
+ case style_family_graphic:
+ data = graphic{};
+ break;
+ case style_family_paragraph:
+ data = paragraph{};
+ break;
+ case style_family_text:
+ data = text{};
+ break;
+ case style_family_unknown:
+ throw std::invalid_argument("unkown style family is not allowed");
+ }
+}
+
+odf_style::~odf_style() {}
+
+odf_number_format::odf_number_format(std::string_view _name, bool _is_volatile):
+ name(_name),
+ is_volatile(_is_volatile)
+{
+}
+
+void merge(odf_styles_map_type& dst, odf_styles_map_type& src)
+{
+ for (auto& [name, style] : src)
+ dst.insert_or_assign(name, std::move(style));
+
+ src.clear();
+}
+
+void dump_state(const odf_styles_map_type& styles_map, std::ostream& os)
+{
+ os << "styles picked up:\n";
+
+ auto it = styles_map.begin(), it_end = styles_map.end();
+ for (; it != it_end; ++it)
+ {
+ os << " style: " << it->first << " [ ";
+
+ switch (it->second->family)
+ {
+ case style_family_table_column:
+ {
+ const auto& data = std::get<odf_style::column>(it->second->data);
+ os << "column width: " << data.width.to_string();
+ break;
+ }
+ case style_family_table_row:
+ {
+ const auto& data = std::get<odf_style::row>(it->second->data);
+ os << "row height: " << data.height.to_string();
+ break;
+ }
+ case style_family_table_cell:
+ {
+ const auto& cell = std::get<odf_style::cell>(it->second->data);
+ os << "xf ID: " << cell.xf;
+ break;
+ }
+ case style_family_text:
+ {
+ const auto& data = std::get<odf_style::text>(it->second->data);
+ os << "font ID: " << data.font;
+ break;
+ }
+ default:
+ ;
+ }
+
+ os << " ]\n";
+ }
+}
+
+} // namespace orcus
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/odf_styles.hpp b/src/liborcus/odf_styles.hpp
new file mode 100644
index 0000000..c4e5eaf
--- /dev/null
+++ b/src/liborcus/odf_styles.hpp
@@ -0,0 +1,127 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_ODF_STYLES_HPP
+#define INCLUDED_ORCUS_ODF_STYLES_HPP
+
+#include <orcus/measurement.hpp>
+#include <orcus/spreadsheet/types.hpp>
+
+#include <map>
+#include <memory>
+#include <variant>
+#include <ostream>
+#include <optional>
+
+namespace orcus {
+
+enum odf_style_family
+{
+ style_family_unknown = 0,
+ style_family_table_column,
+ style_family_table_row,
+ style_family_table_cell,
+ style_family_table,
+ style_family_graphic,
+ style_family_paragraph,
+ style_family_text
+};
+
+/**
+ * Each instance of this class represents a single <style:style> entry.
+ */
+struct odf_style
+{
+ struct column
+ {
+ length_t width;
+ };
+
+ struct row
+ {
+ length_t height;
+ bool height_set = false;
+ };
+
+ struct cell
+ {
+ std::size_t font = 0;
+ std::size_t fill = 0;
+ std::size_t border = 0;
+ std::size_t protection = 0;
+ std::size_t xf = 0;
+ std::size_t number_format = 0;
+ spreadsheet::hor_alignment_t hor_align = spreadsheet::hor_alignment_t::unknown;
+ spreadsheet::ver_alignment_t ver_align = spreadsheet::ver_alignment_t::unknown;
+ std::optional<bool> wrap_text;
+ std::optional<bool> shrink_to_fit;
+ };
+
+ struct table
+ {
+ };
+
+ struct graphic
+ {
+ };
+
+ struct paragraph
+ {
+ spreadsheet::hor_alignment_t hor_align = spreadsheet::hor_alignment_t::unknown;
+ };
+
+ struct text
+ {
+ size_t font;
+ };
+
+ using data_type = std::variant<column, row, cell, table, graphic, paragraph, text>;
+
+ std::string_view name;
+ std::string_view display_name;
+ odf_style_family family;
+ std::string_view parent_name;
+
+ data_type data;
+
+ odf_style(const odf_style&) = delete;
+ odf_style& operator=(const odf_style&) = delete;
+
+ odf_style();
+ odf_style(std::string_view _name, std::string_view _display_name, odf_style_family _family, std::string_view parent);
+
+ ~odf_style();
+};
+
+struct odf_number_format
+{
+ std::string_view name;
+ std::string code;
+ bool is_volatile = false;
+
+ odf_number_format() = default;
+ odf_number_format(std::string_view _name, bool _is_volatile);
+};
+
+using odf_styles_map_type = std::map<std::string_view, std::unique_ptr<odf_style>>;
+
+/**
+ * Merge two styles collections into one.
+ *
+ * @param dst destination where all the styles will be stored when the call
+ * returns.
+ * @param src source collection to move all the styles from. After the call
+ * returns this one will be empty.
+ */
+void merge(odf_styles_map_type& dst, odf_styles_map_type& src);
+
+void dump_state(const odf_styles_map_type& styles_map, std::ostream& os);
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/odf_styles_context.cpp b/src/liborcus/odf_styles_context.cpp
new file mode 100644
index 0000000..cf2589d
--- /dev/null
+++ b/src/liborcus/odf_styles_context.cpp
@@ -0,0 +1,403 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "odf_styles_context.hpp"
+#include "odf_namespace_types.hpp"
+#include "odf_token_constants.hpp"
+#include "ods_session_data.hpp"
+#include "impl_utils.hpp"
+
+#include <orcus/spreadsheet/import_interface_styles.hpp>
+#include <iostream>
+
+namespace ss = orcus::spreadsheet;
+
+namespace orcus {
+
+styles_context::styles_context(
+ session_context& session_cxt, const tokens& tk,
+ spreadsheet::iface::import_styles* iface_styles) :
+ xml_context_base(session_cxt, tk),
+ mp_styles(iface_styles),
+ m_automatic_styles(false),
+ m_cxt_style(session_cxt, tk, mp_styles),
+ m_cxt_number_style(session_cxt, tk),
+ m_cxt_currency_style(session_cxt, tk),
+ m_cxt_boolean_style(session_cxt, tk),
+ m_cxt_text_style(session_cxt, tk),
+ m_cxt_percentage_style(session_cxt, tk),
+ m_cxt_date_style(session_cxt, tk),
+ m_cxt_time_style(session_cxt, tk)
+{
+ register_child(&m_cxt_style);
+ register_child(&m_cxt_number_style);
+ register_child(&m_cxt_currency_style);
+ register_child(&m_cxt_boolean_style);
+ register_child(&m_cxt_text_style);
+ register_child(&m_cxt_percentage_style);
+ register_child(&m_cxt_date_style);
+ register_child(&m_cxt_time_style);
+
+ commit_default_styles();
+}
+
+xml_context_base* styles_context::create_child_context(xmlns_id_t ns, xml_token_t name)
+{
+ if (ns == NS_odf_number)
+ {
+ switch (name)
+ {
+ case XML_number_style:
+ {
+ m_cxt_number_style.reset();
+ return &m_cxt_number_style;
+ }
+ case XML_currency_style:
+ {
+ m_cxt_currency_style.reset();
+ return &m_cxt_currency_style;
+ }
+ case XML_boolean_style:
+ {
+ m_cxt_boolean_style.reset();
+ return &m_cxt_boolean_style;
+ }
+ case XML_text_style:
+ {
+ m_cxt_text_style.reset();
+ return &m_cxt_text_style;
+ }
+ case XML_percentage_style:
+ {
+ m_cxt_percentage_style.reset();
+ return &m_cxt_percentage_style;
+ }
+ case XML_date_style:
+ {
+ m_cxt_date_style.reset();
+ return &m_cxt_date_style;
+ }
+ case XML_time_style:
+ {
+ m_cxt_time_style.reset();
+ return &m_cxt_time_style;
+ }
+ }
+ }
+
+ if (ns == NS_odf_style && name == XML_style)
+ {
+ m_cxt_style.reset();
+ return &m_cxt_style;
+ }
+
+ return nullptr;
+}
+
+void styles_context::end_child_context(xmlns_id_t ns, xml_token_t name, xml_context_base* child)
+{
+ if (ns == NS_odf_number)
+ {
+ switch (name)
+ {
+ case XML_number_style:
+ {
+ assert(child == &m_cxt_number_style);
+ push_number_style(m_cxt_number_style.pop_style());
+ break;
+ }
+ case XML_currency_style:
+ {
+ assert(child == &m_cxt_currency_style);
+ push_number_style(m_cxt_currency_style.pop_style());
+ break;
+ }
+ case XML_boolean_style:
+ {
+ assert(child == &m_cxt_boolean_style);
+ push_number_style(m_cxt_boolean_style.pop_style());
+ break;
+ }
+ case XML_text_style:
+ {
+ assert(child == &m_cxt_text_style);
+ push_number_style(m_cxt_text_style.pop_style());
+ break;
+ }
+ case XML_percentage_style:
+ {
+ assert(child == &m_cxt_percentage_style);
+ push_number_style(m_cxt_percentage_style.pop_style());
+ break;
+ }
+ case XML_date_style:
+ {
+ assert(child == &m_cxt_date_style);
+ push_number_style(m_cxt_date_style.pop_style());
+ break;
+ }
+ case XML_time_style:
+ {
+ assert(child == &m_cxt_time_style);
+ push_number_style(m_cxt_time_style.pop_style());
+ break;
+ }
+ default:;
+ }
+ }
+ else if (ns == NS_odf_style && name == XML_style)
+ {
+ assert(child == &m_cxt_style);
+ std::unique_ptr<odf_style> current_style = m_cxt_style.pop_style();
+
+ std::optional<std::size_t> parent_xfid = query_parent_style_xfid(current_style->parent_name);
+
+ if (mp_styles && current_style->family == style_family_table_cell)
+ {
+ auto& cell = std::get<odf_style::cell>(current_style->data);
+
+ if (m_automatic_styles)
+ {
+ // Import it into the direct cell style store
+ auto* xf = mp_styles->start_xf(ss::xf_category_t::cell);
+ ENSURE_INTERFACE(xf, import_xf);
+ xf->set_font(cell.font);
+ xf->set_fill(cell.fill);
+ xf->set_border(cell.border);
+ xf->set_protection(cell.protection);
+ xf->set_number_format(cell.number_format);
+
+ if (cell.hor_align != ss::hor_alignment_t::unknown)
+ xf->set_horizontal_alignment(cell.hor_align);
+ if (cell.ver_align != ss::ver_alignment_t::unknown)
+ xf->set_vertical_alignment(cell.ver_align);
+ if (cell.wrap_text)
+ xf->set_wrap_text(*cell.wrap_text);
+ if (cell.shrink_to_fit)
+ xf->set_shrink_to_fit(*cell.shrink_to_fit);
+
+ if (parent_xfid)
+ xf->set_style_xf(*parent_xfid);
+
+ cell.xf = xf->commit();
+ }
+ else
+ {
+ // Import it into the cell style xf store, and reference
+ // its index in the cell style name store.
+ auto* xf = mp_styles->start_xf(ss::xf_category_t::cell_style);
+ ENSURE_INTERFACE(xf, import_xf);
+ xf->set_font(cell.font);
+ xf->set_fill(cell.fill);
+ xf->set_border(cell.border);
+ xf->set_protection(cell.protection);
+ xf->set_number_format(cell.number_format);
+
+ if (cell.hor_align != ss::hor_alignment_t::unknown)
+ xf->set_horizontal_alignment(cell.hor_align);
+ if (cell.ver_align != ss::ver_alignment_t::unknown)
+ xf->set_vertical_alignment(cell.ver_align);
+ if (cell.wrap_text)
+ xf->set_wrap_text(*cell.wrap_text);
+ if (cell.shrink_to_fit)
+ xf->set_shrink_to_fit(*cell.shrink_to_fit);
+
+ if (parent_xfid)
+ xf->set_style_xf(*parent_xfid);
+
+ size_t style_xf_id = xf->commit();
+ cell.xf = style_xf_id;
+
+ auto* cell_style = mp_styles->start_cell_style();
+ ENSURE_INTERFACE(cell_style, import_cell_style);
+
+ if (!current_style->display_name.empty())
+ cell_style->set_display_name(current_style->display_name);
+
+ cell_style->set_name(current_style->name);
+ cell_style->set_xf(style_xf_id);
+ cell_style->set_parent_name(current_style->parent_name);
+ cell_style->commit();
+ }
+ }
+
+ std::string_view style_name = get_session_context().intern(current_style->name);
+ m_styles.emplace(style_name, std::move(current_style));
+ }
+}
+
+void styles_context::start_element(xmlns_id_t ns, xml_token_t name, const xml_token_attrs_t& /*attrs*/)
+{
+ xml_token_pair_t parent = push_stack(ns, name);
+ if (ns == NS_odf_office)
+ {
+ switch (name)
+ {
+ case XML_automatic_styles:
+ xml_element_expected(parent, XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN);
+ m_automatic_styles = true;
+ break;
+ case XML_styles:
+ m_automatic_styles = false;
+ break;
+ default:
+ warn_unhandled();
+ }
+ }
+ else
+ warn_unhandled();
+}
+
+bool styles_context::end_element(xmlns_id_t ns, xml_token_t name)
+{
+ return pop_stack(ns, name);
+}
+
+void styles_context::characters(std::string_view /*str*/, bool /*transient*/)
+{
+}
+
+void styles_context::reset()
+{
+ m_styles.clear();
+}
+
+odf_styles_map_type styles_context::pop_styles()
+{
+ return std::move(m_styles);
+}
+
+void styles_context::commit_default_styles()
+{
+ if (!mp_styles)
+ return;
+
+ auto* font_style = mp_styles->start_font_style();
+ ENSURE_INTERFACE(font_style, import_font_style);
+
+ auto* fill_style = mp_styles->start_fill_style();
+ ENSURE_INTERFACE(fill_style, import_fill_style);
+
+ auto* border_style = mp_styles->start_border_style();
+ ENSURE_INTERFACE(border_style, import_border_style);
+
+ auto* cell_protection = mp_styles->start_cell_protection();
+ ENSURE_INTERFACE(cell_protection, import_cell_protection);
+
+ auto* number_format = mp_styles->start_number_format();
+ ENSURE_INTERFACE(number_format, import_number_format);
+
+ // Set default styles. Default styles must be associated with an index of 0.
+ // Set empty styles for all style types before importing real styles.
+ font_style->commit();
+ fill_style->commit();
+ border_style->commit();
+ cell_protection->commit();
+ number_format->commit();
+
+ auto* xf = mp_styles->start_xf(ss::xf_category_t::cell);
+ ENSURE_INTERFACE(xf, import_xf);
+ xf->commit();
+
+ xf = mp_styles->start_xf(ss::xf_category_t::cell_style);
+ ENSURE_INTERFACE(xf, import_xf);
+ xf->commit();
+
+ auto* cell_style = mp_styles->start_cell_style();
+ ENSURE_INTERFACE(cell_style, import_cell_style);
+ cell_style->commit();
+}
+
+void styles_context::push_number_style(std::unique_ptr<odf_number_format> num_style)
+{
+ if (!mp_styles)
+ return;
+
+ if (num_style->name.empty())
+ {
+ warn("ignoring a number style with empty name.");
+ return;
+ }
+
+ if (num_style->code.empty())
+ {
+ std::ostringstream os;
+ os << "number style named '" << num_style->name << "' has empty code.";
+ warn(os.str());
+ return;
+ }
+
+ auto* number_format = mp_styles->start_number_format();
+ ENSURE_INTERFACE(number_format, import_number_format);
+
+ number_format->set_code(num_style->code);
+ std::size_t id = number_format->commit();
+
+ if (get_config().debug)
+ {
+ std::cerr << "number-style: name='" << num_style->name
+ << "'; code='" << num_style->code
+ << "'; id=" << id << std::endl;
+ }
+
+ auto& sess_cxt = get_session_context();
+ auto& numfmts_store = sess_cxt.get_data<ods_session_data>().number_formats;
+
+ if (auto res = numfmts_store.name2id_map.insert_or_assign(sess_cxt.intern(num_style->name), id); !res.second)
+ {
+ std::ostringstream os;
+ os << "number style named '" << num_style->name << "' has been overwritten.";
+ warn(os.str());
+ }
+
+ if (auto res = numfmts_store.id2code_map.insert_or_assign(id, std::move(num_style->code)); !res.second)
+ {
+ std::ostringstream os;
+ os << "number style associated with the id of " << id << " has been overwritten.";
+ warn(os.str());
+ }
+}
+
+std::optional<std::size_t> styles_context::query_parent_style_xfid(std::string_view parent_name) const
+{
+ std::optional<std::size_t> parent_xfid;
+
+ if (parent_name.empty())
+ return parent_xfid;
+
+ const ods_session_data& ods_data = get_session_context().get_data<ods_session_data>();
+
+ auto it = ods_data.styles_map.find(parent_name);
+ if (it == ods_data.styles_map.end())
+ {
+ // Not found in the session store. Check the current styles map too.
+ auto it2 = m_styles.find(parent_name);
+ if (it2 != m_styles.end())
+ {
+ const odf_style& s = *it2->second;
+ if (s.family == style_family_table_cell)
+ {
+ const odf_style::cell& c = std::get<odf_style::cell>(s.data);
+ parent_xfid = c.xf;
+ }
+ }
+ return parent_xfid;
+ }
+
+ const odf_style& s = *it->second;
+ if (s.family != style_family_table_cell)
+ return parent_xfid;
+
+ const odf_style::cell& c = std::get<odf_style::cell>(s.data);
+ parent_xfid = c.xf;
+
+ return parent_xfid;
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/odf_styles_context.hpp b/src/liborcus/odf_styles_context.hpp
new file mode 100644
index 0000000..01b2ac4
--- /dev/null
+++ b/src/liborcus/odf_styles_context.hpp
@@ -0,0 +1,70 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef ORCUS_ODF_STYLES_CONTEXT_HPP
+#define ORCUS_ODF_STYLES_CONTEXT_HPP
+
+#include "xml_context_base.hpp"
+#include "odf_styles.hpp"
+#include "odf_style_context.hpp"
+#include "odf_number_format_context.hpp"
+
+#include <unordered_map>
+
+namespace orcus {
+
+namespace spreadsheet { namespace iface {
+ class import_styles;
+}}
+
+/**
+ * Context that handles <office:automatic-styles> or <office:styles> scope.
+ */
+class styles_context : public xml_context_base
+{
+public:
+ styles_context(
+ session_context& session_cxt, const tokens& tk, spreadsheet::iface::import_styles* iface_styles);
+
+ virtual xml_context_base* create_child_context(xmlns_id_t ns, xml_token_t name) override;
+ virtual void end_child_context(xmlns_id_t ns, xml_token_t name, xml_context_base* child) override;
+ virtual void start_element(xmlns_id_t ns, xml_token_t name, const xml_token_attrs_t& attrs) override;
+ virtual bool end_element(xmlns_id_t ns, xml_token_t name) override;
+ virtual void characters(std::string_view str, bool transient) override;
+
+ void reset();
+ odf_styles_map_type pop_styles();
+
+private:
+ void commit_default_styles();
+
+ void push_number_style(std::unique_ptr<odf_number_format> num_style);
+
+ std::optional<std::size_t> query_parent_style_xfid(std::string_view parent_name) const;
+
+private:
+ spreadsheet::iface::import_styles* mp_styles;
+ odf_styles_map_type m_styles;
+
+ // an automatic style corresponds to a cell format and not a real style
+ bool m_automatic_styles;
+
+ style_context m_cxt_style;
+ number_style_context m_cxt_number_style;
+ currency_style_context m_cxt_currency_style;
+ boolean_style_context m_cxt_boolean_style;
+ text_style_context m_cxt_text_style;
+ percentage_style_context m_cxt_percentage_style;
+ date_style_context m_cxt_date_style;
+ time_style_context m_cxt_time_style;
+};
+
+} // namespace orcus
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/odf_token_constants.hpp b/src/liborcus/odf_token_constants.hpp
new file mode 100644
index 0000000..71cf64b
--- /dev/null
+++ b/src/liborcus/odf_token_constants.hpp
@@ -0,0 +1,21 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef __ORCUS_ODF_TOKEN_CONSTANTS_HPP__
+#define __ORCUS_ODF_TOKEN_CONSTANTS_HPP__
+
+#include "orcus/types.hpp"
+
+namespace orcus {
+
+#include "odf_token_constants.inl"
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/odf_token_constants.inl b/src/liborcus/odf_token_constants.inl
new file mode 100644
index 0000000..868e465
--- /dev/null
+++ b/src/liborcus/odf_token_constants.inl
@@ -0,0 +1,2280 @@
+// This file has been auto-generated. Do not hand-edit this.
+
+const xml_token_t XML_0 = 1;
+const xml_token_t XML_0deg = 2;
+const xml_token_t XML_0grad = 3;
+const xml_token_t XML_0rad = 4;
+const xml_token_t XML_1 = 5;
+const xml_token_t XML_1_3 = 6;
+const xml_token_t XML_100 = 7;
+const xml_token_t XML_2 = 8;
+const xml_token_t XML_200 = 9;
+const xml_token_t XML_3 = 10;
+const xml_token_t XML_300 = 11;
+const xml_token_t XML_3d = 12;
+const xml_token_t XML_400 = 13;
+const xml_token_t XML_500 = 14;
+const xml_token_t XML_600 = 15;
+const xml_token_t XML_700 = 16;
+const xml_token_t XML_800 = 17;
+const xml_token_t XML_900 = 18;
+const xml_token_t XML_A = 19;
+const xml_token_t XML_I = 20;
+const xml_token_t XML_ROC = 21;
+const xml_token_t XML__blank = 22;
+const xml_token_t XML__parent = 23;
+const xml_token_t XML__self = 24;
+const xml_token_t XML__top = 25;
+const xml_token_t XML_a = 26;
+const xml_token_t XML_about = 27;
+const xml_token_t XML_above = 28;
+const xml_token_t XML_accelerate = 29;
+const xml_token_t XML_accent = 30;
+const xml_token_t XML_accent_height = 31;
+const xml_token_t XML_acceptance_state = 32;
+const xml_token_t XML_accepted = 33;
+const xml_token_t XML_accumulate = 34;
+const xml_token_t XML_action = 35;
+const xml_token_t XML_active = 36;
+const xml_token_t XML_actuate = 37;
+const xml_token_t XML_add_empty_lines = 38;
+const xml_token_t XML_additional_column_statement = 39;
+const xml_token_t XML_additive = 40;
+const xml_token_t XML_address = 41;
+const xml_token_t XML_adjustment = 42;
+const xml_token_t XML_after_previous = 43;
+const xml_token_t XML_algorithm = 44;
+const xml_token_t XML_align = 45;
+const xml_token_t XML_all = 46;
+const xml_token_t XML_allow_deletes = 47;
+const xml_token_t XML_allow_empty_cell = 48;
+const xml_token_t XML_allow_inserts = 49;
+const xml_token_t XML_allow_updates = 50;
+const xml_token_t XML_alpha_numeric = 51;
+const xml_token_t XML_alphabetic = 52;
+const xml_token_t XML_alphabetical_index = 53;
+const xml_token_t XML_alphabetical_index_auto_mark_file = 54;
+const xml_token_t XML_alphabetical_index_entry_template = 55;
+const xml_token_t XML_alphabetical_index_mark = 56;
+const xml_token_t XML_alphabetical_index_mark_end = 57;
+const xml_token_t XML_alphabetical_index_mark_start = 58;
+const xml_token_t XML_alphabetical_index_source = 59;
+const xml_token_t XML_alphabetical_separators = 60;
+const xml_token_t XML_alternate = 61;
+const xml_token_t XML_always = 62;
+const xml_token_t XML_am_pm = 63;
+const xml_token_t XML_ambient_color = 64;
+const xml_token_t XML_anchor_page_number = 65;
+const xml_token_t XML_anchor_type = 66;
+const xml_token_t XML_angle = 67;
+const xml_token_t XML_angle_offset = 68;
+const xml_token_t XML_angled_connector_line = 69;
+const xml_token_t XML_angled_line = 70;
+const xml_token_t XML_anim = 71;
+const xml_token_t XML_animate = 72;
+const xml_token_t XML_animateColor = 73;
+const xml_token_t XML_animateMotion = 74;
+const xml_token_t XML_animateTransform = 75;
+const xml_token_t XML_animation = 76;
+const xml_token_t XML_animation_delay = 77;
+const xml_token_t XML_animation_direction = 78;
+const xml_token_t XML_animation_group = 79;
+const xml_token_t XML_animation_repeat = 80;
+const xml_token_t XML_animation_start_inside = 81;
+const xml_token_t XML_animation_steps = 82;
+const xml_token_t XML_animation_stop_inside = 83;
+const xml_token_t XML_animations = 84;
+const xml_token_t XML_annotation = 85;
+const xml_token_t XML_annotation_end = 86;
+const xml_token_t XML_annotations = 87;
+const xml_token_t XML_annote = 88;
+const xml_token_t XML_appear = 89;
+const xml_token_t XML_append_table_alias_name = 90;
+const xml_token_t XML_applet = 91;
+const xml_token_t XML_application_connection_settings = 92;
+const xml_token_t XML_application_data = 93;
+const xml_token_t XML_apply_command = 94;
+const xml_token_t XML_apply_design_mode = 95;
+const xml_token_t XML_apply_filter = 96;
+const xml_token_t XML_apply_style_name = 97;
+const xml_token_t XML_arc = 98;
+const xml_token_t XML_archive = 99;
+const xml_token_t XML_area = 100;
+const xml_token_t XML_area_circle = 101;
+const xml_token_t XML_area_polygon = 102;
+const xml_token_t XML_area_rectangle = 103;
+const xml_token_t XML_array = 104;
+const xml_token_t XML_arrow_down = 105;
+const xml_token_t XML_arrow_left = 106;
+const xml_token_t XML_arrow_right = 107;
+const xml_token_t XML_arrow_up = 108;
+const xml_token_t XML_article = 109;
+const xml_token_t XML_as_char = 110;
+const xml_token_t XML_as_template = 111;
+const xml_token_t XML_ascending = 112;
+const xml_token_t XML_ascent = 113;
+const xml_token_t XML_asian = 114;
+const xml_token_t XML_asterisk = 115;
+const xml_token_t XML_at_axis = 116;
+const xml_token_t XML_at_labels = 117;
+const xml_token_t XML_at_labels_and_axis = 118;
+const xml_token_t XML_attached_axis = 119;
+const xml_token_t XML_attractive = 120;
+const xml_token_t XML_attributeName = 121;
+const xml_token_t XML_audio = 122;
+const xml_token_t XML_audio_level = 123;
+const xml_token_t XML_author = 124;
+const xml_token_t XML_author_initials = 125;
+const xml_token_t XML_author_name = 126;
+const xml_token_t XML_auto = 127;
+const xml_token_t XML_auto_complete = 128;
+const xml_token_t XML_auto_create_new_frame = 129;
+const xml_token_t XML_auto_grow_height = 130;
+const xml_token_t XML_auto_grow_width = 131;
+const xml_token_t XML_auto_increment = 132;
+const xml_token_t XML_auto_position = 133;
+const xml_token_t XML_auto_reload = 134;
+const xml_token_t XML_auto_size = 135;
+const xml_token_t XML_auto_text_indent = 136;
+const xml_token_t XML_auto_update = 137;
+const xml_token_t XML_autoReverse = 138;
+const xml_token_t XML_automatic = 139;
+const xml_token_t XML_automatic_content = 140;
+const xml_token_t XML_automatic_find_labels = 141;
+const xml_token_t XML_automatic_focus = 142;
+const xml_token_t XML_automatic_order = 143;
+const xml_token_t XML_automatic_styles = 144;
+const xml_token_t XML_automatic_update = 145;
+const xml_token_t XML_average = 146;
+const xml_token_t XML_averaged_abscissa = 147;
+const xml_token_t XML_avoid_overlap = 148;
+const xml_token_t XML_axial = 149;
+const xml_token_t XML_axis = 150;
+const xml_token_t XML_axis_label_position = 151;
+const xml_token_t XML_axis_position = 152;
+const xml_token_t XML_b_spline = 153;
+const xml_token_t XML_back_scale = 154;
+const xml_token_t XML_backface_culling = 155;
+const xml_token_t XML_background = 156;
+const xml_token_t XML_background_color = 157;
+const xml_token_t XML_background_image = 158;
+const xml_token_t XML_background_objects_visible = 159;
+const xml_token_t XML_background_size = 160;
+const xml_token_t XML_background_transparency = 161;
+const xml_token_t XML_background_visible = 162;
+const xml_token_t XML_balanced = 163;
+const xml_token_t XML_base_cell_address = 164;
+const xml_token_t XML_base_dn = 165;
+const xml_token_t XML_base64Binary = 166;
+const xml_token_t XML_baseline = 167;
+const xml_token_t XML_bbox = 168;
+const xml_token_t XML_begin = 169;
+const xml_token_t XML_below = 170;
+const xml_token_t XML_bevel = 171;
+const xml_token_t XML_bibliography = 172;
+const xml_token_t XML_bibliography_configuration = 173;
+const xml_token_t XML_bibliography_data_field = 174;
+const xml_token_t XML_bibliography_entry_template = 175;
+const xml_token_t XML_bibliography_mark = 176;
+const xml_token_t XML_bibliography_source = 177;
+const xml_token_t XML_bibliography_type = 178;
+const xml_token_t XML_biggest = 179;
+const xml_token_t XML_bigint = 180;
+const xml_token_t XML_binary = 181;
+const xml_token_t XML_binary_data = 182;
+const xml_token_t XML_bind = 183;
+const xml_token_t XML_bind_styles_to_content = 184;
+const xml_token_t XML_bit = 185;
+const xml_token_t XML_bitmap = 186;
+const xml_token_t XML_blend = 187;
+const xml_token_t XML_blob = 188;
+const xml_token_t XML_blue = 189;
+const xml_token_t XML_body = 190;
+const xml_token_t XML_bold = 191;
+const xml_token_t XML_book = 192;
+const xml_token_t XML_booklet = 193;
+const xml_token_t XML_bookmark = 194;
+const xml_token_t XML_bookmark_end = 195;
+const xml_token_t XML_bookmark_start = 196;
+const xml_token_t XML_booktitle = 197;
+const xml_token_t XML_boolean = 198;
+const xml_token_t XML_boolean_comparison_mode = 199;
+const xml_token_t XML_boolean_style = 200;
+const xml_token_t XML_boolean_value = 201;
+const xml_token_t XML_border = 202;
+const xml_token_t XML_border_bottom = 203;
+const xml_token_t XML_border_color = 204;
+const xml_token_t XML_border_left = 205;
+const xml_token_t XML_border_line_width = 206;
+const xml_token_t XML_border_line_width_bottom = 207;
+const xml_token_t XML_border_line_width_left = 208;
+const xml_token_t XML_border_line_width_right = 209;
+const xml_token_t XML_border_line_width_top = 210;
+const xml_token_t XML_border_model = 211;
+const xml_token_t XML_border_right = 212;
+const xml_token_t XML_border_top = 213;
+const xml_token_t XML_both = 214;
+const xml_token_t XML_bottom = 215;
+const xml_token_t XML_bottom_end = 216;
+const xml_token_t XML_bottom_left = 217;
+const xml_token_t XML_bottom_right = 218;
+const xml_token_t XML_bottom_start = 219;
+const xml_token_t XML_bound_column = 220;
+const xml_token_t XML_bow_tie = 221;
+const xml_token_t XML_break_after = 222;
+const xml_token_t XML_break_before = 223;
+const xml_token_t XML_buddhist = 224;
+const xml_token_t XML_bullet_char = 225;
+const xml_token_t XML_bullet_relative_size = 226;
+const xml_token_t XML_butt = 227;
+const xml_token_t XML_button = 228;
+const xml_token_t XML_button_type = 229;
+const xml_token_t XML_buttons = 230;
+const xml_token_t XML_by = 231;
+const xml_token_t XML_c = 232;
+const xml_token_t XML_calcMode = 233;
+const xml_token_t XML_calculation_settings = 234;
+const xml_token_t XML_calendar = 235;
+const xml_token_t XML_cap_height = 236;
+const xml_token_t XML_capitalize = 237;
+const xml_token_t XML_capitalize_entries = 238;
+const xml_token_t XML_caption = 239;
+const xml_token_t XML_caption_angle = 240;
+const xml_token_t XML_caption_angle_type = 241;
+const xml_token_t XML_caption_escape = 242;
+const xml_token_t XML_caption_escape_direction = 243;
+const xml_token_t XML_caption_fit_line_length = 244;
+const xml_token_t XML_caption_gap = 245;
+const xml_token_t XML_caption_id = 246;
+const xml_token_t XML_caption_line_length = 247;
+const xml_token_t XML_caption_point_x = 248;
+const xml_token_t XML_caption_point_y = 249;
+const xml_token_t XML_caption_sequence_format = 250;
+const xml_token_t XML_caption_sequence_name = 251;
+const xml_token_t XML_caption_type = 252;
+const xml_token_t XML_cascade = 253;
+const xml_token_t XML_case_sensitive = 254;
+const xml_token_t XML_catalog_name = 255;
+const xml_token_t XML_categories = 256;
+const xml_token_t XML_category_and_value = 257;
+const xml_token_t XML_cell_address = 258;
+const xml_token_t XML_cell_content_change = 259;
+const xml_token_t XML_cell_content_deletion = 260;
+const xml_token_t XML_cell_count = 261;
+const xml_token_t XML_cell_protect = 262;
+const xml_token_t XML_cell_range = 263;
+const xml_token_t XML_cell_range_address = 264;
+const xml_token_t XML_cell_range_source = 265;
+const xml_token_t XML_center = 266;
+const xml_token_t XML_central = 267;
+const xml_token_t XML_chain_next_name = 268;
+const xml_token_t XML_change = 269;
+const xml_token_t XML_change_deletion = 270;
+const xml_token_t XML_change_end = 271;
+const xml_token_t XML_change_id = 272;
+const xml_token_t XML_change_info = 273;
+const xml_token_t XML_change_start = 274;
+const xml_token_t XML_change_track_table_cell = 275;
+const xml_token_t XML_changed_region = 276;
+const xml_token_t XML_chapter = 277;
+const xml_token_t XML_char = 278;
+const xml_token_t XML_character_count = 279;
+const xml_token_t XML_character_set = 280;
+const xml_token_t XML_chart = 281;
+const xml_token_t XML_chart_properties = 282;
+const xml_token_t XML_charts = 283;
+const xml_token_t XML_checkbox = 284;
+const xml_token_t XML_checked = 285;
+const xml_token_t XML_checkerboard = 286;
+const xml_token_t XML_circle = 287;
+const xml_token_t XML_citation_body_style_name = 288;
+const xml_token_t XML_citation_style_name = 289;
+const xml_token_t XML_class = 290;
+const xml_token_t XML_class_id = 291;
+const xml_token_t XML_class_names = 292;
+const xml_token_t XML_clip = 293;
+const xml_token_t XML_clob = 294;
+const xml_token_t XML_clockwise = 295;
+const xml_token_t XML_close = 296;
+const xml_token_t XML_close_back = 297;
+const xml_token_t XML_close_front = 298;
+const xml_token_t XML_close_horizontal = 299;
+const xml_token_t XML_close_vertical = 300;
+const xml_token_t XML_cm = 301;
+const xml_token_t XML_code = 302;
+const xml_token_t XML_collapse = 303;
+const xml_token_t XML_collapsing = 304;
+const xml_token_t XML_color = 305;
+const xml_token_t XML_color_interpolation = 306;
+const xml_token_t XML_color_interpolation_direction = 307;
+const xml_token_t XML_color_inversion = 308;
+const xml_token_t XML_color_mode = 309;
+const xml_token_t XML_column = 310;
+const xml_token_t XML_column_count = 311;
+const xml_token_t XML_column_definition = 312;
+const xml_token_t XML_column_definitions = 313;
+const xml_token_t XML_column_gap = 314;
+const xml_token_t XML_column_mapping = 315;
+const xml_token_t XML_column_name = 316;
+const xml_token_t XML_column_percentage = 317;
+const xml_token_t XML_column_sep = 318;
+const xml_token_t XML_column_width = 319;
+const xml_token_t XML_columns = 320;
+const xml_token_t XML_combine_entries = 321;
+const xml_token_t XML_combine_entries_with_dash = 322;
+const xml_token_t XML_combine_entries_with_pp = 323;
+const xml_token_t XML_combobox = 324;
+const xml_token_t XML_comma_separated = 325;
+const xml_token_t XML_command = 326;
+const xml_token_t XML_command_type = 327;
+const xml_token_t XML_comment = 328;
+const xml_token_t XML_complex = 329;
+const xml_token_t XML_component = 330;
+const xml_token_t XML_component_collection = 331;
+const xml_token_t XML_concave = 332;
+const xml_token_t XML_concentric_gradient_fill_allowed = 333;
+const xml_token_t XML_cond_style_name = 334;
+const xml_token_t XML_condensed = 335;
+const xml_token_t XML_condition = 336;
+const xml_token_t XML_condition_source = 337;
+const xml_token_t XML_condition_source_range_address = 338;
+const xml_token_t XML_conditional_text = 339;
+const xml_token_t XML_cone = 340;
+const xml_token_t XML_conference = 341;
+const xml_token_t XML_config = 342;
+const xml_token_t XML_config_item = 343;
+const xml_token_t XML_config_item_map_entry = 344;
+const xml_token_t XML_config_item_map_indexed = 345;
+const xml_token_t XML_config_item_map_named = 346;
+const xml_token_t XML_config_item_set = 347;
+const xml_token_t XML_connect_bars = 348;
+const xml_token_t XML_connection_data = 349;
+const xml_token_t XML_connection_name = 350;
+const xml_token_t XML_connection_resource = 351;
+const xml_token_t XML_connector = 352;
+const xml_token_t XML_consecutive_numbering = 353;
+const xml_token_t XML_consolidation = 354;
+const xml_token_t XML_constant = 355;
+const xml_token_t XML_contains_error = 356;
+const xml_token_t XML_contains_header = 357;
+const xml_token_t XML_content = 358;
+const xml_token_t XML_content_validation = 359;
+const xml_token_t XML_content_validation_name = 360;
+const xml_token_t XML_content_validations = 361;
+const xml_token_t XML_contextual_spacing = 362;
+const xml_token_t XML_continue = 363;
+const xml_token_t XML_continue_list = 364;
+const xml_token_t XML_continue_numbering = 365;
+const xml_token_t XML_continuous = 366;
+const xml_token_t XML_contour_path = 367;
+const xml_token_t XML_contour_polygon = 368;
+const xml_token_t XML_contrast = 369;
+const xml_token_t XML_control = 370;
+const xml_token_t XML_control_implementation = 371;
+const xml_token_t XML_conversion_mode = 372;
+const xml_token_t XML_convert_empty_to_null = 373;
+const xml_token_t XML_coordinate_region = 374;
+const xml_token_t XML_copy_all = 375;
+const xml_token_t XML_copy_back = 376;
+const xml_token_t XML_copy_formulas = 377;
+const xml_token_t XML_copy_of = 378;
+const xml_token_t XML_copy_outline_levels = 379;
+const xml_token_t XML_copy_results_only = 380;
+const xml_token_t XML_copy_styles = 381;
+const xml_token_t XML_corner_radius = 382;
+const xml_token_t XML_corners = 383;
+const xml_token_t XML_correct = 384;
+const xml_token_t XML_count = 385;
+const xml_token_t XML_count_empty_lines = 386;
+const xml_token_t XML_count_in_text_boxes = 387;
+const xml_token_t XML_counter_clockwise = 388;
+const xml_token_t XML_counterclockwise = 389;
+const xml_token_t XML_countnums = 390;
+const xml_token_t XML_country = 391;
+const xml_token_t XML_country_asian = 392;
+const xml_token_t XML_country_complex = 393;
+const xml_token_t XML_covered_table_cell = 394;
+const xml_token_t XML_creation_date = 395;
+const xml_token_t XML_creation_time = 396;
+const xml_token_t XML_creator = 397;
+const xml_token_t XML_creator_initials = 398;
+const xml_token_t XML_cube = 399;
+const xml_token_t XML_cubic_spline = 400;
+const xml_token_t XML_cuboid = 401;
+const xml_token_t XML_currency = 402;
+const xml_token_t XML_currency_style = 403;
+const xml_token_t XML_currency_symbol = 404;
+const xml_token_t XML_current = 405;
+const xml_token_t XML_current_date = 406;
+const xml_token_t XML_current_selected = 407;
+const xml_token_t XML_current_state = 408;
+const xml_token_t XML_current_value = 409;
+const xml_token_t XML_curve = 410;
+const xml_token_t XML_custom = 411;
+const xml_token_t XML_custom_shape = 412;
+const xml_token_t XML_custom1 = 413;
+const xml_token_t XML_custom2 = 414;
+const xml_token_t XML_custom3 = 415;
+const xml_token_t XML_custom4 = 416;
+const xml_token_t XML_custom5 = 417;
+const xml_token_t XML_cut = 418;
+const xml_token_t XML_cut_offs = 419;
+const xml_token_t XML_cx = 420;
+const xml_token_t XML_cy = 421;
+const xml_token_t XML_cylinder = 422;
+const xml_token_t XML_d = 423;
+const xml_token_t XML_dash = 424;
+const xml_token_t XML_dashed = 425;
+const xml_token_t XML_data = 426;
+const xml_token_t XML_data_cell_range_address = 427;
+const xml_token_t XML_data_field = 428;
+const xml_token_t XML_data_label = 429;
+const xml_token_t XML_data_label_number = 430;
+const xml_token_t XML_data_label_series = 431;
+const xml_token_t XML_data_label_symbol = 432;
+const xml_token_t XML_data_label_text = 433;
+const xml_token_t XML_data_pilot_display_info = 434;
+const xml_token_t XML_data_pilot_field = 435;
+const xml_token_t XML_data_pilot_field_reference = 436;
+const xml_token_t XML_data_pilot_group = 437;
+const xml_token_t XML_data_pilot_group_member = 438;
+const xml_token_t XML_data_pilot_groups = 439;
+const xml_token_t XML_data_pilot_layout_info = 440;
+const xml_token_t XML_data_pilot_level = 441;
+const xml_token_t XML_data_pilot_member = 442;
+const xml_token_t XML_data_pilot_members = 443;
+const xml_token_t XML_data_pilot_sort_info = 444;
+const xml_token_t XML_data_pilot_subtotal = 445;
+const xml_token_t XML_data_pilot_subtotals = 446;
+const xml_token_t XML_data_pilot_table = 447;
+const xml_token_t XML_data_pilot_tables = 448;
+const xml_token_t XML_data_point = 449;
+const xml_token_t XML_data_source = 450;
+const xml_token_t XML_data_source_has_labels = 451;
+const xml_token_t XML_data_source_setting = 452;
+const xml_token_t XML_data_source_setting_is_list = 453;
+const xml_token_t XML_data_source_setting_name = 454;
+const xml_token_t XML_data_source_setting_type = 455;
+const xml_token_t XML_data_source_setting_value = 456;
+const xml_token_t XML_data_source_settings = 457;
+const xml_token_t XML_data_style_name = 458;
+const xml_token_t XML_data_type = 459;
+const xml_token_t XML_database = 460;
+const xml_token_t XML_database_description = 461;
+const xml_token_t XML_database_display = 462;
+const xml_token_t XML_database_name = 463;
+const xml_token_t XML_database_next = 464;
+const xml_token_t XML_database_range = 465;
+const xml_token_t XML_database_ranges = 466;
+const xml_token_t XML_database_row_number = 467;
+const xml_token_t XML_database_row_select = 468;
+const xml_token_t XML_database_source_query = 469;
+const xml_token_t XML_database_source_sql = 470;
+const xml_token_t XML_database_source_table = 471;
+const xml_token_t XML_database_table_name = 472;
+const xml_token_t XML_datasource = 473;
+const xml_token_t XML_datatype = 474;
+const xml_token_t XML_date = 475;
+const xml_token_t XML_date_adjust = 476;
+const xml_token_t XML_date_end = 477;
+const xml_token_t XML_date_start = 478;
+const xml_token_t XML_date_string = 479;
+const xml_token_t XML_date_style = 480;
+const xml_token_t XML_date_time = 481;
+const xml_token_t XML_date_time_decl = 482;
+const xml_token_t XML_date_value = 483;
+const xml_token_t XML_datetime = 484;
+const xml_token_t XML_day = 485;
+const xml_token_t XML_day_of_week = 486;
+const xml_token_t XML_days = 487;
+const xml_token_t XML_db = 488;
+const xml_token_t XML_dc = 489;
+const xml_token_t XML_dde_application = 490;
+const xml_token_t XML_dde_connection = 491;
+const xml_token_t XML_dde_connection_decl = 492;
+const xml_token_t XML_dde_connection_decls = 493;
+const xml_token_t XML_dde_item = 494;
+const xml_token_t XML_dde_link = 495;
+const xml_token_t XML_dde_links = 496;
+const xml_token_t XML_dde_source = 497;
+const xml_token_t XML_dde_topic = 498;
+const xml_token_t XML_decelerate = 499;
+const xml_token_t XML_decimal = 500;
+const xml_token_t XML_decimal_places = 501;
+const xml_token_t XML_decimal_replacement = 502;
+const xml_token_t XML_decorative = 503;
+const xml_token_t XML_deep = 504;
+const xml_token_t XML_default = 505;
+const xml_token_t XML_default_button = 506;
+const xml_token_t XML_default_cell_style_name = 507;
+const xml_token_t XML_default_outline_level = 508;
+const xml_token_t XML_default_page_layout = 509;
+const xml_token_t XML_default_row_style_name = 510;
+const xml_token_t XML_default_style = 511;
+const xml_token_t XML_default_style_name = 512;
+const xml_token_t XML_definition_src = 513;
+const xml_token_t XML_delay = 514;
+const xml_token_t XML_delay_for_repeat = 515;
+const xml_token_t XML_delete_rule = 516;
+const xml_token_t XML_deletion = 517;
+const xml_token_t XML_deletions = 518;
+const xml_token_t XML_delimiter = 519;
+const xml_token_t XML_denominator_value = 520;
+const xml_token_t XML_dependencies = 521;
+const xml_token_t XML_dependency = 522;
+const xml_token_t XML_depth = 523;
+const xml_token_t XML_desc = 524;
+const xml_token_t XML_descending = 525;
+const xml_token_t XML_descent = 526;
+const xml_token_t XML_description = 527;
+const xml_token_t XML_detail_fields = 528;
+const xml_token_t XML_detective = 529;
+const xml_token_t XML_diagonal_bl_tr = 530;
+const xml_token_t XML_diagonal_bl_tr_widths = 531;
+const xml_token_t XML_diagonal_tl_br = 532;
+const xml_token_t XML_diagonal_tl_br_widths = 533;
+const xml_token_t XML_diamond = 534;
+const xml_token_t XML_diffuse_color = 535;
+const xml_token_t XML_dim = 536;
+const xml_token_t XML_dimension = 537;
+const xml_token_t XML_direction = 538;
+const xml_token_t XML_disable = 539;
+const xml_token_t XML_disabled = 540;
+const xml_token_t XML_disc = 541;
+const xml_token_t XML_discrete = 542;
+const xml_token_t XML_display = 543;
+const xml_token_t XML_display_border = 544;
+const xml_token_t XML_display_date_time = 545;
+const xml_token_t XML_display_duplicates = 546;
+const xml_token_t XML_display_equation = 547;
+const xml_token_t XML_display_factor = 548;
+const xml_token_t XML_display_filter_buttons = 549;
+const xml_token_t XML_display_footer = 550;
+const xml_token_t XML_display_header = 551;
+const xml_token_t XML_display_label = 552;
+const xml_token_t XML_display_levels = 553;
+const xml_token_t XML_display_list = 554;
+const xml_token_t XML_display_member_mode = 555;
+const xml_token_t XML_display_name = 556;
+const xml_token_t XML_display_outline_level = 557;
+const xml_token_t XML_display_page_number = 558;
+const xml_token_t XML_display_r_square = 559;
+const xml_token_t XML_dissolve = 560;
+const xml_token_t XML_distance = 561;
+const xml_token_t XML_distance_after_sep = 562;
+const xml_token_t XML_distance_before_sep = 563;
+const xml_token_t XML_distinct = 564;
+const xml_token_t XML_distribute_letter = 565;
+const xml_token_t XML_distribute_space = 566;
+const xml_token_t XML_document = 567;
+const xml_token_t XML_document_content = 568;
+const xml_token_t XML_document_meta = 569;
+const xml_token_t XML_document_settings = 570;
+const xml_token_t XML_document_statistic = 571;
+const xml_token_t XML_document_styles = 572;
+const xml_token_t XML_domain = 573;
+const xml_token_t XML_dont_balance_text_columns = 574;
+const xml_token_t XML_dot = 575;
+const xml_token_t XML_dot_dash = 576;
+const xml_token_t XML_dot_dashed = 577;
+const xml_token_t XML_dot_dot_dash = 578;
+const xml_token_t XML_dots1 = 579;
+const xml_token_t XML_dots1_length = 580;
+const xml_token_t XML_dots2 = 581;
+const xml_token_t XML_dots2_length = 582;
+const xml_token_t XML_dotted = 583;
+const xml_token_t XML_double = 584;
+const xml_token_t XML_double_sided = 585;
+const xml_token_t XML_down = 586;
+const xml_token_t XML_dr3d = 587;
+const xml_token_t XML_draft = 588;
+const xml_token_t XML_draw = 589;
+const xml_token_t XML_draw_aspect = 590;
+const xml_token_t XML_draw_count = 591;
+const xml_token_t XML_drawing = 592;
+const xml_token_t XML_drawing_page = 593;
+const xml_token_t XML_drawing_page_properties = 594;
+const xml_token_t XML_drawings = 595;
+const xml_token_t XML_drill_down_on_double_click = 596;
+const xml_token_t XML_driver_settings = 597;
+const xml_token_t XML_drop_cap = 598;
+const xml_token_t XML_drop_down = 599;
+const xml_token_t XML_dropdown = 600;
+const xml_token_t XML_dur = 601;
+const xml_token_t XML_duration = 602;
+const xml_token_t XML_dynamic = 603;
+const xml_token_t XML_dynamic_spacing = 604;
+const xml_token_t XML_echo_char = 605;
+const xml_token_t XML_edge_rounding = 606;
+const xml_token_t XML_edge_rounding_mode = 607;
+const xml_token_t XML_editable = 608;
+const xml_token_t XML_editing_cycles = 609;
+const xml_token_t XML_editing_duration = 610;
+const xml_token_t XML_edition = 611;
+const xml_token_t XML_editor = 612;
+const xml_token_t XML_effect = 613;
+const xml_token_t XML_ellipse = 614;
+const xml_token_t XML_ellipsoid = 615;
+const xml_token_t XML_email = 616;
+const xml_token_t XML_embed = 617;
+const xml_token_t XML_embedded_number_behavior = 618;
+const xml_token_t XML_embedded_text = 619;
+const xml_token_t XML_embossed = 620;
+const xml_token_t XML_emissive_color = 621;
+const xml_token_t XML_emphasis = 622;
+const xml_token_t XML_enable = 623;
+const xml_token_t XML_enable_sql92_check = 624;
+const xml_token_t XML_enabled = 625;
+const xml_token_t XML_encoding = 626;
+const xml_token_t XML_enctype = 627;
+const xml_token_t XML_end = 628;
+const xml_token_t XML_end_angle = 629;
+const xml_token_t XML_end_cell_address = 630;
+const xml_token_t XML_end_color = 631;
+const xml_token_t XML_end_column = 632;
+const xml_token_t XML_end_glue_point = 633;
+const xml_token_t XML_end_guide = 634;
+const xml_token_t XML_end_indent = 635;
+const xml_token_t XML_end_intensity = 636;
+const xml_token_t XML_end_line_spacing_horizontal = 637;
+const xml_token_t XML_end_line_spacing_vertical = 638;
+const xml_token_t XML_end_position = 639;
+const xml_token_t XML_end_row = 640;
+const xml_token_t XML_end_shape = 641;
+const xml_token_t XML_end_table = 642;
+const xml_token_t XML_end_x = 643;
+const xml_token_t XML_end_y = 644;
+const xml_token_t XML_endless = 645;
+const xml_token_t XML_endnote = 646;
+const xml_token_t XML_endsync = 647;
+const xml_token_t XML_engine = 648;
+const xml_token_t XML_engraved = 649;
+const xml_token_t XML_enhanced_geometry = 650;
+const xml_token_t XML_enhanced_path = 651;
+const xml_token_t XML_entrance = 652;
+const xml_token_t XML_equal_boolean = 653;
+const xml_token_t XML_equal_integer = 654;
+const xml_token_t XML_equal_use_only_zero = 655;
+const xml_token_t XML_equation = 656;
+const xml_token_t XML_era = 657;
+const xml_token_t XML_error_category = 658;
+const xml_token_t XML_error_indicator = 659;
+const xml_token_t XML_error_lower_indicator = 660;
+const xml_token_t XML_error_lower_limit = 661;
+const xml_token_t XML_error_lower_range = 662;
+const xml_token_t XML_error_macro = 663;
+const xml_token_t XML_error_margin = 664;
+const xml_token_t XML_error_message = 665;
+const xml_token_t XML_error_percentage = 666;
+const xml_token_t XML_error_upper_indicator = 667;
+const xml_token_t XML_error_upper_limit = 668;
+const xml_token_t XML_error_upper_range = 669;
+const xml_token_t XML_escape_direction = 670;
+const xml_token_t XML_escape_processing = 671;
+const xml_token_t XML_even_columns = 672;
+const xml_token_t XML_even_rows = 673;
+const xml_token_t XML_evenodd = 674;
+const xml_token_t XML_event_listener = 675;
+const xml_token_t XML_event_listeners = 676;
+const xml_token_t XML_event_name = 677;
+const xml_token_t XML_execute = 678;
+const xml_token_t XML_execute_macro = 679;
+const xml_token_t XML_exit = 680;
+const xml_token_t XML_expanded = 681;
+const xml_token_t XML_exponent_interval = 682;
+const xml_token_t XML_exponential = 683;
+const xml_token_t XML_expression = 684;
+const xml_token_t XML_extension = 685;
+const xml_token_t XML_extra_condensed = 686;
+const xml_token_t XML_extra_expanded = 687;
+const xml_token_t XML_extrude = 688;
+const xml_token_t XML_extrusion = 689;
+const xml_token_t XML_extrusion_allowed = 690;
+const xml_token_t XML_extrusion_brightness = 691;
+const xml_token_t XML_extrusion_color = 692;
+const xml_token_t XML_extrusion_depth = 693;
+const xml_token_t XML_extrusion_diffusion = 694;
+const xml_token_t XML_extrusion_first_light_direction = 695;
+const xml_token_t XML_extrusion_first_light_harsh = 696;
+const xml_token_t XML_extrusion_first_light_level = 697;
+const xml_token_t XML_extrusion_light_face = 698;
+const xml_token_t XML_extrusion_metal = 699;
+const xml_token_t XML_extrusion_number_of_line_segments = 700;
+const xml_token_t XML_extrusion_origin = 701;
+const xml_token_t XML_extrusion_rotation_angle = 702;
+const xml_token_t XML_extrusion_rotation_center = 703;
+const xml_token_t XML_extrusion_second_light_direction = 704;
+const xml_token_t XML_extrusion_second_light_harsh = 705;
+const xml_token_t XML_extrusion_second_light_level = 706;
+const xml_token_t XML_extrusion_shininess = 707;
+const xml_token_t XML_extrusion_skew = 708;
+const xml_token_t XML_extrusion_specularity = 709;
+const xml_token_t XML_extrusion_viewpoint = 710;
+const xml_token_t XML_fade = 711;
+const xml_token_t XML_fade_from_bottom = 712;
+const xml_token_t XML_fade_from_center = 713;
+const xml_token_t XML_fade_from_left = 714;
+const xml_token_t XML_fade_from_lowerleft = 715;
+const xml_token_t XML_fade_from_lowerright = 716;
+const xml_token_t XML_fade_from_right = 717;
+const xml_token_t XML_fade_from_top = 718;
+const xml_token_t XML_fade_from_upperleft = 719;
+const xml_token_t XML_fade_from_upperright = 720;
+const xml_token_t XML_fade_out = 721;
+const xml_token_t XML_fade_to_center = 722;
+const xml_token_t XML_fadeColor = 723;
+const xml_token_t XML_false = 724;
+const xml_token_t XML_family = 725;
+const xml_token_t XML_fast = 726;
+const xml_token_t XML_field = 727;
+const xml_token_t XML_field_name = 728;
+const xml_token_t XML_field_number = 729;
+const xml_token_t XML_file = 730;
+const xml_token_t XML_file_based_database = 731;
+const xml_token_t XML_file_name = 732;
+const xml_token_t XML_fill = 733;
+const xml_token_t XML_fill_character = 734;
+const xml_token_t XML_fill_color = 735;
+const xml_token_t XML_fill_gradient_name = 736;
+const xml_token_t XML_fill_hatch_name = 737;
+const xml_token_t XML_fill_hatch_solid = 738;
+const xml_token_t XML_fill_image = 739;
+const xml_token_t XML_fill_image_height = 740;
+const xml_token_t XML_fill_image_name = 741;
+const xml_token_t XML_fill_image_ref_point = 742;
+const xml_token_t XML_fill_image_ref_point_x = 743;
+const xml_token_t XML_fill_image_ref_point_y = 744;
+const xml_token_t XML_fill_image_width = 745;
+const xml_token_t XML_fill_rule = 746;
+const xml_token_t XML_fillDefault = 747;
+const xml_token_t XML_filter = 748;
+const xml_token_t XML_filter_and = 749;
+const xml_token_t XML_filter_condition = 750;
+const xml_token_t XML_filter_name = 751;
+const xml_token_t XML_filter_options = 752;
+const xml_token_t XML_filter_or = 753;
+const xml_token_t XML_filter_set_item = 754;
+const xml_token_t XML_filter_statement = 755;
+const xml_token_t XML_first = 756;
+const xml_token_t XML_first_column = 757;
+const xml_token_t XML_first_page = 758;
+const xml_token_t XML_first_page_number = 759;
+const xml_token_t XML_first_row = 760;
+const xml_token_t XML_first_row_end_column = 761;
+const xml_token_t XML_first_row_start_column = 762;
+const xml_token_t XML_fit_to_contour = 763;
+const xml_token_t XML_fit_to_size = 764;
+const xml_token_t XML_fix = 765;
+const xml_token_t XML_fixed = 766;
+const xml_token_t XML_fixed_text = 767;
+const xml_token_t XML_flat = 768;
+const xml_token_t XML_float = 769;
+const xml_token_t XML_floating_frame = 770;
+const xml_token_t XML_floor = 771;
+const xml_token_t XML_flow_with_text = 772;
+const xml_token_t XML_fly_away = 773;
+const xml_token_t XML_fo = 774;
+const xml_token_t XML_focal_length = 775;
+const xml_token_t XML_focus_on_click = 776;
+const xml_token_t XML_font_adornments = 777;
+const xml_token_t XML_font_charset = 778;
+const xml_token_t XML_font_charset_asian = 779;
+const xml_token_t XML_font_charset_complex = 780;
+const xml_token_t XML_font_color = 781;
+const xml_token_t XML_font_face = 782;
+const xml_token_t XML_font_face_decls = 783;
+const xml_token_t XML_font_face_format = 784;
+const xml_token_t XML_font_face_name = 785;
+const xml_token_t XML_font_face_src = 786;
+const xml_token_t XML_font_face_uri = 787;
+const xml_token_t XML_font_family = 788;
+const xml_token_t XML_font_family_asian = 789;
+const xml_token_t XML_font_family_complex = 790;
+const xml_token_t XML_font_family_generic = 791;
+const xml_token_t XML_font_family_generic_asian = 792;
+const xml_token_t XML_font_family_generic_complex = 793;
+const xml_token_t XML_font_independent_line_spacing = 794;
+const xml_token_t XML_font_name = 795;
+const xml_token_t XML_font_name_asian = 796;
+const xml_token_t XML_font_name_complex = 797;
+const xml_token_t XML_font_pitch = 798;
+const xml_token_t XML_font_pitch_asian = 799;
+const xml_token_t XML_font_pitch_complex = 800;
+const xml_token_t XML_font_relief = 801;
+const xml_token_t XML_font_size = 802;
+const xml_token_t XML_font_size_asian = 803;
+const xml_token_t XML_font_size_complex = 804;
+const xml_token_t XML_font_size_rel = 805;
+const xml_token_t XML_font_size_rel_asian = 806;
+const xml_token_t XML_font_size_rel_complex = 807;
+const xml_token_t XML_font_stretch = 808;
+const xml_token_t XML_font_style = 809;
+const xml_token_t XML_font_style_asian = 810;
+const xml_token_t XML_font_style_complex = 811;
+const xml_token_t XML_font_style_name = 812;
+const xml_token_t XML_font_style_name_asian = 813;
+const xml_token_t XML_font_style_name_complex = 814;
+const xml_token_t XML_font_variant = 815;
+const xml_token_t XML_font_weight = 816;
+const xml_token_t XML_font_weight_asian = 817;
+const xml_token_t XML_font_weight_complex = 818;
+const xml_token_t XML_footer = 819;
+const xml_token_t XML_footer_decl = 820;
+const xml_token_t XML_footer_first = 821;
+const xml_token_t XML_footer_left = 822;
+const xml_token_t XML_footer_style = 823;
+const xml_token_t XML_footnote = 824;
+const xml_token_t XML_footnote_max_height = 825;
+const xml_token_t XML_footnote_sep = 826;
+const xml_token_t XML_footnotes_position = 827;
+const xml_token_t XML_for = 828;
+const xml_token_t XML_force_manual = 829;
+const xml_token_t XML_forced_exponent_sign = 830;
+const xml_token_t XML_foreground = 831;
+const xml_token_t XML_foreign = 832;
+const xml_token_t XML_form = 833;
+const xml_token_t XML_format_change = 834;
+const xml_token_t XML_format_source = 835;
+const xml_token_t XML_formatted_text = 836;
+const xml_token_t XML_forms = 837;
+const xml_token_t XML_formula = 838;
+const xml_token_t XML_formula_hidden = 839;
+const xml_token_t XML_formulas = 840;
+const xml_token_t XML_forward = 841;
+const xml_token_t XML_fraction = 842;
+const xml_token_t XML_frame = 843;
+const xml_token_t XML_frame_content = 844;
+const xml_token_t XML_frame_count = 845;
+const xml_token_t XML_frame_display_border = 846;
+const xml_token_t XML_frame_display_scrollbar = 847;
+const xml_token_t XML_frame_end_margin = 848;
+const xml_token_t XML_frame_margin_horizontal = 849;
+const xml_token_t XML_frame_margin_vertical = 850;
+const xml_token_t XML_frame_name = 851;
+const xml_token_t XML_frame_start_margin = 852;
+const xml_token_t XML_free = 853;
+const xml_token_t XML_freeze = 854;
+const xml_token_t XML_from = 855;
+const xml_token_t XML_from_another_table = 856;
+const xml_token_t XML_from_bottom = 857;
+const xml_token_t XML_from_center = 858;
+const xml_token_t XML_from_inside = 859;
+const xml_token_t XML_from_left = 860;
+const xml_token_t XML_from_lower_left = 861;
+const xml_token_t XML_from_lower_right = 862;
+const xml_token_t XML_from_right = 863;
+const xml_token_t XML_from_same_table = 864;
+const xml_token_t XML_from_top = 865;
+const xml_token_t XML_from_upper_left = 866;
+const xml_token_t XML_from_upper_right = 867;
+const xml_token_t XML_ft = 868;
+const xml_token_t XML_full = 869;
+const xml_token_t XML_full_screen = 870;
+const xml_token_t XML_function = 871;
+const xml_token_t XML_fx = 872;
+const xml_token_t XML_fy = 873;
+const xml_token_t XML_g = 874;
+const xml_token_t XML_gamma = 875;
+const xml_token_t XML_gap = 876;
+const xml_token_t XML_gap_width = 877;
+const xml_token_t XML_generator = 878;
+const xml_token_t XML_generic_control = 879;
+const xml_token_t XML_gengou = 880;
+const xml_token_t XML_get = 881;
+const xml_token_t XML_global = 882;
+const xml_token_t XML_glue_point = 883;
+const xml_token_t XML_glue_point_leaving_directions = 884;
+const xml_token_t XML_glue_point_type = 885;
+const xml_token_t XML_glue_points = 886;
+const xml_token_t XML_glyph_orientation_vertical = 887;
+const xml_token_t XML_gouraud = 888;
+const xml_token_t XML_gradient = 889;
+const xml_token_t XML_gradient_step_count = 890;
+const xml_token_t XML_gradientTransform = 891;
+const xml_token_t XML_gradientUnits = 892;
+const xml_token_t XML_grand_total = 893;
+const xml_token_t XML_graphic = 894;
+const xml_token_t XML_graphic_properties = 895;
+const xml_token_t XML_grddl = 896;
+const xml_token_t XML_green = 897;
+const xml_token_t XML_gregorian = 898;
+const xml_token_t XML_greyscale = 899;
+const xml_token_t XML_grid = 900;
+const xml_token_t XML_group_bars_per_axis = 901;
+const xml_token_t XML_group_by_field_number = 902;
+const xml_token_t XML_group_id = 903;
+const xml_token_t XML_grouped_by = 904;
+const xml_token_t XML_grouping = 905;
+const xml_token_t XML_guide_distance = 906;
+const xml_token_t XML_guide_overhang = 907;
+const xml_token_t XML_h = 908;
+const xml_token_t XML_handle = 909;
+const xml_token_t XML_handle_mirror_horizontal = 910;
+const xml_token_t XML_handle_mirror_vertical = 911;
+const xml_token_t XML_handle_polar = 912;
+const xml_token_t XML_handle_position = 913;
+const xml_token_t XML_handle_radius_range_maximum = 914;
+const xml_token_t XML_handle_radius_range_minimum = 915;
+const xml_token_t XML_handle_range_x_maximum = 916;
+const xml_token_t XML_handle_range_x_minimum = 917;
+const xml_token_t XML_handle_range_y_maximum = 918;
+const xml_token_t XML_handle_range_y_minimum = 919;
+const xml_token_t XML_handle_switched = 920;
+const xml_token_t XML_handout = 921;
+const xml_token_t XML_handout_master = 922;
+const xml_token_t XML_hanging = 923;
+const xml_token_t XML_hanja = 924;
+const xml_token_t XML_hanja_yoil = 925;
+const xml_token_t XML_has_persistent_data = 926;
+const xml_token_t XML_hatch = 927;
+const xml_token_t XML_header = 928;
+const xml_token_t XML_header_decl = 929;
+const xml_token_t XML_header_first = 930;
+const xml_token_t XML_header_footer_properties = 931;
+const xml_token_t XML_header_left = 932;
+const xml_token_t XML_header_style = 933;
+const xml_token_t XML_headers = 934;
+const xml_token_t XML_height = 935;
+const xml_token_t XML_help_message = 936;
+const xml_token_t XML_hidden = 937;
+const xml_token_t XML_hidden_and_protected = 938;
+const xml_token_t XML_hidden_paragraph = 939;
+const xml_token_t XML_hidden_text = 940;
+const xml_token_t XML_hide = 941;
+const xml_token_t XML_hide_shape = 942;
+const xml_token_t XML_hide_text = 943;
+const xml_token_t XML_high = 944;
+const xml_token_t XML_highlighted_range = 945;
+const xml_token_t XML_hijri = 946;
+const xml_token_t XML_hold = 947;
+const xml_token_t XML_hole_size = 948;
+const xml_token_t XML_horizontal = 949;
+const xml_token_t XML_horizontal_bar = 950;
+const xml_token_t XML_horizontal_checkerboard = 951;
+const xml_token_t XML_horizontal_lines = 952;
+const xml_token_t XML_horizontal_on_even = 953;
+const xml_token_t XML_horizontal_on_odd = 954;
+const xml_token_t XML_horizontal_pos = 955;
+const xml_token_t XML_horizontal_rel = 956;
+const xml_token_t XML_horizontal_segments = 957;
+const xml_token_t XML_horizontal_stripes = 958;
+const xml_token_t XML_hostname = 959;
+const xml_token_t XML_hourglass = 960;
+const xml_token_t XML_hours = 961;
+const xml_token_t XML_howpublished = 962;
+const xml_token_t XML_href = 963;
+const xml_token_t XML_hsl = 964;
+const xml_token_t XML_hyperlink_behaviour = 965;
+const xml_token_t XML_hyphenate = 966;
+const xml_token_t XML_hyphenation_keep = 967;
+const xml_token_t XML_hyphenation_ladder_count = 968;
+const xml_token_t XML_hyphenation_push_char_count = 969;
+const xml_token_t XML_hyphenation_remain_char_count = 970;
+const xml_token_t XML_i = 971;
+const xml_token_t XML_icon = 972;
+const xml_token_t XML_id = 973;
+const xml_token_t XML_identifier = 974;
+const xml_token_t XML_identify_categories = 975;
+const xml_token_t XML_ideograph_alpha = 976;
+const xml_token_t XML_ideographic = 977;
+const xml_token_t XML_ignore = 978;
+const xml_token_t XML_ignore_case = 979;
+const xml_token_t XML_ignore_driver_privileges = 980;
+const xml_token_t XML_ignore_empty_rows = 981;
+const xml_token_t XML_ignore_result = 982;
+const xml_token_t XML_illustration_index = 983;
+const xml_token_t XML_illustration_index_entry_template = 984;
+const xml_token_t XML_illustration_index_source = 985;
+const xml_token_t XML_image = 986;
+const xml_token_t XML_image_align = 987;
+const xml_token_t XML_image_count = 988;
+const xml_token_t XML_image_data = 989;
+const xml_token_t XML_image_frame = 990;
+const xml_token_t XML_image_map = 991;
+const xml_token_t XML_image_opacity = 992;
+const xml_token_t XML_image_position = 993;
+const xml_token_t XML_in = 994;
+const xml_token_t XML_inbook = 995;
+const xml_token_t XML_inch = 996;
+const xml_token_t XML_include_hidden_cells = 997;
+const xml_token_t XML_incollection = 998;
+const xml_token_t XML_increment = 999;
+const xml_token_t XML_indefinite = 1000;
+const xml_token_t XML_index = 1001;
+const xml_token_t XML_index_body = 1002;
+const xml_token_t XML_index_column = 1003;
+const xml_token_t XML_index_columns = 1004;
+const xml_token_t XML_index_entry_bibliography = 1005;
+const xml_token_t XML_index_entry_chapter = 1006;
+const xml_token_t XML_index_entry_link_end = 1007;
+const xml_token_t XML_index_entry_link_start = 1008;
+const xml_token_t XML_index_entry_page_number = 1009;
+const xml_token_t XML_index_entry_span = 1010;
+const xml_token_t XML_index_entry_tab_stop = 1011;
+const xml_token_t XML_index_entry_text = 1012;
+const xml_token_t XML_index_name = 1013;
+const xml_token_t XML_index_scope = 1014;
+const xml_token_t XML_index_source_style = 1015;
+const xml_token_t XML_index_source_styles = 1016;
+const xml_token_t XML_index_title = 1017;
+const xml_token_t XML_index_title_template = 1018;
+const xml_token_t XML_indices = 1019;
+const xml_token_t XML_information = 1020;
+const xml_token_t XML_inherit = 1021;
+const xml_token_t XML_initial_creator = 1022;
+const xml_token_t XML_inner = 1023;
+const xml_token_t XML_inproceedings = 1024;
+const xml_token_t XML_insertion = 1025;
+const xml_token_t XML_insertion_cut_off = 1026;
+const xml_token_t XML_inside = 1027;
+const xml_token_t XML_institution = 1028;
+const xml_token_t XML_int = 1029;
+const xml_token_t XML_integer = 1030;
+const xml_token_t XML_intensity = 1031;
+const xml_token_t XML_interactive_sequence = 1032;
+const xml_token_t XML_interlocking_horizontal_left = 1033;
+const xml_token_t XML_interlocking_horizontal_right = 1034;
+const xml_token_t XML_interlocking_vertical_bottom = 1035;
+const xml_token_t XML_interlocking_vertical_top = 1036;
+const xml_token_t XML_interpolation = 1037;
+const xml_token_t XML_interval_major = 1038;
+const xml_token_t XML_interval_minor_divisor = 1039;
+const xml_token_t XML_into_default_style_data_style = 1040;
+const xml_token_t XML_into_english_number = 1041;
+const xml_token_t XML_inverse = 1042;
+const xml_token_t XML_is_active = 1043;
+const xml_token_t XML_is_ascending = 1044;
+const xml_token_t XML_is_autoincrement = 1045;
+const xml_token_t XML_is_boolean = 1046;
+const xml_token_t XML_is_clustered = 1047;
+const xml_token_t XML_is_data_layout_field = 1048;
+const xml_token_t XML_is_empty_allowed = 1049;
+const xml_token_t XML_is_first_row_header_line = 1050;
+const xml_token_t XML_is_hidden = 1051;
+const xml_token_t XML_is_list_header = 1052;
+const xml_token_t XML_is_nullable = 1053;
+const xml_token_t XML_is_password_required = 1054;
+const xml_token_t XML_is_selection = 1055;
+const xml_token_t XML_is_sub_table = 1056;
+const xml_token_t XML_is_table_name_length_limited = 1057;
+const xml_token_t XML_is_tristate = 1058;
+const xml_token_t XML_is_unique = 1059;
+const xml_token_t XML_isbn = 1060;
+const xml_token_t XML_issn = 1061;
+const xml_token_t XML_italic = 1062;
+const xml_token_t XML_item = 1063;
+const xml_token_t XML_iterate = 1064;
+const xml_token_t XML_iterate_interval = 1065;
+const xml_token_t XML_iterate_type = 1066;
+const xml_token_t XML_iteration = 1067;
+const xml_token_t XML_iterative = 1068;
+const xml_token_t XML_japanese_candle_stick = 1069;
+const xml_token_t XML_jewish = 1070;
+const xml_token_t XML_join_border = 1071;
+const xml_token_t XML_journal = 1072;
+const xml_token_t XML_justify = 1073;
+const xml_token_t XML_justify_single_word = 1074;
+const xml_token_t XML_keep_text = 1075;
+const xml_token_t XML_keep_together = 1076;
+const xml_token_t XML_keep_with_next = 1077;
+const xml_token_t XML_key = 1078;
+const xml_token_t XML_key_column = 1079;
+const xml_token_t XML_key_columns = 1080;
+const xml_token_t XML_key1 = 1081;
+const xml_token_t XML_key1_phonetic = 1082;
+const xml_token_t XML_key2 = 1083;
+const xml_token_t XML_key2_phonetic = 1084;
+const xml_token_t XML_keySplines = 1085;
+const xml_token_t XML_keyTimes = 1086;
+const xml_token_t XML_keys = 1087;
+const xml_token_t XML_keyword = 1088;
+const xml_token_t XML_keywords = 1089;
+const xml_token_t XML_kind = 1090;
+const xml_token_t XML_km = 1091;
+const xml_token_t XML_label = 1092;
+const xml_token_t XML_label_alignment = 1093;
+const xml_token_t XML_label_arrangement = 1094;
+const xml_token_t XML_label_cell_address = 1095;
+const xml_token_t XML_label_cell_range_address = 1096;
+const xml_token_t XML_label_followed_by = 1097;
+const xml_token_t XML_label_position = 1098;
+const xml_token_t XML_label_position_negative = 1099;
+const xml_token_t XML_label_range = 1100;
+const xml_token_t XML_label_ranges = 1101;
+const xml_token_t XML_label_separator = 1102;
+const xml_token_t XML_label_width_and_position = 1103;
+const xml_token_t XML_landscape = 1104;
+const xml_token_t XML_language = 1105;
+const xml_token_t XML_language_asian = 1106;
+const xml_token_t XML_language_complex = 1107;
+const xml_token_t XML_laser = 1108;
+const xml_token_t XML_last = 1109;
+const xml_token_t XML_last_column = 1110;
+const xml_token_t XML_last_column_spanned = 1111;
+const xml_token_t XML_last_page = 1112;
+const xml_token_t XML_last_row = 1113;
+const xml_token_t XML_last_row_end_column = 1114;
+const xml_token_t XML_last_row_spanned = 1115;
+const xml_token_t XML_last_row_start_column = 1116;
+const xml_token_t XML_last_visited_page = 1117;
+const xml_token_t XML_latin = 1118;
+const xml_token_t XML_layer = 1119;
+const xml_token_t XML_layer_set = 1120;
+const xml_token_t XML_layout_grid_base_height = 1121;
+const xml_token_t XML_layout_grid_base_width = 1122;
+const xml_token_t XML_layout_grid_color = 1123;
+const xml_token_t XML_layout_grid_display = 1124;
+const xml_token_t XML_layout_grid_lines = 1125;
+const xml_token_t XML_layout_grid_mode = 1126;
+const xml_token_t XML_layout_grid_print = 1127;
+const xml_token_t XML_layout_grid_ruby_below = 1128;
+const xml_token_t XML_layout_grid_ruby_height = 1129;
+const xml_token_t XML_layout_grid_snap_to = 1130;
+const xml_token_t XML_layout_grid_standard_mode = 1131;
+const xml_token_t XML_layout_mode = 1132;
+const xml_token_t XML_leader_char = 1133;
+const xml_token_t XML_leader_color = 1134;
+const xml_token_t XML_leader_style = 1135;
+const xml_token_t XML_leader_text = 1136;
+const xml_token_t XML_leader_text_style = 1137;
+const xml_token_t XML_leader_type = 1138;
+const xml_token_t XML_leader_width = 1139;
+const xml_token_t XML_leave_gap = 1140;
+const xml_token_t XML_left = 1141;
+const xml_token_t XML_left_outside = 1142;
+const xml_token_t XML_legend = 1143;
+const xml_token_t XML_legend_align = 1144;
+const xml_token_t XML_legend_expansion = 1145;
+const xml_token_t XML_legend_expansion_aspect_ratio = 1146;
+const xml_token_t XML_legend_position = 1147;
+const xml_token_t XML_length = 1148;
+const xml_token_t XML_letter_kerning = 1149;
+const xml_token_t XML_letter_spacing = 1150;
+const xml_token_t XML_letters = 1151;
+const xml_token_t XML_level = 1152;
+const xml_token_t XML_light = 1153;
+const xml_token_t XML_lighting_mode = 1154;
+const xml_token_t XML_line = 1155;
+const xml_token_t XML_line_break = 1156;
+const xml_token_t XML_line_distance = 1157;
+const xml_token_t XML_line_height = 1158;
+const xml_token_t XML_line_height_at_least = 1159;
+const xml_token_t XML_line_number = 1160;
+const xml_token_t XML_line_skew = 1161;
+const xml_token_t XML_line_spacing = 1162;
+const xml_token_t XML_line_style = 1163;
+const xml_token_t XML_linear = 1164;
+const xml_token_t XML_linearGradient = 1165;
+const xml_token_t XML_linenumbering_configuration = 1166;
+const xml_token_t XML_linenumbering_separator = 1167;
+const xml_token_t XML_lines = 1168;
+const xml_token_t XML_link_data_style_to_source = 1169;
+const xml_token_t XML_link_to_source_data = 1170;
+const xml_token_t XML_linked_cell = 1171;
+const xml_token_t XML_list = 1172;
+const xml_token_t XML_list_header = 1173;
+const xml_token_t XML_list_id = 1174;
+const xml_token_t XML_list_item = 1175;
+const xml_token_t XML_list_level = 1176;
+const xml_token_t XML_list_level_label_alignment = 1177;
+const xml_token_t XML_list_level_position_and_space_mode = 1178;
+const xml_token_t XML_list_level_properties = 1179;
+const xml_token_t XML_list_level_style_bullet = 1180;
+const xml_token_t XML_list_level_style_image = 1181;
+const xml_token_t XML_list_level_style_number = 1182;
+const xml_token_t XML_list_linkage_type = 1183;
+const xml_token_t XML_list_property = 1184;
+const xml_token_t XML_list_source = 1185;
+const xml_token_t XML_list_source_type = 1186;
+const xml_token_t XML_list_style = 1187;
+const xml_token_t XML_list_style_name = 1188;
+const xml_token_t XML_list_tab_stop_position = 1189;
+const xml_token_t XML_list_value = 1190;
+const xml_token_t XML_listbox = 1191;
+const xml_token_t XML_listtab = 1192;
+const xml_token_t XML_local_socket = 1193;
+const xml_token_t XML_logarithmic = 1194;
+const xml_token_t XML_login = 1195;
+const xml_token_t XML_login_timeout = 1196;
+const xml_token_t XML_long = 1197;
+const xml_token_t XML_long_dash = 1198;
+const xml_token_t XML_longvarbinary = 1199;
+const xml_token_t XML_longvarchar = 1200;
+const xml_token_t XML_lowercase = 1201;
+const xml_token_t XML_lr = 1202;
+const xml_token_t XML_lr_tb = 1203;
+const xml_token_t XML_ltr = 1204;
+const xml_token_t XML_luminance = 1205;
+const xml_token_t XML_m = 1206;
+const xml_token_t XML_macro_name = 1207;
+const xml_token_t XML_main_entry = 1208;
+const xml_token_t XML_main_entry_style_name = 1209;
+const xml_token_t XML_main_sequence = 1210;
+const xml_token_t XML_major = 1211;
+const xml_token_t XML_manual = 1212;
+const xml_token_t XML_map = 1213;
+const xml_token_t XML_margin = 1214;
+const xml_token_t XML_margin_bottom = 1215;
+const xml_token_t XML_margin_left = 1216;
+const xml_token_t XML_margin_right = 1217;
+const xml_token_t XML_margin_top = 1218;
+const xml_token_t XML_margins = 1219;
+const xml_token_t XML_marked_invalid = 1220;
+const xml_token_t XML_marker = 1221;
+const xml_token_t XML_marker_end = 1222;
+const xml_token_t XML_marker_end_center = 1223;
+const xml_token_t XML_marker_end_width = 1224;
+const xml_token_t XML_marker_start = 1225;
+const xml_token_t XML_marker_start_center = 1226;
+const xml_token_t XML_marker_start_width = 1227;
+const xml_token_t XML_master_element = 1228;
+const xml_token_t XML_master_fields = 1229;
+const xml_token_t XML_master_page = 1230;
+const xml_token_t XML_master_page_name = 1231;
+const xml_token_t XML_master_styles = 1232;
+const xml_token_t XML_mastersthesis = 1233;
+const xml_token_t XML_math = 1234;
+const xml_token_t XML_mathematical = 1235;
+const xml_token_t XML_matrix_covered = 1236;
+const xml_token_t XML_max = 1237;
+const xml_token_t XML_max_denominator_value = 1238;
+const xml_token_t XML_max_edge = 1239;
+const xml_token_t XML_max_height = 1240;
+const xml_token_t XML_max_length = 1241;
+const xml_token_t XML_max_row_count = 1242;
+const xml_token_t XML_max_value = 1243;
+const xml_token_t XML_max_width = 1244;
+const xml_token_t XML_maximum = 1245;
+const xml_token_t XML_maximum_difference = 1246;
+const xml_token_t XML_may_break_between_rows = 1247;
+const xml_token_t XML_may_script = 1248;
+const xml_token_t XML_mean_value = 1249;
+const xml_token_t XML_measure = 1250;
+const xml_token_t XML_measure_align = 1251;
+const xml_token_t XML_measure_vertical_align = 1252;
+const xml_token_t XML_media = 1253;
+const xml_token_t XML_media_call = 1254;
+const xml_token_t XML_media_type = 1255;
+const xml_token_t XML_medium = 1256;
+const xml_token_t XML_melt = 1257;
+const xml_token_t XML_member_count = 1258;
+const xml_token_t XML_member_difference = 1259;
+const xml_token_t XML_member_name = 1260;
+const xml_token_t XML_member_percentage = 1261;
+const xml_token_t XML_member_percentage_difference = 1262;
+const xml_token_t XML_member_type = 1263;
+const xml_token_t XML_message_type = 1264;
+const xml_token_t XML_meta = 1265;
+const xml_token_t XML_meta_field = 1266;
+const xml_token_t XML_method = 1267;
+const xml_token_t XML_mi = 1268;
+const xml_token_t XML_middle = 1269;
+const xml_token_t XML_mime_type = 1270;
+const xml_token_t XML_mimetype = 1271;
+const xml_token_t XML_min = 1272;
+const xml_token_t XML_min_decimal_places = 1273;
+const xml_token_t XML_min_denominator_digits = 1274;
+const xml_token_t XML_min_edge = 1275;
+const xml_token_t XML_min_exponent_digits = 1276;
+const xml_token_t XML_min_height = 1277;
+const xml_token_t XML_min_integer_digits = 1278;
+const xml_token_t XML_min_label_distance = 1279;
+const xml_token_t XML_min_label_width = 1280;
+const xml_token_t XML_min_numerator_digits = 1281;
+const xml_token_t XML_min_row_height = 1282;
+const xml_token_t XML_min_value = 1283;
+const xml_token_t XML_min_width = 1284;
+const xml_token_t XML_minimum = 1285;
+const xml_token_t XML_minor = 1286;
+const xml_token_t XML_minutes = 1287;
+const xml_token_t XML_mirror = 1288;
+const xml_token_t XML_mirror_horizontal = 1289;
+const xml_token_t XML_mirror_vertical = 1290;
+const xml_token_t XML_mirrored = 1291;
+const xml_token_t XML_misc = 1292;
+const xml_token_t XML_miter = 1293;
+const xml_token_t XML_mm = 1294;
+const xml_token_t XML_mode = 1295;
+const xml_token_t XML_model = 1296;
+const xml_token_t XML_modern = 1297;
+const xml_token_t XML_modification_date = 1298;
+const xml_token_t XML_modification_time = 1299;
+const xml_token_t XML_modifiers = 1300;
+const xml_token_t XML_modulate = 1301;
+const xml_token_t XML_mono = 1302;
+const xml_token_t XML_month = 1303;
+const xml_token_t XML_months = 1304;
+const xml_token_t XML_motion_path = 1305;
+const xml_token_t XML_mouse_as_pen = 1306;
+const xml_token_t XML_mouse_visible = 1307;
+const xml_token_t XML_move = 1308;
+const xml_token_t XML_move_from_bottom = 1309;
+const xml_token_t XML_move_from_left = 1310;
+const xml_token_t XML_move_from_lowerleft = 1311;
+const xml_token_t XML_move_from_lowerright = 1312;
+const xml_token_t XML_move_from_right = 1313;
+const xml_token_t XML_move_from_top = 1314;
+const xml_token_t XML_move_from_upperleft = 1315;
+const xml_token_t XML_move_from_upperright = 1316;
+const xml_token_t XML_move_short = 1317;
+const xml_token_t XML_movement = 1318;
+const xml_token_t XML_movement_cut_off = 1319;
+const xml_token_t XML_moving_average = 1320;
+const xml_token_t XML_multi_deletion_spanned = 1321;
+const xml_token_t XML_multi_line = 1322;
+const xml_token_t XML_multiple = 1323;
+const xml_token_t XML_name = 1324;
+const xml_token_t XML_name_and_extension = 1325;
+const xml_token_t XML_named = 1326;
+const xml_token_t XML_named_expression = 1327;
+const xml_token_t XML_named_expressions = 1328;
+const xml_token_t XML_named_range = 1329;
+const xml_token_t XML_named_symbol = 1330;
+const xml_token_t XML_nav_order = 1331;
+const xml_token_t XML_navigation_mode = 1332;
+const xml_token_t XML_near_axis = 1333;
+const xml_token_t XML_near_axis_other_side = 1334;
+const xml_token_t XML_near_origin = 1335;
+const xml_token_t XML_never = 1336;
+const xml_token_t XML_new = 1337;
+const xml_token_t XML_next = 1338;
+const xml_token_t XML_next_page = 1339;
+const xml_token_t XML_next_style_name = 1340;
+const xml_token_t XML_no_action = 1341;
+const xml_token_t XML_no_limit = 1342;
+const xml_token_t XML_no_nulls = 1343;
+const xml_token_t XML_no_repeat = 1344;
+const xml_token_t XML_no_wrap = 1345;
+const xml_token_t XML_node_type = 1346;
+const xml_token_t XML_nohref = 1347;
+const xml_token_t XML_non_primitive = 1348;
+const xml_token_t XML_non_whitespace_character_count = 1349;
+const xml_token_t XML_none = 1350;
+const xml_token_t XML_nonzero = 1351;
+const xml_token_t XML_normal = 1352;
+const xml_token_t XML_normals_direction = 1353;
+const xml_token_t XML_normals_kind = 1354;
+const xml_token_t XML_note = 1355;
+const xml_token_t XML_note_body = 1356;
+const xml_token_t XML_note_citation = 1357;
+const xml_token_t XML_note_class = 1358;
+const xml_token_t XML_note_continuation_notice_backward = 1359;
+const xml_token_t XML_note_continuation_notice_forward = 1360;
+const xml_token_t XML_note_ref = 1361;
+const xml_token_t XML_notes = 1362;
+const xml_token_t XML_notes_configuration = 1363;
+const xml_token_t XML_nothing = 1364;
+const xml_token_t XML_notify_on_update_of_ranges = 1365;
+const xml_token_t XML_null_date = 1366;
+const xml_token_t XML_null_year = 1367;
+const xml_token_t XML_nullable = 1368;
+const xml_token_t XML_num_format = 1369;
+const xml_token_t XML_num_letter_sync = 1370;
+const xml_token_t XML_num_prefix = 1371;
+const xml_token_t XML_num_suffix = 1372;
+const xml_token_t XML_number = 1373;
+const xml_token_t XML_number_all_superior = 1374;
+const xml_token_t XML_number_and_name = 1375;
+const xml_token_t XML_number_columns_repeated = 1376;
+const xml_token_t XML_number_columns_spanned = 1377;
+const xml_token_t XML_number_lines = 1378;
+const xml_token_t XML_number_matrix_columns_spanned = 1379;
+const xml_token_t XML_number_matrix_rows_spanned = 1380;
+const xml_token_t XML_number_no_superior = 1381;
+const xml_token_t XML_number_position = 1382;
+const xml_token_t XML_number_rows_repeated = 1383;
+const xml_token_t XML_number_rows_spanned = 1384;
+const xml_token_t XML_number_style = 1385;
+const xml_token_t XML_number_wrapped_paragraphs = 1386;
+const xml_token_t XML_numbered_entries = 1387;
+const xml_token_t XML_numbered_paragraph = 1388;
+const xml_token_t XML_numeric = 1389;
+const xml_token_t XML_object = 1390;
+const xml_token_t XML_object_count = 1391;
+const xml_token_t XML_object_index = 1392;
+const xml_token_t XML_object_index_entry_template = 1393;
+const xml_token_t XML_object_index_source = 1394;
+const xml_token_t XML_object_name = 1395;
+const xml_token_t XML_object_ole = 1396;
+const xml_token_t XML_objectBoundingBox = 1397;
+const xml_token_t XML_objects = 1398;
+const xml_token_t XML_oblique = 1399;
+const xml_token_t XML_odd_columns = 1400;
+const xml_token_t XML_odd_rows = 1401;
+const xml_token_t XML_office = 1402;
+const xml_token_t XML_offset = 1403;
+const xml_token_t XML_ole_action = 1404;
+const xml_token_t XML_ole_draw_aspect = 1405;
+const xml_token_t XML_ole_object_count = 1406;
+const xml_token_t XML_on_click = 1407;
+const xml_token_t XML_on_update_keep_size = 1408;
+const xml_token_t XML_on_update_keep_styles = 1409;
+const xml_token_t XML_onLoad = 1410;
+const xml_token_t XML_onRequest = 1411;
+const xml_token_t XML_once_concurrent = 1412;
+const xml_token_t XML_once_successive = 1413;
+const xml_token_t XML_opacity = 1414;
+const xml_token_t XML_opacity_name = 1415;
+const xml_token_t XML_open = 1416;
+const xml_token_t XML_open_horizontal = 1417;
+const xml_token_t XML_open_vertical = 1418;
+const xml_token_t XML_operation = 1419;
+const xml_token_t XML_operator = 1420;
+const xml_token_t XML_option = 1421;
+const xml_token_t XML_order = 1422;
+const xml_token_t XML_order_statement = 1423;
+const xml_token_t XML_organizations = 1424;
+const xml_token_t XML_orgchart = 1425;
+const xml_token_t XML_orientation = 1426;
+const xml_token_t XML_origin = 1427;
+const xml_token_t XML_orphans = 1428;
+const xml_token_t XML_other = 1429;
+const xml_token_t XML_out = 1430;
+const xml_token_t XML_outer = 1431;
+const xml_token_t XML_outline = 1432;
+const xml_token_t XML_outline_level = 1433;
+const xml_token_t XML_outline_level_style = 1434;
+const xml_token_t XML_outline_style = 1435;
+const xml_token_t XML_outline_subtotals_bottom = 1436;
+const xml_token_t XML_outline_subtotals_top = 1437;
+const xml_token_t XML_outside = 1438;
+const xml_token_t XML_outside_end = 1439;
+const xml_token_t XML_outside_start = 1440;
+const xml_token_t XML_overflow_behavior = 1441;
+const xml_token_t XML_overlap = 1442;
+const xml_token_t XML_overline_position = 1443;
+const xml_token_t XML_overline_thickness = 1444;
+const xml_token_t XML_p = 1445;
+const xml_token_t XML_paced = 1446;
+const xml_token_t XML_pad = 1447;
+const xml_token_t XML_padding = 1448;
+const xml_token_t XML_padding_bottom = 1449;
+const xml_token_t XML_padding_left = 1450;
+const xml_token_t XML_padding_right = 1451;
+const xml_token_t XML_padding_top = 1452;
+const xml_token_t XML_page = 1453;
+const xml_token_t XML_page_adjust = 1454;
+const xml_token_t XML_page_breaks_on_group_change = 1455;
+const xml_token_t XML_page_content = 1456;
+const xml_token_t XML_page_continuation = 1457;
+const xml_token_t XML_page_count = 1458;
+const xml_token_t XML_page_end_margin = 1459;
+const xml_token_t XML_page_height = 1460;
+const xml_token_t XML_page_layout = 1461;
+const xml_token_t XML_page_layout_name = 1462;
+const xml_token_t XML_page_layout_properties = 1463;
+const xml_token_t XML_page_number = 1464;
+const xml_token_t XML_page_sequence = 1465;
+const xml_token_t XML_page_start_margin = 1466;
+const xml_token_t XML_page_step_size = 1467;
+const xml_token_t XML_page_thumbnail = 1468;
+const xml_token_t XML_page_usage = 1469;
+const xml_token_t XML_page_variable_get = 1470;
+const xml_token_t XML_page_variable_set = 1471;
+const xml_token_t XML_page_width = 1472;
+const xml_token_t XML_pages = 1473;
+const xml_token_t XML_panose_1 = 1474;
+const xml_token_t XML_paper_tray_name = 1475;
+const xml_token_t XML_par = 1476;
+const xml_token_t XML_paragraph = 1477;
+const xml_token_t XML_paragraph_content = 1478;
+const xml_token_t XML_paragraph_count = 1479;
+const xml_token_t XML_paragraph_end_margin = 1480;
+const xml_token_t XML_paragraph_properties = 1481;
+const xml_token_t XML_paragraph_start_margin = 1482;
+const xml_token_t XML_paragraph_style_name = 1483;
+const xml_token_t XML_parallel = 1484;
+const xml_token_t XML_param = 1485;
+const xml_token_t XML_parameter_name_substitution = 1486;
+const xml_token_t XML_parent = 1487;
+const xml_token_t XML_parent_style_name = 1488;
+const xml_token_t XML_parse_sql_statement = 1489;
+const xml_token_t XML_password = 1490;
+const xml_token_t XML_path = 1491;
+const xml_token_t XML_path_id = 1492;
+const xml_token_t XML_path_stretchpoint_x = 1493;
+const xml_token_t XML_path_stretchpoint_y = 1494;
+const xml_token_t XML_pause = 1495;
+const xml_token_t XML_pc = 1496;
+const xml_token_t XML_pending = 1497;
+const xml_token_t XML_percentage = 1498;
+const xml_token_t XML_percentage_data_style_name = 1499;
+const xml_token_t XML_percentage_style = 1500;
+const xml_token_t XML_perspective = 1501;
+const xml_token_t XML_phdthesis = 1502;
+const xml_token_t XML_phong = 1503;
+const xml_token_t XML_pie_offset = 1504;
+const xml_token_t XML_placeholder = 1505;
+const xml_token_t XML_placeholder_type = 1506;
+const xml_token_t XML_placing = 1507;
+const xml_token_t XML_plain_number = 1508;
+const xml_token_t XML_plain_number_and_name = 1509;
+const xml_token_t XML_play = 1510;
+const xml_token_t XML_play_full = 1511;
+const xml_token_t XML_plot_area = 1512;
+const xml_token_t XML_plugin = 1513;
+const xml_token_t XML_plus = 1514;
+const xml_token_t XML_points = 1515;
+const xml_token_t XML_polygon = 1516;
+const xml_token_t XML_polyline = 1517;
+const xml_token_t XML_polynomial = 1518;
+const xml_token_t XML_port = 1519;
+const xml_token_t XML_portrait = 1520;
+const xml_token_t XML_position = 1521;
+const xml_token_t XML_possessive_form = 1522;
+const xml_token_t XML_post = 1523;
+const xml_token_t XML_power = 1524;
+const xml_token_t XML_precision = 1525;
+const xml_token_t XML_precision_as_shown = 1526;
+const xml_token_t XML_prefix = 1527;
+const xml_token_t XML_presentation = 1528;
+const xml_token_t XML_presentation_page_layout = 1529;
+const xml_token_t XML_presentation_page_layout_name = 1530;
+const xml_token_t XML_preset_class = 1531;
+const xml_token_t XML_preset_id = 1532;
+const xml_token_t XML_preset_sub_type = 1533;
+const xml_token_t XML_previous = 1534;
+const xml_token_t XML_previous_page = 1535;
+const xml_token_t XML_primary = 1536;
+const xml_token_t XML_print = 1537;
+const xml_token_t XML_print_content = 1538;
+const xml_token_t XML_print_date = 1539;
+const xml_token_t XML_print_orientation = 1540;
+const xml_token_t XML_print_page_order = 1541;
+const xml_token_t XML_print_range = 1542;
+const xml_token_t XML_print_ranges = 1543;
+const xml_token_t XML_print_time = 1544;
+const xml_token_t XML_print_view = 1545;
+const xml_token_t XML_printable = 1546;
+const xml_token_t XML_printed_by = 1547;
+const xml_token_t XML_printer = 1548;
+const xml_token_t XML_prior = 1549;
+const xml_token_t XML_proceedings = 1550;
+const xml_token_t XML_product = 1551;
+const xml_token_t XML_projection = 1552;
+const xml_token_t XML_properties = 1553;
+const xml_token_t XML_property = 1554;
+const xml_token_t XML_property_name = 1555;
+const xml_token_t XML_protect = 1556;
+const xml_token_t XML_protected = 1557;
+const xml_token_t XML_protection_key = 1558;
+const xml_token_t XML_protection_key_digest_algorithm = 1559;
+const xml_token_t XML_pt = 1560;
+const xml_token_t XML_publisher = 1561;
+const xml_token_t XML_punctuation_wrap = 1562;
+const xml_token_t XML_push = 1563;
+const xml_token_t XML_pyramid = 1564;
+const xml_token_t XML_quarter = 1565;
+const xml_token_t XML_quarters = 1566;
+const xml_token_t XML_queries = 1567;
+const xml_token_t XML_query = 1568;
+const xml_token_t XML_query_collection = 1569;
+const xml_token_t XML_query_name = 1570;
+const xml_token_t XML_r = 1571;
+const xml_token_t XML_radial = 1572;
+const xml_token_t XML_radialGradient = 1573;
+const xml_token_t XML_radio = 1574;
+const xml_token_t XML_random = 1575;
+const xml_token_t XML_range_usable_as = 1576;
+const xml_token_t XML_readonly = 1577;
+const xml_token_t XML_real = 1578;
+const xml_token_t XML_records = 1579;
+const xml_token_t XML_recreate_on_edit = 1580;
+const xml_token_t XML_rect = 1581;
+const xml_token_t XML_rectangle = 1582;
+const xml_token_t XML_rectangular = 1583;
+const xml_token_t XML_red = 1584;
+const xml_token_t XML_ref = 1585;
+const xml_token_t XML_ref_name = 1586;
+const xml_token_t XML_reference_format = 1587;
+const xml_token_t XML_reference_mark = 1588;
+const xml_token_t XML_reference_mark_end = 1589;
+const xml_token_t XML_reference_mark_start = 1590;
+const xml_token_t XML_referenced_table_name = 1591;
+const xml_token_t XML_reflect = 1592;
+const xml_token_t XML_refresh_delay = 1593;
+const xml_token_t XML_region_center = 1594;
+const xml_token_t XML_region_left = 1595;
+const xml_token_t XML_region_right = 1596;
+const xml_token_t XML_register_true = 1597;
+const xml_token_t XML_register_truth_ref_style_name = 1598;
+const xml_token_t XML_regression_curve = 1599;
+const xml_token_t XML_regression_force_intercept = 1600;
+const xml_token_t XML_regression_intercept_value = 1601;
+const xml_token_t XML_regression_max_degree = 1602;
+const xml_token_t XML_regression_moving_type = 1603;
+const xml_token_t XML_regression_name = 1604;
+const xml_token_t XML_regression_period = 1605;
+const xml_token_t XML_regression_type = 1606;
+const xml_token_t XML_regular_polygon = 1607;
+const xml_token_t XML_rejected = 1608;
+const xml_token_t XML_rejecting_change_id = 1609;
+const xml_token_t XML_rel_column_width = 1610;
+const xml_token_t XML_rel_height = 1611;
+const xml_token_t XML_rel_width = 1612;
+const xml_token_t XML_related_column_name = 1613;
+const xml_token_t XML_relative_tab_stop_position = 1614;
+const xml_token_t XML_remove = 1615;
+const xml_token_t XML_remove_dependents = 1616;
+const xml_token_t XML_remove_precedents = 1617;
+const xml_token_t XML_repeat = 1618;
+const xml_token_t XML_repeat_column = 1619;
+const xml_token_t XML_repeat_content = 1620;
+const xml_token_t XML_repeat_row = 1621;
+const xml_token_t XML_repeatCount = 1622;
+const xml_token_t XML_repeatDur = 1623;
+const xml_token_t XML_repeated = 1624;
+const xml_token_t XML_replace = 1625;
+const xml_token_t XML_report_type = 1626;
+const xml_token_t XML_reports = 1627;
+const xml_token_t XML_reset = 1628;
+const xml_token_t XML_restart = 1629;
+const xml_token_t XML_restart_numbering = 1630;
+const xml_token_t XML_restart_on_page = 1631;
+const xml_token_t XML_restartDefault = 1632;
+const xml_token_t XML_restrict = 1633;
+const xml_token_t XML_reverse = 1634;
+const xml_token_t XML_reverse_direction = 1635;
+const xml_token_t XML_rfc_language_tag = 1636;
+const xml_token_t XML_rfc_language_tag_asian = 1637;
+const xml_token_t XML_rfc_language_tag_complex = 1638;
+const xml_token_t XML_rgb = 1639;
+const xml_token_t XML_right = 1640;
+const xml_token_t XML_right_angled_axes = 1641;
+const xml_token_t XML_right_outside = 1642;
+const xml_token_t XML_rl = 1643;
+const xml_token_t XML_rl_tb = 1644;
+const xml_token_t XML_roll_from_bottom = 1645;
+const xml_token_t XML_roll_from_left = 1646;
+const xml_token_t XML_roll_from_right = 1647;
+const xml_token_t XML_roll_from_top = 1648;
+const xml_token_t XML_roman = 1649;
+const xml_token_t XML_rotate = 1650;
+const xml_token_t XML_rotation = 1651;
+const xml_token_t XML_rotation_align = 1652;
+const xml_token_t XML_rotation_angle = 1653;
+const xml_token_t XML_round = 1654;
+const xml_token_t XML_row = 1655;
+const xml_token_t XML_row_count = 1656;
+const xml_token_t XML_row_height = 1657;
+const xml_token_t XML_row_mapping = 1658;
+const xml_token_t XML_row_number = 1659;
+const xml_token_t XML_row_percentage = 1660;
+const xml_token_t XML_row_retrieving_statement = 1661;
+const xml_token_t XML_rows = 1662;
+const xml_token_t XML_ruby = 1663;
+const xml_token_t XML_ruby_align = 1664;
+const xml_token_t XML_ruby_base = 1665;
+const xml_token_t XML_ruby_position = 1666;
+const xml_token_t XML_ruby_properties = 1667;
+const xml_token_t XML_ruby_text = 1668;
+const xml_token_t XML_run_through = 1669;
+const xml_token_t XML_running_total = 1670;
+const xml_token_t XML_rx = 1671;
+const xml_token_t XML_ry = 1672;
+const xml_token_t XML_s = 1673;
+const xml_token_t XML_scale = 1674;
+const xml_token_t XML_scale_min = 1675;
+const xml_token_t XML_scale_text = 1676;
+const xml_token_t XML_scale_to = 1677;
+const xml_token_t XML_scale_to_X = 1678;
+const xml_token_t XML_scale_to_Y = 1679;
+const xml_token_t XML_scale_to_pages = 1680;
+const xml_token_t XML_scenario = 1681;
+const xml_token_t XML_scenario_ranges = 1682;
+const xml_token_t XML_scene = 1683;
+const xml_token_t XML_schema_definition = 1684;
+const xml_token_t XML_schema_name = 1685;
+const xml_token_t XML_school = 1686;
+const xml_token_t XML_scientific_number = 1687;
+const xml_token_t XML_screen = 1688;
+const xml_token_t XML_script = 1689;
+const xml_token_t XML_script_asian = 1690;
+const xml_token_t XML_script_complex = 1691;
+const xml_token_t XML_script_type = 1692;
+const xml_token_t XML_scripts = 1693;
+const xml_token_t XML_scroll = 1694;
+const xml_token_t XML_search_criteria_must_apply_to_whole_cell = 1695;
+const xml_token_t XML_secondary_fill_color = 1696;
+const xml_token_t XML_seconds = 1697;
+const xml_token_t XML_section = 1698;
+const xml_token_t XML_section_name = 1699;
+const xml_token_t XML_section_properties = 1700;
+const xml_token_t XML_section_source = 1701;
+const xml_token_t XML_segments = 1702;
+const xml_token_t XML_select_page = 1703;
+const xml_token_t XML_selected = 1704;
+const xml_token_t XML_selected_page = 1705;
+const xml_token_t XML_selection = 1706;
+const xml_token_t XML_selection_indices = 1707;
+const xml_token_t XML_self = 1708;
+const xml_token_t XML_semi_automatic = 1709;
+const xml_token_t XML_semi_condensed = 1710;
+const xml_token_t XML_semi_expanded = 1711;
+const xml_token_t XML_sender_city = 1712;
+const xml_token_t XML_sender_company = 1713;
+const xml_token_t XML_sender_country = 1714;
+const xml_token_t XML_sender_email = 1715;
+const xml_token_t XML_sender_fax = 1716;
+const xml_token_t XML_sender_firstname = 1717;
+const xml_token_t XML_sender_initials = 1718;
+const xml_token_t XML_sender_lastname = 1719;
+const xml_token_t XML_sender_phone_private = 1720;
+const xml_token_t XML_sender_phone_work = 1721;
+const xml_token_t XML_sender_position = 1722;
+const xml_token_t XML_sender_postal_code = 1723;
+const xml_token_t XML_sender_state_or_province = 1724;
+const xml_token_t XML_sender_street = 1725;
+const xml_token_t XML_sender_title = 1726;
+const xml_token_t XML_sentence_count = 1727;
+const xml_token_t XML_separating = 1728;
+const xml_token_t XML_separation_character = 1729;
+const xml_token_t XML_separator = 1730;
+const xml_token_t XML_seq = 1731;
+const xml_token_t XML_sequence = 1732;
+const xml_token_t XML_sequence_decl = 1733;
+const xml_token_t XML_sequence_decls = 1734;
+const xml_token_t XML_sequence_ref = 1735;
+const xml_token_t XML_series = 1736;
+const xml_token_t XML_series_source = 1737;
+const xml_token_t XML_server_database = 1738;
+const xml_token_t XML_server_map = 1739;
+const xml_token_t XML_set = 1740;
+const xml_token_t XML_set_default = 1741;
+const xml_token_t XML_set_null = 1742;
+const xml_token_t XML_settings = 1743;
+const xml_token_t XML_shade_mode = 1744;
+const xml_token_t XML_shadow = 1745;
+const xml_token_t XML_shadow_color = 1746;
+const xml_token_t XML_shadow_offset_x = 1747;
+const xml_token_t XML_shadow_offset_y = 1748;
+const xml_token_t XML_shadow_opacity = 1749;
+const xml_token_t XML_shadow_slant = 1750;
+const xml_token_t XML_shape = 1751;
+const xml_token_t XML_shape_id = 1752;
+const xml_token_t XML_shapes = 1753;
+const xml_token_t XML_sharpness = 1754;
+const xml_token_t XML_sheet_name = 1755;
+const xml_token_t XML_shininess = 1756;
+const xml_token_t XML_short = 1757;
+const xml_token_t XML_show = 1758;
+const xml_token_t XML_show_deleted = 1759;
+const xml_token_t XML_show_details = 1760;
+const xml_token_t XML_show_empty = 1761;
+const xml_token_t XML_show_end_of_presentation_slide = 1762;
+const xml_token_t XML_show_filter_button = 1763;
+const xml_token_t XML_show_logo = 1764;
+const xml_token_t XML_show_shape = 1765;
+const xml_token_t XML_show_text = 1766;
+const xml_token_t XML_show_unit = 1767;
+const xml_token_t XML_shrink_to_fit = 1768;
+const xml_token_t XML_side_by_side = 1769;
+const xml_token_t XML_simple = 1770;
+const xml_token_t XML_single = 1771;
+const xml_token_t XML_size = 1772;
+const xml_token_t XML_skewX = 1773;
+const xml_token_t XML_skewY = 1774;
+const xml_token_t XML_skip_white_space = 1775;
+const xml_token_t XML_slide = 1776;
+const xml_token_t XML_slope = 1777;
+const xml_token_t XML_slow = 1778;
+const xml_token_t XML_small_caps = 1779;
+const xml_token_t XML_smallint = 1780;
+const xml_token_t XML_smil = 1781;
+const xml_token_t XML_snap_to_layout_grid = 1782;
+const xml_token_t XML_soft_page_break = 1783;
+const xml_token_t XML_solid = 1784;
+const xml_token_t XML_solid_type = 1785;
+const xml_token_t XML_sort = 1786;
+const xml_token_t XML_sort_algorithm = 1787;
+const xml_token_t XML_sort_ascending = 1788;
+const xml_token_t XML_sort_by = 1789;
+const xml_token_t XML_sort_by_position = 1790;
+const xml_token_t XML_sort_by_x_values = 1791;
+const xml_token_t XML_sort_groups = 1792;
+const xml_token_t XML_sort_key = 1793;
+const xml_token_t XML_sort_mode = 1794;
+const xml_token_t XML_sound = 1795;
+const xml_token_t XML_source = 1796;
+const xml_token_t XML_source_cell_range = 1797;
+const xml_token_t XML_source_cell_range_addresses = 1798;
+const xml_token_t XML_source_field_name = 1799;
+const xml_token_t XML_source_name = 1800;
+const xml_token_t XML_source_range_address = 1801;
+const xml_token_t XML_source_service = 1802;
+const xml_token_t XML_space = 1803;
+const xml_token_t XML_space_after = 1804;
+const xml_token_t XML_space_before = 1805;
+const xml_token_t XML_span = 1806;
+const xml_token_t XML_specular = 1807;
+const xml_token_t XML_specular_color = 1808;
+const xml_token_t XML_speed = 1809;
+const xml_token_t XML_sphere = 1810;
+const xml_token_t XML_spin_button = 1811;
+const xml_token_t XML_spiral_inward_left = 1812;
+const xml_token_t XML_spiral_inward_right = 1813;
+const xml_token_t XML_spiral_outward_left = 1814;
+const xml_token_t XML_spiral_outward_right = 1815;
+const xml_token_t XML_spiralin_left = 1816;
+const xml_token_t XML_spiralin_right = 1817;
+const xml_token_t XML_spiralout_left = 1818;
+const xml_token_t XML_spiralout_right = 1819;
+const xml_token_t XML_spline = 1820;
+const xml_token_t XML_spline_order = 1821;
+const xml_token_t XML_spline_resolution = 1822;
+const xml_token_t XML_spreadMethod = 1823;
+const xml_token_t XML_spreadsheet = 1824;
+const xml_token_t XML_sql = 1825;
+const xml_token_t XML_sql_pass_through = 1826;
+const xml_token_t XML_sql_statement = 1827;
+const xml_token_t XML_sqlnull = 1828;
+const xml_token_t XML_square = 1829;
+const xml_token_t XML_stacked = 1830;
+const xml_token_t XML_stagger_even = 1831;
+const xml_token_t XML_stagger_odd = 1832;
+const xml_token_t XML_standard = 1833;
+const xml_token_t XML_standard_deviation = 1834;
+const xml_token_t XML_standard_error = 1835;
+const xml_token_t XML_star = 1836;
+const xml_token_t XML_start = 1837;
+const xml_token_t XML_start_angle = 1838;
+const xml_token_t XML_start_color = 1839;
+const xml_token_t XML_start_column = 1840;
+const xml_token_t XML_start_glue_point = 1841;
+const xml_token_t XML_start_guide = 1842;
+const xml_token_t XML_start_indent = 1843;
+const xml_token_t XML_start_intensity = 1844;
+const xml_token_t XML_start_line_spacing_horizontal = 1845;
+const xml_token_t XML_start_line_spacing_vertical = 1846;
+const xml_token_t XML_start_numbering_at = 1847;
+const xml_token_t XML_start_page = 1848;
+const xml_token_t XML_start_position = 1849;
+const xml_token_t XML_start_row = 1850;
+const xml_token_t XML_start_scale = 1851;
+const xml_token_t XML_start_shape = 1852;
+const xml_token_t XML_start_table = 1853;
+const xml_token_t XML_start_value = 1854;
+const xml_token_t XML_start_with_navigator = 1855;
+const xml_token_t XML_state = 1856;
+const xml_token_t XML_status = 1857;
+const xml_token_t XML_stay_on_top = 1858;
+const xml_token_t XML_stdev = 1859;
+const xml_token_t XML_stdevp = 1860;
+const xml_token_t XML_stemh = 1861;
+const xml_token_t XML_stemv = 1862;
+const xml_token_t XML_step = 1863;
+const xml_token_t XML_step_center_x = 1864;
+const xml_token_t XML_step_center_y = 1865;
+const xml_token_t XML_step_end = 1866;
+const xml_token_t XML_step_size = 1867;
+const xml_token_t XML_step_start = 1868;
+const xml_token_t XML_steps = 1869;
+const xml_token_t XML_stock_gain_marker = 1870;
+const xml_token_t XML_stock_loss_marker = 1871;
+const xml_token_t XML_stock_range_line = 1872;
+const xml_token_t XML_stop = 1873;
+const xml_token_t XML_stop_color = 1874;
+const xml_token_t XML_stop_opacity = 1875;
+const xml_token_t XML_straight_line = 1876;
+const xml_token_t XML_stretch = 1877;
+const xml_token_t XML_stretch_from_bottom = 1878;
+const xml_token_t XML_stretch_from_left = 1879;
+const xml_token_t XML_stretch_from_right = 1880;
+const xml_token_t XML_stretch_from_top = 1881;
+const xml_token_t XML_strict = 1882;
+const xml_token_t XML_strikethrough_position = 1883;
+const xml_token_t XML_strikethrough_thickness = 1884;
+const xml_token_t XML_string = 1885;
+const xml_token_t XML_string_value = 1886;
+const xml_token_t XML_string_value_if_false = 1887;
+const xml_token_t XML_string_value_if_true = 1888;
+const xml_token_t XML_string_value_phonetic = 1889;
+const xml_token_t XML_stripes = 1890;
+const xml_token_t XML_stroke = 1891;
+const xml_token_t XML_stroke_color = 1892;
+const xml_token_t XML_stroke_dash = 1893;
+const xml_token_t XML_stroke_dash_names = 1894;
+const xml_token_t XML_stroke_linecap = 1895;
+const xml_token_t XML_stroke_linejoin = 1896;
+const xml_token_t XML_stroke_opacity = 1897;
+const xml_token_t XML_stroke_width = 1898;
+const xml_token_t XML_struct = 1899;
+const xml_token_t XML_structure_protected = 1900;
+const xml_token_t XML_style = 1901;
+const xml_token_t XML_style_name = 1902;
+const xml_token_t XML_style_override = 1903;
+const xml_token_t XML_styles = 1904;
+const xml_token_t XML_sub = 1905;
+const xml_token_t XML_sub_item = 1906;
+const xml_token_t XML_subject = 1907;
+const xml_token_t XML_submit = 1908;
+const xml_token_t XML_subtitle = 1909;
+const xml_token_t XML_subtotal_field = 1910;
+const xml_token_t XML_subtotal_rule = 1911;
+const xml_token_t XML_subtotal_rules = 1912;
+const xml_token_t XML_subtype = 1913;
+const xml_token_t XML_suffix = 1914;
+const xml_token_t XML_sum = 1915;
+const xml_token_t XML_super = 1916;
+const xml_token_t XML_suppress_version_columns = 1917;
+const xml_token_t XML_svg = 1918;
+const xml_token_t XML_swiss = 1919;
+const xml_token_t XML_syllable_count = 1920;
+const xml_token_t XML_symbol_color = 1921;
+const xml_token_t XML_symbol_height = 1922;
+const xml_token_t XML_symbol_image = 1923;
+const xml_token_t XML_symbol_name = 1924;
+const xml_token_t XML_symbol_type = 1925;
+const xml_token_t XML_symbol_width = 1926;
+const xml_token_t XML_system = 1927;
+const xml_token_t XML_system_driver_settings = 1928;
+const xml_token_t XML_tab = 1929;
+const xml_token_t XML_tab_color = 1930;
+const xml_token_t XML_tab_cycle = 1931;
+const xml_token_t XML_tab_index = 1932;
+const xml_token_t XML_tab_ref = 1933;
+const xml_token_t XML_tab_stop = 1934;
+const xml_token_t XML_tab_stop_distance = 1935;
+const xml_token_t XML_tab_stops = 1936;
+const xml_token_t XML_table = 1937;
+const xml_token_t XML_table_background = 1938;
+const xml_token_t XML_table_cell = 1939;
+const xml_token_t XML_table_cell_properties = 1940;
+const xml_token_t XML_table_centering = 1941;
+const xml_token_t XML_table_column = 1942;
+const xml_token_t XML_table_column_group = 1943;
+const xml_token_t XML_table_column_properties = 1944;
+const xml_token_t XML_table_columns = 1945;
+const xml_token_t XML_table_count = 1946;
+const xml_token_t XML_table_definition = 1947;
+const xml_token_t XML_table_definitions = 1948;
+const xml_token_t XML_table_exclude_filter = 1949;
+const xml_token_t XML_table_fields = 1950;
+const xml_token_t XML_table_filter = 1951;
+const xml_token_t XML_table_filter_pattern = 1952;
+const xml_token_t XML_table_formula = 1953;
+const xml_token_t XML_table_header_columns = 1954;
+const xml_token_t XML_table_header_rows = 1955;
+const xml_token_t XML_table_include_filter = 1956;
+const xml_token_t XML_table_index = 1957;
+const xml_token_t XML_table_index_entry_template = 1958;
+const xml_token_t XML_table_index_source = 1959;
+const xml_token_t XML_table_name = 1960;
+const xml_token_t XML_table_of_content = 1961;
+const xml_token_t XML_table_of_content_entry_template = 1962;
+const xml_token_t XML_table_of_content_source = 1963;
+const xml_token_t XML_table_properties = 1964;
+const xml_token_t XML_table_representation = 1965;
+const xml_token_t XML_table_representations = 1966;
+const xml_token_t XML_table_row = 1967;
+const xml_token_t XML_table_row_group = 1968;
+const xml_token_t XML_table_row_properties = 1969;
+const xml_token_t XML_table_rows = 1970;
+const xml_token_t XML_table_setting = 1971;
+const xml_token_t XML_table_settings = 1972;
+const xml_token_t XML_table_source = 1973;
+const xml_token_t XML_table_template = 1974;
+const xml_token_t XML_table_type = 1975;
+const xml_token_t XML_table_type_filter = 1976;
+const xml_token_t XML_tabular_layout = 1977;
+const xml_token_t XML_target_cell_address = 1978;
+const xml_token_t XML_target_frame = 1979;
+const xml_token_t XML_target_frame_name = 1980;
+const xml_token_t XML_target_range_address = 1981;
+const xml_token_t XML_targetElement = 1982;
+const xml_token_t XML_tb = 1983;
+const xml_token_t XML_tb_lr = 1984;
+const xml_token_t XML_tb_rl = 1985;
+const xml_token_t XML_techreport = 1986;
+const xml_token_t XML_template = 1987;
+const xml_token_t XML_template_name = 1988;
+const xml_token_t XML_text = 1989;
+const xml_token_t XML_text_align = 1990;
+const xml_token_t XML_text_align_last = 1991;
+const xml_token_t XML_text_align_source = 1992;
+const xml_token_t XML_text_areas = 1993;
+const xml_token_t XML_text_autospace = 1994;
+const xml_token_t XML_text_blinking = 1995;
+const xml_token_t XML_text_box = 1996;
+const xml_token_t XML_text_combine = 1997;
+const xml_token_t XML_text_combine_end_char = 1998;
+const xml_token_t XML_text_combine_start_char = 1999;
+const xml_token_t XML_text_content = 2000;
+const xml_token_t XML_text_emphasize = 2001;
+const xml_token_t XML_text_indent = 2002;
+const xml_token_t XML_text_input = 2003;
+const xml_token_t XML_text_line_through_color = 2004;
+const xml_token_t XML_text_line_through_mode = 2005;
+const xml_token_t XML_text_line_through_style = 2006;
+const xml_token_t XML_text_line_through_text = 2007;
+const xml_token_t XML_text_line_through_text_style = 2008;
+const xml_token_t XML_text_line_through_type = 2009;
+const xml_token_t XML_text_line_through_width = 2010;
+const xml_token_t XML_text_outline = 2011;
+const xml_token_t XML_text_overlap = 2012;
+const xml_token_t XML_text_overline_color = 2013;
+const xml_token_t XML_text_overline_mode = 2014;
+const xml_token_t XML_text_overline_style = 2015;
+const xml_token_t XML_text_overline_type = 2016;
+const xml_token_t XML_text_overline_width = 2017;
+const xml_token_t XML_text_path = 2018;
+const xml_token_t XML_text_path_allowed = 2019;
+const xml_token_t XML_text_path_mode = 2020;
+const xml_token_t XML_text_path_same_letter_heights = 2021;
+const xml_token_t XML_text_path_scale = 2022;
+const xml_token_t XML_text_position = 2023;
+const xml_token_t XML_text_properties = 2024;
+const xml_token_t XML_text_rotate_angle = 2025;
+const xml_token_t XML_text_rotation_angle = 2026;
+const xml_token_t XML_text_rotation_scale = 2027;
+const xml_token_t XML_text_scale = 2028;
+const xml_token_t XML_text_shadow = 2029;
+const xml_token_t XML_text_style = 2030;
+const xml_token_t XML_text_style_name = 2031;
+const xml_token_t XML_text_transform = 2032;
+const xml_token_t XML_text_underline_color = 2033;
+const xml_token_t XML_text_underline_mode = 2034;
+const xml_token_t XML_text_underline_style = 2035;
+const xml_token_t XML_text_underline_type = 2036;
+const xml_token_t XML_text_underline_width = 2037;
+const xml_token_t XML_textarea = 2038;
+const xml_token_t XML_textarea_horizontal_align = 2039;
+const xml_token_t XML_textarea_vertical_align = 2040;
+const xml_token_t XML_textual = 2041;
+const xml_token_t XML_texture_filter = 2042;
+const xml_token_t XML_texture_generation_mode_x = 2043;
+const xml_token_t XML_texture_generation_mode_y = 2044;
+const xml_token_t XML_texture_kind = 2045;
+const xml_token_t XML_texture_mode = 2046;
+const xml_token_t XML_thick = 2047;
+const xml_token_t XML_thin = 2048;
+const xml_token_t XML_thousand = 2049;
+const xml_token_t XML_three_dimensional = 2050;
+const xml_token_t XML_thumbnail = 2051;
+const xml_token_t XML_tick_mark_position = 2052;
+const xml_token_t XML_tick_marks_major_inner = 2053;
+const xml_token_t XML_tick_marks_major_outer = 2054;
+const xml_token_t XML_tick_marks_minor_inner = 2055;
+const xml_token_t XML_tick_marks_minor_outer = 2056;
+const xml_token_t XML_tile_repeat_offset = 2057;
+const xml_token_t XML_time = 2058;
+const xml_token_t XML_time_adjust = 2059;
+const xml_token_t XML_time_style = 2060;
+const xml_token_t XML_time_value = 2061;
+const xml_token_t XML_timestmp = 2062;
+const xml_token_t XML_timing_root = 2063;
+const xml_token_t XML_tinyint = 2064;
+const xml_token_t XML_title = 2065;
+const xml_token_t XML_to = 2066;
+const xml_token_t XML_to_another_table = 2067;
+const xml_token_t XML_to_bottom = 2068;
+const xml_token_t XML_to_center = 2069;
+const xml_token_t XML_to_left = 2070;
+const xml_token_t XML_to_lower_left = 2071;
+const xml_token_t XML_to_lower_right = 2072;
+const xml_token_t XML_to_right = 2073;
+const xml_token_t XML_to_top = 2074;
+const xml_token_t XML_to_upper_left = 2075;
+const xml_token_t XML_to_upper_right = 2076;
+const xml_token_t XML_toc_mark = 2077;
+const xml_token_t XML_toc_mark_end = 2078;
+const xml_token_t XML_toc_mark_start = 2079;
+const xml_token_t XML_toggle = 2080;
+const xml_token_t XML_top = 2081;
+const xml_token_t XML_top_end = 2082;
+const xml_token_t XML_top_left = 2083;
+const xml_token_t XML_top_right = 2084;
+const xml_token_t XML_top_start = 2085;
+const xml_token_t XML_total_percentage = 2086;
+const xml_token_t XML_trace_dependents = 2087;
+const xml_token_t XML_trace_errors = 2088;
+const xml_token_t XML_trace_precedents = 2089;
+const xml_token_t XML_track_changes = 2090;
+const xml_token_t XML_tracked_changes = 2091;
+const xml_token_t XML_transform = 2092;
+const xml_token_t XML_transformation = 2093;
+const xml_token_t XML_transition = 2094;
+const xml_token_t XML_transition_on_click = 2095;
+const xml_token_t XML_transition_speed = 2096;
+const xml_token_t XML_transition_style = 2097;
+const xml_token_t XML_transition_type = 2098;
+const xml_token_t XML_transitionFilter = 2099;
+const xml_token_t XML_translate = 2100;
+const xml_token_t XML_transliteration_country = 2101;
+const xml_token_t XML_transliteration_format = 2102;
+const xml_token_t XML_transliteration_language = 2103;
+const xml_token_t XML_transliteration_style = 2104;
+const xml_token_t XML_transparent = 2105;
+const xml_token_t XML_treat_empty_cells = 2106;
+const xml_token_t XML_triple = 2107;
+const xml_token_t XML_true = 2108;
+const xml_token_t XML_truncate_on_overflow = 2109;
+const xml_token_t XML_ttb = 2110;
+const xml_token_t XML_type = 2111;
+const xml_token_t XML_type_name = 2112;
+const xml_token_t XML_ultra_condensed = 2113;
+const xml_token_t XML_ultra_expanded = 2114;
+const xml_token_t XML_unchecked = 2115;
+const xml_token_t XML_uncover_to_bottom = 2116;
+const xml_token_t XML_uncover_to_left = 2117;
+const xml_token_t XML_uncover_to_lowerleft = 2118;
+const xml_token_t XML_uncover_to_lowerright = 2119;
+const xml_token_t XML_uncover_to_right = 2120;
+const xml_token_t XML_uncover_to_top = 2121;
+const xml_token_t XML_uncover_to_upperleft = 2122;
+const xml_token_t XML_uncover_to_upperright = 2123;
+const xml_token_t XML_underline_position = 2124;
+const xml_token_t XML_underline_thickness = 2125;
+const xml_token_t XML_unicode_range = 2126;
+const xml_token_t XML_unique = 2127;
+const xml_token_t XML_unit = 2128;
+const xml_token_t XML_units_per_em = 2129;
+const xml_token_t XML_unknown = 2130;
+const xml_token_t XML_unpublished = 2131;
+const xml_token_t XML_unsorted = 2132;
+const xml_token_t XML_up = 2133;
+const xml_token_t XML_update_rule = 2134;
+const xml_token_t XML_update_table = 2135;
+const xml_token_t XML_uppercase = 2136;
+const xml_token_t XML_url = 2137;
+const xml_token_t XML_use_banding_columns_styles = 2138;
+const xml_token_t XML_use_banding_rows_styles = 2139;
+const xml_token_t XML_use_caption = 2140;
+const xml_token_t XML_use_catalog = 2141;
+const xml_token_t XML_use_chart_objects = 2142;
+const xml_token_t XML_use_date_time_name = 2143;
+const xml_token_t XML_use_draw_objects = 2144;
+const xml_token_t XML_use_first_column_styles = 2145;
+const xml_token_t XML_use_first_row_styles = 2146;
+const xml_token_t XML_use_floating_frames = 2147;
+const xml_token_t XML_use_footer_name = 2148;
+const xml_token_t XML_use_graphics = 2149;
+const xml_token_t XML_use_header_name = 2150;
+const xml_token_t XML_use_index_marks = 2151;
+const xml_token_t XML_use_index_source_styles = 2152;
+const xml_token_t XML_use_keys_as_entries = 2153;
+const xml_token_t XML_use_labels = 2154;
+const xml_token_t XML_use_last_column_styles = 2155;
+const xml_token_t XML_use_last_row_styles = 2156;
+const xml_token_t XML_use_math_objects = 2157;
+const xml_token_t XML_use_objects = 2158;
+const xml_token_t XML_use_optimal_column_width = 2159;
+const xml_token_t XML_use_optimal_row_height = 2160;
+const xml_token_t XML_use_other_objects = 2161;
+const xml_token_t XML_use_outline_level = 2162;
+const xml_token_t XML_use_regular_expressions = 2163;
+const xml_token_t XML_use_soft_page_breaks = 2164;
+const xml_token_t XML_use_spreadsheet_objects = 2165;
+const xml_token_t XML_use_system_user = 2166;
+const xml_token_t XML_use_tables = 2167;
+const xml_token_t XML_use_wildcards = 2168;
+const xml_token_t XML_use_window_font_color = 2169;
+const xml_token_t XML_use_zero = 2170;
+const xml_token_t XML_used_hierarchy = 2171;
+const xml_token_t XML_user_defined = 2172;
+const xml_token_t XML_user_field_decl = 2173;
+const xml_token_t XML_user_field_decls = 2174;
+const xml_token_t XML_user_field_get = 2175;
+const xml_token_t XML_user_field_input = 2176;
+const xml_token_t XML_user_index = 2177;
+const xml_token_t XML_user_index_entry_template = 2178;
+const xml_token_t XML_user_index_mark = 2179;
+const xml_token_t XML_user_index_mark_end = 2180;
+const xml_token_t XML_user_index_mark_start = 2181;
+const xml_token_t XML_user_index_source = 2182;
+const xml_token_t XML_user_name = 2183;
+const xml_token_t XML_user_transformed = 2184;
+const xml_token_t XML_v_alphabetic = 2185;
+const xml_token_t XML_v_hanging = 2186;
+const xml_token_t XML_v_ideographic = 2187;
+const xml_token_t XML_v_mathematical = 2188;
+const xml_token_t XML_validation = 2189;
+const xml_token_t XML_value = 2190;
+const xml_token_t XML_value_and_percentage = 2191;
+const xml_token_t XML_value_list = 2192;
+const xml_token_t XML_value_range = 2193;
+const xml_token_t XML_value_type = 2194;
+const xml_token_t XML_values = 2195;
+const xml_token_t XML_values_cell_range_address = 2196;
+const xml_token_t XML_var = 2197;
+const xml_token_t XML_varbinary = 2198;
+const xml_token_t XML_varchar = 2199;
+const xml_token_t XML_variable = 2200;
+const xml_token_t XML_variable_decl = 2201;
+const xml_token_t XML_variable_decls = 2202;
+const xml_token_t XML_variable_get = 2203;
+const xml_token_t XML_variable_input = 2204;
+const xml_token_t XML_variable_set = 2205;
+const xml_token_t XML_variance = 2206;
+const xml_token_t XML_varp = 2207;
+const xml_token_t XML_verb = 2208;
+const xml_token_t XML_version = 2209;
+const xml_token_t XML_vertical = 2210;
+const xml_token_t XML_vertical_align = 2211;
+const xml_token_t XML_vertical_bar = 2212;
+const xml_token_t XML_vertical_checkerboard = 2213;
+const xml_token_t XML_vertical_lines = 2214;
+const xml_token_t XML_vertical_pos = 2215;
+const xml_token_t XML_vertical_rel = 2216;
+const xml_token_t XML_vertical_segments = 2217;
+const xml_token_t XML_vertical_stripes = 2218;
+const xml_token_t XML_viewBox = 2219;
+const xml_token_t XML_visibility = 2220;
+const xml_token_t XML_visible = 2221;
+const xml_token_t XML_visible_area_height = 2222;
+const xml_token_t XML_visible_area_left = 2223;
+const xml_token_t XML_visible_area_top = 2224;
+const xml_token_t XML_visible_area_width = 2225;
+const xml_token_t XML_visited_style_name = 2226;
+const xml_token_t XML_visual_effect = 2227;
+const xml_token_t XML_void = 2228;
+const xml_token_t XML_volatile = 2229;
+const xml_token_t XML_volume = 2230;
+const xml_token_t XML_vpn = 2231;
+const xml_token_t XML_vrp = 2232;
+const xml_token_t XML_vup = 2233;
+const xml_token_t XML_wall = 2234;
+const xml_token_t XML_warning = 2235;
+const xml_token_t XML_watermark = 2236;
+const xml_token_t XML_wave = 2237;
+const xml_token_t XML_wavyline = 2238;
+const xml_token_t XML_wavyline_from_bottom = 2239;
+const xml_token_t XML_wavyline_from_left = 2240;
+const xml_token_t XML_wavyline_from_right = 2241;
+const xml_token_t XML_wavyline_from_top = 2242;
+const xml_token_t XML_week_of_year = 2243;
+const xml_token_t XML_whenNotActive = 2244;
+const xml_token_t XML_wide = 2245;
+const xml_token_t XML_widows = 2246;
+const xml_token_t XML_width = 2247;
+const xml_token_t XML_widths = 2248;
+const xml_token_t XML_with_previous = 2249;
+const xml_token_t XML_word = 2250;
+const xml_token_t XML_word_count = 2251;
+const xml_token_t XML_wrap = 2252;
+const xml_token_t XML_wrap_contour = 2253;
+const xml_token_t XML_wrap_contour_mode = 2254;
+const xml_token_t XML_wrap_dynamic_threshold = 2255;
+const xml_token_t XML_wrap_influence_on_position = 2256;
+const xml_token_t XML_wrap_option = 2257;
+const xml_token_t XML_writing_mode = 2258;
+const xml_token_t XML_writing_mode_automatic = 2259;
+const xml_token_t XML_www = 2260;
+const xml_token_t XML_x = 2261;
+const xml_token_t XML_x_height = 2262;
+const xml_token_t XML_x1 = 2263;
+const xml_token_t XML_x2 = 2264;
+const xml_token_t XML_xforms = 2265;
+const xml_token_t XML_xforms_list_source = 2266;
+const xml_token_t XML_xforms_submission = 2267;
+const xml_token_t XML_xhtml = 2268;
+const xml_token_t XML_xlink = 2269;
+const xml_token_t XML_xml = 2270;
+const xml_token_t XML_y = 2271;
+const xml_token_t XML_y1 = 2272;
+const xml_token_t XML_y2 = 2273;
+const xml_token_t XML_year = 2274;
+const xml_token_t XML_years = 2275;
+const xml_token_t XML_z = 2276;
+const xml_token_t XML_z_index = 2277;
+const xml_token_t XML_zero_values = 2278;
diff --git a/src/liborcus/odf_tokens.cpp b/src/liborcus/odf_tokens.cpp
new file mode 100644
index 0000000..b20414d
--- /dev/null
+++ b/src/liborcus/odf_tokens.cpp
@@ -0,0 +1,23 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "odf_tokens.hpp"
+
+namespace orcus {
+
+namespace {
+
+#include "odf_tokens.inl"
+
+}
+
+tokens odf_tokens = tokens(token_names, token_name_count);
+
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/odf_tokens.hpp b/src/liborcus/odf_tokens.hpp
new file mode 100644
index 0000000..db1befa
--- /dev/null
+++ b/src/liborcus/odf_tokens.hpp
@@ -0,0 +1,23 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef __ORCUS_ODF_TOKENS_HPP__
+#define __ORCUS_ODF_TOKENS_HPP__
+
+#include "orcus/tokens.hpp"
+
+namespace orcus {
+
+/**
+ * Singleton instance containing all ODF tokens.
+ */
+extern tokens odf_tokens;
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/odf_tokens.inl b/src/liborcus/odf_tokens.inl
new file mode 100644
index 0000000..623c721
--- /dev/null
+++ b/src/liborcus/odf_tokens.inl
@@ -0,0 +1,2285 @@
+// This file has been auto-generated. Do not hand-edit this.
+
+const char* token_names[] = {
+ "??", // 0
+ "0", // 1
+ "0deg", // 2
+ "0grad", // 3
+ "0rad", // 4
+ "1", // 5
+ "1.3", // 6
+ "100", // 7
+ "2", // 8
+ "200", // 9
+ "3", // 10
+ "300", // 11
+ "3d", // 12
+ "400", // 13
+ "500", // 14
+ "600", // 15
+ "700", // 16
+ "800", // 17
+ "900", // 18
+ "A", // 19
+ "I", // 20
+ "ROC", // 21
+ "_blank", // 22
+ "_parent", // 23
+ "_self", // 24
+ "_top", // 25
+ "a", // 26
+ "about", // 27
+ "above", // 28
+ "accelerate", // 29
+ "accent", // 30
+ "accent-height", // 31
+ "acceptance-state", // 32
+ "accepted", // 33
+ "accumulate", // 34
+ "action", // 35
+ "active", // 36
+ "actuate", // 37
+ "add-empty-lines", // 38
+ "additional-column-statement", // 39
+ "additive", // 40
+ "address", // 41
+ "adjustment", // 42
+ "after-previous", // 43
+ "algorithm", // 44
+ "align", // 45
+ "all", // 46
+ "allow-deletes", // 47
+ "allow-empty-cell", // 48
+ "allow-inserts", // 49
+ "allow-updates", // 50
+ "alpha-numeric", // 51
+ "alphabetic", // 52
+ "alphabetical-index", // 53
+ "alphabetical-index-auto-mark-file", // 54
+ "alphabetical-index-entry-template", // 55
+ "alphabetical-index-mark", // 56
+ "alphabetical-index-mark-end", // 57
+ "alphabetical-index-mark-start", // 58
+ "alphabetical-index-source", // 59
+ "alphabetical-separators", // 60
+ "alternate", // 61
+ "always", // 62
+ "am-pm", // 63
+ "ambient-color", // 64
+ "anchor-page-number", // 65
+ "anchor-type", // 66
+ "angle", // 67
+ "angle-offset", // 68
+ "angled-connector-line", // 69
+ "angled-line", // 70
+ "anim", // 71
+ "animate", // 72
+ "animateColor", // 73
+ "animateMotion", // 74
+ "animateTransform", // 75
+ "animation", // 76
+ "animation-delay", // 77
+ "animation-direction", // 78
+ "animation-group", // 79
+ "animation-repeat", // 80
+ "animation-start-inside", // 81
+ "animation-steps", // 82
+ "animation-stop-inside", // 83
+ "animations", // 84
+ "annotation", // 85
+ "annotation-end", // 86
+ "annotations", // 87
+ "annote", // 88
+ "appear", // 89
+ "append-table-alias-name", // 90
+ "applet", // 91
+ "application-connection-settings", // 92
+ "application-data", // 93
+ "apply-command", // 94
+ "apply-design-mode", // 95
+ "apply-filter", // 96
+ "apply-style-name", // 97
+ "arc", // 98
+ "archive", // 99
+ "area", // 100
+ "area-circle", // 101
+ "area-polygon", // 102
+ "area-rectangle", // 103
+ "array", // 104
+ "arrow-down", // 105
+ "arrow-left", // 106
+ "arrow-right", // 107
+ "arrow-up", // 108
+ "article", // 109
+ "as-char", // 110
+ "as-template", // 111
+ "ascending", // 112
+ "ascent", // 113
+ "asian", // 114
+ "asterisk", // 115
+ "at-axis", // 116
+ "at-labels", // 117
+ "at-labels-and-axis", // 118
+ "attached-axis", // 119
+ "attractive", // 120
+ "attributeName", // 121
+ "audio", // 122
+ "audio-level", // 123
+ "author", // 124
+ "author-initials", // 125
+ "author-name", // 126
+ "auto", // 127
+ "auto-complete", // 128
+ "auto-create-new-frame", // 129
+ "auto-grow-height", // 130
+ "auto-grow-width", // 131
+ "auto-increment", // 132
+ "auto-position", // 133
+ "auto-reload", // 134
+ "auto-size", // 135
+ "auto-text-indent", // 136
+ "auto-update", // 137
+ "autoReverse", // 138
+ "automatic", // 139
+ "automatic-content", // 140
+ "automatic-find-labels", // 141
+ "automatic-focus", // 142
+ "automatic-order", // 143
+ "automatic-styles", // 144
+ "automatic-update", // 145
+ "average", // 146
+ "averaged-abscissa", // 147
+ "avoid-overlap", // 148
+ "axial", // 149
+ "axis", // 150
+ "axis-label-position", // 151
+ "axis-position", // 152
+ "b-spline", // 153
+ "back-scale", // 154
+ "backface-culling", // 155
+ "background", // 156
+ "background-color", // 157
+ "background-image", // 158
+ "background-objects-visible", // 159
+ "background-size", // 160
+ "background-transparency", // 161
+ "background-visible", // 162
+ "balanced", // 163
+ "base-cell-address", // 164
+ "base-dn", // 165
+ "base64Binary", // 166
+ "baseline", // 167
+ "bbox", // 168
+ "begin", // 169
+ "below", // 170
+ "bevel", // 171
+ "bibliography", // 172
+ "bibliography-configuration", // 173
+ "bibliography-data-field", // 174
+ "bibliography-entry-template", // 175
+ "bibliography-mark", // 176
+ "bibliography-source", // 177
+ "bibliography-type", // 178
+ "biggest", // 179
+ "bigint", // 180
+ "binary", // 181
+ "binary-data", // 182
+ "bind", // 183
+ "bind-styles-to-content", // 184
+ "bit", // 185
+ "bitmap", // 186
+ "blend", // 187
+ "blob", // 188
+ "blue", // 189
+ "body", // 190
+ "bold", // 191
+ "book", // 192
+ "booklet", // 193
+ "bookmark", // 194
+ "bookmark-end", // 195
+ "bookmark-start", // 196
+ "booktitle", // 197
+ "boolean", // 198
+ "boolean-comparison-mode", // 199
+ "boolean-style", // 200
+ "boolean-value", // 201
+ "border", // 202
+ "border-bottom", // 203
+ "border-color", // 204
+ "border-left", // 205
+ "border-line-width", // 206
+ "border-line-width-bottom", // 207
+ "border-line-width-left", // 208
+ "border-line-width-right", // 209
+ "border-line-width-top", // 210
+ "border-model", // 211
+ "border-right", // 212
+ "border-top", // 213
+ "both", // 214
+ "bottom", // 215
+ "bottom-end", // 216
+ "bottom-left", // 217
+ "bottom-right", // 218
+ "bottom-start", // 219
+ "bound-column", // 220
+ "bow-tie", // 221
+ "break-after", // 222
+ "break-before", // 223
+ "buddhist", // 224
+ "bullet-char", // 225
+ "bullet-relative-size", // 226
+ "butt", // 227
+ "button", // 228
+ "button-type", // 229
+ "buttons", // 230
+ "by", // 231
+ "c", // 232
+ "calcMode", // 233
+ "calculation-settings", // 234
+ "calendar", // 235
+ "cap-height", // 236
+ "capitalize", // 237
+ "capitalize-entries", // 238
+ "caption", // 239
+ "caption-angle", // 240
+ "caption-angle-type", // 241
+ "caption-escape", // 242
+ "caption-escape-direction", // 243
+ "caption-fit-line-length", // 244
+ "caption-gap", // 245
+ "caption-id", // 246
+ "caption-line-length", // 247
+ "caption-point-x", // 248
+ "caption-point-y", // 249
+ "caption-sequence-format", // 250
+ "caption-sequence-name", // 251
+ "caption-type", // 252
+ "cascade", // 253
+ "case-sensitive", // 254
+ "catalog-name", // 255
+ "categories", // 256
+ "category-and-value", // 257
+ "cell-address", // 258
+ "cell-content-change", // 259
+ "cell-content-deletion", // 260
+ "cell-count", // 261
+ "cell-protect", // 262
+ "cell-range", // 263
+ "cell-range-address", // 264
+ "cell-range-source", // 265
+ "center", // 266
+ "central", // 267
+ "chain-next-name", // 268
+ "change", // 269
+ "change-deletion", // 270
+ "change-end", // 271
+ "change-id", // 272
+ "change-info", // 273
+ "change-start", // 274
+ "change-track-table-cell", // 275
+ "changed-region", // 276
+ "chapter", // 277
+ "char", // 278
+ "character-count", // 279
+ "character-set", // 280
+ "chart", // 281
+ "chart-properties", // 282
+ "charts", // 283
+ "checkbox", // 284
+ "checked", // 285
+ "checkerboard", // 286
+ "circle", // 287
+ "citation-body-style-name", // 288
+ "citation-style-name", // 289
+ "class", // 290
+ "class-id", // 291
+ "class-names", // 292
+ "clip", // 293
+ "clob", // 294
+ "clockwise", // 295
+ "close", // 296
+ "close-back", // 297
+ "close-front", // 298
+ "close-horizontal", // 299
+ "close-vertical", // 300
+ "cm", // 301
+ "code", // 302
+ "collapse", // 303
+ "collapsing", // 304
+ "color", // 305
+ "color-interpolation", // 306
+ "color-interpolation-direction", // 307
+ "color-inversion", // 308
+ "color-mode", // 309
+ "column", // 310
+ "column-count", // 311
+ "column-definition", // 312
+ "column-definitions", // 313
+ "column-gap", // 314
+ "column-mapping", // 315
+ "column-name", // 316
+ "column-percentage", // 317
+ "column-sep", // 318
+ "column-width", // 319
+ "columns", // 320
+ "combine-entries", // 321
+ "combine-entries-with-dash", // 322
+ "combine-entries-with-pp", // 323
+ "combobox", // 324
+ "comma-separated", // 325
+ "command", // 326
+ "command-type", // 327
+ "comment", // 328
+ "complex", // 329
+ "component", // 330
+ "component-collection", // 331
+ "concave", // 332
+ "concentric-gradient-fill-allowed", // 333
+ "cond-style-name", // 334
+ "condensed", // 335
+ "condition", // 336
+ "condition-source", // 337
+ "condition-source-range-address", // 338
+ "conditional-text", // 339
+ "cone", // 340
+ "conference", // 341
+ "config", // 342
+ "config-item", // 343
+ "config-item-map-entry", // 344
+ "config-item-map-indexed", // 345
+ "config-item-map-named", // 346
+ "config-item-set", // 347
+ "connect-bars", // 348
+ "connection-data", // 349
+ "connection-name", // 350
+ "connection-resource", // 351
+ "connector", // 352
+ "consecutive-numbering", // 353
+ "consolidation", // 354
+ "constant", // 355
+ "contains-error", // 356
+ "contains-header", // 357
+ "content", // 358
+ "content-validation", // 359
+ "content-validation-name", // 360
+ "content-validations", // 361
+ "contextual-spacing", // 362
+ "continue", // 363
+ "continue-list", // 364
+ "continue-numbering", // 365
+ "continuous", // 366
+ "contour-path", // 367
+ "contour-polygon", // 368
+ "contrast", // 369
+ "control", // 370
+ "control-implementation", // 371
+ "conversion-mode", // 372
+ "convert-empty-to-null", // 373
+ "coordinate-region", // 374
+ "copy-all", // 375
+ "copy-back", // 376
+ "copy-formulas", // 377
+ "copy-of", // 378
+ "copy-outline-levels", // 379
+ "copy-results-only", // 380
+ "copy-styles", // 381
+ "corner-radius", // 382
+ "corners", // 383
+ "correct", // 384
+ "count", // 385
+ "count-empty-lines", // 386
+ "count-in-text-boxes", // 387
+ "counter-clockwise", // 388
+ "counterclockwise", // 389
+ "countnums", // 390
+ "country", // 391
+ "country-asian", // 392
+ "country-complex", // 393
+ "covered-table-cell", // 394
+ "creation-date", // 395
+ "creation-time", // 396
+ "creator", // 397
+ "creator-initials", // 398
+ "cube", // 399
+ "cubic-spline", // 400
+ "cuboid", // 401
+ "currency", // 402
+ "currency-style", // 403
+ "currency-symbol", // 404
+ "current", // 405
+ "current-date", // 406
+ "current-selected", // 407
+ "current-state", // 408
+ "current-value", // 409
+ "curve", // 410
+ "custom", // 411
+ "custom-shape", // 412
+ "custom1", // 413
+ "custom2", // 414
+ "custom3", // 415
+ "custom4", // 416
+ "custom5", // 417
+ "cut", // 418
+ "cut-offs", // 419
+ "cx", // 420
+ "cy", // 421
+ "cylinder", // 422
+ "d", // 423
+ "dash", // 424
+ "dashed", // 425
+ "data", // 426
+ "data-cell-range-address", // 427
+ "data-field", // 428
+ "data-label", // 429
+ "data-label-number", // 430
+ "data-label-series", // 431
+ "data-label-symbol", // 432
+ "data-label-text", // 433
+ "data-pilot-display-info", // 434
+ "data-pilot-field", // 435
+ "data-pilot-field-reference", // 436
+ "data-pilot-group", // 437
+ "data-pilot-group-member", // 438
+ "data-pilot-groups", // 439
+ "data-pilot-layout-info", // 440
+ "data-pilot-level", // 441
+ "data-pilot-member", // 442
+ "data-pilot-members", // 443
+ "data-pilot-sort-info", // 444
+ "data-pilot-subtotal", // 445
+ "data-pilot-subtotals", // 446
+ "data-pilot-table", // 447
+ "data-pilot-tables", // 448
+ "data-point", // 449
+ "data-source", // 450
+ "data-source-has-labels", // 451
+ "data-source-setting", // 452
+ "data-source-setting-is-list", // 453
+ "data-source-setting-name", // 454
+ "data-source-setting-type", // 455
+ "data-source-setting-value", // 456
+ "data-source-settings", // 457
+ "data-style-name", // 458
+ "data-type", // 459
+ "database", // 460
+ "database-description", // 461
+ "database-display", // 462
+ "database-name", // 463
+ "database-next", // 464
+ "database-range", // 465
+ "database-ranges", // 466
+ "database-row-number", // 467
+ "database-row-select", // 468
+ "database-source-query", // 469
+ "database-source-sql", // 470
+ "database-source-table", // 471
+ "database-table-name", // 472
+ "datasource", // 473
+ "datatype", // 474
+ "date", // 475
+ "date-adjust", // 476
+ "date-end", // 477
+ "date-start", // 478
+ "date-string", // 479
+ "date-style", // 480
+ "date-time", // 481
+ "date-time-decl", // 482
+ "date-value", // 483
+ "datetime", // 484
+ "day", // 485
+ "day-of-week", // 486
+ "days", // 487
+ "db", // 488
+ "dc", // 489
+ "dde-application", // 490
+ "dde-connection", // 491
+ "dde-connection-decl", // 492
+ "dde-connection-decls", // 493
+ "dde-item", // 494
+ "dde-link", // 495
+ "dde-links", // 496
+ "dde-source", // 497
+ "dde-topic", // 498
+ "decelerate", // 499
+ "decimal", // 500
+ "decimal-places", // 501
+ "decimal-replacement", // 502
+ "decorative", // 503
+ "deep", // 504
+ "default", // 505
+ "default-button", // 506
+ "default-cell-style-name", // 507
+ "default-outline-level", // 508
+ "default-page-layout", // 509
+ "default-row-style-name", // 510
+ "default-style", // 511
+ "default-style-name", // 512
+ "definition-src", // 513
+ "delay", // 514
+ "delay-for-repeat", // 515
+ "delete-rule", // 516
+ "deletion", // 517
+ "deletions", // 518
+ "delimiter", // 519
+ "denominator-value", // 520
+ "dependencies", // 521
+ "dependency", // 522
+ "depth", // 523
+ "desc", // 524
+ "descending", // 525
+ "descent", // 526
+ "description", // 527
+ "detail-fields", // 528
+ "detective", // 529
+ "diagonal-bl-tr", // 530
+ "diagonal-bl-tr-widths", // 531
+ "diagonal-tl-br", // 532
+ "diagonal-tl-br-widths", // 533
+ "diamond", // 534
+ "diffuse-color", // 535
+ "dim", // 536
+ "dimension", // 537
+ "direction", // 538
+ "disable", // 539
+ "disabled", // 540
+ "disc", // 541
+ "discrete", // 542
+ "display", // 543
+ "display-border", // 544
+ "display-date-time", // 545
+ "display-duplicates", // 546
+ "display-equation", // 547
+ "display-factor", // 548
+ "display-filter-buttons", // 549
+ "display-footer", // 550
+ "display-header", // 551
+ "display-label", // 552
+ "display-levels", // 553
+ "display-list", // 554
+ "display-member-mode", // 555
+ "display-name", // 556
+ "display-outline-level", // 557
+ "display-page-number", // 558
+ "display-r-square", // 559
+ "dissolve", // 560
+ "distance", // 561
+ "distance-after-sep", // 562
+ "distance-before-sep", // 563
+ "distinct", // 564
+ "distribute-letter", // 565
+ "distribute-space", // 566
+ "document", // 567
+ "document-content", // 568
+ "document-meta", // 569
+ "document-settings", // 570
+ "document-statistic", // 571
+ "document-styles", // 572
+ "domain", // 573
+ "dont-balance-text-columns", // 574
+ "dot", // 575
+ "dot-dash", // 576
+ "dot-dashed", // 577
+ "dot-dot-dash", // 578
+ "dots1", // 579
+ "dots1-length", // 580
+ "dots2", // 581
+ "dots2-length", // 582
+ "dotted", // 583
+ "double", // 584
+ "double-sided", // 585
+ "down", // 586
+ "dr3d", // 587
+ "draft", // 588
+ "draw", // 589
+ "draw-aspect", // 590
+ "draw-count", // 591
+ "drawing", // 592
+ "drawing-page", // 593
+ "drawing-page-properties", // 594
+ "drawings", // 595
+ "drill-down-on-double-click", // 596
+ "driver-settings", // 597
+ "drop-cap", // 598
+ "drop-down", // 599
+ "dropdown", // 600
+ "dur", // 601
+ "duration", // 602
+ "dynamic", // 603
+ "dynamic-spacing", // 604
+ "echo-char", // 605
+ "edge-rounding", // 606
+ "edge-rounding-mode", // 607
+ "editable", // 608
+ "editing-cycles", // 609
+ "editing-duration", // 610
+ "edition", // 611
+ "editor", // 612
+ "effect", // 613
+ "ellipse", // 614
+ "ellipsoid", // 615
+ "email", // 616
+ "embed", // 617
+ "embedded-number-behavior", // 618
+ "embedded-text", // 619
+ "embossed", // 620
+ "emissive-color", // 621
+ "emphasis", // 622
+ "enable", // 623
+ "enable-sql92-check", // 624
+ "enabled", // 625
+ "encoding", // 626
+ "enctype", // 627
+ "end", // 628
+ "end-angle", // 629
+ "end-cell-address", // 630
+ "end-color", // 631
+ "end-column", // 632
+ "end-glue-point", // 633
+ "end-guide", // 634
+ "end-indent", // 635
+ "end-intensity", // 636
+ "end-line-spacing-horizontal", // 637
+ "end-line-spacing-vertical", // 638
+ "end-position", // 639
+ "end-row", // 640
+ "end-shape", // 641
+ "end-table", // 642
+ "end-x", // 643
+ "end-y", // 644
+ "endless", // 645
+ "endnote", // 646
+ "endsync", // 647
+ "engine", // 648
+ "engraved", // 649
+ "enhanced-geometry", // 650
+ "enhanced-path", // 651
+ "entrance", // 652
+ "equal-boolean", // 653
+ "equal-integer", // 654
+ "equal-use-only-zero", // 655
+ "equation", // 656
+ "era", // 657
+ "error-category", // 658
+ "error-indicator", // 659
+ "error-lower-indicator", // 660
+ "error-lower-limit", // 661
+ "error-lower-range", // 662
+ "error-macro", // 663
+ "error-margin", // 664
+ "error-message", // 665
+ "error-percentage", // 666
+ "error-upper-indicator", // 667
+ "error-upper-limit", // 668
+ "error-upper-range", // 669
+ "escape-direction", // 670
+ "escape-processing", // 671
+ "even-columns", // 672
+ "even-rows", // 673
+ "evenodd", // 674
+ "event-listener", // 675
+ "event-listeners", // 676
+ "event-name", // 677
+ "execute", // 678
+ "execute-macro", // 679
+ "exit", // 680
+ "expanded", // 681
+ "exponent-interval", // 682
+ "exponential", // 683
+ "expression", // 684
+ "extension", // 685
+ "extra-condensed", // 686
+ "extra-expanded", // 687
+ "extrude", // 688
+ "extrusion", // 689
+ "extrusion-allowed", // 690
+ "extrusion-brightness", // 691
+ "extrusion-color", // 692
+ "extrusion-depth", // 693
+ "extrusion-diffusion", // 694
+ "extrusion-first-light-direction", // 695
+ "extrusion-first-light-harsh", // 696
+ "extrusion-first-light-level", // 697
+ "extrusion-light-face", // 698
+ "extrusion-metal", // 699
+ "extrusion-number-of-line-segments", // 700
+ "extrusion-origin", // 701
+ "extrusion-rotation-angle", // 702
+ "extrusion-rotation-center", // 703
+ "extrusion-second-light-direction", // 704
+ "extrusion-second-light-harsh", // 705
+ "extrusion-second-light-level", // 706
+ "extrusion-shininess", // 707
+ "extrusion-skew", // 708
+ "extrusion-specularity", // 709
+ "extrusion-viewpoint", // 710
+ "fade", // 711
+ "fade-from-bottom", // 712
+ "fade-from-center", // 713
+ "fade-from-left", // 714
+ "fade-from-lowerleft", // 715
+ "fade-from-lowerright", // 716
+ "fade-from-right", // 717
+ "fade-from-top", // 718
+ "fade-from-upperleft", // 719
+ "fade-from-upperright", // 720
+ "fade-out", // 721
+ "fade-to-center", // 722
+ "fadeColor", // 723
+ "false", // 724
+ "family", // 725
+ "fast", // 726
+ "field", // 727
+ "field-name", // 728
+ "field-number", // 729
+ "file", // 730
+ "file-based-database", // 731
+ "file-name", // 732
+ "fill", // 733
+ "fill-character", // 734
+ "fill-color", // 735
+ "fill-gradient-name", // 736
+ "fill-hatch-name", // 737
+ "fill-hatch-solid", // 738
+ "fill-image", // 739
+ "fill-image-height", // 740
+ "fill-image-name", // 741
+ "fill-image-ref-point", // 742
+ "fill-image-ref-point-x", // 743
+ "fill-image-ref-point-y", // 744
+ "fill-image-width", // 745
+ "fill-rule", // 746
+ "fillDefault", // 747
+ "filter", // 748
+ "filter-and", // 749
+ "filter-condition", // 750
+ "filter-name", // 751
+ "filter-options", // 752
+ "filter-or", // 753
+ "filter-set-item", // 754
+ "filter-statement", // 755
+ "first", // 756
+ "first-column", // 757
+ "first-page", // 758
+ "first-page-number", // 759
+ "first-row", // 760
+ "first-row-end-column", // 761
+ "first-row-start-column", // 762
+ "fit-to-contour", // 763
+ "fit-to-size", // 764
+ "fix", // 765
+ "fixed", // 766
+ "fixed-text", // 767
+ "flat", // 768
+ "float", // 769
+ "floating-frame", // 770
+ "floor", // 771
+ "flow-with-text", // 772
+ "fly-away", // 773
+ "fo", // 774
+ "focal-length", // 775
+ "focus-on-click", // 776
+ "font-adornments", // 777
+ "font-charset", // 778
+ "font-charset-asian", // 779
+ "font-charset-complex", // 780
+ "font-color", // 781
+ "font-face", // 782
+ "font-face-decls", // 783
+ "font-face-format", // 784
+ "font-face-name", // 785
+ "font-face-src", // 786
+ "font-face-uri", // 787
+ "font-family", // 788
+ "font-family-asian", // 789
+ "font-family-complex", // 790
+ "font-family-generic", // 791
+ "font-family-generic-asian", // 792
+ "font-family-generic-complex", // 793
+ "font-independent-line-spacing", // 794
+ "font-name", // 795
+ "font-name-asian", // 796
+ "font-name-complex", // 797
+ "font-pitch", // 798
+ "font-pitch-asian", // 799
+ "font-pitch-complex", // 800
+ "font-relief", // 801
+ "font-size", // 802
+ "font-size-asian", // 803
+ "font-size-complex", // 804
+ "font-size-rel", // 805
+ "font-size-rel-asian", // 806
+ "font-size-rel-complex", // 807
+ "font-stretch", // 808
+ "font-style", // 809
+ "font-style-asian", // 810
+ "font-style-complex", // 811
+ "font-style-name", // 812
+ "font-style-name-asian", // 813
+ "font-style-name-complex", // 814
+ "font-variant", // 815
+ "font-weight", // 816
+ "font-weight-asian", // 817
+ "font-weight-complex", // 818
+ "footer", // 819
+ "footer-decl", // 820
+ "footer-first", // 821
+ "footer-left", // 822
+ "footer-style", // 823
+ "footnote", // 824
+ "footnote-max-height", // 825
+ "footnote-sep", // 826
+ "footnotes-position", // 827
+ "for", // 828
+ "force-manual", // 829
+ "forced-exponent-sign", // 830
+ "foreground", // 831
+ "foreign", // 832
+ "form", // 833
+ "format-change", // 834
+ "format-source", // 835
+ "formatted-text", // 836
+ "forms", // 837
+ "formula", // 838
+ "formula-hidden", // 839
+ "formulas", // 840
+ "forward", // 841
+ "fraction", // 842
+ "frame", // 843
+ "frame-content", // 844
+ "frame-count", // 845
+ "frame-display-border", // 846
+ "frame-display-scrollbar", // 847
+ "frame-end-margin", // 848
+ "frame-margin-horizontal", // 849
+ "frame-margin-vertical", // 850
+ "frame-name", // 851
+ "frame-start-margin", // 852
+ "free", // 853
+ "freeze", // 854
+ "from", // 855
+ "from-another-table", // 856
+ "from-bottom", // 857
+ "from-center", // 858
+ "from-inside", // 859
+ "from-left", // 860
+ "from-lower-left", // 861
+ "from-lower-right", // 862
+ "from-right", // 863
+ "from-same-table", // 864
+ "from-top", // 865
+ "from-upper-left", // 866
+ "from-upper-right", // 867
+ "ft", // 868
+ "full", // 869
+ "full-screen", // 870
+ "function", // 871
+ "fx", // 872
+ "fy", // 873
+ "g", // 874
+ "gamma", // 875
+ "gap", // 876
+ "gap-width", // 877
+ "generator", // 878
+ "generic-control", // 879
+ "gengou", // 880
+ "get", // 881
+ "global", // 882
+ "glue-point", // 883
+ "glue-point-leaving-directions", // 884
+ "glue-point-type", // 885
+ "glue-points", // 886
+ "glyph-orientation-vertical", // 887
+ "gouraud", // 888
+ "gradient", // 889
+ "gradient-step-count", // 890
+ "gradientTransform", // 891
+ "gradientUnits", // 892
+ "grand-total", // 893
+ "graphic", // 894
+ "graphic-properties", // 895
+ "grddl", // 896
+ "green", // 897
+ "gregorian", // 898
+ "greyscale", // 899
+ "grid", // 900
+ "group-bars-per-axis", // 901
+ "group-by-field-number", // 902
+ "group-id", // 903
+ "grouped-by", // 904
+ "grouping", // 905
+ "guide-distance", // 906
+ "guide-overhang", // 907
+ "h", // 908
+ "handle", // 909
+ "handle-mirror-horizontal", // 910
+ "handle-mirror-vertical", // 911
+ "handle-polar", // 912
+ "handle-position", // 913
+ "handle-radius-range-maximum", // 914
+ "handle-radius-range-minimum", // 915
+ "handle-range-x-maximum", // 916
+ "handle-range-x-minimum", // 917
+ "handle-range-y-maximum", // 918
+ "handle-range-y-minimum", // 919
+ "handle-switched", // 920
+ "handout", // 921
+ "handout-master", // 922
+ "hanging", // 923
+ "hanja", // 924
+ "hanja_yoil", // 925
+ "has-persistent-data", // 926
+ "hatch", // 927
+ "header", // 928
+ "header-decl", // 929
+ "header-first", // 930
+ "header-footer-properties", // 931
+ "header-left", // 932
+ "header-style", // 933
+ "headers", // 934
+ "height", // 935
+ "help-message", // 936
+ "hidden", // 937
+ "hidden-and-protected", // 938
+ "hidden-paragraph", // 939
+ "hidden-text", // 940
+ "hide", // 941
+ "hide-shape", // 942
+ "hide-text", // 943
+ "high", // 944
+ "highlighted-range", // 945
+ "hijri", // 946
+ "hold", // 947
+ "hole-size", // 948
+ "horizontal", // 949
+ "horizontal-bar", // 950
+ "horizontal-checkerboard", // 951
+ "horizontal-lines", // 952
+ "horizontal-on-even", // 953
+ "horizontal-on-odd", // 954
+ "horizontal-pos", // 955
+ "horizontal-rel", // 956
+ "horizontal-segments", // 957
+ "horizontal-stripes", // 958
+ "hostname", // 959
+ "hourglass", // 960
+ "hours", // 961
+ "howpublished", // 962
+ "href", // 963
+ "hsl", // 964
+ "hyperlink-behaviour", // 965
+ "hyphenate", // 966
+ "hyphenation-keep", // 967
+ "hyphenation-ladder-count", // 968
+ "hyphenation-push-char-count", // 969
+ "hyphenation-remain-char-count", // 970
+ "i", // 971
+ "icon", // 972
+ "id", // 973
+ "identifier", // 974
+ "identify-categories", // 975
+ "ideograph-alpha", // 976
+ "ideographic", // 977
+ "ignore", // 978
+ "ignore-case", // 979
+ "ignore-driver-privileges", // 980
+ "ignore-empty-rows", // 981
+ "ignore-result", // 982
+ "illustration-index", // 983
+ "illustration-index-entry-template", // 984
+ "illustration-index-source", // 985
+ "image", // 986
+ "image-align", // 987
+ "image-count", // 988
+ "image-data", // 989
+ "image-frame", // 990
+ "image-map", // 991
+ "image-opacity", // 992
+ "image-position", // 993
+ "in", // 994
+ "inbook", // 995
+ "inch", // 996
+ "include-hidden-cells", // 997
+ "incollection", // 998
+ "increment", // 999
+ "indefinite", // 1000
+ "index", // 1001
+ "index-body", // 1002
+ "index-column", // 1003
+ "index-columns", // 1004
+ "index-entry-bibliography", // 1005
+ "index-entry-chapter", // 1006
+ "index-entry-link-end", // 1007
+ "index-entry-link-start", // 1008
+ "index-entry-page-number", // 1009
+ "index-entry-span", // 1010
+ "index-entry-tab-stop", // 1011
+ "index-entry-text", // 1012
+ "index-name", // 1013
+ "index-scope", // 1014
+ "index-source-style", // 1015
+ "index-source-styles", // 1016
+ "index-title", // 1017
+ "index-title-template", // 1018
+ "indices", // 1019
+ "information", // 1020
+ "inherit", // 1021
+ "initial-creator", // 1022
+ "inner", // 1023
+ "inproceedings", // 1024
+ "insertion", // 1025
+ "insertion-cut-off", // 1026
+ "inside", // 1027
+ "institution", // 1028
+ "int", // 1029
+ "integer", // 1030
+ "intensity", // 1031
+ "interactive-sequence", // 1032
+ "interlocking-horizontal-left", // 1033
+ "interlocking-horizontal-right", // 1034
+ "interlocking-vertical-bottom", // 1035
+ "interlocking-vertical-top", // 1036
+ "interpolation", // 1037
+ "interval-major", // 1038
+ "interval-minor-divisor", // 1039
+ "into-default-style-data-style", // 1040
+ "into-english-number", // 1041
+ "inverse", // 1042
+ "is-active", // 1043
+ "is-ascending", // 1044
+ "is-autoincrement", // 1045
+ "is-boolean", // 1046
+ "is-clustered", // 1047
+ "is-data-layout-field", // 1048
+ "is-empty-allowed", // 1049
+ "is-first-row-header-line", // 1050
+ "is-hidden", // 1051
+ "is-list-header", // 1052
+ "is-nullable", // 1053
+ "is-password-required", // 1054
+ "is-selection", // 1055
+ "is-sub-table", // 1056
+ "is-table-name-length-limited", // 1057
+ "is-tristate", // 1058
+ "is-unique", // 1059
+ "isbn", // 1060
+ "issn", // 1061
+ "italic", // 1062
+ "item", // 1063
+ "iterate", // 1064
+ "iterate-interval", // 1065
+ "iterate-type", // 1066
+ "iteration", // 1067
+ "iterative", // 1068
+ "japanese-candle-stick", // 1069
+ "jewish", // 1070
+ "join-border", // 1071
+ "journal", // 1072
+ "justify", // 1073
+ "justify-single-word", // 1074
+ "keep-text", // 1075
+ "keep-together", // 1076
+ "keep-with-next", // 1077
+ "key", // 1078
+ "key-column", // 1079
+ "key-columns", // 1080
+ "key1", // 1081
+ "key1-phonetic", // 1082
+ "key2", // 1083
+ "key2-phonetic", // 1084
+ "keySplines", // 1085
+ "keyTimes", // 1086
+ "keys", // 1087
+ "keyword", // 1088
+ "keywords", // 1089
+ "kind", // 1090
+ "km", // 1091
+ "label", // 1092
+ "label-alignment", // 1093
+ "label-arrangement", // 1094
+ "label-cell-address", // 1095
+ "label-cell-range-address", // 1096
+ "label-followed-by", // 1097
+ "label-position", // 1098
+ "label-position-negative", // 1099
+ "label-range", // 1100
+ "label-ranges", // 1101
+ "label-separator", // 1102
+ "label-width-and-position", // 1103
+ "landscape", // 1104
+ "language", // 1105
+ "language-asian", // 1106
+ "language-complex", // 1107
+ "laser", // 1108
+ "last", // 1109
+ "last-column", // 1110
+ "last-column-spanned", // 1111
+ "last-page", // 1112
+ "last-row", // 1113
+ "last-row-end-column", // 1114
+ "last-row-spanned", // 1115
+ "last-row-start-column", // 1116
+ "last-visited-page", // 1117
+ "latin", // 1118
+ "layer", // 1119
+ "layer-set", // 1120
+ "layout-grid-base-height", // 1121
+ "layout-grid-base-width", // 1122
+ "layout-grid-color", // 1123
+ "layout-grid-display", // 1124
+ "layout-grid-lines", // 1125
+ "layout-grid-mode", // 1126
+ "layout-grid-print", // 1127
+ "layout-grid-ruby-below", // 1128
+ "layout-grid-ruby-height", // 1129
+ "layout-grid-snap-to", // 1130
+ "layout-grid-standard-mode", // 1131
+ "layout-mode", // 1132
+ "leader-char", // 1133
+ "leader-color", // 1134
+ "leader-style", // 1135
+ "leader-text", // 1136
+ "leader-text-style", // 1137
+ "leader-type", // 1138
+ "leader-width", // 1139
+ "leave-gap", // 1140
+ "left", // 1141
+ "left-outside", // 1142
+ "legend", // 1143
+ "legend-align", // 1144
+ "legend-expansion", // 1145
+ "legend-expansion-aspect-ratio", // 1146
+ "legend-position", // 1147
+ "length", // 1148
+ "letter-kerning", // 1149
+ "letter-spacing", // 1150
+ "letters", // 1151
+ "level", // 1152
+ "light", // 1153
+ "lighting-mode", // 1154
+ "line", // 1155
+ "line-break", // 1156
+ "line-distance", // 1157
+ "line-height", // 1158
+ "line-height-at-least", // 1159
+ "line-number", // 1160
+ "line-skew", // 1161
+ "line-spacing", // 1162
+ "line-style", // 1163
+ "linear", // 1164
+ "linearGradient", // 1165
+ "linenumbering-configuration", // 1166
+ "linenumbering-separator", // 1167
+ "lines", // 1168
+ "link-data-style-to-source", // 1169
+ "link-to-source-data", // 1170
+ "linked-cell", // 1171
+ "list", // 1172
+ "list-header", // 1173
+ "list-id", // 1174
+ "list-item", // 1175
+ "list-level", // 1176
+ "list-level-label-alignment", // 1177
+ "list-level-position-and-space-mode", // 1178
+ "list-level-properties", // 1179
+ "list-level-style-bullet", // 1180
+ "list-level-style-image", // 1181
+ "list-level-style-number", // 1182
+ "list-linkage-type", // 1183
+ "list-property", // 1184
+ "list-source", // 1185
+ "list-source-type", // 1186
+ "list-style", // 1187
+ "list-style-name", // 1188
+ "list-tab-stop-position", // 1189
+ "list-value", // 1190
+ "listbox", // 1191
+ "listtab", // 1192
+ "local-socket", // 1193
+ "logarithmic", // 1194
+ "login", // 1195
+ "login-timeout", // 1196
+ "long", // 1197
+ "long-dash", // 1198
+ "longvarbinary", // 1199
+ "longvarchar", // 1200
+ "lowercase", // 1201
+ "lr", // 1202
+ "lr-tb", // 1203
+ "ltr", // 1204
+ "luminance", // 1205
+ "m", // 1206
+ "macro-name", // 1207
+ "main-entry", // 1208
+ "main-entry-style-name", // 1209
+ "main-sequence", // 1210
+ "major", // 1211
+ "manual", // 1212
+ "map", // 1213
+ "margin", // 1214
+ "margin-bottom", // 1215
+ "margin-left", // 1216
+ "margin-right", // 1217
+ "margin-top", // 1218
+ "margins", // 1219
+ "marked-invalid", // 1220
+ "marker", // 1221
+ "marker-end", // 1222
+ "marker-end-center", // 1223
+ "marker-end-width", // 1224
+ "marker-start", // 1225
+ "marker-start-center", // 1226
+ "marker-start-width", // 1227
+ "master-element", // 1228
+ "master-fields", // 1229
+ "master-page", // 1230
+ "master-page-name", // 1231
+ "master-styles", // 1232
+ "mastersthesis", // 1233
+ "math", // 1234
+ "mathematical", // 1235
+ "matrix-covered", // 1236
+ "max", // 1237
+ "max-denominator-value", // 1238
+ "max-edge", // 1239
+ "max-height", // 1240
+ "max-length", // 1241
+ "max-row-count", // 1242
+ "max-value", // 1243
+ "max-width", // 1244
+ "maximum", // 1245
+ "maximum-difference", // 1246
+ "may-break-between-rows", // 1247
+ "may-script", // 1248
+ "mean-value", // 1249
+ "measure", // 1250
+ "measure-align", // 1251
+ "measure-vertical-align", // 1252
+ "media", // 1253
+ "media-call", // 1254
+ "media-type", // 1255
+ "medium", // 1256
+ "melt", // 1257
+ "member-count", // 1258
+ "member-difference", // 1259
+ "member-name", // 1260
+ "member-percentage", // 1261
+ "member-percentage-difference", // 1262
+ "member-type", // 1263
+ "message-type", // 1264
+ "meta", // 1265
+ "meta-field", // 1266
+ "method", // 1267
+ "mi", // 1268
+ "middle", // 1269
+ "mime-type", // 1270
+ "mimetype", // 1271
+ "min", // 1272
+ "min-decimal-places", // 1273
+ "min-denominator-digits", // 1274
+ "min-edge", // 1275
+ "min-exponent-digits", // 1276
+ "min-height", // 1277
+ "min-integer-digits", // 1278
+ "min-label-distance", // 1279
+ "min-label-width", // 1280
+ "min-numerator-digits", // 1281
+ "min-row-height", // 1282
+ "min-value", // 1283
+ "min-width", // 1284
+ "minimum", // 1285
+ "minor", // 1286
+ "minutes", // 1287
+ "mirror", // 1288
+ "mirror-horizontal", // 1289
+ "mirror-vertical", // 1290
+ "mirrored", // 1291
+ "misc", // 1292
+ "miter", // 1293
+ "mm", // 1294
+ "mode", // 1295
+ "model", // 1296
+ "modern", // 1297
+ "modification-date", // 1298
+ "modification-time", // 1299
+ "modifiers", // 1300
+ "modulate", // 1301
+ "mono", // 1302
+ "month", // 1303
+ "months", // 1304
+ "motion-path", // 1305
+ "mouse-as-pen", // 1306
+ "mouse-visible", // 1307
+ "move", // 1308
+ "move-from-bottom", // 1309
+ "move-from-left", // 1310
+ "move-from-lowerleft", // 1311
+ "move-from-lowerright", // 1312
+ "move-from-right", // 1313
+ "move-from-top", // 1314
+ "move-from-upperleft", // 1315
+ "move-from-upperright", // 1316
+ "move-short", // 1317
+ "movement", // 1318
+ "movement-cut-off", // 1319
+ "moving-average", // 1320
+ "multi-deletion-spanned", // 1321
+ "multi-line", // 1322
+ "multiple", // 1323
+ "name", // 1324
+ "name-and-extension", // 1325
+ "named", // 1326
+ "named-expression", // 1327
+ "named-expressions", // 1328
+ "named-range", // 1329
+ "named-symbol", // 1330
+ "nav-order", // 1331
+ "navigation-mode", // 1332
+ "near-axis", // 1333
+ "near-axis-other-side", // 1334
+ "near-origin", // 1335
+ "never", // 1336
+ "new", // 1337
+ "next", // 1338
+ "next-page", // 1339
+ "next-style-name", // 1340
+ "no-action", // 1341
+ "no-limit", // 1342
+ "no-nulls", // 1343
+ "no-repeat", // 1344
+ "no-wrap", // 1345
+ "node-type", // 1346
+ "nohref", // 1347
+ "non-primitive", // 1348
+ "non-whitespace-character-count", // 1349
+ "none", // 1350
+ "nonzero", // 1351
+ "normal", // 1352
+ "normals-direction", // 1353
+ "normals-kind", // 1354
+ "note", // 1355
+ "note-body", // 1356
+ "note-citation", // 1357
+ "note-class", // 1358
+ "note-continuation-notice-backward", // 1359
+ "note-continuation-notice-forward", // 1360
+ "note-ref", // 1361
+ "notes", // 1362
+ "notes-configuration", // 1363
+ "nothing", // 1364
+ "notify-on-update-of-ranges", // 1365
+ "null-date", // 1366
+ "null-year", // 1367
+ "nullable", // 1368
+ "num-format", // 1369
+ "num-letter-sync", // 1370
+ "num-prefix", // 1371
+ "num-suffix", // 1372
+ "number", // 1373
+ "number-all-superior", // 1374
+ "number-and-name", // 1375
+ "number-columns-repeated", // 1376
+ "number-columns-spanned", // 1377
+ "number-lines", // 1378
+ "number-matrix-columns-spanned", // 1379
+ "number-matrix-rows-spanned", // 1380
+ "number-no-superior", // 1381
+ "number-position", // 1382
+ "number-rows-repeated", // 1383
+ "number-rows-spanned", // 1384
+ "number-style", // 1385
+ "number-wrapped-paragraphs", // 1386
+ "numbered-entries", // 1387
+ "numbered-paragraph", // 1388
+ "numeric", // 1389
+ "object", // 1390
+ "object-count", // 1391
+ "object-index", // 1392
+ "object-index-entry-template", // 1393
+ "object-index-source", // 1394
+ "object-name", // 1395
+ "object-ole", // 1396
+ "objectBoundingBox", // 1397
+ "objects", // 1398
+ "oblique", // 1399
+ "odd-columns", // 1400
+ "odd-rows", // 1401
+ "office", // 1402
+ "offset", // 1403
+ "ole-action", // 1404
+ "ole-draw-aspect", // 1405
+ "ole-object-count", // 1406
+ "on-click", // 1407
+ "on-update-keep-size", // 1408
+ "on-update-keep-styles", // 1409
+ "onLoad", // 1410
+ "onRequest", // 1411
+ "once-concurrent", // 1412
+ "once-successive", // 1413
+ "opacity", // 1414
+ "opacity-name", // 1415
+ "open", // 1416
+ "open-horizontal", // 1417
+ "open-vertical", // 1418
+ "operation", // 1419
+ "operator", // 1420
+ "option", // 1421
+ "order", // 1422
+ "order-statement", // 1423
+ "organizations", // 1424
+ "orgchart", // 1425
+ "orientation", // 1426
+ "origin", // 1427
+ "orphans", // 1428
+ "other", // 1429
+ "out", // 1430
+ "outer", // 1431
+ "outline", // 1432
+ "outline-level", // 1433
+ "outline-level-style", // 1434
+ "outline-style", // 1435
+ "outline-subtotals-bottom", // 1436
+ "outline-subtotals-top", // 1437
+ "outside", // 1438
+ "outside-end", // 1439
+ "outside-start", // 1440
+ "overflow-behavior", // 1441
+ "overlap", // 1442
+ "overline-position", // 1443
+ "overline-thickness", // 1444
+ "p", // 1445
+ "paced", // 1446
+ "pad", // 1447
+ "padding", // 1448
+ "padding-bottom", // 1449
+ "padding-left", // 1450
+ "padding-right", // 1451
+ "padding-top", // 1452
+ "page", // 1453
+ "page-adjust", // 1454
+ "page-breaks-on-group-change", // 1455
+ "page-content", // 1456
+ "page-continuation", // 1457
+ "page-count", // 1458
+ "page-end-margin", // 1459
+ "page-height", // 1460
+ "page-layout", // 1461
+ "page-layout-name", // 1462
+ "page-layout-properties", // 1463
+ "page-number", // 1464
+ "page-sequence", // 1465
+ "page-start-margin", // 1466
+ "page-step-size", // 1467
+ "page-thumbnail", // 1468
+ "page-usage", // 1469
+ "page-variable-get", // 1470
+ "page-variable-set", // 1471
+ "page-width", // 1472
+ "pages", // 1473
+ "panose-1", // 1474
+ "paper-tray-name", // 1475
+ "par", // 1476
+ "paragraph", // 1477
+ "paragraph-content", // 1478
+ "paragraph-count", // 1479
+ "paragraph-end-margin", // 1480
+ "paragraph-properties", // 1481
+ "paragraph-start-margin", // 1482
+ "paragraph-style-name", // 1483
+ "parallel", // 1484
+ "param", // 1485
+ "parameter-name-substitution", // 1486
+ "parent", // 1487
+ "parent-style-name", // 1488
+ "parse-sql-statement", // 1489
+ "password", // 1490
+ "path", // 1491
+ "path-id", // 1492
+ "path-stretchpoint-x", // 1493
+ "path-stretchpoint-y", // 1494
+ "pause", // 1495
+ "pc", // 1496
+ "pending", // 1497
+ "percentage", // 1498
+ "percentage-data-style-name", // 1499
+ "percentage-style", // 1500
+ "perspective", // 1501
+ "phdthesis", // 1502
+ "phong", // 1503
+ "pie-offset", // 1504
+ "placeholder", // 1505
+ "placeholder-type", // 1506
+ "placing", // 1507
+ "plain-number", // 1508
+ "plain-number-and-name", // 1509
+ "play", // 1510
+ "play-full", // 1511
+ "plot-area", // 1512
+ "plugin", // 1513
+ "plus", // 1514
+ "points", // 1515
+ "polygon", // 1516
+ "polyline", // 1517
+ "polynomial", // 1518
+ "port", // 1519
+ "portrait", // 1520
+ "position", // 1521
+ "possessive-form", // 1522
+ "post", // 1523
+ "power", // 1524
+ "precision", // 1525
+ "precision-as-shown", // 1526
+ "prefix", // 1527
+ "presentation", // 1528
+ "presentation-page-layout", // 1529
+ "presentation-page-layout-name", // 1530
+ "preset-class", // 1531
+ "preset-id", // 1532
+ "preset-sub-type", // 1533
+ "previous", // 1534
+ "previous-page", // 1535
+ "primary", // 1536
+ "print", // 1537
+ "print-content", // 1538
+ "print-date", // 1539
+ "print-orientation", // 1540
+ "print-page-order", // 1541
+ "print-range", // 1542
+ "print-ranges", // 1543
+ "print-time", // 1544
+ "print-view", // 1545
+ "printable", // 1546
+ "printed-by", // 1547
+ "printer", // 1548
+ "prior", // 1549
+ "proceedings", // 1550
+ "product", // 1551
+ "projection", // 1552
+ "properties", // 1553
+ "property", // 1554
+ "property-name", // 1555
+ "protect", // 1556
+ "protected", // 1557
+ "protection-key", // 1558
+ "protection-key-digest-algorithm", // 1559
+ "pt", // 1560
+ "publisher", // 1561
+ "punctuation-wrap", // 1562
+ "push", // 1563
+ "pyramid", // 1564
+ "quarter", // 1565
+ "quarters", // 1566
+ "queries", // 1567
+ "query", // 1568
+ "query-collection", // 1569
+ "query-name", // 1570
+ "r", // 1571
+ "radial", // 1572
+ "radialGradient", // 1573
+ "radio", // 1574
+ "random", // 1575
+ "range-usable-as", // 1576
+ "readonly", // 1577
+ "real", // 1578
+ "records", // 1579
+ "recreate-on-edit", // 1580
+ "rect", // 1581
+ "rectangle", // 1582
+ "rectangular", // 1583
+ "red", // 1584
+ "ref", // 1585
+ "ref-name", // 1586
+ "reference-format", // 1587
+ "reference-mark", // 1588
+ "reference-mark-end", // 1589
+ "reference-mark-start", // 1590
+ "referenced-table-name", // 1591
+ "reflect", // 1592
+ "refresh-delay", // 1593
+ "region-center", // 1594
+ "region-left", // 1595
+ "region-right", // 1596
+ "register-true", // 1597
+ "register-truth-ref-style-name", // 1598
+ "regression-curve", // 1599
+ "regression-force-intercept", // 1600
+ "regression-intercept-value", // 1601
+ "regression-max-degree", // 1602
+ "regression-moving-type", // 1603
+ "regression-name", // 1604
+ "regression-period", // 1605
+ "regression-type", // 1606
+ "regular-polygon", // 1607
+ "rejected", // 1608
+ "rejecting-change-id", // 1609
+ "rel-column-width", // 1610
+ "rel-height", // 1611
+ "rel-width", // 1612
+ "related-column-name", // 1613
+ "relative-tab-stop-position", // 1614
+ "remove", // 1615
+ "remove-dependents", // 1616
+ "remove-precedents", // 1617
+ "repeat", // 1618
+ "repeat-column", // 1619
+ "repeat-content", // 1620
+ "repeat-row", // 1621
+ "repeatCount", // 1622
+ "repeatDur", // 1623
+ "repeated", // 1624
+ "replace", // 1625
+ "report-type", // 1626
+ "reports", // 1627
+ "reset", // 1628
+ "restart", // 1629
+ "restart-numbering", // 1630
+ "restart-on-page", // 1631
+ "restartDefault", // 1632
+ "restrict", // 1633
+ "reverse", // 1634
+ "reverse-direction", // 1635
+ "rfc-language-tag", // 1636
+ "rfc-language-tag-asian", // 1637
+ "rfc-language-tag-complex", // 1638
+ "rgb", // 1639
+ "right", // 1640
+ "right-angled-axes", // 1641
+ "right-outside", // 1642
+ "rl", // 1643
+ "rl-tb", // 1644
+ "roll-from-bottom", // 1645
+ "roll-from-left", // 1646
+ "roll-from-right", // 1647
+ "roll-from-top", // 1648
+ "roman", // 1649
+ "rotate", // 1650
+ "rotation", // 1651
+ "rotation-align", // 1652
+ "rotation-angle", // 1653
+ "round", // 1654
+ "row", // 1655
+ "row-count", // 1656
+ "row-height", // 1657
+ "row-mapping", // 1658
+ "row-number", // 1659
+ "row-percentage", // 1660
+ "row-retrieving-statement", // 1661
+ "rows", // 1662
+ "ruby", // 1663
+ "ruby-align", // 1664
+ "ruby-base", // 1665
+ "ruby-position", // 1666
+ "ruby-properties", // 1667
+ "ruby-text", // 1668
+ "run-through", // 1669
+ "running-total", // 1670
+ "rx", // 1671
+ "ry", // 1672
+ "s", // 1673
+ "scale", // 1674
+ "scale-min", // 1675
+ "scale-text", // 1676
+ "scale-to", // 1677
+ "scale-to-X", // 1678
+ "scale-to-Y", // 1679
+ "scale-to-pages", // 1680
+ "scenario", // 1681
+ "scenario-ranges", // 1682
+ "scene", // 1683
+ "schema-definition", // 1684
+ "schema-name", // 1685
+ "school", // 1686
+ "scientific-number", // 1687
+ "screen", // 1688
+ "script", // 1689
+ "script-asian", // 1690
+ "script-complex", // 1691
+ "script-type", // 1692
+ "scripts", // 1693
+ "scroll", // 1694
+ "search-criteria-must-apply-to-whole-cell", // 1695
+ "secondary-fill-color", // 1696
+ "seconds", // 1697
+ "section", // 1698
+ "section-name", // 1699
+ "section-properties", // 1700
+ "section-source", // 1701
+ "segments", // 1702
+ "select-page", // 1703
+ "selected", // 1704
+ "selected-page", // 1705
+ "selection", // 1706
+ "selection-indices", // 1707
+ "self", // 1708
+ "semi-automatic", // 1709
+ "semi-condensed", // 1710
+ "semi-expanded", // 1711
+ "sender-city", // 1712
+ "sender-company", // 1713
+ "sender-country", // 1714
+ "sender-email", // 1715
+ "sender-fax", // 1716
+ "sender-firstname", // 1717
+ "sender-initials", // 1718
+ "sender-lastname", // 1719
+ "sender-phone-private", // 1720
+ "sender-phone-work", // 1721
+ "sender-position", // 1722
+ "sender-postal-code", // 1723
+ "sender-state-or-province", // 1724
+ "sender-street", // 1725
+ "sender-title", // 1726
+ "sentence-count", // 1727
+ "separating", // 1728
+ "separation-character", // 1729
+ "separator", // 1730
+ "seq", // 1731
+ "sequence", // 1732
+ "sequence-decl", // 1733
+ "sequence-decls", // 1734
+ "sequence-ref", // 1735
+ "series", // 1736
+ "series-source", // 1737
+ "server-database", // 1738
+ "server-map", // 1739
+ "set", // 1740
+ "set-default", // 1741
+ "set-null", // 1742
+ "settings", // 1743
+ "shade-mode", // 1744
+ "shadow", // 1745
+ "shadow-color", // 1746
+ "shadow-offset-x", // 1747
+ "shadow-offset-y", // 1748
+ "shadow-opacity", // 1749
+ "shadow-slant", // 1750
+ "shape", // 1751
+ "shape-id", // 1752
+ "shapes", // 1753
+ "sharpness", // 1754
+ "sheet-name", // 1755
+ "shininess", // 1756
+ "short", // 1757
+ "show", // 1758
+ "show-deleted", // 1759
+ "show-details", // 1760
+ "show-empty", // 1761
+ "show-end-of-presentation-slide", // 1762
+ "show-filter-button", // 1763
+ "show-logo", // 1764
+ "show-shape", // 1765
+ "show-text", // 1766
+ "show-unit", // 1767
+ "shrink-to-fit", // 1768
+ "side-by-side", // 1769
+ "simple", // 1770
+ "single", // 1771
+ "size", // 1772
+ "skewX", // 1773
+ "skewY", // 1774
+ "skip-white-space", // 1775
+ "slide", // 1776
+ "slope", // 1777
+ "slow", // 1778
+ "small-caps", // 1779
+ "smallint", // 1780
+ "smil", // 1781
+ "snap-to-layout-grid", // 1782
+ "soft-page-break", // 1783
+ "solid", // 1784
+ "solid-type", // 1785
+ "sort", // 1786
+ "sort-algorithm", // 1787
+ "sort-ascending", // 1788
+ "sort-by", // 1789
+ "sort-by-position", // 1790
+ "sort-by-x-values", // 1791
+ "sort-groups", // 1792
+ "sort-key", // 1793
+ "sort-mode", // 1794
+ "sound", // 1795
+ "source", // 1796
+ "source-cell-range", // 1797
+ "source-cell-range-addresses", // 1798
+ "source-field-name", // 1799
+ "source-name", // 1800
+ "source-range-address", // 1801
+ "source-service", // 1802
+ "space", // 1803
+ "space-after", // 1804
+ "space-before", // 1805
+ "span", // 1806
+ "specular", // 1807
+ "specular-color", // 1808
+ "speed", // 1809
+ "sphere", // 1810
+ "spin-button", // 1811
+ "spiral-inward-left", // 1812
+ "spiral-inward-right", // 1813
+ "spiral-outward-left", // 1814
+ "spiral-outward-right", // 1815
+ "spiralin-left", // 1816
+ "spiralin-right", // 1817
+ "spiralout-left", // 1818
+ "spiralout-right", // 1819
+ "spline", // 1820
+ "spline-order", // 1821
+ "spline-resolution", // 1822
+ "spreadMethod", // 1823
+ "spreadsheet", // 1824
+ "sql", // 1825
+ "sql-pass-through", // 1826
+ "sql-statement", // 1827
+ "sqlnull", // 1828
+ "square", // 1829
+ "stacked", // 1830
+ "stagger-even", // 1831
+ "stagger-odd", // 1832
+ "standard", // 1833
+ "standard-deviation", // 1834
+ "standard-error", // 1835
+ "star", // 1836
+ "start", // 1837
+ "start-angle", // 1838
+ "start-color", // 1839
+ "start-column", // 1840
+ "start-glue-point", // 1841
+ "start-guide", // 1842
+ "start-indent", // 1843
+ "start-intensity", // 1844
+ "start-line-spacing-horizontal", // 1845
+ "start-line-spacing-vertical", // 1846
+ "start-numbering-at", // 1847
+ "start-page", // 1848
+ "start-position", // 1849
+ "start-row", // 1850
+ "start-scale", // 1851
+ "start-shape", // 1852
+ "start-table", // 1853
+ "start-value", // 1854
+ "start-with-navigator", // 1855
+ "state", // 1856
+ "status", // 1857
+ "stay-on-top", // 1858
+ "stdev", // 1859
+ "stdevp", // 1860
+ "stemh", // 1861
+ "stemv", // 1862
+ "step", // 1863
+ "step-center-x", // 1864
+ "step-center-y", // 1865
+ "step-end", // 1866
+ "step-size", // 1867
+ "step-start", // 1868
+ "steps", // 1869
+ "stock-gain-marker", // 1870
+ "stock-loss-marker", // 1871
+ "stock-range-line", // 1872
+ "stop", // 1873
+ "stop-color", // 1874
+ "stop-opacity", // 1875
+ "straight-line", // 1876
+ "stretch", // 1877
+ "stretch-from-bottom", // 1878
+ "stretch-from-left", // 1879
+ "stretch-from-right", // 1880
+ "stretch-from-top", // 1881
+ "strict", // 1882
+ "strikethrough-position", // 1883
+ "strikethrough-thickness", // 1884
+ "string", // 1885
+ "string-value", // 1886
+ "string-value-if-false", // 1887
+ "string-value-if-true", // 1888
+ "string-value-phonetic", // 1889
+ "stripes", // 1890
+ "stroke", // 1891
+ "stroke-color", // 1892
+ "stroke-dash", // 1893
+ "stroke-dash-names", // 1894
+ "stroke-linecap", // 1895
+ "stroke-linejoin", // 1896
+ "stroke-opacity", // 1897
+ "stroke-width", // 1898
+ "struct", // 1899
+ "structure-protected", // 1900
+ "style", // 1901
+ "style-name", // 1902
+ "style-override", // 1903
+ "styles", // 1904
+ "sub", // 1905
+ "sub-item", // 1906
+ "subject", // 1907
+ "submit", // 1908
+ "subtitle", // 1909
+ "subtotal-field", // 1910
+ "subtotal-rule", // 1911
+ "subtotal-rules", // 1912
+ "subtype", // 1913
+ "suffix", // 1914
+ "sum", // 1915
+ "super", // 1916
+ "suppress-version-columns", // 1917
+ "svg", // 1918
+ "swiss", // 1919
+ "syllable-count", // 1920
+ "symbol-color", // 1921
+ "symbol-height", // 1922
+ "symbol-image", // 1923
+ "symbol-name", // 1924
+ "symbol-type", // 1925
+ "symbol-width", // 1926
+ "system", // 1927
+ "system-driver-settings", // 1928
+ "tab", // 1929
+ "tab-color", // 1930
+ "tab-cycle", // 1931
+ "tab-index", // 1932
+ "tab-ref", // 1933
+ "tab-stop", // 1934
+ "tab-stop-distance", // 1935
+ "tab-stops", // 1936
+ "table", // 1937
+ "table-background", // 1938
+ "table-cell", // 1939
+ "table-cell-properties", // 1940
+ "table-centering", // 1941
+ "table-column", // 1942
+ "table-column-group", // 1943
+ "table-column-properties", // 1944
+ "table-columns", // 1945
+ "table-count", // 1946
+ "table-definition", // 1947
+ "table-definitions", // 1948
+ "table-exclude-filter", // 1949
+ "table-fields", // 1950
+ "table-filter", // 1951
+ "table-filter-pattern", // 1952
+ "table-formula", // 1953
+ "table-header-columns", // 1954
+ "table-header-rows", // 1955
+ "table-include-filter", // 1956
+ "table-index", // 1957
+ "table-index-entry-template", // 1958
+ "table-index-source", // 1959
+ "table-name", // 1960
+ "table-of-content", // 1961
+ "table-of-content-entry-template", // 1962
+ "table-of-content-source", // 1963
+ "table-properties", // 1964
+ "table-representation", // 1965
+ "table-representations", // 1966
+ "table-row", // 1967
+ "table-row-group", // 1968
+ "table-row-properties", // 1969
+ "table-rows", // 1970
+ "table-setting", // 1971
+ "table-settings", // 1972
+ "table-source", // 1973
+ "table-template", // 1974
+ "table-type", // 1975
+ "table-type-filter", // 1976
+ "tabular-layout", // 1977
+ "target-cell-address", // 1978
+ "target-frame", // 1979
+ "target-frame-name", // 1980
+ "target-range-address", // 1981
+ "targetElement", // 1982
+ "tb", // 1983
+ "tb-lr", // 1984
+ "tb-rl", // 1985
+ "techreport", // 1986
+ "template", // 1987
+ "template-name", // 1988
+ "text", // 1989
+ "text-align", // 1990
+ "text-align-last", // 1991
+ "text-align-source", // 1992
+ "text-areas", // 1993
+ "text-autospace", // 1994
+ "text-blinking", // 1995
+ "text-box", // 1996
+ "text-combine", // 1997
+ "text-combine-end-char", // 1998
+ "text-combine-start-char", // 1999
+ "text-content", // 2000
+ "text-emphasize", // 2001
+ "text-indent", // 2002
+ "text-input", // 2003
+ "text-line-through-color", // 2004
+ "text-line-through-mode", // 2005
+ "text-line-through-style", // 2006
+ "text-line-through-text", // 2007
+ "text-line-through-text-style", // 2008
+ "text-line-through-type", // 2009
+ "text-line-through-width", // 2010
+ "text-outline", // 2011
+ "text-overlap", // 2012
+ "text-overline-color", // 2013
+ "text-overline-mode", // 2014
+ "text-overline-style", // 2015
+ "text-overline-type", // 2016
+ "text-overline-width", // 2017
+ "text-path", // 2018
+ "text-path-allowed", // 2019
+ "text-path-mode", // 2020
+ "text-path-same-letter-heights", // 2021
+ "text-path-scale", // 2022
+ "text-position", // 2023
+ "text-properties", // 2024
+ "text-rotate-angle", // 2025
+ "text-rotation-angle", // 2026
+ "text-rotation-scale", // 2027
+ "text-scale", // 2028
+ "text-shadow", // 2029
+ "text-style", // 2030
+ "text-style-name", // 2031
+ "text-transform", // 2032
+ "text-underline-color", // 2033
+ "text-underline-mode", // 2034
+ "text-underline-style", // 2035
+ "text-underline-type", // 2036
+ "text-underline-width", // 2037
+ "textarea", // 2038
+ "textarea-horizontal-align", // 2039
+ "textarea-vertical-align", // 2040
+ "textual", // 2041
+ "texture-filter", // 2042
+ "texture-generation-mode-x", // 2043
+ "texture-generation-mode-y", // 2044
+ "texture-kind", // 2045
+ "texture-mode", // 2046
+ "thick", // 2047
+ "thin", // 2048
+ "thousand", // 2049
+ "three-dimensional", // 2050
+ "thumbnail", // 2051
+ "tick-mark-position", // 2052
+ "tick-marks-major-inner", // 2053
+ "tick-marks-major-outer", // 2054
+ "tick-marks-minor-inner", // 2055
+ "tick-marks-minor-outer", // 2056
+ "tile-repeat-offset", // 2057
+ "time", // 2058
+ "time-adjust", // 2059
+ "time-style", // 2060
+ "time-value", // 2061
+ "timestmp", // 2062
+ "timing-root", // 2063
+ "tinyint", // 2064
+ "title", // 2065
+ "to", // 2066
+ "to-another-table", // 2067
+ "to-bottom", // 2068
+ "to-center", // 2069
+ "to-left", // 2070
+ "to-lower-left", // 2071
+ "to-lower-right", // 2072
+ "to-right", // 2073
+ "to-top", // 2074
+ "to-upper-left", // 2075
+ "to-upper-right", // 2076
+ "toc-mark", // 2077
+ "toc-mark-end", // 2078
+ "toc-mark-start", // 2079
+ "toggle", // 2080
+ "top", // 2081
+ "top-end", // 2082
+ "top-left", // 2083
+ "top-right", // 2084
+ "top-start", // 2085
+ "total-percentage", // 2086
+ "trace-dependents", // 2087
+ "trace-errors", // 2088
+ "trace-precedents", // 2089
+ "track-changes", // 2090
+ "tracked-changes", // 2091
+ "transform", // 2092
+ "transformation", // 2093
+ "transition", // 2094
+ "transition-on-click", // 2095
+ "transition-speed", // 2096
+ "transition-style", // 2097
+ "transition-type", // 2098
+ "transitionFilter", // 2099
+ "translate", // 2100
+ "transliteration-country", // 2101
+ "transliteration-format", // 2102
+ "transliteration-language", // 2103
+ "transliteration-style", // 2104
+ "transparent", // 2105
+ "treat-empty-cells", // 2106
+ "triple", // 2107
+ "true", // 2108
+ "truncate-on-overflow", // 2109
+ "ttb", // 2110
+ "type", // 2111
+ "type-name", // 2112
+ "ultra-condensed", // 2113
+ "ultra-expanded", // 2114
+ "unchecked", // 2115
+ "uncover-to-bottom", // 2116
+ "uncover-to-left", // 2117
+ "uncover-to-lowerleft", // 2118
+ "uncover-to-lowerright", // 2119
+ "uncover-to-right", // 2120
+ "uncover-to-top", // 2121
+ "uncover-to-upperleft", // 2122
+ "uncover-to-upperright", // 2123
+ "underline-position", // 2124
+ "underline-thickness", // 2125
+ "unicode-range", // 2126
+ "unique", // 2127
+ "unit", // 2128
+ "units-per-em", // 2129
+ "unknown", // 2130
+ "unpublished", // 2131
+ "unsorted", // 2132
+ "up", // 2133
+ "update-rule", // 2134
+ "update-table", // 2135
+ "uppercase", // 2136
+ "url", // 2137
+ "use-banding-columns-styles", // 2138
+ "use-banding-rows-styles", // 2139
+ "use-caption", // 2140
+ "use-catalog", // 2141
+ "use-chart-objects", // 2142
+ "use-date-time-name", // 2143
+ "use-draw-objects", // 2144
+ "use-first-column-styles", // 2145
+ "use-first-row-styles", // 2146
+ "use-floating-frames", // 2147
+ "use-footer-name", // 2148
+ "use-graphics", // 2149
+ "use-header-name", // 2150
+ "use-index-marks", // 2151
+ "use-index-source-styles", // 2152
+ "use-keys-as-entries", // 2153
+ "use-labels", // 2154
+ "use-last-column-styles", // 2155
+ "use-last-row-styles", // 2156
+ "use-math-objects", // 2157
+ "use-objects", // 2158
+ "use-optimal-column-width", // 2159
+ "use-optimal-row-height", // 2160
+ "use-other-objects", // 2161
+ "use-outline-level", // 2162
+ "use-regular-expressions", // 2163
+ "use-soft-page-breaks", // 2164
+ "use-spreadsheet-objects", // 2165
+ "use-system-user", // 2166
+ "use-tables", // 2167
+ "use-wildcards", // 2168
+ "use-window-font-color", // 2169
+ "use-zero", // 2170
+ "used-hierarchy", // 2171
+ "user-defined", // 2172
+ "user-field-decl", // 2173
+ "user-field-decls", // 2174
+ "user-field-get", // 2175
+ "user-field-input", // 2176
+ "user-index", // 2177
+ "user-index-entry-template", // 2178
+ "user-index-mark", // 2179
+ "user-index-mark-end", // 2180
+ "user-index-mark-start", // 2181
+ "user-index-source", // 2182
+ "user-name", // 2183
+ "user-transformed", // 2184
+ "v-alphabetic", // 2185
+ "v-hanging", // 2186
+ "v-ideographic", // 2187
+ "v-mathematical", // 2188
+ "validation", // 2189
+ "value", // 2190
+ "value-and-percentage", // 2191
+ "value-list", // 2192
+ "value-range", // 2193
+ "value-type", // 2194
+ "values", // 2195
+ "values-cell-range-address", // 2196
+ "var", // 2197
+ "varbinary", // 2198
+ "varchar", // 2199
+ "variable", // 2200
+ "variable-decl", // 2201
+ "variable-decls", // 2202
+ "variable-get", // 2203
+ "variable-input", // 2204
+ "variable-set", // 2205
+ "variance", // 2206
+ "varp", // 2207
+ "verb", // 2208
+ "version", // 2209
+ "vertical", // 2210
+ "vertical-align", // 2211
+ "vertical-bar", // 2212
+ "vertical-checkerboard", // 2213
+ "vertical-lines", // 2214
+ "vertical-pos", // 2215
+ "vertical-rel", // 2216
+ "vertical-segments", // 2217
+ "vertical-stripes", // 2218
+ "viewBox", // 2219
+ "visibility", // 2220
+ "visible", // 2221
+ "visible-area-height", // 2222
+ "visible-area-left", // 2223
+ "visible-area-top", // 2224
+ "visible-area-width", // 2225
+ "visited-style-name", // 2226
+ "visual-effect", // 2227
+ "void", // 2228
+ "volatile", // 2229
+ "volume", // 2230
+ "vpn", // 2231
+ "vrp", // 2232
+ "vup", // 2233
+ "wall", // 2234
+ "warning", // 2235
+ "watermark", // 2236
+ "wave", // 2237
+ "wavyline", // 2238
+ "wavyline-from-bottom", // 2239
+ "wavyline-from-left", // 2240
+ "wavyline-from-right", // 2241
+ "wavyline-from-top", // 2242
+ "week-of-year", // 2243
+ "whenNotActive", // 2244
+ "wide", // 2245
+ "widows", // 2246
+ "width", // 2247
+ "widths", // 2248
+ "with-previous", // 2249
+ "word", // 2250
+ "word-count", // 2251
+ "wrap", // 2252
+ "wrap-contour", // 2253
+ "wrap-contour-mode", // 2254
+ "wrap-dynamic-threshold", // 2255
+ "wrap-influence-on-position", // 2256
+ "wrap-option", // 2257
+ "writing-mode", // 2258
+ "writing-mode-automatic", // 2259
+ "www", // 2260
+ "x", // 2261
+ "x-height", // 2262
+ "x1", // 2263
+ "x2", // 2264
+ "xforms", // 2265
+ "xforms-list-source", // 2266
+ "xforms-submission", // 2267
+ "xhtml", // 2268
+ "xlink", // 2269
+ "xml", // 2270
+ "y", // 2271
+ "y1", // 2272
+ "y2", // 2273
+ "year", // 2274
+ "years", // 2275
+ "z", // 2276
+ "z-index", // 2277
+ "zero-values" // 2278
+};
+
+size_t token_name_count = 2279; \ No newline at end of file
diff --git a/src/liborcus/ods_content_xml_context.cpp b/src/liborcus/ods_content_xml_context.cpp
new file mode 100644
index 0000000..5f07594
--- /dev/null
+++ b/src/liborcus/ods_content_xml_context.cpp
@@ -0,0 +1,900 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "ods_content_xml_context.hpp"
+#include "odf_token_constants.hpp"
+#include "odf_namespace_types.hpp"
+#include "session_context.hpp"
+#include "ods_session_data.hpp"
+#include "impl_utils.hpp"
+
+#include <orcus/spreadsheet/import_interface.hpp>
+#include <orcus/spreadsheet/import_interface_styles.hpp>
+
+#include <iostream>
+#include <fstream>
+#include <algorithm>
+#include <cstring>
+
+#include <mdds/sorted_string_map.hpp>
+
+using namespace std;
+namespace ss = orcus::spreadsheet;
+
+namespace orcus {
+
+namespace {
+
+namespace cell_value {
+
+using map_type = mdds::sorted_string_map<ods_content_xml_context::cell_value_type, mdds::string_view_map_entry>;
+
+// Keys must be sorted.
+map_type::entry entries[] = {
+ { "date", ods_content_xml_context::vt_date },
+ { "float", ods_content_xml_context::vt_float },
+ { "string", ods_content_xml_context::vt_string }
+};
+
+const map_type& get()
+{
+ static map_type cv_map(
+ entries, std::size(entries), ods_content_xml_context::vt_unknown);
+
+ return cv_map;
+}
+
+} // namespace cell_value
+
+void pick_up_named_range_or_expression(
+ session_context& cxt, const xml_token_attrs_t& attrs, xmlns_id_t exp_attr_ns, xml_token_t exp_attr_name,
+ ods_session_data::named_exp_type name_type, ss::sheet_t scope)
+{
+ std::string_view name;
+ std::string_view expression;
+ std::string_view base;
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.ns == exp_attr_ns && attr.name == exp_attr_name)
+ {
+ expression = cxt.intern(attr);
+ continue;
+ }
+
+ switch (attr.name)
+ {
+ case XML_name:
+ name = cxt.intern(attr);
+ break;
+ case XML_base_cell_address:
+ base = cxt.intern(attr);
+ break;
+ }
+ }
+
+ auto& ods_data = cxt.get_data<ods_session_data>();
+
+ if (!name.empty() && !expression.empty() && !base.empty())
+ ods_data.named_exps.emplace_back(name, expression, base, name_type, scope);
+}
+
+} // anonymous namespace
+
+// ============================================================================
+
+ods_content_xml_context::sheet_data::sheet_data() :
+ sheet(nullptr), index(-1) {}
+
+void ods_content_xml_context::sheet_data::reset()
+{
+ sheet = nullptr;
+ index = -1;
+}
+
+ods_content_xml_context::row_attr::row_attr() :
+ number_rows_repeated(1)
+{
+}
+
+ods_content_xml_context::cell_attr::cell_attr() :
+ number_columns_repeated(1),
+ type(vt_unknown),
+ value(0.0),
+ formula_grammar(spreadsheet::formula_grammar_t::ods)
+{
+}
+
+// ============================================================================
+
+ods_content_xml_context::ods_content_xml_context(session_context& session_cxt, const tokens& tokens, spreadsheet::iface::import_factory* factory) :
+ xml_context_base(session_cxt, tokens),
+ mp_factory(factory),
+ m_row(0), m_col(0), m_col_repeated(0),
+ m_para_index(0),
+ m_has_content(false),
+ m_styles(),
+ m_child_styles(session_cxt, tokens, mp_factory->get_styles()),
+ m_child_para(session_cxt, tokens, factory->get_shared_strings(), m_styles),
+ m_child_dde_links(session_cxt, tokens)
+{
+ register_child(&m_child_styles);
+ register_child(&m_child_para);
+ register_child(&m_child_dde_links);
+
+ spreadsheet::iface::import_global_settings* gs = mp_factory->get_global_settings();
+ if (gs)
+ {
+ // Set the default null date to 1899-12-30 per specification (19.614).
+ gs->set_origin_date(1899, 12, 30);
+ }
+}
+
+ods_content_xml_context::~ods_content_xml_context() = default;
+
+xml_context_base* ods_content_xml_context::create_child_context(xmlns_id_t ns, xml_token_t name)
+{
+ if (ns == NS_odf_text && name == XML_p)
+ {
+ m_child_para.reset();
+ return &m_child_para;
+ }
+
+ if (ns == NS_odf_office && name == XML_automatic_styles)
+ {
+ m_child_styles.reset();
+ return &m_child_styles;
+ }
+
+ if (ns == NS_odf_table && name == XML_dde_links)
+ {
+ m_child_dde_links.reset();
+ return &m_child_dde_links;
+ }
+
+ return nullptr;
+}
+
+void ods_content_xml_context::end_child_context(xmlns_id_t ns, xml_token_t name, xml_context_base* child)
+{
+ if (ns == NS_odf_text && name == XML_p)
+ {
+ text_para_context* para_context = static_cast<text_para_context*>(child);
+ m_has_content = !para_context->empty();
+ m_para_index = para_context->get_string_index();
+ }
+ else if (ns == NS_odf_office && name == XML_automatic_styles)
+ {
+ auto new_styles = m_child_styles.pop_styles();
+ merge(m_styles, new_styles);
+ assert(new_styles.empty());
+
+ if (get_config().debug)
+ dump_state(m_styles, std::cout);
+
+ spreadsheet::iface::import_styles* xstyles = mp_factory->get_styles();
+ if (xstyles)
+ {
+ for (const auto& [style_name, style_value] : m_styles)
+ {
+ if (style_value->family == style_family_table_cell)
+ {
+ // TODO: Actually we need a boolean flag to see if it is an automatic style or a real style
+ // currently we have no way to set a real style to a cell anyway
+ const auto& cell = std::get<odf_style::cell>(style_value->data);
+ m_cell_format_map.insert(name2id_type::value_type(style_name, cell.xf));
+ }
+ }
+ }
+ }
+}
+
+void ods_content_xml_context::start_element(xmlns_id_t ns, xml_token_t name, const xml_token_attrs_t& attrs)
+{
+ xml_token_pair_t parent = push_stack(ns, name);
+
+ if (ns == NS_odf_office)
+ {
+ switch (name)
+ {
+ case XML_body:
+ break;
+ case XML_spreadsheet:
+ break;
+ default:
+ warn_unhandled();
+ }
+ }
+ else if (ns == NS_odf_table)
+ {
+ switch (name)
+ {
+ case XML_calculation_settings:
+ break;
+ case XML_null_date:
+ xml_element_expected(parent, NS_odf_table, XML_calculation_settings);
+ start_null_date(attrs);
+ break;
+ case XML_table:
+ start_table(parent, attrs);
+ break;
+ case XML_table_column:
+ {
+ static const xml_elem_set_t expected = {
+ { NS_odf_table, XML_table },
+ { NS_odf_table, XML_table_column_group },
+ { NS_odf_table, XML_table_columns },
+ { NS_odf_table, XML_table_header_columns }
+ };
+ xml_element_expected(parent, expected);
+ start_column(attrs);
+ break;
+ }
+ case XML_table_row:
+ {
+ static const xml_elem_set_t expected = {
+ { NS_odf_table, XML_table },
+ { NS_odf_table, XML_table_header_rows },
+ { NS_odf_table, XML_table_row_group },
+ };
+ xml_element_expected(parent, expected);
+ start_row(attrs);
+ break;
+ }
+ case XML_table_cell:
+ xml_element_expected(parent, NS_odf_table, XML_table_row);
+ start_cell(attrs);
+ break;
+ case XML_dde_links:
+ xml_element_expected(parent, NS_odf_office, XML_spreadsheet);
+ break;
+ case XML_dde_link:
+ xml_element_expected(parent, NS_odf_table, XML_dde_links);
+ break;
+ case XML_named_expressions:
+ {
+ static const xml_elem_set_t expected = {
+ { NS_odf_office, XML_spreadsheet },
+ { NS_odf_table, XML_table },
+ };
+ xml_element_expected(parent, expected);
+ break;
+ }
+ case XML_named_range:
+ start_named_range(parent, attrs);
+ break;
+ case XML_named_expression:
+ start_named_expression(parent, attrs);
+ break;
+ default:
+ warn_unhandled();
+ }
+ }
+ else
+ warn_unhandled();
+}
+
+bool ods_content_xml_context::end_element(xmlns_id_t ns, xml_token_t name)
+{
+ if (ns == NS_odf_office)
+ {
+ switch (name)
+ {
+ case XML_body:
+ break;
+ case XML_spreadsheet:
+ end_spreadsheet();
+ break;
+ default:
+ ;
+ }
+ }
+ else if (ns == NS_odf_table)
+ {
+ switch (name)
+ {
+ case XML_calculation_settings:
+ break;
+ case XML_null_date:
+ break;
+ case XML_table:
+ end_table();
+ break;
+ case XML_table_column:
+ end_column();
+ break;
+ case XML_table_row:
+ end_row();
+ break;
+ case XML_table_cell:
+ end_cell();
+ break;
+ case XML_named_range:
+ end_named_range();
+ break;
+ case XML_named_expression:
+ end_named_expression();
+ break;
+ default:
+ ;
+ }
+ }
+ return pop_stack(ns, name);
+}
+
+void ods_content_xml_context::start_null_date(const xml_token_attrs_t& attrs)
+{
+ spreadsheet::iface::import_global_settings* gs = mp_factory->get_global_settings();
+ if (!gs)
+ // Global settings not available. No point going further.
+ return;
+
+ std::string_view null_date;
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.ns == NS_odf_table && attr.name == XML_date_value)
+ null_date = attr.value;
+ }
+
+ date_time_t val = date_time_t::from_chars(null_date);
+
+ gs->set_origin_date(val.year, val.month, val.day);
+}
+
+void ods_content_xml_context::start_table(const xml_token_pair_t& parent, const xml_token_attrs_t& attrs)
+{
+ static const xml_elem_set_t expected = {
+ { NS_odf_office, XML_spreadsheet },
+ { NS_odf_table, XML_dde_link },
+ };
+ xml_element_expected(parent, expected);
+
+ if (parent == xml_token_pair_t(NS_odf_office, XML_spreadsheet))
+ {
+ std::string_view name;
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.ns == NS_odf_table && attr.name == XML_name)
+ name = attr.value;
+ }
+
+ m_tables.push_back(mp_factory->append_sheet(m_tables.size(), name));
+ m_cur_sheet.sheet = m_tables.back();
+ m_cur_sheet.index = m_tables.size() - 1;
+
+ if (get_config().debug)
+ cout << "start table " << name << endl;
+
+ m_row = m_col = 0;
+ }
+ else if (parent == xml_token_pair_t(NS_odf_table, XML_dde_link))
+ {
+ if (get_config().debug)
+ cout << "start table (DDE link)" << endl;
+ }
+}
+
+void ods_content_xml_context::end_table()
+{
+ if (m_cur_sheet.sheet)
+ {
+ if (get_config().debug)
+ cout << "end table" << endl;
+
+ m_cur_sheet.reset();
+ }
+}
+
+void ods_content_xml_context::start_named_range(const xml_token_pair_t& parent, const xml_token_attrs_t& attrs)
+{
+ xml_element_expected(parent, NS_odf_table, XML_named_expressions);
+
+ pick_up_named_range_or_expression(
+ get_session_context(), attrs, NS_odf_table, XML_cell_range_address,
+ ods_session_data::ne_range, m_cur_sheet.index);
+}
+
+void ods_content_xml_context::end_named_range()
+{
+}
+
+void ods_content_xml_context::start_named_expression(const xml_token_pair_t& parent, const xml_token_attrs_t& attrs)
+{
+ xml_element_expected(parent, NS_odf_table, XML_named_expressions);
+
+ pick_up_named_range_or_expression(
+ get_session_context(), attrs, NS_odf_table, XML_expression,
+ ods_session_data::ne_expression, m_cur_sheet.index);
+}
+
+void ods_content_xml_context::end_named_expression()
+{
+}
+
+void ods_content_xml_context::start_column(const xml_token_attrs_t& attrs)
+{
+ if (!m_cur_sheet.sheet)
+ return;
+
+ spreadsheet::iface::import_sheet_properties* sheet_props =
+ m_cur_sheet.sheet->get_sheet_properties();
+
+ if (!sheet_props)
+ return;
+
+ std::string_view style_name;
+ std::string_view default_cell_style_name;
+ m_col_repeated = 1;
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.ns == NS_odf_table)
+ {
+ switch (attr.name)
+ {
+ case XML_style_name:
+ style_name = attr.value;
+ break;
+ case XML_default_cell_style_name:
+ default_cell_style_name = intern(attr);
+ break;
+ case XML_number_columns_repeated:
+ m_col_repeated = to_long(attr.value);
+ break;
+ }
+ }
+ }
+
+ if (auto it = m_styles.find(style_name); it != m_styles.end())
+ {
+ const odf_style& style = *it->second;
+
+ sheet_props->set_column_width(
+ m_col, m_col_repeated,
+ std::get<odf_style::column>(style.data).width.value,
+ std::get<odf_style::column>(style.data).width.unit);
+ }
+
+ push_default_column_cell_style(default_cell_style_name, m_col_repeated);
+}
+
+void ods_content_xml_context::end_column()
+{
+ m_col += m_col_repeated;
+}
+
+void ods_content_xml_context::start_row(const xml_token_attrs_t& attrs)
+{
+ m_col = 0;
+ m_row_attr = row_attr();
+
+ std::string_view style_name;
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.ns == NS_odf_table)
+ {
+ switch (attr.name)
+ {
+ case XML_number_rows_repeated:
+ m_row_attr.number_rows_repeated = to_long(attr.value);
+ break;
+ case XML_style_name:
+ style_name = attr.value;
+ break;
+ }
+ }
+ }
+
+ if (get_config().debug)
+ std::cout << "row: (style='" << style_name << "')" << std::endl;
+
+ if (!m_cur_sheet.sheet)
+ return;
+
+ // Pass row properties to the interface.
+ spreadsheet::iface::import_sheet_properties* sheet_props =
+ m_cur_sheet.sheet->get_sheet_properties();
+
+ if (sheet_props)
+ {
+ if (auto it = m_styles.find(style_name); it != m_styles.end())
+ {
+ const odf_style& style = *it->second;
+ if (style.family == style_family_table_row)
+ {
+ const auto& data = std::get<odf_style::row>(style.data);
+ if (data.height_set)
+ sheet_props->set_row_height(m_row, data.height.value, data.height.unit);
+ }
+ }
+ }
+}
+
+void ods_content_xml_context::end_row()
+{
+ if (m_row_attr.number_rows_repeated > 1)
+ {
+ // TODO: repeat this row.
+ if (get_config().debug)
+ cout << "TODO: repeat this row " << m_row_attr.number_rows_repeated << " times." << endl;
+ }
+ m_row += m_row_attr.number_rows_repeated;
+}
+
+void ods_content_xml_context::start_cell(const xml_token_attrs_t& attrs)
+{
+ m_cell_attr = cell_attr();
+
+ /**
+ * Process the prefixed raw formula string stored as attribute value.
+ */
+ auto process_formula = [](std::string_view str) -> std::string_view
+ {
+ if (str.empty())
+ return {};
+
+ // Formula is prefixed with formula type, followed by a ':'
+ // then the actual formula content.
+
+ // First, detect prefix if any. Only try up to the first 5 characters.
+ const char* p0 = str.data();
+ const char* end = p0 + std::min<size_t>(str.size(), 5);
+ size_t prefix_size = 0;
+ for (const char* p = p0; p != end; ++p)
+ {
+ if (*p == ':')
+ {
+ // Prefix separator found.
+ prefix_size = p - p0;
+ break;
+ }
+
+ if (!is_alpha(*p))
+ // Only alphabets are allowed in the prefix space.
+ break;
+ }
+
+ std::string_view prefix, formula;
+ if (prefix_size)
+ {
+ prefix = std::string_view(p0, prefix_size);
+ const char* p = p0;
+ p += prefix_size + 1;
+ end = p0 + str.size();
+ formula = std::string_view(p, end - p);
+ }
+ else
+ {
+ // TODO : Handle cases where a formula doesn't have a prefix.
+ }
+
+ // Formula needs to begin with '='.
+ if (formula.empty() || formula[0] != '=')
+ return {};
+
+ // Remove the '='.
+ formula = std::string_view(formula.data()+1, formula.size()-1);
+
+ if (prefix == "of")
+ {
+ // ODF formula. No action needed.
+ }
+
+ return formula;
+ };
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.value.empty())
+ continue;
+
+ if (attr.ns == NS_odf_table)
+ {
+ switch (attr.name)
+ {
+ case XML_style_name:
+ {
+ m_cell_attr.style_name = intern(attr);
+ break;
+ }
+ case XML_number_columns_repeated:
+ m_cell_attr.number_columns_repeated = to_long(attr.value);
+ break;
+ case XML_formula:
+ m_cell_attr.formula = process_formula(attr.value);
+ m_cell_attr.formula = intern(m_cell_attr.formula);
+ break;
+ default:
+ ;
+ }
+ }
+
+ if (attr.ns == NS_odf_office)
+ {
+ switch (attr.name)
+ {
+ case XML_value:
+ {
+ const char* end = attr.value.data() + attr.value.size();
+ char* endptr;
+ double val = strtod(attr.value.data(), &endptr);
+ if (endptr == end)
+ m_cell_attr.value = val;
+ break;
+ }
+ case XML_value_type:
+ m_cell_attr.type = cell_value::get().find(attr.value.data(), attr.value.size());
+ break;
+ case XML_date_value:
+ m_cell_attr.date_value = attr.value;
+ break;
+ default:
+ ;
+ }
+ }
+ }
+}
+
+void ods_content_xml_context::end_cell()
+{
+ push_cell_format();
+ push_cell_value();
+
+ ++m_col;
+ if (m_cell_attr.number_columns_repeated > 1)
+ {
+ int col_upper = m_col + m_cell_attr.number_columns_repeated - 2;
+ for (; m_col <= col_upper; ++m_col)
+ push_cell_value();
+ }
+ m_has_content = false;
+}
+
+std::optional<std::size_t> ods_content_xml_context::push_named_cell_style(std::string_view style_name)
+{
+ ss::iface::import_styles* xstyles = mp_factory->get_styles();
+ if (!xstyles)
+ return {};
+
+ const ods_session_data& ods_data = get_session_context().get_data<ods_session_data>();
+
+ auto it = ods_data.styles_map.find(style_name);
+ if (it == ods_data.styles_map.end())
+ return {};
+
+ // found in the named styles store.
+ const odf_style& style = *it->second;
+ if (style.family != style_family_table_cell)
+ // it's a named style but not a cell style
+ return {};
+
+ // It references a named style. Create a direct cell (aka automatic) style
+ // that references this named style, and set that as the cell format since
+ // we can't reference a named style directly from a cell.
+ const auto& celldata = std::get<odf_style::cell>(style.data);
+
+ ss::iface::import_xf* xf = xstyles->start_xf(ss::xf_category_t::cell);
+ ENSURE_INTERFACE(xf, import_xf);
+ xf->set_style_xf(celldata.xf);
+ std::size_t xfid = xf->commit();
+ m_cell_format_map.insert({style_name, xfid});
+ return xfid;
+}
+
+void ods_content_xml_context::push_default_column_cell_style(
+ std::string_view style_name, ss::col_t span)
+{
+ if (span < 1)
+ {
+ std::ostringstream os;
+ os << "Column " << m_col << " on sheet " << m_cur_sheet.index << " has an invalid span of " << span;
+ warn(os.str());
+ return;
+ }
+
+ if (style_name.empty())
+ return;
+
+ if (!m_cur_sheet.sheet)
+ return;
+
+ if (auto it = m_cell_format_map.find(style_name); it != m_cell_format_map.end())
+ {
+ // automatic style already present for this name.
+ m_cur_sheet.sheet->set_column_format(m_col, span, it->second);
+ return;
+ }
+
+ auto xfid = push_named_cell_style(style_name);
+ if (!xfid)
+ {
+ std::ostringstream os;
+ os << "failed to push a new cell style of name '" << style_name << "' to cache";
+ warn(os.str());
+ return;
+ }
+
+ m_cur_sheet.sheet->set_column_format(m_col, span, *xfid);
+}
+
+void ods_content_xml_context::push_cell_format()
+{
+ if (!m_cur_sheet.sheet)
+ return;
+
+ if (auto it = m_cell_format_map.find(m_cell_attr.style_name); it != m_cell_format_map.end())
+ {
+ for (ss::col_t col_offset = 0; col_offset < m_cell_attr.number_columns_repeated; ++col_offset)
+ m_cur_sheet.sheet->set_format(m_row, m_col + col_offset, it->second);
+ // style key found and direct cell format set.
+ return;
+ }
+
+ auto xfid = push_named_cell_style(m_cell_attr.style_name);
+ if (!xfid)
+ return;
+
+ for (ss::col_t col_offset = 0; col_offset < m_cell_attr.number_columns_repeated; ++col_offset)
+ m_cur_sheet.sheet->set_format(m_row, m_col + col_offset, *xfid);
+}
+
+void ods_content_xml_context::push_cell_value()
+{
+ assert(m_cur_sheet.index >= 0); // this is expected to be called only within a valid sheet scope.
+
+ bool has_formula = !m_cell_attr.formula.empty();
+ if (has_formula)
+ {
+ // Store formula cell data for later processing.
+ auto& ods_data = get_session_context().get_data<ods_session_data>();
+ ods_data.formulas.emplace_back(
+ m_cur_sheet.index, m_row, m_col, m_cell_attr.formula_grammar, m_cell_attr.formula);
+
+ ods_session_data::formula& formula_data = ods_data.formulas.back();
+
+ // Store formula result.
+ switch (m_cell_attr.type)
+ {
+ case vt_float:
+ {
+ formula_data.result.type = orcus::ods_session_data::rt_numeric;
+ formula_data.result.numeric_value = m_cell_attr.value;
+ break;
+ }
+ case vt_string:
+ // TODO : pass string result here. We need to decide whether
+ // to pass a string ID or a raw string.
+ break;
+ default:
+ ;
+ }
+ return;
+ }
+
+ if (m_cur_sheet.sheet)
+ {
+ switch (m_cell_attr.type)
+ {
+ case vt_float:
+ m_cur_sheet.sheet->set_value(m_row, m_col, m_cell_attr.value);
+ break;
+ case vt_string:
+ if (m_has_content)
+ m_cur_sheet.sheet->set_string(m_row, m_col, m_para_index);
+ break;
+ case vt_date:
+ {
+ date_time_t val = date_time_t::from_chars(m_cell_attr.date_value);
+ m_cur_sheet.sheet->set_date_time(
+ m_row, m_col, val.year, val.month, val.day, val.hour, val.minute, val.second);
+ break;
+ }
+ default:
+ ;
+ }
+ }
+}
+
+void ods_content_xml_context::end_spreadsheet()
+{
+ auto& ods_data = get_session_context().get_data<ods_session_data>();
+
+ ss::iface::import_reference_resolver* resolver =
+ mp_factory->get_reference_resolver(ss::formula_ref_context_t::named_expression_base);
+
+ if (resolver)
+ {
+ for (const ods_session_data::named_exp& data : ods_data.named_exps)
+ {
+ if (get_config().debug)
+ {
+ cout << "named expression: name='" << data.name
+ << "'; base='" << data.base
+ << "'; expression='" << data.expression
+ << "'; sheet-scope=" << data.scope
+ << endl;
+ }
+
+ ss::src_address_t base = resolver->resolve_address(data.base);
+
+ ss::iface::import_named_expression* named_exp = nullptr;
+
+ if (data.scope >= 0)
+ {
+ // sheet local scope
+ assert(data.scope < ss::sheet_t(m_tables.size()));
+ named_exp = m_tables[data.scope]->get_named_expression();
+ }
+ else
+ {
+ // global scope.
+ named_exp = mp_factory->get_named_expression();
+ }
+
+ if (named_exp)
+ {
+ named_exp->set_base_position(base);
+ switch (data.type)
+ {
+ case ods_session_data::ne_range:
+ named_exp->set_named_range(data.name, data.expression);
+ break;
+ case ods_session_data::ne_expression:
+ named_exp->set_named_expression(data.name, data.expression);
+ break;
+ default:
+ ;
+ }
+ named_exp->commit();
+ }
+ }
+ }
+
+ // Push all formula cells. Formula cells needs to be processed after all
+ // the sheet data have been imported, else 3D reference would fail to
+ // resolve.
+ for (ods_session_data::formula& data : ods_data.formulas)
+ {
+ if (data.sheet < 0 || static_cast<size_t>(data.sheet) >= m_tables.size())
+ // Invalid sheet index.
+ continue;
+
+ spreadsheet::iface::import_sheet* sheet = m_tables[data.sheet];
+ if (sheet)
+ {
+ spreadsheet::iface::import_formula* formula = sheet->get_formula();
+ if (formula)
+ {
+ formula->set_position(data.row, data.column);
+ formula->set_formula(data.grammar, data.exp);
+
+ switch (data.result.type)
+ {
+ case ods_session_data::rt_numeric:
+ formula->set_result_value(data.result.numeric_value);
+ break;
+ case ods_session_data::rt_string:
+ case ods_session_data::rt_error:
+ case ods_session_data::rt_none:
+ default:
+ ;
+ }
+
+ formula->commit();
+ }
+ }
+ }
+
+ // Clear the formula buffer.
+ ods_data.formulas.clear();
+}
+
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/ods_content_xml_context.hpp b/src/liborcus/ods_content_xml_context.hpp
new file mode 100644
index 0000000..bc50a67
--- /dev/null
+++ b/src/liborcus/ods_content_xml_context.hpp
@@ -0,0 +1,138 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_ODSCONTEXT_XML_CONTEXT_HPP
+#define INCLUDED_ORCUS_ODSCONTEXT_XML_CONTEXT_HPP
+
+#include "xml_context_base.hpp"
+#include "odf_para_context.hpp"
+#include "ods_dde_links_context.hpp"
+#include "odf_styles.hpp"
+#include "odf_styles_context.hpp"
+#include "orcus/spreadsheet/types.hpp"
+
+#include <vector>
+#include <unordered_map>
+
+namespace orcus {
+
+namespace spreadsheet { namespace iface {
+
+class import_factory;
+class import_sheet;
+
+}}
+
+class ods_content_xml_context : public xml_context_base
+{
+ typedef std::unordered_map<std::string_view, std::size_t> name2id_type;
+
+public:
+ struct sheet_data
+ {
+ spreadsheet::iface::import_sheet* sheet;
+ spreadsheet::sheet_t index;
+
+ sheet_data();
+
+ void reset();
+ };
+
+ struct row_attr
+ {
+ long number_rows_repeated;
+ row_attr();
+ };
+
+ enum cell_value_type { vt_unknown, vt_float, vt_string, vt_date };
+
+ struct cell_attr
+ {
+ long number_columns_repeated;
+ cell_value_type type;
+ double value;
+ std::string_view date_value;
+ std::string_view style_name;
+
+ std::string_view formula;
+ spreadsheet::formula_grammar_t formula_grammar;
+
+ cell_attr();
+ };
+
+ ods_content_xml_context(session_context& session_cxt, const tokens& tokens, spreadsheet::iface::import_factory* factory);
+ virtual ~ods_content_xml_context() override;
+
+ virtual xml_context_base* create_child_context(xmlns_id_t ns, xml_token_t name) override;
+ virtual void end_child_context(xmlns_id_t ns, xml_token_t name, xml_context_base* child) override;
+
+ virtual void start_element(xmlns_id_t ns, xml_token_t name, const xml_token_attrs_t& attrs) override;
+ virtual bool end_element(xmlns_id_t ns, xml_token_t name) override;
+
+private:
+ void start_null_date(const xml_token_attrs_t& attrs);
+
+ void start_table(const xml_token_pair_t& parent, const xml_token_attrs_t& attrs);
+ void end_table();
+
+ void start_named_range(const xml_token_pair_t& parent, const xml_token_attrs_t& attrs);
+ void end_named_range();
+
+ void start_named_expression(const xml_token_pair_t& parent, const xml_token_attrs_t& attrs);
+ void end_named_expression();
+
+ void start_column(const xml_token_attrs_t& attrs);
+ void end_column();
+
+ void start_row(const xml_token_attrs_t& attrs);
+ void end_row();
+
+ void start_cell(const xml_token_attrs_t& attrs);
+ void end_cell();
+
+ /**
+ * Push a named cell style as a parent style of an automatic style, as we
+ * cannot directly reference a named cell style from a cell, column etc.
+ *
+ * @param style_name name of the named cell style to push.
+ *
+ * @return xfid of the newly-created automatic style that "wraps" the named
+ * cell as its parent if the call is successful, else it's not set.
+ */
+ std::optional<std::size_t> push_named_cell_style(std::string_view style_name);
+ void push_default_column_cell_style(std::string_view style_name, spreadsheet::col_t span);
+ void push_cell_format();
+ void push_cell_value();
+
+ void end_spreadsheet();
+
+private:
+ spreadsheet::iface::import_factory* mp_factory;
+ std::vector<spreadsheet::iface::import_sheet*> m_tables;
+ sheet_data m_cur_sheet;
+
+ row_attr m_row_attr;
+ cell_attr m_cell_attr; /// attributes of current cell.
+
+ int m_row;
+ int m_col;
+ int m_col_repeated;
+ size_t m_para_index;
+ bool m_has_content;
+
+ odf_styles_map_type m_styles; /// map storing all automatic styles by their names.
+ name2id_type m_cell_format_map; /// map of automatic style names to cell format (xf) IDs.
+
+ styles_context m_child_styles;
+ text_para_context m_child_para;
+ ods_dde_links_context m_child_dde_links;
+};
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/ods_dde_links_context.cpp b/src/liborcus/ods_dde_links_context.cpp
new file mode 100644
index 0000000..4b644a2
--- /dev/null
+++ b/src/liborcus/ods_dde_links_context.cpp
@@ -0,0 +1,49 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "ods_dde_links_context.hpp"
+
+namespace orcus {
+
+ods_dde_links_context::ods_dde_links_context(session_context& session_cxt, const tokens& tokens) :
+ xml_context_base(session_cxt, tokens) {}
+
+ods_dde_links_context::~ods_dde_links_context() {}
+
+xml_context_base* ods_dde_links_context::create_child_context(xmlns_id_t /*ns*/, xml_token_t /*name*/)
+{
+ return nullptr;
+}
+
+void ods_dde_links_context::end_child_context(xmlns_id_t /*ns*/, xml_token_t /*name*/, xml_context_base* /*child*/)
+{
+}
+
+void ods_dde_links_context::start_element(xmlns_id_t ns, xml_token_t name, const::std::vector<xml_token_attr_t>& /*attrs*/)
+{
+ xml_token_pair_t parent = push_stack(ns, name);
+ (void)parent;
+
+ warn_unhandled();
+}
+
+bool ods_dde_links_context::end_element(xmlns_id_t ns, xml_token_t name)
+{
+ return pop_stack(ns, name);
+}
+
+void ods_dde_links_context::characters(std::string_view /*str*/, bool /*transient*/)
+{
+}
+
+void ods_dde_links_context::reset()
+{
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/ods_dde_links_context.hpp b/src/liborcus/ods_dde_links_context.hpp
new file mode 100644
index 0000000..0abba49
--- /dev/null
+++ b/src/liborcus/ods_dde_links_context.hpp
@@ -0,0 +1,42 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ODS_DDE_LINKS_CONTEXT_HPP
+#define INCLUDED_ODS_DDE_LINKS_CONTEXT_HPP
+
+#include "xml_context_base.hpp"
+
+namespace orcus {
+
+/**
+ * Handle <table:dde-links> element structure. For now, this context exists
+ * only to ignore all DDE related data.
+ */
+class ods_dde_links_context : public xml_context_base
+{
+public:
+ ods_dde_links_context(session_context& session_cxt, const tokens& tokens);
+ virtual ~ods_dde_links_context();
+
+ virtual xml_context_base* create_child_context(xmlns_id_t ns, xml_token_t name) override;
+
+ virtual void end_child_context(xmlns_id_t ns, xml_token_t name, xml_context_base *child) override;
+
+ virtual void start_element(xmlns_id_t ns, xml_token_t name, const::std::vector<xml_token_attr_t> &attrs) override;
+
+ virtual bool end_element(xmlns_id_t ns, xml_token_t name) override;
+
+ virtual void characters(std::string_view str, bool transient) override;
+
+ void reset();
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/ods_session_data.cpp b/src/liborcus/ods_session_data.cpp
new file mode 100644
index 0000000..c039e05
--- /dev/null
+++ b/src/liborcus/ods_session_data.cpp
@@ -0,0 +1,42 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "ods_session_data.hpp"
+
+#include <limits>
+
+namespace orcus {
+
+ods_session_data::formula_result::formula_result() :
+ type(rt_none), numeric_value(std::numeric_limits<double>::quiet_NaN()) {}
+
+ods_session_data::formula::formula(
+ spreadsheet::sheet_t _sheet, spreadsheet::row_t _row, spreadsheet::col_t _col,
+ spreadsheet::formula_grammar_t _grammar, std::string_view _exp) :
+ sheet(_sheet), row(_row), column(_col), grammar(_grammar), exp(_exp) {}
+
+ods_session_data::named_exp::named_exp(
+ std::string_view _name, std::string_view _expression, std::string_view _base, named_exp_type _type, spreadsheet::sheet_t _scope) :
+ name(_name), expression(_expression), base(_base), type(_type), scope(_scope) {}
+
+std::string_view ods_session_data::number_formats_store::get_code(std::string_view name) const
+{
+ auto it_name = name2id_map.find(name);
+ if (it_name == name2id_map.end())
+ return {};
+
+ std::size_t id = it_name->second;
+ auto it_code = id2code_map.find(id);
+ if (it_code == id2code_map.end())
+ return {};
+
+ return it_code->second;
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/ods_session_data.hpp b/src/liborcus/ods_session_data.hpp
new file mode 100644
index 0000000..4223095
--- /dev/null
+++ b/src/liborcus/ods_session_data.hpp
@@ -0,0 +1,82 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_ODS_SESSION_DATA_HPP
+#define INCLUDED_ORCUS_ODS_SESSION_DATA_HPP
+
+#include "session_context.hpp"
+#include "odf_styles.hpp"
+
+#include <orcus/spreadsheet/types.hpp>
+
+#include <deque>
+
+namespace orcus {
+
+struct ods_session_data : public session_context::custom_data
+{
+ enum formula_result_type { rt_none, rt_numeric, rt_string, rt_error };
+ enum named_exp_type { ne_unknown, ne_range, ne_expression };
+
+ struct formula_result
+ {
+ formula_result_type type;
+ double numeric_value;
+ std::string_view string_value;
+
+ formula_result();
+ };
+
+ struct formula
+ {
+ spreadsheet::sheet_t sheet;
+ spreadsheet::row_t row;
+ spreadsheet::col_t column;
+
+ spreadsheet::formula_grammar_t grammar;
+ std::string_view exp;
+
+ formula_result result;
+
+ formula(
+ spreadsheet::sheet_t _sheet, spreadsheet::row_t _row, spreadsheet::col_t _col,
+ spreadsheet::formula_grammar_t _grammar, std::string_view _exp);
+ };
+
+ struct named_exp
+ {
+ std::string_view name;
+ std::string_view expression;
+ std::string_view base;
+
+ named_exp_type type;
+ spreadsheet::sheet_t scope; // >= 0 for sheet scope, or < 0 for global scope.
+
+ named_exp(std::string_view _name, std::string_view _expression, std::string_view _base, named_exp_type _type, spreadsheet::sheet_t _scope);
+ };
+
+ std::deque<formula> formulas;
+ std::deque<named_exp> named_exps;
+
+ odf_styles_map_type styles_map;
+
+ struct number_formats_store
+ {
+ std::map<std::string_view, std::size_t> name2id_map;
+ std::map<std::size_t, std::string> id2code_map;
+
+ std::string_view get_code(std::string_view name) const;
+ };
+
+ number_formats_store number_formats;
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/ooxml_content_types.cpp b/src/liborcus/ooxml_content_types.cpp
new file mode 100644
index 0000000..eb614c7
--- /dev/null
+++ b/src/liborcus/ooxml_content_types.cpp
@@ -0,0 +1,74 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "ooxml_content_types.hpp"
+
+namespace orcus {
+
+const content_type_t CT_ooxml_extended_properties = "application/vnd.openxmlformats-officedocument.extended-properties+xml";
+const content_type_t CT_ooxml_drawing = "application/vnd.openxmlformats-officedocument.drawing+xml";
+const content_type_t CT_ooxml_vml_drawing = "application/vnd.openxmlformats-officedocument.vmlDrawing";
+const content_type_t CT_ooxml_xlsx_calc_chain = "application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml";
+const content_type_t CT_ooxml_xlsx_comments = "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml";
+const content_type_t CT_ooxml_xlsx_connections = "application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml";
+const content_type_t CT_ooxml_xlsx_external_link = "application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml";
+const content_type_t CT_ooxml_xlsx_pivot_cache_def = "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml";
+const content_type_t CT_ooxml_xlsx_pivot_cache_rec = "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml";
+const content_type_t CT_ooxml_xlsx_pivot_table = "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml";
+const content_type_t CT_ooxml_xlsx_printer_settings = "application/vnd.openxmlformats-officedocument.spreadsheetml.printerSettings";
+const content_type_t CT_ooxml_xlsx_query_table = "application/vnd.openxmlformats-officedocument.spreadsheetml.queryTable+xml";
+const content_type_t CT_ooxml_xlsx_shared_strings = "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml";
+const content_type_t CT_ooxml_xlsx_sheet_main = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml";
+const content_type_t CT_ooxml_xlsx_styles = "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml";
+const content_type_t CT_ooxml_xlsx_table = "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml";
+const content_type_t CT_ooxml_xlsx_worksheet = "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml";
+const content_type_t CT_ooxml_xlsx_usernames = "application/vnd.openxmlformats-officedocument.spreadsheetml.userNames+xml";
+const content_type_t CT_ooxml_xlsx_rev_headers = "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionHeaders+xml";
+const content_type_t CT_ooxml_xlsx_rev_log = "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionLog+xml";
+const content_type_t CT_ooxml_theme = "application/vnd.openxmlformats-officedocument.theme+xml";
+const content_type_t CT_opc_core_properties = "application/vnd.openxmlformats-package.core-properties+xml";
+const content_type_t CT_opc_relationships = "application/vnd.openxmlformats-package.relationships+xml";
+const content_type_t CT_xml = "application/xml";
+const content_type_t CT_image_png = "image/png";
+
+namespace {
+
+content_type_t cts[] = {
+ CT_ooxml_extended_properties,
+ CT_ooxml_drawing,
+ CT_ooxml_vml_drawing,
+ CT_ooxml_xlsx_calc_chain,
+ CT_ooxml_xlsx_comments,
+ CT_ooxml_xlsx_connections,
+ CT_ooxml_xlsx_external_link,
+ CT_ooxml_xlsx_pivot_cache_def,
+ CT_ooxml_xlsx_pivot_cache_rec,
+ CT_ooxml_xlsx_pivot_table,
+ CT_ooxml_xlsx_printer_settings,
+ CT_ooxml_xlsx_query_table,
+ CT_ooxml_xlsx_shared_strings,
+ CT_ooxml_xlsx_sheet_main,
+ CT_ooxml_xlsx_styles,
+ CT_ooxml_xlsx_table,
+ CT_ooxml_xlsx_worksheet,
+ CT_ooxml_xlsx_usernames,
+ CT_ooxml_xlsx_rev_headers,
+ CT_ooxml_xlsx_rev_log,
+ CT_ooxml_theme,
+ CT_opc_core_properties,
+ CT_opc_relationships,
+ CT_xml,
+ CT_image_png,
+ nullptr
+};
+
+}
+
+const content_type_t* CT_all = cts;
+
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/ooxml_content_types.hpp b/src/liborcus/ooxml_content_types.hpp
new file mode 100644
index 0000000..d82dd53
--- /dev/null
+++ b/src/liborcus/ooxml_content_types.hpp
@@ -0,0 +1,49 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_OOXML_CONTENT_TYPES_HPP
+#define INCLUDED_ORCUS_OOXML_CONTENT_TYPES_HPP
+
+#include "ooxml_types.hpp"
+
+namespace orcus {
+
+extern const content_type_t CT_ooxml_extended_properties;
+extern const content_type_t CT_ooxml_drawing;
+extern const content_type_t CT_ooxml_vml_drawing;
+extern const content_type_t CT_ooxml_xlsx_calc_chain;
+extern const content_type_t CT_ooxml_xlsx_comments;
+extern const content_type_t CT_ooxml_xlsx_connections;
+extern const content_type_t CT_ooxml_xlsx_external_link;
+extern const content_type_t CT_ooxml_xlsx_pivot_cache_def;
+extern const content_type_t CT_ooxml_xlsx_pivot_cache_rec;
+extern const content_type_t CT_ooxml_xlsx_pivot_table;
+extern const content_type_t CT_ooxml_xlsx_printer_settings;
+extern const content_type_t CT_ooxml_xlsx_query_table;
+extern const content_type_t CT_ooxml_xlsx_shared_strings;
+extern const content_type_t CT_ooxml_xlsx_sheet_main;
+extern const content_type_t CT_ooxml_xlsx_styles;
+extern const content_type_t CT_ooxml_xlsx_table;
+extern const content_type_t CT_ooxml_xlsx_worksheet;
+extern const content_type_t CT_ooxml_xlsx_usernames;
+extern const content_type_t CT_ooxml_xlsx_rev_headers;
+extern const content_type_t CT_ooxml_xlsx_rev_log;
+extern const content_type_t CT_ooxml_theme;
+extern const content_type_t CT_opc_core_properties;
+extern const content_type_t CT_opc_relationships;
+extern const content_type_t CT_xml;
+extern const content_type_t CT_image_png;
+
+/**
+ * Null-terminated array of all content types.
+ */
+extern const content_type_t* CT_all;
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/ooxml_global.cpp b/src/liborcus/ooxml_global.cpp
new file mode 100644
index 0000000..6c6d93b
--- /dev/null
+++ b/src/liborcus/ooxml_global.cpp
@@ -0,0 +1,97 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "ooxml_global.hpp"
+#include "ooxml_types.hpp"
+#include "ooxml_token_constants.hpp"
+#include "ooxml_namespace_types.hpp"
+#include "xml_context_base.hpp"
+
+#include <iostream>
+#include <sstream>
+
+namespace orcus {
+
+void print_opc_rel::operator() (const opc_rel_t& v) const
+{
+ std::cout << v.rid << ": " << v.target << " (" << v.type << ")" << std::endl;
+}
+
+std::string resolve_file_path(const std::string& dir_path, const std::string& file_name)
+{
+ if (dir_path.empty())
+ return file_name;
+
+ const char* p = &dir_path[0];
+ const char* p_end = p + dir_path.size();
+
+ bool has_root = *p == '/';
+ if (has_root)
+ ++p;
+
+ std::vector<std::string_view> dir_stack;
+ const char* p_head = nullptr;
+ for (; p != p_end; ++p)
+ {
+ if (*p == '/')
+ {
+ if (!p_head)
+ // invalid directory path.
+ return file_name;
+
+ size_t len = p - p_head;
+ std::string_view dir(p_head, len);
+ if (dir == "..")
+ {
+ if (dir_stack.empty())
+ // invalid directory path.
+ return file_name;
+
+ dir_stack.pop_back();
+ }
+ else
+ dir_stack.push_back(dir);
+
+ p_head = nullptr;
+ }
+ else if (p_head)
+ {
+ // Do nothing.
+ }
+ else
+ p_head = p;
+ }
+
+ if (p_head)
+ {
+ // directory path must end with '/'. This one doesn't.
+ return file_name;
+ }
+
+ std::ostringstream full_path;
+ if (has_root)
+ full_path << '/';
+
+ for (auto dir : dir_stack)
+ full_path << dir << '/';
+
+ full_path << file_name;
+
+ return full_path.str();
+}
+
+void init_ooxml_context(xml_context_base& cxt)
+{
+ cxt.set_always_allowed_elements({
+ { NS_mc, XML_Choice },
+ { NS_mc, XML_Fallback },
+ });
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/ooxml_global.hpp b/src/liborcus/ooxml_global.hpp
new file mode 100644
index 0000000..853c4e9
--- /dev/null
+++ b/src/liborcus/ooxml_global.hpp
@@ -0,0 +1,48 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef ORCUS_OOXML_GLOBAL_HPP
+#define ORCUS_OOXML_GLOBAL_HPP
+
+#include "orcus/types.hpp"
+#include "ooxml_types.hpp"
+
+#include <string>
+#include <functional>
+
+namespace orcus {
+
+struct opc_rel_t;
+struct xml_token_attr_t;
+class xml_context_base;
+
+/**
+ * Function object to print relationship information.
+ */
+struct print_opc_rel
+{
+ void operator() (const opc_rel_t& v) const;
+};
+
+/**
+ * Given a directory path and a file name, return a full path that combines
+ * the two while resolving any parent directory path ".." markers.
+ *
+ * @param dir_path directory path. It can optionally start with a '/', but
+ * it must end with a '/'.
+ * @param file_name file name.
+ *
+ * @return full file path.
+ */
+std::string resolve_file_path(const std::string& dir_path, const std::string& file_name);
+
+void init_ooxml_context(xml_context_base& cxt);
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/ooxml_namespace_types.cpp b/src/liborcus/ooxml_namespace_types.cpp
new file mode 100644
index 0000000..8c1224b
--- /dev/null
+++ b/src/liborcus/ooxml_namespace_types.cpp
@@ -0,0 +1,52 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "ooxml_namespace_types.hpp"
+
+namespace orcus {
+
+const xmlns_id_t NS_ooxml_a = "http://schemas.openxmlformats.org/drawingml/2006/main";
+const xmlns_id_t NS_ooxml_r = "http://schemas.openxmlformats.org/officeDocument/2006/relationships";
+const xmlns_id_t NS_ooxml_xdr = "http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing";
+const xmlns_id_t NS_ooxml_xlsx = "http://schemas.openxmlformats.org/spreadsheetml/2006/main";
+
+const xmlns_id_t NS_opc_ct = "http://schemas.openxmlformats.org/package/2006/content-types";
+const xmlns_id_t NS_opc_rel = "http://schemas.openxmlformats.org/package/2006/relationships";
+
+const xmlns_id_t NS_mc = "http://schemas.openxmlformats.org/markup-compatibility/2006";
+const xmlns_id_t NS_mso_x14 = "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main";
+
+namespace {
+
+xmlns_id_t ooxml_ns[] = {
+ NS_ooxml_a,
+ NS_ooxml_r,
+ NS_ooxml_xdr,
+ NS_ooxml_xlsx,
+ nullptr
+};
+
+xmlns_id_t opc_ns[] = {
+ NS_opc_ct,
+ NS_opc_rel,
+ nullptr
+};
+
+xmlns_id_t misc_ns[] = {
+ NS_mc,
+ NS_mso_x14,
+ nullptr
+};
+
+}
+
+const xmlns_id_t* NS_ooxml_all = ooxml_ns;
+const xmlns_id_t* NS_opc_all = opc_ns;
+const xmlns_id_t* NS_misc_all = misc_ns;
+
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/ooxml_namespace_types.hpp b/src/liborcus/ooxml_namespace_types.hpp
new file mode 100644
index 0000000..8183bf8
--- /dev/null
+++ b/src/liborcus/ooxml_namespace_types.hpp
@@ -0,0 +1,44 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_OOXML_NAMESPACE_TYPES_HPP
+#define INCLUDED_ORCUS_OOXML_NAMESPACE_TYPES_HPP
+
+#include "orcus/types.hpp"
+
+namespace orcus {
+
+extern const xmlns_id_t NS_ooxml_a;
+extern const xmlns_id_t NS_ooxml_r;
+extern const xmlns_id_t NS_ooxml_xlsx;
+extern const xmlns_id_t NS_ooxml_xdr;
+
+extern const xmlns_id_t NS_opc_ct;
+extern const xmlns_id_t NS_opc_rel;
+
+extern const xmlns_id_t NS_mc;
+extern const xmlns_id_t NS_mso_x14;
+
+/**
+ * Null-terminated array of all ooxml namespaces.
+ */
+extern const xmlns_id_t* NS_ooxml_all;
+
+/**
+ * Null-terminated array of all opc namespaces.
+ */
+extern const xmlns_id_t* NS_opc_all;
+
+/**
+ * Null-terminated array of all the other namespaces.
+ */
+extern const xmlns_id_t* NS_misc_all;
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/ooxml_schemas.cpp b/src/liborcus/ooxml_schemas.cpp
new file mode 100644
index 0000000..b0e86e4
--- /dev/null
+++ b/src/liborcus/ooxml_schemas.cpp
@@ -0,0 +1,70 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "ooxml_schemas.hpp"
+
+namespace orcus {
+
+schema_t SCH_mc = "http://schemas.openxmlformats.org/markup-compatibility/2006";
+schema_t SCH_opc_content_types = "http://schemas.openxmlformats.org/package/2006/content-types";
+schema_t SCH_opc_rels = "http://schemas.openxmlformats.org/package/2006/relationships";
+schema_t SCH_opc_rels_metadata_core_props = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties";
+schema_t SCH_od_rels_calc_chain = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/calcChain";
+schema_t SCH_od_rels_connections = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/connections";
+schema_t SCH_od_rels_printer_settings = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/printerSettings";
+schema_t SCH_od_rels_rev_headers = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/revisionHeaders";
+schema_t SCH_od_rels_rev_log = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/revisionLog";
+schema_t SCH_od_rels_shared_strings = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings";
+schema_t SCH_od_rels_styles = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles";
+schema_t SCH_od_rels_theme = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme";
+schema_t SCH_od_rels_usernames = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/usernames";
+schema_t SCH_od_rels_worksheet = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet";
+schema_t SCH_od_rels_extended_props = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties";
+schema_t SCH_od_rels_office_doc = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument";
+schema_t SCH_od_rels_table = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/table";
+schema_t SCH_od_rels_pivot_cache_def = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotCacheDefinition";
+schema_t SCH_od_rels_pivot_cache_rec = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotCacheRecords";
+schema_t SCH_od_rels_pivot_table = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotTable";
+schema_t SCH_od_rels_drawing = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing";
+schema_t SCH_xlsx_main = "http://schemas.openxmlformats.org/spreadsheetml/2006/main";
+schema_t SCH_mso_x14ac = "http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac";
+
+namespace {
+
+schema_t schs[] = {
+ SCH_mc,
+ SCH_opc_content_types,
+ SCH_opc_rels,
+ SCH_opc_rels_metadata_core_props,
+ SCH_od_rels_calc_chain,
+ SCH_od_rels_connections,
+ SCH_od_rels_printer_settings,
+ SCH_od_rels_rev_headers,
+ SCH_od_rels_rev_log,
+ SCH_od_rels_shared_strings,
+ SCH_od_rels_styles,
+ SCH_od_rels_theme,
+ SCH_od_rels_usernames,
+ SCH_od_rels_worksheet,
+ SCH_od_rels_extended_props,
+ SCH_od_rels_office_doc,
+ SCH_od_rels_table,
+ SCH_od_rels_pivot_cache_def,
+ SCH_od_rels_pivot_cache_rec,
+ SCH_od_rels_pivot_table,
+ SCH_od_rels_drawing,
+ SCH_xlsx_main,
+ SCH_mso_x14ac,
+ nullptr
+};
+
+}
+
+schema_t* SCH_all = schs;
+
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/ooxml_schemas.hpp b/src/liborcus/ooxml_schemas.hpp
new file mode 100644
index 0000000..85adb6f
--- /dev/null
+++ b/src/liborcus/ooxml_schemas.hpp
@@ -0,0 +1,47 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_OOXML_SCHEMAS_HPP
+#define INCLUDED_ORCUS_OOXML_SCHEMAS_HPP
+
+#include "ooxml_types.hpp"
+
+namespace orcus {
+
+extern schema_t SCH_mc;
+extern schema_t SCH_opc_content_types;
+extern schema_t SCH_opc_rels;
+extern schema_t SCH_opc_rels_metadata_core_props;
+extern schema_t SCH_od_rels_calc_chain;
+extern schema_t SCH_od_rels_connections;
+extern schema_t SCH_od_rels_printer_settings;
+extern schema_t SCH_od_rels_rev_headers;
+extern schema_t SCH_od_rels_rev_log;
+extern schema_t SCH_od_rels_shared_strings;
+extern schema_t SCH_od_rels_styles;
+extern schema_t SCH_od_rels_theme;
+extern schema_t SCH_od_rels_usernames;
+extern schema_t SCH_od_rels_worksheet;
+extern schema_t SCH_od_rels_extended_props;
+extern schema_t SCH_od_rels_office_doc;
+extern schema_t SCH_od_rels_table;
+extern schema_t SCH_od_rels_pivot_cache_def;
+extern schema_t SCH_od_rels_pivot_cache_rec;
+extern schema_t SCH_od_rels_pivot_table;
+extern schema_t SCH_od_rels_drawing;
+extern schema_t SCH_xlsx_main;
+extern schema_t SCH_mso_x14ac;
+
+/**
+ * Null-terminated array of all schema types.
+ */
+extern schema_t* SCH_all;
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/ooxml_token_constants.hpp b/src/liborcus/ooxml_token_constants.hpp
new file mode 100644
index 0000000..13f7fcf
--- /dev/null
+++ b/src/liborcus/ooxml_token_constants.hpp
@@ -0,0 +1,21 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef __ORCUS_OOXML_TOKEN_CONSTANTS_HPP__
+#define __ORCUS_OOXML_TOKEN_CONSTANTS_HPP__
+
+#include "orcus/types.hpp"
+
+namespace orcus {
+
+#include "ooxml_token_constants.inl"
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/ooxml_token_constants.inl b/src/liborcus/ooxml_token_constants.inl
new file mode 100644
index 0000000..c2a047d
--- /dev/null
+++ b/src/liborcus/ooxml_token_constants.inl
@@ -0,0 +1,3519 @@
+// This file has been auto-generated. Do not hand-edit this.
+
+const xml_token_t XML_AbbreviatedCaseNumber = 1;
+const xml_token_t XML_Accel = 2;
+const xml_token_t XML_Accel2 = 3;
+const xml_token_t XML_AlbumTitle = 4;
+const xml_token_t XML_AlternateContent = 5;
+const xml_token_t XML_Anchor = 6;
+const xml_token_t XML_AppVersion = 7;
+const xml_token_t XML_Append = 8;
+const xml_token_t XML_Application = 9;
+const xml_token_t XML_Artist = 10;
+const xml_token_t XML_Author = 11;
+const xml_token_t XML_AutoFill = 12;
+const xml_token_t XML_AutoFit = 13;
+const xml_token_t XML_AutoLine = 14;
+const xml_token_t XML_AutoPict = 15;
+const xml_token_t XML_AutoScale = 16;
+const xml_token_t XML_BookAuthor = 17;
+const xml_token_t XML_BookTitle = 18;
+const xml_token_t XML_BroadcastTitle = 19;
+const xml_token_t XML_Broadcaster = 20;
+const xml_token_t XML_CF = 21;
+const xml_token_t XML_Camera = 22;
+const xml_token_t XML_Cancel = 23;
+const xml_token_t XML_CaseNumber = 24;
+const xml_token_t XML_ChapterNumber = 25;
+const xml_token_t XML_Characters = 26;
+const xml_token_t XML_CharactersWithSpaces = 27;
+const xml_token_t XML_Checked = 28;
+const xml_token_t XML_Choice = 29;
+const xml_token_t XML_City = 30;
+const xml_token_t XML_ClientData = 31;
+const xml_token_t XML_ColHidden = 32;
+const xml_token_t XML_Colored = 33;
+const xml_token_t XML_Column = 34;
+const xml_token_t XML_Comments = 35;
+const xml_token_t XML_Company = 36;
+const xml_token_t XML_Compiler = 37;
+const xml_token_t XML_Composer = 38;
+const xml_token_t XML_Conductor = 39;
+const xml_token_t XML_ConferenceName = 40;
+const xml_token_t XML_ConnectionID = 41;
+const xml_token_t XML_Corporate = 42;
+const xml_token_t XML_Counsel = 43;
+const xml_token_t XML_CountryRegion = 44;
+const xml_token_t XML_Court = 45;
+const xml_token_t XML_DDE = 46;
+const xml_token_t XML_DataBinding = 47;
+const xml_token_t XML_DataBindingLoadMode = 48;
+const xml_token_t XML_DataBindingName = 49;
+const xml_token_t XML_Day = 50;
+const xml_token_t XML_DayAccessed = 51;
+const xml_token_t XML_Default = 52;
+const xml_token_t XML_DefaultSize = 53;
+const xml_token_t XML_Department = 54;
+const xml_token_t XML_DigSig = 55;
+const xml_token_t XML_Director = 56;
+const xml_token_t XML_Disabled = 57;
+const xml_token_t XML_Dismiss = 58;
+const xml_token_t XML_Distributor = 59;
+const xml_token_t XML_DocSecurity = 60;
+const xml_token_t XML_DrawAspect = 61;
+const xml_token_t XML_DropLines = 62;
+const xml_token_t XML_DropStyle = 63;
+const xml_token_t XML_Dx = 64;
+const xml_token_t XML_Edition = 65;
+const xml_token_t XML_Editor = 66;
+const xml_token_t XML_Fallback = 67;
+const xml_token_t XML_FieldCodes = 68;
+const xml_token_t XML_FileBinding = 69;
+const xml_token_t XML_FileBindingName = 70;
+const xml_token_t XML_First = 71;
+const xml_token_t XML_FirstButton = 72;
+const xml_token_t XML_FmlaGroup = 73;
+const xml_token_t XML_FmlaLink = 74;
+const xml_token_t XML_FmlaMacro = 75;
+const xml_token_t XML_FmlaPict = 76;
+const xml_token_t XML_FmlaRange = 77;
+const xml_token_t XML_FmlaTxbx = 78;
+const xml_token_t XML_Guid = 79;
+const xml_token_t XML_HLinks = 80;
+const xml_token_t XML_HeadingPairs = 81;
+const xml_token_t XML_Help = 82;
+const xml_token_t XML_HiddenSlides = 83;
+const xml_token_t XML_Horiz = 84;
+const xml_token_t XML_HyperlinkBase = 85;
+const xml_token_t XML_HyperlinksChanged = 86;
+const xml_token_t XML_ID = 87;
+const xml_token_t XML_Inc = 88;
+const xml_token_t XML_Institution = 89;
+const xml_token_t XML_InternetSiteTitle = 90;
+const xml_token_t XML_Interviewee = 91;
+const xml_token_t XML_Interviewer = 92;
+const xml_token_t XML_Inventor = 93;
+const xml_token_t XML_Issue = 94;
+const xml_token_t XML_JournalName = 95;
+const xml_token_t XML_JustLastX = 96;
+const xml_token_t XML_LCID = 97;
+const xml_token_t XML_LCT = 98;
+const xml_token_t XML_Last = 99;
+const xml_token_t XML_Lines = 100;
+const xml_token_t XML_LinkType = 101;
+const xml_token_t XML_LinksUpToDate = 102;
+const xml_token_t XML_ListItem = 103;
+const xml_token_t XML_LockText = 104;
+const xml_token_t XML_Locked = 105;
+const xml_token_t XML_LockedField = 106;
+const xml_token_t XML_MMClips = 107;
+const xml_token_t XML_Manager = 108;
+const xml_token_t XML_Map = 109;
+const xml_token_t XML_MapInfo = 110;
+const xml_token_t XML_MapOCX = 111;
+const xml_token_t XML_Max = 112;
+const xml_token_t XML_Medium = 113;
+const xml_token_t XML_Middle = 114;
+const xml_token_t XML_Min = 115;
+const xml_token_t XML_Month = 116;
+const xml_token_t XML_MonthAccessed = 117;
+const xml_token_t XML_MoveWithCells = 118;
+const xml_token_t XML_MultiLine = 119;
+const xml_token_t XML_MultiSel = 120;
+const xml_token_t XML_Name = 121;
+const xml_token_t XML_NameList = 122;
+const xml_token_t XML_Namespace = 123;
+const xml_token_t XML_NoThreeD = 124;
+const xml_token_t XML_NoThreeD2 = 125;
+const xml_token_t XML_Notes = 126;
+const xml_token_t XML_NumberVolumes = 127;
+const xml_token_t XML_OLEObject = 128;
+const xml_token_t XML_ObjectID = 129;
+const xml_token_t XML_ObjectType = 130;
+const xml_token_t XML_Page = 131;
+const xml_token_t XML_Pages = 132;
+const xml_token_t XML_Paragraphs = 133;
+const xml_token_t XML_PatentNumber = 134;
+const xml_token_t XML_Performer = 135;
+const xml_token_t XML_PeriodicalTitle = 136;
+const xml_token_t XML_Person = 137;
+const xml_token_t XML_PresentationFormat = 138;
+const xml_token_t XML_PreserveFormat = 139;
+const xml_token_t XML_PreserveSortAFLayout = 140;
+const xml_token_t XML_PrintObject = 141;
+const xml_token_t XML_ProducerName = 142;
+const xml_token_t XML_ProductionCompany = 143;
+const xml_token_t XML_ProgID = 144;
+const xml_token_t XML_Properties = 145;
+const xml_token_t XML_PublicationTitle = 146;
+const xml_token_t XML_Publisher = 147;
+const xml_token_t XML_RecalcAlways = 148;
+const xml_token_t XML_RecordingNumber = 149;
+const xml_token_t XML_RefOrder = 150;
+const xml_token_t XML_Reporter = 151;
+const xml_token_t XML_RootElement = 152;
+const xml_token_t XML_Row = 153;
+const xml_token_t XML_RowHidden = 154;
+const xml_token_t XML_ScaleCrop = 155;
+const xml_token_t XML_Schema = 156;
+const xml_token_t XML_SchemaID = 157;
+const xml_token_t XML_SchemaRef = 158;
+const xml_token_t XML_ScriptExtended = 159;
+const xml_token_t XML_ScriptLanguage = 160;
+const xml_token_t XML_ScriptLocation = 161;
+const xml_token_t XML_ScriptText = 162;
+const xml_token_t XML_SecretEdit = 163;
+const xml_token_t XML_Sel = 164;
+const xml_token_t XML_SelType = 165;
+const xml_token_t XML_SelectedStyle = 166;
+const xml_token_t XML_SelectionNamespaces = 167;
+const xml_token_t XML_ShapeID = 168;
+const xml_token_t XML_SharedDoc = 169;
+const xml_token_t XML_ShortTitle = 170;
+const xml_token_t XML_ShowImportExportValidationErrors = 171;
+const xml_token_t XML_SizeWithCells = 172;
+const xml_token_t XML_Slides = 173;
+const xml_token_t XML_Source = 174;
+const xml_token_t XML_SourceType = 175;
+const xml_token_t XML_Sources = 176;
+const xml_token_t XML_StandardNumber = 177;
+const xml_token_t XML_StateProvince = 178;
+const xml_token_t XML_Station = 179;
+const xml_token_t XML_StyleName = 180;
+const xml_token_t XML_Tag = 181;
+const xml_token_t XML_Template = 182;
+const xml_token_t XML_TextHAlign = 183;
+const xml_token_t XML_TextVAlign = 184;
+const xml_token_t XML_Theater = 185;
+const xml_token_t XML_ThesisType = 186;
+const xml_token_t XML_Title = 187;
+const xml_token_t XML_TitlesOfParts = 188;
+const xml_token_t XML_TotalTime = 189;
+const xml_token_t XML_Translator = 190;
+const xml_token_t XML_Type = 191;
+const xml_token_t XML_UIObj = 192;
+const xml_token_t XML_URI = 193;
+const xml_token_t XML_URL = 194;
+const xml_token_t XML_UpdateMode = 195;
+const xml_token_t XML_VScroll = 196;
+const xml_token_t XML_VTEdit = 197;
+const xml_token_t XML_Val = 198;
+const xml_token_t XML_ValidIds = 199;
+const xml_token_t XML_Version = 200;
+const xml_token_t XML_Visible = 201;
+const xml_token_t XML_Volume = 202;
+const xml_token_t XML_WidthMin = 203;
+const xml_token_t XML_Words = 204;
+const xml_token_t XML_Writer = 205;
+const xml_token_t XML_Year = 206;
+const xml_token_t XML_YearAccessed = 207;
+const xml_token_t XML_a = 208;
+const xml_token_t XML_aboveAverage = 209;
+const xml_token_t XML_absSizeAnchor = 210;
+const xml_token_t XML_absoluteAnchor = 211;
+const xml_token_t XML_abstractNum = 212;
+const xml_token_t XML_abstractNumId = 213;
+const xml_token_t XML_aca = 214;
+const xml_token_t XML_acc = 215;
+const xml_token_t XML_accPr = 216;
+const xml_token_t XML_accel = 217;
+const xml_token_t XML_accent1 = 218;
+const xml_token_t XML_accent2 = 219;
+const xml_token_t XML_accent3 = 220;
+const xml_token_t XML_accent4 = 221;
+const xml_token_t XML_accent5 = 222;
+const xml_token_t XML_accent6 = 223;
+const xml_token_t XML_accentbar = 224;
+const xml_token_t XML_accumulate = 225;
+const xml_token_t XML_action = 226;
+const xml_token_t XML_active = 227;
+const xml_token_t XML_activeCell = 228;
+const xml_token_t XML_activeCellId = 229;
+const xml_token_t XML_activeCol = 230;
+const xml_token_t XML_activePane = 231;
+const xml_token_t XML_activeRecord = 232;
+const xml_token_t XML_activeRow = 233;
+const xml_token_t XML_activeSheetId = 234;
+const xml_token_t XML_activeTab = 235;
+const xml_token_t XML_activeWritingStyle = 236;
+const xml_token_t XML_actualPg = 237;
+const xml_token_t XML_additionalCharacteristics = 238;
+const xml_token_t XML_additive = 239;
+const xml_token_t XML_addlxml = 240;
+const xml_token_t XML_addressFieldName = 241;
+const xml_token_t XML_adj = 242;
+const xml_token_t XML_adjLst = 243;
+const xml_token_t XML_adjust = 244;
+const xml_token_t XML_adjustColumnWidth = 245;
+const xml_token_t XML_adjustLineHeightInTable = 246;
+const xml_token_t XML_adjustRightInd = 247;
+const xml_token_t XML_adjusthandles = 248;
+const xml_token_t XML_advAuto = 249;
+const xml_token_t XML_advClick = 250;
+const xml_token_t XML_advTm = 251;
+const xml_token_t XML_advise = 252;
+const xml_token_t XML_after = 253;
+const xml_token_t XML_afterAutospacing = 254;
+const xml_token_t XML_afterEffect = 255;
+const xml_token_t XML_afterLines = 256;
+const xml_token_t XML_ahLst = 257;
+const xml_token_t XML_ahPolar = 258;
+const xml_token_t XML_ahXY = 259;
+const xml_token_t XML_alg = 260;
+const xml_token_t XML_algIdExt = 261;
+const xml_token_t XML_algIdExtSource = 262;
+const xml_token_t XML_algn = 263;
+const xml_token_t XML_alias = 264;
+const xml_token_t XML_aliases = 265;
+const xml_token_t XML_align = 266;
+const xml_token_t XML_alignBordersAndEdges = 267;
+const xml_token_t XML_alignTablesRowByRow = 268;
+const xml_token_t XML_alignWithMargins = 269;
+const xml_token_t XML_alignment = 270;
+const xml_token_t XML_alignshape = 271;
+const xml_token_t XML_all = 272;
+const xml_token_t XML_allCaption = 273;
+const xml_token_t XML_allDrilled = 274;
+const xml_token_t XML_allUniqueName = 275;
+const xml_token_t XML_allowBlank = 276;
+const xml_token_t XML_allowOverlap = 277;
+const xml_token_t XML_allowPNG = 278;
+const xml_token_t XML_allowPng = 279;
+const xml_token_t XML_allowRefreshQuery = 280;
+const xml_token_t XML_allowSpaceOfSameStyleInTable = 281;
+const xml_token_t XML_allowcomments = 282;
+const xml_token_t XML_allowincell = 283;
+const xml_token_t XML_allowoverlap = 284;
+const xml_token_t XML_aln = 285;
+const xml_token_t XML_alnAt = 286;
+const xml_token_t XML_alnScr = 287;
+const xml_token_t XML_alpha = 288;
+const xml_token_t XML_alphaBiLevel = 289;
+const xml_token_t XML_alphaCeiling = 290;
+const xml_token_t XML_alphaFloor = 291;
+const xml_token_t XML_alphaInv = 292;
+const xml_token_t XML_alphaMod = 293;
+const xml_token_t XML_alphaModFix = 294;
+const xml_token_t XML_alphaOff = 295;
+const xml_token_t XML_alphaOutset = 296;
+const xml_token_t XML_alphaRepl = 297;
+const xml_token_t XML_alt = 298;
+const xml_token_t XML_altChunk = 299;
+const xml_token_t XML_altChunkPr = 300;
+const xml_token_t XML_altLang = 301;
+const xml_token_t XML_altName = 302;
+const xml_token_t XML_althref = 303;
+const xml_token_t XML_alwaysMergeEmptyNamespace = 304;
+const xml_token_t XML_alwaysShow = 305;
+const xml_token_t XML_alwaysShowPlaceholderText = 306;
+const xml_token_t XML_amt = 307;
+const xml_token_t XML_anchor = 308;
+const xml_token_t XML_anchorCtr = 309;
+const xml_token_t XML_anchorLock = 310;
+const xml_token_t XML_anchorlock = 311;
+const xml_token_t XML_anchorx = 312;
+const xml_token_t XML_anchory = 313;
+const xml_token_t XML_and = 314;
+const xml_token_t XML_ang = 315;
+const xml_token_t XML_angle = 316;
+const xml_token_t XML_anim = 317;
+const xml_token_t XML_animBg = 318;
+const xml_token_t XML_animClr = 319;
+const xml_token_t XML_animEffect = 320;
+const xml_token_t XML_animLvl = 321;
+const xml_token_t XML_animMotion = 322;
+const xml_token_t XML_animOne = 323;
+const xml_token_t XML_animRot = 324;
+const xml_token_t XML_animScale = 325;
+const xml_token_t XML_annotation = 326;
+const xml_token_t XML_annotationRef = 327;
+const xml_token_t XML_appName = 328;
+const xml_token_t XML_applyAlignment = 329;
+const xml_token_t XML_applyAlignmentFormats = 330;
+const xml_token_t XML_applyBorder = 331;
+const xml_token_t XML_applyBorderFormats = 332;
+const xml_token_t XML_applyBreakingRules = 333;
+const xml_token_t XML_applyFill = 334;
+const xml_token_t XML_applyFont = 335;
+const xml_token_t XML_applyFontFormats = 336;
+const xml_token_t XML_applyNumberFormat = 337;
+const xml_token_t XML_applyNumberFormats = 338;
+const xml_token_t XML_applyPatternFormats = 339;
+const xml_token_t XML_applyProtection = 340;
+const xml_token_t XML_applyStyles = 341;
+const xml_token_t XML_applyToEnd = 342;
+const xml_token_t XML_applyToFront = 343;
+const xml_token_t XML_applyToSides = 344;
+const xml_token_t XML_applyWidthHeightFormats = 345;
+const xml_token_t XML_arc = 346;
+const xml_token_t XML_arcTo = 347;
+const xml_token_t XML_arcsize = 348;
+const xml_token_t XML_area3DChart = 349;
+const xml_token_t XML_areaChart = 350;
+const xml_token_t XML_arg = 351;
+const xml_token_t XML_argPr = 352;
+const xml_token_t XML_argSz = 353;
+const xml_token_t XML_array = 354;
+const xml_token_t XML_arrowok = 355;
+const xml_token_t XML_ascii = 356;
+const xml_token_t XML_asciiTheme = 357;
+const xml_token_t XML_aspect = 358;
+const xml_token_t XML_aspectratio = 359;
+const xml_token_t XML_assign = 360;
+const xml_token_t XML_asteriskTotals = 361;
+const xml_token_t XML_attachedSchema = 362;
+const xml_token_t XML_attachedTemplate = 363;
+const xml_token_t XML_attr = 364;
+const xml_token_t XML_attrName = 365;
+const xml_token_t XML_attrNameLst = 366;
+const xml_token_t XML_attribute = 367;
+const xml_token_t XML_audio = 368;
+const xml_token_t XML_audioCd = 369;
+const xml_token_t XML_audioFile = 370;
+const xml_token_t XML_author = 371;
+const xml_token_t XML_authorId = 372;
+const xml_token_t XML_authors = 373;
+const xml_token_t XML_auto = 374;
+const xml_token_t XML_autoAdjust = 375;
+const xml_token_t XML_autoCaption = 376;
+const xml_token_t XML_autoCaptions = 377;
+const xml_token_t XML_autoCompressPictures = 378;
+const xml_token_t XML_autoEnd = 379;
+const xml_token_t XML_autoFilter = 380;
+const xml_token_t XML_autoFilterDateGrouping = 381;
+const xml_token_t XML_autoFormatId = 382;
+const xml_token_t XML_autoFormatOverride = 383;
+const xml_token_t XML_autoHyphenation = 384;
+const xml_token_t XML_autoLoad = 385;
+const xml_token_t XML_autoPage = 386;
+const xml_token_t XML_autoPageBreaks = 387;
+const xml_token_t XML_autoRecover = 388;
+const xml_token_t XML_autoRedefine = 389;
+const xml_token_t XML_autoRepublish = 390;
+const xml_token_t XML_autoRev = 391;
+const xml_token_t XML_autoShow = 392;
+const xml_token_t XML_autoSortScope = 393;
+const xml_token_t XML_autoSpaceDE = 394;
+const xml_token_t XML_autoSpaceDN = 395;
+const xml_token_t XML_autoSpaceLikeWord95 = 396;
+const xml_token_t XML_autoStart = 397;
+const xml_token_t XML_autoTitleDeleted = 398;
+const xml_token_t XML_autoUpdate = 399;
+const xml_token_t XML_autoUpdateAnimBg = 400;
+const xml_token_t XML_autofitToFirstFixedWidthCell = 401;
+const xml_token_t XML_autoformat = 402;
+const xml_token_t XML_autolayout = 403;
+const xml_token_t XML_autorotationcenter = 404;
+const xml_token_t XML_avLst = 405;
+const xml_token_t XML_avgSubtotal = 406;
+const xml_token_t XML_axId = 407;
+const xml_token_t XML_axPos = 408;
+const xml_token_t XML_axis = 409;
+const xml_token_t XML_b = 410;
+const xml_token_t XML_bCs = 411;
+const xml_token_t XML_bIns = 412;
+const xml_token_t XML_backWall = 413;
+const xml_token_t XML_backdepth = 414;
+const xml_token_t XML_backdrop = 415;
+const xml_token_t XML_background = 416;
+const xml_token_t XML_backgroundQuery = 417;
+const xml_token_t XML_backgroundRefresh = 418;
+const xml_token_t XML_backupFile = 419;
+const xml_token_t XML_backward = 420;
+const xml_token_t XML_backwards = 421;
+const xml_token_t XML_balanceSingleByteDoubleByteWidth = 422;
+const xml_token_t XML_band1H = 423;
+const xml_token_t XML_band1V = 424;
+const xml_token_t XML_band2H = 425;
+const xml_token_t XML_band2V = 426;
+const xml_token_t XML_bandCol = 427;
+const xml_token_t XML_bandFmt = 428;
+const xml_token_t XML_bandFmts = 429;
+const xml_token_t XML_bandRow = 430;
+const xml_token_t XML_bar = 431;
+const xml_token_t XML_bar3DChart = 432;
+const xml_token_t XML_barChart = 433;
+const xml_token_t XML_barDir = 434;
+const xml_token_t XML_barPr = 435;
+const xml_token_t XML_base = 436;
+const xml_token_t XML_baseColWidth = 437;
+const xml_token_t XML_baseField = 438;
+const xml_token_t XML_baseItem = 439;
+const xml_token_t XML_baseJc = 440;
+const xml_token_t XML_baseTimeUnit = 441;
+const xml_token_t XML_baseType = 442;
+const xml_token_t XML_basedOn = 443;
+const xml_token_t XML_baseline = 444;
+const xml_token_t XML_bc = 445;
+const xml_token_t XML_bdr = 446;
+const xml_token_t XML_before = 447;
+const xml_token_t XML_beforeAutospacing = 448;
+const xml_token_t XML_beforeLines = 449;
+const xml_token_t XML_begChr = 450;
+const xml_token_t XML_behavior = 451;
+const xml_token_t XML_behaviors = 452;
+const xml_token_t XML_behindDoc = 453;
+const xml_token_t XML_bestFit = 454;
+const xml_token_t XML_between = 455;
+const xml_token_t XML_bevel = 456;
+const xml_token_t XML_bevelB = 457;
+const xml_token_t XML_bevelT = 458;
+const xml_token_t XML_bg = 459;
+const xml_token_t XML_bg1 = 460;
+const xml_token_t XML_bg2 = 461;
+const xml_token_t XML_bgClr = 462;
+const xml_token_t XML_bgColor = 463;
+const xml_token_t XML_bgFillStyleLst = 464;
+const xml_token_t XML_bgPr = 465;
+const xml_token_t XML_bgRef = 466;
+const xml_token_t XML_biLevel = 467;
+const xml_token_t XML_bibliography = 468;
+const xml_token_t XML_bidi = 469;
+const xml_token_t XML_bidiVisual = 470;
+const xml_token_t XML_bilevel = 471;
+const xml_token_t XML_bk = 472;
+const xml_token_t XML_blackAndWhite = 473;
+const xml_token_t XML_blacklevel = 474;
+const xml_token_t XML_blank = 475;
+const xml_token_t XML_bld = 476;
+const xml_token_t XML_bldAsOne = 477;
+const xml_token_t XML_bldChart = 478;
+const xml_token_t XML_bldDgm = 479;
+const xml_token_t XML_bldGraphic = 480;
+const xml_token_t XML_bldLst = 481;
+const xml_token_t XML_bldLvl = 482;
+const xml_token_t XML_bldOleChart = 483;
+const xml_token_t XML_bldP = 484;
+const xml_token_t XML_bldStep = 485;
+const xml_token_t XML_bldSub = 486;
+const xml_token_t XML_blend = 487;
+const xml_token_t XML_blinds = 488;
+const xml_token_t XML_blip = 489;
+const xml_token_t XML_blipFill = 490;
+const xml_token_t XML_blipPhldr = 491;
+const xml_token_t XML_blob = 492;
+const xml_token_t XML_blockQuote = 493;
+const xml_token_t XML_blue = 494;
+const xml_token_t XML_blueMod = 495;
+const xml_token_t XML_blueOff = 496;
+const xml_token_t XML_blur = 497;
+const xml_token_t XML_blurRad = 498;
+const xml_token_t XML_bmk = 499;
+const xml_token_t XML_body = 500;
+const xml_token_t XML_bodyDiv = 501;
+const xml_token_t XML_bodyPr = 502;
+const xml_token_t XML_bodyStyle = 503;
+const xml_token_t XML_bold = 504;
+const xml_token_t XML_boldItalic = 505;
+const xml_token_t XML_bookFoldPrinting = 506;
+const xml_token_t XML_bookFoldPrintingSheets = 507;
+const xml_token_t XML_bookFoldRevPrinting = 508;
+const xml_token_t XML_bookViews = 509;
+const xml_token_t XML_bookmarkEnd = 510;
+const xml_token_t XML_bookmarkIdSeed = 511;
+const xml_token_t XML_bookmarkStart = 512;
+const xml_token_t XML_bool = 513;
+const xml_token_t XML_boolVal = 514;
+const xml_token_t XML_boolean = 515;
+const xml_token_t XML_border = 516;
+const xml_token_t XML_borderBox = 517;
+const xml_token_t XML_borderBoxPr = 518;
+const xml_token_t XML_borderId = 519;
+const xml_token_t XML_borderbottom = 520;
+const xml_token_t XML_borderbottomcolor = 521;
+const xml_token_t XML_borderleft = 522;
+const xml_token_t XML_borderleftcolor = 523;
+const xml_token_t XML_borderright = 524;
+const xml_token_t XML_borderrightcolor = 525;
+const xml_token_t XML_borders = 526;
+const xml_token_t XML_bordersDoNotSurroundFooter = 527;
+const xml_token_t XML_bordersDoNotSurroundHeader = 528;
+const xml_token_t XML_bordertop = 529;
+const xml_token_t XML_bordertopcolor = 530;
+const xml_token_t XML_bottom = 531;
+const xml_token_t XML_bottomFromText = 532;
+const xml_token_t XML_box = 533;
+const xml_token_t XML_boxPr = 534;
+const xml_token_t XML_br = 535;
+const xml_token_t XML_bright = 536;
+const xml_token_t XML_brightness = 537;
+const xml_token_t XML_brk = 538;
+const xml_token_t XML_brkBin = 539;
+const xml_token_t XML_brkBinSub = 540;
+const xml_token_t XML_browse = 541;
+const xml_token_t XML_bstr = 542;
+const xml_token_t XML_buAutoNum = 543;
+const xml_token_t XML_buBlip = 544;
+const xml_token_t XML_buChar = 545;
+const xml_token_t XML_buClr = 546;
+const xml_token_t XML_buClrTx = 547;
+const xml_token_t XML_buFont = 548;
+const xml_token_t XML_buFontTx = 549;
+const xml_token_t XML_buNone = 550;
+const xml_token_t XML_buSzPct = 551;
+const xml_token_t XML_buSzPts = 552;
+const xml_token_t XML_buSzTx = 553;
+const xml_token_t XML_bubble3D = 554;
+const xml_token_t XML_bubbleChart = 555;
+const xml_token_t XML_bubbleScale = 556;
+const xml_token_t XML_bubbleSize = 557;
+const xml_token_t XML_build = 558;
+const xml_token_t XML_builtIn = 559;
+const xml_token_t XML_builtInGroupCount = 560;
+const xml_token_t XML_builtInUnit = 561;
+const xml_token_t XML_builtinId = 562;
+const xml_token_t XML_bullet = 563;
+const xml_token_t XML_bulletEnabled = 564;
+const xml_token_t XML_button = 565;
+const xml_token_t XML_bw = 566;
+const xml_token_t XML_bwMode = 567;
+const xml_token_t XML_bwmode = 568;
+const xml_token_t XML_bwnormal = 569;
+const xml_token_t XML_bwpure = 570;
+const xml_token_t XML_bx = 571;
+const xml_token_t XML_by = 572;
+const xml_token_t XML_byPosition = 573;
+const xml_token_t XML_c = 574;
+const xml_token_t XML_cBhvr = 575;
+const xml_token_t XML_cGp = 576;
+const xml_token_t XML_cGpRule = 577;
+const xml_token_t XML_cMediaNode = 578;
+const xml_token_t XML_cNvCxnSpPr = 579;
+const xml_token_t XML_cNvGraphicFramePr = 580;
+const xml_token_t XML_cNvGrpSpPr = 581;
+const xml_token_t XML_cNvPicPr = 582;
+const xml_token_t XML_cNvPr = 583;
+const xml_token_t XML_cNvSpPr = 584;
+const xml_token_t XML_cSld = 585;
+const xml_token_t XML_cSldViewPr = 586;
+const xml_token_t XML_cSp = 587;
+const xml_token_t XML_cTn = 588;
+const xml_token_t XML_cViewPr = 589;
+const xml_token_t XML_ca = 590;
+const xml_token_t XML_cacheField = 591;
+const xml_token_t XML_cacheFields = 592;
+const xml_token_t XML_cacheHierarchies = 593;
+const xml_token_t XML_cacheHierarchy = 594;
+const xml_token_t XML_cacheId = 595;
+const xml_token_t XML_cacheIndex = 596;
+const xml_token_t XML_cacheSource = 597;
+const xml_token_t XML_cachedColBalance = 598;
+const xml_token_t XML_calcChain = 599;
+const xml_token_t XML_calcCompleted = 600;
+const xml_token_t XML_calcId = 601;
+const xml_token_t XML_calcMode = 602;
+const xml_token_t XML_calcOnExit = 603;
+const xml_token_t XML_calcOnSave = 604;
+const xml_token_t XML_calcPr = 605;
+const xml_token_t XML_calcmode = 606;
+const xml_token_t XML_calculatedColumn = 607;
+const xml_token_t XML_calculatedColumnFormula = 608;
+const xml_token_t XML_calculatedItem = 609;
+const xml_token_t XML_calculatedItems = 610;
+const xml_token_t XML_calculatedMember = 611;
+const xml_token_t XML_calculatedMembers = 612;
+const xml_token_t XML_calendar = 613;
+const xml_token_t XML_calendarType = 614;
+const xml_token_t XML_callout = 615;
+const xml_token_t XML_camera = 616;
+const xml_token_t XML_cantSplit = 617;
+const xml_token_t XML_cap = 618;
+const xml_token_t XML_caps = 619;
+const xml_token_t XML_caption = 620;
+const xml_token_t XML_captions = 621;
+const xml_token_t XML_caseSensitive = 622;
+const xml_token_t XML_cat = 623;
+const xml_token_t XML_catAx = 624;
+const xml_token_t XML_catLst = 625;
+const xml_token_t XML_category = 626;
+const xml_token_t XML_categoryIdx = 627;
+const xml_token_t XML_cell = 628;
+const xml_token_t XML_cell3D = 629;
+const xml_token_t XML_cellColor = 630;
+const xml_token_t XML_cellComments = 631;
+const xml_token_t XML_cellDel = 632;
+const xml_token_t XML_cellIns = 633;
+const xml_token_t XML_cellMerge = 634;
+const xml_token_t XML_cellMeta = 635;
+const xml_token_t XML_cellMetadata = 636;
+const xml_token_t XML_cellSmartTag = 637;
+const xml_token_t XML_cellSmartTagPr = 638;
+const xml_token_t XML_cellSmartTags = 639;
+const xml_token_t XML_cellStyle = 640;
+const xml_token_t XML_cellStyleXfs = 641;
+const xml_token_t XML_cellStyles = 642;
+const xml_token_t XML_cellWatch = 643;
+const xml_token_t XML_cellWatches = 644;
+const xml_token_t XML_cellXfs = 645;
+const xml_token_t XML_cf = 646;
+const xml_token_t XML_cfRule = 647;
+const xml_token_t XML_cfvo = 648;
+const xml_token_t XML_chExt = 649;
+const xml_token_t XML_chMax = 650;
+const xml_token_t XML_chOff = 651;
+const xml_token_t XML_chOrder = 652;
+const xml_token_t XML_chPref = 653;
+const xml_token_t XML_changesSavedWin = 654;
+const xml_token_t XML_chapNum = 655;
+const xml_token_t XML_chapSep = 656;
+const xml_token_t XML_chapStyle = 657;
+const xml_token_t XML_char = 658;
+const xml_token_t XML_charRg = 659;
+const xml_token_t XML_charSpace = 660;
+const xml_token_t XML_characterSpacingControl = 661;
+const xml_token_t XML_characteristic = 662;
+const xml_token_t XML_charset = 663;
+const xml_token_t XML_chart = 664;
+const xml_token_t XML_chartFormat = 665;
+const xml_token_t XML_chartFormats = 666;
+const xml_token_t XML_chartObject = 667;
+const xml_token_t XML_chartSpace = 668;
+const xml_token_t XML_chartsheet = 669;
+const xml_token_t XML_checkBox = 670;
+const xml_token_t XML_checkCompatibility = 671;
+const xml_token_t XML_checkErrors = 672;
+const xml_token_t XML_checkStyle = 673;
+const xml_token_t XML_checked = 674;
+const xml_token_t XML_checker = 675;
+const xml_token_t XML_childTnLst = 676;
+const xml_token_t XML_choose = 677;
+const xml_token_t XML_chr = 678;
+const xml_token_t XML_chromakey = 679;
+const xml_token_t XML_circle = 680;
+const xml_token_t XML_citation = 681;
+const xml_token_t XML_class = 682;
+const xml_token_t XML_clear = 683;
+const xml_token_t XML_clearAll = 684;
+const xml_token_t XML_clearComments = 685;
+const xml_token_t XML_clearContents = 686;
+const xml_token_t XML_clearFormats = 687;
+const xml_token_t XML_click = 688;
+const xml_token_t XML_clickAndTypeStyle = 689;
+const xml_token_t XML_clientData = 690;
+const xml_token_t XML_clientInsertedTime = 691;
+const xml_token_t XML_clip = 692;
+const xml_token_t XML_clippath = 693;
+const xml_token_t XML_clipped = 694;
+const xml_token_t XML_cliptowrap = 695;
+const xml_token_t XML_close = 696;
+const xml_token_t XML_clr = 697;
+const xml_token_t XML_clrChange = 698;
+const xml_token_t XML_clrData = 699;
+const xml_token_t XML_clrFrom = 700;
+const xml_token_t XML_clrIdx = 701;
+const xml_token_t XML_clrMap = 702;
+const xml_token_t XML_clrMapOvr = 703;
+const xml_token_t XML_clrMode = 704;
+const xml_token_t XML_clrMru = 705;
+const xml_token_t XML_clrRepl = 706;
+const xml_token_t XML_clrScheme = 707;
+const xml_token_t XML_clrSchemeMapping = 708;
+const xml_token_t XML_clrSpc = 709;
+const xml_token_t XML_clrTo = 710;
+const xml_token_t XML_clrVal = 711;
+const xml_token_t XML_clsid = 712;
+const xml_token_t XML_cm = 713;
+const xml_token_t XML_cmAuthor = 714;
+const xml_token_t XML_cmAuthorLst = 715;
+const xml_token_t XML_cmLst = 716;
+const xml_token_t XML_cmd = 717;
+const xml_token_t XML_cmpd = 718;
+const xml_token_t XML_cnfStyle = 719;
+const xml_token_t XML_cnt = 720;
+const xml_token_t XML_code = 721;
+const xml_token_t XML_codeName = 722;
+const xml_token_t XML_codePage = 723;
+const xml_token_t XML_coerce = 724;
+const xml_token_t XML_coherent3DOff = 725;
+const xml_token_t XML_col = 726;
+const xml_token_t XML_colBreaks = 727;
+const xml_token_t XML_colDelim = 728;
+const xml_token_t XML_colFields = 729;
+const xml_token_t XML_colFirst = 730;
+const xml_token_t XML_colGrandTotals = 731;
+const xml_token_t XML_colHeaderCaption = 732;
+const xml_token_t XML_colHierarchiesUsage = 733;
+const xml_token_t XML_colHierarchyUsage = 734;
+const xml_token_t XML_colId = 735;
+const xml_token_t XML_colItems = 736;
+const xml_token_t XML_colLast = 737;
+const xml_token_t XML_colOff = 738;
+const xml_token_t XML_colPageCount = 739;
+const xml_token_t XML_collapse = 740;
+const xml_token_t XML_collapsed = 741;
+const xml_token_t XML_collapsedLevelsAreSubtotals = 742;
+const xml_token_t XML_color = 743;
+const xml_token_t XML_color2 = 744;
+const xml_token_t XML_colorFilter = 745;
+const xml_token_t XML_colorId = 746;
+const xml_token_t XML_colorScale = 747;
+const xml_token_t XML_colormenu = 748;
+const xml_token_t XML_colormode = 749;
+const xml_token_t XML_colormru = 750;
+const xml_token_t XML_colors = 751;
+const xml_token_t XML_colorsDef = 752;
+const xml_token_t XML_colorsDefHdr = 753;
+const xml_token_t XML_colorsDefHdrLst = 754;
+const xml_token_t XML_cols = 755;
+const xml_token_t XML_column = 756;
+const xml_token_t XML_columnSort = 757;
+const xml_token_t XML_comb = 758;
+const xml_token_t XML_combine = 759;
+const xml_token_t XML_combineBrackets = 760;
+const xml_token_t XML_comboBox = 761;
+const xml_token_t XML_comma = 762;
+const xml_token_t XML_command = 763;
+const xml_token_t XML_commandType = 764;
+const xml_token_t XML_comment = 765;
+const xml_token_t XML_commentList = 766;
+const xml_token_t XML_commentRangeEnd = 767;
+const xml_token_t XML_commentRangeStart = 768;
+const xml_token_t XML_commentReference = 769;
+const xml_token_t XML_comments = 770;
+const xml_token_t XML_comp = 771;
+const xml_token_t XML_compact = 772;
+const xml_token_t XML_compactData = 773;
+const xml_token_t XML_compat = 774;
+const xml_token_t XML_compatLnSpc = 775;
+const xml_token_t XML_compatMode = 776;
+const xml_token_t XML_complex = 777;
+const xml_token_t XML_concurrent = 778;
+const xml_token_t XML_concurrentCalc = 779;
+const xml_token_t XML_concurrentManualCount = 780;
+const xml_token_t XML_cond = 781;
+const xml_token_t XML_condense = 782;
+const xml_token_t XML_conditionalFormat = 783;
+const xml_token_t XML_conditionalFormats = 784;
+const xml_token_t XML_conditionalFormatting = 785;
+const xml_token_t XML_connectString = 786;
+const xml_token_t XML_connectangles = 787;
+const xml_token_t XML_connection = 788;
+const xml_token_t XML_connectionId = 789;
+const xml_token_t XML_connections = 790;
+const xml_token_t XML_connectloc = 791;
+const xml_token_t XML_connectlocs = 792;
+const xml_token_t XML_connectortype = 793;
+const xml_token_t XML_connecttype = 794;
+const xml_token_t XML_consecutive = 795;
+const xml_token_t XML_consecutiveHyphenLimit = 796;
+const xml_token_t XML_consolidation = 797;
+const xml_token_t XML_constr = 798;
+const xml_token_t XML_constrLst = 799;
+const xml_token_t XML_constrainbounds = 800;
+const xml_token_t XML_cont = 801;
+const xml_token_t XML_containsBlank = 802;
+const xml_token_t XML_containsDate = 803;
+const xml_token_t XML_containsInteger = 804;
+const xml_token_t XML_containsMixedTypes = 805;
+const xml_token_t XML_containsNonDate = 806;
+const xml_token_t XML_containsNumber = 807;
+const xml_token_t XML_containsSemiMixedTypes = 808;
+const xml_token_t XML_containsString = 809;
+const xml_token_t XML_content = 810;
+const xml_token_t XML_contextualSpacing = 811;
+const xml_token_t XML_continuationSeparator = 812;
+const xml_token_t XML_contourClr = 813;
+const xml_token_t XML_contourW = 814;
+const xml_token_t XML_contrast = 815;
+const xml_token_t XML_control = 816;
+const xml_token_t XML_control1 = 817;
+const xml_token_t XML_control2 = 818;
+const xml_token_t XML_controls = 819;
+const xml_token_t XML_convMailMergeEsc = 820;
+const xml_token_t XML_coordorigin = 821;
+const xml_token_t XML_coordsize = 822;
+const xml_token_t XML_copies = 823;
+const xml_token_t XML_copy = 824;
+const xml_token_t XML_count = 825;
+const xml_token_t XML_countASubtotal = 826;
+const xml_token_t XML_countBy = 827;
+const xml_token_t XML_countSubtotal = 828;
+const xml_token_t XML_cover = 829;
+const xml_token_t XML_cp = 830;
+const xml_token_t XML_cr = 831;
+const xml_token_t XML_crashSave = 832;
+const xml_token_t XML_createdVersion = 833;
+const xml_token_t XML_credentials = 834;
+const xml_token_t XML_cropbottom = 835;
+const xml_token_t XML_cropleft = 836;
+const xml_token_t XML_cropping = 837;
+const xml_token_t XML_cropright = 838;
+const xml_token_t XML_croptop = 839;
+const xml_token_t XML_crossAx = 840;
+const xml_token_t XML_crossBetween = 841;
+const xml_token_t XML_crosses = 842;
+const xml_token_t XML_crossesAt = 843;
+const xml_token_t XML_cryptAlgorithmClass = 844;
+const xml_token_t XML_cryptAlgorithmSid = 845;
+const xml_token_t XML_cryptAlgorithmType = 846;
+const xml_token_t XML_cryptProvider = 847;
+const xml_token_t XML_cryptProviderType = 848;
+const xml_token_t XML_cryptProviderTypeExt = 849;
+const xml_token_t XML_cryptProviderTypeExtSource = 850;
+const xml_token_t XML_cryptSpinCount = 851;
+const xml_token_t XML_cs = 852;
+const xml_token_t XML_csCatId = 853;
+const xml_token_t XML_csTypeId = 854;
+const xml_token_t XML_csb0 = 855;
+const xml_token_t XML_csb1 = 856;
+const xml_token_t XML_css = 857;
+const xml_token_t XML_cstate = 858;
+const xml_token_t XML_cstheme = 859;
+const xml_token_t XML_ct = 860;
+const xml_token_t XML_ctrlPr = 861;
+const xml_token_t XML_cubicBezTo = 862;
+const xml_token_t XML_culture = 863;
+const xml_token_t XML_current = 864;
+const xml_token_t XML_curve = 865;
+const xml_token_t XML_custAng = 866;
+const xml_token_t XML_custClr = 867;
+const xml_token_t XML_custClrLst = 868;
+const xml_token_t XML_custDash = 869;
+const xml_token_t XML_custData = 870;
+const xml_token_t XML_custDataLst = 871;
+const xml_token_t XML_custFlipHor = 872;
+const xml_token_t XML_custFlipVert = 873;
+const xml_token_t XML_custGeom = 874;
+const xml_token_t XML_custLinFactNeighborX = 875;
+const xml_token_t XML_custLinFactNeighborY = 876;
+const xml_token_t XML_custLinFactX = 877;
+const xml_token_t XML_custLinFactY = 878;
+const xml_token_t XML_custRadScaleInc = 879;
+const xml_token_t XML_custRadScaleRad = 880;
+const xml_token_t XML_custScaleX = 881;
+const xml_token_t XML_custScaleY = 882;
+const xml_token_t XML_custShow = 883;
+const xml_token_t XML_custShowLst = 884;
+const xml_token_t XML_custSplit = 885;
+const xml_token_t XML_custSzX = 886;
+const xml_token_t XML_custSzY = 887;
+const xml_token_t XML_custT = 888;
+const xml_token_t XML_custUnit = 889;
+const xml_token_t XML_customBuiltin = 890;
+const xml_token_t XML_customFilter = 891;
+const xml_token_t XML_customFilters = 892;
+const xml_token_t XML_customFormat = 893;
+const xml_token_t XML_customHeight = 894;
+const xml_token_t XML_customList = 895;
+const xml_token_t XML_customListSort = 896;
+const xml_token_t XML_customMarkFollows = 897;
+const xml_token_t XML_customMenu = 898;
+const xml_token_t XML_customPr = 899;
+const xml_token_t XML_customProperties = 900;
+const xml_token_t XML_customRollUp = 901;
+const xml_token_t XML_customSheetView = 902;
+const xml_token_t XML_customSheetViews = 903;
+const xml_token_t XML_customStyle = 904;
+const xml_token_t XML_customView = 905;
+const xml_token_t XML_customWidth = 906;
+const xml_token_t XML_customWorkbookView = 907;
+const xml_token_t XML_customWorkbookViews = 908;
+const xml_token_t XML_customXml = 909;
+const xml_token_t XML_customXmlDelRangeEnd = 910;
+const xml_token_t XML_customXmlDelRangeStart = 911;
+const xml_token_t XML_customXmlInsRangeEnd = 912;
+const xml_token_t XML_customXmlInsRangeStart = 913;
+const xml_token_t XML_customXmlMoveFromRangeEnd = 914;
+const xml_token_t XML_customXmlMoveFromRangeStart = 915;
+const xml_token_t XML_customXmlMoveToRangeEnd = 916;
+const xml_token_t XML_customXmlMoveToRangeStart = 917;
+const xml_token_t XML_customXmlPr = 918;
+const xml_token_t XML_cut = 919;
+const xml_token_t XML_cx = 920;
+const xml_token_t XML_cxn = 921;
+const xml_token_t XML_cxnId = 922;
+const xml_token_t XML_cxnLst = 923;
+const xml_token_t XML_cxnSp = 924;
+const xml_token_t XML_cxnSpLocks = 925;
+const xml_token_t XML_cy = 926;
+const xml_token_t XML_d = 927;
+const xml_token_t XML_dLbl = 928;
+const xml_token_t XML_dLblPos = 929;
+const xml_token_t XML_dLbls = 930;
+const xml_token_t XML_dPr = 931;
+const xml_token_t XML_dPt = 932;
+const xml_token_t XML_dTable = 933;
+const xml_token_t XML_dashstyle = 934;
+const xml_token_t XML_data = 935;
+const xml_token_t XML_dataBar = 936;
+const xml_token_t XML_dataBinding = 937;
+const xml_token_t XML_dataBound = 938;
+const xml_token_t XML_dataCaption = 939;
+const xml_token_t XML_dataCellStyle = 940;
+const xml_token_t XML_dataConsolidate = 941;
+const xml_token_t XML_dataDxfId = 942;
+const xml_token_t XML_dataExtractLoad = 943;
+const xml_token_t XML_dataField = 944;
+const xml_token_t XML_dataFields = 945;
+const xml_token_t XML_dataModel = 946;
+const xml_token_t XML_dataOnRows = 947;
+const xml_token_t XML_dataOnly = 948;
+const xml_token_t XML_dataPosition = 949;
+const xml_token_t XML_dataRef = 950;
+const xml_token_t XML_dataRefs = 951;
+const xml_token_t XML_dataSource = 952;
+const xml_token_t XML_dataSourceSort = 953;
+const xml_token_t XML_dataType = 954;
+const xml_token_t XML_dataValidation = 955;
+const xml_token_t XML_dataValidations = 956;
+const xml_token_t XML_databaseField = 957;
+const xml_token_t XML_datastoreItem = 958;
+const xml_token_t XML_date = 959;
+const xml_token_t XML_date1904 = 960;
+const xml_token_t XML_dateAx = 961;
+const xml_token_t XML_dateFormat = 962;
+const xml_token_t XML_dateGroupItem = 963;
+const xml_token_t XML_dateTime = 964;
+const xml_token_t XML_dateTimeGrouping = 965;
+const xml_token_t XML_day = 966;
+const xml_token_t XML_dayLong = 967;
+const xml_token_t XML_dayShort = 968;
+const xml_token_t XML_dbPr = 969;
+const xml_token_t XML_ddList = 970;
+const xml_token_t XML_ddeItem = 971;
+const xml_token_t XML_ddeItems = 972;
+const xml_token_t XML_ddeLink = 973;
+const xml_token_t XML_ddeService = 974;
+const xml_token_t XML_ddeTopic = 975;
+const xml_token_t XML_decel = 976;
+const xml_token_t XML_decimal = 977;
+const xml_token_t XML_decimalSymbol = 978;
+const xml_token_t XML_decorated = 979;
+const xml_token_t XML_def = 980;
+const xml_token_t XML_defJc = 981;
+const xml_token_t XML_defLockedState = 982;
+const xml_token_t XML_defPPr = 983;
+const xml_token_t XML_defQFormat = 984;
+const xml_token_t XML_defRPr = 985;
+const xml_token_t XML_defSemiHidden = 986;
+const xml_token_t XML_defStyle = 987;
+const xml_token_t XML_defTabSz = 988;
+const xml_token_t XML_defUIPriority = 989;
+const xml_token_t XML_defUnhideWhenUsed = 990;
+const xml_token_t XML_default = 991;
+const xml_token_t XML_defaultAttributeDrillState = 992;
+const xml_token_t XML_defaultColWidth = 993;
+const xml_token_t XML_defaultGridColor = 994;
+const xml_token_t XML_defaultMemberUniqueName = 995;
+const xml_token_t XML_defaultPivotStyle = 996;
+const xml_token_t XML_defaultRowHeight = 997;
+const xml_token_t XML_defaultSubtotal = 998;
+const xml_token_t XML_defaultTabStop = 999;
+const xml_token_t XML_defaultTableStyle = 1000;
+const xml_token_t XML_defaultTextStyle = 1001;
+const xml_token_t XML_defaultThemeVersion = 1002;
+const xml_token_t XML_definedName = 1003;
+const xml_token_t XML_definedNames = 1004;
+const xml_token_t XML_deg = 1005;
+const xml_token_t XML_degHide = 1006;
+const xml_token_t XML_degree = 1007;
+const xml_token_t XML_del = 1008;
+const xml_token_t XML_del1 = 1009;
+const xml_token_t XML_del2 = 1010;
+const xml_token_t XML_delInstrText = 1011;
+const xml_token_t XML_delText = 1012;
+const xml_token_t XML_delay = 1013;
+const xml_token_t XML_delete = 1014;
+const xml_token_t XML_deleteColumns = 1015;
+const xml_token_t XML_deleteRows = 1016;
+const xml_token_t XML_deleted = 1017;
+const xml_token_t XML_deletedField = 1018;
+const xml_token_t XML_delimited = 1019;
+const xml_token_t XML_delimiter = 1020;
+const xml_token_t XML_den = 1021;
+const xml_token_t XML_denormalized = 1022;
+const xml_token_t XML_depthPercent = 1023;
+const xml_token_t XML_desc = 1024;
+const xml_token_t XML_descending = 1025;
+const xml_token_t XML_descr = 1026;
+const xml_token_t XML_description = 1027;
+const xml_token_t XML_destId = 1028;
+const xml_token_t XML_destOrd = 1029;
+const xml_token_t XML_destination = 1030;
+const xml_token_t XML_destinationFile = 1031;
+const xml_token_t XML_detectmouseclick = 1032;
+const xml_token_t XML_dgm = 1033;
+const xml_token_t XML_dgmbasetextscale = 1034;
+const xml_token_t XML_dgmfontsize = 1035;
+const xml_token_t XML_dgmlayout = 1036;
+const xml_token_t XML_dgmlayoutmru = 1037;
+const xml_token_t XML_dgmnodekind = 1038;
+const xml_token_t XML_dgmscalex = 1039;
+const xml_token_t XML_dgmscaley = 1040;
+const xml_token_t XML_dgmstyle = 1041;
+const xml_token_t XML_diagonal = 1042;
+const xml_token_t XML_diagonalDown = 1043;
+const xml_token_t XML_diagonalUp = 1044;
+const xml_token_t XML_diagram = 1045;
+const xml_token_t XML_dialogsheet = 1046;
+const xml_token_t XML_diamond = 1047;
+const xml_token_t XML_diff = 1048;
+const xml_token_t XML_differentFirst = 1049;
+const xml_token_t XML_differentOddEven = 1050;
+const xml_token_t XML_diffusity = 1051;
+const xml_token_t XML_dimension = 1052;
+const xml_token_t XML_dimensionUniqueName = 1053;
+const xml_token_t XML_dimensions = 1054;
+const xml_token_t XML_dir = 1055;
+const xml_token_t XML_dirty = 1056;
+const xml_token_t XML_disableEdit = 1057;
+const xml_token_t XML_disableFieldList = 1058;
+const xml_token_t XML_disablePrompts = 1059;
+const xml_token_t XML_disableRefresh = 1060;
+const xml_token_t XML_discretePr = 1061;
+const xml_token_t XML_diskRevisions = 1062;
+const xml_token_t XML_dispBlanksAs = 1063;
+const xml_token_t XML_dispDef = 1064;
+const xml_token_t XML_dispEq = 1065;
+const xml_token_t XML_dispRSqr = 1066;
+const xml_token_t XML_dispUnits = 1067;
+const xml_token_t XML_dispUnitsLbl = 1068;
+const xml_token_t XML_displacedByCustomXml = 1069;
+const xml_token_t XML_display = 1070;
+const xml_token_t XML_displayBackgroundShape = 1071;
+const xml_token_t XML_displayFolder = 1072;
+const xml_token_t XML_displayHangulFixedWidth = 1073;
+const xml_token_t XML_displayHorizontalDrawingGridEvery = 1074;
+const xml_token_t XML_displayName = 1075;
+const xml_token_t XML_displayText = 1076;
+const xml_token_t XML_displayVerticalDrawingGridEvery = 1077;
+const xml_token_t XML_dissolve = 1078;
+const xml_token_t XML_dist = 1079;
+const xml_token_t XML_distB = 1080;
+const xml_token_t XML_distL = 1081;
+const xml_token_t XML_distR = 1082;
+const xml_token_t XML_distT = 1083;
+const xml_token_t XML_distance = 1084;
+const xml_token_t XML_div = 1085;
+const xml_token_t XML_divBdr = 1086;
+const xml_token_t XML_divId = 1087;
+const xml_token_t XML_divs = 1088;
+const xml_token_t XML_divsChild = 1089;
+const xml_token_t XML_dk1 = 1090;
+const xml_token_t XML_dk2 = 1091;
+const xml_token_t XML_dllVersion = 1092;
+const xml_token_t XML_dm = 1093;
+const xml_token_t XML_dn = 1094;
+const xml_token_t XML_doNotAutoCompressPictures = 1095;
+const xml_token_t XML_doNotAutofitConstrainedTables = 1096;
+const xml_token_t XML_doNotBreakConstrainedForcedTable = 1097;
+const xml_token_t XML_doNotBreakWrappedTables = 1098;
+const xml_token_t XML_doNotDemarcateInvalidXml = 1099;
+const xml_token_t XML_doNotDisplayPageBoundaries = 1100;
+const xml_token_t XML_doNotEmbedSmartTags = 1101;
+const xml_token_t XML_doNotExpandShiftReturn = 1102;
+const xml_token_t XML_doNotHyphenateCaps = 1103;
+const xml_token_t XML_doNotIncludeSubdocsInStats = 1104;
+const xml_token_t XML_doNotLeaveBackslashAlone = 1105;
+const xml_token_t XML_doNotOrganizeInFolder = 1106;
+const xml_token_t XML_doNotRelyOnCSS = 1107;
+const xml_token_t XML_doNotSaveAsSingleFile = 1108;
+const xml_token_t XML_doNotShadeFormData = 1109;
+const xml_token_t XML_doNotSnapToGridInCell = 1110;
+const xml_token_t XML_doNotSuppressBlankLines = 1111;
+const xml_token_t XML_doNotSuppressIndentation = 1112;
+const xml_token_t XML_doNotSuppressParagraphBorders = 1113;
+const xml_token_t XML_doNotTrackFormatting = 1114;
+const xml_token_t XML_doNotTrackMoves = 1115;
+const xml_token_t XML_doNotUseEastAsianBreakRules = 1116;
+const xml_token_t XML_doNotUseHTMLParagraphAutoSpacing = 1117;
+const xml_token_t XML_doNotUseIndentAsNumberingTabStop = 1118;
+const xml_token_t XML_doNotUseLongFileNames = 1119;
+const xml_token_t XML_doNotUseMarginsForDrawingGridOrigin = 1120;
+const xml_token_t XML_doNotValidateAgainstSchema = 1121;
+const xml_token_t XML_doNotVertAlignCellWithSp = 1122;
+const xml_token_t XML_doNotVertAlignInTxbx = 1123;
+const xml_token_t XML_doNotWrapTextWithPunct = 1124;
+const xml_token_t XML_docDefaults = 1125;
+const xml_token_t XML_docGrid = 1126;
+const xml_token_t XML_docLocation = 1127;
+const xml_token_t XML_docPart = 1128;
+const xml_token_t XML_docPartBody = 1129;
+const xml_token_t XML_docPartCategory = 1130;
+const xml_token_t XML_docPartGallery = 1131;
+const xml_token_t XML_docPartList = 1132;
+const xml_token_t XML_docPartObj = 1133;
+const xml_token_t XML_docPartPr = 1134;
+const xml_token_t XML_docPartUnique = 1135;
+const xml_token_t XML_docParts = 1136;
+const xml_token_t XML_docPr = 1137;
+const xml_token_t XML_docVar = 1138;
+const xml_token_t XML_docVars = 1139;
+const xml_token_t XML_document = 1140;
+const xml_token_t XML_documentProtection = 1141;
+const xml_token_t XML_documentType = 1142;
+const xml_token_t XML_double = 1143;
+const xml_token_t XML_doubleclicknotify = 1144;
+const xml_token_t XML_doughnutChart = 1145;
+const xml_token_t XML_downBars = 1146;
+const xml_token_t XML_dpi = 1147;
+const xml_token_t XML_dr = 1148;
+const xml_token_t XML_draft = 1149;
+const xml_token_t XML_dragOff = 1150;
+const xml_token_t XML_dragToCol = 1151;
+const xml_token_t XML_dragToData = 1152;
+const xml_token_t XML_dragToPage = 1153;
+const xml_token_t XML_dragToRow = 1154;
+const xml_token_t XML_drawing = 1155;
+const xml_token_t XML_drawingGridHorizontalOrigin = 1156;
+const xml_token_t XML_drawingGridHorizontalSpacing = 1157;
+const xml_token_t XML_drawingGridVerticalOrigin = 1158;
+const xml_token_t XML_drawingGridVerticalSpacing = 1159;
+const xml_token_t XML_drop = 1160;
+const xml_token_t XML_dropCap = 1161;
+const xml_token_t XML_dropDownList = 1162;
+const xml_token_t XML_dropLines = 1163;
+const xml_token_t XML_dropauto = 1164;
+const xml_token_t XML_ds = 1165;
+const xml_token_t XML_dstrike = 1166;
+const xml_token_t XML_dt = 1167;
+const xml_token_t XML_dt2D = 1168;
+const xml_token_t XML_dtr = 1169;
+const xml_token_t XML_duotone = 1170;
+const xml_token_t XML_dur = 1171;
+const xml_token_t XML_dvAspect = 1172;
+const xml_token_t XML_dx = 1173;
+const xml_token_t XML_dxaOrig = 1174;
+const xml_token_t XML_dxf = 1175;
+const xml_token_t XML_dxfId = 1176;
+const xml_token_t XML_dxfs = 1177;
+const xml_token_t XML_dy = 1178;
+const xml_token_t XML_dyaOrig = 1179;
+const xml_token_t XML_dynamicAddress = 1180;
+const xml_token_t XML_dynamicFilter = 1181;
+const xml_token_t XML_dz = 1182;
+const xml_token_t XML_e = 1183;
+const xml_token_t XML_ea = 1184;
+const xml_token_t XML_eaLnBrk = 1185;
+const xml_token_t XML_eastAsia = 1186;
+const xml_token_t XML_eastAsiaTheme = 1187;
+const xml_token_t XML_eastAsianLayout = 1188;
+const xml_token_t XML_eb = 1189;
+const xml_token_t XML_ed = 1190;
+const xml_token_t XML_edGrp = 1191;
+const xml_token_t XML_edge = 1192;
+const xml_token_t XML_edit = 1193;
+const xml_token_t XML_editAs = 1194;
+const xml_token_t XML_editData = 1195;
+const xml_token_t XML_editPage = 1196;
+const xml_token_t XML_editas = 1197;
+const xml_token_t XML_edited = 1198;
+const xml_token_t XML_effect = 1199;
+const xml_token_t XML_effectClrLst = 1200;
+const xml_token_t XML_effectDag = 1201;
+const xml_token_t XML_effectExtent = 1202;
+const xml_token_t XML_effectLst = 1203;
+const xml_token_t XML_effectRef = 1204;
+const xml_token_t XML_effectStyle = 1205;
+const xml_token_t XML_effectStyleLst = 1206;
+const xml_token_t XML_element = 1207;
+const xml_token_t XML_else = 1208;
+const xml_token_t XML_em = 1209;
+const xml_token_t XML_embed = 1210;
+const xml_token_t XML_embedBold = 1211;
+const xml_token_t XML_embedBoldItalic = 1212;
+const xml_token_t XML_embedItalic = 1213;
+const xml_token_t XML_embedRegular = 1214;
+const xml_token_t XML_embedSystemFonts = 1215;
+const xml_token_t XML_embedTrueTypeFonts = 1216;
+const xml_token_t XML_embeddedFont = 1217;
+const xml_token_t XML_embeddedFontLst = 1218;
+const xml_token_t XML_emboss = 1219;
+const xml_token_t XML_embosscolor = 1220;
+const xml_token_t XML_empty = 1221;
+const xml_token_t XML_emptyCellReference = 1222;
+const xml_token_t XML_enableDrill = 1223;
+const xml_token_t XML_enableFieldProperties = 1224;
+const xml_token_t XML_enableFormatConditionsCalculation = 1225;
+const xml_token_t XML_enableRefresh = 1226;
+const xml_token_t XML_enableWizard = 1227;
+const xml_token_t XML_enabled = 1228;
+const xml_token_t XML_encoding = 1229;
+const xml_token_t XML_end = 1230;
+const xml_token_t XML_endA = 1231;
+const xml_token_t XML_endAngle = 1232;
+const xml_token_t XML_endChr = 1233;
+const xml_token_t XML_endCondLst = 1234;
+const xml_token_t XML_endCxn = 1235;
+const xml_token_t XML_endDate = 1236;
+const xml_token_t XML_endNum = 1237;
+const xml_token_t XML_endOfListFormulaUpdate = 1238;
+const xml_token_t XML_endParaRPr = 1239;
+const xml_token_t XML_endPos = 1240;
+const xml_token_t XML_endSnd = 1241;
+const xml_token_t XML_endSync = 1242;
+const xml_token_t XML_endarrow = 1243;
+const xml_token_t XML_endarrowlength = 1244;
+const xml_token_t XML_endarrowwidth = 1245;
+const xml_token_t XML_endcap = 1246;
+const xml_token_t XML_endnote = 1247;
+const xml_token_t XML_endnotePr = 1248;
+const xml_token_t XML_endnoteRef = 1249;
+const xml_token_t XML_endnoteReference = 1250;
+const xml_token_t XML_endnotes = 1251;
+const xml_token_t XML_enforcement = 1252;
+const xml_token_t XML_entries = 1253;
+const xml_token_t XML_entry = 1254;
+const xml_token_t XML_entryMacro = 1255;
+const xml_token_t XML_eol = 1256;
+const xml_token_t XML_eqArr = 1257;
+const xml_token_t XML_eqArrPr = 1258;
+const xml_token_t XML_eqn = 1259;
+const xml_token_t XML_equalAverage = 1260;
+const xml_token_t XML_equalWidth = 1261;
+const xml_token_t XML_equation = 1262;
+const xml_token_t XML_equationxml = 1263;
+const xml_token_t XML_err = 1264;
+const xml_token_t XML_errBarType = 1265;
+const xml_token_t XML_errBars = 1266;
+const xml_token_t XML_errDir = 1267;
+const xml_token_t XML_errValType = 1268;
+const xml_token_t XML_error = 1269;
+const xml_token_t XML_errorCaption = 1270;
+const xml_token_t XML_errorStyle = 1271;
+const xml_token_t XML_errorTitle = 1272;
+const xml_token_t XML_errors = 1273;
+const xml_token_t XML_evalError = 1274;
+const xml_token_t XML_evalOrder = 1275;
+const xml_token_t XML_evenAndOddHeaders = 1276;
+const xml_token_t XML_evenFooter = 1277;
+const xml_token_t XML_evenHeader = 1278;
+const xml_token_t XML_evt = 1279;
+const xml_token_t XML_evtFilter = 1280;
+const xml_token_t XML_excl = 1281;
+const xml_token_t XML_exclusive = 1282;
+const xml_token_t XML_exitMacro = 1283;
+const xml_token_t XML_exp = 1284;
+const xml_token_t XML_explosion = 1285;
+const xml_token_t XML_ext = 1286;
+const xml_token_t XML_extLst = 1287;
+const xml_token_t XML_extend = 1288;
+const xml_token_t XML_extendable = 1289;
+const xml_token_t XML_extent = 1290;
+const xml_token_t XML_externalBook = 1291;
+const xml_token_t XML_externalData = 1292;
+const xml_token_t XML_externalLink = 1293;
+const xml_token_t XML_externalReference = 1294;
+const xml_token_t XML_externalReferences = 1295;
+const xml_token_t XML_extraClrScheme = 1296;
+const xml_token_t XML_extraClrSchemeLst = 1297;
+const xml_token_t XML_extrusion = 1298;
+const xml_token_t XML_extrusionClr = 1299;
+const xml_token_t XML_extrusionH = 1300;
+const xml_token_t XML_extrusionOk = 1301;
+const xml_token_t XML_extrusioncolor = 1302;
+const xml_token_t XML_extrusionok = 1303;
+const xml_token_t XML_f = 1304;
+const xml_token_t XML_fHdr = 1305;
+const xml_token_t XML_fLocksText = 1306;
+const xml_token_t XML_fLocksWithSheet = 1307;
+const xml_token_t XML_fName = 1308;
+const xml_token_t XML_fPr = 1309;
+const xml_token_t XML_fPrintsWithSheet = 1310;
+const xml_token_t XML_fPublished = 1311;
+const xml_token_t XML_facet = 1312;
+const xml_token_t XML_fact = 1313;
+const xml_token_t XML_fade = 1314;
+const xml_token_t XML_fadeDir = 1315;
+const xml_token_t XML_family = 1316;
+const xml_token_t XML_fc = 1317;
+const xml_token_t XML_ffData = 1318;
+const xml_token_t XML_fgClr = 1319;
+const xml_token_t XML_fgColor = 1320;
+const xml_token_t XML_fi = 1321;
+const xml_token_t XML_field = 1322;
+const xml_token_t XML_fieldGroup = 1323;
+const xml_token_t XML_fieldId = 1324;
+const xml_token_t XML_fieldIdWrapped = 1325;
+const xml_token_t XML_fieldListSortAscending = 1326;
+const xml_token_t XML_fieldMapData = 1327;
+const xml_token_t XML_fieldPosition = 1328;
+const xml_token_t XML_fieldPrintTitles = 1329;
+const xml_token_t XML_fieldUsage = 1330;
+const xml_token_t XML_fieldsUsage = 1331;
+const xml_token_t XML_fileRecoveryPr = 1332;
+const xml_token_t XML_fileSharing = 1333;
+const xml_token_t XML_fileType = 1334;
+const xml_token_t XML_fileVersion = 1335;
+const xml_token_t XML_filetime = 1336;
+const xml_token_t XML_fill = 1337;
+const xml_token_t XML_fillClrLst = 1338;
+const xml_token_t XML_fillFormulas = 1339;
+const xml_token_t XML_fillId = 1340;
+const xml_token_t XML_fillOverlay = 1341;
+const xml_token_t XML_fillRect = 1342;
+const xml_token_t XML_fillRef = 1343;
+const xml_token_t XML_fillStyleLst = 1344;
+const xml_token_t XML_fillToRect = 1345;
+const xml_token_t XML_fillcolor = 1346;
+const xml_token_t XML_filled = 1347;
+const xml_token_t XML_fillok = 1348;
+const xml_token_t XML_fills = 1349;
+const xml_token_t XML_filltype = 1350;
+const xml_token_t XML_filter = 1351;
+const xml_token_t XML_filterColumn = 1352;
+const xml_token_t XML_filterMode = 1353;
+const xml_token_t XML_filterPrivacy = 1354;
+const xml_token_t XML_filterUnique = 1355;
+const xml_token_t XML_filterVal = 1356;
+const xml_token_t XML_filters = 1357;
+const xml_token_t XML_first = 1358;
+const xml_token_t XML_firstBackgroundRefresh = 1359;
+const xml_token_t XML_firstCol = 1360;
+const xml_token_t XML_firstDataCol = 1361;
+const xml_token_t XML_firstDataRow = 1362;
+const xml_token_t XML_firstFooter = 1363;
+const xml_token_t XML_firstHeader = 1364;
+const xml_token_t XML_firstHeaderRow = 1365;
+const xml_token_t XML_firstLine = 1366;
+const xml_token_t XML_firstLineChars = 1367;
+const xml_token_t XML_firstPageNumber = 1368;
+const xml_token_t XML_firstRow = 1369;
+const xml_token_t XML_firstSheet = 1370;
+const xml_token_t XML_firstSliceAng = 1371;
+const xml_token_t XML_firstSlideNum = 1372;
+const xml_token_t XML_fitText = 1373;
+const xml_token_t XML_fitToHeight = 1374;
+const xml_token_t XML_fitToPage = 1375;
+const xml_token_t XML_fitToWidth = 1376;
+const xml_token_t XML_fitpath = 1377;
+const xml_token_t XML_fitshape = 1378;
+const xml_token_t XML_flatBorders = 1379;
+const xml_token_t XML_flatTx = 1380;
+const xml_token_t XML_fld = 1381;
+const xml_token_t XML_fldChar = 1382;
+const xml_token_t XML_fldCharType = 1383;
+const xml_token_t XML_fldData = 1384;
+const xml_token_t XML_fldLock = 1385;
+const xml_token_t XML_fldSimple = 1386;
+const xml_token_t XML_flip = 1387;
+const xml_token_t XML_flipH = 1388;
+const xml_token_t XML_flipV = 1389;
+const xml_token_t XML_floor = 1390;
+const xml_token_t XML_fltVal = 1391;
+const xml_token_t XML_fmla = 1392;
+const xml_token_t XML_fmt = 1393;
+const xml_token_t XML_fmtId = 1394;
+const xml_token_t XML_fmtScheme = 1395;
+const xml_token_t XML_fmtid = 1396;
+const xml_token_t XML_focus = 1397;
+const xml_token_t XML_focusposition = 1398;
+const xml_token_t XML_focussize = 1399;
+const xml_token_t XML_folHlink = 1400;
+const xml_token_t XML_followColorScheme = 1401;
+const xml_token_t XML_followedHyperlink = 1402;
+const xml_token_t XML_font = 1403;
+const xml_token_t XML_fontAlgn = 1404;
+const xml_token_t XML_fontId = 1405;
+const xml_token_t XML_fontKey = 1406;
+const xml_token_t XML_fontRef = 1407;
+const xml_token_t XML_fontScale = 1408;
+const xml_token_t XML_fontScheme = 1409;
+const xml_token_t XML_fontSz = 1410;
+const xml_token_t XML_fonts = 1411;
+const xml_token_t XML_footer = 1412;
+const xml_token_t XML_footerReference = 1413;
+const xml_token_t XML_footnote = 1414;
+const xml_token_t XML_footnoteLayoutLikeWW8 = 1415;
+const xml_token_t XML_footnotePr = 1416;
+const xml_token_t XML_footnoteRef = 1417;
+const xml_token_t XML_footnoteReference = 1418;
+const xml_token_t XML_footnotes = 1419;
+const xml_token_t XML_for = 1420;
+const xml_token_t XML_forEach = 1421;
+const xml_token_t XML_forName = 1422;
+const xml_token_t XML_forceAA = 1423;
+const xml_token_t XML_forceFullCalc = 1424;
+const xml_token_t XML_forceUpgrade = 1425;
+const xml_token_t XML_forcedash = 1426;
+const xml_token_t XML_foredepth = 1427;
+const xml_token_t XML_forgetLastTabAlignment = 1428;
+const xml_token_t XML_formProt = 1429;
+const xml_token_t XML_format = 1430;
+const xml_token_t XML_formatCells = 1431;
+const xml_token_t XML_formatCode = 1432;
+const xml_token_t XML_formatColumns = 1433;
+const xml_token_t XML_formatRows = 1434;
+const xml_token_t XML_formats = 1435;
+const xml_token_t XML_formatting = 1436;
+const xml_token_t XML_formsDesign = 1437;
+const xml_token_t XML_formula = 1438;
+const xml_token_t XML_formula1 = 1439;
+const xml_token_t XML_formula2 = 1440;
+const xml_token_t XML_formulaRange = 1441;
+const xml_token_t XML_formulas = 1442;
+const xml_token_t XML_forward = 1443;
+const xml_token_t XML_fov = 1444;
+const xml_token_t XML_frame = 1445;
+const xml_token_t XML_frameLayout = 1446;
+const xml_token_t XML_framePr = 1447;
+const xml_token_t XML_frameSlides = 1448;
+const xml_token_t XML_frameset = 1449;
+const xml_token_t XML_framesetSplitbar = 1450;
+const xml_token_t XML_from = 1451;
+const xml_token_t XML_fromWordArt = 1452;
+const xml_token_t XML_ftr = 1453;
+const xml_token_t XML_fullCalcOnLoad = 1454;
+const xml_token_t XML_fullDate = 1455;
+const xml_token_t XML_fullPrecision = 1456;
+const xml_token_t XML_fullScrn = 1457;
+const xml_token_t XML_func = 1458;
+const xml_token_t XML_funcPr = 1459;
+const xml_token_t XML_function = 1460;
+const xml_token_t XML_functionGroup = 1461;
+const xml_token_t XML_functionGroupId = 1462;
+const xml_token_t XML_functionGroups = 1463;
+const xml_token_t XML_futureMetadata = 1464;
+const xml_token_t XML_g = 1465;
+const xml_token_t XML_gain = 1466;
+const xml_token_t XML_gallery = 1467;
+const xml_token_t XML_gamma = 1468;
+const xml_token_t XML_gap = 1469;
+const xml_token_t XML_gapDepth = 1470;
+const xml_token_t XML_gapWidth = 1471;
+const xml_token_t XML_gd = 1472;
+const xml_token_t XML_gdLst = 1473;
+const xml_token_t XML_gdRefAng = 1474;
+const xml_token_t XML_gdRefR = 1475;
+const xml_token_t XML_gdRefX = 1476;
+const xml_token_t XML_gdRefY = 1477;
+const xml_token_t XML_gfxdata = 1478;
+const xml_token_t XML_ghostCol = 1479;
+const xml_token_t XML_ghostRow = 1480;
+const xml_token_t XML_glossaryDocument = 1481;
+const xml_token_t XML_glow = 1482;
+const xml_token_t XML_goal = 1483;
+const xml_token_t XML_gradFill = 1484;
+const xml_token_t XML_gradientFill = 1485;
+const xml_token_t XML_gradientshapeok = 1486;
+const xml_token_t XML_grammar = 1487;
+const xml_token_t XML_grandCol = 1488;
+const xml_token_t XML_grandRow = 1489;
+const xml_token_t XML_grandTotalCaption = 1490;
+const xml_token_t XML_graphic = 1491;
+const xml_token_t XML_graphicData = 1492;
+const xml_token_t XML_graphicEl = 1493;
+const xml_token_t XML_graphicFrame = 1494;
+const xml_token_t XML_graphicFrameLocks = 1495;
+const xml_token_t XML_gray = 1496;
+const xml_token_t XML_grayscale = 1497;
+const xml_token_t XML_grayscl = 1498;
+const xml_token_t XML_green = 1499;
+const xml_token_t XML_greenMod = 1500;
+const xml_token_t XML_greenOff = 1501;
+const xml_token_t XML_gridAfter = 1502;
+const xml_token_t XML_gridBefore = 1503;
+const xml_token_t XML_gridCol = 1504;
+const xml_token_t XML_gridDropZones = 1505;
+const xml_token_t XML_gridLines = 1506;
+const xml_token_t XML_gridLinesSet = 1507;
+const xml_token_t XML_gridSpacing = 1508;
+const xml_token_t XML_gridSpan = 1509;
+const xml_token_t XML_group = 1510;
+const xml_token_t XML_groupBy = 1511;
+const xml_token_t XML_groupChr = 1512;
+const xml_token_t XML_groupChrPr = 1513;
+const xml_token_t XML_groupInterval = 1514;
+const xml_token_t XML_groupItems = 1515;
+const xml_token_t XML_groupLevel = 1516;
+const xml_token_t XML_groupLevels = 1517;
+const xml_token_t XML_groupMember = 1518;
+const xml_token_t XML_groupMembers = 1519;
+const xml_token_t XML_grouping = 1520;
+const xml_token_t XML_groups = 1521;
+const xml_token_t XML_grow = 1522;
+const xml_token_t XML_growAutofit = 1523;
+const xml_token_t XML_growShrinkType = 1524;
+const xml_token_t XML_grpFill = 1525;
+const xml_token_t XML_grpId = 1526;
+const xml_token_t XML_grpSp = 1527;
+const xml_token_t XML_grpSpLocks = 1528;
+const xml_token_t XML_grpSpPr = 1529;
+const xml_token_t XML_gs = 1530;
+const xml_token_t XML_gsLst = 1531;
+const xml_token_t XML_gte = 1532;
+const xml_token_t XML_guid = 1533;
+const xml_token_t XML_guide = 1534;
+const xml_token_t XML_guideLst = 1535;
+const xml_token_t XML_gutter = 1536;
+const xml_token_t XML_gutterAtTop = 1537;
+const xml_token_t XML_h = 1538;
+const xml_token_t XML_hAnchor = 1539;
+const xml_token_t XML_hAnsi = 1540;
+const xml_token_t XML_hAnsiTheme = 1541;
+const xml_token_t XML_hMerge = 1542;
+const xml_token_t XML_hMode = 1543;
+const xml_token_t XML_hPercent = 1544;
+const xml_token_t XML_hR = 1545;
+const xml_token_t XML_hRule = 1546;
+const xml_token_t XML_hSpace = 1547;
+const xml_token_t XML_handles = 1548;
+const xml_token_t XML_handoutMaster = 1549;
+const xml_token_t XML_handoutMasterId = 1550;
+const xml_token_t XML_handoutMasterIdLst = 1551;
+const xml_token_t XML_hanging = 1552;
+const xml_token_t XML_hangingChars = 1553;
+const xml_token_t XML_hangingPunct = 1554;
+const xml_token_t XML_hasCustomPrompt = 1555;
+const xml_token_t XML_hash = 1556;
+const xml_token_t XML_hashData = 1557;
+const xml_token_t XML_hdr = 1558;
+const xml_token_t XML_hdrShapeDefaults = 1559;
+const xml_token_t XML_headEnd = 1560;
+const xml_token_t XML_header = 1561;
+const xml_token_t XML_headerFooter = 1562;
+const xml_token_t XML_headerReference = 1563;
+const xml_token_t XML_headerRowBorderDxfId = 1564;
+const xml_token_t XML_headerRowCellStyle = 1565;
+const xml_token_t XML_headerRowCount = 1566;
+const xml_token_t XML_headerRowDxfId = 1567;
+const xml_token_t XML_headerSource = 1568;
+const xml_token_t XML_headers = 1569;
+const xml_token_t XML_headersInLastRefresh = 1570;
+const xml_token_t XML_heading = 1571;
+const xml_token_t XML_headings = 1572;
+const xml_token_t XML_help = 1573;
+const xml_token_t XML_helpText = 1574;
+const xml_token_t XML_hf = 1575;
+const xml_token_t XML_hiLowLines = 1576;
+const xml_token_t XML_hidden = 1577;
+const xml_token_t XML_hiddenButton = 1578;
+const xml_token_t XML_hiddenColumn = 1579;
+const xml_token_t XML_hiddenColumns = 1580;
+const xml_token_t XML_hiddenLevel = 1581;
+const xml_token_t XML_hiddenRow = 1582;
+const xml_token_t XML_hiddenRows = 1583;
+const xml_token_t XML_hiddenSlides = 1584;
+const xml_token_t XML_hideBot = 1585;
+const xml_token_t XML_hideGeom = 1586;
+const xml_token_t XML_hideGrammaticalErrors = 1587;
+const xml_token_t XML_hideLastTrans = 1588;
+const xml_token_t XML_hideLeft = 1589;
+const xml_token_t XML_hideMark = 1590;
+const xml_token_t XML_hideNewItems = 1591;
+const xml_token_t XML_hidePivotFieldList = 1592;
+const xml_token_t XML_hideRight = 1593;
+const xml_token_t XML_hideSpellingErrors = 1594;
+const xml_token_t XML_hideTop = 1595;
+const xml_token_t XML_hier = 1596;
+const xml_token_t XML_hierBranch = 1597;
+const xml_token_t XML_hierarchy = 1598;
+const xml_token_t XML_hierarchyUsage = 1599;
+const xml_token_t XML_highlight = 1600;
+const xml_token_t XML_highlightClick = 1601;
+const xml_token_t XML_hint = 1602;
+const xml_token_t XML_history = 1603;
+const xml_token_t XML_hlink = 1604;
+const xml_token_t XML_hlinkClick = 1605;
+const xml_token_t XML_hlinkHover = 1606;
+const xml_token_t XML_hlinkMouseOver = 1607;
+const xml_token_t XML_holeSize = 1608;
+const xml_token_t XML_horizontal = 1609;
+const xml_token_t XML_horizontalCentered = 1610;
+const xml_token_t XML_horizontalDpi = 1611;
+const xml_token_t XML_horzAnchor = 1612;
+const xml_token_t XML_horzBarState = 1613;
+const xml_token_t XML_horzOverflow = 1614;
+const xml_token_t XML_hour = 1615;
+const xml_token_t XML_how = 1616;
+const xml_token_t XML_hps = 1617;
+const xml_token_t XML_hpsBaseText = 1618;
+const xml_token_t XML_hpsRaise = 1619;
+const xml_token_t XML_hr = 1620;
+const xml_token_t XML_hralign = 1621;
+const xml_token_t XML_href = 1622;
+const xml_token_t XML_hrnoshade = 1623;
+const xml_token_t XML_hrpct = 1624;
+const xml_token_t XML_hrstd = 1625;
+const xml_token_t XML_hsl = 1626;
+const xml_token_t XML_hslClr = 1627;
+const xml_token_t XML_ht = 1628;
+const xml_token_t XML_htmlFormat = 1629;
+const xml_token_t XML_htmlPubPr = 1630;
+const xml_token_t XML_htmlTables = 1631;
+const xml_token_t XML_hue = 1632;
+const xml_token_t XML_hueDir = 1633;
+const xml_token_t XML_hueMod = 1634;
+const xml_token_t XML_hueOff = 1635;
+const xml_token_t XML_hyperlink = 1636;
+const xml_token_t XML_hyperlinks = 1637;
+const xml_token_t XML_hyphenationZone = 1638;
+const xml_token_t XML_i = 1639;
+const xml_token_t XML_i1 = 1640;
+const xml_token_t XML_i2 = 1641;
+const xml_token_t XML_i3 = 1642;
+const xml_token_t XML_i4 = 1643;
+const xml_token_t XML_i8 = 1644;
+const xml_token_t XML_iCs = 1645;
+const xml_token_t XML_iLevel = 1646;
+const xml_token_t XML_iMeasureFld = 1647;
+const xml_token_t XML_iMeasureHier = 1648;
+const xml_token_t XML_icon = 1649;
+const xml_token_t XML_iconFilter = 1650;
+const xml_token_t XML_iconId = 1651;
+const xml_token_t XML_iconSet = 1652;
+const xml_token_t XML_id = 1653;
+const xml_token_t XML_idcntr = 1654;
+const xml_token_t XML_iddest = 1655;
+const xml_token_t XML_idmap = 1656;
+const xml_token_t XML_idref = 1657;
+const xml_token_t XML_idsrc = 1658;
+const xml_token_t XML_idx = 1659;
+const xml_token_t XML_if = 1660;
+const xml_token_t XML_ignoreMixedContent = 1661;
+const xml_token_t XML_ignoredError = 1662;
+const xml_token_t XML_ignoredErrors = 1663;
+const xml_token_t XML_ilvl = 1664;
+const xml_token_t XML_image = 1665;
+const xml_token_t XML_imagealignshape = 1666;
+const xml_token_t XML_imageaspect = 1667;
+const xml_token_t XML_imagedata = 1668;
+const xml_token_t XML_imagesize = 1669;
+const xml_token_t XML_imeMode = 1670;
+const xml_token_t XML_imgH = 1671;
+const xml_token_t XML_imgSz = 1672;
+const xml_token_t XML_imgW = 1673;
+const xml_token_t XML_immersive = 1674;
+const xml_token_t XML_imprint = 1675;
+const xml_token_t XML_in = 1676;
+const xml_token_t XML_includeHiddenRowCol = 1677;
+const xml_token_t XML_includeNewItemsInFilter = 1678;
+const xml_token_t XML_includePrintSettings = 1679;
+const xml_token_t XML_ind = 1680;
+const xml_token_t XML_indent = 1681;
+const xml_token_t XML_index = 1682;
+const xml_token_t XML_indexed = 1683;
+const xml_token_t XML_indexedColors = 1684;
+const xml_token_t XML_initials = 1685;
+const xml_token_t XML_ink = 1686;
+const xml_token_t XML_inkAnnotations = 1687;
+const xml_token_t XML_inkTgt = 1688;
+const xml_token_t XML_inline = 1689;
+const xml_token_t XML_innerShdw = 1690;
+const xml_token_t XML_inputCells = 1691;
+const xml_token_t XML_ins = 1692;
+const xml_token_t XML_insDel = 1693;
+const xml_token_t XML_insertBlankRow = 1694;
+const xml_token_t XML_insertColumns = 1695;
+const xml_token_t XML_insertHyperlinks = 1696;
+const xml_token_t XML_insertPageBreak = 1697;
+const xml_token_t XML_insertRow = 1698;
+const xml_token_t XML_insertRowShift = 1699;
+const xml_token_t XML_insertRows = 1700;
+const xml_token_t XML_inset = 1701;
+const xml_token_t XML_insetmode = 1702;
+const xml_token_t XML_insetpen = 1703;
+const xml_token_t XML_insetpenok = 1704;
+const xml_token_t XML_insideH = 1705;
+const xml_token_t XML_insideV = 1706;
+const xml_token_t XML_instr = 1707;
+const xml_token_t XML_instrText = 1708;
+const xml_token_t XML_int = 1709;
+const xml_token_t XML_intLim = 1710;
+const xml_token_t XML_intVal = 1711;
+const xml_token_t XML_integer = 1712;
+const xml_token_t XML_interSp = 1713;
+const xml_token_t XML_intercept = 1714;
+const xml_token_t XML_intermediate = 1715;
+const xml_token_t XML_interval = 1716;
+const xml_token_t XML_intraSp = 1717;
+const xml_token_t XML_inv = 1718;
+const xml_token_t XML_invGamma = 1719;
+const xml_token_t XML_invalEndChars = 1720;
+const xml_token_t XML_invalStChars = 1721;
+const xml_token_t XML_invalid = 1722;
+const xml_token_t XML_invalidUrl = 1723;
+const xml_token_t XML_invertIfNegative = 1724;
+const xml_token_t XML_invx = 1725;
+const xml_token_t XML_invy = 1726;
+const xml_token_t XML_is = 1727;
+const xml_token_t XML_isLgl = 1728;
+const xml_token_t XML_isNarration = 1729;
+const xml_token_t XML_isPhoto = 1730;
+const xml_token_t XML_iscomment = 1731;
+const xml_token_t XML_issignatureline = 1732;
+const xml_token_t XML_italic = 1733;
+const xml_token_t XML_item = 1734;
+const xml_token_t XML_itemID = 1735;
+const xml_token_t XML_itemPageCount = 1736;
+const xml_token_t XML_itemPrintTitles = 1737;
+const xml_token_t XML_items = 1738;
+const xml_token_t XML_iterate = 1739;
+const xml_token_t XML_iterateCount = 1740;
+const xml_token_t XML_iterateDelta = 1741;
+const xml_token_t XML_jc = 1742;
+const xml_token_t XML_joinstyle = 1743;
+const xml_token_t XML_justifyLastLine = 1744;
+const xml_token_t XML_k = 1745;
+const xml_token_t XML_keepAlive = 1746;
+const xml_token_t XML_keepChangeHistory = 1747;
+const xml_token_t XML_keepLines = 1748;
+const xml_token_t XML_keepNext = 1749;
+const xml_token_t XML_kern = 1750;
+const xml_token_t XML_key = 1751;
+const xml_token_t XML_keyAttribute = 1752;
+const xml_token_t XML_kinsoku = 1753;
+const xml_token_t XML_kiosk = 1754;
+const xml_token_t XML_kpi = 1755;
+const xml_token_t XML_kpis = 1756;
+const xml_token_t XML_kumimoji = 1757;
+const xml_token_t XML_kx = 1758;
+const xml_token_t XML_ky = 1759;
+const xml_token_t XML_l = 1760;
+const xml_token_t XML_lBounds = 1761;
+const xml_token_t XML_lIns = 1762;
+const xml_token_t XML_lMargin = 1763;
+const xml_token_t XML_label = 1764;
+const xml_token_t XML_labelOnly = 1765;
+const xml_token_t XML_lang = 1766;
+const xml_token_t XML_lastClr = 1767;
+const xml_token_t XML_lastCol = 1768;
+const xml_token_t XML_lastEdited = 1769;
+const xml_token_t XML_lastGuid = 1770;
+const xml_token_t XML_lastIdx = 1771;
+const xml_token_t XML_lastRenderedPageBreak = 1772;
+const xml_token_t XML_lastRow = 1773;
+const xml_token_t XML_lastValue = 1774;
+const xml_token_t XML_lastView = 1775;
+const xml_token_t XML_lat = 1776;
+const xml_token_t XML_latentStyles = 1777;
+const xml_token_t XML_latin = 1778;
+const xml_token_t XML_latinLnBrk = 1779;
+const xml_token_t XML_layout = 1780;
+const xml_token_t XML_layoutDef = 1781;
+const xml_token_t XML_layoutDefHdr = 1782;
+const xml_token_t XML_layoutDefHdrLst = 1783;
+const xml_token_t XML_layoutInCell = 1784;
+const xml_token_t XML_layoutNode = 1785;
+const xml_token_t XML_layoutRawTableWidth = 1786;
+const xml_token_t XML_layoutTableRowsApart = 1787;
+const xml_token_t XML_layoutTarget = 1788;
+const xml_token_t XML_lblAlgn = 1789;
+const xml_token_t XML_lblOffset = 1790;
+const xml_token_t XML_leader = 1791;
+const xml_token_t XML_leaderLines = 1792;
+const xml_token_t XML_left = 1793;
+const xml_token_t XML_leftChars = 1794;
+const xml_token_t XML_leftFromText = 1795;
+const xml_token_t XML_leftLabels = 1796;
+const xml_token_t XML_legacy = 1797;
+const xml_token_t XML_legacyDrawing = 1798;
+const xml_token_t XML_legacyDrawingHF = 1799;
+const xml_token_t XML_legacyIndent = 1800;
+const xml_token_t XML_legacySpace = 1801;
+const xml_token_t XML_legend = 1802;
+const xml_token_t XML_legendEntry = 1803;
+const xml_token_t XML_legendPos = 1804;
+const xml_token_t XML_len = 1805;
+const xml_token_t XML_length = 1806;
+const xml_token_t XML_lengthspecified = 1807;
+const xml_token_t XML_level = 1808;
+const xml_token_t XML_lid = 1809;
+const xml_token_t XML_lightRig = 1810;
+const xml_token_t XML_lightface = 1811;
+const xml_token_t XML_lightharsh = 1812;
+const xml_token_t XML_lightharsh2 = 1813;
+const xml_token_t XML_lightlevel = 1814;
+const xml_token_t XML_lightlevel2 = 1815;
+const xml_token_t XML_lightposition = 1816;
+const xml_token_t XML_lightposition2 = 1817;
+const xml_token_t XML_lim = 1818;
+const xml_token_t XML_limLoc = 1819;
+const xml_token_t XML_limLow = 1820;
+const xml_token_t XML_limLowPr = 1821;
+const xml_token_t XML_limUpp = 1822;
+const xml_token_t XML_limUppPr = 1823;
+const xml_token_t XML_limo = 1824;
+const xml_token_t XML_lin = 1825;
+const xml_token_t XML_linClrLst = 1826;
+const xml_token_t XML_line = 1827;
+const xml_token_t XML_line3DChart = 1828;
+const xml_token_t XML_lineChart = 1829;
+const xml_token_t XML_linePitch = 1830;
+const xml_token_t XML_lineRule = 1831;
+const xml_token_t XML_lineTo = 1832;
+const xml_token_t XML_lineWrapLikeWord6 = 1833;
+const xml_token_t XML_lines = 1834;
+const xml_token_t XML_linestyle = 1835;
+const xml_token_t XML_link = 1836;
+const xml_token_t XML_linkStyles = 1837;
+const xml_token_t XML_linkTarget = 1838;
+const xml_token_t XML_linkToQuery = 1839;
+const xml_token_t XML_linkedToFile = 1840;
+const xml_token_t XML_listDataValidation = 1841;
+const xml_token_t XML_listEntry = 1842;
+const xml_token_t XML_listItem = 1843;
+const xml_token_t XML_listSeparator = 1844;
+const xml_token_t XML_lit = 1845;
+const xml_token_t XML_lkTxEntry = 1846;
+const xml_token_t XML_ln = 1847;
+const xml_token_t XML_lnB = 1848;
+const xml_token_t XML_lnBlToTr = 1849;
+const xml_token_t XML_lnDef = 1850;
+const xml_token_t XML_lnL = 1851;
+const xml_token_t XML_lnNumType = 1852;
+const xml_token_t XML_lnR = 1853;
+const xml_token_t XML_lnRef = 1854;
+const xml_token_t XML_lnSpc = 1855;
+const xml_token_t XML_lnSpcReduction = 1856;
+const xml_token_t XML_lnStyleLst = 1857;
+const xml_token_t XML_lnT = 1858;
+const xml_token_t XML_lnTlToBr = 1859;
+const xml_token_t XML_lnTo = 1860;
+const xml_token_t XML_lo = 1861;
+const xml_token_t XML_loCatId = 1862;
+const xml_token_t XML_loTypeId = 1863;
+const xml_token_t XML_local = 1864;
+const xml_token_t XML_localConnection = 1865;
+const xml_token_t XML_localRefresh = 1866;
+const xml_token_t XML_localSheetId = 1867;
+const xml_token_t XML_location = 1868;
+const xml_token_t XML_lock = 1869;
+const xml_token_t XML_lockRevision = 1870;
+const xml_token_t XML_lockStructure = 1871;
+const xml_token_t XML_lockWindows = 1872;
+const xml_token_t XML_locked = 1873;
+const xml_token_t XML_lockedCanvas = 1874;
+const xml_token_t XML_lockrotationcenter = 1875;
+const xml_token_t XML_logBase = 1876;
+const xml_token_t XML_lon = 1877;
+const xml_token_t XML_longFileNames = 1878;
+const xml_token_t XML_longText = 1879;
+const xml_token_t XML_loop = 1880;
+const xml_token_t XML_lowestEdited = 1881;
+const xml_token_t XML_lpstr = 1882;
+const xml_token_t XML_lpwstr = 1883;
+const xml_token_t XML_lsdException = 1884;
+const xml_token_t XML_lstStyle = 1885;
+const xml_token_t XML_lt1 = 1886;
+const xml_token_t XML_lt2 = 1887;
+const xml_token_t XML_lum = 1888;
+const xml_token_t XML_lumMod = 1889;
+const xml_token_t XML_lumOff = 1890;
+const xml_token_t XML_lvl = 1891;
+const xml_token_t XML_lvl1pPr = 1892;
+const xml_token_t XML_lvl2pPr = 1893;
+const xml_token_t XML_lvl3pPr = 1894;
+const xml_token_t XML_lvl4pPr = 1895;
+const xml_token_t XML_lvl5pPr = 1896;
+const xml_token_t XML_lvl6pPr = 1897;
+const xml_token_t XML_lvl7pPr = 1898;
+const xml_token_t XML_lvl8pPr = 1899;
+const xml_token_t XML_lvl9pPr = 1900;
+const xml_token_t XML_lvlJc = 1901;
+const xml_token_t XML_lvlOverride = 1902;
+const xml_token_t XML_lvlPicBulletId = 1903;
+const xml_token_t XML_lvlRestart = 1904;
+const xml_token_t XML_lvlText = 1905;
+const xml_token_t XML_m = 1906;
+const xml_token_t XML_mPr = 1907;
+const xml_token_t XML_macro = 1908;
+const xml_token_t XML_mailAsAttachment = 1909;
+const xml_token_t XML_mailMerge = 1910;
+const xml_token_t XML_mailSubject = 1911;
+const xml_token_t XML_main = 1912;
+const xml_token_t XML_mainDocumentType = 1913;
+const xml_token_t XML_majorFont = 1914;
+const xml_token_t XML_majorGridlines = 1915;
+const xml_token_t XML_majorTickMark = 1916;
+const xml_token_t XML_majorTimeUnit = 1917;
+const xml_token_t XML_majorUnit = 1918;
+const xml_token_t XML_man = 1919;
+const xml_token_t XML_manifestLocation = 1920;
+const xml_token_t XML_manualBreakCount = 1921;
+const xml_token_t XML_manualLayout = 1922;
+const xml_token_t XML_map = 1923;
+const xml_token_t XML_mapId = 1924;
+const xml_token_t XML_mappedName = 1925;
+const xml_token_t XML_mappingCount = 1926;
+const xml_token_t XML_maps = 1927;
+const xml_token_t XML_marB = 1928;
+const xml_token_t XML_marBottom = 1929;
+const xml_token_t XML_marH = 1930;
+const xml_token_t XML_marL = 1931;
+const xml_token_t XML_marLeft = 1932;
+const xml_token_t XML_marR = 1933;
+const xml_token_t XML_marRight = 1934;
+const xml_token_t XML_marT = 1935;
+const xml_token_t XML_marTop = 1936;
+const xml_token_t XML_marW = 1937;
+const xml_token_t XML_marker = 1938;
+const xml_token_t XML_markup = 1939;
+const xml_token_t XML_master = 1940;
+const xml_token_t XML_masterClrMapping = 1941;
+const xml_token_t XML_masterRel = 1942;
+const xml_token_t XML_matchSrc = 1943;
+const xml_token_t XML_matchingName = 1944;
+const xml_token_t XML_mathFont = 1945;
+const xml_token_t XML_mathPr = 1946;
+const xml_token_t XML_matrix = 1947;
+const xml_token_t XML_max = 1948;
+const xml_token_t XML_maxAng = 1949;
+const xml_token_t XML_maxDate = 1950;
+const xml_token_t XML_maxDist = 1951;
+const xml_token_t XML_maxLength = 1952;
+const xml_token_t XML_maxR = 1953;
+const xml_token_t XML_maxRId = 1954;
+const xml_token_t XML_maxRank = 1955;
+const xml_token_t XML_maxSheetId = 1956;
+const xml_token_t XML_maxSubtotal = 1957;
+const xml_token_t XML_maxVal = 1958;
+const xml_token_t XML_maxValue = 1959;
+const xml_token_t XML_maxX = 1960;
+const xml_token_t XML_maxY = 1961;
+const xml_token_t XML_maximized = 1962;
+const xml_token_t XML_mc = 1963;
+const xml_token_t XML_mcJc = 1964;
+const xml_token_t XML_mcPr = 1965;
+const xml_token_t XML_mcs = 1966;
+const xml_token_t XML_mdx = 1967;
+const xml_token_t XML_mdxMetadata = 1968;
+const xml_token_t XML_mdxSubqueries = 1969;
+const xml_token_t XML_measure = 1970;
+const xml_token_t XML_measureFilter = 1971;
+const xml_token_t XML_measureGroup = 1972;
+const xml_token_t XML_measureGroups = 1973;
+const xml_token_t XML_measures = 1974;
+const xml_token_t XML_member = 1975;
+const xml_token_t XML_memberName = 1976;
+const xml_token_t XML_memberPropertyField = 1977;
+const xml_token_t XML_memberValueDatatype = 1978;
+const xml_token_t XML_members = 1979;
+const xml_token_t XML_merge = 1980;
+const xml_token_t XML_mergeCell = 1981;
+const xml_token_t XML_mergeCells = 1982;
+const xml_token_t XML_mergeInterval = 1983;
+const xml_token_t XML_mergeItem = 1984;
+const xml_token_t XML_metadata = 1985;
+const xml_token_t XML_metadataStrings = 1986;
+const xml_token_t XML_metadataType = 1987;
+const xml_token_t XML_metadataTypes = 1988;
+const xml_token_t XML_metal = 1989;
+const xml_token_t XML_meth = 1990;
+const xml_token_t XML_method = 1991;
+const xml_token_t XML_min = 1992;
+const xml_token_t XML_minAng = 1993;
+const xml_token_t XML_minDate = 1994;
+const xml_token_t XML_minLength = 1995;
+const xml_token_t XML_minR = 1996;
+const xml_token_t XML_minRId = 1997;
+const xml_token_t XML_minRefreshableVersion = 1998;
+const xml_token_t XML_minSubtotal = 1999;
+const xml_token_t XML_minSupportedVersion = 2000;
+const xml_token_t XML_minValue = 2001;
+const xml_token_t XML_minVer = 2002;
+const xml_token_t XML_minX = 2003;
+const xml_token_t XML_minY = 2004;
+const xml_token_t XML_minimized = 2005;
+const xml_token_t XML_minimumVersion = 2006;
+const xml_token_t XML_minorFont = 2007;
+const xml_token_t XML_minorGridlines = 2008;
+const xml_token_t XML_minorTickMark = 2009;
+const xml_token_t XML_minorTimeUnit = 2010;
+const xml_token_t XML_minorUnit = 2011;
+const xml_token_t XML_minus = 2012;
+const xml_token_t XML_minusx = 2013;
+const xml_token_t XML_minusy = 2014;
+const xml_token_t XML_minute = 2015;
+const xml_token_t XML_mirrorIndents = 2016;
+const xml_token_t XML_mirrorMargins = 2017;
+const xml_token_t XML_missingCaption = 2018;
+const xml_token_t XML_missingItemsLimit = 2019;
+const xml_token_t XML_miter = 2020;
+const xml_token_t XML_miterlimit = 2021;
+const xml_token_t XML_mod = 2022;
+const xml_token_t XML_modelId = 2023;
+const xml_token_t XML_modifyVerifier = 2024;
+const xml_token_t XML_month = 2025;
+const xml_token_t XML_monthLong = 2026;
+const xml_token_t XML_monthShort = 2027;
+const xml_token_t XML_moveFrom = 2028;
+const xml_token_t XML_moveFromRangeEnd = 2029;
+const xml_token_t XML_moveFromRangeStart = 2030;
+const xml_token_t XML_moveTo = 2031;
+const xml_token_t XML_moveToRangeEnd = 2032;
+const xml_token_t XML_moveToRangeStart = 2033;
+const xml_token_t XML_moveWith = 2034;
+const xml_token_t XML_movie = 2035;
+const xml_token_t XML_mp = 2036;
+const xml_token_t XML_mpFld = 2037;
+const xml_token_t XML_mpMap = 2038;
+const xml_token_t XML_mps = 2039;
+const xml_token_t XML_mr = 2040;
+const xml_token_t XML_mruColors = 2041;
+const xml_token_t XML_ms = 2042;
+const xml_token_t XML_multiLevelType = 2043;
+const xml_token_t XML_multiLine = 2044;
+const xml_token_t XML_multiLvlStrCache = 2045;
+const xml_token_t XML_multiLvlStrRef = 2046;
+const xml_token_t XML_multipleFieldFilters = 2047;
+const xml_token_t XML_multipleItemSelectionAllowed = 2048;
+const xml_token_t XML_mute = 2049;
+const xml_token_t XML_mwSmallCaps = 2050;
+const xml_token_t XML_n = 2051;
+const xml_token_t XML_name = 2052;
+const xml_token_t XML_nameLen = 2053;
+const xml_token_t XML_namespaceUri = 2054;
+const xml_token_t XML_namespaceuri = 2055;
+const xml_token_t XML_nary = 2056;
+const xml_token_t XML_naryLim = 2057;
+const xml_token_t XML_naryPr = 2058;
+const xml_token_t XML_nc = 2059;
+const xml_token_t XML_ndxf = 2060;
+const xml_token_t XML_neCell = 2061;
+const xml_token_t XML_new = 2062;
+const xml_token_t XML_newLength = 2063;
+const xml_token_t XML_newName = 2064;
+const xml_token_t XML_newsflash = 2065;
+const xml_token_t XML_next = 2066;
+const xml_token_t XML_nextAc = 2067;
+const xml_token_t XML_nextCondLst = 2068;
+const xml_token_t XML_nextId = 2069;
+const xml_token_t XML_nf = 2070;
+const xml_token_t XML_nlCheck = 2071;
+const xml_token_t XML_noAdjustHandles = 2072;
+const xml_token_t XML_noAutofit = 2073;
+const xml_token_t XML_noBorder = 2074;
+const xml_token_t XML_noBreak = 2075;
+const xml_token_t XML_noBreakHyphen = 2076;
+const xml_token_t XML_noChangeArrowheads = 2077;
+const xml_token_t XML_noChangeAspect = 2078;
+const xml_token_t XML_noChangeShapeType = 2079;
+const xml_token_t XML_noColumnBalance = 2080;
+const xml_token_t XML_noCrop = 2081;
+const xml_token_t XML_noDrilldown = 2082;
+const xml_token_t XML_noEditPoints = 2083;
+const xml_token_t XML_noEndCap = 2084;
+const xml_token_t XML_noEndnote = 2085;
+const xml_token_t XML_noExtraLineSpacing = 2086;
+const xml_token_t XML_noFill = 2087;
+const xml_token_t XML_noGrp = 2088;
+const xml_token_t XML_noLabel = 2089;
+const xml_token_t XML_noLeading = 2090;
+const xml_token_t XML_noLineBreaksAfter = 2091;
+const xml_token_t XML_noLineBreaksBefore = 2092;
+const xml_token_t XML_noMove = 2093;
+const xml_token_t XML_noMultiLvlLbl = 2094;
+const xml_token_t XML_noProof = 2095;
+const xml_token_t XML_noPunctuationKerning = 2096;
+const xml_token_t XML_noResize = 2097;
+const xml_token_t XML_noResizeAllowed = 2098;
+const xml_token_t XML_noRot = 2099;
+const xml_token_t XML_noSelect = 2100;
+const xml_token_t XML_noSpaceRaiseLower = 2101;
+const xml_token_t XML_noTabHangInd = 2102;
+const xml_token_t XML_noTextEdit = 2103;
+const xml_token_t XML_noUngrp = 2104;
+const xml_token_t XML_noWrap = 2105;
+const xml_token_t XML_nodePh = 2106;
+const xml_token_t XML_nodeType = 2107;
+const xml_token_t XML_nonAutoSortDefault = 2108;
+const xml_token_t XML_nor = 2109;
+const xml_token_t XML_norm = 2110;
+const xml_token_t XML_normAutofit = 2111;
+const xml_token_t XML_normalViewPr = 2112;
+const xml_token_t XML_normalizeH = 2113;
+const xml_token_t XML_notTrueType = 2114;
+const xml_token_t XML_notes = 2115;
+const xml_token_t XML_notesMaster = 2116;
+const xml_token_t XML_notesMasterId = 2117;
+const xml_token_t XML_notesMasterIdLst = 2118;
+const xml_token_t XML_notesStyle = 2119;
+const xml_token_t XML_notesSz = 2120;
+const xml_token_t XML_notesTextViewPr = 2121;
+const xml_token_t XML_notesViewPr = 2122;
+const xml_token_t XML_np = 2123;
+const xml_token_t XML_ns = 2124;
+const xml_token_t XML_nsid = 2125;
+const xml_token_t XML_null = 2126;
+const xml_token_t XML_num = 2127;
+const xml_token_t XML_numCache = 2128;
+const xml_token_t XML_numCol = 2129;
+const xml_token_t XML_numFmt = 2130;
+const xml_token_t XML_numFmtId = 2131;
+const xml_token_t XML_numFmts = 2132;
+const xml_token_t XML_numId = 2133;
+const xml_token_t XML_numIdMacAtCleanup = 2134;
+const xml_token_t XML_numLit = 2135;
+const xml_token_t XML_numPicBullet = 2136;
+const xml_token_t XML_numPicBulletId = 2137;
+const xml_token_t XML_numPr = 2138;
+const xml_token_t XML_numRef = 2139;
+const xml_token_t XML_numRestart = 2140;
+const xml_token_t XML_numSld = 2141;
+const xml_token_t XML_numStart = 2142;
+const xml_token_t XML_numStyleLink = 2143;
+const xml_token_t XML_numberStoredAsText = 2144;
+const xml_token_t XML_numbering = 2145;
+const xml_token_t XML_numberingChange = 2146;
+const xml_token_t XML_nvCxnSpPr = 2147;
+const xml_token_t XML_nvGraphicFramePr = 2148;
+const xml_token_t XML_nvGrpSpPr = 2149;
+const xml_token_t XML_nvPicPr = 2150;
+const xml_token_t XML_nvPr = 2151;
+const xml_token_t XML_nvSpPr = 2152;
+const xml_token_t XML_nwCell = 2153;
+const xml_token_t XML_o = 2154;
+const xml_token_t XML_oMath = 2155;
+const xml_token_t XML_oMathPara = 2156;
+const xml_token_t XML_oMathParaPr = 2157;
+const xml_token_t XML_objDist = 2158;
+const xml_token_t XML_object = 2159;
+const xml_token_t XML_objectDefaults = 2160;
+const xml_token_t XML_objects = 2161;
+const xml_token_t XML_oblob = 2162;
+const xml_token_t XML_obscured = 2163;
+const xml_token_t XML_oc = 2164;
+const xml_token_t XML_odcFile = 2165;
+const xml_token_t XML_oddFooter = 2166;
+const xml_token_t XML_oddHeader = 2167;
+const xml_token_t XML_odso = 2168;
+const xml_token_t XML_odxf = 2169;
+const xml_token_t XML_ofPieChart = 2170;
+const xml_token_t XML_ofPieType = 2171;
+const xml_token_t XML_off = 2172;
+const xml_token_t XML_offset = 2173;
+const xml_token_t XML_offset2 = 2174;
+const xml_token_t XML_offsetFrom = 2175;
+const xml_token_t XML_olapPr = 2176;
+const xml_token_t XML_old = 2177;
+const xml_token_t XML_oldComment = 2178;
+const xml_token_t XML_oldCustomMenu = 2179;
+const xml_token_t XML_oldDescription = 2180;
+const xml_token_t XML_oldFormula = 2181;
+const xml_token_t XML_oldFunction = 2182;
+const xml_token_t XML_oldFunctionGroupId = 2183;
+const xml_token_t XML_oldHelp = 2184;
+const xml_token_t XML_oldHidden = 2185;
+const xml_token_t XML_oldLength = 2186;
+const xml_token_t XML_oldName = 2187;
+const xml_token_t XML_oldPh = 2188;
+const xml_token_t XML_oldQuotePrefix = 2189;
+const xml_token_t XML_oldShortcutKey = 2190;
+const xml_token_t XML_oldStatusBar = 2191;
+const xml_token_t XML_ole = 2192;
+const xml_token_t XML_oleChartEl = 2193;
+const xml_token_t XML_oleItem = 2194;
+const xml_token_t XML_oleItems = 2195;
+const xml_token_t XML_oleLink = 2196;
+const xml_token_t XML_oleObj = 2197;
+const xml_token_t XML_oleObject = 2198;
+const xml_token_t XML_oleObjects = 2199;
+const xml_token_t XML_oleSize = 2200;
+const xml_token_t XML_oleUpdate = 2201;
+const xml_token_t XML_oleicon = 2202;
+const xml_token_t XML_oleid = 2203;
+const xml_token_t XML_on = 2204;
+const xml_token_t XML_oneCellAnchor = 2205;
+const xml_token_t XML_oneField = 2206;
+const xml_token_t XML_oned = 2207;
+const xml_token_t XML_onlySync = 2208;
+const xml_token_t XML_onlyUseConnectionFile = 2209;
+const xml_token_t XML_op = 2210;
+const xml_token_t XML_opEmu = 2211;
+const xml_token_t XML_opacity = 2212;
+const xml_token_t XML_opacity2 = 2213;
+const xml_token_t XML_operator = 2214;
+const xml_token_t XML_optimizeForBrowser = 2215;
+const xml_token_t XML_optimizeMemory = 2216;
+const xml_token_t XML_order = 2217;
+const xml_token_t XML_orgChart = 2218;
+const xml_token_t XML_organizeInFolders = 2219;
+const xml_token_t XML_orient = 2220;
+const xml_token_t XML_orientation = 2221;
+const xml_token_t XML_orientationangle = 2222;
+const xml_token_t XML_origin = 2223;
+const xml_token_t XML_original = 2224;
+const xml_token_t XML_ostorage = 2225;
+const xml_token_t XML_ostream = 2226;
+const xml_token_t XML_other = 2227;
+const xml_token_t XML_otherStyle = 2228;
+const xml_token_t XML_outerShdw = 2229;
+const xml_token_t XML_outline = 2230;
+const xml_token_t XML_outlineData = 2231;
+const xml_token_t XML_outlineLevel = 2232;
+const xml_token_t XML_outlineLevelCol = 2233;
+const xml_token_t XML_outlineLevelRow = 2234;
+const xml_token_t XML_outlineLvl = 2235;
+const xml_token_t XML_outlinePr = 2236;
+const xml_token_t XML_outlineSymbols = 2237;
+const xml_token_t XML_outlineViewPr = 2238;
+const xml_token_t XML_oval = 2239;
+const xml_token_t XML_overflowPunct = 2240;
+const xml_token_t XML_overlap = 2241;
+const xml_token_t XML_overlay = 2242;
+const xml_token_t XML_override = 2243;
+const xml_token_t XML_overrideClrMapping = 2244;
+const xml_token_t XML_p = 2245;
+const xml_token_t XML_pBdr = 2246;
+const xml_token_t XML_pLen = 2247;
+const xml_token_t XML_pPos = 2248;
+const xml_token_t XML_pPr = 2249;
+const xml_token_t XML_pPrChange = 2250;
+const xml_token_t XML_pPrDefault = 2251;
+const xml_token_t XML_pRg = 2252;
+const xml_token_t XML_pStyle = 2253;
+const xml_token_t XML_page = 2254;
+const xml_token_t XML_pageBreakBefore = 2255;
+const xml_token_t XML_pageField = 2256;
+const xml_token_t XML_pageFields = 2257;
+const xml_token_t XML_pageItem = 2258;
+const xml_token_t XML_pageMargins = 2259;
+const xml_token_t XML_pageOrder = 2260;
+const xml_token_t XML_pageOverThenDown = 2261;
+const xml_token_t XML_pageSetUpPr = 2262;
+const xml_token_t XML_pageSetup = 2263;
+const xml_token_t XML_pageStyle = 2264;
+const xml_token_t XML_pageWrap = 2265;
+const xml_token_t XML_pages = 2266;
+const xml_token_t XML_pane = 2267;
+const xml_token_t XML_panose = 2268;
+const xml_token_t XML_panose1 = 2269;
+const xml_token_t XML_paperSize = 2270;
+const xml_token_t XML_paperSrc = 2271;
+const xml_token_t XML_par = 2272;
+const xml_token_t XML_parTransId = 2273;
+const xml_token_t XML_param = 2274;
+const xml_token_t XML_parameter = 2275;
+const xml_token_t XML_parameterType = 2276;
+const xml_token_t XML_parameters = 2277;
+const xml_token_t XML_parent = 2278;
+const xml_token_t XML_parentSet = 2279;
+const xml_token_t XML_parsePre = 2280;
+const xml_token_t XML_password = 2281;
+const xml_token_t XML_pasteAll = 2282;
+const xml_token_t XML_pasteBorders = 2283;
+const xml_token_t XML_pasteColWidths = 2284;
+const xml_token_t XML_pasteComments = 2285;
+const xml_token_t XML_pasteDataValidation = 2286;
+const xml_token_t XML_pasteFormats = 2287;
+const xml_token_t XML_pasteFormulas = 2288;
+const xml_token_t XML_pasteNumberFormats = 2289;
+const xml_token_t XML_pasteValues = 2290;
+const xml_token_t XML_path = 2291;
+const xml_token_t XML_pathEditMode = 2292;
+const xml_token_t XML_pathLst = 2293;
+const xml_token_t XML_pattFill = 2294;
+const xml_token_t XML_patternFill = 2295;
+const xml_token_t XML_patternType = 2296;
+const xml_token_t XML_penClr = 2297;
+const xml_token_t XML_percent = 2298;
+const xml_token_t XML_period = 2299;
+const xml_token_t XML_permEnd = 2300;
+const xml_token_t XML_permStart = 2301;
+const xml_token_t XML_personal = 2302;
+const xml_token_t XML_personalCompose = 2303;
+const xml_token_t XML_personalReply = 2304;
+const xml_token_t XML_personalView = 2305;
+const xml_token_t XML_perspective = 2306;
+const xml_token_t XML_pgBorders = 2307;
+const xml_token_t XML_pgMar = 2308;
+const xml_token_t XML_pgNum = 2309;
+const xml_token_t XML_pgNumType = 2310;
+const xml_token_t XML_pgSz = 2311;
+const xml_token_t XML_ph = 2312;
+const xml_token_t XML_phant = 2313;
+const xml_token_t XML_phantPr = 2314;
+const xml_token_t XML_phldr = 2315;
+const xml_token_t XML_phldrT = 2316;
+const xml_token_t XML_phonetic = 2317;
+const xml_token_t XML_phoneticPr = 2318;
+const xml_token_t XML_photoAlbum = 2319;
+const xml_token_t XML_pic = 2320;
+const xml_token_t XML_picLocks = 2321;
+const xml_token_t XML_pict = 2322;
+const xml_token_t XML_picture = 2323;
+const xml_token_t XML_pictureFormat = 2324;
+const xml_token_t XML_pictureOptions = 2325;
+const xml_token_t XML_pictureStackUnit = 2326;
+const xml_token_t XML_pid = 2327;
+const xml_token_t XML_pie3DChart = 2328;
+const xml_token_t XML_pieChart = 2329;
+const xml_token_t XML_pitch = 2330;
+const xml_token_t XML_pitchFamily = 2331;
+const xml_token_t XML_pivot = 2332;
+const xml_token_t XML_pivotArea = 2333;
+const xml_token_t XML_pivotAreas = 2334;
+const xml_token_t XML_pivotButton = 2335;
+const xml_token_t XML_pivotCache = 2336;
+const xml_token_t XML_pivotCacheDefinition = 2337;
+const xml_token_t XML_pivotCacheRecords = 2338;
+const xml_token_t XML_pivotCaches = 2339;
+const xml_token_t XML_pivotField = 2340;
+const xml_token_t XML_pivotFields = 2341;
+const xml_token_t XML_pivotFmt = 2342;
+const xml_token_t XML_pivotFmts = 2343;
+const xml_token_t XML_pivotHierarchies = 2344;
+const xml_token_t XML_pivotHierarchy = 2345;
+const xml_token_t XML_pivotSelection = 2346;
+const xml_token_t XML_pivotSource = 2347;
+const xml_token_t XML_pivotTableDefinition = 2348;
+const xml_token_t XML_pivotTableStyle = 2349;
+const xml_token_t XML_pivotTableStyleInfo = 2350;
+const xml_token_t XML_pivotTables = 2351;
+const xml_token_t XML_pixelsPerInch = 2352;
+const xml_token_t XML_placeholder = 2353;
+const xml_token_t XML_plane = 2354;
+const xml_token_t XML_plcHide = 2355;
+const xml_token_t XML_plotArea = 2356;
+const xml_token_t XML_plotVisOnly = 2357;
+const xml_token_t XML_plus = 2358;
+const xml_token_t XML_points = 2359;
+const xml_token_t XML_polar = 2360;
+const xml_token_t XML_polyline = 2361;
+const xml_token_t XML_pos = 2362;
+const xml_token_t XML_posOffset = 2363;
+const xml_token_t XML_position = 2364;
+const xml_token_t XML_positionH = 2365;
+const xml_token_t XML_positionV = 2366;
+const xml_token_t XML_post = 2367;
+const xml_token_t XML_postSp = 2368;
+const xml_token_t XML_prLst = 2369;
+const xml_token_t XML_prSet = 2370;
+const xml_token_t XML_preSp = 2371;
+const xml_token_t XML_preferPic = 2372;
+const xml_token_t XML_preferRelativeResize = 2373;
+const xml_token_t XML_preferSingleView = 2374;
+const xml_token_t XML_preferrelative = 2375;
+const xml_token_t XML_prefixMappings = 2376;
+const xml_token_t XML_presAssocID = 2377;
+const xml_token_t XML_presId = 2378;
+const xml_token_t XML_presLayoutVars = 2379;
+const xml_token_t XML_presName = 2380;
+const xml_token_t XML_presOf = 2381;
+const xml_token_t XML_presStyleCnt = 2382;
+const xml_token_t XML_presStyleIdx = 2383;
+const xml_token_t XML_presStyleLbl = 2384;
+const xml_token_t XML_present = 2385;
+const xml_token_t XML_presentation = 2386;
+const xml_token_t XML_presentationPr = 2387;
+const xml_token_t XML_preserve = 2388;
+const xml_token_t XML_preserveFormatting = 2389;
+const xml_token_t XML_preserveHistory = 2390;
+const xml_token_t XML_preserveSortFilterLayout = 2391;
+const xml_token_t XML_presetClass = 2392;
+const xml_token_t XML_presetID = 2393;
+const xml_token_t XML_presetSubtype = 2394;
+const xml_token_t XML_prevAc = 2395;
+const xml_token_t XML_prevCondLst = 2396;
+const xml_token_t XML_previousCol = 2397;
+const xml_token_t XML_previousRow = 2398;
+const xml_token_t XML_pri = 2399;
+const xml_token_t XML_print = 2400;
+const xml_token_t XML_printArea = 2401;
+const xml_token_t XML_printBodyTextBeforeHeader = 2402;
+const xml_token_t XML_printColBlack = 2403;
+const xml_token_t XML_printDrill = 2404;
+const xml_token_t XML_printFormsData = 2405;
+const xml_token_t XML_printFractionalCharacterWidth = 2406;
+const xml_token_t XML_printOptions = 2407;
+const xml_token_t XML_printPostScriptOverText = 2408;
+const xml_token_t XML_printSettings = 2409;
+const xml_token_t XML_printTwoOnOne = 2410;
+const xml_token_t XML_printerSettings = 2411;
+const xml_token_t XML_priority = 2412;
+const xml_token_t XML_prnPr = 2413;
+const xml_token_t XML_prnWhat = 2414;
+const xml_token_t XML_productSubtotal = 2415;
+const xml_token_t XML_progId = 2416;
+const xml_token_t XML_progress = 2417;
+const xml_token_t XML_prompt = 2418;
+const xml_token_t XML_promptTitle = 2419;
+const xml_token_t XML_promptedSolutions = 2420;
+const xml_token_t XML_proofErr = 2421;
+const xml_token_t XML_proofState = 2422;
+const xml_token_t XML_property = 2423;
+const xml_token_t XML_propertyName = 2424;
+const xml_token_t XML_protected = 2425;
+const xml_token_t XML_protectedRange = 2426;
+const xml_token_t XML_protectedRanges = 2427;
+const xml_token_t XML_protection = 2428;
+const xml_token_t XML_provid = 2429;
+const xml_token_t XML_proxy = 2430;
+const xml_token_t XML_prst = 2431;
+const xml_token_t XML_prstClr = 2432;
+const xml_token_t XML_prstDash = 2433;
+const xml_token_t XML_prstGeom = 2434;
+const xml_token_t XML_prstMaterial = 2435;
+const xml_token_t XML_prstShdw = 2436;
+const xml_token_t XML_prstTxWarp = 2437;
+const xml_token_t XML_pt = 2438;
+const xml_token_t XML_ptCount = 2439;
+const xml_token_t XML_ptLst = 2440;
+const xml_token_t XML_ptType = 2441;
+const xml_token_t XML_ptab = 2442;
+const xml_token_t XML_ptsTypes = 2443;
+const xml_token_t XML_pubBrowser = 2444;
+const xml_token_t XML_publishItems = 2445;
+const xml_token_t XML_publishToServer = 2446;
+const xml_token_t XML_published = 2447;
+const xml_token_t XML_pull = 2448;
+const xml_token_t XML_push = 2449;
+const xml_token_t XML_qFormat = 2450;
+const xml_token_t XML_qs = 2451;
+const xml_token_t XML_qsCatId = 2452;
+const xml_token_t XML_qsTypeId = 2453;
+const xml_token_t XML_quadBezTo = 2454;
+const xml_token_t XML_qualifier = 2455;
+const xml_token_t XML_query = 2456;
+const xml_token_t XML_queryCache = 2457;
+const xml_token_t XML_queryFailed = 2458;
+const xml_token_t XML_queryTable = 2459;
+const xml_token_t XML_queryTableDeletedFields = 2460;
+const xml_token_t XML_queryTableField = 2461;
+const xml_token_t XML_queryTableFieldId = 2462;
+const xml_token_t XML_queryTableFields = 2463;
+const xml_token_t XML_queryTableRefresh = 2464;
+const xml_token_t XML_quickTimeFile = 2465;
+const xml_token_t XML_quotePrefix = 2466;
+const xml_token_t XML_r = 2467;
+const xml_token_t XML_r1 = 2468;
+const xml_token_t XML_r2 = 2469;
+const xml_token_t XML_r4 = 2470;
+const xml_token_t XML_r8 = 2471;
+const xml_token_t XML_rAng = 2472;
+const xml_token_t XML_rAngAx = 2473;
+const xml_token_t XML_rCtr = 2474;
+const xml_token_t XML_rFont = 2475;
+const xml_token_t XML_rFonts = 2476;
+const xml_token_t XML_rId = 2477;
+const xml_token_t XML_rIns = 2478;
+const xml_token_t XML_rMargin = 2479;
+const xml_token_t XML_rPh = 2480;
+const xml_token_t XML_rPr = 2481;
+const xml_token_t XML_rPrChange = 2482;
+const xml_token_t XML_rPrDefault = 2483;
+const xml_token_t XML_rSp = 2484;
+const xml_token_t XML_rSpRule = 2485;
+const xml_token_t XML_rStyle = 2486;
+const xml_token_t XML_ra = 2487;
+const xml_token_t XML_rad = 2488;
+const xml_token_t XML_radPr = 2489;
+const xml_token_t XML_radarChart = 2490;
+const xml_token_t XML_radarStyle = 2491;
+const xml_token_t XML_radiusrange = 2492;
+const xml_token_t XML_raf = 2493;
+const xml_token_t XML_random = 2494;
+const xml_token_t XML_randomBar = 2495;
+const xml_token_t XML_rangePr = 2496;
+const xml_token_t XML_rangeSet = 2497;
+const xml_token_t XML_rangeSets = 2498;
+const xml_token_t XML_rank = 2499;
+const xml_token_t XML_rankBy = 2500;
+const xml_token_t XML_rc = 2501;
+const xml_token_t XML_rcc = 2502;
+const xml_token_t XML_rcft = 2503;
+const xml_token_t XML_rcmt = 2504;
+const xml_token_t XML_rctx = 2505;
+const xml_token_t XML_rcv = 2506;
+const xml_token_t XML_rdn = 2507;
+const xml_token_t XML_readModeInkLockDown = 2508;
+const xml_token_t XML_readOnlyRecommended = 2509;
+const xml_token_t XML_readingOrder = 2510;
+const xml_token_t XML_recipientData = 2511;
+const xml_token_t XML_recipients = 2512;
+const xml_token_t XML_recolor = 2513;
+const xml_token_t XML_recolortarget = 2514;
+const xml_token_t XML_recommended = 2515;
+const xml_token_t XML_reconnectionMethod = 2516;
+const xml_token_t XML_recordCount = 2517;
+const xml_token_t XML_rect = 2518;
+const xml_token_t XML_red = 2519;
+const xml_token_t XML_redMod = 2520;
+const xml_token_t XML_redOff = 2521;
+const xml_token_t XML_ref = 2522;
+const xml_token_t XML_ref3D = 2523;
+const xml_token_t XML_refFor = 2524;
+const xml_token_t XML_refForName = 2525;
+const xml_token_t XML_refMode = 2526;
+const xml_token_t XML_refPtType = 2527;
+const xml_token_t XML_refType = 2528;
+const xml_token_t XML_reference = 2529;
+const xml_token_t XML_references = 2530;
+const xml_token_t XML_refersTo = 2531;
+const xml_token_t XML_reflection = 2532;
+const xml_token_t XML_refreshAllConnections = 2533;
+const xml_token_t XML_refreshError = 2534;
+const xml_token_t XML_refreshOnChange = 2535;
+const xml_token_t XML_refreshOnLoad = 2536;
+const xml_token_t XML_refreshedBy = 2537;
+const xml_token_t XML_refreshedDate = 2538;
+const xml_token_t XML_refreshedVersion = 2539;
+const xml_token_t XML_regroupid = 2540;
+const xml_token_t XML_regrouptable = 2541;
+const xml_token_t XML_regular = 2542;
+const xml_token_t XML_rel = 2543;
+const xml_token_t XML_relIds = 2544;
+const xml_token_t XML_relOff = 2545;
+const xml_token_t XML_relSizeAnchor = 2546;
+const xml_token_t XML_relation = 2547;
+const xml_token_t XML_relationtable = 2548;
+const xml_token_t XML_relative = 2549;
+const xml_token_t XML_relativeFrom = 2550;
+const xml_token_t XML_relativeHeight = 2551;
+const xml_token_t XML_relativeIndent = 2552;
+const xml_token_t XML_relativeTo = 2553;
+const xml_token_t XML_relid = 2554;
+const xml_token_t XML_relyOnVML = 2555;
+const xml_token_t XML_relyOnVml = 2556;
+const xml_token_t XML_removeDataOnSave = 2557;
+const xml_token_t XML_removeDateAndTime = 2558;
+const xml_token_t XML_removePersonalInfoOnSave = 2559;
+const xml_token_t XML_removePersonalInformation = 2560;
+const xml_token_t XML_render = 2561;
+const xml_token_t XML_repairLoad = 2562;
+const xml_token_t XML_repeatCount = 2563;
+const xml_token_t XML_repeatDur = 2564;
+const xml_token_t XML_resId = 2565;
+const xml_token_t XML_reservationPassword = 2566;
+const xml_token_t XML_resizeGraphics = 2567;
+const xml_token_t XML_resizeHandles = 2568;
+const xml_token_t XML_restart = 2569;
+const xml_token_t XML_restoredLeft = 2570;
+const xml_token_t XML_restoredTop = 2571;
+const xml_token_t XML_result = 2572;
+const xml_token_t XML_rev = 2573;
+const xml_token_t XML_reverse = 2574;
+const xml_token_t XML_reviewed = 2575;
+const xml_token_t XML_reviewedList = 2576;
+const xml_token_t XML_revisionId = 2577;
+const xml_token_t XML_revisionView = 2578;
+const xml_token_t XML_revisions = 2579;
+const xml_token_t XML_revisionsPassword = 2580;
+const xml_token_t XML_rfmt = 2581;
+const xml_token_t XML_rgb = 2582;
+const xml_token_t XML_rgbColor = 2583;
+const xml_token_t XML_rich = 2584;
+const xml_token_t XML_richText = 2585;
+const xml_token_t XML_rig = 2586;
+const xml_token_t XML_right = 2587;
+const xml_token_t XML_rightChars = 2588;
+const xml_token_t XML_rightFromText = 2589;
+const xml_token_t XML_rightToLeft = 2590;
+const xml_token_t XML_ris = 2591;
+const xml_token_t XML_rm = 2592;
+const xml_token_t XML_rot = 2593;
+const xml_token_t XML_rotWithShape = 2594;
+const xml_token_t XML_rotX = 2595;
+const xml_token_t XML_rotY = 2596;
+const xml_token_t XML_rotate = 2597;
+const xml_token_t XML_rotation = 2598;
+const xml_token_t XML_rotationangle = 2599;
+const xml_token_t XML_rotationcenter = 2600;
+const xml_token_t XML_round = 2601;
+const xml_token_t XML_roundedCorners = 2602;
+const xml_token_t XML_roundrect = 2603;
+const xml_token_t XML_row = 2604;
+const xml_token_t XML_rowBreaks = 2605;
+const xml_token_t XML_rowColShift = 2606;
+const xml_token_t XML_rowDrillCount = 2607;
+const xml_token_t XML_rowFields = 2608;
+const xml_token_t XML_rowGrandTotals = 2609;
+const xml_token_t XML_rowHeaderCaption = 2610;
+const xml_token_t XML_rowHierarchiesUsage = 2611;
+const xml_token_t XML_rowHierarchyUsage = 2612;
+const xml_token_t XML_rowItems = 2613;
+const xml_token_t XML_rowNumbers = 2614;
+const xml_token_t XML_rowOff = 2615;
+const xml_token_t XML_rowPageCount = 2616;
+const xml_token_t XML_rowSpan = 2617;
+const xml_token_t XML_rows = 2618;
+const xml_token_t XML_rqt = 2619;
+const xml_token_t XML_rrc = 2620;
+const xml_token_t XML_rsid = 2621;
+const xml_token_t XML_rsidDel = 2622;
+const xml_token_t XML_rsidP = 2623;
+const xml_token_t XML_rsidR = 2624;
+const xml_token_t XML_rsidRDefault = 2625;
+const xml_token_t XML_rsidRPr = 2626;
+const xml_token_t XML_rsidRoot = 2627;
+const xml_token_t XML_rsidSect = 2628;
+const xml_token_t XML_rsidTr = 2629;
+const xml_token_t XML_rsids = 2630;
+const xml_token_t XML_rsnm = 2631;
+const xml_token_t XML_rt = 2632;
+const xml_token_t XML_rtl = 2633;
+const xml_token_t XML_rtlCol = 2634;
+const xml_token_t XML_rtlGutter = 2635;
+const xml_token_t XML_rtn = 2636;
+const xml_token_t XML_ruby = 2637;
+const xml_token_t XML_rubyAlign = 2638;
+const xml_token_t XML_rubyBase = 2639;
+const xml_token_t XML_rubyPr = 2640;
+const xml_token_t XML_rule = 2641;
+const xml_token_t XML_ruleLst = 2642;
+const xml_token_t XML_rules = 2643;
+const xml_token_t XML_rupBuild = 2644;
+const xml_token_t XML_s = 2645;
+const xml_token_t XML_sId = 2646;
+const xml_token_t XML_sPre = 2647;
+const xml_token_t XML_sPrePr = 2648;
+const xml_token_t XML_sSub = 2649;
+const xml_token_t XML_sSubPr = 2650;
+const xml_token_t XML_sSubSup = 2651;
+const xml_token_t XML_sSubSupPr = 2652;
+const xml_token_t XML_sSup = 2653;
+const xml_token_t XML_sSupPr = 2654;
+const xml_token_t XML_salt = 2655;
+const xml_token_t XML_saltData = 2656;
+const xml_token_t XML_sampData = 2657;
+const xml_token_t XML_sat = 2658;
+const xml_token_t XML_satMod = 2659;
+const xml_token_t XML_satOff = 2660;
+const xml_token_t XML_saveData = 2661;
+const xml_token_t XML_saveExternalLinkValues = 2662;
+const xml_token_t XML_saveFormsData = 2663;
+const xml_token_t XML_saveInvalidXml = 2664;
+const xml_token_t XML_savePassword = 2665;
+const xml_token_t XML_savePreviewPicture = 2666;
+const xml_token_t XML_saveSmartTagsAsXml = 2667;
+const xml_token_t XML_saveSubsetFonts = 2668;
+const xml_token_t XML_saveThroughXslt = 2669;
+const xml_token_t XML_saveXmlDataOnly = 2670;
+const xml_token_t XML_sb = 2671;
+const xml_token_t XML_scale = 2672;
+const xml_token_t XML_scaleToFitPaper = 2673;
+const xml_token_t XML_scaleWithDoc = 2674;
+const xml_token_t XML_scaled = 2675;
+const xml_token_t XML_scaling = 2676;
+const xml_token_t XML_scatterChart = 2677;
+const xml_token_t XML_scatterStyle = 2678;
+const xml_token_t XML_scenario = 2679;
+const xml_token_t XML_scenarios = 2680;
+const xml_token_t XML_scene3d = 2681;
+const xml_token_t XML_schema = 2682;
+const xml_token_t XML_schemaLibrary = 2683;
+const xml_token_t XML_schemaLocation = 2684;
+const xml_token_t XML_schemaRef = 2685;
+const xml_token_t XML_schemaRefs = 2686;
+const xml_token_t XML_scheme = 2687;
+const xml_token_t XML_schemeClr = 2688;
+const xml_token_t XML_scope = 2689;
+const xml_token_t XML_scr = 2690;
+const xml_token_t XML_scrgbClr = 2691;
+const xml_token_t XML_script = 2692;
+const xml_token_t XML_scrollbar = 2693;
+const xml_token_t XML_sd = 2694;
+const xml_token_t XML_sdt = 2695;
+const xml_token_t XML_sdtContent = 2696;
+const xml_token_t XML_sdtEndPr = 2697;
+const xml_token_t XML_sdtPr = 2698;
+const xml_token_t XML_seCell = 2699;
+const xml_token_t XML_second = 2700;
+const xml_token_t XML_secondPiePt = 2701;
+const xml_token_t XML_secondPieSize = 2702;
+const xml_token_t XML_sectPr = 2703;
+const xml_token_t XML_sectPrChange = 2704;
+const xml_token_t XML_securityDescriptor = 2705;
+const xml_token_t XML_selectFldWithFirstOrLastChar = 2706;
+const xml_token_t XML_selectLockedCells = 2707;
+const xml_token_t XML_selectUnlockedCells = 2708;
+const xml_token_t XML_selected = 2709;
+const xml_token_t XML_selection = 2710;
+const xml_token_t XML_semiHidden = 2711;
+const xml_token_t XML_semicolon = 2712;
+const xml_token_t XML_sendLocale = 2713;
+const xml_token_t XML_sep = 2714;
+const xml_token_t XML_sepChr = 2715;
+const xml_token_t XML_separator = 2716;
+const xml_token_t XML_seq = 2717;
+const xml_token_t XML_ser = 2718;
+const xml_token_t XML_serAx = 2719;
+const xml_token_t XML_serLines = 2720;
+const xml_token_t XML_series = 2721;
+const xml_token_t XML_seriesIdx = 2722;
+const xml_token_t XML_serverCommand = 2723;
+const xml_token_t XML_serverField = 2724;
+const xml_token_t XML_serverFill = 2725;
+const xml_token_t XML_serverFont = 2726;
+const xml_token_t XML_serverFontColor = 2727;
+const xml_token_t XML_serverFormat = 2728;
+const xml_token_t XML_serverFormats = 2729;
+const xml_token_t XML_serverNumberFormat = 2730;
+const xml_token_t XML_serverSldId = 2731;
+const xml_token_t XML_serverSldModifiedTime = 2732;
+const xml_token_t XML_serverZoom = 2733;
+const xml_token_t XML_set = 2734;
+const xml_token_t XML_setDefinition = 2735;
+const xml_token_t XML_sets = 2736;
+const xml_token_t XML_settings = 2737;
+const xml_token_t XML_shade = 2738;
+const xml_token_t XML_shadeToTitle = 2739;
+const xml_token_t XML_shadow = 2740;
+const xml_token_t XML_shadowcolor = 2741;
+const xml_token_t XML_shadowok = 2742;
+const xml_token_t XML_shape = 2743;
+const xml_token_t XML_shapeDefaults = 2744;
+const xml_token_t XML_shapeId = 2745;
+const xml_token_t XML_shapeLayoutLikeWW8 = 2746;
+const xml_token_t XML_shapedefaults = 2747;
+const xml_token_t XML_shapeid = 2748;
+const xml_token_t XML_shapelayout = 2749;
+const xml_token_t XML_shapetype = 2750;
+const xml_token_t XML_shared = 2751;
+const xml_token_t XML_sharedItems = 2752;
+const xml_token_t XML_shd = 2753;
+const xml_token_t XML_sheet = 2754;
+const xml_token_t XML_sheetCalcPr = 2755;
+const xml_token_t XML_sheetData = 2756;
+const xml_token_t XML_sheetDataSet = 2757;
+const xml_token_t XML_sheetFormatPr = 2758;
+const xml_token_t XML_sheetId = 2759;
+const xml_token_t XML_sheetIdMap = 2760;
+const xml_token_t XML_sheetName = 2761;
+const xml_token_t XML_sheetNames = 2762;
+const xml_token_t XML_sheetPosition = 2763;
+const xml_token_t XML_sheetPr = 2764;
+const xml_token_t XML_sheetProtection = 2765;
+const xml_token_t XML_sheetView = 2766;
+const xml_token_t XML_sheetViews = 2767;
+const xml_token_t XML_sheets = 2768;
+const xml_token_t XML_shininess = 2769;
+const xml_token_t XML_shortcutKey = 2770;
+const xml_token_t XML_show = 2771;
+const xml_token_t XML_showAll = 2772;
+const xml_token_t XML_showAnimation = 2773;
+const xml_token_t XML_showAsCaption = 2774;
+const xml_token_t XML_showAsIcon = 2775;
+const xml_token_t XML_showAutoFilter = 2776;
+const xml_token_t XML_showBorderUnselectedTables = 2777;
+const xml_token_t XML_showBreaksInFrames = 2778;
+const xml_token_t XML_showBubbleSize = 2779;
+const xml_token_t XML_showButton = 2780;
+const xml_token_t XML_showCalcMbrs = 2781;
+const xml_token_t XML_showCaptions = 2782;
+const xml_token_t XML_showCatName = 2783;
+const xml_token_t XML_showCell = 2784;
+const xml_token_t XML_showColHeaders = 2785;
+const xml_token_t XML_showColStripes = 2786;
+const xml_token_t XML_showColumnStripes = 2787;
+const xml_token_t XML_showComments = 2788;
+const xml_token_t XML_showDLblsOverMax = 2789;
+const xml_token_t XML_showDataAs = 2790;
+const xml_token_t XML_showDataDropDown = 2791;
+const xml_token_t XML_showDataTips = 2792;
+const xml_token_t XML_showDrill = 2793;
+const xml_token_t XML_showDropDown = 2794;
+const xml_token_t XML_showDropDowns = 2795;
+const xml_token_t XML_showDropZones = 2796;
+const xml_token_t XML_showEmptyCol = 2797;
+const xml_token_t XML_showEmptyRow = 2798;
+const xml_token_t XML_showEnvelope = 2799;
+const xml_token_t XML_showError = 2800;
+const xml_token_t XML_showErrorMessage = 2801;
+const xml_token_t XML_showFirstColumn = 2802;
+const xml_token_t XML_showFormatting = 2803;
+const xml_token_t XML_showFormulaBar = 2804;
+const xml_token_t XML_showFormulas = 2805;
+const xml_token_t XML_showGridLines = 2806;
+const xml_token_t XML_showGuides = 2807;
+const xml_token_t XML_showHeader = 2808;
+const xml_token_t XML_showHeaders = 2809;
+const xml_token_t XML_showHorizontalScroll = 2810;
+const xml_token_t XML_showHorzBorder = 2811;
+const xml_token_t XML_showInFieldList = 2812;
+const xml_token_t XML_showInkAnnotation = 2813;
+const xml_token_t XML_showInputMessage = 2814;
+const xml_token_t XML_showItems = 2815;
+const xml_token_t XML_showKeys = 2816;
+const xml_token_t XML_showLastColumn = 2817;
+const xml_token_t XML_showLeaderLines = 2818;
+const xml_token_t XML_showLegendKey = 2819;
+const xml_token_t XML_showMasterPhAnim = 2820;
+const xml_token_t XML_showMasterSp = 2821;
+const xml_token_t XML_showMemberPropertyTips = 2822;
+const xml_token_t XML_showMissing = 2823;
+const xml_token_t XML_showMultipleLabel = 2824;
+const xml_token_t XML_showNarration = 2825;
+const xml_token_t XML_showNegBubbles = 2826;
+const xml_token_t XML_showObjects = 2827;
+const xml_token_t XML_showOutline = 2828;
+const xml_token_t XML_showOutlineIcons = 2829;
+const xml_token_t XML_showOutlineSymbols = 2830;
+const xml_token_t XML_showPageBreaks = 2831;
+const xml_token_t XML_showPercent = 2832;
+const xml_token_t XML_showPivotChartFilter = 2833;
+const xml_token_t XML_showPr = 2834;
+const xml_token_t XML_showPropAsCaption = 2835;
+const xml_token_t XML_showPropCell = 2836;
+const xml_token_t XML_showPropTip = 2837;
+const xml_token_t XML_showRowCol = 2838;
+const xml_token_t XML_showRowColHeaders = 2839;
+const xml_token_t XML_showRowHeaders = 2840;
+const xml_token_t XML_showRowStripes = 2841;
+const xml_token_t XML_showRuler = 2842;
+const xml_token_t XML_showScrollbar = 2843;
+const xml_token_t XML_showSerName = 2844;
+const xml_token_t XML_showSheetTabs = 2845;
+const xml_token_t XML_showSpeakerNotes = 2846;
+const xml_token_t XML_showSpecialPlsOnTitleSld = 2847;
+const xml_token_t XML_showStatusbar = 2848;
+const xml_token_t XML_showTip = 2849;
+const xml_token_t XML_showVal = 2850;
+const xml_token_t XML_showValue = 2851;
+const xml_token_t XML_showVertBorder = 2852;
+const xml_token_t XML_showVerticalScroll = 2853;
+const xml_token_t XML_showWhenStopped = 2854;
+const xml_token_t XML_showWhiteSpace = 2855;
+const xml_token_t XML_showXMLTags = 2856;
+const xml_token_t XML_showZeros = 2857;
+const xml_token_t XML_showingPlcHdr = 2858;
+const xml_token_t XML_showsigndate = 2859;
+const xml_token_t XML_shp = 2860;
+const xml_token_t XML_shrinkToFit = 2861;
+const xml_token_t XML_si = 2862;
+const xml_token_t XML_sibTransId = 2863;
+const xml_token_t XML_side = 2864;
+const xml_token_t XML_sideWall = 2865;
+const xml_token_t XML_sig = 2866;
+const xml_token_t XML_signatureline = 2867;
+const xml_token_t XML_signinginstructions = 2868;
+const xml_token_t XML_signinginstructionsset = 2869;
+const xml_token_t XML_sigprovurl = 2870;
+const xml_token_t XML_simplePos = 2871;
+const xml_token_t XML_singleSignOnId = 2872;
+const xml_token_t XML_singleXmlCell = 2873;
+const xml_token_t XML_singleXmlCells = 2874;
+const xml_token_t XML_singleclick = 2875;
+const xml_token_t XML_size = 2876;
+const xml_token_t XML_sizeAuto = 2877;
+const xml_token_t XML_sizeRepresents = 2878;
+const xml_token_t XML_skew = 2879;
+const xml_token_t XML_skewamt = 2880;
+const xml_token_t XML_skewangle = 2881;
+const xml_token_t XML_sld = 2882;
+const xml_token_t XML_sldAll = 2883;
+const xml_token_t XML_sldId = 2884;
+const xml_token_t XML_sldIdLst = 2885;
+const xml_token_t XML_sldLayout = 2886;
+const xml_token_t XML_sldLayoutId = 2887;
+const xml_token_t XML_sldLayoutIdLst = 2888;
+const xml_token_t XML_sldLst = 2889;
+const xml_token_t XML_sldMaster = 2890;
+const xml_token_t XML_sldMasterId = 2891;
+const xml_token_t XML_sldMasterIdLst = 2892;
+const xml_token_t XML_sldNum = 2893;
+const xml_token_t XML_sldRg = 2894;
+const xml_token_t XML_sldSyncPr = 2895;
+const xml_token_t XML_sldSz = 2896;
+const xml_token_t XML_sldTgt = 2897;
+const xml_token_t XML_slideViewPr = 2898;
+const xml_token_t XML_smallCaps = 2899;
+const xml_token_t XML_smallFrac = 2900;
+const xml_token_t XML_smartTag = 2901;
+const xml_token_t XML_smartTagPr = 2902;
+const xml_token_t XML_smartTagType = 2903;
+const xml_token_t XML_smartTagTypes = 2904;
+const xml_token_t XML_smartTags = 2905;
+const xml_token_t XML_smooth = 2906;
+const xml_token_t XML_smtClean = 2907;
+const xml_token_t XML_smtId = 2908;
+const xml_token_t XML_snapToGrid = 2909;
+const xml_token_t XML_snapToObjects = 2910;
+const xml_token_t XML_snapVertSplitter = 2911;
+const xml_token_t XML_snd = 2912;
+const xml_token_t XML_sndAc = 2913;
+const xml_token_t XML_sndTgt = 2914;
+const xml_token_t XML_softEdge = 2915;
+const xml_token_t XML_softHyphen = 2916;
+const xml_token_t XML_solidFill = 2917;
+const xml_token_t XML_solutionID = 2918;
+const xml_token_t XML_solveOrder = 2919;
+const xml_token_t XML_sort = 2920;
+const xml_token_t XML_sortBy = 2921;
+const xml_token_t XML_sortByTuple = 2922;
+const xml_token_t XML_sortCondition = 2923;
+const xml_token_t XML_sortMethod = 2924;
+const xml_token_t XML_sortState = 2925;
+const xml_token_t XML_sortType = 2926;
+const xml_token_t XML_sorterViewPr = 2927;
+const xml_token_t XML_source = 2928;
+const xml_token_t XML_sourceData = 2929;
+const xml_token_t XML_sourceFile = 2930;
+const xml_token_t XML_sourceFileName = 2931;
+const xml_token_t XML_sourceLinked = 2932;
+const xml_token_t XML_sourceObject = 2933;
+const xml_token_t XML_sourceRef = 2934;
+const xml_token_t XML_sourceSheetId = 2935;
+const xml_token_t XML_sourceType = 2936;
+const xml_token_t XML_sp = 2937;
+const xml_token_t XML_sp3d = 2938;
+const xml_token_t XML_spAutoFit = 2939;
+const xml_token_t XML_spDef = 2940;
+const xml_token_t XML_spLocks = 2941;
+const xml_token_t XML_spPr = 2942;
+const xml_token_t XML_spTgt = 2943;
+const xml_token_t XML_spTree = 2944;
+const xml_token_t XML_space = 2945;
+const xml_token_t XML_spaceForUL = 2946;
+const xml_token_t XML_spacing = 2947;
+const xml_token_t XML_spacingInWholePoints = 2948;
+const xml_token_t XML_spans = 2949;
+const xml_token_t XML_spc = 2950;
+const xml_token_t XML_spcAft = 2951;
+const xml_token_t XML_spcBef = 2952;
+const xml_token_t XML_spcCol = 2953;
+const xml_token_t XML_spcFirstLastPara = 2954;
+const xml_token_t XML_spcPct = 2955;
+const xml_token_t XML_spcPts = 2956;
+const xml_token_t XML_spd = 2957;
+const xml_token_t XML_specVanish = 2958;
+const xml_token_t XML_specularity = 2959;
+const xml_token_t XML_spelling = 2960;
+const xml_token_t XML_spid = 2961;
+const xml_token_t XML_spidmax = 2962;
+const xml_token_t XML_spinCount = 2963;
+const xml_token_t XML_split = 2964;
+const xml_token_t XML_splitAll = 2965;
+const xml_token_t XML_splitFirst = 2966;
+const xml_token_t XML_splitPgBreakAndParaMark = 2967;
+const xml_token_t XML_splitPos = 2968;
+const xml_token_t XML_splitType = 2969;
+const xml_token_t XML_spokes = 2970;
+const xml_token_t XML_spt = 2971;
+const xml_token_t XML_sqlType = 2972;
+const xml_token_t XML_sqref = 2973;
+const xml_token_t XML_src = 2974;
+const xml_token_t XML_srcId = 2975;
+const xml_token_t XML_srcOrd = 2976;
+const xml_token_t XML_srcRect = 2977;
+const xml_token_t XML_srgbClr = 2978;
+const xml_token_t XML_sst = 2979;
+const xml_token_t XML_st = 2980;
+const xml_token_t XML_stA = 2981;
+const xml_token_t XML_stAng = 2982;
+const xml_token_t XML_stCondLst = 2983;
+const xml_token_t XML_stCxn = 2984;
+const xml_token_t XML_stPos = 2985;
+const xml_token_t XML_stSnd = 2986;
+const xml_token_t XML_start = 2987;
+const xml_token_t XML_startAngle = 2988;
+const xml_token_t XML_startAt = 2989;
+const xml_token_t XML_startDate = 2990;
+const xml_token_t XML_startNum = 2991;
+const xml_token_t XML_startOverride = 2992;
+const xml_token_t XML_startarrow = 2993;
+const xml_token_t XML_startarrowlength = 2994;
+const xml_token_t XML_startarrowwidth = 2995;
+const xml_token_t XML_state = 2996;
+const xml_token_t XML_status = 2997;
+const xml_token_t XML_statusBar = 2998;
+const xml_token_t XML_statusText = 2999;
+const xml_token_t XML_stdDev = 3000;
+const xml_token_t XML_stdDevPSubtotal = 3001;
+const xml_token_t XML_stdDevSubtotal = 3002;
+const xml_token_t XML_step = 3003;
+const xml_token_t XML_stockChart = 3004;
+const xml_token_t XML_stop = 3005;
+const xml_token_t XML_stopIfTrue = 3006;
+const xml_token_t XML_storage = 3007;
+const xml_token_t XML_storeItemID = 3008;
+const xml_token_t XML_storeMappedDataAs = 3009;
+const xml_token_t XML_stp = 3010;
+const xml_token_t XML_strCache = 3011;
+const xml_token_t XML_strLit = 3012;
+const xml_token_t XML_strRef = 3013;
+const xml_token_t XML_strVal = 3014;
+const xml_token_t XML_stream = 3015;
+const xml_token_t XML_stretch = 3016;
+const xml_token_t XML_strictFirstAndLastChars = 3017;
+const xml_token_t XML_strike = 3018;
+const xml_token_t XML_strikeBLTR = 3019;
+const xml_token_t XML_strikeH = 3020;
+const xml_token_t XML_strikeTLBR = 3021;
+const xml_token_t XML_strikeV = 3022;
+const xml_token_t XML_string = 3023;
+const xml_token_t XML_stringValue1 = 3024;
+const xml_token_t XML_stringValue2 = 3025;
+const xml_token_t XML_strips = 3026;
+const xml_token_t XML_stroke = 3027;
+const xml_token_t XML_strokecolor = 3028;
+const xml_token_t XML_stroked = 3029;
+const xml_token_t XML_strokeok = 3030;
+const xml_token_t XML_strokeweight = 3031;
+const xml_token_t XML_sty = 3032;
+const xml_token_t XML_style = 3033;
+const xml_token_t XML_styleData = 3034;
+const xml_token_t XML_styleDef = 3035;
+const xml_token_t XML_styleDefHdr = 3036;
+const xml_token_t XML_styleDefHdrLst = 3037;
+const xml_token_t XML_styleId = 3038;
+const xml_token_t XML_styleLbl = 3039;
+const xml_token_t XML_styleLink = 3040;
+const xml_token_t XML_styleLockQFSet = 3041;
+const xml_token_t XML_styleLockTheme = 3042;
+const xml_token_t XML_styleName = 3043;
+const xml_token_t XML_stylePaneFormatFilter = 3044;
+const xml_token_t XML_stylePaneSortMethod = 3045;
+const xml_token_t XML_styleSheet = 3046;
+const xml_token_t XML_styles = 3047;
+const xml_token_t XML_sub = 3048;
+const xml_token_t XML_subDoc = 3049;
+const xml_token_t XML_subFontBySize = 3050;
+const xml_token_t XML_subHide = 3051;
+const xml_token_t XML_subSp = 3052;
+const xml_token_t XML_subTnLst = 3053;
+const xml_token_t XML_subsetted = 3054;
+const xml_token_t XML_subtotal = 3055;
+const xml_token_t XML_subtotalCaption = 3056;
+const xml_token_t XML_subtotalHiddenItems = 3057;
+const xml_token_t XML_subtotalTop = 3058;
+const xml_token_t XML_suff = 3059;
+const xml_token_t XML_suggestedsigner = 3060;
+const xml_token_t XML_suggestedsigner2 = 3061;
+const xml_token_t XML_suggestedsigneremail = 3062;
+const xml_token_t XML_sumSubtotal = 3063;
+const xml_token_t XML_summaryBelow = 3064;
+const xml_token_t XML_summaryLength = 3065;
+const xml_token_t XML_summaryRight = 3066;
+const xml_token_t XML_sup = 3067;
+const xml_token_t XML_supHide = 3068;
+const xml_token_t XML_supportAdvancedDrill = 3069;
+const xml_token_t XML_supportSubquery = 3070;
+const xml_token_t XML_suppressAutoHyphens = 3071;
+const xml_token_t XML_suppressBottomSpacing = 3072;
+const xml_token_t XML_suppressLineNumbers = 3073;
+const xml_token_t XML_suppressOverlap = 3074;
+const xml_token_t XML_suppressSpBfAfterPgBrk = 3075;
+const xml_token_t XML_suppressSpacingAtTopOfPage = 3076;
+const xml_token_t XML_suppressTopSpacing = 3077;
+const xml_token_t XML_suppressTopSpacingWP = 3078;
+const xml_token_t XML_surface3DChart = 3079;
+const xml_token_t XML_surfaceChart = 3080;
+const xml_token_t XML_swAng = 3081;
+const xml_token_t XML_swCell = 3082;
+const xml_token_t XML_swapBordersFacingPages = 3083;
+const xml_token_t XML_switch = 3084;
+const xml_token_t XML_sx = 3085;
+const xml_token_t XML_sy = 3086;
+const xml_token_t XML_sym = 3087;
+const xml_token_t XML_symbol = 3088;
+const xml_token_t XML_syncBehavior = 3089;
+const xml_token_t XML_syncHorizontal = 3090;
+const xml_token_t XML_syncRef = 3091;
+const xml_token_t XML_syncVertical = 3092;
+const xml_token_t XML_sysClr = 3093;
+const xml_token_t XML_sz = 3094;
+const xml_token_t XML_szCs = 3095;
+const xml_token_t XML_t = 3096;
+const xml_token_t XML_t1 = 3097;
+const xml_token_t XML_t2 = 3098;
+const xml_token_t XML_tIns = 3099;
+const xml_token_t XML_tab = 3100;
+const xml_token_t XML_tabColor = 3101;
+const xml_token_t XML_tabLst = 3102;
+const xml_token_t XML_tabRatio = 3103;
+const xml_token_t XML_tabSelected = 3104;
+const xml_token_t XML_table = 3105;
+const xml_token_t XML_tableBorderDxfId = 3106;
+const xml_token_t XML_tableColumn = 3107;
+const xml_token_t XML_tableColumnId = 3108;
+const xml_token_t XML_tableColumns = 3109;
+const xml_token_t XML_tablePart = 3110;
+const xml_token_t XML_tableParts = 3111;
+const xml_token_t XML_tableStyle = 3112;
+const xml_token_t XML_tableStyleElement = 3113;
+const xml_token_t XML_tableStyleId = 3114;
+const xml_token_t XML_tableStyleInfo = 3115;
+const xml_token_t XML_tableStyles = 3116;
+const xml_token_t XML_tableType = 3117;
+const xml_token_t XML_tablelimits = 3118;
+const xml_token_t XML_tableproperties = 3119;
+const xml_token_t XML_tables = 3120;
+const xml_token_t XML_tabs = 3121;
+const xml_token_t XML_tag = 3122;
+const xml_token_t XML_tagLst = 3123;
+const xml_token_t XML_tags = 3124;
+const xml_token_t XML_tailEnd = 3125;
+const xml_token_t XML_target = 3126;
+const xml_token_t XML_targetScreenSize = 3127;
+const xml_token_t XML_targetScreenSz = 3128;
+const xml_token_t XML_targetscreensize = 3129;
+const xml_token_t XML_tav = 3130;
+const xml_token_t XML_tavLst = 3131;
+const xml_token_t XML_tbl = 3132;
+const xml_token_t XML_tblBg = 3133;
+const xml_token_t XML_tblBorders = 3134;
+const xml_token_t XML_tblCellMar = 3135;
+const xml_token_t XML_tblCellSpacing = 3136;
+const xml_token_t XML_tblGrid = 3137;
+const xml_token_t XML_tblGridChange = 3138;
+const xml_token_t XML_tblHeader = 3139;
+const xml_token_t XML_tblInd = 3140;
+const xml_token_t XML_tblLayout = 3141;
+const xml_token_t XML_tblLook = 3142;
+const xml_token_t XML_tblOverlap = 3143;
+const xml_token_t XML_tblPr = 3144;
+const xml_token_t XML_tblPrChange = 3145;
+const xml_token_t XML_tblPrEx = 3146;
+const xml_token_t XML_tblPrExChange = 3147;
+const xml_token_t XML_tblStyle = 3148;
+const xml_token_t XML_tblStyleColBandSize = 3149;
+const xml_token_t XML_tblStyleLst = 3150;
+const xml_token_t XML_tblStylePr = 3151;
+const xml_token_t XML_tblStyleRowBandSize = 3152;
+const xml_token_t XML_tblW = 3153;
+const xml_token_t XML_tblpPr = 3154;
+const xml_token_t XML_tblpX = 3155;
+const xml_token_t XML_tblpXSpec = 3156;
+const xml_token_t XML_tblpY = 3157;
+const xml_token_t XML_tblpYSpec = 3158;
+const xml_token_t XML_tc = 3159;
+const xml_token_t XML_tcBdr = 3160;
+const xml_token_t XML_tcBorders = 3161;
+const xml_token_t XML_tcFitText = 3162;
+const xml_token_t XML_tcMar = 3163;
+const xml_token_t XML_tcPr = 3164;
+const xml_token_t XML_tcPrChange = 3165;
+const xml_token_t XML_tcStyle = 3166;
+const xml_token_t XML_tcTxStyle = 3167;
+const xml_token_t XML_tcW = 3168;
+const xml_token_t XML_temporary = 3169;
+const xml_token_t XML_tentative = 3170;
+const xml_token_t XML_text = 3171;
+const xml_token_t XML_textAlignment = 3172;
+const xml_token_t XML_textDates = 3173;
+const xml_token_t XML_textDirection = 3174;
+const xml_token_t XML_textField = 3175;
+const xml_token_t XML_textFields = 3176;
+const xml_token_t XML_textInput = 3177;
+const xml_token_t XML_textPr = 3178;
+const xml_token_t XML_textRotation = 3179;
+const xml_token_t XML_textborder = 3180;
+const xml_token_t XML_textbox = 3181;
+const xml_token_t XML_textboxTightWrap = 3182;
+const xml_token_t XML_textboxrect = 3183;
+const xml_token_t XML_textdata = 3184;
+const xml_token_t XML_textlink = 3185;
+const xml_token_t XML_textpath = 3186;
+const xml_token_t XML_textpathok = 3187;
+const xml_token_t XML_tgtEl = 3188;
+const xml_token_t XML_tgtFrame = 3189;
+const xml_token_t XML_theme = 3190;
+const xml_token_t XML_themeColor = 3191;
+const xml_token_t XML_themeElements = 3192;
+const xml_token_t XML_themeFill = 3193;
+const xml_token_t XML_themeFillShade = 3194;
+const xml_token_t XML_themeFillTint = 3195;
+const xml_token_t XML_themeFontLang = 3196;
+const xml_token_t XML_themeManager = 3197;
+const xml_token_t XML_themeOverride = 3198;
+const xml_token_t XML_themeShade = 3199;
+const xml_token_t XML_themeTint = 3200;
+const xml_token_t XML_thickBot = 3201;
+const xml_token_t XML_thickBottom = 3202;
+const xml_token_t XML_thickTop = 3203;
+const xml_token_t XML_thicket = 3204;
+const xml_token_t XML_thickness = 3205;
+const xml_token_t XML_thousands = 3206;
+const xml_token_t XML_thresh = 3207;
+const xml_token_t XML_thruBlk = 3208;
+const xml_token_t XML_tickLblPos = 3209;
+const xml_token_t XML_tickLblSkip = 3210;
+const xml_token_t XML_tickMarkSkip = 3211;
+const xml_token_t XML_tile = 3212;
+const xml_token_t XML_tileRect = 3213;
+const xml_token_t XML_time = 3214;
+const xml_token_t XML_timePeriod = 3215;
+const xml_token_t XML_timing = 3216;
+const xml_token_t XML_tint = 3217;
+const xml_token_t XML_title = 3218;
+const xml_token_t XML_titlePg = 3219;
+const xml_token_t XML_titleStyle = 3220;
+const xml_token_t XML_tl2br = 3221;
+const xml_token_t XML_tm = 3222;
+const xml_token_t XML_tmAbs = 3223;
+const xml_token_t XML_tmFilter = 3224;
+const xml_token_t XML_tmPct = 3225;
+const xml_token_t XML_tmpl = 3226;
+const xml_token_t XML_tmplLst = 3227;
+const xml_token_t XML_tn = 3228;
+const xml_token_t XML_tnLst = 3229;
+const xml_token_t XML_to = 3230;
+const xml_token_t XML_tooltip = 3231;
+const xml_token_t XML_top = 3232;
+const xml_token_t XML_top10 = 3233;
+const xml_token_t XML_topAutoShow = 3234;
+const xml_token_t XML_topFromText = 3235;
+const xml_token_t XML_topLabels = 3236;
+const xml_token_t XML_topLeftCell = 3237;
+const xml_token_t XML_topLinePunct = 3238;
+const xml_token_t XML_totalsRowBorderDxfId = 3239;
+const xml_token_t XML_totalsRowCellStyle = 3240;
+const xml_token_t XML_totalsRowCount = 3241;
+const xml_token_t XML_totalsRowDxfId = 3242;
+const xml_token_t XML_totalsRowFormula = 3243;
+const xml_token_t XML_totalsRowFunction = 3244;
+const xml_token_t XML_totalsRowLabel = 3245;
+const xml_token_t XML_totalsRowShown = 3246;
+const xml_token_t XML_tp = 3247;
+const xml_token_t XML_tpl = 3248;
+const xml_token_t XML_tplc = 3249;
+const xml_token_t XML_tpls = 3250;
+const xml_token_t XML_tr = 3251;
+const xml_token_t XML_tr2bl = 3252;
+const xml_token_t XML_trHeight = 3253;
+const xml_token_t XML_trPr = 3254;
+const xml_token_t XML_trPrChange = 3255;
+const xml_token_t XML_track = 3256;
+const xml_token_t XML_trackRevisions = 3257;
+const xml_token_t XML_transition = 3258;
+const xml_token_t XML_transitionEntry = 3259;
+const xml_token_t XML_transitionEvaluation = 3260;
+const xml_token_t XML_transp = 3261;
+const xml_token_t XML_trend = 3262;
+const xml_token_t XML_trendline = 3263;
+const xml_token_t XML_trendlineLbl = 3264;
+const xml_token_t XML_trendlineType = 3265;
+const xml_token_t XML_trim = 3266;
+const xml_token_t XML_truncateFontHeightsLikeWP6 = 3267;
+const xml_token_t XML_tupleCache = 3268;
+const xml_token_t XML_twoCellAnchor = 3269;
+const xml_token_t XML_twoDigitTextYear = 3270;
+const xml_token_t XML_tx = 3271;
+const xml_token_t XML_tx1 = 3272;
+const xml_token_t XML_tx2 = 3273;
+const xml_token_t XML_txBody = 3274;
+const xml_token_t XML_txBox = 3275;
+const xml_token_t XML_txDef = 3276;
+const xml_token_t XML_txEffectClrLst = 3277;
+const xml_token_t XML_txEl = 3278;
+const xml_token_t XML_txFillClrLst = 3279;
+const xml_token_t XML_txLinClrLst = 3280;
+const xml_token_t XML_txPr = 3281;
+const xml_token_t XML_txSp = 3282;
+const xml_token_t XML_txStyles = 3283;
+const xml_token_t XML_txbxContent = 3284;
+const xml_token_t XML_ty = 3285;
+const xml_token_t XML_type = 3286;
+const xml_token_t XML_typeface = 3287;
+const xml_token_t XML_types = 3288;
+const xml_token_t XML_u = 3289;
+const xml_token_t XML_uBounds = 3290;
+const xml_token_t XML_uFill = 3291;
+const xml_token_t XML_uFillTx = 3292;
+const xml_token_t XML_uLn = 3293;
+const xml_token_t XML_uLnTx = 3294;
+const xml_token_t XML_ua = 3295;
+const xml_token_t XML_udl = 3296;
+const xml_token_t XML_ui1 = 3297;
+const xml_token_t XML_ui2 = 3298;
+const xml_token_t XML_ui4 = 3299;
+const xml_token_t XML_ui8 = 3300;
+const xml_token_t XML_uiCompat97To2003 = 3301;
+const xml_token_t XML_uiExpand = 3302;
+const xml_token_t XML_uiPriority = 3303;
+const xml_token_t XML_uint = 3304;
+const xml_token_t XML_ulTrailSpace = 3305;
+const xml_token_t XML_un = 3306;
+const xml_token_t XML_unbalanced = 3307;
+const xml_token_t XML_unbalancedGroup = 3308;
+const xml_token_t XML_unboundColumnsLeft = 3309;
+const xml_token_t XML_unboundColumnsRight = 3310;
+const xml_token_t XML_underlineTabInNumList = 3311;
+const xml_token_t XML_undo = 3312;
+const xml_token_t XML_undone = 3313;
+const xml_token_t XML_ungrouping = 3314;
+const xml_token_t XML_unhideWhenUsed = 3315;
+const xml_token_t XML_uniqueCount = 3316;
+const xml_token_t XML_uniqueId = 3317;
+const xml_token_t XML_uniqueList = 3318;
+const xml_token_t XML_uniqueMemberProperty = 3319;
+const xml_token_t XML_uniqueName = 3320;
+const xml_token_t XML_uniqueParent = 3321;
+const xml_token_t XML_uniqueTag = 3322;
+const xml_token_t XML_unlockedFormula = 3323;
+const xml_token_t XML_up = 3324;
+const xml_token_t XML_upBars = 3325;
+const xml_token_t XML_upDownBars = 3326;
+const xml_token_t XML_updateAutomatic = 3327;
+const xml_token_t XML_updateFields = 3328;
+const xml_token_t XML_updateLinks = 3329;
+const xml_token_t XML_updatedVersion = 3330;
+const xml_token_t XML_upgradeOnRefresh = 3331;
+const xml_token_t XML_upright = 3332;
+const xml_token_t XML_uri = 3333;
+const xml_token_t XML_url = 3334;
+const xml_token_t XML_usb0 = 3335;
+const xml_token_t XML_usb1 = 3336;
+const xml_token_t XML_usb2 = 3337;
+const xml_token_t XML_usb3 = 3338;
+const xml_token_t XML_useA = 3339;
+const xml_token_t XML_useAltKinsokuLineBreakRules = 3340;
+const xml_token_t XML_useAnsiKerningPairs = 3341;
+const xml_token_t XML_useAutoFormatting = 3342;
+const xml_token_t XML_useBgFill = 3343;
+const xml_token_t XML_useDef = 3344;
+const xml_token_t XML_useFELayout = 3345;
+const xml_token_t XML_useFirstPageNumber = 3346;
+const xml_token_t XML_useLongFilenames = 3347;
+const xml_token_t XML_useNormalStyleForList = 3348;
+const xml_token_t XML_usePrinterDefaults = 3349;
+const xml_token_t XML_usePrinterMetrics = 3350;
+const xml_token_t XML_useSingleBorderforContiguousCells = 3351;
+const xml_token_t XML_useSpRect = 3352;
+const xml_token_t XML_useTimings = 3353;
+const xml_token_t XML_useWord2002TableStyleRules = 3354;
+const xml_token_t XML_useWord97LineBreakRules = 3355;
+const xml_token_t XML_useXSLTWhenSaving = 3356;
+const xml_token_t XML_user = 3357;
+const xml_token_t XML_userDrawn = 3358;
+const xml_token_t XML_userInfo = 3359;
+const xml_token_t XML_userInterface = 3360;
+const xml_token_t XML_userName = 3361;
+const xml_token_t XML_userShapes = 3362;
+const xml_token_t XML_userdrawn = 3363;
+const xml_token_t XML_userhidden = 3364;
+const xml_token_t XML_users = 3365;
+const xml_token_t XML_v = 3366;
+const xml_token_t XML_vAlign = 3367;
+const xml_token_t XML_vAnchor = 3368;
+const xml_token_t XML_vMerge = 3369;
+const xml_token_t XML_vMergeOrig = 3370;
+const xml_token_t XML_vSpace = 3371;
+const xml_token_t XML_vacatedStyle = 3372;
+const xml_token_t XML_val = 3373;
+const xml_token_t XML_valAx = 3374;
+const xml_token_t XML_value = 3375;
+const xml_token_t XML_valueMetadata = 3376;
+const xml_token_t XML_valueType = 3377;
+const xml_token_t XML_values = 3378;
+const xml_token_t XML_vanish = 3379;
+const xml_token_t XML_varLst = 3380;
+const xml_token_t XML_varPSubtotal = 3381;
+const xml_token_t XML_varScale = 3382;
+const xml_token_t XML_varSubtotal = 3383;
+const xml_token_t XML_variant = 3384;
+const xml_token_t XML_varyColors = 3385;
+const xml_token_t XML_vbProcedure = 3386;
+const xml_token_t XML_vector = 3387;
+const xml_token_t XML_vendorID = 3388;
+const xml_token_t XML_version = 3389;
+const xml_token_t XML_vert = 3390;
+const xml_token_t XML_vertAlign = 3391;
+const xml_token_t XML_vertAnchor = 3392;
+const xml_token_t XML_vertBarState = 3393;
+const xml_token_t XML_vertCompress = 3394;
+const xml_token_t XML_vertJc = 3395;
+const xml_token_t XML_vertOverflow = 3396;
+const xml_token_t XML_vertical = 3397;
+const xml_token_t XML_verticalCentered = 3398;
+const xml_token_t XML_verticalDpi = 3399;
+const xml_token_t XML_verticies = 3400;
+const xml_token_t XML_video = 3401;
+const xml_token_t XML_videoFile = 3402;
+const xml_token_t XML_view = 3403;
+const xml_token_t XML_view3D = 3404;
+const xml_token_t XML_viewMergedData = 3405;
+const xml_token_t XML_viewPr = 3406;
+const xml_token_t XML_viewpoint = 3407;
+const xml_token_t XML_viewpointorigin = 3408;
+const xml_token_t XML_visibility = 3409;
+const xml_token_t XML_visualTotals = 3410;
+const xml_token_t XML_vm = 3411;
+const xml_token_t XML_vml = 3412;
+const xml_token_t XML_vocabulary = 3413;
+const xml_token_t XML_vol = 3414;
+const xml_token_t XML_volType = 3415;
+const xml_token_t XML_volTypes = 3416;
+const xml_token_t XML_vstream = 3417;
+const xml_token_t XML_w = 3418;
+const xml_token_t XML_wAfter = 3419;
+const xml_token_t XML_wBefore = 3420;
+const xml_token_t XML_wMode = 3421;
+const xml_token_t XML_wR = 3422;
+const xml_token_t XML_wavAudioFile = 3423;
+const xml_token_t XML_webHidden = 3424;
+const xml_token_t XML_webPr = 3425;
+const xml_token_t XML_webPublishItem = 3426;
+const xml_token_t XML_webPublishItems = 3427;
+const xml_token_t XML_webPublishObject = 3428;
+const xml_token_t XML_webPublishObjects = 3429;
+const xml_token_t XML_webPublishing = 3430;
+const xml_token_t XML_webSettings = 3431;
+const xml_token_t XML_wedge = 3432;
+const xml_token_t XML_weight = 3433;
+const xml_token_t XML_wheel = 3434;
+const xml_token_t XML_whole = 3435;
+const xml_token_t XML_wholeTbl = 3436;
+const xml_token_t XML_widowControl = 3437;
+const xml_token_t XML_width = 3438;
+const xml_token_t XML_windowHeight = 3439;
+const xml_token_t XML_windowProtection = 3440;
+const xml_token_t XML_windowWidth = 3441;
+const xml_token_t XML_wipe = 3442;
+const xml_token_t XML_wireframe = 3443;
+const xml_token_t XML_wordWrap = 3444;
+const xml_token_t XML_workbook = 3445;
+const xml_token_t XML_workbookParameter = 3446;
+const xml_token_t XML_workbookPassword = 3447;
+const xml_token_t XML_workbookPr = 3448;
+const xml_token_t XML_workbookProtection = 3449;
+const xml_token_t XML_workbookView = 3450;
+const xml_token_t XML_workbookViewId = 3451;
+const xml_token_t XML_worksheet = 3452;
+const xml_token_t XML_worksheetSource = 3453;
+const xml_token_t XML_wpJustification = 3454;
+const xml_token_t XML_wpSpaceWidth = 3455;
+const xml_token_t XML_wrap = 3456;
+const xml_token_t XML_wrapIndent = 3457;
+const xml_token_t XML_wrapNone = 3458;
+const xml_token_t XML_wrapPolygon = 3459;
+const xml_token_t XML_wrapRight = 3460;
+const xml_token_t XML_wrapSquare = 3461;
+const xml_token_t XML_wrapText = 3462;
+const xml_token_t XML_wrapThrough = 3463;
+const xml_token_t XML_wrapTight = 3464;
+const xml_token_t XML_wrapTopAndBottom = 3465;
+const xml_token_t XML_wrapTrailSpaces = 3466;
+const xml_token_t XML_wrapcoords = 3467;
+const xml_token_t XML_writeProtection = 3468;
+const xml_token_t XML_wsDr = 3469;
+const xml_token_t XML_x = 3470;
+const xml_token_t XML_xAlign = 3471;
+const xml_token_t XML_xMode = 3472;
+const xml_token_t XML_xSplit = 3473;
+const xml_token_t XML_xVal = 3474;
+const xml_token_t XML_xWindow = 3475;
+const xml_token_t XML_xf = 3476;
+const xml_token_t XML_xfDxf = 3477;
+const xml_token_t XML_xfId = 3478;
+const xml_token_t XML_xfrm = 3479;
+const xml_token_t XML_xfrmType = 3480;
+const xml_token_t XML_xl2000 = 3481;
+const xml_token_t XML_xl97 = 3482;
+const xml_token_t XML_xlm = 3483;
+const xml_token_t XML_xml = 3484;
+const xml_token_t XML_xmlBased = 3485;
+const xml_token_t XML_xmlCellPr = 3486;
+const xml_token_t XML_xmlColumnPr = 3487;
+const xml_token_t XML_xmlDataType = 3488;
+const xml_token_t XML_xmlPr = 3489;
+const xml_token_t XML_xpath = 3490;
+const xml_token_t XML_xrange = 3491;
+const xml_token_t XML_xscale = 3492;
+const xml_token_t XML_y = 3493;
+const xml_token_t XML_yAlign = 3494;
+const xml_token_t XML_yMode = 3495;
+const xml_token_t XML_ySplit = 3496;
+const xml_token_t XML_yVal = 3497;
+const xml_token_t XML_yWindow = 3498;
+const xml_token_t XML_year = 3499;
+const xml_token_t XML_yearLong = 3500;
+const xml_token_t XML_yearShort = 3501;
+const xml_token_t XML_yrange = 3502;
+const xml_token_t XML_z = 3503;
+const xml_token_t XML_zOrder = 3504;
+const xml_token_t XML_zOrderOff = 3505;
+const xml_token_t XML_zeroAsc = 3506;
+const xml_token_t XML_zeroDesc = 3507;
+const xml_token_t XML_zeroHeight = 3508;
+const xml_token_t XML_zeroValues = 3509;
+const xml_token_t XML_zeroWid = 3510;
+const xml_token_t XML_zoom = 3511;
+const xml_token_t XML_zoomContents = 3512;
+const xml_token_t XML_zoomScale = 3513;
+const xml_token_t XML_zoomScaleNormal = 3514;
+const xml_token_t XML_zoomScalePageLayoutView = 3515;
+const xml_token_t XML_zoomScaleSheetLayoutView = 3516;
+const xml_token_t XML_zoomToFit = 3517;
diff --git a/src/liborcus/ooxml_tokens.cpp b/src/liborcus/ooxml_tokens.cpp
new file mode 100644
index 0000000..f73a06c
--- /dev/null
+++ b/src/liborcus/ooxml_tokens.cpp
@@ -0,0 +1,29 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "ooxml_tokens.hpp"
+
+namespace orcus {
+
+namespace ooxml {
+
+#include "ooxml_tokens.inl"
+
+}
+
+namespace opc {
+
+#include "opc_tokens.inl"
+
+}
+
+tokens ooxml_tokens = tokens(ooxml::token_names, ooxml::token_name_count);
+
+tokens opc_tokens = tokens(opc::token_names, opc::token_name_count);
+
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/ooxml_tokens.hpp b/src/liborcus/ooxml_tokens.hpp
new file mode 100644
index 0000000..3e8380b
--- /dev/null
+++ b/src/liborcus/ooxml_tokens.hpp
@@ -0,0 +1,21 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef __ORCUS_OOXML_TOKENS_HPP__
+#define __ORCUS_OOXML_TOKENS_HPP__
+
+#include "orcus/tokens.hpp"
+
+namespace orcus {
+
+extern tokens ooxml_tokens;
+extern tokens opc_tokens;
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/ooxml_tokens.inl b/src/liborcus/ooxml_tokens.inl
new file mode 100644
index 0000000..5fa2ad0
--- /dev/null
+++ b/src/liborcus/ooxml_tokens.inl
@@ -0,0 +1,3524 @@
+// This file has been auto-generated. Do not hand-edit this.
+
+const char* token_names[] = {
+ "??", // 0
+ "AbbreviatedCaseNumber", // 1
+ "Accel", // 2
+ "Accel2", // 3
+ "AlbumTitle", // 4
+ "AlternateContent", // 5
+ "Anchor", // 6
+ "AppVersion", // 7
+ "Append", // 8
+ "Application", // 9
+ "Artist", // 10
+ "Author", // 11
+ "AutoFill", // 12
+ "AutoFit", // 13
+ "AutoLine", // 14
+ "AutoPict", // 15
+ "AutoScale", // 16
+ "BookAuthor", // 17
+ "BookTitle", // 18
+ "BroadcastTitle", // 19
+ "Broadcaster", // 20
+ "CF", // 21
+ "Camera", // 22
+ "Cancel", // 23
+ "CaseNumber", // 24
+ "ChapterNumber", // 25
+ "Characters", // 26
+ "CharactersWithSpaces", // 27
+ "Checked", // 28
+ "Choice", // 29
+ "City", // 30
+ "ClientData", // 31
+ "ColHidden", // 32
+ "Colored", // 33
+ "Column", // 34
+ "Comments", // 35
+ "Company", // 36
+ "Compiler", // 37
+ "Composer", // 38
+ "Conductor", // 39
+ "ConferenceName", // 40
+ "ConnectionID", // 41
+ "Corporate", // 42
+ "Counsel", // 43
+ "CountryRegion", // 44
+ "Court", // 45
+ "DDE", // 46
+ "DataBinding", // 47
+ "DataBindingLoadMode", // 48
+ "DataBindingName", // 49
+ "Day", // 50
+ "DayAccessed", // 51
+ "Default", // 52
+ "DefaultSize", // 53
+ "Department", // 54
+ "DigSig", // 55
+ "Director", // 56
+ "Disabled", // 57
+ "Dismiss", // 58
+ "Distributor", // 59
+ "DocSecurity", // 60
+ "DrawAspect", // 61
+ "DropLines", // 62
+ "DropStyle", // 63
+ "Dx", // 64
+ "Edition", // 65
+ "Editor", // 66
+ "Fallback", // 67
+ "FieldCodes", // 68
+ "FileBinding", // 69
+ "FileBindingName", // 70
+ "First", // 71
+ "FirstButton", // 72
+ "FmlaGroup", // 73
+ "FmlaLink", // 74
+ "FmlaMacro", // 75
+ "FmlaPict", // 76
+ "FmlaRange", // 77
+ "FmlaTxbx", // 78
+ "Guid", // 79
+ "HLinks", // 80
+ "HeadingPairs", // 81
+ "Help", // 82
+ "HiddenSlides", // 83
+ "Horiz", // 84
+ "HyperlinkBase", // 85
+ "HyperlinksChanged", // 86
+ "ID", // 87
+ "Inc", // 88
+ "Institution", // 89
+ "InternetSiteTitle", // 90
+ "Interviewee", // 91
+ "Interviewer", // 92
+ "Inventor", // 93
+ "Issue", // 94
+ "JournalName", // 95
+ "JustLastX", // 96
+ "LCID", // 97
+ "LCT", // 98
+ "Last", // 99
+ "Lines", // 100
+ "LinkType", // 101
+ "LinksUpToDate", // 102
+ "ListItem", // 103
+ "LockText", // 104
+ "Locked", // 105
+ "LockedField", // 106
+ "MMClips", // 107
+ "Manager", // 108
+ "Map", // 109
+ "MapInfo", // 110
+ "MapOCX", // 111
+ "Max", // 112
+ "Medium", // 113
+ "Middle", // 114
+ "Min", // 115
+ "Month", // 116
+ "MonthAccessed", // 117
+ "MoveWithCells", // 118
+ "MultiLine", // 119
+ "MultiSel", // 120
+ "Name", // 121
+ "NameList", // 122
+ "Namespace", // 123
+ "NoThreeD", // 124
+ "NoThreeD2", // 125
+ "Notes", // 126
+ "NumberVolumes", // 127
+ "OLEObject", // 128
+ "ObjectID", // 129
+ "ObjectType", // 130
+ "Page", // 131
+ "Pages", // 132
+ "Paragraphs", // 133
+ "PatentNumber", // 134
+ "Performer", // 135
+ "PeriodicalTitle", // 136
+ "Person", // 137
+ "PresentationFormat", // 138
+ "PreserveFormat", // 139
+ "PreserveSortAFLayout", // 140
+ "PrintObject", // 141
+ "ProducerName", // 142
+ "ProductionCompany", // 143
+ "ProgID", // 144
+ "Properties", // 145
+ "PublicationTitle", // 146
+ "Publisher", // 147
+ "RecalcAlways", // 148
+ "RecordingNumber", // 149
+ "RefOrder", // 150
+ "Reporter", // 151
+ "RootElement", // 152
+ "Row", // 153
+ "RowHidden", // 154
+ "ScaleCrop", // 155
+ "Schema", // 156
+ "SchemaID", // 157
+ "SchemaRef", // 158
+ "ScriptExtended", // 159
+ "ScriptLanguage", // 160
+ "ScriptLocation", // 161
+ "ScriptText", // 162
+ "SecretEdit", // 163
+ "Sel", // 164
+ "SelType", // 165
+ "SelectedStyle", // 166
+ "SelectionNamespaces", // 167
+ "ShapeID", // 168
+ "SharedDoc", // 169
+ "ShortTitle", // 170
+ "ShowImportExportValidationErrors", // 171
+ "SizeWithCells", // 172
+ "Slides", // 173
+ "Source", // 174
+ "SourceType", // 175
+ "Sources", // 176
+ "StandardNumber", // 177
+ "StateProvince", // 178
+ "Station", // 179
+ "StyleName", // 180
+ "Tag", // 181
+ "Template", // 182
+ "TextHAlign", // 183
+ "TextVAlign", // 184
+ "Theater", // 185
+ "ThesisType", // 186
+ "Title", // 187
+ "TitlesOfParts", // 188
+ "TotalTime", // 189
+ "Translator", // 190
+ "Type", // 191
+ "UIObj", // 192
+ "URI", // 193
+ "URL", // 194
+ "UpdateMode", // 195
+ "VScroll", // 196
+ "VTEdit", // 197
+ "Val", // 198
+ "ValidIds", // 199
+ "Version", // 200
+ "Visible", // 201
+ "Volume", // 202
+ "WidthMin", // 203
+ "Words", // 204
+ "Writer", // 205
+ "Year", // 206
+ "YearAccessed", // 207
+ "a", // 208
+ "aboveAverage", // 209
+ "absSizeAnchor", // 210
+ "absoluteAnchor", // 211
+ "abstractNum", // 212
+ "abstractNumId", // 213
+ "aca", // 214
+ "acc", // 215
+ "accPr", // 216
+ "accel", // 217
+ "accent1", // 218
+ "accent2", // 219
+ "accent3", // 220
+ "accent4", // 221
+ "accent5", // 222
+ "accent6", // 223
+ "accentbar", // 224
+ "accumulate", // 225
+ "action", // 226
+ "active", // 227
+ "activeCell", // 228
+ "activeCellId", // 229
+ "activeCol", // 230
+ "activePane", // 231
+ "activeRecord", // 232
+ "activeRow", // 233
+ "activeSheetId", // 234
+ "activeTab", // 235
+ "activeWritingStyle", // 236
+ "actualPg", // 237
+ "additionalCharacteristics", // 238
+ "additive", // 239
+ "addlxml", // 240
+ "addressFieldName", // 241
+ "adj", // 242
+ "adjLst", // 243
+ "adjust", // 244
+ "adjustColumnWidth", // 245
+ "adjustLineHeightInTable", // 246
+ "adjustRightInd", // 247
+ "adjusthandles", // 248
+ "advAuto", // 249
+ "advClick", // 250
+ "advTm", // 251
+ "advise", // 252
+ "after", // 253
+ "afterAutospacing", // 254
+ "afterEffect", // 255
+ "afterLines", // 256
+ "ahLst", // 257
+ "ahPolar", // 258
+ "ahXY", // 259
+ "alg", // 260
+ "algIdExt", // 261
+ "algIdExtSource", // 262
+ "algn", // 263
+ "alias", // 264
+ "aliases", // 265
+ "align", // 266
+ "alignBordersAndEdges", // 267
+ "alignTablesRowByRow", // 268
+ "alignWithMargins", // 269
+ "alignment", // 270
+ "alignshape", // 271
+ "all", // 272
+ "allCaption", // 273
+ "allDrilled", // 274
+ "allUniqueName", // 275
+ "allowBlank", // 276
+ "allowOverlap", // 277
+ "allowPNG", // 278
+ "allowPng", // 279
+ "allowRefreshQuery", // 280
+ "allowSpaceOfSameStyleInTable", // 281
+ "allowcomments", // 282
+ "allowincell", // 283
+ "allowoverlap", // 284
+ "aln", // 285
+ "alnAt", // 286
+ "alnScr", // 287
+ "alpha", // 288
+ "alphaBiLevel", // 289
+ "alphaCeiling", // 290
+ "alphaFloor", // 291
+ "alphaInv", // 292
+ "alphaMod", // 293
+ "alphaModFix", // 294
+ "alphaOff", // 295
+ "alphaOutset", // 296
+ "alphaRepl", // 297
+ "alt", // 298
+ "altChunk", // 299
+ "altChunkPr", // 300
+ "altLang", // 301
+ "altName", // 302
+ "althref", // 303
+ "alwaysMergeEmptyNamespace", // 304
+ "alwaysShow", // 305
+ "alwaysShowPlaceholderText", // 306
+ "amt", // 307
+ "anchor", // 308
+ "anchorCtr", // 309
+ "anchorLock", // 310
+ "anchorlock", // 311
+ "anchorx", // 312
+ "anchory", // 313
+ "and", // 314
+ "ang", // 315
+ "angle", // 316
+ "anim", // 317
+ "animBg", // 318
+ "animClr", // 319
+ "animEffect", // 320
+ "animLvl", // 321
+ "animMotion", // 322
+ "animOne", // 323
+ "animRot", // 324
+ "animScale", // 325
+ "annotation", // 326
+ "annotationRef", // 327
+ "appName", // 328
+ "applyAlignment", // 329
+ "applyAlignmentFormats", // 330
+ "applyBorder", // 331
+ "applyBorderFormats", // 332
+ "applyBreakingRules", // 333
+ "applyFill", // 334
+ "applyFont", // 335
+ "applyFontFormats", // 336
+ "applyNumberFormat", // 337
+ "applyNumberFormats", // 338
+ "applyPatternFormats", // 339
+ "applyProtection", // 340
+ "applyStyles", // 341
+ "applyToEnd", // 342
+ "applyToFront", // 343
+ "applyToSides", // 344
+ "applyWidthHeightFormats", // 345
+ "arc", // 346
+ "arcTo", // 347
+ "arcsize", // 348
+ "area3DChart", // 349
+ "areaChart", // 350
+ "arg", // 351
+ "argPr", // 352
+ "argSz", // 353
+ "array", // 354
+ "arrowok", // 355
+ "ascii", // 356
+ "asciiTheme", // 357
+ "aspect", // 358
+ "aspectratio", // 359
+ "assign", // 360
+ "asteriskTotals", // 361
+ "attachedSchema", // 362
+ "attachedTemplate", // 363
+ "attr", // 364
+ "attrName", // 365
+ "attrNameLst", // 366
+ "attribute", // 367
+ "audio", // 368
+ "audioCd", // 369
+ "audioFile", // 370
+ "author", // 371
+ "authorId", // 372
+ "authors", // 373
+ "auto", // 374
+ "autoAdjust", // 375
+ "autoCaption", // 376
+ "autoCaptions", // 377
+ "autoCompressPictures", // 378
+ "autoEnd", // 379
+ "autoFilter", // 380
+ "autoFilterDateGrouping", // 381
+ "autoFormatId", // 382
+ "autoFormatOverride", // 383
+ "autoHyphenation", // 384
+ "autoLoad", // 385
+ "autoPage", // 386
+ "autoPageBreaks", // 387
+ "autoRecover", // 388
+ "autoRedefine", // 389
+ "autoRepublish", // 390
+ "autoRev", // 391
+ "autoShow", // 392
+ "autoSortScope", // 393
+ "autoSpaceDE", // 394
+ "autoSpaceDN", // 395
+ "autoSpaceLikeWord95", // 396
+ "autoStart", // 397
+ "autoTitleDeleted", // 398
+ "autoUpdate", // 399
+ "autoUpdateAnimBg", // 400
+ "autofitToFirstFixedWidthCell", // 401
+ "autoformat", // 402
+ "autolayout", // 403
+ "autorotationcenter", // 404
+ "avLst", // 405
+ "avgSubtotal", // 406
+ "axId", // 407
+ "axPos", // 408
+ "axis", // 409
+ "b", // 410
+ "bCs", // 411
+ "bIns", // 412
+ "backWall", // 413
+ "backdepth", // 414
+ "backdrop", // 415
+ "background", // 416
+ "backgroundQuery", // 417
+ "backgroundRefresh", // 418
+ "backupFile", // 419
+ "backward", // 420
+ "backwards", // 421
+ "balanceSingleByteDoubleByteWidth", // 422
+ "band1H", // 423
+ "band1V", // 424
+ "band2H", // 425
+ "band2V", // 426
+ "bandCol", // 427
+ "bandFmt", // 428
+ "bandFmts", // 429
+ "bandRow", // 430
+ "bar", // 431
+ "bar3DChart", // 432
+ "barChart", // 433
+ "barDir", // 434
+ "barPr", // 435
+ "base", // 436
+ "baseColWidth", // 437
+ "baseField", // 438
+ "baseItem", // 439
+ "baseJc", // 440
+ "baseTimeUnit", // 441
+ "baseType", // 442
+ "basedOn", // 443
+ "baseline", // 444
+ "bc", // 445
+ "bdr", // 446
+ "before", // 447
+ "beforeAutospacing", // 448
+ "beforeLines", // 449
+ "begChr", // 450
+ "behavior", // 451
+ "behaviors", // 452
+ "behindDoc", // 453
+ "bestFit", // 454
+ "between", // 455
+ "bevel", // 456
+ "bevelB", // 457
+ "bevelT", // 458
+ "bg", // 459
+ "bg1", // 460
+ "bg2", // 461
+ "bgClr", // 462
+ "bgColor", // 463
+ "bgFillStyleLst", // 464
+ "bgPr", // 465
+ "bgRef", // 466
+ "biLevel", // 467
+ "bibliography", // 468
+ "bidi", // 469
+ "bidiVisual", // 470
+ "bilevel", // 471
+ "bk", // 472
+ "blackAndWhite", // 473
+ "blacklevel", // 474
+ "blank", // 475
+ "bld", // 476
+ "bldAsOne", // 477
+ "bldChart", // 478
+ "bldDgm", // 479
+ "bldGraphic", // 480
+ "bldLst", // 481
+ "bldLvl", // 482
+ "bldOleChart", // 483
+ "bldP", // 484
+ "bldStep", // 485
+ "bldSub", // 486
+ "blend", // 487
+ "blinds", // 488
+ "blip", // 489
+ "blipFill", // 490
+ "blipPhldr", // 491
+ "blob", // 492
+ "blockQuote", // 493
+ "blue", // 494
+ "blueMod", // 495
+ "blueOff", // 496
+ "blur", // 497
+ "blurRad", // 498
+ "bmk", // 499
+ "body", // 500
+ "bodyDiv", // 501
+ "bodyPr", // 502
+ "bodyStyle", // 503
+ "bold", // 504
+ "boldItalic", // 505
+ "bookFoldPrinting", // 506
+ "bookFoldPrintingSheets", // 507
+ "bookFoldRevPrinting", // 508
+ "bookViews", // 509
+ "bookmarkEnd", // 510
+ "bookmarkIdSeed", // 511
+ "bookmarkStart", // 512
+ "bool", // 513
+ "boolVal", // 514
+ "boolean", // 515
+ "border", // 516
+ "borderBox", // 517
+ "borderBoxPr", // 518
+ "borderId", // 519
+ "borderbottom", // 520
+ "borderbottomcolor", // 521
+ "borderleft", // 522
+ "borderleftcolor", // 523
+ "borderright", // 524
+ "borderrightcolor", // 525
+ "borders", // 526
+ "bordersDoNotSurroundFooter", // 527
+ "bordersDoNotSurroundHeader", // 528
+ "bordertop", // 529
+ "bordertopcolor", // 530
+ "bottom", // 531
+ "bottomFromText", // 532
+ "box", // 533
+ "boxPr", // 534
+ "br", // 535
+ "bright", // 536
+ "brightness", // 537
+ "brk", // 538
+ "brkBin", // 539
+ "brkBinSub", // 540
+ "browse", // 541
+ "bstr", // 542
+ "buAutoNum", // 543
+ "buBlip", // 544
+ "buChar", // 545
+ "buClr", // 546
+ "buClrTx", // 547
+ "buFont", // 548
+ "buFontTx", // 549
+ "buNone", // 550
+ "buSzPct", // 551
+ "buSzPts", // 552
+ "buSzTx", // 553
+ "bubble3D", // 554
+ "bubbleChart", // 555
+ "bubbleScale", // 556
+ "bubbleSize", // 557
+ "build", // 558
+ "builtIn", // 559
+ "builtInGroupCount", // 560
+ "builtInUnit", // 561
+ "builtinId", // 562
+ "bullet", // 563
+ "bulletEnabled", // 564
+ "button", // 565
+ "bw", // 566
+ "bwMode", // 567
+ "bwmode", // 568
+ "bwnormal", // 569
+ "bwpure", // 570
+ "bx", // 571
+ "by", // 572
+ "byPosition", // 573
+ "c", // 574
+ "cBhvr", // 575
+ "cGp", // 576
+ "cGpRule", // 577
+ "cMediaNode", // 578
+ "cNvCxnSpPr", // 579
+ "cNvGraphicFramePr", // 580
+ "cNvGrpSpPr", // 581
+ "cNvPicPr", // 582
+ "cNvPr", // 583
+ "cNvSpPr", // 584
+ "cSld", // 585
+ "cSldViewPr", // 586
+ "cSp", // 587
+ "cTn", // 588
+ "cViewPr", // 589
+ "ca", // 590
+ "cacheField", // 591
+ "cacheFields", // 592
+ "cacheHierarchies", // 593
+ "cacheHierarchy", // 594
+ "cacheId", // 595
+ "cacheIndex", // 596
+ "cacheSource", // 597
+ "cachedColBalance", // 598
+ "calcChain", // 599
+ "calcCompleted", // 600
+ "calcId", // 601
+ "calcMode", // 602
+ "calcOnExit", // 603
+ "calcOnSave", // 604
+ "calcPr", // 605
+ "calcmode", // 606
+ "calculatedColumn", // 607
+ "calculatedColumnFormula", // 608
+ "calculatedItem", // 609
+ "calculatedItems", // 610
+ "calculatedMember", // 611
+ "calculatedMembers", // 612
+ "calendar", // 613
+ "calendarType", // 614
+ "callout", // 615
+ "camera", // 616
+ "cantSplit", // 617
+ "cap", // 618
+ "caps", // 619
+ "caption", // 620
+ "captions", // 621
+ "caseSensitive", // 622
+ "cat", // 623
+ "catAx", // 624
+ "catLst", // 625
+ "category", // 626
+ "categoryIdx", // 627
+ "cell", // 628
+ "cell3D", // 629
+ "cellColor", // 630
+ "cellComments", // 631
+ "cellDel", // 632
+ "cellIns", // 633
+ "cellMerge", // 634
+ "cellMeta", // 635
+ "cellMetadata", // 636
+ "cellSmartTag", // 637
+ "cellSmartTagPr", // 638
+ "cellSmartTags", // 639
+ "cellStyle", // 640
+ "cellStyleXfs", // 641
+ "cellStyles", // 642
+ "cellWatch", // 643
+ "cellWatches", // 644
+ "cellXfs", // 645
+ "cf", // 646
+ "cfRule", // 647
+ "cfvo", // 648
+ "chExt", // 649
+ "chMax", // 650
+ "chOff", // 651
+ "chOrder", // 652
+ "chPref", // 653
+ "changesSavedWin", // 654
+ "chapNum", // 655
+ "chapSep", // 656
+ "chapStyle", // 657
+ "char", // 658
+ "charRg", // 659
+ "charSpace", // 660
+ "characterSpacingControl", // 661
+ "characteristic", // 662
+ "charset", // 663
+ "chart", // 664
+ "chartFormat", // 665
+ "chartFormats", // 666
+ "chartObject", // 667
+ "chartSpace", // 668
+ "chartsheet", // 669
+ "checkBox", // 670
+ "checkCompatibility", // 671
+ "checkErrors", // 672
+ "checkStyle", // 673
+ "checked", // 674
+ "checker", // 675
+ "childTnLst", // 676
+ "choose", // 677
+ "chr", // 678
+ "chromakey", // 679
+ "circle", // 680
+ "citation", // 681
+ "class", // 682
+ "clear", // 683
+ "clearAll", // 684
+ "clearComments", // 685
+ "clearContents", // 686
+ "clearFormats", // 687
+ "click", // 688
+ "clickAndTypeStyle", // 689
+ "clientData", // 690
+ "clientInsertedTime", // 691
+ "clip", // 692
+ "clippath", // 693
+ "clipped", // 694
+ "cliptowrap", // 695
+ "close", // 696
+ "clr", // 697
+ "clrChange", // 698
+ "clrData", // 699
+ "clrFrom", // 700
+ "clrIdx", // 701
+ "clrMap", // 702
+ "clrMapOvr", // 703
+ "clrMode", // 704
+ "clrMru", // 705
+ "clrRepl", // 706
+ "clrScheme", // 707
+ "clrSchemeMapping", // 708
+ "clrSpc", // 709
+ "clrTo", // 710
+ "clrVal", // 711
+ "clsid", // 712
+ "cm", // 713
+ "cmAuthor", // 714
+ "cmAuthorLst", // 715
+ "cmLst", // 716
+ "cmd", // 717
+ "cmpd", // 718
+ "cnfStyle", // 719
+ "cnt", // 720
+ "code", // 721
+ "codeName", // 722
+ "codePage", // 723
+ "coerce", // 724
+ "coherent3DOff", // 725
+ "col", // 726
+ "colBreaks", // 727
+ "colDelim", // 728
+ "colFields", // 729
+ "colFirst", // 730
+ "colGrandTotals", // 731
+ "colHeaderCaption", // 732
+ "colHierarchiesUsage", // 733
+ "colHierarchyUsage", // 734
+ "colId", // 735
+ "colItems", // 736
+ "colLast", // 737
+ "colOff", // 738
+ "colPageCount", // 739
+ "collapse", // 740
+ "collapsed", // 741
+ "collapsedLevelsAreSubtotals", // 742
+ "color", // 743
+ "color2", // 744
+ "colorFilter", // 745
+ "colorId", // 746
+ "colorScale", // 747
+ "colormenu", // 748
+ "colormode", // 749
+ "colormru", // 750
+ "colors", // 751
+ "colorsDef", // 752
+ "colorsDefHdr", // 753
+ "colorsDefHdrLst", // 754
+ "cols", // 755
+ "column", // 756
+ "columnSort", // 757
+ "comb", // 758
+ "combine", // 759
+ "combineBrackets", // 760
+ "comboBox", // 761
+ "comma", // 762
+ "command", // 763
+ "commandType", // 764
+ "comment", // 765
+ "commentList", // 766
+ "commentRangeEnd", // 767
+ "commentRangeStart", // 768
+ "commentReference", // 769
+ "comments", // 770
+ "comp", // 771
+ "compact", // 772
+ "compactData", // 773
+ "compat", // 774
+ "compatLnSpc", // 775
+ "compatMode", // 776
+ "complex", // 777
+ "concurrent", // 778
+ "concurrentCalc", // 779
+ "concurrentManualCount", // 780
+ "cond", // 781
+ "condense", // 782
+ "conditionalFormat", // 783
+ "conditionalFormats", // 784
+ "conditionalFormatting", // 785
+ "connectString", // 786
+ "connectangles", // 787
+ "connection", // 788
+ "connectionId", // 789
+ "connections", // 790
+ "connectloc", // 791
+ "connectlocs", // 792
+ "connectortype", // 793
+ "connecttype", // 794
+ "consecutive", // 795
+ "consecutiveHyphenLimit", // 796
+ "consolidation", // 797
+ "constr", // 798
+ "constrLst", // 799
+ "constrainbounds", // 800
+ "cont", // 801
+ "containsBlank", // 802
+ "containsDate", // 803
+ "containsInteger", // 804
+ "containsMixedTypes", // 805
+ "containsNonDate", // 806
+ "containsNumber", // 807
+ "containsSemiMixedTypes", // 808
+ "containsString", // 809
+ "content", // 810
+ "contextualSpacing", // 811
+ "continuationSeparator", // 812
+ "contourClr", // 813
+ "contourW", // 814
+ "contrast", // 815
+ "control", // 816
+ "control1", // 817
+ "control2", // 818
+ "controls", // 819
+ "convMailMergeEsc", // 820
+ "coordorigin", // 821
+ "coordsize", // 822
+ "copies", // 823
+ "copy", // 824
+ "count", // 825
+ "countASubtotal", // 826
+ "countBy", // 827
+ "countSubtotal", // 828
+ "cover", // 829
+ "cp", // 830
+ "cr", // 831
+ "crashSave", // 832
+ "createdVersion", // 833
+ "credentials", // 834
+ "cropbottom", // 835
+ "cropleft", // 836
+ "cropping", // 837
+ "cropright", // 838
+ "croptop", // 839
+ "crossAx", // 840
+ "crossBetween", // 841
+ "crosses", // 842
+ "crossesAt", // 843
+ "cryptAlgorithmClass", // 844
+ "cryptAlgorithmSid", // 845
+ "cryptAlgorithmType", // 846
+ "cryptProvider", // 847
+ "cryptProviderType", // 848
+ "cryptProviderTypeExt", // 849
+ "cryptProviderTypeExtSource", // 850
+ "cryptSpinCount", // 851
+ "cs", // 852
+ "csCatId", // 853
+ "csTypeId", // 854
+ "csb0", // 855
+ "csb1", // 856
+ "css", // 857
+ "cstate", // 858
+ "cstheme", // 859
+ "ct", // 860
+ "ctrlPr", // 861
+ "cubicBezTo", // 862
+ "culture", // 863
+ "current", // 864
+ "curve", // 865
+ "custAng", // 866
+ "custClr", // 867
+ "custClrLst", // 868
+ "custDash", // 869
+ "custData", // 870
+ "custDataLst", // 871
+ "custFlipHor", // 872
+ "custFlipVert", // 873
+ "custGeom", // 874
+ "custLinFactNeighborX", // 875
+ "custLinFactNeighborY", // 876
+ "custLinFactX", // 877
+ "custLinFactY", // 878
+ "custRadScaleInc", // 879
+ "custRadScaleRad", // 880
+ "custScaleX", // 881
+ "custScaleY", // 882
+ "custShow", // 883
+ "custShowLst", // 884
+ "custSplit", // 885
+ "custSzX", // 886
+ "custSzY", // 887
+ "custT", // 888
+ "custUnit", // 889
+ "customBuiltin", // 890
+ "customFilter", // 891
+ "customFilters", // 892
+ "customFormat", // 893
+ "customHeight", // 894
+ "customList", // 895
+ "customListSort", // 896
+ "customMarkFollows", // 897
+ "customMenu", // 898
+ "customPr", // 899
+ "customProperties", // 900
+ "customRollUp", // 901
+ "customSheetView", // 902
+ "customSheetViews", // 903
+ "customStyle", // 904
+ "customView", // 905
+ "customWidth", // 906
+ "customWorkbookView", // 907
+ "customWorkbookViews", // 908
+ "customXml", // 909
+ "customXmlDelRangeEnd", // 910
+ "customXmlDelRangeStart", // 911
+ "customXmlInsRangeEnd", // 912
+ "customXmlInsRangeStart", // 913
+ "customXmlMoveFromRangeEnd", // 914
+ "customXmlMoveFromRangeStart", // 915
+ "customXmlMoveToRangeEnd", // 916
+ "customXmlMoveToRangeStart", // 917
+ "customXmlPr", // 918
+ "cut", // 919
+ "cx", // 920
+ "cxn", // 921
+ "cxnId", // 922
+ "cxnLst", // 923
+ "cxnSp", // 924
+ "cxnSpLocks", // 925
+ "cy", // 926
+ "d", // 927
+ "dLbl", // 928
+ "dLblPos", // 929
+ "dLbls", // 930
+ "dPr", // 931
+ "dPt", // 932
+ "dTable", // 933
+ "dashstyle", // 934
+ "data", // 935
+ "dataBar", // 936
+ "dataBinding", // 937
+ "dataBound", // 938
+ "dataCaption", // 939
+ "dataCellStyle", // 940
+ "dataConsolidate", // 941
+ "dataDxfId", // 942
+ "dataExtractLoad", // 943
+ "dataField", // 944
+ "dataFields", // 945
+ "dataModel", // 946
+ "dataOnRows", // 947
+ "dataOnly", // 948
+ "dataPosition", // 949
+ "dataRef", // 950
+ "dataRefs", // 951
+ "dataSource", // 952
+ "dataSourceSort", // 953
+ "dataType", // 954
+ "dataValidation", // 955
+ "dataValidations", // 956
+ "databaseField", // 957
+ "datastoreItem", // 958
+ "date", // 959
+ "date1904", // 960
+ "dateAx", // 961
+ "dateFormat", // 962
+ "dateGroupItem", // 963
+ "dateTime", // 964
+ "dateTimeGrouping", // 965
+ "day", // 966
+ "dayLong", // 967
+ "dayShort", // 968
+ "dbPr", // 969
+ "ddList", // 970
+ "ddeItem", // 971
+ "ddeItems", // 972
+ "ddeLink", // 973
+ "ddeService", // 974
+ "ddeTopic", // 975
+ "decel", // 976
+ "decimal", // 977
+ "decimalSymbol", // 978
+ "decorated", // 979
+ "def", // 980
+ "defJc", // 981
+ "defLockedState", // 982
+ "defPPr", // 983
+ "defQFormat", // 984
+ "defRPr", // 985
+ "defSemiHidden", // 986
+ "defStyle", // 987
+ "defTabSz", // 988
+ "defUIPriority", // 989
+ "defUnhideWhenUsed", // 990
+ "default", // 991
+ "defaultAttributeDrillState", // 992
+ "defaultColWidth", // 993
+ "defaultGridColor", // 994
+ "defaultMemberUniqueName", // 995
+ "defaultPivotStyle", // 996
+ "defaultRowHeight", // 997
+ "defaultSubtotal", // 998
+ "defaultTabStop", // 999
+ "defaultTableStyle", // 1000
+ "defaultTextStyle", // 1001
+ "defaultThemeVersion", // 1002
+ "definedName", // 1003
+ "definedNames", // 1004
+ "deg", // 1005
+ "degHide", // 1006
+ "degree", // 1007
+ "del", // 1008
+ "del1", // 1009
+ "del2", // 1010
+ "delInstrText", // 1011
+ "delText", // 1012
+ "delay", // 1013
+ "delete", // 1014
+ "deleteColumns", // 1015
+ "deleteRows", // 1016
+ "deleted", // 1017
+ "deletedField", // 1018
+ "delimited", // 1019
+ "delimiter", // 1020
+ "den", // 1021
+ "denormalized", // 1022
+ "depthPercent", // 1023
+ "desc", // 1024
+ "descending", // 1025
+ "descr", // 1026
+ "description", // 1027
+ "destId", // 1028
+ "destOrd", // 1029
+ "destination", // 1030
+ "destinationFile", // 1031
+ "detectmouseclick", // 1032
+ "dgm", // 1033
+ "dgmbasetextscale", // 1034
+ "dgmfontsize", // 1035
+ "dgmlayout", // 1036
+ "dgmlayoutmru", // 1037
+ "dgmnodekind", // 1038
+ "dgmscalex", // 1039
+ "dgmscaley", // 1040
+ "dgmstyle", // 1041
+ "diagonal", // 1042
+ "diagonalDown", // 1043
+ "diagonalUp", // 1044
+ "diagram", // 1045
+ "dialogsheet", // 1046
+ "diamond", // 1047
+ "diff", // 1048
+ "differentFirst", // 1049
+ "differentOddEven", // 1050
+ "diffusity", // 1051
+ "dimension", // 1052
+ "dimensionUniqueName", // 1053
+ "dimensions", // 1054
+ "dir", // 1055
+ "dirty", // 1056
+ "disableEdit", // 1057
+ "disableFieldList", // 1058
+ "disablePrompts", // 1059
+ "disableRefresh", // 1060
+ "discretePr", // 1061
+ "diskRevisions", // 1062
+ "dispBlanksAs", // 1063
+ "dispDef", // 1064
+ "dispEq", // 1065
+ "dispRSqr", // 1066
+ "dispUnits", // 1067
+ "dispUnitsLbl", // 1068
+ "displacedByCustomXml", // 1069
+ "display", // 1070
+ "displayBackgroundShape", // 1071
+ "displayFolder", // 1072
+ "displayHangulFixedWidth", // 1073
+ "displayHorizontalDrawingGridEvery", // 1074
+ "displayName", // 1075
+ "displayText", // 1076
+ "displayVerticalDrawingGridEvery", // 1077
+ "dissolve", // 1078
+ "dist", // 1079
+ "distB", // 1080
+ "distL", // 1081
+ "distR", // 1082
+ "distT", // 1083
+ "distance", // 1084
+ "div", // 1085
+ "divBdr", // 1086
+ "divId", // 1087
+ "divs", // 1088
+ "divsChild", // 1089
+ "dk1", // 1090
+ "dk2", // 1091
+ "dllVersion", // 1092
+ "dm", // 1093
+ "dn", // 1094
+ "doNotAutoCompressPictures", // 1095
+ "doNotAutofitConstrainedTables", // 1096
+ "doNotBreakConstrainedForcedTable", // 1097
+ "doNotBreakWrappedTables", // 1098
+ "doNotDemarcateInvalidXml", // 1099
+ "doNotDisplayPageBoundaries", // 1100
+ "doNotEmbedSmartTags", // 1101
+ "doNotExpandShiftReturn", // 1102
+ "doNotHyphenateCaps", // 1103
+ "doNotIncludeSubdocsInStats", // 1104
+ "doNotLeaveBackslashAlone", // 1105
+ "doNotOrganizeInFolder", // 1106
+ "doNotRelyOnCSS", // 1107
+ "doNotSaveAsSingleFile", // 1108
+ "doNotShadeFormData", // 1109
+ "doNotSnapToGridInCell", // 1110
+ "doNotSuppressBlankLines", // 1111
+ "doNotSuppressIndentation", // 1112
+ "doNotSuppressParagraphBorders", // 1113
+ "doNotTrackFormatting", // 1114
+ "doNotTrackMoves", // 1115
+ "doNotUseEastAsianBreakRules", // 1116
+ "doNotUseHTMLParagraphAutoSpacing", // 1117
+ "doNotUseIndentAsNumberingTabStop", // 1118
+ "doNotUseLongFileNames", // 1119
+ "doNotUseMarginsForDrawingGridOrigin", // 1120
+ "doNotValidateAgainstSchema", // 1121
+ "doNotVertAlignCellWithSp", // 1122
+ "doNotVertAlignInTxbx", // 1123
+ "doNotWrapTextWithPunct", // 1124
+ "docDefaults", // 1125
+ "docGrid", // 1126
+ "docLocation", // 1127
+ "docPart", // 1128
+ "docPartBody", // 1129
+ "docPartCategory", // 1130
+ "docPartGallery", // 1131
+ "docPartList", // 1132
+ "docPartObj", // 1133
+ "docPartPr", // 1134
+ "docPartUnique", // 1135
+ "docParts", // 1136
+ "docPr", // 1137
+ "docVar", // 1138
+ "docVars", // 1139
+ "document", // 1140
+ "documentProtection", // 1141
+ "documentType", // 1142
+ "double", // 1143
+ "doubleclicknotify", // 1144
+ "doughnutChart", // 1145
+ "downBars", // 1146
+ "dpi", // 1147
+ "dr", // 1148
+ "draft", // 1149
+ "dragOff", // 1150
+ "dragToCol", // 1151
+ "dragToData", // 1152
+ "dragToPage", // 1153
+ "dragToRow", // 1154
+ "drawing", // 1155
+ "drawingGridHorizontalOrigin", // 1156
+ "drawingGridHorizontalSpacing", // 1157
+ "drawingGridVerticalOrigin", // 1158
+ "drawingGridVerticalSpacing", // 1159
+ "drop", // 1160
+ "dropCap", // 1161
+ "dropDownList", // 1162
+ "dropLines", // 1163
+ "dropauto", // 1164
+ "ds", // 1165
+ "dstrike", // 1166
+ "dt", // 1167
+ "dt2D", // 1168
+ "dtr", // 1169
+ "duotone", // 1170
+ "dur", // 1171
+ "dvAspect", // 1172
+ "dx", // 1173
+ "dxaOrig", // 1174
+ "dxf", // 1175
+ "dxfId", // 1176
+ "dxfs", // 1177
+ "dy", // 1178
+ "dyaOrig", // 1179
+ "dynamicAddress", // 1180
+ "dynamicFilter", // 1181
+ "dz", // 1182
+ "e", // 1183
+ "ea", // 1184
+ "eaLnBrk", // 1185
+ "eastAsia", // 1186
+ "eastAsiaTheme", // 1187
+ "eastAsianLayout", // 1188
+ "eb", // 1189
+ "ed", // 1190
+ "edGrp", // 1191
+ "edge", // 1192
+ "edit", // 1193
+ "editAs", // 1194
+ "editData", // 1195
+ "editPage", // 1196
+ "editas", // 1197
+ "edited", // 1198
+ "effect", // 1199
+ "effectClrLst", // 1200
+ "effectDag", // 1201
+ "effectExtent", // 1202
+ "effectLst", // 1203
+ "effectRef", // 1204
+ "effectStyle", // 1205
+ "effectStyleLst", // 1206
+ "element", // 1207
+ "else", // 1208
+ "em", // 1209
+ "embed", // 1210
+ "embedBold", // 1211
+ "embedBoldItalic", // 1212
+ "embedItalic", // 1213
+ "embedRegular", // 1214
+ "embedSystemFonts", // 1215
+ "embedTrueTypeFonts", // 1216
+ "embeddedFont", // 1217
+ "embeddedFontLst", // 1218
+ "emboss", // 1219
+ "embosscolor", // 1220
+ "empty", // 1221
+ "emptyCellReference", // 1222
+ "enableDrill", // 1223
+ "enableFieldProperties", // 1224
+ "enableFormatConditionsCalculation", // 1225
+ "enableRefresh", // 1226
+ "enableWizard", // 1227
+ "enabled", // 1228
+ "encoding", // 1229
+ "end", // 1230
+ "endA", // 1231
+ "endAngle", // 1232
+ "endChr", // 1233
+ "endCondLst", // 1234
+ "endCxn", // 1235
+ "endDate", // 1236
+ "endNum", // 1237
+ "endOfListFormulaUpdate", // 1238
+ "endParaRPr", // 1239
+ "endPos", // 1240
+ "endSnd", // 1241
+ "endSync", // 1242
+ "endarrow", // 1243
+ "endarrowlength", // 1244
+ "endarrowwidth", // 1245
+ "endcap", // 1246
+ "endnote", // 1247
+ "endnotePr", // 1248
+ "endnoteRef", // 1249
+ "endnoteReference", // 1250
+ "endnotes", // 1251
+ "enforcement", // 1252
+ "entries", // 1253
+ "entry", // 1254
+ "entryMacro", // 1255
+ "eol", // 1256
+ "eqArr", // 1257
+ "eqArrPr", // 1258
+ "eqn", // 1259
+ "equalAverage", // 1260
+ "equalWidth", // 1261
+ "equation", // 1262
+ "equationxml", // 1263
+ "err", // 1264
+ "errBarType", // 1265
+ "errBars", // 1266
+ "errDir", // 1267
+ "errValType", // 1268
+ "error", // 1269
+ "errorCaption", // 1270
+ "errorStyle", // 1271
+ "errorTitle", // 1272
+ "errors", // 1273
+ "evalError", // 1274
+ "evalOrder", // 1275
+ "evenAndOddHeaders", // 1276
+ "evenFooter", // 1277
+ "evenHeader", // 1278
+ "evt", // 1279
+ "evtFilter", // 1280
+ "excl", // 1281
+ "exclusive", // 1282
+ "exitMacro", // 1283
+ "exp", // 1284
+ "explosion", // 1285
+ "ext", // 1286
+ "extLst", // 1287
+ "extend", // 1288
+ "extendable", // 1289
+ "extent", // 1290
+ "externalBook", // 1291
+ "externalData", // 1292
+ "externalLink", // 1293
+ "externalReference", // 1294
+ "externalReferences", // 1295
+ "extraClrScheme", // 1296
+ "extraClrSchemeLst", // 1297
+ "extrusion", // 1298
+ "extrusionClr", // 1299
+ "extrusionH", // 1300
+ "extrusionOk", // 1301
+ "extrusioncolor", // 1302
+ "extrusionok", // 1303
+ "f", // 1304
+ "fHdr", // 1305
+ "fLocksText", // 1306
+ "fLocksWithSheet", // 1307
+ "fName", // 1308
+ "fPr", // 1309
+ "fPrintsWithSheet", // 1310
+ "fPublished", // 1311
+ "facet", // 1312
+ "fact", // 1313
+ "fade", // 1314
+ "fadeDir", // 1315
+ "family", // 1316
+ "fc", // 1317
+ "ffData", // 1318
+ "fgClr", // 1319
+ "fgColor", // 1320
+ "fi", // 1321
+ "field", // 1322
+ "fieldGroup", // 1323
+ "fieldId", // 1324
+ "fieldIdWrapped", // 1325
+ "fieldListSortAscending", // 1326
+ "fieldMapData", // 1327
+ "fieldPosition", // 1328
+ "fieldPrintTitles", // 1329
+ "fieldUsage", // 1330
+ "fieldsUsage", // 1331
+ "fileRecoveryPr", // 1332
+ "fileSharing", // 1333
+ "fileType", // 1334
+ "fileVersion", // 1335
+ "filetime", // 1336
+ "fill", // 1337
+ "fillClrLst", // 1338
+ "fillFormulas", // 1339
+ "fillId", // 1340
+ "fillOverlay", // 1341
+ "fillRect", // 1342
+ "fillRef", // 1343
+ "fillStyleLst", // 1344
+ "fillToRect", // 1345
+ "fillcolor", // 1346
+ "filled", // 1347
+ "fillok", // 1348
+ "fills", // 1349
+ "filltype", // 1350
+ "filter", // 1351
+ "filterColumn", // 1352
+ "filterMode", // 1353
+ "filterPrivacy", // 1354
+ "filterUnique", // 1355
+ "filterVal", // 1356
+ "filters", // 1357
+ "first", // 1358
+ "firstBackgroundRefresh", // 1359
+ "firstCol", // 1360
+ "firstDataCol", // 1361
+ "firstDataRow", // 1362
+ "firstFooter", // 1363
+ "firstHeader", // 1364
+ "firstHeaderRow", // 1365
+ "firstLine", // 1366
+ "firstLineChars", // 1367
+ "firstPageNumber", // 1368
+ "firstRow", // 1369
+ "firstSheet", // 1370
+ "firstSliceAng", // 1371
+ "firstSlideNum", // 1372
+ "fitText", // 1373
+ "fitToHeight", // 1374
+ "fitToPage", // 1375
+ "fitToWidth", // 1376
+ "fitpath", // 1377
+ "fitshape", // 1378
+ "flatBorders", // 1379
+ "flatTx", // 1380
+ "fld", // 1381
+ "fldChar", // 1382
+ "fldCharType", // 1383
+ "fldData", // 1384
+ "fldLock", // 1385
+ "fldSimple", // 1386
+ "flip", // 1387
+ "flipH", // 1388
+ "flipV", // 1389
+ "floor", // 1390
+ "fltVal", // 1391
+ "fmla", // 1392
+ "fmt", // 1393
+ "fmtId", // 1394
+ "fmtScheme", // 1395
+ "fmtid", // 1396
+ "focus", // 1397
+ "focusposition", // 1398
+ "focussize", // 1399
+ "folHlink", // 1400
+ "followColorScheme", // 1401
+ "followedHyperlink", // 1402
+ "font", // 1403
+ "fontAlgn", // 1404
+ "fontId", // 1405
+ "fontKey", // 1406
+ "fontRef", // 1407
+ "fontScale", // 1408
+ "fontScheme", // 1409
+ "fontSz", // 1410
+ "fonts", // 1411
+ "footer", // 1412
+ "footerReference", // 1413
+ "footnote", // 1414
+ "footnoteLayoutLikeWW8", // 1415
+ "footnotePr", // 1416
+ "footnoteRef", // 1417
+ "footnoteReference", // 1418
+ "footnotes", // 1419
+ "for", // 1420
+ "forEach", // 1421
+ "forName", // 1422
+ "forceAA", // 1423
+ "forceFullCalc", // 1424
+ "forceUpgrade", // 1425
+ "forcedash", // 1426
+ "foredepth", // 1427
+ "forgetLastTabAlignment", // 1428
+ "formProt", // 1429
+ "format", // 1430
+ "formatCells", // 1431
+ "formatCode", // 1432
+ "formatColumns", // 1433
+ "formatRows", // 1434
+ "formats", // 1435
+ "formatting", // 1436
+ "formsDesign", // 1437
+ "formula", // 1438
+ "formula1", // 1439
+ "formula2", // 1440
+ "formulaRange", // 1441
+ "formulas", // 1442
+ "forward", // 1443
+ "fov", // 1444
+ "frame", // 1445
+ "frameLayout", // 1446
+ "framePr", // 1447
+ "frameSlides", // 1448
+ "frameset", // 1449
+ "framesetSplitbar", // 1450
+ "from", // 1451
+ "fromWordArt", // 1452
+ "ftr", // 1453
+ "fullCalcOnLoad", // 1454
+ "fullDate", // 1455
+ "fullPrecision", // 1456
+ "fullScrn", // 1457
+ "func", // 1458
+ "funcPr", // 1459
+ "function", // 1460
+ "functionGroup", // 1461
+ "functionGroupId", // 1462
+ "functionGroups", // 1463
+ "futureMetadata", // 1464
+ "g", // 1465
+ "gain", // 1466
+ "gallery", // 1467
+ "gamma", // 1468
+ "gap", // 1469
+ "gapDepth", // 1470
+ "gapWidth", // 1471
+ "gd", // 1472
+ "gdLst", // 1473
+ "gdRefAng", // 1474
+ "gdRefR", // 1475
+ "gdRefX", // 1476
+ "gdRefY", // 1477
+ "gfxdata", // 1478
+ "ghostCol", // 1479
+ "ghostRow", // 1480
+ "glossaryDocument", // 1481
+ "glow", // 1482
+ "goal", // 1483
+ "gradFill", // 1484
+ "gradientFill", // 1485
+ "gradientshapeok", // 1486
+ "grammar", // 1487
+ "grandCol", // 1488
+ "grandRow", // 1489
+ "grandTotalCaption", // 1490
+ "graphic", // 1491
+ "graphicData", // 1492
+ "graphicEl", // 1493
+ "graphicFrame", // 1494
+ "graphicFrameLocks", // 1495
+ "gray", // 1496
+ "grayscale", // 1497
+ "grayscl", // 1498
+ "green", // 1499
+ "greenMod", // 1500
+ "greenOff", // 1501
+ "gridAfter", // 1502
+ "gridBefore", // 1503
+ "gridCol", // 1504
+ "gridDropZones", // 1505
+ "gridLines", // 1506
+ "gridLinesSet", // 1507
+ "gridSpacing", // 1508
+ "gridSpan", // 1509
+ "group", // 1510
+ "groupBy", // 1511
+ "groupChr", // 1512
+ "groupChrPr", // 1513
+ "groupInterval", // 1514
+ "groupItems", // 1515
+ "groupLevel", // 1516
+ "groupLevels", // 1517
+ "groupMember", // 1518
+ "groupMembers", // 1519
+ "grouping", // 1520
+ "groups", // 1521
+ "grow", // 1522
+ "growAutofit", // 1523
+ "growShrinkType", // 1524
+ "grpFill", // 1525
+ "grpId", // 1526
+ "grpSp", // 1527
+ "grpSpLocks", // 1528
+ "grpSpPr", // 1529
+ "gs", // 1530
+ "gsLst", // 1531
+ "gte", // 1532
+ "guid", // 1533
+ "guide", // 1534
+ "guideLst", // 1535
+ "gutter", // 1536
+ "gutterAtTop", // 1537
+ "h", // 1538
+ "hAnchor", // 1539
+ "hAnsi", // 1540
+ "hAnsiTheme", // 1541
+ "hMerge", // 1542
+ "hMode", // 1543
+ "hPercent", // 1544
+ "hR", // 1545
+ "hRule", // 1546
+ "hSpace", // 1547
+ "handles", // 1548
+ "handoutMaster", // 1549
+ "handoutMasterId", // 1550
+ "handoutMasterIdLst", // 1551
+ "hanging", // 1552
+ "hangingChars", // 1553
+ "hangingPunct", // 1554
+ "hasCustomPrompt", // 1555
+ "hash", // 1556
+ "hashData", // 1557
+ "hdr", // 1558
+ "hdrShapeDefaults", // 1559
+ "headEnd", // 1560
+ "header", // 1561
+ "headerFooter", // 1562
+ "headerReference", // 1563
+ "headerRowBorderDxfId", // 1564
+ "headerRowCellStyle", // 1565
+ "headerRowCount", // 1566
+ "headerRowDxfId", // 1567
+ "headerSource", // 1568
+ "headers", // 1569
+ "headersInLastRefresh", // 1570
+ "heading", // 1571
+ "headings", // 1572
+ "help", // 1573
+ "helpText", // 1574
+ "hf", // 1575
+ "hiLowLines", // 1576
+ "hidden", // 1577
+ "hiddenButton", // 1578
+ "hiddenColumn", // 1579
+ "hiddenColumns", // 1580
+ "hiddenLevel", // 1581
+ "hiddenRow", // 1582
+ "hiddenRows", // 1583
+ "hiddenSlides", // 1584
+ "hideBot", // 1585
+ "hideGeom", // 1586
+ "hideGrammaticalErrors", // 1587
+ "hideLastTrans", // 1588
+ "hideLeft", // 1589
+ "hideMark", // 1590
+ "hideNewItems", // 1591
+ "hidePivotFieldList", // 1592
+ "hideRight", // 1593
+ "hideSpellingErrors", // 1594
+ "hideTop", // 1595
+ "hier", // 1596
+ "hierBranch", // 1597
+ "hierarchy", // 1598
+ "hierarchyUsage", // 1599
+ "highlight", // 1600
+ "highlightClick", // 1601
+ "hint", // 1602
+ "history", // 1603
+ "hlink", // 1604
+ "hlinkClick", // 1605
+ "hlinkHover", // 1606
+ "hlinkMouseOver", // 1607
+ "holeSize", // 1608
+ "horizontal", // 1609
+ "horizontalCentered", // 1610
+ "horizontalDpi", // 1611
+ "horzAnchor", // 1612
+ "horzBarState", // 1613
+ "horzOverflow", // 1614
+ "hour", // 1615
+ "how", // 1616
+ "hps", // 1617
+ "hpsBaseText", // 1618
+ "hpsRaise", // 1619
+ "hr", // 1620
+ "hralign", // 1621
+ "href", // 1622
+ "hrnoshade", // 1623
+ "hrpct", // 1624
+ "hrstd", // 1625
+ "hsl", // 1626
+ "hslClr", // 1627
+ "ht", // 1628
+ "htmlFormat", // 1629
+ "htmlPubPr", // 1630
+ "htmlTables", // 1631
+ "hue", // 1632
+ "hueDir", // 1633
+ "hueMod", // 1634
+ "hueOff", // 1635
+ "hyperlink", // 1636
+ "hyperlinks", // 1637
+ "hyphenationZone", // 1638
+ "i", // 1639
+ "i1", // 1640
+ "i2", // 1641
+ "i3", // 1642
+ "i4", // 1643
+ "i8", // 1644
+ "iCs", // 1645
+ "iLevel", // 1646
+ "iMeasureFld", // 1647
+ "iMeasureHier", // 1648
+ "icon", // 1649
+ "iconFilter", // 1650
+ "iconId", // 1651
+ "iconSet", // 1652
+ "id", // 1653
+ "idcntr", // 1654
+ "iddest", // 1655
+ "idmap", // 1656
+ "idref", // 1657
+ "idsrc", // 1658
+ "idx", // 1659
+ "if", // 1660
+ "ignoreMixedContent", // 1661
+ "ignoredError", // 1662
+ "ignoredErrors", // 1663
+ "ilvl", // 1664
+ "image", // 1665
+ "imagealignshape", // 1666
+ "imageaspect", // 1667
+ "imagedata", // 1668
+ "imagesize", // 1669
+ "imeMode", // 1670
+ "imgH", // 1671
+ "imgSz", // 1672
+ "imgW", // 1673
+ "immersive", // 1674
+ "imprint", // 1675
+ "in", // 1676
+ "includeHiddenRowCol", // 1677
+ "includeNewItemsInFilter", // 1678
+ "includePrintSettings", // 1679
+ "ind", // 1680
+ "indent", // 1681
+ "index", // 1682
+ "indexed", // 1683
+ "indexedColors", // 1684
+ "initials", // 1685
+ "ink", // 1686
+ "inkAnnotations", // 1687
+ "inkTgt", // 1688
+ "inline", // 1689
+ "innerShdw", // 1690
+ "inputCells", // 1691
+ "ins", // 1692
+ "insDel", // 1693
+ "insertBlankRow", // 1694
+ "insertColumns", // 1695
+ "insertHyperlinks", // 1696
+ "insertPageBreak", // 1697
+ "insertRow", // 1698
+ "insertRowShift", // 1699
+ "insertRows", // 1700
+ "inset", // 1701
+ "insetmode", // 1702
+ "insetpen", // 1703
+ "insetpenok", // 1704
+ "insideH", // 1705
+ "insideV", // 1706
+ "instr", // 1707
+ "instrText", // 1708
+ "int", // 1709
+ "intLim", // 1710
+ "intVal", // 1711
+ "integer", // 1712
+ "interSp", // 1713
+ "intercept", // 1714
+ "intermediate", // 1715
+ "interval", // 1716
+ "intraSp", // 1717
+ "inv", // 1718
+ "invGamma", // 1719
+ "invalEndChars", // 1720
+ "invalStChars", // 1721
+ "invalid", // 1722
+ "invalidUrl", // 1723
+ "invertIfNegative", // 1724
+ "invx", // 1725
+ "invy", // 1726
+ "is", // 1727
+ "isLgl", // 1728
+ "isNarration", // 1729
+ "isPhoto", // 1730
+ "iscomment", // 1731
+ "issignatureline", // 1732
+ "italic", // 1733
+ "item", // 1734
+ "itemID", // 1735
+ "itemPageCount", // 1736
+ "itemPrintTitles", // 1737
+ "items", // 1738
+ "iterate", // 1739
+ "iterateCount", // 1740
+ "iterateDelta", // 1741
+ "jc", // 1742
+ "joinstyle", // 1743
+ "justifyLastLine", // 1744
+ "k", // 1745
+ "keepAlive", // 1746
+ "keepChangeHistory", // 1747
+ "keepLines", // 1748
+ "keepNext", // 1749
+ "kern", // 1750
+ "key", // 1751
+ "keyAttribute", // 1752
+ "kinsoku", // 1753
+ "kiosk", // 1754
+ "kpi", // 1755
+ "kpis", // 1756
+ "kumimoji", // 1757
+ "kx", // 1758
+ "ky", // 1759
+ "l", // 1760
+ "lBounds", // 1761
+ "lIns", // 1762
+ "lMargin", // 1763
+ "label", // 1764
+ "labelOnly", // 1765
+ "lang", // 1766
+ "lastClr", // 1767
+ "lastCol", // 1768
+ "lastEdited", // 1769
+ "lastGuid", // 1770
+ "lastIdx", // 1771
+ "lastRenderedPageBreak", // 1772
+ "lastRow", // 1773
+ "lastValue", // 1774
+ "lastView", // 1775
+ "lat", // 1776
+ "latentStyles", // 1777
+ "latin", // 1778
+ "latinLnBrk", // 1779
+ "layout", // 1780
+ "layoutDef", // 1781
+ "layoutDefHdr", // 1782
+ "layoutDefHdrLst", // 1783
+ "layoutInCell", // 1784
+ "layoutNode", // 1785
+ "layoutRawTableWidth", // 1786
+ "layoutTableRowsApart", // 1787
+ "layoutTarget", // 1788
+ "lblAlgn", // 1789
+ "lblOffset", // 1790
+ "leader", // 1791
+ "leaderLines", // 1792
+ "left", // 1793
+ "leftChars", // 1794
+ "leftFromText", // 1795
+ "leftLabels", // 1796
+ "legacy", // 1797
+ "legacyDrawing", // 1798
+ "legacyDrawingHF", // 1799
+ "legacyIndent", // 1800
+ "legacySpace", // 1801
+ "legend", // 1802
+ "legendEntry", // 1803
+ "legendPos", // 1804
+ "len", // 1805
+ "length", // 1806
+ "lengthspecified", // 1807
+ "level", // 1808
+ "lid", // 1809
+ "lightRig", // 1810
+ "lightface", // 1811
+ "lightharsh", // 1812
+ "lightharsh2", // 1813
+ "lightlevel", // 1814
+ "lightlevel2", // 1815
+ "lightposition", // 1816
+ "lightposition2", // 1817
+ "lim", // 1818
+ "limLoc", // 1819
+ "limLow", // 1820
+ "limLowPr", // 1821
+ "limUpp", // 1822
+ "limUppPr", // 1823
+ "limo", // 1824
+ "lin", // 1825
+ "linClrLst", // 1826
+ "line", // 1827
+ "line3DChart", // 1828
+ "lineChart", // 1829
+ "linePitch", // 1830
+ "lineRule", // 1831
+ "lineTo", // 1832
+ "lineWrapLikeWord6", // 1833
+ "lines", // 1834
+ "linestyle", // 1835
+ "link", // 1836
+ "linkStyles", // 1837
+ "linkTarget", // 1838
+ "linkToQuery", // 1839
+ "linkedToFile", // 1840
+ "listDataValidation", // 1841
+ "listEntry", // 1842
+ "listItem", // 1843
+ "listSeparator", // 1844
+ "lit", // 1845
+ "lkTxEntry", // 1846
+ "ln", // 1847
+ "lnB", // 1848
+ "lnBlToTr", // 1849
+ "lnDef", // 1850
+ "lnL", // 1851
+ "lnNumType", // 1852
+ "lnR", // 1853
+ "lnRef", // 1854
+ "lnSpc", // 1855
+ "lnSpcReduction", // 1856
+ "lnStyleLst", // 1857
+ "lnT", // 1858
+ "lnTlToBr", // 1859
+ "lnTo", // 1860
+ "lo", // 1861
+ "loCatId", // 1862
+ "loTypeId", // 1863
+ "local", // 1864
+ "localConnection", // 1865
+ "localRefresh", // 1866
+ "localSheetId", // 1867
+ "location", // 1868
+ "lock", // 1869
+ "lockRevision", // 1870
+ "lockStructure", // 1871
+ "lockWindows", // 1872
+ "locked", // 1873
+ "lockedCanvas", // 1874
+ "lockrotationcenter", // 1875
+ "logBase", // 1876
+ "lon", // 1877
+ "longFileNames", // 1878
+ "longText", // 1879
+ "loop", // 1880
+ "lowestEdited", // 1881
+ "lpstr", // 1882
+ "lpwstr", // 1883
+ "lsdException", // 1884
+ "lstStyle", // 1885
+ "lt1", // 1886
+ "lt2", // 1887
+ "lum", // 1888
+ "lumMod", // 1889
+ "lumOff", // 1890
+ "lvl", // 1891
+ "lvl1pPr", // 1892
+ "lvl2pPr", // 1893
+ "lvl3pPr", // 1894
+ "lvl4pPr", // 1895
+ "lvl5pPr", // 1896
+ "lvl6pPr", // 1897
+ "lvl7pPr", // 1898
+ "lvl8pPr", // 1899
+ "lvl9pPr", // 1900
+ "lvlJc", // 1901
+ "lvlOverride", // 1902
+ "lvlPicBulletId", // 1903
+ "lvlRestart", // 1904
+ "lvlText", // 1905
+ "m", // 1906
+ "mPr", // 1907
+ "macro", // 1908
+ "mailAsAttachment", // 1909
+ "mailMerge", // 1910
+ "mailSubject", // 1911
+ "main", // 1912
+ "mainDocumentType", // 1913
+ "majorFont", // 1914
+ "majorGridlines", // 1915
+ "majorTickMark", // 1916
+ "majorTimeUnit", // 1917
+ "majorUnit", // 1918
+ "man", // 1919
+ "manifestLocation", // 1920
+ "manualBreakCount", // 1921
+ "manualLayout", // 1922
+ "map", // 1923
+ "mapId", // 1924
+ "mappedName", // 1925
+ "mappingCount", // 1926
+ "maps", // 1927
+ "marB", // 1928
+ "marBottom", // 1929
+ "marH", // 1930
+ "marL", // 1931
+ "marLeft", // 1932
+ "marR", // 1933
+ "marRight", // 1934
+ "marT", // 1935
+ "marTop", // 1936
+ "marW", // 1937
+ "marker", // 1938
+ "markup", // 1939
+ "master", // 1940
+ "masterClrMapping", // 1941
+ "masterRel", // 1942
+ "matchSrc", // 1943
+ "matchingName", // 1944
+ "mathFont", // 1945
+ "mathPr", // 1946
+ "matrix", // 1947
+ "max", // 1948
+ "maxAng", // 1949
+ "maxDate", // 1950
+ "maxDist", // 1951
+ "maxLength", // 1952
+ "maxR", // 1953
+ "maxRId", // 1954
+ "maxRank", // 1955
+ "maxSheetId", // 1956
+ "maxSubtotal", // 1957
+ "maxVal", // 1958
+ "maxValue", // 1959
+ "maxX", // 1960
+ "maxY", // 1961
+ "maximized", // 1962
+ "mc", // 1963
+ "mcJc", // 1964
+ "mcPr", // 1965
+ "mcs", // 1966
+ "mdx", // 1967
+ "mdxMetadata", // 1968
+ "mdxSubqueries", // 1969
+ "measure", // 1970
+ "measureFilter", // 1971
+ "measureGroup", // 1972
+ "measureGroups", // 1973
+ "measures", // 1974
+ "member", // 1975
+ "memberName", // 1976
+ "memberPropertyField", // 1977
+ "memberValueDatatype", // 1978
+ "members", // 1979
+ "merge", // 1980
+ "mergeCell", // 1981
+ "mergeCells", // 1982
+ "mergeInterval", // 1983
+ "mergeItem", // 1984
+ "metadata", // 1985
+ "metadataStrings", // 1986
+ "metadataType", // 1987
+ "metadataTypes", // 1988
+ "metal", // 1989
+ "meth", // 1990
+ "method", // 1991
+ "min", // 1992
+ "minAng", // 1993
+ "minDate", // 1994
+ "minLength", // 1995
+ "minR", // 1996
+ "minRId", // 1997
+ "minRefreshableVersion", // 1998
+ "minSubtotal", // 1999
+ "minSupportedVersion", // 2000
+ "minValue", // 2001
+ "minVer", // 2002
+ "minX", // 2003
+ "minY", // 2004
+ "minimized", // 2005
+ "minimumVersion", // 2006
+ "minorFont", // 2007
+ "minorGridlines", // 2008
+ "minorTickMark", // 2009
+ "minorTimeUnit", // 2010
+ "minorUnit", // 2011
+ "minus", // 2012
+ "minusx", // 2013
+ "minusy", // 2014
+ "minute", // 2015
+ "mirrorIndents", // 2016
+ "mirrorMargins", // 2017
+ "missingCaption", // 2018
+ "missingItemsLimit", // 2019
+ "miter", // 2020
+ "miterlimit", // 2021
+ "mod", // 2022
+ "modelId", // 2023
+ "modifyVerifier", // 2024
+ "month", // 2025
+ "monthLong", // 2026
+ "monthShort", // 2027
+ "moveFrom", // 2028
+ "moveFromRangeEnd", // 2029
+ "moveFromRangeStart", // 2030
+ "moveTo", // 2031
+ "moveToRangeEnd", // 2032
+ "moveToRangeStart", // 2033
+ "moveWith", // 2034
+ "movie", // 2035
+ "mp", // 2036
+ "mpFld", // 2037
+ "mpMap", // 2038
+ "mps", // 2039
+ "mr", // 2040
+ "mruColors", // 2041
+ "ms", // 2042
+ "multiLevelType", // 2043
+ "multiLine", // 2044
+ "multiLvlStrCache", // 2045
+ "multiLvlStrRef", // 2046
+ "multipleFieldFilters", // 2047
+ "multipleItemSelectionAllowed", // 2048
+ "mute", // 2049
+ "mwSmallCaps", // 2050
+ "n", // 2051
+ "name", // 2052
+ "nameLen", // 2053
+ "namespaceUri", // 2054
+ "namespaceuri", // 2055
+ "nary", // 2056
+ "naryLim", // 2057
+ "naryPr", // 2058
+ "nc", // 2059
+ "ndxf", // 2060
+ "neCell", // 2061
+ "new", // 2062
+ "newLength", // 2063
+ "newName", // 2064
+ "newsflash", // 2065
+ "next", // 2066
+ "nextAc", // 2067
+ "nextCondLst", // 2068
+ "nextId", // 2069
+ "nf", // 2070
+ "nlCheck", // 2071
+ "noAdjustHandles", // 2072
+ "noAutofit", // 2073
+ "noBorder", // 2074
+ "noBreak", // 2075
+ "noBreakHyphen", // 2076
+ "noChangeArrowheads", // 2077
+ "noChangeAspect", // 2078
+ "noChangeShapeType", // 2079
+ "noColumnBalance", // 2080
+ "noCrop", // 2081
+ "noDrilldown", // 2082
+ "noEditPoints", // 2083
+ "noEndCap", // 2084
+ "noEndnote", // 2085
+ "noExtraLineSpacing", // 2086
+ "noFill", // 2087
+ "noGrp", // 2088
+ "noLabel", // 2089
+ "noLeading", // 2090
+ "noLineBreaksAfter", // 2091
+ "noLineBreaksBefore", // 2092
+ "noMove", // 2093
+ "noMultiLvlLbl", // 2094
+ "noProof", // 2095
+ "noPunctuationKerning", // 2096
+ "noResize", // 2097
+ "noResizeAllowed", // 2098
+ "noRot", // 2099
+ "noSelect", // 2100
+ "noSpaceRaiseLower", // 2101
+ "noTabHangInd", // 2102
+ "noTextEdit", // 2103
+ "noUngrp", // 2104
+ "noWrap", // 2105
+ "nodePh", // 2106
+ "nodeType", // 2107
+ "nonAutoSortDefault", // 2108
+ "nor", // 2109
+ "norm", // 2110
+ "normAutofit", // 2111
+ "normalViewPr", // 2112
+ "normalizeH", // 2113
+ "notTrueType", // 2114
+ "notes", // 2115
+ "notesMaster", // 2116
+ "notesMasterId", // 2117
+ "notesMasterIdLst", // 2118
+ "notesStyle", // 2119
+ "notesSz", // 2120
+ "notesTextViewPr", // 2121
+ "notesViewPr", // 2122
+ "np", // 2123
+ "ns", // 2124
+ "nsid", // 2125
+ "null", // 2126
+ "num", // 2127
+ "numCache", // 2128
+ "numCol", // 2129
+ "numFmt", // 2130
+ "numFmtId", // 2131
+ "numFmts", // 2132
+ "numId", // 2133
+ "numIdMacAtCleanup", // 2134
+ "numLit", // 2135
+ "numPicBullet", // 2136
+ "numPicBulletId", // 2137
+ "numPr", // 2138
+ "numRef", // 2139
+ "numRestart", // 2140
+ "numSld", // 2141
+ "numStart", // 2142
+ "numStyleLink", // 2143
+ "numberStoredAsText", // 2144
+ "numbering", // 2145
+ "numberingChange", // 2146
+ "nvCxnSpPr", // 2147
+ "nvGraphicFramePr", // 2148
+ "nvGrpSpPr", // 2149
+ "nvPicPr", // 2150
+ "nvPr", // 2151
+ "nvSpPr", // 2152
+ "nwCell", // 2153
+ "o", // 2154
+ "oMath", // 2155
+ "oMathPara", // 2156
+ "oMathParaPr", // 2157
+ "objDist", // 2158
+ "object", // 2159
+ "objectDefaults", // 2160
+ "objects", // 2161
+ "oblob", // 2162
+ "obscured", // 2163
+ "oc", // 2164
+ "odcFile", // 2165
+ "oddFooter", // 2166
+ "oddHeader", // 2167
+ "odso", // 2168
+ "odxf", // 2169
+ "ofPieChart", // 2170
+ "ofPieType", // 2171
+ "off", // 2172
+ "offset", // 2173
+ "offset2", // 2174
+ "offsetFrom", // 2175
+ "olapPr", // 2176
+ "old", // 2177
+ "oldComment", // 2178
+ "oldCustomMenu", // 2179
+ "oldDescription", // 2180
+ "oldFormula", // 2181
+ "oldFunction", // 2182
+ "oldFunctionGroupId", // 2183
+ "oldHelp", // 2184
+ "oldHidden", // 2185
+ "oldLength", // 2186
+ "oldName", // 2187
+ "oldPh", // 2188
+ "oldQuotePrefix", // 2189
+ "oldShortcutKey", // 2190
+ "oldStatusBar", // 2191
+ "ole", // 2192
+ "oleChartEl", // 2193
+ "oleItem", // 2194
+ "oleItems", // 2195
+ "oleLink", // 2196
+ "oleObj", // 2197
+ "oleObject", // 2198
+ "oleObjects", // 2199
+ "oleSize", // 2200
+ "oleUpdate", // 2201
+ "oleicon", // 2202
+ "oleid", // 2203
+ "on", // 2204
+ "oneCellAnchor", // 2205
+ "oneField", // 2206
+ "oned", // 2207
+ "onlySync", // 2208
+ "onlyUseConnectionFile", // 2209
+ "op", // 2210
+ "opEmu", // 2211
+ "opacity", // 2212
+ "opacity2", // 2213
+ "operator", // 2214
+ "optimizeForBrowser", // 2215
+ "optimizeMemory", // 2216
+ "order", // 2217
+ "orgChart", // 2218
+ "organizeInFolders", // 2219
+ "orient", // 2220
+ "orientation", // 2221
+ "orientationangle", // 2222
+ "origin", // 2223
+ "original", // 2224
+ "ostorage", // 2225
+ "ostream", // 2226
+ "other", // 2227
+ "otherStyle", // 2228
+ "outerShdw", // 2229
+ "outline", // 2230
+ "outlineData", // 2231
+ "outlineLevel", // 2232
+ "outlineLevelCol", // 2233
+ "outlineLevelRow", // 2234
+ "outlineLvl", // 2235
+ "outlinePr", // 2236
+ "outlineSymbols", // 2237
+ "outlineViewPr", // 2238
+ "oval", // 2239
+ "overflowPunct", // 2240
+ "overlap", // 2241
+ "overlay", // 2242
+ "override", // 2243
+ "overrideClrMapping", // 2244
+ "p", // 2245
+ "pBdr", // 2246
+ "pLen", // 2247
+ "pPos", // 2248
+ "pPr", // 2249
+ "pPrChange", // 2250
+ "pPrDefault", // 2251
+ "pRg", // 2252
+ "pStyle", // 2253
+ "page", // 2254
+ "pageBreakBefore", // 2255
+ "pageField", // 2256
+ "pageFields", // 2257
+ "pageItem", // 2258
+ "pageMargins", // 2259
+ "pageOrder", // 2260
+ "pageOverThenDown", // 2261
+ "pageSetUpPr", // 2262
+ "pageSetup", // 2263
+ "pageStyle", // 2264
+ "pageWrap", // 2265
+ "pages", // 2266
+ "pane", // 2267
+ "panose", // 2268
+ "panose1", // 2269
+ "paperSize", // 2270
+ "paperSrc", // 2271
+ "par", // 2272
+ "parTransId", // 2273
+ "param", // 2274
+ "parameter", // 2275
+ "parameterType", // 2276
+ "parameters", // 2277
+ "parent", // 2278
+ "parentSet", // 2279
+ "parsePre", // 2280
+ "password", // 2281
+ "pasteAll", // 2282
+ "pasteBorders", // 2283
+ "pasteColWidths", // 2284
+ "pasteComments", // 2285
+ "pasteDataValidation", // 2286
+ "pasteFormats", // 2287
+ "pasteFormulas", // 2288
+ "pasteNumberFormats", // 2289
+ "pasteValues", // 2290
+ "path", // 2291
+ "pathEditMode", // 2292
+ "pathLst", // 2293
+ "pattFill", // 2294
+ "patternFill", // 2295
+ "patternType", // 2296
+ "penClr", // 2297
+ "percent", // 2298
+ "period", // 2299
+ "permEnd", // 2300
+ "permStart", // 2301
+ "personal", // 2302
+ "personalCompose", // 2303
+ "personalReply", // 2304
+ "personalView", // 2305
+ "perspective", // 2306
+ "pgBorders", // 2307
+ "pgMar", // 2308
+ "pgNum", // 2309
+ "pgNumType", // 2310
+ "pgSz", // 2311
+ "ph", // 2312
+ "phant", // 2313
+ "phantPr", // 2314
+ "phldr", // 2315
+ "phldrT", // 2316
+ "phonetic", // 2317
+ "phoneticPr", // 2318
+ "photoAlbum", // 2319
+ "pic", // 2320
+ "picLocks", // 2321
+ "pict", // 2322
+ "picture", // 2323
+ "pictureFormat", // 2324
+ "pictureOptions", // 2325
+ "pictureStackUnit", // 2326
+ "pid", // 2327
+ "pie3DChart", // 2328
+ "pieChart", // 2329
+ "pitch", // 2330
+ "pitchFamily", // 2331
+ "pivot", // 2332
+ "pivotArea", // 2333
+ "pivotAreas", // 2334
+ "pivotButton", // 2335
+ "pivotCache", // 2336
+ "pivotCacheDefinition", // 2337
+ "pivotCacheRecords", // 2338
+ "pivotCaches", // 2339
+ "pivotField", // 2340
+ "pivotFields", // 2341
+ "pivotFmt", // 2342
+ "pivotFmts", // 2343
+ "pivotHierarchies", // 2344
+ "pivotHierarchy", // 2345
+ "pivotSelection", // 2346
+ "pivotSource", // 2347
+ "pivotTableDefinition", // 2348
+ "pivotTableStyle", // 2349
+ "pivotTableStyleInfo", // 2350
+ "pivotTables", // 2351
+ "pixelsPerInch", // 2352
+ "placeholder", // 2353
+ "plane", // 2354
+ "plcHide", // 2355
+ "plotArea", // 2356
+ "plotVisOnly", // 2357
+ "plus", // 2358
+ "points", // 2359
+ "polar", // 2360
+ "polyline", // 2361
+ "pos", // 2362
+ "posOffset", // 2363
+ "position", // 2364
+ "positionH", // 2365
+ "positionV", // 2366
+ "post", // 2367
+ "postSp", // 2368
+ "prLst", // 2369
+ "prSet", // 2370
+ "preSp", // 2371
+ "preferPic", // 2372
+ "preferRelativeResize", // 2373
+ "preferSingleView", // 2374
+ "preferrelative", // 2375
+ "prefixMappings", // 2376
+ "presAssocID", // 2377
+ "presId", // 2378
+ "presLayoutVars", // 2379
+ "presName", // 2380
+ "presOf", // 2381
+ "presStyleCnt", // 2382
+ "presStyleIdx", // 2383
+ "presStyleLbl", // 2384
+ "present", // 2385
+ "presentation", // 2386
+ "presentationPr", // 2387
+ "preserve", // 2388
+ "preserveFormatting", // 2389
+ "preserveHistory", // 2390
+ "preserveSortFilterLayout", // 2391
+ "presetClass", // 2392
+ "presetID", // 2393
+ "presetSubtype", // 2394
+ "prevAc", // 2395
+ "prevCondLst", // 2396
+ "previousCol", // 2397
+ "previousRow", // 2398
+ "pri", // 2399
+ "print", // 2400
+ "printArea", // 2401
+ "printBodyTextBeforeHeader", // 2402
+ "printColBlack", // 2403
+ "printDrill", // 2404
+ "printFormsData", // 2405
+ "printFractionalCharacterWidth", // 2406
+ "printOptions", // 2407
+ "printPostScriptOverText", // 2408
+ "printSettings", // 2409
+ "printTwoOnOne", // 2410
+ "printerSettings", // 2411
+ "priority", // 2412
+ "prnPr", // 2413
+ "prnWhat", // 2414
+ "productSubtotal", // 2415
+ "progId", // 2416
+ "progress", // 2417
+ "prompt", // 2418
+ "promptTitle", // 2419
+ "promptedSolutions", // 2420
+ "proofErr", // 2421
+ "proofState", // 2422
+ "property", // 2423
+ "propertyName", // 2424
+ "protected", // 2425
+ "protectedRange", // 2426
+ "protectedRanges", // 2427
+ "protection", // 2428
+ "provid", // 2429
+ "proxy", // 2430
+ "prst", // 2431
+ "prstClr", // 2432
+ "prstDash", // 2433
+ "prstGeom", // 2434
+ "prstMaterial", // 2435
+ "prstShdw", // 2436
+ "prstTxWarp", // 2437
+ "pt", // 2438
+ "ptCount", // 2439
+ "ptLst", // 2440
+ "ptType", // 2441
+ "ptab", // 2442
+ "ptsTypes", // 2443
+ "pubBrowser", // 2444
+ "publishItems", // 2445
+ "publishToServer", // 2446
+ "published", // 2447
+ "pull", // 2448
+ "push", // 2449
+ "qFormat", // 2450
+ "qs", // 2451
+ "qsCatId", // 2452
+ "qsTypeId", // 2453
+ "quadBezTo", // 2454
+ "qualifier", // 2455
+ "query", // 2456
+ "queryCache", // 2457
+ "queryFailed", // 2458
+ "queryTable", // 2459
+ "queryTableDeletedFields", // 2460
+ "queryTableField", // 2461
+ "queryTableFieldId", // 2462
+ "queryTableFields", // 2463
+ "queryTableRefresh", // 2464
+ "quickTimeFile", // 2465
+ "quotePrefix", // 2466
+ "r", // 2467
+ "r1", // 2468
+ "r2", // 2469
+ "r4", // 2470
+ "r8", // 2471
+ "rAng", // 2472
+ "rAngAx", // 2473
+ "rCtr", // 2474
+ "rFont", // 2475
+ "rFonts", // 2476
+ "rId", // 2477
+ "rIns", // 2478
+ "rMargin", // 2479
+ "rPh", // 2480
+ "rPr", // 2481
+ "rPrChange", // 2482
+ "rPrDefault", // 2483
+ "rSp", // 2484
+ "rSpRule", // 2485
+ "rStyle", // 2486
+ "ra", // 2487
+ "rad", // 2488
+ "radPr", // 2489
+ "radarChart", // 2490
+ "radarStyle", // 2491
+ "radiusrange", // 2492
+ "raf", // 2493
+ "random", // 2494
+ "randomBar", // 2495
+ "rangePr", // 2496
+ "rangeSet", // 2497
+ "rangeSets", // 2498
+ "rank", // 2499
+ "rankBy", // 2500
+ "rc", // 2501
+ "rcc", // 2502
+ "rcft", // 2503
+ "rcmt", // 2504
+ "rctx", // 2505
+ "rcv", // 2506
+ "rdn", // 2507
+ "readModeInkLockDown", // 2508
+ "readOnlyRecommended", // 2509
+ "readingOrder", // 2510
+ "recipientData", // 2511
+ "recipients", // 2512
+ "recolor", // 2513
+ "recolortarget", // 2514
+ "recommended", // 2515
+ "reconnectionMethod", // 2516
+ "recordCount", // 2517
+ "rect", // 2518
+ "red", // 2519
+ "redMod", // 2520
+ "redOff", // 2521
+ "ref", // 2522
+ "ref3D", // 2523
+ "refFor", // 2524
+ "refForName", // 2525
+ "refMode", // 2526
+ "refPtType", // 2527
+ "refType", // 2528
+ "reference", // 2529
+ "references", // 2530
+ "refersTo", // 2531
+ "reflection", // 2532
+ "refreshAllConnections", // 2533
+ "refreshError", // 2534
+ "refreshOnChange", // 2535
+ "refreshOnLoad", // 2536
+ "refreshedBy", // 2537
+ "refreshedDate", // 2538
+ "refreshedVersion", // 2539
+ "regroupid", // 2540
+ "regrouptable", // 2541
+ "regular", // 2542
+ "rel", // 2543
+ "relIds", // 2544
+ "relOff", // 2545
+ "relSizeAnchor", // 2546
+ "relation", // 2547
+ "relationtable", // 2548
+ "relative", // 2549
+ "relativeFrom", // 2550
+ "relativeHeight", // 2551
+ "relativeIndent", // 2552
+ "relativeTo", // 2553
+ "relid", // 2554
+ "relyOnVML", // 2555
+ "relyOnVml", // 2556
+ "removeDataOnSave", // 2557
+ "removeDateAndTime", // 2558
+ "removePersonalInfoOnSave", // 2559
+ "removePersonalInformation", // 2560
+ "render", // 2561
+ "repairLoad", // 2562
+ "repeatCount", // 2563
+ "repeatDur", // 2564
+ "resId", // 2565
+ "reservationPassword", // 2566
+ "resizeGraphics", // 2567
+ "resizeHandles", // 2568
+ "restart", // 2569
+ "restoredLeft", // 2570
+ "restoredTop", // 2571
+ "result", // 2572
+ "rev", // 2573
+ "reverse", // 2574
+ "reviewed", // 2575
+ "reviewedList", // 2576
+ "revisionId", // 2577
+ "revisionView", // 2578
+ "revisions", // 2579
+ "revisionsPassword", // 2580
+ "rfmt", // 2581
+ "rgb", // 2582
+ "rgbColor", // 2583
+ "rich", // 2584
+ "richText", // 2585
+ "rig", // 2586
+ "right", // 2587
+ "rightChars", // 2588
+ "rightFromText", // 2589
+ "rightToLeft", // 2590
+ "ris", // 2591
+ "rm", // 2592
+ "rot", // 2593
+ "rotWithShape", // 2594
+ "rotX", // 2595
+ "rotY", // 2596
+ "rotate", // 2597
+ "rotation", // 2598
+ "rotationangle", // 2599
+ "rotationcenter", // 2600
+ "round", // 2601
+ "roundedCorners", // 2602
+ "roundrect", // 2603
+ "row", // 2604
+ "rowBreaks", // 2605
+ "rowColShift", // 2606
+ "rowDrillCount", // 2607
+ "rowFields", // 2608
+ "rowGrandTotals", // 2609
+ "rowHeaderCaption", // 2610
+ "rowHierarchiesUsage", // 2611
+ "rowHierarchyUsage", // 2612
+ "rowItems", // 2613
+ "rowNumbers", // 2614
+ "rowOff", // 2615
+ "rowPageCount", // 2616
+ "rowSpan", // 2617
+ "rows", // 2618
+ "rqt", // 2619
+ "rrc", // 2620
+ "rsid", // 2621
+ "rsidDel", // 2622
+ "rsidP", // 2623
+ "rsidR", // 2624
+ "rsidRDefault", // 2625
+ "rsidRPr", // 2626
+ "rsidRoot", // 2627
+ "rsidSect", // 2628
+ "rsidTr", // 2629
+ "rsids", // 2630
+ "rsnm", // 2631
+ "rt", // 2632
+ "rtl", // 2633
+ "rtlCol", // 2634
+ "rtlGutter", // 2635
+ "rtn", // 2636
+ "ruby", // 2637
+ "rubyAlign", // 2638
+ "rubyBase", // 2639
+ "rubyPr", // 2640
+ "rule", // 2641
+ "ruleLst", // 2642
+ "rules", // 2643
+ "rupBuild", // 2644
+ "s", // 2645
+ "sId", // 2646
+ "sPre", // 2647
+ "sPrePr", // 2648
+ "sSub", // 2649
+ "sSubPr", // 2650
+ "sSubSup", // 2651
+ "sSubSupPr", // 2652
+ "sSup", // 2653
+ "sSupPr", // 2654
+ "salt", // 2655
+ "saltData", // 2656
+ "sampData", // 2657
+ "sat", // 2658
+ "satMod", // 2659
+ "satOff", // 2660
+ "saveData", // 2661
+ "saveExternalLinkValues", // 2662
+ "saveFormsData", // 2663
+ "saveInvalidXml", // 2664
+ "savePassword", // 2665
+ "savePreviewPicture", // 2666
+ "saveSmartTagsAsXml", // 2667
+ "saveSubsetFonts", // 2668
+ "saveThroughXslt", // 2669
+ "saveXmlDataOnly", // 2670
+ "sb", // 2671
+ "scale", // 2672
+ "scaleToFitPaper", // 2673
+ "scaleWithDoc", // 2674
+ "scaled", // 2675
+ "scaling", // 2676
+ "scatterChart", // 2677
+ "scatterStyle", // 2678
+ "scenario", // 2679
+ "scenarios", // 2680
+ "scene3d", // 2681
+ "schema", // 2682
+ "schemaLibrary", // 2683
+ "schemaLocation", // 2684
+ "schemaRef", // 2685
+ "schemaRefs", // 2686
+ "scheme", // 2687
+ "schemeClr", // 2688
+ "scope", // 2689
+ "scr", // 2690
+ "scrgbClr", // 2691
+ "script", // 2692
+ "scrollbar", // 2693
+ "sd", // 2694
+ "sdt", // 2695
+ "sdtContent", // 2696
+ "sdtEndPr", // 2697
+ "sdtPr", // 2698
+ "seCell", // 2699
+ "second", // 2700
+ "secondPiePt", // 2701
+ "secondPieSize", // 2702
+ "sectPr", // 2703
+ "sectPrChange", // 2704
+ "securityDescriptor", // 2705
+ "selectFldWithFirstOrLastChar", // 2706
+ "selectLockedCells", // 2707
+ "selectUnlockedCells", // 2708
+ "selected", // 2709
+ "selection", // 2710
+ "semiHidden", // 2711
+ "semicolon", // 2712
+ "sendLocale", // 2713
+ "sep", // 2714
+ "sepChr", // 2715
+ "separator", // 2716
+ "seq", // 2717
+ "ser", // 2718
+ "serAx", // 2719
+ "serLines", // 2720
+ "series", // 2721
+ "seriesIdx", // 2722
+ "serverCommand", // 2723
+ "serverField", // 2724
+ "serverFill", // 2725
+ "serverFont", // 2726
+ "serverFontColor", // 2727
+ "serverFormat", // 2728
+ "serverFormats", // 2729
+ "serverNumberFormat", // 2730
+ "serverSldId", // 2731
+ "serverSldModifiedTime", // 2732
+ "serverZoom", // 2733
+ "set", // 2734
+ "setDefinition", // 2735
+ "sets", // 2736
+ "settings", // 2737
+ "shade", // 2738
+ "shadeToTitle", // 2739
+ "shadow", // 2740
+ "shadowcolor", // 2741
+ "shadowok", // 2742
+ "shape", // 2743
+ "shapeDefaults", // 2744
+ "shapeId", // 2745
+ "shapeLayoutLikeWW8", // 2746
+ "shapedefaults", // 2747
+ "shapeid", // 2748
+ "shapelayout", // 2749
+ "shapetype", // 2750
+ "shared", // 2751
+ "sharedItems", // 2752
+ "shd", // 2753
+ "sheet", // 2754
+ "sheetCalcPr", // 2755
+ "sheetData", // 2756
+ "sheetDataSet", // 2757
+ "sheetFormatPr", // 2758
+ "sheetId", // 2759
+ "sheetIdMap", // 2760
+ "sheetName", // 2761
+ "sheetNames", // 2762
+ "sheetPosition", // 2763
+ "sheetPr", // 2764
+ "sheetProtection", // 2765
+ "sheetView", // 2766
+ "sheetViews", // 2767
+ "sheets", // 2768
+ "shininess", // 2769
+ "shortcutKey", // 2770
+ "show", // 2771
+ "showAll", // 2772
+ "showAnimation", // 2773
+ "showAsCaption", // 2774
+ "showAsIcon", // 2775
+ "showAutoFilter", // 2776
+ "showBorderUnselectedTables", // 2777
+ "showBreaksInFrames", // 2778
+ "showBubbleSize", // 2779
+ "showButton", // 2780
+ "showCalcMbrs", // 2781
+ "showCaptions", // 2782
+ "showCatName", // 2783
+ "showCell", // 2784
+ "showColHeaders", // 2785
+ "showColStripes", // 2786
+ "showColumnStripes", // 2787
+ "showComments", // 2788
+ "showDLblsOverMax", // 2789
+ "showDataAs", // 2790
+ "showDataDropDown", // 2791
+ "showDataTips", // 2792
+ "showDrill", // 2793
+ "showDropDown", // 2794
+ "showDropDowns", // 2795
+ "showDropZones", // 2796
+ "showEmptyCol", // 2797
+ "showEmptyRow", // 2798
+ "showEnvelope", // 2799
+ "showError", // 2800
+ "showErrorMessage", // 2801
+ "showFirstColumn", // 2802
+ "showFormatting", // 2803
+ "showFormulaBar", // 2804
+ "showFormulas", // 2805
+ "showGridLines", // 2806
+ "showGuides", // 2807
+ "showHeader", // 2808
+ "showHeaders", // 2809
+ "showHorizontalScroll", // 2810
+ "showHorzBorder", // 2811
+ "showInFieldList", // 2812
+ "showInkAnnotation", // 2813
+ "showInputMessage", // 2814
+ "showItems", // 2815
+ "showKeys", // 2816
+ "showLastColumn", // 2817
+ "showLeaderLines", // 2818
+ "showLegendKey", // 2819
+ "showMasterPhAnim", // 2820
+ "showMasterSp", // 2821
+ "showMemberPropertyTips", // 2822
+ "showMissing", // 2823
+ "showMultipleLabel", // 2824
+ "showNarration", // 2825
+ "showNegBubbles", // 2826
+ "showObjects", // 2827
+ "showOutline", // 2828
+ "showOutlineIcons", // 2829
+ "showOutlineSymbols", // 2830
+ "showPageBreaks", // 2831
+ "showPercent", // 2832
+ "showPivotChartFilter", // 2833
+ "showPr", // 2834
+ "showPropAsCaption", // 2835
+ "showPropCell", // 2836
+ "showPropTip", // 2837
+ "showRowCol", // 2838
+ "showRowColHeaders", // 2839
+ "showRowHeaders", // 2840
+ "showRowStripes", // 2841
+ "showRuler", // 2842
+ "showScrollbar", // 2843
+ "showSerName", // 2844
+ "showSheetTabs", // 2845
+ "showSpeakerNotes", // 2846
+ "showSpecialPlsOnTitleSld", // 2847
+ "showStatusbar", // 2848
+ "showTip", // 2849
+ "showVal", // 2850
+ "showValue", // 2851
+ "showVertBorder", // 2852
+ "showVerticalScroll", // 2853
+ "showWhenStopped", // 2854
+ "showWhiteSpace", // 2855
+ "showXMLTags", // 2856
+ "showZeros", // 2857
+ "showingPlcHdr", // 2858
+ "showsigndate", // 2859
+ "shp", // 2860
+ "shrinkToFit", // 2861
+ "si", // 2862
+ "sibTransId", // 2863
+ "side", // 2864
+ "sideWall", // 2865
+ "sig", // 2866
+ "signatureline", // 2867
+ "signinginstructions", // 2868
+ "signinginstructionsset", // 2869
+ "sigprovurl", // 2870
+ "simplePos", // 2871
+ "singleSignOnId", // 2872
+ "singleXmlCell", // 2873
+ "singleXmlCells", // 2874
+ "singleclick", // 2875
+ "size", // 2876
+ "sizeAuto", // 2877
+ "sizeRepresents", // 2878
+ "skew", // 2879
+ "skewamt", // 2880
+ "skewangle", // 2881
+ "sld", // 2882
+ "sldAll", // 2883
+ "sldId", // 2884
+ "sldIdLst", // 2885
+ "sldLayout", // 2886
+ "sldLayoutId", // 2887
+ "sldLayoutIdLst", // 2888
+ "sldLst", // 2889
+ "sldMaster", // 2890
+ "sldMasterId", // 2891
+ "sldMasterIdLst", // 2892
+ "sldNum", // 2893
+ "sldRg", // 2894
+ "sldSyncPr", // 2895
+ "sldSz", // 2896
+ "sldTgt", // 2897
+ "slideViewPr", // 2898
+ "smallCaps", // 2899
+ "smallFrac", // 2900
+ "smartTag", // 2901
+ "smartTagPr", // 2902
+ "smartTagType", // 2903
+ "smartTagTypes", // 2904
+ "smartTags", // 2905
+ "smooth", // 2906
+ "smtClean", // 2907
+ "smtId", // 2908
+ "snapToGrid", // 2909
+ "snapToObjects", // 2910
+ "snapVertSplitter", // 2911
+ "snd", // 2912
+ "sndAc", // 2913
+ "sndTgt", // 2914
+ "softEdge", // 2915
+ "softHyphen", // 2916
+ "solidFill", // 2917
+ "solutionID", // 2918
+ "solveOrder", // 2919
+ "sort", // 2920
+ "sortBy", // 2921
+ "sortByTuple", // 2922
+ "sortCondition", // 2923
+ "sortMethod", // 2924
+ "sortState", // 2925
+ "sortType", // 2926
+ "sorterViewPr", // 2927
+ "source", // 2928
+ "sourceData", // 2929
+ "sourceFile", // 2930
+ "sourceFileName", // 2931
+ "sourceLinked", // 2932
+ "sourceObject", // 2933
+ "sourceRef", // 2934
+ "sourceSheetId", // 2935
+ "sourceType", // 2936
+ "sp", // 2937
+ "sp3d", // 2938
+ "spAutoFit", // 2939
+ "spDef", // 2940
+ "spLocks", // 2941
+ "spPr", // 2942
+ "spTgt", // 2943
+ "spTree", // 2944
+ "space", // 2945
+ "spaceForUL", // 2946
+ "spacing", // 2947
+ "spacingInWholePoints", // 2948
+ "spans", // 2949
+ "spc", // 2950
+ "spcAft", // 2951
+ "spcBef", // 2952
+ "spcCol", // 2953
+ "spcFirstLastPara", // 2954
+ "spcPct", // 2955
+ "spcPts", // 2956
+ "spd", // 2957
+ "specVanish", // 2958
+ "specularity", // 2959
+ "spelling", // 2960
+ "spid", // 2961
+ "spidmax", // 2962
+ "spinCount", // 2963
+ "split", // 2964
+ "splitAll", // 2965
+ "splitFirst", // 2966
+ "splitPgBreakAndParaMark", // 2967
+ "splitPos", // 2968
+ "splitType", // 2969
+ "spokes", // 2970
+ "spt", // 2971
+ "sqlType", // 2972
+ "sqref", // 2973
+ "src", // 2974
+ "srcId", // 2975
+ "srcOrd", // 2976
+ "srcRect", // 2977
+ "srgbClr", // 2978
+ "sst", // 2979
+ "st", // 2980
+ "stA", // 2981
+ "stAng", // 2982
+ "stCondLst", // 2983
+ "stCxn", // 2984
+ "stPos", // 2985
+ "stSnd", // 2986
+ "start", // 2987
+ "startAngle", // 2988
+ "startAt", // 2989
+ "startDate", // 2990
+ "startNum", // 2991
+ "startOverride", // 2992
+ "startarrow", // 2993
+ "startarrowlength", // 2994
+ "startarrowwidth", // 2995
+ "state", // 2996
+ "status", // 2997
+ "statusBar", // 2998
+ "statusText", // 2999
+ "stdDev", // 3000
+ "stdDevPSubtotal", // 3001
+ "stdDevSubtotal", // 3002
+ "step", // 3003
+ "stockChart", // 3004
+ "stop", // 3005
+ "stopIfTrue", // 3006
+ "storage", // 3007
+ "storeItemID", // 3008
+ "storeMappedDataAs", // 3009
+ "stp", // 3010
+ "strCache", // 3011
+ "strLit", // 3012
+ "strRef", // 3013
+ "strVal", // 3014
+ "stream", // 3015
+ "stretch", // 3016
+ "strictFirstAndLastChars", // 3017
+ "strike", // 3018
+ "strikeBLTR", // 3019
+ "strikeH", // 3020
+ "strikeTLBR", // 3021
+ "strikeV", // 3022
+ "string", // 3023
+ "stringValue1", // 3024
+ "stringValue2", // 3025
+ "strips", // 3026
+ "stroke", // 3027
+ "strokecolor", // 3028
+ "stroked", // 3029
+ "strokeok", // 3030
+ "strokeweight", // 3031
+ "sty", // 3032
+ "style", // 3033
+ "styleData", // 3034
+ "styleDef", // 3035
+ "styleDefHdr", // 3036
+ "styleDefHdrLst", // 3037
+ "styleId", // 3038
+ "styleLbl", // 3039
+ "styleLink", // 3040
+ "styleLockQFSet", // 3041
+ "styleLockTheme", // 3042
+ "styleName", // 3043
+ "stylePaneFormatFilter", // 3044
+ "stylePaneSortMethod", // 3045
+ "styleSheet", // 3046
+ "styles", // 3047
+ "sub", // 3048
+ "subDoc", // 3049
+ "subFontBySize", // 3050
+ "subHide", // 3051
+ "subSp", // 3052
+ "subTnLst", // 3053
+ "subsetted", // 3054
+ "subtotal", // 3055
+ "subtotalCaption", // 3056
+ "subtotalHiddenItems", // 3057
+ "subtotalTop", // 3058
+ "suff", // 3059
+ "suggestedsigner", // 3060
+ "suggestedsigner2", // 3061
+ "suggestedsigneremail", // 3062
+ "sumSubtotal", // 3063
+ "summaryBelow", // 3064
+ "summaryLength", // 3065
+ "summaryRight", // 3066
+ "sup", // 3067
+ "supHide", // 3068
+ "supportAdvancedDrill", // 3069
+ "supportSubquery", // 3070
+ "suppressAutoHyphens", // 3071
+ "suppressBottomSpacing", // 3072
+ "suppressLineNumbers", // 3073
+ "suppressOverlap", // 3074
+ "suppressSpBfAfterPgBrk", // 3075
+ "suppressSpacingAtTopOfPage", // 3076
+ "suppressTopSpacing", // 3077
+ "suppressTopSpacingWP", // 3078
+ "surface3DChart", // 3079
+ "surfaceChart", // 3080
+ "swAng", // 3081
+ "swCell", // 3082
+ "swapBordersFacingPages", // 3083
+ "switch", // 3084
+ "sx", // 3085
+ "sy", // 3086
+ "sym", // 3087
+ "symbol", // 3088
+ "syncBehavior", // 3089
+ "syncHorizontal", // 3090
+ "syncRef", // 3091
+ "syncVertical", // 3092
+ "sysClr", // 3093
+ "sz", // 3094
+ "szCs", // 3095
+ "t", // 3096
+ "t1", // 3097
+ "t2", // 3098
+ "tIns", // 3099
+ "tab", // 3100
+ "tabColor", // 3101
+ "tabLst", // 3102
+ "tabRatio", // 3103
+ "tabSelected", // 3104
+ "table", // 3105
+ "tableBorderDxfId", // 3106
+ "tableColumn", // 3107
+ "tableColumnId", // 3108
+ "tableColumns", // 3109
+ "tablePart", // 3110
+ "tableParts", // 3111
+ "tableStyle", // 3112
+ "tableStyleElement", // 3113
+ "tableStyleId", // 3114
+ "tableStyleInfo", // 3115
+ "tableStyles", // 3116
+ "tableType", // 3117
+ "tablelimits", // 3118
+ "tableproperties", // 3119
+ "tables", // 3120
+ "tabs", // 3121
+ "tag", // 3122
+ "tagLst", // 3123
+ "tags", // 3124
+ "tailEnd", // 3125
+ "target", // 3126
+ "targetScreenSize", // 3127
+ "targetScreenSz", // 3128
+ "targetscreensize", // 3129
+ "tav", // 3130
+ "tavLst", // 3131
+ "tbl", // 3132
+ "tblBg", // 3133
+ "tblBorders", // 3134
+ "tblCellMar", // 3135
+ "tblCellSpacing", // 3136
+ "tblGrid", // 3137
+ "tblGridChange", // 3138
+ "tblHeader", // 3139
+ "tblInd", // 3140
+ "tblLayout", // 3141
+ "tblLook", // 3142
+ "tblOverlap", // 3143
+ "tblPr", // 3144
+ "tblPrChange", // 3145
+ "tblPrEx", // 3146
+ "tblPrExChange", // 3147
+ "tblStyle", // 3148
+ "tblStyleColBandSize", // 3149
+ "tblStyleLst", // 3150
+ "tblStylePr", // 3151
+ "tblStyleRowBandSize", // 3152
+ "tblW", // 3153
+ "tblpPr", // 3154
+ "tblpX", // 3155
+ "tblpXSpec", // 3156
+ "tblpY", // 3157
+ "tblpYSpec", // 3158
+ "tc", // 3159
+ "tcBdr", // 3160
+ "tcBorders", // 3161
+ "tcFitText", // 3162
+ "tcMar", // 3163
+ "tcPr", // 3164
+ "tcPrChange", // 3165
+ "tcStyle", // 3166
+ "tcTxStyle", // 3167
+ "tcW", // 3168
+ "temporary", // 3169
+ "tentative", // 3170
+ "text", // 3171
+ "textAlignment", // 3172
+ "textDates", // 3173
+ "textDirection", // 3174
+ "textField", // 3175
+ "textFields", // 3176
+ "textInput", // 3177
+ "textPr", // 3178
+ "textRotation", // 3179
+ "textborder", // 3180
+ "textbox", // 3181
+ "textboxTightWrap", // 3182
+ "textboxrect", // 3183
+ "textdata", // 3184
+ "textlink", // 3185
+ "textpath", // 3186
+ "textpathok", // 3187
+ "tgtEl", // 3188
+ "tgtFrame", // 3189
+ "theme", // 3190
+ "themeColor", // 3191
+ "themeElements", // 3192
+ "themeFill", // 3193
+ "themeFillShade", // 3194
+ "themeFillTint", // 3195
+ "themeFontLang", // 3196
+ "themeManager", // 3197
+ "themeOverride", // 3198
+ "themeShade", // 3199
+ "themeTint", // 3200
+ "thickBot", // 3201
+ "thickBottom", // 3202
+ "thickTop", // 3203
+ "thicket", // 3204
+ "thickness", // 3205
+ "thousands", // 3206
+ "thresh", // 3207
+ "thruBlk", // 3208
+ "tickLblPos", // 3209
+ "tickLblSkip", // 3210
+ "tickMarkSkip", // 3211
+ "tile", // 3212
+ "tileRect", // 3213
+ "time", // 3214
+ "timePeriod", // 3215
+ "timing", // 3216
+ "tint", // 3217
+ "title", // 3218
+ "titlePg", // 3219
+ "titleStyle", // 3220
+ "tl2br", // 3221
+ "tm", // 3222
+ "tmAbs", // 3223
+ "tmFilter", // 3224
+ "tmPct", // 3225
+ "tmpl", // 3226
+ "tmplLst", // 3227
+ "tn", // 3228
+ "tnLst", // 3229
+ "to", // 3230
+ "tooltip", // 3231
+ "top", // 3232
+ "top10", // 3233
+ "topAutoShow", // 3234
+ "topFromText", // 3235
+ "topLabels", // 3236
+ "topLeftCell", // 3237
+ "topLinePunct", // 3238
+ "totalsRowBorderDxfId", // 3239
+ "totalsRowCellStyle", // 3240
+ "totalsRowCount", // 3241
+ "totalsRowDxfId", // 3242
+ "totalsRowFormula", // 3243
+ "totalsRowFunction", // 3244
+ "totalsRowLabel", // 3245
+ "totalsRowShown", // 3246
+ "tp", // 3247
+ "tpl", // 3248
+ "tplc", // 3249
+ "tpls", // 3250
+ "tr", // 3251
+ "tr2bl", // 3252
+ "trHeight", // 3253
+ "trPr", // 3254
+ "trPrChange", // 3255
+ "track", // 3256
+ "trackRevisions", // 3257
+ "transition", // 3258
+ "transitionEntry", // 3259
+ "transitionEvaluation", // 3260
+ "transp", // 3261
+ "trend", // 3262
+ "trendline", // 3263
+ "trendlineLbl", // 3264
+ "trendlineType", // 3265
+ "trim", // 3266
+ "truncateFontHeightsLikeWP6", // 3267
+ "tupleCache", // 3268
+ "twoCellAnchor", // 3269
+ "twoDigitTextYear", // 3270
+ "tx", // 3271
+ "tx1", // 3272
+ "tx2", // 3273
+ "txBody", // 3274
+ "txBox", // 3275
+ "txDef", // 3276
+ "txEffectClrLst", // 3277
+ "txEl", // 3278
+ "txFillClrLst", // 3279
+ "txLinClrLst", // 3280
+ "txPr", // 3281
+ "txSp", // 3282
+ "txStyles", // 3283
+ "txbxContent", // 3284
+ "ty", // 3285
+ "type", // 3286
+ "typeface", // 3287
+ "types", // 3288
+ "u", // 3289
+ "uBounds", // 3290
+ "uFill", // 3291
+ "uFillTx", // 3292
+ "uLn", // 3293
+ "uLnTx", // 3294
+ "ua", // 3295
+ "udl", // 3296
+ "ui1", // 3297
+ "ui2", // 3298
+ "ui4", // 3299
+ "ui8", // 3300
+ "uiCompat97To2003", // 3301
+ "uiExpand", // 3302
+ "uiPriority", // 3303
+ "uint", // 3304
+ "ulTrailSpace", // 3305
+ "un", // 3306
+ "unbalanced", // 3307
+ "unbalancedGroup", // 3308
+ "unboundColumnsLeft", // 3309
+ "unboundColumnsRight", // 3310
+ "underlineTabInNumList", // 3311
+ "undo", // 3312
+ "undone", // 3313
+ "ungrouping", // 3314
+ "unhideWhenUsed", // 3315
+ "uniqueCount", // 3316
+ "uniqueId", // 3317
+ "uniqueList", // 3318
+ "uniqueMemberProperty", // 3319
+ "uniqueName", // 3320
+ "uniqueParent", // 3321
+ "uniqueTag", // 3322
+ "unlockedFormula", // 3323
+ "up", // 3324
+ "upBars", // 3325
+ "upDownBars", // 3326
+ "updateAutomatic", // 3327
+ "updateFields", // 3328
+ "updateLinks", // 3329
+ "updatedVersion", // 3330
+ "upgradeOnRefresh", // 3331
+ "upright", // 3332
+ "uri", // 3333
+ "url", // 3334
+ "usb0", // 3335
+ "usb1", // 3336
+ "usb2", // 3337
+ "usb3", // 3338
+ "useA", // 3339
+ "useAltKinsokuLineBreakRules", // 3340
+ "useAnsiKerningPairs", // 3341
+ "useAutoFormatting", // 3342
+ "useBgFill", // 3343
+ "useDef", // 3344
+ "useFELayout", // 3345
+ "useFirstPageNumber", // 3346
+ "useLongFilenames", // 3347
+ "useNormalStyleForList", // 3348
+ "usePrinterDefaults", // 3349
+ "usePrinterMetrics", // 3350
+ "useSingleBorderforContiguousCells", // 3351
+ "useSpRect", // 3352
+ "useTimings", // 3353
+ "useWord2002TableStyleRules", // 3354
+ "useWord97LineBreakRules", // 3355
+ "useXSLTWhenSaving", // 3356
+ "user", // 3357
+ "userDrawn", // 3358
+ "userInfo", // 3359
+ "userInterface", // 3360
+ "userName", // 3361
+ "userShapes", // 3362
+ "userdrawn", // 3363
+ "userhidden", // 3364
+ "users", // 3365
+ "v", // 3366
+ "vAlign", // 3367
+ "vAnchor", // 3368
+ "vMerge", // 3369
+ "vMergeOrig", // 3370
+ "vSpace", // 3371
+ "vacatedStyle", // 3372
+ "val", // 3373
+ "valAx", // 3374
+ "value", // 3375
+ "valueMetadata", // 3376
+ "valueType", // 3377
+ "values", // 3378
+ "vanish", // 3379
+ "varLst", // 3380
+ "varPSubtotal", // 3381
+ "varScale", // 3382
+ "varSubtotal", // 3383
+ "variant", // 3384
+ "varyColors", // 3385
+ "vbProcedure", // 3386
+ "vector", // 3387
+ "vendorID", // 3388
+ "version", // 3389
+ "vert", // 3390
+ "vertAlign", // 3391
+ "vertAnchor", // 3392
+ "vertBarState", // 3393
+ "vertCompress", // 3394
+ "vertJc", // 3395
+ "vertOverflow", // 3396
+ "vertical", // 3397
+ "verticalCentered", // 3398
+ "verticalDpi", // 3399
+ "verticies", // 3400
+ "video", // 3401
+ "videoFile", // 3402
+ "view", // 3403
+ "view3D", // 3404
+ "viewMergedData", // 3405
+ "viewPr", // 3406
+ "viewpoint", // 3407
+ "viewpointorigin", // 3408
+ "visibility", // 3409
+ "visualTotals", // 3410
+ "vm", // 3411
+ "vml", // 3412
+ "vocabulary", // 3413
+ "vol", // 3414
+ "volType", // 3415
+ "volTypes", // 3416
+ "vstream", // 3417
+ "w", // 3418
+ "wAfter", // 3419
+ "wBefore", // 3420
+ "wMode", // 3421
+ "wR", // 3422
+ "wavAudioFile", // 3423
+ "webHidden", // 3424
+ "webPr", // 3425
+ "webPublishItem", // 3426
+ "webPublishItems", // 3427
+ "webPublishObject", // 3428
+ "webPublishObjects", // 3429
+ "webPublishing", // 3430
+ "webSettings", // 3431
+ "wedge", // 3432
+ "weight", // 3433
+ "wheel", // 3434
+ "whole", // 3435
+ "wholeTbl", // 3436
+ "widowControl", // 3437
+ "width", // 3438
+ "windowHeight", // 3439
+ "windowProtection", // 3440
+ "windowWidth", // 3441
+ "wipe", // 3442
+ "wireframe", // 3443
+ "wordWrap", // 3444
+ "workbook", // 3445
+ "workbookParameter", // 3446
+ "workbookPassword", // 3447
+ "workbookPr", // 3448
+ "workbookProtection", // 3449
+ "workbookView", // 3450
+ "workbookViewId", // 3451
+ "worksheet", // 3452
+ "worksheetSource", // 3453
+ "wpJustification", // 3454
+ "wpSpaceWidth", // 3455
+ "wrap", // 3456
+ "wrapIndent", // 3457
+ "wrapNone", // 3458
+ "wrapPolygon", // 3459
+ "wrapRight", // 3460
+ "wrapSquare", // 3461
+ "wrapText", // 3462
+ "wrapThrough", // 3463
+ "wrapTight", // 3464
+ "wrapTopAndBottom", // 3465
+ "wrapTrailSpaces", // 3466
+ "wrapcoords", // 3467
+ "writeProtection", // 3468
+ "wsDr", // 3469
+ "x", // 3470
+ "xAlign", // 3471
+ "xMode", // 3472
+ "xSplit", // 3473
+ "xVal", // 3474
+ "xWindow", // 3475
+ "xf", // 3476
+ "xfDxf", // 3477
+ "xfId", // 3478
+ "xfrm", // 3479
+ "xfrmType", // 3480
+ "xl2000", // 3481
+ "xl97", // 3482
+ "xlm", // 3483
+ "xml", // 3484
+ "xmlBased", // 3485
+ "xmlCellPr", // 3486
+ "xmlColumnPr", // 3487
+ "xmlDataType", // 3488
+ "xmlPr", // 3489
+ "xpath", // 3490
+ "xrange", // 3491
+ "xscale", // 3492
+ "y", // 3493
+ "yAlign", // 3494
+ "yMode", // 3495
+ "ySplit", // 3496
+ "yVal", // 3497
+ "yWindow", // 3498
+ "year", // 3499
+ "yearLong", // 3500
+ "yearShort", // 3501
+ "yrange", // 3502
+ "z", // 3503
+ "zOrder", // 3504
+ "zOrderOff", // 3505
+ "zeroAsc", // 3506
+ "zeroDesc", // 3507
+ "zeroHeight", // 3508
+ "zeroValues", // 3509
+ "zeroWid", // 3510
+ "zoom", // 3511
+ "zoomContents", // 3512
+ "zoomScale", // 3513
+ "zoomScaleNormal", // 3514
+ "zoomScalePageLayoutView", // 3515
+ "zoomScaleSheetLayoutView", // 3516
+ "zoomToFit" // 3517
+};
+
+size_t token_name_count = 3518; \ No newline at end of file
diff --git a/src/liborcus/ooxml_types.cpp b/src/liborcus/ooxml_types.cpp
new file mode 100644
index 0000000..f5165a0
--- /dev/null
+++ b/src/liborcus/ooxml_types.cpp
@@ -0,0 +1,27 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "ooxml_types.hpp"
+
+namespace orcus {
+
+opc_rel_extra::~opc_rel_extra() = default;
+
+opc_rel_extras_t::opc_rel_extras_t() = default;
+opc_rel_extras_t::~opc_rel_extras_t() = default;
+
+opc_rel_extras_t::opc_rel_extras_t(opc_rel_extras_t&& other) :
+ data(std::move(other.data)) {}
+
+void opc_rel_extras_t::swap(opc_rel_extras_t& other)
+{
+ data.swap(other.data);
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/ooxml_types.hpp b/src/liborcus/ooxml_types.hpp
new file mode 100644
index 0000000..2b9e43c
--- /dev/null
+++ b/src/liborcus/ooxml_types.hpp
@@ -0,0 +1,73 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_OOXML_TYPES_HPP
+#define INCLUDED_ORCUS_OOXML_TYPES_HPP
+
+#include <iostream>
+#include <memory>
+#include <unordered_map>
+
+namespace orcus {
+
+typedef const char* content_type_t;
+typedef const char* schema_t;
+
+/**
+ * Part name (first) and content type (second).
+ */
+typedef ::std::pair<std::string_view, content_type_t> xml_part_t;
+
+/**
+ * Single OPC relationship that corresponds with a Relationship element in
+ * .rels parts.
+ */
+struct opc_rel_t
+{
+ std::string_view rid;
+ std::string_view target;
+ schema_t type;
+
+ opc_rel_t() : type(nullptr) {}
+ opc_rel_t(std::string_view _rid, const std::string_view& _target, schema_t _type) :
+ rid(_rid), target(_target), type(_type) {}
+};
+
+/**
+ * Used as a base struct only to allow storage of custom data associated
+ * with a relationship.
+ */
+struct opc_rel_extra
+{
+ virtual ~opc_rel_extra() = 0;
+};
+
+struct opc_rel_extras_t
+{
+ typedef std::unordered_map<std::string_view, std::unique_ptr<opc_rel_extra>> map_type;
+
+ /**
+ * Key is a textual relation ID, while the value is an arbitrary data
+ * associated with the relation ID.
+ */
+ map_type data;
+
+ opc_rel_extras_t(opc_rel_extras_t&& other);
+
+ opc_rel_extras_t(const opc_rel_extras_t&) = delete;
+ opc_rel_extras_t& operator=(const opc_rel_extras_t&) = delete;
+
+ opc_rel_extras_t();
+ ~opc_rel_extras_t();
+
+ void swap(opc_rel_extras_t& other);
+};
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/opc_context.cpp b/src/liborcus/opc_context.cpp
new file mode 100644
index 0000000..e3b1bb5
--- /dev/null
+++ b/src/liborcus/opc_context.cpp
@@ -0,0 +1,310 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "opc_context.hpp"
+#include "opc_token_constants.hpp"
+#include "ooxml_content_types.hpp"
+#include "ooxml_namespace_types.hpp"
+#include "ooxml_schemas.hpp"
+#include "session_context.hpp"
+
+#include "orcus/exception.hpp"
+
+#include <cassert>
+#include <iostream>
+#include <algorithm>
+
+namespace orcus {
+
+namespace {
+
+class part_ext_attr_parser
+{
+public:
+ part_ext_attr_parser(
+ opc_content_types_context::ct_cache_type* p_ct_cache, xml_token_t attr_name, const config* conf) :
+ mp_ct_cache(p_ct_cache),
+ m_attr_name(attr_name),
+ m_config(conf),
+ m_content_type(nullptr) {}
+
+ part_ext_attr_parser(const part_ext_attr_parser& r) :
+ mp_ct_cache(r.mp_ct_cache),
+ m_attr_name(r.m_attr_name),
+ m_config(r.m_config),
+ m_name(r.m_name),
+ m_content_type(r.m_content_type) {}
+
+ void operator() (const xml_token_attr_t& attr)
+ {
+ if (attr.name == m_attr_name)
+ m_name = attr.value;
+ else if (attr.name == XML_ContentType)
+ m_content_type = to_content_type(attr.value);
+ }
+
+ const std::string_view& get_name() const { return m_name; }
+ content_type_t get_content_type() const { return m_content_type; }
+
+private:
+ content_type_t to_content_type(const std::string_view& p) const
+ {
+ opc_content_types_context::ct_cache_type::const_iterator itr =
+ mp_ct_cache->find(p);
+ if (itr == mp_ct_cache->end())
+ {
+ if (m_config->debug)
+ std::cout << "unknown content type: " << p << std::endl;
+ return nullptr;
+ }
+ std::string_view val = *itr;
+ return val.data();
+ }
+
+private:
+ const opc_content_types_context::ct_cache_type* mp_ct_cache;
+ xml_token_t m_attr_name;
+ const config* m_config;
+ std::string_view m_name;
+ content_type_t m_content_type;
+};
+
+}
+
+opc_content_types_context::opc_content_types_context(session_context& session_cxt, const tokens& _tokens) :
+ xml_context_base(session_cxt, _tokens)
+{
+ // build content type cache.
+ for (const content_type_t* p = CT_all; *p; ++p)
+ m_ct_cache.insert(std::string_view(*p));
+}
+
+opc_content_types_context::~opc_content_types_context()
+{
+}
+
+xml_context_base* opc_content_types_context::create_child_context(xmlns_id_t /*ns*/, xml_token_t /*name*/)
+{
+ return nullptr;
+}
+
+void opc_content_types_context::end_child_context(xmlns_id_t /*ns*/, xml_token_t /*name*/, xml_context_base* /*child*/)
+{
+}
+
+void opc_content_types_context::start_element(xmlns_id_t ns, xml_token_t name, const::std::vector<xml_token_attr_t> &attrs)
+{
+ xml_token_pair_t parent = push_stack(ns, name);
+ switch (name)
+ {
+ case XML_Types:
+ {
+ xml_element_expected(parent, XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN);
+ if (get_config().debug)
+ print_attrs(get_tokens(), attrs);
+ }
+ break;
+ case XML_Override:
+ {
+ xml_element_expected(parent, NS_opc_ct, XML_Types);
+ part_ext_attr_parser func(&m_ct_cache, XML_PartName, &get_config());
+ func = for_each(attrs.begin(), attrs.end(), func);
+
+ // We need to use allocated strings for part names here because
+ // the part names need to survive after the [Content_Types].xml
+ // stream is destroyed.
+ std::string_view part_name = get_session_context().spool.intern(func.get_name()).first;
+ m_parts.push_back(
+ xml_part_t(part_name, func.get_content_type()));
+ }
+ break;
+ case XML_Default:
+ {
+ xml_element_expected(parent, NS_opc_ct, XML_Types);
+ part_ext_attr_parser func(&m_ct_cache, XML_Extension, &get_config());
+ func = for_each(attrs.begin(), attrs.end(), func);
+
+ // Like the part names, we need to use allocated strings for
+ // extension names.
+ std::string_view ext_name = get_session_context().spool.intern(func.get_name()).first;
+ m_ext_defaults.push_back(
+ xml_part_t(ext_name, func.get_content_type()));
+ }
+ break;
+ default:
+ warn_unhandled();
+ }
+}
+
+bool opc_content_types_context::end_element(xmlns_id_t ns, xml_token_t name)
+{
+ return pop_stack(ns, name);
+}
+
+void opc_content_types_context::characters(std::string_view /*str*/, bool /*transient*/)
+{
+}
+
+void opc_content_types_context::pop_parts(std::vector<xml_part_t>& parts)
+{
+ m_parts.swap(parts);
+}
+
+void opc_content_types_context::pop_ext_defaults(std::vector<xml_part_t>& ext_defaults)
+{
+ m_ext_defaults.swap(ext_defaults);
+}
+
+// ============================================================================
+
+namespace {
+
+class rel_attr_parser
+{
+public:
+ rel_attr_parser(session_context* cxt, const opc_relations_context::schema_cache_type* cache, const config* conf) :
+ m_cxt(cxt), mp_schema_cache(cache), mp_config(conf) {}
+
+ void operator() (const xml_token_attr_t& attr)
+ {
+ // Target and rId strings must be interned as they must survive after
+ // the rels part gets destroyed.
+
+ switch (attr.name)
+ {
+ case XML_Target:
+ m_rel.target = m_cxt->spool.intern(attr.value).first;
+ break;
+ case XML_Type:
+ m_rel.type = to_schema(attr.value);
+ break;
+ case XML_Id:
+ m_rel.rid = m_cxt->spool.intern(attr.value).first;
+ break;
+ }
+ }
+
+ const opc_rel_t& get_rel() const { return m_rel; }
+
+private:
+ schema_t to_schema(const std::string_view& p) const
+ {
+ opc_relations_context::schema_cache_type::const_iterator itr =
+ mp_schema_cache->find(p);
+ if (itr == mp_schema_cache->end())
+ {
+ if (mp_config->debug)
+ std::cout << "unknown schema: " << p << std::endl;
+ return nullptr;
+ }
+ std::string_view val = *itr;
+ return val.data();
+ }
+
+private:
+ session_context* m_cxt;
+ const opc_relations_context::schema_cache_type* mp_schema_cache;
+ const config* mp_config;
+ opc_rel_t m_rel;
+};
+
+/**
+ * Compare relations by the rId.
+ */
+struct compare_rels
+{
+ bool operator() (const opc_rel_t& r1, const opc_rel_t& r2) const
+ {
+ std::size_t n1 = r1.rid.size(), n2 = r2.rid.size();
+ std::size_t n = std::min(n1, n2);
+ const char *p1 = r1.rid.data(), *p2 = r2.rid.data();
+ for (std::size_t i = 0; i < n; ++i, ++p1, ++p2)
+ {
+ if (*p1 < *p2)
+ return true;
+ if (*p1 > *p2)
+ return false;
+ assert(*p1 == *p2);
+ }
+ return n1 < n2;
+ }
+};
+
+}
+
+opc_relations_context::opc_relations_context(session_context& session_cxt, const tokens &_tokens) :
+ xml_context_base(session_cxt, _tokens)
+{
+ // build content type cache.
+ for (schema_t* p = SCH_all; *p; ++p)
+ m_schema_cache.insert(std::string_view(*p));
+}
+
+opc_relations_context::~opc_relations_context()
+{
+}
+
+xml_context_base* opc_relations_context::create_child_context(xmlns_id_t /*ns*/, xml_token_t /*name*/)
+{
+ return nullptr;
+}
+
+void opc_relations_context::end_child_context(xmlns_id_t /*ns*/, xml_token_t /*name*/, xml_context_base* /*child*/)
+{
+}
+
+void opc_relations_context::start_element(
+ xmlns_id_t ns, xml_token_t name, const std::vector<xml_token_attr_t> &attrs)
+{
+ xml_token_pair_t parent = push_stack(ns, name);
+ switch (name)
+ {
+ case XML_Relationships:
+ {
+ xml_element_expected(parent, XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN);
+ if (get_config().debug)
+ print_attrs(get_tokens(), attrs);
+ }
+ break;
+ case XML_Relationship:
+ {
+ rel_attr_parser func(&get_session_context(), &m_schema_cache, &get_config());
+ xml_element_expected(parent, NS_opc_rel, XML_Relationships);
+ func = for_each(attrs.begin(), attrs.end(), func);
+ const opc_rel_t& rel = func.get_rel();
+ if (rel.type)
+ m_rels.push_back(rel);
+ }
+ break;
+ default:
+ warn_unhandled();
+ }
+}
+
+bool opc_relations_context::end_element(xmlns_id_t ns, xml_token_t name)
+{
+ return pop_stack(ns, name);
+}
+
+void opc_relations_context::characters(std::string_view /*str*/, bool /*transient*/)
+{
+}
+
+void opc_relations_context::init()
+{
+ m_rels.clear();
+}
+
+void opc_relations_context::pop_rels(std::vector<opc_rel_t>& rels)
+{
+ // Sort by the rId.
+ sort(m_rels.begin(), m_rels.end(), compare_rels());
+ m_rels.swap(rels);
+}
+
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/opc_context.hpp b/src/liborcus/opc_context.hpp
new file mode 100644
index 0000000..c965895
--- /dev/null
+++ b/src/liborcus/opc_context.hpp
@@ -0,0 +1,90 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_OPC_CONTEXT_HPP
+#define INCLUDED_ORCUS_OPC_CONTEXT_HPP
+
+#include "xml_context_base.hpp"
+#include "ooxml_types.hpp"
+
+#include <unordered_set>
+#include <vector>
+
+namespace orcus {
+
+/**
+ * Main context class for the [Content_Types].xml part. This context does
+ * not use any child contexts; [Content_Types].xml part is simple enough
+ * that we can handle all in a single context class.
+ */
+class opc_content_types_context : public xml_context_base
+{
+public:
+ typedef std::unordered_set<std::string_view> ct_cache_type;
+
+ opc_content_types_context(session_context& session_cxt, const tokens& _tokens);
+ virtual ~opc_content_types_context();
+
+ virtual xml_context_base* create_child_context(xmlns_id_t ns, xml_token_t name);
+ virtual void end_child_context(xmlns_id_t ns, xml_token_t name, xml_context_base *child);
+
+ virtual void start_element(xmlns_id_t ns, xml_token_t name, const::std::vector<xml_token_attr_t> &attrs);
+ virtual bool end_element(xmlns_id_t ns, xml_token_t name);
+ virtual void characters(std::string_view str, bool transient);
+
+ /**
+ * Swap stored xml part info with the instance passed as the argument.
+ * Calling this will clear the storage.
+ *
+ * @param parts instance to swap the stored xml part info with.
+ */
+ void pop_parts(::std::vector<xml_part_t>& parts);
+
+ /**
+ * Swap stored xml extension info with the instance passed as the
+ * argument. Calling this will clear the storage.
+ *
+ * @param parts instance to swap the stored extension info with.
+ */
+ void pop_ext_defaults(::std::vector<xml_part_t>& ext_defaults);
+
+private:
+ ct_cache_type m_ct_cache; // content type cache;
+ ::std::vector<xml_part_t> m_parts;
+ ::std::vector<xml_part_t> m_ext_defaults;
+};
+
+/**
+ * Context class for relations parts.
+ */
+class opc_relations_context : public xml_context_base
+{
+public:
+ typedef std::unordered_set<std::string_view> schema_cache_type;
+
+ opc_relations_context(session_context& session_cxt, const tokens& _tokens);
+ virtual ~opc_relations_context();
+
+ virtual xml_context_base* create_child_context(xmlns_id_t ns, xml_token_t name);
+ virtual void end_child_context(xmlns_id_t ns, xml_token_t name, xml_context_base *child);
+
+ virtual void start_element(xmlns_id_t ns, xml_token_t name, const std::vector<xml_token_attr_t> &attrs);
+ virtual bool end_element(xmlns_id_t ns, xml_token_t name);
+ virtual void characters(std::string_view str, bool transient);
+
+ void init();
+ void pop_rels(::std::vector<opc_rel_t>& rels);
+
+private:
+ schema_cache_type m_schema_cache;
+ ::std::vector<opc_rel_t> m_rels;
+};
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/opc_reader.cpp b/src/liborcus/opc_reader.cpp
new file mode 100644
index 0000000..7126f66
--- /dev/null
+++ b/src/liborcus/opc_reader.cpp
@@ -0,0 +1,306 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "opc_reader.hpp"
+#include "xml_stream_parser.hpp"
+
+#include "ooxml_global.hpp"
+#include "opc_context.hpp"
+#include "ooxml_tokens.hpp"
+
+#include "orcus/config.hpp"
+
+#include <iostream>
+
+using namespace std;
+
+namespace orcus {
+
+namespace {
+
+class print_xml_content_types
+{
+public:
+ print_xml_content_types(const char* prefix) :
+ m_prefix(prefix) {}
+
+ void operator() (const xml_part_t& v) const
+ {
+ cout << "* " << m_prefix << ": " << v.first;
+ if (v.second)
+ cout << " (" << v.second << ")";
+ else
+ cout << " (<unknown content type>)";
+ cout << endl;
+ }
+private:
+ const char* m_prefix;
+};
+
+}
+
+opc_reader::part_handler::~part_handler() {}
+
+opc_reader::opc_reader(const config& opt, xmlns_repository& ns_repo, session_context& cxt, part_handler& handler) :
+ m_config(opt),
+ m_ns_repo(ns_repo),
+ m_session_cxt(cxt),
+ m_handler(handler),
+ m_opc_rel_handler(m_session_cxt, opc_tokens, std::make_unique<opc_relations_context>(m_session_cxt, opc_tokens)) {}
+
+void opc_reader::read_file(std::unique_ptr<zip_archive_stream>&& stream)
+{
+ m_archive_stream.reset(stream.release());
+ m_archive.reset(new zip_archive(m_archive_stream.get()));
+
+ m_archive->load();
+
+ m_dir_stack.push_back(string()); // push root directory.
+
+ if (m_config.debug)
+ list_content();
+ read_content();
+
+ m_archive.reset();
+ m_archive_stream.reset();
+}
+
+bool opc_reader::open_zip_stream(const string& path, vector<unsigned char>& buf)
+{
+ try
+ {
+ std::vector<unsigned char> entry = m_archive->read_file_entry(path.c_str());
+ buf.swap(entry);
+ return true;
+ }
+ catch (const std::exception&)
+ {
+ return false;
+ }
+}
+
+void opc_reader::read_part(std::string_view path, const schema_t type, opc_rel_extra* data)
+{
+ assert(!m_dir_stack.empty());
+
+ dir_stack_type dir_changed;
+
+ // Change current directory and read the in-file.
+ const char* p = path.data();
+ const char* p_name = nullptr;
+ size_t name_len = 0;
+ for (size_t i = 0, n = path.size(); i < n; ++i, ++p)
+ {
+ if (!p_name)
+ p_name = p;
+
+ ++name_len;
+
+ if (*p == '/')
+ {
+ // Push a new directory.
+ string dir_name(p_name, name_len);
+ if (dir_name == "..")
+ {
+ dir_changed.push_back(m_dir_stack.back());
+ m_dir_stack.pop_back();
+ }
+ else
+ {
+ m_dir_stack.push_back(dir_name);
+
+ // Add a null directory to the change record to remove it at the end.
+ dir_changed.push_back(string());
+ }
+
+ p_name = nullptr;
+ name_len = 0;
+ }
+ }
+
+ if (p_name)
+ {
+ // This is a file.
+ string file_name(p_name, name_len);
+ string cur_dir = get_current_dir();
+ string full_path = resolve_file_path(cur_dir, file_name);
+
+ if (m_handled_parts.count(full_path) > 0)
+ {
+ // This part has been previously read. Let's not read it twice.
+ if (m_config.debug)
+ {
+ cout << "---" << endl;
+ cout << "skipping previously read part: " << full_path << endl;
+ }
+ }
+ else if (m_handler.handle_part(type, cur_dir, file_name, data))
+ {
+ m_handled_parts.insert(full_path);
+ }
+ else if (m_config.debug)
+ {
+ cout << "---" << endl;
+ cout << "unhandled relationship type: " << type << endl;
+ }
+ }
+
+ // Unwind to the original directory.
+ while (!dir_changed.empty())
+ {
+ const string& dir = dir_changed.back();
+ if (dir.empty())
+ // remove added directory.
+ m_dir_stack.pop_back();
+ else
+ // re-add removed directory.
+ m_dir_stack.push_back(dir);
+
+ dir_changed.pop_back();
+ }
+}
+
+void opc_reader::check_relation_part(
+ const std::string& file_name, opc_rel_extras_t* extras, sort_compare_type* sorter)
+{
+ // Read the relationship file associated with this file, located at
+ // _rels/<file name>.rels.
+ vector<opc_rel_t> rels;
+ m_dir_stack.push_back(string("_rels/"));
+ string rels_file_name = file_name + ".rels";
+ read_relations(rels_file_name.c_str(), rels);
+ m_dir_stack.pop_back();
+
+ if (sorter)
+ std::sort(rels.begin(), rels.end(), *sorter);
+
+ if (m_config.debug)
+ for_each(rels.begin(), rels.end(), print_opc_rel());
+
+ for_each(rels.begin(), rels.end(),
+ [&](opc_rel_t& v)
+ {
+ opc_rel_extra* data = nullptr;
+ if (extras)
+ {
+ // See if there is an extra data associated with this relation ID.
+ opc_rel_extras_t::map_type::iterator it = extras->data.find(v.rid);
+ if (it != extras->data.end())
+ // There is one !
+ data = it->second.get();
+ }
+ read_part(v.target, v.type, data);
+ }
+ );
+}
+
+void opc_reader::list_content() const
+{
+ size_t num = m_archive->get_file_entry_count();
+ cout << "number of files this archive contains: " << num << endl;
+
+ for (size_t i = 0; i < num; ++i)
+ {
+ std::string_view filename = m_archive->get_file_entry_name(i);
+ cout << filename << endl;
+ }
+}
+
+void opc_reader::read_content()
+{
+ if (m_dir_stack.empty())
+ return;
+
+ // [Content_Types].xml
+
+ read_content_types();
+ if (m_config.debug)
+ {
+ for_each(m_parts.begin(), m_parts.end(), print_xml_content_types("part name"));
+ for_each(m_ext_defaults.begin(), m_ext_defaults.end(), print_xml_content_types("extension default"));
+ }
+
+ // _rels/.rels
+
+ m_dir_stack.push_back(string("_rels/"));
+ vector<opc_rel_t> rels;
+ read_relations(".rels", rels);
+ m_dir_stack.pop_back();
+
+ if (m_config.debug)
+ for_each(rels.begin(), rels.end(), print_opc_rel());
+
+ for_each(rels.begin(), rels.end(),
+ [this](opc_rel_t& v)
+ {
+ read_part(v.target, v.type, nullptr);
+ }
+ );
+}
+
+void opc_reader::read_content_types()
+{
+ string filepath("[Content_Types].xml");
+ vector<unsigned char> buffer;
+ if (!open_zip_stream(filepath, buffer))
+ return;
+
+ if (buffer.empty())
+ return;
+
+ xml_stream_parser parser(
+ m_config, m_ns_repo, opc_tokens,
+ reinterpret_cast<const char*>(&buffer[0]), buffer.size());
+
+ auto handler = std::make_unique<xml_simple_stream_handler>(
+ m_session_cxt, opc_tokens,
+ std::make_unique<opc_content_types_context>(m_session_cxt, opc_tokens));
+
+ parser.set_handler(handler.get());
+ parser.parse();
+
+ opc_content_types_context& context =
+ static_cast<opc_content_types_context&>(handler->get_context());
+ context.pop_parts(m_parts);
+ context.pop_ext_defaults(m_ext_defaults);
+}
+
+void opc_reader::read_relations(const char* path, vector<opc_rel_t>& rels)
+{
+ string filepath = resolve_file_path(get_current_dir(), path);
+ if (m_config.debug)
+ cout << "relation file path: " << filepath << endl;
+
+ vector<unsigned char> buffer;
+ if (!open_zip_stream(filepath, buffer))
+ return;
+
+ if (buffer.empty())
+ return;
+
+ xml_stream_parser parser(
+ m_config, m_ns_repo, opc_tokens, reinterpret_cast<const char*>(&buffer[0]), buffer.size());
+
+ opc_relations_context& context =
+ static_cast<opc_relations_context&>(m_opc_rel_handler.get_context());
+ context.init();
+ parser.set_handler(&m_opc_rel_handler);
+ parser.parse();
+ context.pop_rels(rels);
+}
+
+string opc_reader::get_current_dir() const
+{
+ string pwd;
+ vector<string>::const_iterator itr = m_dir_stack.begin(), itr_end = m_dir_stack.end();
+ for (; itr != itr_end; ++itr)
+ pwd += *itr;
+ return pwd;
+}
+
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/opc_reader.hpp b/src/liborcus/opc_reader.hpp
new file mode 100644
index 0000000..5733c02
--- /dev/null
+++ b/src/liborcus/opc_reader.hpp
@@ -0,0 +1,127 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_OPC_READER_HPP
+#define INCLUDED_ORCUS_OPC_READER_HPP
+
+#include "orcus/env.hpp"
+#include "orcus/zip_archive.hpp"
+#include "orcus/zip_archive_stream.hpp"
+
+#include "ooxml_schemas.hpp"
+#include "xml_simple_stream_handler.hpp"
+
+#include <vector>
+#include <string>
+#include <unordered_set>
+
+namespace orcus {
+
+struct config;
+
+class xmlns_repository;
+struct session_context;
+struct opc_rel_extra;
+
+/**
+ * Class to handle parsing through all xml parts stored in a file packaged
+ * according to the Open Package Convention (OPC).
+ */
+class opc_reader
+{
+ typedef std::vector<std::string> dir_stack_type;
+ typedef std::unordered_set<std::string> part_set_type;
+
+ opc_reader(const opc_reader&) = delete;
+ opc_reader& operator=(const opc_reader&) = delete;
+
+public:
+
+ using sort_compare_type = std::function<bool(const opc_rel_t&, const opc_rel_t&)>;
+
+ /**
+ * Interface class for the user of opc_reader to receive callback to
+ * handle each xml part.
+ */
+ class part_handler
+ {
+ public:
+ virtual ~part_handler() = 0;
+
+ /**
+ * Client code needs to implement this method to handle each xml part.
+ *
+ * @param type schema type signifying the content type stored in this
+ * part.
+ * @param dir_path directory path relative to package root.
+ * @param file_name name of the xml part without the directory path.
+ * @param data extra data passed on from the client code.
+ *
+ * @return true if handled, false if not handled.
+ */
+ virtual bool handle_part(
+ schema_t type, const std::string& dir_path, const std::string& file_name, opc_rel_extra* data) = 0;
+ };
+
+ opc_reader(const config& opt, xmlns_repository& ns_repo, session_context& session_cxt, part_handler& handler);
+
+ void read_file(std::unique_ptr<zip_archive_stream>&& stream);
+ bool open_zip_stream(const std::string& path, std::vector<unsigned char>& buf);
+
+ /**
+ * Read an xml part inside package. The path is relative to the relation
+ * file.
+ *
+ * @param path the path to the xml part.
+ * @param type schema type.
+ */
+ void read_part(std::string_view path, const schema_t type, opc_rel_extra* data);
+
+ /**
+ * Check if a relation file exists for a given xml part, and if it does,
+ * read and process it.
+ *
+ * @param file_name name of the current xml part.
+ * @param extras optional extra data file for client code to pass on to
+ * the next xml part(s).
+ * @param sorter optoinal comparator function used to sort the relation
+ * items prior to processing them.
+ */
+ void check_relation_part(
+ const std::string& file_name, opc_rel_extras_t* extras = nullptr,
+ sort_compare_type* sorter = nullptr);
+
+private:
+
+ void list_content() const;
+ void read_content();
+ void read_content_types();
+ void read_relations(const char* path, std::vector<opc_rel_t>& rels);
+
+ std::string get_current_dir() const;
+
+private:
+ const config& m_config;
+ xmlns_repository& m_ns_repo;
+ session_context& m_session_cxt;
+ part_handler& m_handler;
+
+ std::unique_ptr<zip_archive> m_archive;
+ std::unique_ptr<zip_archive_stream> m_archive_stream;
+
+ xml_simple_stream_handler m_opc_rel_handler;
+
+ std::vector<xml_part_t> m_parts;
+ std::vector<xml_part_t> m_ext_defaults;
+ dir_stack_type m_dir_stack;
+ part_set_type m_handled_parts;
+};
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/opc_token_constants.hpp b/src/liborcus/opc_token_constants.hpp
new file mode 100644
index 0000000..a7b1370
--- /dev/null
+++ b/src/liborcus/opc_token_constants.hpp
@@ -0,0 +1,20 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef __ORCUS_OPC_TOKEN_CONSTANTS_HPP__
+#define __ORCUS_OPC_TOKEN_CONSTANTS_HPP__
+
+#include "orcus/types.hpp"
+
+namespace orcus {
+
+#include "opc_token_constants.inl"
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/opc_token_constants.inl b/src/liborcus/opc_token_constants.inl
new file mode 100644
index 0000000..7f3c7da
--- /dev/null
+++ b/src/liborcus/opc_token_constants.inl
@@ -0,0 +1,31 @@
+// This file has been auto-generated. Do not hand-edit this.
+
+const xml_token_t XML_ContentType = 1;
+const xml_token_t XML_Default = 2;
+const xml_token_t XML_Extension = 3;
+const xml_token_t XML_Format = 4;
+const xml_token_t XML_Id = 5;
+const xml_token_t XML_Override = 6;
+const xml_token_t XML_PartName = 7;
+const xml_token_t XML_Relationship = 8;
+const xml_token_t XML_RelationshipReference = 9;
+const xml_token_t XML_Relationships = 10;
+const xml_token_t XML_RelationshipsGroupReference = 11;
+const xml_token_t XML_SignatureTime = 12;
+const xml_token_t XML_SourceId = 13;
+const xml_token_t XML_SourceType = 14;
+const xml_token_t XML_Target = 15;
+const xml_token_t XML_TargetMode = 16;
+const xml_token_t XML_Type = 17;
+const xml_token_t XML_Types = 18;
+const xml_token_t XML_Value = 19;
+const xml_token_t XML_category = 20;
+const xml_token_t XML_contentStatus = 21;
+const xml_token_t XML_contentType = 22;
+const xml_token_t XML_coreProperties = 23;
+const xml_token_t XML_keywords = 24;
+const xml_token_t XML_lastModifiedBy = 25;
+const xml_token_t XML_lastPrinted = 26;
+const xml_token_t XML_revision = 27;
+const xml_token_t XML_version = 28;
+
diff --git a/src/liborcus/opc_tokens.inl b/src/liborcus/opc_tokens.inl
new file mode 100644
index 0000000..5f72a6a
--- /dev/null
+++ b/src/liborcus/opc_tokens.inl
@@ -0,0 +1,36 @@
+// This file has been auto-generated. Do not hand-edit this.
+
+const char* token_names[] = {
+ "??", // 0
+ "ContentType", // 1
+ "Default", // 2
+ "Extension", // 3
+ "Format", // 4
+ "Id", // 5
+ "Override", // 6
+ "PartName", // 7
+ "Relationship", // 8
+ "RelationshipReference", // 9
+ "Relationships", // 10
+ "RelationshipsGroupReference", // 11
+ "SignatureTime", // 12
+ "SourceId", // 13
+ "SourceType", // 14
+ "Target", // 15
+ "TargetMode", // 16
+ "Type", // 17
+ "Types", // 18
+ "Value", // 19
+ "category", // 20
+ "contentStatus", // 21
+ "contentType", // 22
+ "coreProperties", // 23
+ "keywords", // 24
+ "lastModifiedBy", // 25
+ "lastPrinted", // 26
+ "revision", // 27
+ "version" // 28
+};
+
+size_t token_name_count = 29;
+
diff --git a/src/liborcus/orcus_csv.cpp b/src/liborcus/orcus_csv.cpp
new file mode 100644
index 0000000..dff2b2d
--- /dev/null
+++ b/src/liborcus/orcus_csv.cpp
@@ -0,0 +1,196 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/orcus_csv.hpp"
+
+#include "orcus/csv_parser.hpp"
+#include "orcus/stream.hpp"
+#include "orcus/spreadsheet/import_interface.hpp"
+#include "orcus/config.hpp"
+#include "orcus/string_pool.hpp"
+
+#include <cstring>
+#include <iostream>
+
+using namespace std;
+
+namespace orcus {
+
+namespace {
+
+constexpr const char* base_sheet_name = "data";
+
+struct header_cell
+{
+ spreadsheet::row_t row;
+ spreadsheet::col_t col;
+ std::string_view value;
+
+ header_cell(spreadsheet::row_t _row, spreadsheet::col_t _col, std::string_view _value) :
+ row(_row), col(_col), value(_value) {}
+};
+
+class max_row_size_reached {};
+
+class orcus_csv_handler
+{
+public:
+ orcus_csv_handler(spreadsheet::iface::import_factory& factory, const orcus::config& app_config) :
+ m_factory(factory),
+ m_app_config(app_config),
+ mp_sheet(nullptr),
+ m_sheet(0),
+ m_row(0),
+ m_col(0) {}
+
+ void begin_parse()
+ {
+ std::string sheet_name = get_sheet_name();
+ mp_sheet = m_factory.append_sheet(m_sheet, sheet_name);
+ }
+
+ void end_parse() {}
+ void begin_row()
+ {
+ // Check to see if this row is beyond the max row of the current
+ // sheet, and if so, append a new sheet and reset the current row to
+ // 0.
+ if (m_row >= mp_sheet->get_sheet_size().rows)
+ {
+ auto csv = std::get<config::csv_config>(m_app_config.data);
+
+ if (!csv.split_to_multiple_sheets)
+ throw max_row_size_reached();
+
+ // The next row will be outside the boundary of the current sheet.
+ ++m_sheet;
+ std::string sheet_name = get_sheet_name();
+ mp_sheet = m_factory.append_sheet(m_sheet, sheet_name);
+ m_row = 0;
+
+ if (!m_header_cells.empty())
+ {
+ // Duplicate the header rows from the first sheet.
+ for (const header_cell& c : m_header_cells)
+ mp_sheet->set_auto(c.row, c.col, c.value);
+
+ m_row += csv.header_row_size;
+ }
+ }
+ }
+
+ void end_row()
+ {
+ ++m_row;
+ m_col = 0;
+ }
+
+ void cell(std::string_view v, bool transient)
+ {
+ auto csv = std::get<config::csv_config>(m_app_config.data);
+
+ if (m_sheet == 0 && size_t(m_row) < csv.header_row_size)
+ {
+ if (transient)
+ v = m_pool.intern(v).first;
+
+ m_header_cells.emplace_back(m_row, m_col, v);
+ }
+
+ mp_sheet->set_auto(m_row, m_col, v);
+ ++m_col;
+ }
+
+private:
+ std::string get_sheet_name() const
+ {
+ if (!m_sheet)
+ // First sheet has no suffix.
+ return base_sheet_name;
+
+ // Add a suffix to keep the sheet name unique.
+ std::ostringstream os;
+ os << base_sheet_name << '_' << m_sheet;
+ return os.str();
+ }
+
+private:
+ string_pool m_pool;
+ std::vector<header_cell> m_header_cells;
+
+ spreadsheet::iface::import_factory& m_factory;
+ const config& m_app_config;
+ spreadsheet::iface::import_sheet* mp_sheet;
+ spreadsheet::sheet_t m_sheet;
+ spreadsheet::row_t m_row;
+ spreadsheet::col_t m_col;
+};
+
+}
+
+struct orcus_csv::impl
+{
+ spreadsheet::iface::import_factory* factory;
+
+ impl(spreadsheet::iface::import_factory* _factory) : factory(_factory) {}
+
+ void parse(std::string_view stream, const config& conf)
+ {
+ if (stream.empty())
+ return;
+
+ orcus_csv_handler handler(*factory, conf);
+ csv::parser_config config;
+ config.delimiters.push_back(',');
+ config.text_qualifier = '"';
+ csv_parser<orcus_csv_handler> parser(stream, handler, config);
+ try
+ {
+ parser.parse();
+ }
+ catch (const max_row_size_reached&)
+ {
+ // The parser has decided to end the import due to the destination
+ // sheet being full.
+ }
+ catch (const parse_error& e)
+ {
+ cout << "parse failed at offset " << e.offset() << ": " << e.what() << endl;
+ }
+ }
+};
+
+orcus_csv::orcus_csv(spreadsheet::iface::import_factory* factory) :
+ iface::import_filter(format_t::csv),
+ mp_impl(std::make_unique<impl>(factory)) {}
+
+orcus_csv::~orcus_csv() {}
+
+void orcus_csv::read_file(std::string_view filepath)
+{
+ file_content fc(filepath);
+ mp_impl->parse(fc.str(), get_config());
+ mp_impl->factory->finalize();
+}
+
+void orcus_csv::read_stream(std::string_view stream)
+{
+ if (stream.empty())
+ return;
+
+ mp_impl->parse(stream, get_config());
+ mp_impl->factory->finalize();
+}
+
+std::string_view orcus_csv::get_name() const
+{
+ return "csv";
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/orcus_gnumeric.cpp b/src/liborcus/orcus_gnumeric.cpp
new file mode 100644
index 0000000..849759b
--- /dev/null
+++ b/src/liborcus/orcus_gnumeric.cpp
@@ -0,0 +1,163 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/orcus_gnumeric.hpp"
+#include "orcus/xml_namespace.hpp"
+#include "orcus/spreadsheet/import_interface.hpp"
+#include "orcus/stream.hpp"
+#include "orcus/config.hpp"
+
+#include "xml_stream_parser.hpp"
+#include "gnumeric_handler.hpp"
+#include "gnumeric_tokens.hpp"
+#include "gnumeric_namespace_types.hpp"
+#include "gnumeric_detection_handler.hpp"
+#include "session_context.hpp"
+#include "detection_result.hpp"
+
+#define ORCUS_DEBUG_GNUMERIC 0
+#define BOOST_IOSTREAMS_NO_LIB 1
+
+#include <iostream>
+#include <string>
+
+#include <boost/iostreams/filtering_stream.hpp>
+#include <boost/iostreams/filter/gzip.hpp>
+
+using namespace std;
+
+namespace orcus {
+
+namespace {
+
+bool decompress_gzip(const char* buffer, size_t size, string& decompressed)
+{
+ string buf;
+
+ try
+ {
+ boost::iostreams::filtering_ostream os;
+ os.push(boost::iostreams::gzip_decompressor());
+ os.push(boost::iostreams::back_inserter(buf));
+ boost::iostreams::write(os, buffer, size);
+ os.flush();
+ }
+ catch (const exception&)
+ {
+ return false;
+ }
+
+ buf.swap(decompressed);
+ return true;
+}
+
+}
+
+struct orcus_gnumeric::impl
+{
+ xmlns_repository m_ns_repo;
+ session_context m_cxt;
+ spreadsheet::iface::import_factory* mp_factory;
+
+ impl(spreadsheet::iface::import_factory* im_factory) :
+ mp_factory(im_factory) {}
+
+ void read_content_xml(std::string_view s, const config& conf)
+ {
+ xml_stream_parser parser(conf, m_ns_repo, gnumeric_tokens, s.data(), s.size());
+
+ auto handler = std::make_unique<gnumeric_content_xml_handler>(
+ m_cxt, gnumeric_tokens, mp_factory);
+
+ parser.set_handler(handler.get());
+ parser.parse();
+ }
+};
+
+orcus_gnumeric::orcus_gnumeric(spreadsheet::iface::import_factory* factory) :
+ iface::import_filter(format_t::gnumeric),
+ mp_impl(std::make_unique<impl>(factory))
+{
+ mp_impl->m_ns_repo.add_predefined_values(NS_gnumeric_all);
+}
+
+orcus_gnumeric::~orcus_gnumeric()
+{
+}
+
+bool orcus_gnumeric::detect(const unsigned char* buffer, size_t size)
+{
+ // Detect gnumeric format that's already in memory.
+
+ string decompressed;
+ if (!decompress_gzip(reinterpret_cast<const char*>(buffer), size, decompressed))
+ return false;
+
+ if (decompressed.empty())
+ return false;
+
+ // Parse this xml stream for detection.
+ config opt(format_t::gnumeric);
+ xmlns_repository ns_repo;
+ ns_repo.add_predefined_values(NS_gnumeric_all);
+ session_context cxt;
+ xml_stream_parser parser(opt, ns_repo, gnumeric_tokens, &decompressed[0], decompressed.size());
+ gnumeric_detection_handler handler(cxt, gnumeric_tokens);
+ parser.set_handler(&handler);
+
+ try
+ {
+ parser.parse();
+ }
+ catch (const detection_result& res)
+ {
+ return res.get_result();
+ }
+ catch (...) {}
+
+ return false;
+}
+
+void orcus_gnumeric::read_file(std::string_view filepath)
+{
+#if ORCUS_DEBUG_GNUMERIC
+ cout << "reading " << filepath << endl;
+#endif
+
+ file_content content(filepath);
+ if (content.empty())
+ return;
+
+ read_stream(content.str());
+}
+
+void orcus_gnumeric::read_stream(std::string_view stream)
+{
+ if (stream.empty())
+ return;
+
+ std::string file_content;
+ if (!decompress_gzip(stream.data(), stream.size(), file_content))
+ return;
+
+ if (auto* gs = mp_impl->mp_factory->get_global_settings(); gs)
+ {
+ gs->set_origin_date(1899, 12, 30);
+ gs->set_default_formula_grammar(spreadsheet::formula_grammar_t::gnumeric);
+ }
+
+ mp_impl->read_content_xml(file_content, get_config());
+ mp_impl->mp_factory->finalize();
+}
+
+std::string_view orcus_gnumeric::get_name() const
+{
+ return "gnumeric";
+}
+
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/orcus_import_ods.cpp b/src/liborcus/orcus_import_ods.cpp
new file mode 100644
index 0000000..0c73472
--- /dev/null
+++ b/src/liborcus/orcus_import_ods.cpp
@@ -0,0 +1,51 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/orcus_import_ods.hpp"
+
+#include "orcus/xml_namespace.hpp"
+#include "orcus/spreadsheet/import_interface.hpp"
+#include "orcus/config.hpp"
+
+#include "odf_styles_context.hpp"
+#include "odf_tokens.hpp"
+#include "odf_namespace_types.hpp"
+#include "session_context.hpp"
+#include "ods_session_data.hpp"
+
+#include "xml_stream_parser.hpp"
+
+namespace orcus {
+
+void import_ods::read_styles(std::string_view s, spreadsheet::iface::import_styles* styles)
+{
+ if (!styles)
+ return;
+
+ if (s.empty())
+ return;
+
+ session_context cxt{std::make_unique<ods_session_data>()};
+ auto context = std::make_unique<styles_context>(cxt, odf_tokens, styles);
+
+ xml_stream_handler stream_handler(cxt, odf_tokens, std::move(context));
+
+ xmlns_repository ns_repo;
+ ns_repo.add_predefined_values(NS_odf_all);
+
+ orcus::config config(format_t::ods);
+ config.debug = true;
+ xml_stream_parser parser(
+ config, ns_repo, odf_tokens,
+ s.data(), s.size());
+ parser.set_handler(&stream_handler);
+ parser.parse();
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/orcus_import_xlsx.cpp b/src/liborcus/orcus_import_xlsx.cpp
new file mode 100644
index 0000000..265f419
--- /dev/null
+++ b/src/liborcus/orcus_import_xlsx.cpp
@@ -0,0 +1,51 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/orcus_import_xlsx.hpp"
+
+#include "orcus/xml_namespace.hpp"
+#include "orcus/spreadsheet/import_interface.hpp"
+#include "orcus/config.hpp"
+
+#include "xlsx_types.hpp"
+#include "xlsx_handler.hpp"
+#include "ooxml_tokens.hpp"
+
+#include "xml_stream_parser.hpp"
+#include "ooxml_namespace_types.hpp"
+#include "xlsx_session_data.hpp"
+#include "ooxml_global.hpp"
+
+namespace orcus {
+
+void import_xlsx::read_table(
+ std::string_view s,
+ spreadsheet::iface::import_table& table,
+ spreadsheet::iface::import_reference_resolver& resolver)
+{
+ if (s.empty())
+ return;
+
+ session_context cxt;
+ auto handler = std::make_unique<xlsx_table_xml_handler>(cxt, ooxml_tokens, table, resolver);
+
+ xmlns_repository ns_repo;
+ ns_repo.add_predefined_values(NS_ooxml_all);
+ ns_repo.add_predefined_values(NS_opc_all);
+ ns_repo.add_predefined_values(NS_misc_all);
+
+ orcus::config config(format_t::xlsx);
+ xml_stream_parser parser(
+ config, ns_repo, ooxml_tokens,
+ s.data(), s.size());
+ parser.set_handler(handler.get());
+ parser.parse();
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/orcus_json.cpp b/src/liborcus/orcus_json.cpp
new file mode 100644
index 0000000..9b6195f
--- /dev/null
+++ b/src/liborcus/orcus_json.cpp
@@ -0,0 +1,513 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/orcus_json.hpp>
+#include <orcus/json_document_tree.hpp>
+#include <orcus/json_structure_tree.hpp>
+#include <orcus/config.hpp>
+#include <orcus/spreadsheet/import_interface.hpp>
+#include <orcus/json_parser.hpp>
+#include <orcus/stream.hpp>
+
+#include "json_map_tree.hpp"
+#include "json_structure_mapper.hpp"
+
+#include <iostream>
+#include <sstream>
+
+namespace orcus {
+
+namespace {
+
+struct json_value
+{
+ enum class value_type { string, numeric, boolean, null };
+
+ value_type type;
+
+ union
+ {
+ struct { const char* p; size_t n; } str;
+ double numeric;
+ bool boolean;
+
+ } value;
+
+ json_value(double v) : type(value_type::numeric)
+ {
+ value.numeric = v;
+ }
+
+ json_value(const char* p, size_t n) : type(value_type::string)
+ {
+ value.str.p = p;
+ value.str.n = n;
+ }
+
+ json_value(bool v) : type(value_type::boolean)
+ {
+ value.boolean = v;
+ }
+
+ json_value(value_type vt) : type(vt) {}
+
+ void commit(spreadsheet::iface::import_factory& im_factory, const cell_position_t& pos) const
+ {
+ spreadsheet::iface::import_sheet* sheet = im_factory.get_sheet(pos.sheet);
+
+ if (!sheet)
+ return;
+
+ switch (type)
+ {
+ case value_type::string:
+ {
+ spreadsheet::iface::import_shared_strings* ss = im_factory.get_shared_strings();
+ if (!ss)
+ break;
+
+ size_t sid = ss->add({value.str.p, value.str.n});
+ sheet->set_string(pos.row, pos.col, sid);
+ break;
+ }
+ case value_type::numeric:
+ sheet->set_value(pos.row, pos.col, value.numeric);
+ break;
+ case value_type::boolean:
+ sheet->set_bool(pos.row, pos.col, value.boolean);
+ break;
+ case value_type::null:
+ break;
+ }
+ }
+};
+
+class json_content_handler
+{
+ json_map_tree::walker m_walker;
+ json_map_tree::node* mp_current_node;
+ json_map_tree::range_reference_type* mp_increment_row;
+
+ struct row_group_scope
+ {
+ json_map_tree::node* node;
+ spreadsheet::row_t row_position;
+
+ row_group_scope(json_map_tree::node* _node, spreadsheet::row_t _row_position) :
+ node(_node), row_position(_row_position) {}
+ };
+
+ /**
+ * Stack of row group nodes, used to keep track of whether or not we are
+ * currently within a linked range.
+ */
+ std::vector<row_group_scope> m_row_group_stack;
+
+ spreadsheet::iface::import_factory& m_im_factory;
+
+public:
+ json_content_handler(const json_map_tree& map_tree, spreadsheet::iface::import_factory& im_factory) :
+ m_walker(map_tree.get_tree_walker()),
+ mp_current_node(nullptr),
+ mp_increment_row(nullptr),
+ m_im_factory(im_factory) {}
+
+ void begin_parse() {}
+ void end_parse() {}
+
+ void begin_array()
+ {
+ push_node(json_map_tree::input_node_type::array);
+ }
+
+ void end_array()
+ {
+ pop_node(json_map_tree::input_node_type::array);
+ }
+
+ void begin_object()
+ {
+ push_node(json_map_tree::input_node_type::object);
+ }
+
+ void object_key(std::string_view key, bool /*transient*/)
+ {
+ m_walker.set_object_key(key.data(), key.size());
+ }
+
+ void end_object()
+ {
+ pop_node(json_map_tree::input_node_type::object);
+ }
+
+ void boolean_true()
+ {
+ push_node(json_map_tree::input_node_type::value);
+ commit_value(true);
+ pop_node(json_map_tree::input_node_type::value);
+ }
+
+ void boolean_false()
+ {
+ push_node(json_map_tree::input_node_type::value);
+ commit_value(false);
+ pop_node(json_map_tree::input_node_type::value);
+ }
+
+ void null()
+ {
+ push_node(json_map_tree::input_node_type::value);
+ commit_value(json_value::value_type::null);
+ pop_node(json_map_tree::input_node_type::value);
+ }
+
+ void string(std::string_view val, bool /*transient*/)
+ {
+ push_node(json_map_tree::input_node_type::value);
+ commit_value(json_value(val.data(), val.size()));
+ pop_node(json_map_tree::input_node_type::value);
+ }
+
+ void number(double val)
+ {
+ push_node(json_map_tree::input_node_type::value);
+ commit_value(val);
+ pop_node(json_map_tree::input_node_type::value);
+ }
+
+private:
+
+ void push_node(json_map_tree::input_node_type nt)
+ {
+ if (!m_row_group_stack.empty() && mp_current_node)
+ {
+ if (mp_current_node->row_group && mp_increment_row == mp_current_node->row_group)
+ {
+ // The last closing node was a row group boundary. Increment the row position.
+ ++mp_current_node->row_group->row_position;
+ mp_increment_row = nullptr;
+ }
+ }
+
+ mp_current_node = m_walker.push_node(nt);
+
+ if (mp_current_node && mp_current_node->row_group)
+ {
+ m_row_group_stack.emplace_back(
+ mp_current_node, mp_current_node->row_group->row_position);
+ }
+ }
+
+ void pop_node(json_map_tree::input_node_type nt)
+ {
+ spreadsheet::row_t row_start = -1;
+ spreadsheet::row_t row_end = -1;
+ json_map_tree::range_reference_type* fill_down_ref = nullptr;
+
+ if (mp_current_node && mp_current_node->row_group)
+ {
+ // We are exiting a row group.
+ assert(!m_row_group_stack.empty());
+ assert(m_row_group_stack.back().node == mp_current_node);
+
+ // Record the current row range for this level.
+ row_start = m_row_group_stack.back().row_position;
+ row_end = mp_current_node->row_group->row_position;
+
+ if (row_end > row_start && m_row_group_stack.size() > 1)
+ {
+ // The current range is longer than 1. We need to perform fill-downs for the parent level.
+ fill_down_ref = mp_current_node->row_group;
+
+ if (fill_down_ref->row_header)
+ {
+ // Account for the row header.
+ ++row_start;
+ ++row_end;
+ }
+ }
+
+ m_row_group_stack.pop_back();
+ }
+
+ mp_current_node = m_walker.pop_node(nt);
+
+ if (!m_row_group_stack.empty())
+ {
+ if (mp_current_node && mp_current_node->row_group)
+ {
+ assert(m_row_group_stack.back().node == mp_current_node);
+ mp_increment_row = mp_current_node->row_group;
+ }
+
+ if (fill_down_ref)
+ {
+ // Perform fill-downs for all anchored fields.
+ const cell_position_t& pos = fill_down_ref->pos;
+ spreadsheet::iface::import_sheet* sheet = m_im_factory.get_sheet(pos.sheet);
+
+ if (sheet)
+ {
+ json_map_tree::node* node = m_row_group_stack.back().node;
+ for (const json_map_tree::node* anchored_field : node->anchored_fields)
+ {
+ spreadsheet::col_t col_offset =
+ anchored_field->value.range_field_ref->column_pos;
+ sheet->fill_down_cells(
+ pos.row + row_start, pos.col + col_offset, row_end - row_start);
+ }
+ }
+ }
+ }
+ }
+
+ void commit_value(const json_value& v)
+ {
+ if (!mp_current_node)
+ return;
+
+ switch (mp_current_node->type)
+ {
+ case json_map_tree::map_node_type::cell_ref:
+ {
+ // Single cell reference
+ v.commit(m_im_factory, mp_current_node->value.cell_ref->pos);
+ break;
+ }
+ case json_map_tree::map_node_type::range_field_ref:
+ {
+ // Range field reference. Offset from the origin before
+ // pushing the value.
+ spreadsheet::col_t col_offset = mp_current_node->value.range_field_ref->column_pos;
+ json_map_tree::range_reference_type* ref = mp_current_node->value.range_field_ref->ref;
+
+ cell_position_t pos = ref->pos; // copy
+ pos.col += col_offset;
+ pos.row += ref->row_position;
+ if (ref->row_header)
+ ++pos.row; // Account for the row header.
+
+ v.commit(m_im_factory, pos);
+ break;
+ }
+ default:
+ ;
+ }
+ }
+};
+
+} // anonymous namespace
+
+struct orcus_json::impl
+{
+ spreadsheet::iface::import_factory* im_factory;
+ spreadsheet::sheet_t sheet_count;
+ json_map_tree map_tree;
+
+ impl(spreadsheet::iface::import_factory* _im_factory) :
+ im_factory(_im_factory), sheet_count(0) {}
+};
+
+orcus_json::orcus_json(spreadsheet::iface::import_factory* im_fact) :
+ mp_impl(std::make_unique<impl>(im_fact)) {}
+
+orcus_json::~orcus_json() {}
+
+void orcus_json::set_cell_link(std::string_view path, std::string_view sheet, spreadsheet::row_t row, spreadsheet::col_t col)
+{
+ mp_impl->map_tree.set_cell_link(path, cell_position_t(sheet, row, col));
+}
+
+void orcus_json::start_range(std::string_view sheet, spreadsheet::row_t row, spreadsheet::col_t col, bool row_header)
+{
+ mp_impl->map_tree.start_range(cell_position_t(sheet, row, col), row_header);
+}
+
+void orcus_json::append_field_link(std::string_view path, std::string_view label)
+{
+ mp_impl->map_tree.append_field_link(path, label);
+}
+
+void orcus_json::set_range_row_group(std::string_view path)
+{
+ mp_impl->map_tree.set_range_row_group(path);
+}
+
+void orcus_json::commit_range()
+{
+ mp_impl->map_tree.commit_range();
+}
+
+void orcus_json::append_sheet(std::string_view name)
+{
+ if (name.empty())
+ return;
+
+ mp_impl->im_factory->append_sheet(mp_impl->sheet_count++, name);
+}
+
+void orcus_json::read_stream(std::string_view stream)
+{
+ if (!mp_impl->im_factory)
+ return;
+
+ spreadsheet::iface::import_shared_strings* ss = mp_impl->im_factory->get_shared_strings();
+ if (!ss)
+ return;
+
+ // Insert range headers first (if applicable).
+ for (const auto& entry : mp_impl->map_tree.get_range_references())
+ {
+ const json_map_tree::range_reference_type& ref = entry.second;
+ if (!ref.row_header)
+ // This range does not use row header.
+ continue;
+
+ const cell_position_t& origin = ref.pos;
+
+ spreadsheet::iface::import_sheet* sheet = mp_impl->im_factory->get_sheet(origin.sheet);
+
+ if (!sheet)
+ continue;
+
+ for (const json_map_tree::range_field_reference_type* field : ref.fields)
+ {
+ cell_position_t pos = origin;
+ pos.col += field->column_pos;
+ size_t sid = ss->add(field->label);
+ sheet->set_string(pos.row, pos.col, sid);
+ }
+ }
+
+ json_content_handler hdl(mp_impl->map_tree, *mp_impl->im_factory);
+ json_parser<json_content_handler> parser(stream, hdl);
+ parser.parse();
+
+ mp_impl->im_factory->finalize();
+}
+
+void orcus_json::read_map_definition(std::string_view stream)
+{
+ try
+ {
+ // Since a typical map file will likely be very small, let's be lazy and
+ // load the whole thing into a in-memory tree.
+ json::document_tree map_doc;
+ json_config jc;
+ jc.preserve_object_order = false;
+ jc.persistent_string_values = false;
+ jc.resolve_references = false;
+
+ map_doc.load(stream, jc);
+ json::const_node root = map_doc.get_document_root();
+
+ // Create sheets first.
+
+ if (!root.has_key("sheets"))
+ throw json_structure_error("The map definition must contains 'sheets' section.");
+
+ for (const json::const_node& node_name : root.child("sheets"))
+ append_sheet(node_name.string_value());
+
+ if (root.has_key("cells"))
+ {
+ // Set cell links.
+ for (const json::const_node& link_node : root.child("cells"))
+ {
+ std::string_view path = link_node.child("path").string_value();
+ std::string_view sheet = link_node.child("sheet").string_value();
+ spreadsheet::row_t row = link_node.child("row").numeric_value();
+ spreadsheet::col_t col = link_node.child("column").numeric_value();
+
+ set_cell_link(path, sheet, row, col);
+ }
+ }
+
+ if (root.has_key("ranges"))
+ {
+ // Set range links.
+ for (const json::const_node& link_node : root.child("ranges"))
+ {
+ std::string_view sheet = link_node.child("sheet").string_value();
+ spreadsheet::row_t row = link_node.child("row").numeric_value();
+ spreadsheet::col_t col = link_node.child("column").numeric_value();
+
+ bool row_header = link_node.has_key("row-header") && link_node.child("row-header").type() == json::node_t::boolean_true;
+
+ start_range(sheet, row, col, row_header);
+
+ for (const json::const_node& field_node : link_node.child("fields"))
+ {
+ std::string_view path = field_node.child("path").string_value();
+ std::string_view label;
+ if (field_node.has_key("label"))
+ {
+ json::const_node label_node = field_node.child("label");
+ if (label_node.type() == json::node_t::string)
+ label = label_node.string_value();
+ }
+
+ append_field_link(path, label);
+ }
+
+ for (const json::const_node& rg_node : link_node.child("row-groups"))
+ {
+ std::string_view path = rg_node.child("path").string_value();
+ set_range_row_group(path);
+ }
+
+ commit_range();
+ }
+ }
+ }
+ catch (const parse_error& e)
+ {
+ std::ostringstream os;
+ os << "Error parsing the map definition file:" << std::endl
+ << std::endl
+ << create_parse_error_output(stream, e.offset()) << std::endl
+ << e.what();
+
+ throw invalid_map_error(os.str());
+ }
+}
+
+void orcus_json::detect_map_definition(std::string_view stream)
+{
+ size_t range_count = 0;
+ std::string sheet_name_prefix = "range-";
+
+ json::structure_tree::range_handler_type rh = [&](json::table_range_t&& range)
+ {
+ // Build sheet name first and insert a new sheet.
+ std::ostringstream os_sheet_name;
+ os_sheet_name << sheet_name_prefix << range_count;
+ std::string sheet_name = os_sheet_name.str();
+ append_sheet(sheet_name);
+
+ // Push the linked range.
+ start_range(sheet_name, 0, 0, true);
+
+ for (const std::string& s : range.paths)
+ append_field_link(s, std::string_view());
+
+ for (const std::string& s : range.row_groups)
+ set_range_row_group(s);
+
+ commit_range();
+
+ ++range_count;
+ };
+
+ json::structure_tree structure;
+ structure.parse(stream);
+ structure.process_ranges(rh);
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/orcus_ods.cpp b/src/liborcus/orcus_ods.cpp
new file mode 100644
index 0000000..41acf65
--- /dev/null
+++ b/src/liborcus/orcus_ods.cpp
@@ -0,0 +1,230 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/orcus_ods.hpp>
+#include <orcus/xml_namespace.hpp>
+#include <orcus/zip_archive.hpp>
+#include <orcus/zip_archive_stream.hpp>
+#include <orcus/measurement.hpp>
+
+#include "xml_stream_parser.hpp"
+#include "ods_content_xml_context.hpp"
+#include "ods_session_data.hpp"
+#include "odf_document_styles_context.hpp"
+#include "odf_tokens.hpp"
+#include "odf_styles.hpp"
+#include "odf_namespace_types.hpp"
+#include "session_context.hpp"
+
+#include <cstdlib>
+#include <iostream>
+#include <vector>
+#include <cstring>
+
+namespace orcus {
+
+struct orcus_ods::impl
+{
+ xmlns_repository ns_repo;
+ session_context cxt;
+ spreadsheet::iface::import_factory* xfactory;
+
+ impl(spreadsheet::iface::import_factory* im_factory) :
+ cxt(std::make_unique<ods_session_data>()), xfactory(im_factory) {}
+};
+
+orcus_ods::orcus_ods(spreadsheet::iface::import_factory* factory) :
+ iface::import_filter(format_t::ods),
+ mp_impl(std::make_unique<impl>(factory))
+{
+ mp_impl->ns_repo.add_predefined_values(NS_odf_all);
+}
+
+orcus_ods::~orcus_ods() = default;
+
+void orcus_ods::list_content(const zip_archive& archive)
+{
+ size_t num = archive.get_file_entry_count();
+ std::cout << "number of files this archive contains: " << num << std::endl;
+
+ for (size_t i = 0; i < num; ++i)
+ {
+ std::string_view filename = archive.get_file_entry_name(i);
+ if (filename.empty())
+ std::cout << "(empty)" << std::endl;
+ else
+ std::cout << filename << std::endl;
+ }
+}
+
+void orcus_ods::read_styles(const zip_archive& archive)
+{
+ auto* xstyles = mp_impl->xfactory->get_styles();
+ if (!xstyles)
+ return;
+
+ std::vector<unsigned char> buf;
+
+ try
+ {
+ buf = archive.read_file_entry("styles.xml");
+ }
+ catch (const std::exception& e)
+ {
+ std::cerr << "failed to get stat on styles.xml (reason: " << e.what() << ")" << std::endl;
+ return;
+ }
+
+ xml_stream_parser parser(
+ get_config(), mp_impl->ns_repo, odf_tokens,
+ reinterpret_cast<const char*>(buf.data()), buf.size());
+
+ auto& ods_data = mp_impl->cxt.get_data<ods_session_data>();
+ auto context = std::make_unique<document_styles_context>(
+ mp_impl->cxt, odf_tokens, ods_data.styles_map, xstyles);
+
+ xml_stream_handler handler(mp_impl->cxt, odf_tokens, std::move(context));
+
+ parser.set_handler(&handler);
+ parser.parse();
+
+ if (get_config().debug)
+ dump_state(ods_data.styles_map, std::cout);
+}
+
+void orcus_ods::read_content(const zip_archive& archive)
+{
+ std::vector<unsigned char> buf;
+
+ try
+ {
+ buf = archive.read_file_entry("content.xml");
+ }
+ catch (const std::exception& e)
+ {
+ std::cerr << "failed to get stat on content.xml (reason: " << e.what() << ")" << std::endl;
+ return;
+ }
+
+ read_content_xml(buf.data(), buf.size());
+}
+
+void orcus_ods::read_content_xml(const unsigned char* p, size_t size)
+{
+ bool use_threads = true;
+
+ if (const char* p_env = std::getenv("ORCUS_ODS_USE_THREADS"); p_env)
+ use_threads = to_bool(p_env);
+
+ auto context = std::make_unique<ods_content_xml_context>(
+ mp_impl->cxt, odf_tokens, mp_impl->xfactory);
+
+ if (use_threads)
+ {
+ threaded_xml_stream_parser parser(
+ get_config(), mp_impl->ns_repo, odf_tokens,
+ reinterpret_cast<const char*>(p), size);
+
+ xml_stream_handler handler(mp_impl->cxt, odf_tokens, std::move(context));
+ parser.set_handler(&handler);
+ parser.parse();
+
+ string_pool this_pool;
+ parser.swap_string_pool(this_pool);
+ mp_impl->cxt.spool.merge(this_pool);
+ }
+ else
+ {
+ xml_stream_parser parser(
+ get_config(), mp_impl->ns_repo, odf_tokens,
+ reinterpret_cast<const char*>(p), size);
+
+ xml_stream_handler handler(mp_impl->cxt, odf_tokens, std::move(context));
+ parser.set_handler(&handler);
+ parser.parse();
+ }
+}
+
+bool orcus_ods::detect(const unsigned char* blob, size_t size)
+{
+ zip_archive_stream_blob stream(blob, size);
+ zip_archive archive(&stream);
+
+ try
+ {
+ archive.load();
+
+ std::vector<unsigned char> buf = archive.read_file_entry("mimetype");
+
+ if (buf.empty())
+ // mimetype is empty.
+ return false;
+
+ const char* mimetype = "application/vnd.oasis.opendocument.spreadsheet";
+ size_t n = std::strlen(mimetype);
+ if (buf.size() < n)
+ return false;
+
+ if (strncmp(mimetype, reinterpret_cast<const char*>(buf.data()), n))
+ // The mimetype content differs.
+ return false;
+ }
+ catch (const zip_error&)
+ {
+ // Not a valid zip archive.
+ return false;
+ }
+
+ return true;
+}
+
+void orcus_ods::read_file(std::string_view filepath)
+{
+ zip_archive_stream_fd stream(std::string{filepath}.c_str());
+ read_file_impl(&stream);
+}
+
+void orcus_ods::read_stream(std::string_view stream)
+{
+ zip_archive_stream_blob blob(
+ reinterpret_cast<const uint8_t*>(stream.data()), stream.size());
+ read_file_impl(&blob);
+}
+
+void orcus_ods::read_file_impl(zip_archive_stream* stream)
+{
+ zip_archive archive(stream);
+ archive.load();
+ if (get_config().debug)
+ list_content(archive);
+
+ spreadsheet::formula_grammar_t old_grammar = spreadsheet::formula_grammar_t::unknown;
+
+ spreadsheet::iface::import_global_settings* gs = mp_impl->xfactory->get_global_settings();
+ if (gs)
+ {
+ old_grammar = gs->get_default_formula_grammar();
+ gs->set_default_formula_grammar(spreadsheet::formula_grammar_t::ods);
+ }
+
+ read_styles(archive);
+ read_content(archive);
+
+ mp_impl->xfactory->finalize();
+
+ if (gs)
+ // This grammar will be used
+ gs->set_default_formula_grammar(old_grammar);
+}
+
+std::string_view orcus_ods::get_name() const
+{
+ return "ods";
+}
+
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/orcus_parquet.cpp b/src/liborcus/orcus_parquet.cpp
new file mode 100644
index 0000000..2bd85ac
--- /dev/null
+++ b/src/liborcus/orcus_parquet.cpp
@@ -0,0 +1,547 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/orcus_parquet.hpp>
+#include <orcus/stream.hpp>
+#include <orcus/config.hpp>
+#include <orcus/spreadsheet/types.hpp>
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wshadow"
+#pragma GCC diagnostic ignored "-Wunused-parameter"
+#include <arrow/io/file.h>
+#include <arrow/io/memory.h>
+#include <parquet/stream_reader.h>
+#include <parquet/arrow/reader.h>
+#pragma GCC diagnostic pop
+
+#include "filesystem_env.hpp"
+
+#include <iostream>
+#include <unordered_map>
+
+namespace ss = orcus::spreadsheet;
+
+namespace orcus {
+
+class orcus_parquet::impl
+{
+ using columns_type = std::vector<std::pair<ss::col_t, const parquet::ColumnDescriptor*>>;
+
+ const config& m_config;
+
+ ss::iface::import_factory* m_factory = nullptr;
+ ss::iface::import_shared_strings* m_sstrings = nullptr;
+ ss::iface::import_sheet* m_sheet = nullptr;
+
+ columns_type m_columns;
+
+ parquet::StreamReader m_stream;
+
+ static columns_type init_columns(const parquet::FileMetaData& file_md)
+ {
+ columns_type columns;
+
+ const parquet::SchemaDescriptor* schema_desc = file_md.schema();
+
+ if (!schema_desc)
+ return columns;
+
+ columns.reserve(schema_desc->num_columns());
+
+ for (int i = 0; i < schema_desc->num_columns(); ++i)
+ {
+ const parquet::ColumnDescriptor* col_desc = schema_desc->Column(i);
+ columns.emplace_back(i, col_desc);
+ }
+
+ return columns;
+ }
+
+ void warn(std::string_view msg) const
+ {
+ if (!m_config.debug)
+ return;
+
+ std::cerr << "warning: " << msg << std::endl;
+ }
+
+ /**
+ * Import column labels as the first row.
+ */
+ void import_column_labels()
+ {
+ // Import column labels as first row
+ for (const auto& [col, p] : m_columns)
+ {
+ if (!m_sstrings)
+ continue;
+
+ std::size_t si = m_sstrings->add(p->name());
+ m_sheet->set_string(0, col, si);
+ }
+ }
+
+ template<typename T>
+ std::optional<T> read_or_warn(ss::row_t row, ss::col_t col)
+ {
+ T v;
+
+ try
+ {
+ m_stream >> v;
+ return v;
+ }
+ catch (const std::exception& e)
+ {
+ std::ostringstream os;
+ os << "failed to read a value for (row=" << row << "; col=" << col << "): " << e.what();
+ warn(os.str());
+ }
+
+ return std::optional<T>{};
+ }
+
+ void import_byte_array(ss::row_t row, ss::col_t col, const parquet::ColumnDescriptor* p)
+ {
+ switch (p->converted_type())
+ {
+ case parquet::ConvertedType::UTF8:
+ {
+ if (!m_sstrings)
+ {
+ m_stream.SkipColumns(1);
+ break;
+ }
+
+ if (auto v = read_or_warn<std::string>(row, col); v)
+ {
+ std::size_t si = m_sstrings->add(*v);
+ m_sheet->set_string(row, col, si);
+ }
+ break;
+ }
+ default:
+ {
+ std::ostringstream os;
+ os << "WIP: unhandled converted type for BYTE_ARRAY (converted="
+ << p->converted_type() << ")";
+ warn(os.str());
+ m_stream.SkipColumns(1);
+ }
+ }
+ }
+
+ void import_fixed_len_byte_array(ss::row_t /*row*/, ss::col_t /*col*/, const parquet::ColumnDescriptor* /*p*/)
+ {
+ warn("WIP: physical=FIXED_LEN_BYTE_ARRAY not handled yet");
+ m_stream.SkipColumns(1);
+ }
+
+ void import_int32(ss::row_t row, ss::col_t col, const parquet::ColumnDescriptor* p)
+ {
+ switch (p->converted_type())
+ {
+ case parquet::ConvertedType::NONE:
+ {
+ if (auto v = read_or_warn<int32_t>(row, col); v)
+ m_sheet->set_value(row, col, *v);
+ break;
+ }
+ default:
+ warn("WIP: unhandled converted type for INT32");
+ m_stream.SkipColumns(1);
+ }
+ }
+
+ void import_int64(ss::row_t row, ss::col_t col, const parquet::ColumnDescriptor* p)
+ {
+ switch (p->converted_type())
+ {
+ case parquet::ConvertedType::NONE:
+ {
+ if (auto v = read_or_warn<int64_t>(row, col); v)
+ m_sheet->set_value(row, col, *v);
+ break;
+ }
+ default:
+ warn("WIP: unhandled converted type for INT64");
+ m_stream.SkipColumns(1);
+ }
+ }
+
+ void import_int96(ss::row_t /*row*/, ss::col_t /*col*/, const parquet::ColumnDescriptor* /*p*/)
+ {
+ warn("WIP: physical=INT96 not handled yet");
+ m_stream.SkipColumns(1);
+ }
+
+ void import_boolean(ss::row_t row, ss::col_t col, const parquet::ColumnDescriptor* p)
+ {
+ if (p->converted_type() != parquet::ConvertedType::NONE)
+ {
+ warn("WIP: unhandled covnerted type for BOOLEAN");
+ m_stream.SkipColumns(1);
+ return;
+ }
+
+ if (auto v = read_or_warn<bool>(row, col); v)
+ m_sheet->set_bool(row, col, *v);
+ }
+
+ void import_float(ss::row_t row, ss::col_t col, const parquet::ColumnDescriptor* p)
+ {
+ if (p->converted_type() != parquet::ConvertedType::NONE)
+ {
+ warn("WIP: unhandled covnerted type for FLOAT");
+ m_stream.SkipColumns(1);
+ return;
+ }
+
+ if (auto v = read_or_warn<float>(row, col); v)
+ m_sheet->set_value(row, col, *v);
+ }
+
+ void import_double(ss::row_t row, ss::col_t col, const parquet::ColumnDescriptor* p)
+ {
+ if (p->converted_type() != parquet::ConvertedType::NONE)
+ {
+ warn("WIP: unhandled covnerted type for DOUBLE");
+ m_stream.SkipColumns(1);
+ return;
+ }
+
+ if (auto v = read_or_warn<double>(row, col); v)
+ m_sheet->set_value(row, col, *v);
+ }
+
+ void dump_metadata(const parquet::FileMetaData& metadata) const
+ {
+ if (!m_config.debug)
+ return;
+
+ auto _bool_v = [](bool v) { return v ? "true" : "false"; };
+
+ auto _version_v = [](parquet::ParquetVersion::type t) -> std::string
+ {
+ const std::unordered_map<parquet::ParquetVersion::type, std::string_view> mapping =
+ {
+ { parquet::ParquetVersion::PARQUET_1_0, "PARQUET_1_0" },
+ { parquet::ParquetVersion::PARQUET_2_4, "PARQUET_2_4" },
+ { parquet::ParquetVersion::PARQUET_2_6, "PARQUET_2_6" },
+ };
+
+ std::ostringstream os;
+ auto it = mapping.find(t);
+ os << (it == mapping.end() ? "???" : it->second) << " (" << int(t) << ")";
+ return os.str();
+ };
+
+ auto _compression_v = [](parquet::Compression::type t) -> std::string
+ {
+ const std::unordered_map<parquet::Compression::type, std::string_view> mapping =
+ {
+ { parquet::Compression::UNCOMPRESSED, "UNCOMPRESSED" },
+ { parquet::Compression::SNAPPY, "SNAPPY" },
+ { parquet::Compression::GZIP, "GZIP" },
+ { parquet::Compression::BROTLI, "BROTLI" },
+ { parquet::Compression::ZSTD, "ZSTD" },
+ { parquet::Compression::LZ4, "LZ4" },
+ { parquet::Compression::LZ4_FRAME, "LZ4_FRAME" },
+ { parquet::Compression::LZO, "LZO" },
+ { parquet::Compression::BZ2, "BZ2" },
+ { parquet::Compression::LZ4_HADOOP, "LZ4_HADOOP" },
+ };
+
+ std::ostringstream os;
+ auto it = mapping.find(t);
+ os << (it == mapping.end() ? "???" : it->second) << " (" << int(t) << ")";
+ return os.str();
+ };
+
+ std::cerr << "metadata size: " << metadata.size() << std::endl;
+ std::cerr << "version: " << _version_v(metadata.version()) << std::endl;
+ std::cerr << "created by: " << metadata.created_by() << std::endl;
+ std::cerr << "num columns: " << metadata.num_columns() << std::endl;
+ std::cerr << "num rows: " << metadata.num_rows() << std::endl;
+ std::cerr << "num row groups: " << metadata.num_row_groups() << std::endl;
+ std::cerr << "num schema elements: " << metadata.num_schema_elements() << std::endl;
+ std::cerr << "can decompress: " << _bool_v(metadata.can_decompress()) << std::endl;
+
+ for (int i = 0; i < metadata.num_row_groups(); ++i)
+ {
+ std::cerr << "row group " << i << ":" << std::endl;
+ auto rg = metadata.RowGroup(i);
+ std::cerr << " num rows: " << rg->num_rows() << std::endl;
+ std::cerr << " total byte size: " << rg->total_byte_size() << std::endl;
+ std::cerr << " total compressed size: " << rg->total_compressed_size() << std::endl;
+ std::cerr << " file offset: " << rg->file_offset() << std::endl;
+ std::cerr << " num columns: " << rg->num_columns() << std::endl;
+
+ for (int j = 0; j < rg->num_columns(); ++j)
+ {
+ std::cerr << " column chunk " << j << ":" << std::endl;
+ auto cc = rg->ColumnChunk(j);
+ std::cerr << " file path: " << cc->file_path() << std::endl;
+ std::cerr << " num values: " << cc->num_values() << std::endl;
+ std::cerr << " type: " << cc->type() << std::endl;
+ std::cerr << " data page offset: " << std::dec << cc->data_page_offset() << std::endl;
+ std::cerr << " compression: " << _compression_v(cc->compression()) << std::endl;
+ std::cerr << " has dictionary page: " << _bool_v(cc->has_dictionary_page()) << std::endl;
+
+ if (cc->has_dictionary_page())
+ std::cerr << " dictionary page offset: " << cc->dictionary_page_offset() << std::endl;
+
+ std::cerr << " has index page: " << _bool_v(cc->has_index_page()) << std::endl;
+ if (cc->has_index_page())
+ std::cerr << " index page offset: " << cc->index_page_offset() << std::endl;
+ }
+ }
+
+ if (const parquet::SchemaDescriptor* schema_desc = metadata.schema(); schema_desc)
+ {
+ std::cerr << "schema:" << std::endl;
+ std::cerr << " name: " << schema_desc->name() << std::endl;
+ std::cerr << " num columns: " << schema_desc->num_columns() << std::endl;
+
+ for (int i = 0; i < schema_desc->num_columns(); ++i)
+ {
+ if (const parquet::ColumnDescriptor* col_desc = schema_desc->Column(i); col_desc)
+ {
+ std::cerr << " column " << i << ":" << std::endl;
+ std::cerr << " name: " << col_desc->name() << std::endl;
+ std::cerr << " physical type: " << col_desc->physical_type() << std::endl;
+ std::cerr << " converted type: " << col_desc->converted_type() << std::endl;
+ std::cerr << " type length: " << col_desc->type_length() << std::endl;
+ }
+ }
+ }
+ }
+
+ /**
+ * Check to see if this file is safe to load. There are some conditions
+ * that are known to lead to trouble if we proceed to load.
+ */
+ bool is_safe_to_load(const parquet::FileMetaData& metadata) const
+ {
+ const parquet::SchemaDescriptor* schema = metadata.schema();
+ if (!schema)
+ return false;
+
+ const auto* gnode = schema->group_node();
+ if (!gnode)
+ return false;
+
+ if (schema->group_node()->field_count() != schema->num_columns())
+ // StreamReader assumes these two values to be equal, and crashes
+ // if not. But with some files the two can be different.
+ return false;
+
+ return true;
+ }
+
+ void read_stream_with_sheet_name(std::string_view sheet_name, std::string_view stream)
+ {
+ auto buf = std::make_shared<arrow::io::BufferReader>(stream);
+
+ auto file_reader = parquet::ParquetFileReader::Open(buf);
+ if (!file_reader)
+ {
+ warn("failed to open a parquet file reader from an in-memory buffer.");
+ return;
+ }
+
+ auto file_md = file_reader->metadata();
+
+ dump_metadata(*file_md);
+
+ if (!is_safe_to_load(*file_md))
+ {
+ warn("aborting because this file exhibits a condition known to lead to issues if loaded.");
+ return;
+ }
+
+ if (file_md->num_rows() < 0 || file_md->num_columns() < 0)
+ // Nothing to import. Bail out.
+ return;
+
+ m_sheet = m_factory->append_sheet(0, sheet_name);
+
+ if (!m_sheet)
+ // Failed to append sheet. Bail out.
+ return;
+
+ m_columns = init_columns(*file_md);
+ if (m_columns.empty())
+ // Column data initialization failed. Bail out.
+ return;
+
+ m_stream = parquet::StreamReader{std::move(file_reader)};
+ if (m_stream.eof())
+ return;
+
+ m_sstrings = m_factory->get_shared_strings();
+
+ import_column_labels();
+
+ for (int i = 0; i < file_md->num_rows(); ++i)
+ {
+ ss::row_t row = i + 1; // account for the header row
+
+ for (const auto& [col, p] : m_columns)
+ {
+ switch (p->physical_type())
+ {
+ case parquet::Type::BOOLEAN:
+ {
+ import_boolean(row, col, p);
+ break;
+ }
+ case parquet::Type::INT32:
+ {
+ import_int32(row, col, p);
+ break;
+ }
+ case parquet::Type::INT64:
+ {
+ import_int64(row, col, p);
+ break;
+ }
+ case parquet::Type::INT96:
+ {
+ import_int96(row, col, p);
+ break;
+ }
+ case parquet::Type::FLOAT:
+ {
+ import_float(row, col, p);
+ break;
+ }
+ case parquet::Type::DOUBLE:
+ {
+ import_double(row, col, p);
+ break;
+ }
+ case parquet::Type::BYTE_ARRAY:
+ {
+ import_byte_array(row, col, p);
+ break;
+ }
+ case parquet::Type::FIXED_LEN_BYTE_ARRAY:
+ {
+ import_fixed_len_byte_array(row, col, p);
+ break;
+ }
+ default:
+ {
+ std::ostringstream os;
+ os << "WIP: type not handled: physical=" << p->physical_type() << "; converted=" << p->converted_type();
+ warn(os.str());
+ m_stream.SkipColumns(1);
+ }
+ }
+ }
+
+ m_stream >> parquet::EndRow;
+ }
+
+ m_factory->finalize();
+ }
+
+public:
+ impl(const config& c, ss::iface::import_factory* factory) : m_config(c), m_factory(factory) {}
+
+ void read_file(fs::path filepath)
+ {
+ file_content fc(filepath.string());
+ try
+ {
+ read_stream_with_sheet_name(filepath.stem().string(), fc.str());
+ }
+ catch (const std::exception& e)
+ {
+ warn(e.what());
+ m_factory->finalize();
+ }
+ }
+
+ void read_stream(std::string_view stream)
+ {
+ try
+ {
+ read_stream_with_sheet_name("Data", stream);
+ }
+ catch (const std::exception& e)
+ {
+ warn(e.what());
+ m_factory->finalize();
+ }
+ }
+};
+
+orcus_parquet::orcus_parquet(spreadsheet::iface::import_factory* factory) :
+ iface::import_filter(format_t::parquet),
+ mp_impl(std::make_unique<impl>(get_config(), factory))
+{
+}
+
+orcus_parquet::~orcus_parquet() = default;
+
+bool orcus_parquet::detect(const unsigned char* blob, std::size_t size)
+{
+ if (size < 12u)
+ // At minimum header magic bytes (4), footer magic bytes (4), and the
+ // footer metadata length (4).
+ return false;
+
+ const auto* p = blob;
+
+ // Check the first 4 bytes.
+ if (std::string_view(reinterpret_cast<const char*>(p), 4) != "PAR1")
+ return false;
+
+ // Check the last 4 bytes.
+ p += size - 4u;
+ if (std::string_view(reinterpret_cast<const char*>(p), 4) != "PAR1")
+ return false;
+
+ // Check the footer metadata size (little endian)
+ p -= 1u;
+ std::uint32_t footer_size = *p--;
+ footer_size <<= 8;
+ footer_size |= *p--;
+ footer_size <<= 8;
+ footer_size |= *p--;
+ footer_size <<= 8;
+ footer_size |= *p;
+
+ p -= footer_size;
+ if (p <= blob)
+ // footer metadata position must be within the stream.
+ return false;
+
+ return true;
+}
+
+void orcus_parquet::read_file(std::string_view filepath)
+{
+ mp_impl->read_file(fs::path{std::string{filepath}});
+}
+
+void orcus_parquet::read_stream(std::string_view stream)
+{
+ mp_impl->read_stream(stream);
+}
+
+std::string_view orcus_parquet::get_name() const
+{
+ return "parquet";
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/orcus_xls_xml.cpp b/src/liborcus/orcus_xls_xml.cpp
new file mode 100644
index 0000000..b37f9c5
--- /dev/null
+++ b/src/liborcus/orcus_xls_xml.cpp
@@ -0,0 +1,134 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/orcus_xls_xml.hpp"
+#include "orcus/stream.hpp"
+#include "orcus/xml_namespace.hpp"
+#include "orcus/config.hpp"
+#include "orcus/spreadsheet/import_interface.hpp"
+#include "orcus/parser_base.hpp"
+
+#include "xml_stream_parser.hpp"
+#include "xls_xml_handler.hpp"
+#include "xls_xml_detection_handler.hpp"
+#include "session_context.hpp"
+#include "xls_xml_tokens.hpp"
+#include "xls_xml_namespace_types.hpp"
+#include "detection_result.hpp"
+
+#include <iostream>
+#include <locale>
+#include <codecvt>
+
+using namespace std;
+
+namespace orcus {
+
+struct orcus_xls_xml::impl
+{
+ xmlns_repository m_ns_repo;
+ session_context m_cxt;
+ spreadsheet::iface::import_factory* mp_factory;
+
+ impl(spreadsheet::iface::import_factory* factory) : mp_factory(factory) {}
+
+ void read_stream(const char* content, size_t len, const config& cnf)
+ {
+ if (!content || !len)
+ return;
+
+ spreadsheet::iface::import_global_settings* gs =
+ mp_factory->get_global_settings();
+
+ if (!gs)
+ return;
+
+ gs->set_origin_date(1899, 12, 30);
+ gs->set_default_formula_grammar(spreadsheet::formula_grammar_t::xls_xml);
+
+ xml_stream_parser parser(cnf, m_ns_repo, xls_xml_tokens, content, len);
+
+ auto handler = std::make_unique<xls_xml_handler>(m_cxt, xls_xml_tokens, mp_factory);
+
+ parser.set_handler(handler.get());
+ try
+ {
+ parser.parse();
+ }
+ catch (const parse_error& e)
+ {
+ std::cerr << create_parse_error_output(std::string_view(content, len), e.offset()) << std::endl;
+ std::cerr << e.what() << std::endl;
+ return;
+ }
+
+ mp_factory->finalize();
+ }
+};
+
+orcus_xls_xml::orcus_xls_xml(spreadsheet::iface::import_factory* factory) :
+ iface::import_filter(format_t::xls_xml),
+ mp_impl(std::make_unique<impl>(factory))
+{
+ mp_impl->m_ns_repo.add_predefined_values(NS_xls_xml_all);
+}
+
+orcus_xls_xml::~orcus_xls_xml() = default;
+
+bool orcus_xls_xml::detect(const unsigned char* buffer, size_t size)
+{
+ memory_content mem_content({reinterpret_cast<const char*>(buffer), size});
+ mem_content.convert_to_utf8();
+
+ config opt(format_t::xls_xml);
+ xmlns_repository ns_repo;
+ ns_repo.add_predefined_values(NS_xls_xml_all);
+ xml_stream_parser parser(opt, ns_repo, xls_xml_tokens, mem_content.data(), mem_content.size());
+
+ session_context cxt;
+ xls_xml_detection_handler handler(cxt, xls_xml_tokens);
+ parser.set_handler(&handler);
+ try
+ {
+ parser.parse();
+ }
+ catch (const detection_result& res)
+ {
+ return res.get_result();
+ }
+ catch (...) {}
+
+ return false;
+}
+
+void orcus_xls_xml::read_file(std::string_view filepath)
+{
+ file_content content(filepath.data());
+ if (content.empty())
+ return;
+
+ content.convert_to_utf8();
+ mp_impl->read_stream(content.data(), content.size(), get_config());
+}
+
+void orcus_xls_xml::read_stream(std::string_view stream)
+{
+ memory_content mem_content(stream);
+ if (mem_content.empty())
+ return;
+
+ mem_content.convert_to_utf8();
+ mp_impl->read_stream(mem_content.data(), mem_content.size(), get_config());
+}
+
+std::string_view orcus_xls_xml::get_name() const
+{
+ return "xls-xml";
+}
+
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/orcus_xlsx.cpp b/src/liborcus/orcus_xlsx.cpp
new file mode 100644
index 0000000..db55dd2
--- /dev/null
+++ b/src/liborcus/orcus_xlsx.cpp
@@ -0,0 +1,824 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/orcus_xlsx.hpp"
+
+#include "orcus/xml_namespace.hpp"
+#include "orcus/spreadsheet/import_interface.hpp"
+#include "orcus/exception.hpp"
+#include "orcus/config.hpp"
+#include "orcus/measurement.hpp"
+
+#include "xlsx_types.hpp"
+#include "xlsx_handler.hpp"
+#include "xlsx_shared_strings_context.hpp"
+#include "xlsx_styles_context.hpp"
+#include "xlsx_workbook_context.hpp"
+#include "xlsx_revision_context.hpp"
+#include "ooxml_tokens.hpp"
+
+#include "xml_stream_parser.hpp"
+#include "xml_simple_stream_handler.hpp"
+#include "opc_reader.hpp"
+#include "ooxml_namespace_types.hpp"
+#include "xlsx_session_data.hpp"
+#include "opc_context.hpp"
+#include "ooxml_global.hpp"
+#include "spreadsheet_iface_util.hpp"
+#include "ooxml_content_types.hpp"
+
+#include <cstdlib>
+#include <iostream>
+#include <limits>
+#include <string>
+#include <cstring>
+#include <sstream>
+
+using namespace std;
+
+namespace orcus {
+
+class xlsx_opc_handler : public opc_reader::part_handler
+{
+ orcus_xlsx& m_parent;
+public:
+ xlsx_opc_handler(orcus_xlsx& parent) : m_parent(parent) {}
+ virtual ~xlsx_opc_handler() {}
+
+ virtual bool handle_part(
+ schema_t type, const std::string& dir_path, const std::string& file_name, opc_rel_extra* data)
+ {
+ if (type == SCH_od_rels_office_doc)
+ {
+ m_parent.read_workbook(dir_path, file_name);
+ return true;
+ }
+ else if (type == SCH_od_rels_worksheet)
+ {
+ m_parent.read_sheet(dir_path, file_name, static_cast<xlsx_rel_sheet_info*>(data));
+ return true;
+ }
+ else if (type == SCH_od_rels_shared_strings)
+ {
+ m_parent.read_shared_strings(dir_path, file_name);
+ return true;
+ }
+ else if (type == SCH_od_rels_styles)
+ {
+ m_parent.read_styles(dir_path, file_name);
+ return true;
+ }
+ else if (type == SCH_od_rels_drawing)
+ {
+ m_parent.read_drawing(dir_path, file_name);
+ return true;
+ }
+ else if (type == SCH_od_rels_table)
+ {
+ m_parent.read_table(dir_path, file_name, static_cast<xlsx_rel_table_info*>(data));
+ return true;
+ }
+ else if (type == SCH_od_rels_pivot_cache_def)
+ {
+ m_parent.read_pivot_cache_def(
+ dir_path, file_name, static_cast<xlsx_rel_pivot_cache_info*>(data));
+ return true;
+ }
+ else if (type == SCH_od_rels_pivot_cache_rec)
+ {
+ m_parent.read_pivot_cache_rec(
+ dir_path, file_name,
+ static_cast<const xlsx_rel_pivot_cache_record_info*>(data));
+ return true;
+ }
+ else if (type == SCH_od_rels_pivot_table)
+ {
+ m_parent.read_pivot_table(dir_path, file_name);
+ return true;
+ }
+ else if (type == SCH_od_rels_rev_headers)
+ {
+ m_parent.read_rev_headers(dir_path, file_name);
+ return true;
+ }
+ else if (type == SCH_od_rels_rev_log)
+ {
+ m_parent.read_rev_log(dir_path, file_name);
+ return true;
+ }
+
+ return false;
+ }
+};
+
+struct orcus_xlsx::impl
+{
+ session_context m_cxt;
+ xmlns_repository m_ns_repo;
+ spreadsheet::iface::import_factory* mp_factory;
+ xlsx_opc_handler m_opc_handler;
+ opc_reader m_opc_reader;
+
+ impl(spreadsheet::iface::import_factory* factory, orcus_xlsx& parent) :
+ m_cxt(std::make_unique<xlsx_session_data>()),
+ mp_factory(factory),
+ m_opc_handler(parent),
+ m_opc_reader(parent.get_config(), m_ns_repo, m_cxt, m_opc_handler) {}
+};
+
+orcus_xlsx::orcus_xlsx(spreadsheet::iface::import_factory* factory) :
+ iface::import_filter(format_t::xlsx),
+ mp_impl(std::make_unique<impl>(factory, *this))
+{
+ if (!factory)
+ throw std::invalid_argument("factory instance is required.");
+
+ spreadsheet::iface::import_global_settings* gs = factory->get_global_settings();
+ if (gs)
+ {
+ gs->set_origin_date(1899, 12, 30);
+ gs->set_default_formula_grammar(spreadsheet::formula_grammar_t::xlsx);
+ }
+
+ mp_impl->m_ns_repo.add_predefined_values(NS_ooxml_all);
+ mp_impl->m_ns_repo.add_predefined_values(NS_opc_all);
+ mp_impl->m_ns_repo.add_predefined_values(NS_misc_all);
+}
+
+orcus_xlsx::~orcus_xlsx() {}
+
+bool orcus_xlsx::detect(const unsigned char* blob, size_t size)
+{
+ zip_archive_stream_blob stream(blob, size);
+ zip_archive archive(&stream);
+
+ try
+ {
+ archive.load();
+
+ // Find and parse [Content_Types].xml which is required for OPC package.
+ std::vector<unsigned char> buf = archive.read_file_entry("[Content_Types].xml");
+
+ if (buf.empty())
+ return false;
+
+ config opt(format_t::xlsx);
+ xmlns_repository ns_repo;
+ ns_repo.add_predefined_values(NS_opc_all);
+ session_context session_cxt;
+ xml_stream_parser parser(
+ opt, ns_repo, opc_tokens, reinterpret_cast<const char*>(&buf[0]), buf.size());
+
+ xml_simple_stream_handler handler(
+ session_cxt, opc_tokens,
+ std::make_unique<opc_content_types_context>(session_cxt, opc_tokens));
+ parser.set_handler(&handler);
+ parser.parse();
+
+ opc_content_types_context& context =
+ static_cast<opc_content_types_context&>(handler.get_context());
+
+ std::vector<xml_part_t> parts;
+ context.pop_parts(parts);
+
+ if (parts.empty())
+ return false;
+
+ // See if we can find the workbook stream.
+ xml_part_t workbook_part("/xl/workbook.xml", CT_ooxml_xlsx_sheet_main);
+ return std::find(parts.begin(), parts.end(), workbook_part) != parts.end();
+ }
+ catch (const std::exception&)
+ {
+ return false;
+ }
+}
+
+void orcus_xlsx::read_file(std::string_view filepath)
+{
+ std::unique_ptr<zip_archive_stream> stream(
+ new zip_archive_stream_fd(std::string{filepath}.c_str()));
+ mp_impl->m_opc_reader.read_file(std::move(stream));
+
+ // Formulas need to be inserted to the document after the shared string
+ // table get imported, because tokenization of formulas may add new shared
+ // string instances.
+ set_formulas_to_doc();
+
+ mp_impl->mp_factory->finalize();
+}
+
+void orcus_xlsx::read_stream(std::string_view stream)
+{
+ std::unique_ptr<zip_archive_stream> blob(
+ new zip_archive_stream_blob(
+ reinterpret_cast<const uint8_t*>(stream.data()), stream.size()));
+ mp_impl->m_opc_reader.read_file(std::move(blob));
+
+ // Formulas need to be inserted to the document after the shared string
+ // table get imported, because tokenization of formulas may add new shared
+ // string instances.
+ set_formulas_to_doc();
+
+ mp_impl->mp_factory->finalize();
+}
+
+std::string_view orcus_xlsx::get_name() const
+{
+ return "xlsx";
+}
+
+void orcus_xlsx::set_formulas_to_doc()
+{
+ auto push_formula_result = [this](spreadsheet::iface::import_formula* formula, const formula_result& res)
+ {
+ switch (res.type)
+ {
+ case formula_result::result_type::numeric:
+ formula->set_result_value(res.value_numeric);
+ break;
+ case formula_result::result_type::string:
+ formula->set_result_string({res.value_string.p, res.value_string.n});
+ break;
+ case formula_result::result_type::empty:
+ break;
+ default:
+ {
+ if (get_config().debug)
+ std::cerr << "warning: unhandled formula result (orcus_xlsx::set_formulas_to_doc)" << std::endl;
+ }
+ }
+ };
+
+ auto& sdata = mp_impl->m_cxt.get_data<xlsx_session_data>();
+
+ // Insert shared formulas first.
+ for (auto& p : sdata.m_shared_formulas)
+ {
+ xlsx_session_data::shared_formula& sf = *p;
+ spreadsheet::iface::import_sheet* sheet = mp_impl->mp_factory->get_sheet(sf.sheet);
+ if (!sheet)
+ continue;
+
+ spreadsheet::iface::import_formula* formula = sheet->get_formula();
+ if (!formula)
+ continue;
+
+ formula->set_position(sf.row, sf.column);
+ if (sf.master)
+ formula->set_formula(orcus::spreadsheet::formula_grammar_t::xlsx, sf.formula);
+ formula->set_shared_formula_index(sf.identifier);
+
+ push_formula_result(formula, sf.result);
+ formula->commit();
+ }
+
+ // Insert regular (non-shared) formulas.
+ for (auto& p : sdata.m_formulas)
+ {
+ xlsx_session_data::formula& f = *p;
+ spreadsheet::iface::import_sheet* sheet = mp_impl->mp_factory->get_sheet(f.sheet);
+ if (!sheet)
+ continue;
+
+ spreadsheet::iface::import_formula* formula = sheet->get_formula();
+ if (!formula)
+ continue;
+
+ formula->set_position(f.ref.row, f.ref.column);
+ formula->set_formula(orcus::spreadsheet::formula_grammar_t::xlsx, f.exp);
+
+ push_formula_result(formula, f.result);
+ formula->commit();
+ }
+
+ // Insert array formulas.
+ for (auto& p : sdata.m_array_formulas)
+ {
+ xlsx_session_data::array_formula& af = *p;
+ spreadsheet::iface::import_sheet* sheet = mp_impl->mp_factory->get_sheet(af.sheet);
+ if (!sheet)
+ continue;
+
+ spreadsheet::iface::import_array_formula* xaf = sheet->get_array_formula();
+ push_array_formula(xaf, af.ref, af.exp, spreadsheet::formula_grammar_t::xlsx, *af.results);
+ }
+}
+
+namespace {
+
+size_t get_schema_rank(const schema_t sch)
+{
+ using map_type = std::unordered_map <schema_t, size_t>;
+
+ static const schema_t schema_rank[] = {
+ SCH_od_rels_shared_strings,
+ SCH_od_rels_pivot_cache_def,
+ SCH_od_rels_worksheet,
+ nullptr
+ };
+
+ static map_type rank_map;
+
+ if (rank_map.empty())
+ {
+ // initialize it.
+ size_t rank = 0;
+ for (const schema_t* p = schema_rank; *p; ++rank, ++p)
+ {
+ rank_map.insert(
+ map_type::value_type(*p, rank));
+ }
+ }
+
+ auto it = rank_map.find(sch);
+ return it == rank_map.end() ? numeric_limits<size_t>::max() : it->second;
+}
+
+}
+
+void orcus_xlsx::read_workbook(const string& dir_path, const string& file_name)
+{
+ std::string filepath = resolve_file_path(dir_path, file_name);
+ if (get_config().debug)
+ cout << "read_workbook: file path = " << filepath << endl;
+
+ vector<unsigned char> buffer;
+ if (!mp_impl->m_opc_reader.open_zip_stream(filepath, buffer))
+ return;
+
+ if (buffer.empty())
+ return;
+
+ auto handler = std::make_unique<xml_simple_stream_handler>(
+ mp_impl->m_cxt, ooxml_tokens,
+ std::make_unique<xlsx_workbook_context>(mp_impl->m_cxt, ooxml_tokens, *mp_impl->mp_factory));
+
+ xml_stream_parser parser(
+ get_config(), mp_impl->m_ns_repo, ooxml_tokens,
+ reinterpret_cast<const char*>(&buffer[0]), buffer.size());
+ parser.set_handler(handler.get());
+ parser.parse();
+
+ // Get sheet info from the context instance.
+ xlsx_workbook_context& context =
+ static_cast<xlsx_workbook_context&>(handler->get_context());
+ opc_rel_extras_t workbook_data;
+ context.pop_workbook_info(workbook_data);
+ if (get_config().debug)
+ {
+ for_each(workbook_data.data.begin(), workbook_data.data.end(),
+ [](const opc_rel_extras_t::map_type::value_type& v)
+ {
+ const xlsx_rel_sheet_info* info =
+ dynamic_cast<const xlsx_rel_sheet_info*>(v.second.get());
+
+ if (info)
+ {
+ cout << "relationship id: " << v.first << "; sheet name: " << info->name << "; sheet id: " << info->id << endl;
+ }
+
+ const xlsx_rel_pivot_cache_info* info_pc =
+ dynamic_cast<const xlsx_rel_pivot_cache_info*>(v.second.get());
+
+ if (info_pc)
+ {
+ cout << "relationship id: " << v.first << "; pivot cache id: " << info_pc->id << endl;
+ }
+ }
+ );
+ }
+
+ handler.reset();
+
+ // Re-order the relation items so that shared strings get imported first,
+ // pivot caches get imported before the sheets and so on.
+
+ opc_reader::sort_compare_type sort_func =
+ [](const opc_rel_t& left, const opc_rel_t& right)
+ {
+ size_t rank_left = get_schema_rank(left.type), rank_right = get_schema_rank(right.type);
+ if (rank_left != rank_right)
+ return rank_left < rank_right;
+
+ std::string_view rid1 = left.rid, rid2 = right.rid;
+
+ if (rid1.size() > 1 && rid2.size() > 1)
+ {
+ // numerical comparison of relation ID's.
+ rid1 = std::string_view(rid1.data()+1, rid1.size()-1); // remove the 'r' prefix.
+ rid2 = std::string_view(rid2.data()+1, rid2.size()-1); // remove the 'r' prefix.
+ return to_long(rid1) < to_long(rid2);
+ }
+
+ // textural comparison of relation ID's.
+ return left.rid < right.rid;
+ };
+
+ mp_impl->m_opc_reader.check_relation_part(file_name, &workbook_data, &sort_func);
+}
+
+void orcus_xlsx::read_sheet(
+ const std::string& dir_path, const std::string& file_name, xlsx_rel_sheet_info* data)
+{
+ if (!data || !data->id)
+ // Sheet ID must not be 0.
+ return;
+
+ std::string filepath = resolve_file_path(dir_path, file_name);
+ if (get_config().debug)
+ {
+ cout << "---" << endl;
+ cout << "read_sheet: file path = " << filepath << endl;
+ }
+
+ vector<unsigned char> buffer;
+ if (!mp_impl->m_opc_reader.open_zip_stream(filepath, buffer))
+ return;
+
+ if (buffer.empty())
+ return;
+
+ if (get_config().debug)
+ {
+ cout << "relationship sheet data: " << endl;
+ cout << " sheet name: " << data->name << " sheet ID: " << data->id << endl;
+ }
+
+ spreadsheet::iface::import_sheet* sheet = mp_impl->mp_factory->get_sheet(data->name);
+ if (!sheet)
+ {
+ std::ostringstream os;
+ os << "orcus_xlsx::read_sheet: ";
+ os << "sheet named '" << data->name << "' doesn't exist.";
+ throw general_error(os.str());
+ }
+
+ spreadsheet::iface::import_reference_resolver* resolver =
+ mp_impl->mp_factory->get_reference_resolver(spreadsheet::formula_ref_context_t::global);
+ if (!resolver)
+ throw general_error("orcus_xlsx::read_sheet: reference resolver interface is not available.");
+
+ xml_stream_parser parser(
+ get_config(), mp_impl->m_ns_repo, ooxml_tokens,
+ reinterpret_cast<const char*>(&buffer[0]), buffer.size());
+
+ auto handler = std::make_unique<xlsx_sheet_xml_handler>(
+ mp_impl->m_cxt, ooxml_tokens, data->id-1, *resolver, *sheet);
+
+ parser.set_handler(handler.get());
+ parser.parse();
+
+ opc_rel_extras_t table_info;
+ handler->pop_rel_extras(table_info);
+ handler.reset();
+ mp_impl->m_opc_reader.check_relation_part(file_name, &table_info);
+}
+
+void orcus_xlsx::read_shared_strings(const std::string& dir_path, const std::string& file_name)
+{
+ std::string filepath = resolve_file_path(dir_path, file_name);
+ if (get_config().debug)
+ {
+ cout << "---" << endl;
+ cout << "read_shared_strings: file path = " << filepath << endl;
+ }
+
+ vector<unsigned char> buffer;
+ if (!mp_impl->m_opc_reader.open_zip_stream(filepath, buffer))
+ return;
+
+ if (buffer.empty())
+ return;
+
+ xml_stream_parser parser(
+ get_config(), mp_impl->m_ns_repo, ooxml_tokens,
+ reinterpret_cast<const char*>(&buffer[0]), buffer.size());
+
+ auto handler = std::make_unique<xml_simple_stream_handler>(
+ mp_impl->m_cxt, ooxml_tokens,
+ std::make_unique<xlsx_shared_strings_context>(
+ mp_impl->m_cxt, ooxml_tokens, mp_impl->mp_factory->get_shared_strings()));
+
+ parser.set_handler(handler.get());
+ parser.parse();
+}
+
+void orcus_xlsx::read_styles(const std::string& dir_path, const std::string& file_name)
+{
+ std::string filepath = resolve_file_path(dir_path, file_name);
+ if (get_config().debug)
+ {
+ cout << "---" << endl;
+ cout << "read_styles: file path = " << filepath << endl;
+ }
+
+ spreadsheet::iface::import_styles* styles = mp_impl->mp_factory->get_styles();
+ if (!styles)
+ // Client code doesn't support styles.
+ return;
+
+ vector<unsigned char> buffer;
+ if (!mp_impl->m_opc_reader.open_zip_stream(filepath, buffer))
+ return;
+
+ if (buffer.empty())
+ return;
+
+ xml_stream_parser parser(
+ get_config(), mp_impl->m_ns_repo, ooxml_tokens,
+ reinterpret_cast<const char*>(&buffer[0]), buffer.size());
+
+ auto handler = std::make_unique<xml_simple_stream_handler>(
+ mp_impl->m_cxt, ooxml_tokens,
+ std::make_unique<xlsx_styles_context>(
+ mp_impl->m_cxt, ooxml_tokens, mp_impl->mp_factory->get_styles()));
+
+ parser.set_handler(handler.get());
+ parser.parse();
+}
+
+void orcus_xlsx::read_table(const std::string& dir_path, const std::string& file_name, xlsx_rel_table_info* data)
+{
+ if (!data || !data->sheet_interface)
+ return;
+
+ spreadsheet::iface::import_table* table = data->sheet_interface->get_table();
+ if (!table)
+ // Client code doesn't support tables. No point going further.
+ return;
+
+ spreadsheet::iface::import_reference_resolver* resolver =
+ mp_impl->mp_factory->get_reference_resolver(spreadsheet::formula_ref_context_t::global);
+
+ if (!resolver)
+ // This client doesn't support reference resolver, but is required.
+ return;
+
+ std::string filepath = resolve_file_path(dir_path, file_name);
+ if (get_config().debug)
+ {
+ cout << "---" << endl;
+ cout << "read_table: file path = " << filepath << endl;
+ }
+
+ vector<unsigned char> buffer;
+ if (!mp_impl->m_opc_reader.open_zip_stream(filepath, buffer))
+ {
+ cerr << "failed to open zip stream: " << filepath << endl;
+ return;
+ }
+
+ if (buffer.empty())
+ return;
+
+ auto handler = std::make_unique<xlsx_table_xml_handler>(
+ mp_impl->m_cxt, ooxml_tokens, *table, *resolver);
+
+ xml_stream_parser parser(
+ get_config(), mp_impl->m_ns_repo, ooxml_tokens,
+ reinterpret_cast<const char*>(&buffer[0]), buffer.size());
+ parser.set_handler(handler.get());
+ parser.parse();
+
+ handler.reset();
+}
+
+void orcus_xlsx::read_pivot_cache_def(
+ const std::string& dir_path, const std::string& file_name,
+ const xlsx_rel_pivot_cache_info* data)
+{
+ if (!data)
+ {
+ if (get_config().debug)
+ {
+ cout << "---" << endl;
+ cout << "required pivot cache relation info was not present." << endl;
+ }
+ return;
+ }
+
+ std::string filepath = resolve_file_path(dir_path, file_name);
+ if (get_config().debug)
+ {
+ cout << "---" << endl;
+ cout << "read_pivot_cache_def: file path = " << filepath
+ << "; cache id = " << data->id << endl;
+ }
+
+ vector<unsigned char> buffer;
+ if (!mp_impl->m_opc_reader.open_zip_stream(filepath, buffer))
+ {
+ cerr << "failed to open zip stream: " << filepath << endl;
+ return;
+ }
+
+ if (buffer.empty())
+ return;
+
+ spreadsheet::iface::import_pivot_cache_definition* pcache =
+ mp_impl->mp_factory->create_pivot_cache_definition(data->id);
+
+ if (!pcache)
+ // failed to create a cache instance for whatever reason.
+ return;
+
+ auto handler = std::make_unique<xlsx_pivot_cache_def_xml_handler>(
+ mp_impl->m_cxt, ooxml_tokens, *pcache, data->id);
+
+ xml_stream_parser parser(
+ get_config(), mp_impl->m_ns_repo, ooxml_tokens,
+ reinterpret_cast<const char*>(&buffer[0]), buffer.size());
+ parser.set_handler(handler.get());
+ parser.parse();
+
+ opc_rel_extras_t pcache_info = handler->pop_rel_extras();
+
+ handler.reset();
+ mp_impl->m_opc_reader.check_relation_part(file_name, &pcache_info);
+}
+
+void orcus_xlsx::read_pivot_cache_rec(
+ const std::string& dir_path, const std::string& file_name,
+ const xlsx_rel_pivot_cache_record_info* data)
+{
+ if (!data)
+ {
+ if (get_config().debug)
+ {
+ cout << "---" << endl;
+ cout << "required pivot cache record relation info was not present." << endl;
+ }
+ return;
+ }
+
+ std::string filepath = resolve_file_path(dir_path, file_name);
+ if (get_config().debug)
+ {
+ cout << "---" << endl;
+ cout << "read_pivot_cache_rec: file path = " << filepath << "; cache id = " << data->id << endl;
+ }
+
+ vector<unsigned char> buffer;
+ if (!mp_impl->m_opc_reader.open_zip_stream(filepath, buffer))
+ {
+ cerr << "failed to open zip stream: " << filepath << endl;
+ return;
+ }
+
+ if (buffer.empty())
+ return;
+
+ spreadsheet::iface::import_pivot_cache_records* pcache_records =
+ mp_impl->mp_factory->create_pivot_cache_records(data->id);
+
+ if (!pcache_records)
+ return;
+
+ auto handler = std::make_unique<xlsx_pivot_cache_rec_xml_handler>(
+ mp_impl->m_cxt, ooxml_tokens, *pcache_records);
+
+ xml_stream_parser parser(
+ get_config(), mp_impl->m_ns_repo, ooxml_tokens,
+ reinterpret_cast<const char*>(&buffer[0]), buffer.size());
+ parser.set_handler(handler.get());
+ parser.parse();
+
+ handler.reset();
+}
+
+void orcus_xlsx::read_pivot_table(const std::string& dir_path, const std::string& file_name)
+{
+ std::string filepath = resolve_file_path(dir_path, file_name);
+ if (get_config().debug)
+ {
+ cout << "---" << endl;
+ cout << "read_pivot_table: file path = " << filepath << endl;
+ }
+
+ vector<unsigned char> buffer;
+ if (!mp_impl->m_opc_reader.open_zip_stream(filepath, buffer))
+ {
+ cerr << "failed to open zip stream: " << filepath << endl;
+ return;
+ }
+
+ if (buffer.empty())
+ return;
+
+ auto handler = std::make_unique<xlsx_pivot_table_xml_handler>(mp_impl->m_cxt, ooxml_tokens);
+
+ xml_stream_parser parser(
+ get_config(), mp_impl->m_ns_repo, ooxml_tokens,
+ reinterpret_cast<const char*>(&buffer[0]), buffer.size());
+ parser.set_handler(handler.get());
+ parser.parse();
+
+ handler.reset();
+ mp_impl->m_opc_reader.check_relation_part(file_name, nullptr);
+}
+
+void orcus_xlsx::read_rev_headers(const std::string& dir_path, const std::string& file_name)
+{
+ std::string filepath = resolve_file_path(dir_path, file_name);
+ if (get_config().debug)
+ {
+ cout << "---" << endl;
+ cout << "read_rev_headers: file path = " << filepath << endl;
+ }
+
+ vector<unsigned char> buffer;
+ if (!mp_impl->m_opc_reader.open_zip_stream(filepath, buffer))
+ {
+ cerr << "failed to open zip stream: " << filepath << endl;
+ return;
+ }
+
+ if (buffer.empty())
+ return;
+
+ xml_stream_parser parser(
+ get_config(), mp_impl->m_ns_repo, ooxml_tokens,
+ reinterpret_cast<const char*>(&buffer[0]), buffer.size());
+
+ auto handler = std::make_unique<xml_simple_stream_handler>(
+ mp_impl->m_cxt, ooxml_tokens,
+ std::make_unique<xlsx_revheaders_context>(mp_impl->m_cxt, ooxml_tokens));
+
+ parser.set_handler(handler.get());
+ parser.parse();
+
+ handler.reset();
+ mp_impl->m_opc_reader.check_relation_part(file_name, nullptr);
+}
+
+void orcus_xlsx::read_rev_log(const std::string& dir_path, const std::string& file_name)
+{
+ std::string filepath = resolve_file_path(dir_path, file_name);
+ if (get_config().debug)
+ {
+ cout << "---" << endl;
+ cout << "read_rev_log: file path = " << filepath << endl;
+ }
+
+ vector<unsigned char> buffer;
+ if (!mp_impl->m_opc_reader.open_zip_stream(filepath, buffer))
+ {
+ cerr << "failed to open zip stream: " << filepath << endl;
+ return;
+ }
+
+ if (buffer.empty())
+ return;
+
+ xml_stream_parser parser(
+ get_config(), mp_impl->m_ns_repo, ooxml_tokens,
+ reinterpret_cast<const char*>(&buffer[0]), buffer.size());
+
+ auto handler = std::make_unique<xml_simple_stream_handler>(
+ mp_impl->m_cxt, ooxml_tokens,
+ std::make_unique<xlsx_revlog_context>(mp_impl->m_cxt, ooxml_tokens));
+
+ parser.set_handler(handler.get());
+ parser.parse();
+
+ handler.reset();
+}
+
+void orcus_xlsx::read_drawing(const std::string& dir_path, const std::string& file_name)
+{
+ std::string filepath = resolve_file_path(dir_path, file_name);
+ if (get_config().debug)
+ {
+ cout << "---" << endl;
+ cout << "read_drawing: file path = " << filepath << endl;
+ }
+
+ vector<unsigned char> buffer;
+ if (!mp_impl->m_opc_reader.open_zip_stream(filepath, buffer))
+ {
+ cerr << "failed to open zip stream: " << filepath << endl;
+ return;
+ }
+
+ if (buffer.empty())
+ return;
+
+ auto handler = std::make_unique<xlsx_drawing_xml_handler>(
+ mp_impl->m_cxt, ooxml_tokens);
+
+ xml_stream_parser parser(
+ get_config(), mp_impl->m_ns_repo, ooxml_tokens,
+ reinterpret_cast<const char*>(&buffer[0]), buffer.size());
+ parser.set_handler(handler.get());
+ parser.parse();
+
+ handler.reset();
+}
+
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/orcus_xml.cpp b/src/liborcus/orcus_xml.cpp
new file mode 100644
index 0000000..e123265
--- /dev/null
+++ b/src/liborcus/orcus_xml.cpp
@@ -0,0 +1,702 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/orcus_xml.hpp>
+#include <orcus/sax_ns_parser.hpp>
+#include <orcus/spreadsheet/import_interface.hpp>
+#include <orcus/spreadsheet/export_interface.hpp>
+#include <orcus/stream.hpp>
+#include <orcus/string_pool.hpp>
+
+#include "orcus_xml_impl.hpp"
+
+#define ORCUS_DEBUG_XML 0
+
+#if ORCUS_DEBUG_XML
+#include <iostream>
+#endif
+
+#include <vector>
+#include <fstream>
+
+namespace orcus {
+
+namespace {
+
+class xml_data_sax_handler
+{
+ struct scope
+ {
+ xml_name_t name;
+ std::ptrdiff_t element_open_begin;
+ std::ptrdiff_t element_open_end;
+
+ xml_map_tree::element_type type;
+
+ scope(xmlns_id_t _ns, std::string_view _name) :
+ name(_ns, _name),
+ element_open_begin(0),
+ element_open_end(0),
+ type(xml_map_tree::element_type::unknown) {}
+ };
+
+ std::vector<sax_ns_parser_attribute> m_attrs;
+ std::vector<scope> m_scopes;
+
+ string_pool m_pool;
+ spreadsheet::iface::import_factory& m_factory;
+ xml_map_tree::const_element_list_type& m_link_positions;
+ const xml_map_tree& m_map_tree;
+ xml_map_tree::walker m_map_tree_walker;
+
+ xml_map_tree::element* mp_current_elem;
+ std::string_view m_current_chars;
+ bool m_in_range_ref;
+ xml_map_tree::range_reference* mp_increment_row;
+
+private:
+
+ const sax_ns_parser_attribute* find_attr_by_name(const xml_name_t& name)
+ {
+ for (const sax_ns_parser_attribute& attr : m_attrs)
+ {
+ if (attr.ns == name.ns && attr.name == name.name)
+ return &attr;
+ }
+ return nullptr;
+ }
+
+ void set_single_link_cell(const xml_map_tree::cell_reference& ref, std::string_view val)
+ {
+ spreadsheet::iface::import_sheet* sheet = m_factory.get_sheet(ref.pos.sheet);
+ if (sheet)
+ sheet->set_auto(ref.pos.row, ref.pos.col, val);
+ }
+
+ void set_field_link_cell(xml_map_tree::field_in_range& field, std::string_view val)
+ {
+ assert(field.ref);
+ assert(!field.ref->pos.sheet.empty());
+
+ const xml_map_tree::cell_position& pos = field.ref->pos;
+ spreadsheet::iface::import_sheet* sheet = m_factory.get_sheet(pos.sheet);
+ if (sheet)
+ sheet->set_auto(
+ pos.row + field.ref->row_position,
+ pos.col + field.column_pos,
+ val);
+ }
+
+public:
+ xml_data_sax_handler(
+ spreadsheet::iface::import_factory& factory,
+ xml_map_tree::const_element_list_type& link_positions,
+ const xml_map_tree& map_tree) :
+ m_factory(factory),
+ m_link_positions(link_positions),
+ m_map_tree(map_tree),
+ m_map_tree_walker(map_tree.get_tree_walker()),
+ mp_current_elem(nullptr),
+ m_in_range_ref(false),
+ mp_increment_row(nullptr) {}
+
+ void doctype(const sax::doctype_declaration&)
+ {
+ }
+
+ void start_declaration(std::string_view)
+ {
+ }
+
+ void end_declaration(std::string_view)
+ {
+ m_attrs.clear();
+ }
+
+ void start_element(const sax_ns_parser_element& elem)
+ {
+ m_scopes.emplace_back(elem.ns, elem.name);
+ scope& cur = m_scopes.back();
+ cur.element_open_begin = elem.begin_pos;
+ cur.element_open_end = elem.end_pos;
+ m_current_chars = std::string_view{};
+
+ mp_current_elem = m_map_tree_walker.push_element({elem.ns, elem.name});
+ if (mp_current_elem)
+ {
+ if (mp_current_elem->row_group && mp_increment_row == mp_current_elem->row_group)
+ {
+ // The last closing element was a row group boundary. Increment the row position.
+ xml_map_tree::range_reference* ref = mp_current_elem->row_group;
+ ++ref->row_position;
+ mp_increment_row = nullptr;
+ }
+
+ // Go through all linked attributes that belong to this element,
+ // and see if they exist in this content xml.
+ for (const auto& p_attr : mp_current_elem->attributes)
+ {
+ const xml_map_tree::attribute& linked_attr = *p_attr;
+ const sax_ns_parser_attribute* p = find_attr_by_name(linked_attr.name);
+ if (!p)
+ continue;
+
+ // This attribute is linked. Import its value.
+
+ std::string_view val_trimmed = trim(p->value);
+ switch (linked_attr.ref_type)
+ {
+ case xml_map_tree::reference_type::cell:
+ set_single_link_cell(*linked_attr.cell_ref, val_trimmed);
+ break;
+ case xml_map_tree::reference_type::range_field:
+ {
+ set_field_link_cell(*linked_attr.field_ref, val_trimmed);
+ break;
+ }
+ default:
+ ;
+ }
+
+ // Record the namespace alias used in the content stream.
+ linked_attr.ns_alias = m_map_tree.intern_string(p->ns_alias);
+ }
+
+ if (mp_current_elem->range_parent)
+ m_in_range_ref = true;
+ }
+ m_attrs.clear();
+ }
+
+ void end_element(const sax_ns_parser_element& elem)
+ {
+ assert(!m_scopes.empty());
+
+ if (mp_current_elem)
+ {
+ switch (mp_current_elem->ref_type)
+ {
+ case xml_map_tree::reference_type::cell:
+ {
+ set_single_link_cell(*mp_current_elem->cell_ref, m_current_chars);
+ break;
+ }
+ case xml_map_tree::reference_type::range_field:
+ {
+ set_field_link_cell(*mp_current_elem->field_ref, m_current_chars);
+ break;
+ }
+ default:
+ ;
+ }
+
+ if (mp_current_elem->row_group)
+ {
+ // This element defines a row-group boundary.
+ spreadsheet::row_t row_start = mp_current_elem->row_group_position;
+ spreadsheet::row_t row_end = mp_current_elem->row_group->row_position - 1;
+ if (row_end > row_start)
+ {
+ // This is the end of a parent row-group. Fill down the
+ // cell values.
+ const xml_map_tree::range_reference& ref = *mp_current_elem->row_group;
+
+ spreadsheet::iface::import_sheet* sheet = m_factory.get_sheet(ref.pos.sheet);
+
+ if (sheet)
+ {
+ row_start += ref.pos.row + 1;
+ row_end += ref.pos.row + 1;
+
+ for (spreadsheet::col_t col : mp_current_elem->linked_range_fields)
+ {
+ col += ref.pos.col;
+ sheet->fill_down_cells(row_start, col, row_end - row_start);
+ }
+ }
+ }
+
+ mp_current_elem->row_group_position = mp_current_elem->row_group->row_position;
+ mp_increment_row = mp_current_elem->row_group;
+ }
+
+ // Store the end element position in stream for linked elements.
+ const scope& cur = m_scopes.back();
+ if (mp_current_elem->ref_type == xml_map_tree::reference_type::cell ||
+ mp_current_elem->range_parent ||
+ (!m_in_range_ref && mp_current_elem->unlinked_attribute_anchor()))
+ {
+ // either single link element, parent of range link elements,
+ // or an unlinked attribute anchor outside linked ranges.
+ mp_current_elem->stream_pos.open_begin = cur.element_open_begin;
+ mp_current_elem->stream_pos.open_end = cur.element_open_end;
+ mp_current_elem->stream_pos.close_begin = elem.begin_pos;
+ mp_current_elem->stream_pos.close_end = elem.end_pos;
+ m_link_positions.push_back(mp_current_elem);
+ }
+
+ if (mp_current_elem->range_parent)
+ m_in_range_ref = false;
+
+ // Record the namespace alias used in the content stream.
+ mp_current_elem->ns_alias = m_map_tree.intern_string(elem.ns_alias);
+ }
+
+ m_scopes.pop_back();
+ mp_current_elem = m_map_tree_walker.pop_element({elem.ns, elem.name});
+ }
+
+ void characters(std::string_view val, bool transient)
+ {
+ if (!mp_current_elem)
+ return;
+
+ m_current_chars = trim(val);
+ if (transient)
+ m_current_chars = m_pool.intern(m_current_chars).first;
+ }
+
+ void attribute(std::string_view name, std::string_view val)
+ {
+ if (name == "encoding")
+ {
+ if (auto* gs = m_factory.get_global_settings(); gs)
+ {
+ character_set_t cs = to_character_set(val);
+ gs->set_character_set(cs);
+ }
+ }
+ }
+
+ void attribute(const sax_ns_parser_attribute& at)
+ {
+ m_attrs.push_back(at);
+ }
+};
+
+/**
+ * Used in write_range_reference_group().
+ */
+struct scope
+{
+ const xml_map_tree::element& element;
+ xml_map_tree::element_store_type::const_iterator current_child_pos;
+ xml_map_tree::element_store_type::const_iterator end_child_pos;
+ bool opened:1;
+
+ scope(const scope&) = delete;
+ scope& operator=(const scope&) = delete;
+
+ scope(const xml_map_tree::element& _elem) :
+ element(_elem), opened(false)
+ {
+ current_child_pos = end_child_pos;
+
+ if (element.elem_type == xml_map_tree::element_type::unlinked)
+ {
+ current_child_pos = element.child_elements->begin();
+ end_child_pos = element.child_elements->end();
+ }
+ }
+};
+
+typedef std::vector<std::unique_ptr<scope>> scopes_type;
+
+void write_opening_element(
+ std::ostream& os, const xml_map_tree::element& elem, const xml_map_tree::range_reference& ref,
+ const spreadsheet::iface::export_sheet& sheet, spreadsheet::row_t current_row, bool self_close)
+{
+ if (elem.attributes.empty())
+ {
+ // This element has no linked attributes. Just write the element name and be done with it.
+ os << '<' << elem << '>';
+ return;
+ }
+
+ // Element has one or more linked attributes.
+
+ os << '<' << elem;
+
+ for (const auto& p_attr : elem.attributes)
+ {
+ const xml_map_tree::attribute& attr = *p_attr;
+ if (attr.ref_type != xml_map_tree::reference_type::range_field)
+ // In theory this should never happen but it won't hurt to check.
+ continue;
+
+ os << ' ' << attr << "=\"";
+ sheet.write_string(os, ref.pos.row + 1 + current_row, ref.pos.col + attr.field_ref->column_pos);
+ os << "\"";
+ }
+
+ if (self_close)
+ os << '/';
+
+ os << '>';
+}
+
+void write_opening_element(
+ std::ostream& os, const xml_map_tree::element& elem, const spreadsheet::iface::export_factory& fact, bool self_close)
+{
+ os << '<' << elem;
+ for (const auto& p_attr : elem.attributes)
+ {
+ const xml_map_tree::attribute& attr = *p_attr;
+ if (attr.ref_type != xml_map_tree::reference_type::cell)
+ // We should only see single linked cell here, as all
+ // field links are handled by the range parent above.
+ continue;
+
+ const xml_map_tree::cell_position& pos = attr.cell_ref->pos;
+
+ const spreadsheet::iface::export_sheet* sheet = fact.get_sheet(pos.sheet);
+ if (!sheet)
+ continue;
+
+ os << ' ' << attr << "=\"";
+ sheet->write_string(os, pos.row, pos.col);
+ os << "\"";
+ }
+
+ if (self_close)
+ os << '/';
+
+ os << '>';
+}
+
+/**
+ * Write to the output stream a single range reference.
+ *
+ * @param os output stream.
+ * @param root root map tree element representing the root of a single range
+ * reference.
+ * @param ref range reference data.
+ * @param factory export factory instance.
+ */
+void write_range_reference_group(
+ std::ostream& os, const xml_map_tree::element& root, const xml_map_tree::range_reference& ref,
+ const spreadsheet::iface::export_factory& factory)
+{
+ const spreadsheet::iface::export_sheet* sheet = factory.get_sheet(ref.pos.sheet);
+ if (!sheet)
+ return;
+
+ scopes_type scopes;
+ for (spreadsheet::row_t current_row = 0; current_row < ref.row_position; ++current_row)
+ {
+ scopes.push_back(std::make_unique<scope>(root)); // root element
+
+ while (!scopes.empty())
+ {
+ bool new_scope = false;
+
+ scope& cur_scope = *scopes.back();
+
+ // Self-closing element has no child elements nor content.
+ bool self_close =
+ (cur_scope.current_child_pos == cur_scope.end_child_pos) &&
+ (cur_scope.element.ref_type != xml_map_tree::reference_type::range_field);
+
+ if (!cur_scope.opened)
+ {
+ // Write opening element of this scope only on the 1st entrance.
+ write_opening_element(os, cur_scope.element, ref, *sheet, current_row, self_close);
+ cur_scope.opened = true;
+ }
+
+ if (self_close)
+ {
+ scopes.pop_back();
+ continue;
+ }
+
+ // Go though all child elements.
+ for (; cur_scope.current_child_pos != cur_scope.end_child_pos; ++cur_scope.current_child_pos)
+ {
+ const xml_map_tree::element& child_elem = **cur_scope.current_child_pos;
+ if (child_elem.elem_type == xml_map_tree::element_type::unlinked)
+ {
+ // This is a non-leaf element. Push a new scope with this
+ // element and re-start the loop.
+ ++cur_scope.current_child_pos;
+ scopes.push_back(std::make_unique<scope>(child_elem));
+ new_scope = true;
+ break;
+ }
+
+ // This is a leaf element. This must be a field link element.
+ if (child_elem.ref_type == xml_map_tree::reference_type::range_field)
+ {
+ write_opening_element(os, child_elem, ref, *sheet, current_row, false);
+ sheet->write_string(os, ref.pos.row + 1 + current_row, ref.pos.col + child_elem.field_ref->column_pos);
+ os << "</" << child_elem << ">";
+ }
+ }
+
+ if (new_scope)
+ // Re-start the loop with a new scope.
+ continue;
+
+ // Write content of this element before closing it (if it's linked).
+ if (scopes.back()->element.ref_type == xml_map_tree::reference_type::range_field)
+ sheet->write_string(
+ os, ref.pos.row + 1 + current_row, ref.pos.col + scopes.back()->element.field_ref->column_pos);
+
+ // Close this element for good, and exit the current scope.
+ os << "</" << scopes.back()->element << ">";
+ scopes.pop_back();
+ }
+ }
+}
+
+/**
+ * Write to an output stream the sub-structure comprising one or more range
+ * references.
+ *
+ * @param os output stream
+ * @param elem_top topmost element in the range reference sub-structure.
+ */
+void write_range_reference(std::ostream& os, const xml_map_tree::element& elem_top, const spreadsheet::iface::export_factory& factory)
+{
+ // Top element is expected to have one or more child elements, and each
+ // child element represents a separate database range.
+ if (elem_top.elem_type != xml_map_tree::element_type::unlinked)
+ return;
+
+ assert(elem_top.child_elements);
+
+ if (elem_top.child_elements->empty())
+ return;
+
+ // TODO: For now, we assume that there is only one child element under the
+ // range ref parent.
+ write_range_reference_group(
+ os, **elem_top.child_elements->begin(), *elem_top.range_parent, factory);
+}
+
+struct less_by_opening_elem_pos
+{
+ bool operator() (const xml_map_tree::element* left, const xml_map_tree::element* right) const
+ {
+ return left->stream_pos.open_begin < right->stream_pos.open_begin;
+ }
+};
+
+} // anonymous namespace
+
+orcus_xml::orcus_xml(xmlns_repository& ns_repo, spreadsheet::iface::import_factory* im_fact, spreadsheet::iface::export_factory* ex_fact) :
+ mp_impl(std::make_unique<impl>(ns_repo))
+{
+ mp_impl->im_factory = im_fact;
+ mp_impl->ex_factory = ex_fact;
+}
+
+orcus_xml::~orcus_xml() {}
+
+void orcus_xml::set_namespace_alias(std::string_view alias, std::string_view uri, bool default_ns)
+{
+ mp_impl->map_tree.set_namespace_alias(alias, uri, default_ns);
+}
+
+void orcus_xml::set_cell_link(std::string_view xpath, std::string_view sheet, spreadsheet::row_t row, spreadsheet::col_t col)
+{
+ std::string_view sheet_safe = mp_impl->map_tree.intern_string(sheet);
+ mp_impl->map_tree.set_cell_link(xpath, xml_map_tree::cell_position(sheet_safe, row, col));
+}
+
+void orcus_xml::start_range(std::string_view sheet, spreadsheet::row_t row, spreadsheet::col_t col)
+{
+ std::string_view sheet_safe = mp_impl->map_tree.intern_string(sheet);
+ mp_impl->cur_range_ref = xml_map_tree::cell_position(sheet_safe, row, col);
+ mp_impl->map_tree.start_range(mp_impl->cur_range_ref);
+}
+
+void orcus_xml::append_field_link(std::string_view xpath, std::string_view label)
+{
+ mp_impl->map_tree.append_range_field_link(xpath, label);
+}
+
+void orcus_xml::set_range_row_group(std::string_view xpath)
+{
+ mp_impl->map_tree.set_range_row_group(xpath);
+}
+
+void orcus_xml::commit_range()
+{
+ mp_impl->cur_range_ref = xml_map_tree::cell_position();
+ mp_impl->map_tree.commit_range();
+}
+
+void orcus_xml::append_sheet(std::string_view name)
+{
+ if (name.empty())
+ return;
+
+ mp_impl->im_factory->append_sheet(mp_impl->sheet_count++, name);
+}
+
+void orcus_xml::read_stream(std::string_view stream)
+{
+ if (stream.empty())
+ return;
+
+ // Insert the range headers and reset the row size counters.
+ xml_map_tree::range_ref_map_type& range_refs = mp_impl->map_tree.get_range_references();
+
+ for (const auto& ref_pair : range_refs)
+ {
+ const xml_map_tree::cell_position& ref = ref_pair.first;
+ xml_map_tree::range_reference& range_ref = *ref_pair.second;
+ range_ref.row_position = 1; // Reset the row offset.
+
+ spreadsheet::iface::import_sheet* sheet = mp_impl->im_factory->get_sheet(ref.sheet);
+
+ if (!sheet)
+ continue;
+
+ spreadsheet::row_t row = ref.row;
+ spreadsheet::col_t col = ref.col;
+
+ for (const xml_map_tree::linkable* e : range_ref.field_nodes)
+ {
+ if (e->label.empty())
+ {
+ // No custom header label. Create a label from the name of the linkable.
+ std::string s = e->name.to_string(mp_impl->ns_repo);
+ if (!s.empty())
+ sheet->set_auto(row, col, s);
+ }
+ else
+ sheet->set_auto(row, col, e->label);
+
+ ++col;
+ }
+ }
+
+ // Parse the content xml.
+ xmlns_context ns_cxt = mp_impl->ns_repo.create_context(); // new ns context for the content xml stream.
+ xml_data_sax_handler handler(
+ *mp_impl->im_factory, mp_impl->link_positions, mp_impl->map_tree);
+
+ sax_ns_parser<xml_data_sax_handler> parser(stream, ns_cxt, handler);
+ parser.parse();
+}
+
+#if ORCUS_DEBUG_XML
+
+namespace {
+
+void dump_links(const xml_map_tree::const_element_list_type& links)
+{
+ cout << "link count: " << links.size() << endl;
+}
+
+}
+
+#endif
+
+void orcus_xml::write(std::string_view stream, std::ostream& out) const
+{
+ if (!mp_impl->ex_factory)
+ // We can't export data witout export factory.
+ return;
+
+ if (stream.empty())
+ // Source input stream is empty.
+ return;
+
+ xml_map_tree::const_element_list_type& links = mp_impl->link_positions;
+ if (links.empty())
+ // nothing to write.
+ return;
+
+ // Sort all link position by opening element positions.
+ std::sort(links.begin(), links.end(), less_by_opening_elem_pos());
+
+ spreadsheet::iface::export_factory& fact = *mp_impl->ex_factory;
+ xml_map_tree::const_element_list_type::const_iterator it = links.begin(), it_end = links.end();
+
+#if ORCUS_DEBUG_XML
+ dump_links(links);
+#endif
+
+ const char* p0 = stream.data();
+ std::ptrdiff_t begin_pos = 0;
+
+ for (; it != it_end; ++it)
+ {
+ const xml_map_tree::element& elem = **it;
+ if (elem.ref_type == xml_map_tree::reference_type::cell)
+ {
+ // Single cell link
+ const xml_map_tree::cell_position& pos = elem.cell_ref->pos;
+
+ const spreadsheet::iface::export_sheet* sheet = fact.get_sheet(pos.sheet);
+ if (!sheet)
+ continue;
+
+ std::ptrdiff_t open_begin = elem.stream_pos.open_begin;
+ std::ptrdiff_t close_begin = elem.stream_pos.close_begin;
+ std::ptrdiff_t close_end = elem.stream_pos.close_end;
+
+ assert(open_begin > begin_pos);
+ out << std::string_view(p0+begin_pos, open_begin-begin_pos); // stream since last linked element.
+
+ write_opening_element(out, elem, fact, false);
+ sheet->write_string(out, pos.row, pos.col);
+ out << std::string_view(p0+close_begin, close_end-close_begin); // closing element.
+ begin_pos = close_end;
+ }
+ else if (elem.range_parent)
+ {
+ // Range link
+ const xml_map_tree::range_reference& ref = *elem.range_parent;
+ const xml_map_tree::cell_position& pos = ref.pos;
+
+ const spreadsheet::iface::export_sheet* sheet = fact.get_sheet(pos.sheet);
+ if (!sheet)
+ continue;
+
+ std::ptrdiff_t open_begin = elem.stream_pos.open_begin;
+ std::ptrdiff_t close_begin = elem.stream_pos.close_begin;
+ std::ptrdiff_t close_end = elem.stream_pos.close_end;
+
+ assert(open_begin > begin_pos);
+ out << std::string_view(p0+begin_pos, open_begin-begin_pos); // stream since last linked element.
+
+ write_opening_element(out, elem, fact, false);
+ write_range_reference(out, elem, fact);
+ out << std::string_view(p0+close_begin, close_end-close_begin); // closing element.
+ begin_pos = close_end;
+ }
+ else if (elem.unlinked_attribute_anchor())
+ {
+ // Element is not linked but has one or more attributes that are
+ // linked. Here, only write the opening element with attributes.
+
+ std::ptrdiff_t open_begin = elem.stream_pos.open_begin;
+ std::ptrdiff_t open_end = elem.stream_pos.open_end;
+
+ bool self_close = elem.stream_pos.open_begin == elem.stream_pos.close_begin;
+
+ assert(open_begin > begin_pos);
+ out << std::string_view(p0+begin_pos, open_begin-begin_pos); // stream since last linked element.
+
+ write_opening_element(out, elem, fact, self_close);
+ begin_pos = open_end;
+ }
+ else
+ throw general_error("Non-link element type encountered.");
+ }
+
+ // Flush the remaining stream.
+ out << std::string_view(p0+begin_pos, stream.size()-begin_pos);
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/orcus_xml_impl.cpp b/src/liborcus/orcus_xml_impl.cpp
new file mode 100644
index 0000000..4718f3c
--- /dev/null
+++ b/src/liborcus/orcus_xml_impl.cpp
@@ -0,0 +1,22 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus_xml_impl.hpp"
+
+namespace orcus {
+
+orcus_xml::impl::impl(xmlns_repository& _ns_repo) :
+ im_factory(nullptr),
+ ex_factory(nullptr),
+ ns_repo(_ns_repo),
+ ns_cxt_map(ns_repo.create_context()),
+ map_tree(ns_repo),
+ sheet_count(0) {}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/orcus_xml_impl.hpp b/src/liborcus/orcus_xml_impl.hpp
new file mode 100644
index 0000000..56c8156
--- /dev/null
+++ b/src/liborcus/orcus_xml_impl.hpp
@@ -0,0 +1,51 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_ORCUS_XML_IMPL_HPP
+#define INCLUDED_ORCUS_ORCUS_XML_IMPL_HPP
+
+#include "orcus/orcus_xml.hpp"
+#include "orcus/xml_namespace.hpp"
+
+#include "xml_map_tree.hpp"
+
+namespace orcus {
+
+struct orcus_xml::impl
+{
+ spreadsheet::iface::import_factory* im_factory;
+ spreadsheet::iface::export_factory* ex_factory;
+
+ /** xml namespace repository for the whole session. */
+ xmlns_repository& ns_repo;
+
+ /** xml namespace context */
+ xmlns_context ns_cxt_map;
+
+ /** xml element tree that represents all mapped paths. */
+ xml_map_tree map_tree;
+
+ spreadsheet::sheet_t sheet_count;
+
+ /**
+ * Positions of all linked elements, single and range reference alike.
+ * Stored link elements must be sorted in order of stream positions, and
+ * as such, no linked elements should be nested; there should never be a
+ * linked element inside the substructure of another linked element.
+ */
+ xml_map_tree::const_element_list_type link_positions;
+
+ xml_map_tree::cell_position cur_range_ref;
+
+ explicit impl(xmlns_repository& _ns_repo);
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/orcus_xml_map_def.cpp b/src/liborcus/orcus_xml_map_def.cpp
new file mode 100644
index 0000000..5c484de
--- /dev/null
+++ b/src/liborcus/orcus_xml_map_def.cpp
@@ -0,0 +1,299 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/orcus_xml.hpp"
+#include "orcus/sax_parser_base.hpp"
+#include "orcus/sax_parser.hpp"
+#include "orcus/stream.hpp"
+#include "orcus/xml_structure_tree.hpp"
+#include "orcus/xml_namespace.hpp"
+#include "orcus/xml_writer.hpp"
+#include "orcus/measurement.hpp"
+
+#include "orcus_xml_impl.hpp"
+
+#include <vector>
+#include <iostream>
+
+namespace orcus {
+
+namespace {
+
+class xml_map_sax_handler
+{
+ struct scope
+ {
+ std::string_view ns;
+ std::string_view name;
+
+ scope(std::string_view _ns, std::string_view _name) : ns(_ns), name(_name) {}
+ };
+
+ std::vector<sax::parser_attribute> m_attrs;
+ std::vector<scope> m_scopes;
+ orcus_xml& m_app;
+
+public:
+
+ xml_map_sax_handler(orcus_xml& app) : m_app(app) {}
+
+ void doctype(const sax::doctype_declaration&) {}
+ void start_declaration(std::string_view /*name*/) {}
+
+ void end_declaration(std::string_view /*name*/)
+ {
+ m_attrs.clear();
+ }
+
+ void start_element(const sax::parser_element& elem);
+
+ void end_element(const sax::parser_element& elem)
+ {
+ if (elem.name == "range")
+ m_app.commit_range();
+
+ m_scopes.pop_back();
+ }
+
+ void attribute(const sax::parser_attribute& attr)
+ {
+ m_attrs.push_back(attr);
+ }
+
+ void characters(std::string_view, bool) {}
+};
+
+void xml_map_sax_handler::start_element(const sax::parser_element& elem)
+{
+ std::string_view xpath, sheet, label;
+ spreadsheet::row_t row = -1;
+ spreadsheet::col_t col = -1;
+
+ auto to_row = [](std::string_view s) -> spreadsheet::row_t
+ {
+ long v;
+ parse_integer(s.data(), s.data() + s.size(), v);
+ return v;
+ };
+
+ auto to_col = [](std::string_view s) -> spreadsheet::col_t
+ {
+ long v;
+ parse_integer(s.data(), s.data() + s.size(), v);
+ return v;
+ };
+
+ if (elem.name == "ns")
+ {
+ // empty alias is associated with default namespace.
+ std::string_view alias, uri;
+ bool default_ns = false;
+
+ for (const sax::parser_attribute& attr : m_attrs)
+ {
+ if (attr.name == "alias")
+ alias = attr.value;
+ else if (attr.name == "uri")
+ uri = attr.value;
+ else if (attr.name == "default")
+ default_ns = to_bool(attr.value);
+ }
+
+ if (!uri.empty())
+ m_app.set_namespace_alias(alias, uri, default_ns);
+ }
+ else if (elem.name == "cell")
+ {
+ for (const sax::parser_attribute& attr : m_attrs)
+ {
+ if (attr.name == "path")
+ xpath = attr.value;
+ else if (attr.name == "sheet")
+ sheet = attr.value;
+ else if (attr.name == "row")
+ row = to_row(attr.value);
+ else if (attr.name == "column")
+ col = to_col(attr.value);
+ }
+
+ m_app.set_cell_link(xpath, sheet, row, col);
+ }
+ else if (elem.name == "range")
+ {
+ for (const sax::parser_attribute& attr : m_attrs)
+ {
+ if (attr.name == "sheet")
+ sheet = attr.value;
+ else if (attr.name == "row")
+ row = to_row(attr.value);
+ else if (attr.name == "column")
+ col = to_col(attr.value);
+ }
+
+ m_app.start_range(sheet, row, col);
+ }
+ else if (elem.name == "field")
+ {
+ for (const sax::parser_attribute& attr : m_attrs)
+ {
+ if (attr.name == "path")
+ xpath = attr.value;
+ else if (attr.name == "label")
+ label = attr.value;
+ }
+
+ m_app.append_field_link(xpath, label);
+ }
+ else if (elem.name == "row-group")
+ {
+ for (const sax::parser_attribute& attr : m_attrs)
+ {
+ if (attr.name == "path")
+ {
+ xpath = attr.value;
+ break;
+ }
+ }
+
+ m_app.set_range_row_group(xpath);
+ }
+ else if (elem.name == "sheet")
+ {
+ std::string_view sheet_name;
+ for (const sax::parser_attribute& attr : m_attrs)
+ {
+ if (attr.name == "name")
+ {
+ sheet_name = attr.value;
+ break;
+ }
+ }
+
+ if (!sheet_name.empty())
+ m_app.append_sheet(sheet_name);
+ }
+
+ m_scopes.push_back(scope(elem.ns, elem.name));
+ m_attrs.clear();
+}
+
+} // anonymous namespace
+
+void orcus_xml::read_map_definition(std::string_view stream)
+{
+ try
+ {
+ xml_map_sax_handler handler(*this);
+ sax_parser<xml_map_sax_handler> parser(stream, handler);
+ parser.parse();
+ }
+ catch (const parse_error& e)
+ {
+ std::ostringstream os;
+ os << "Error parsing the map definition file:" << std::endl
+ << std::endl
+ << create_parse_error_output(stream, e.offset()) << std::endl
+ << e.what();
+
+ throw invalid_map_error(os.str());
+ }
+}
+
+void orcus_xml::detect_map_definition(std::string_view stream)
+{
+ size_t range_count = 0;
+ std::string sheet_name_prefix = "range-";
+
+ xml_structure_tree::range_handler_type rh = [&](xml_table_range_t&& range)
+ {
+ // Build sheet name first and insert a new sheet.
+ std::ostringstream os_sheet_name;
+ os_sheet_name << sheet_name_prefix << range_count;
+ std::string sheet_name = os_sheet_name.str();
+ append_sheet(sheet_name);
+
+ // Push the linked range.
+ start_range(sheet_name, 0, 0);
+
+ for (const auto& path : range.paths)
+ append_field_link(path, std::string_view());
+
+ for (const auto& row_group : range.row_groups)
+ set_range_row_group(row_group);
+
+ commit_range();
+
+ ++range_count;
+ };
+
+ xmlns_repository repo;
+ xmlns_context cxt = repo.create_context();
+ xml_structure_tree structure(cxt);
+ structure.parse(stream);
+
+ // Register all namespace aliases first.
+ for (const xmlns_id_t& ns : cxt.get_all_namespaces())
+ set_namespace_alias(cxt.get_short_name(ns), std::string_view(ns));
+
+ structure.process_ranges(rh);
+}
+
+void orcus_xml::write_map_definition(std::string_view stream, std::ostream& out) const
+{
+ xmlns_context cxt = mp_impl->ns_repo.create_context();
+ xml_structure_tree tree(cxt);
+ tree.parse(stream);
+
+ xml_writer writer(mp_impl->ns_repo, out);
+ xmlns_id_t default_ns = writer.add_namespace("", "https://gitlab.com/orcus/orcus/xml-map-definition");
+ auto map_scope = writer.push_element_scope({default_ns, "map"});
+
+ for (const xmlns_id_t& ns : cxt.get_all_namespaces())
+ {
+ writer.add_attribute({default_ns, "alias"}, cxt.get_short_name(ns));
+ writer.add_attribute({default_ns, "uri"}, ns);
+ writer.push_element_scope({default_ns, "ns"});
+ }
+
+ size_t range_count = 0;
+ std::string sheet_name_prefix = "range-";
+
+ xml_structure_tree::range_handler_type rh = [&](xml_table_range_t&& range)
+ {
+ std::ostringstream os_sheet_name;
+ os_sheet_name << sheet_name_prefix << range_count;
+ std::string sheet_name = os_sheet_name.str();
+
+ writer.add_attribute({default_ns, "name"}, sheet_name);
+ writer.push_element_scope({default_ns, "sheet"});
+
+ writer.add_attribute({default_ns, "sheet"}, sheet_name);
+ writer.add_attribute({default_ns, "row"}, "0");
+ writer.add_attribute({default_ns, "column"}, "0");
+ auto range_scope = writer.push_element_scope({default_ns, "range"});
+
+ for (const auto& path : range.paths)
+ {
+ writer.add_attribute({default_ns, "path"}, path);
+ writer.push_element_scope({default_ns, "field"});
+ }
+
+ for (const auto& row_group : range.row_groups)
+ {
+ writer.add_attribute({default_ns, "path"}, row_group);
+ writer.push_element_scope({default_ns, "row-group"});
+ }
+
+ ++range_count;
+ };
+
+ tree.process_ranges(rh);
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/session_context.cpp b/src/liborcus/session_context.cpp
new file mode 100644
index 0000000..b054106
--- /dev/null
+++ b/src/liborcus/session_context.cpp
@@ -0,0 +1,30 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "session_context.hpp"
+
+namespace orcus {
+
+session_context::custom_data::~custom_data() {}
+
+session_context::session_context(std::unique_ptr<custom_data> data) : cdata(std::move(data)) {}
+
+std::string_view session_context::intern(const xml_token_attr_t& attr)
+{
+ // NB: always intern regardless of the transient flag since the string may
+ // be used in another stream.
+ return spool.intern(attr.value).first;
+}
+
+std::string_view session_context::intern(std::string_view s)
+{
+ return spool.intern(s).first;
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/session_context.hpp b/src/liborcus/session_context.hpp
new file mode 100644
index 0000000..ab50836
--- /dev/null
+++ b/src/liborcus/session_context.hpp
@@ -0,0 +1,58 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_SESSION_CONTEXT_HPP
+#define INCLUDED_ORCUS_SESSION_CONTEXT_HPP
+
+#include <orcus/string_pool.hpp>
+#include <orcus/types.hpp>
+
+#include <memory>
+
+namespace orcus {
+
+struct session_context
+{
+ session_context(const session_context&) = delete;
+ session_context& operator=(const session_context&) = delete;
+
+ string_pool spool;
+
+ /**
+ * Derive from this class in case the filter needs to store its own
+ * session data.
+ */
+ struct custom_data
+ {
+ virtual ~custom_data() = 0;
+ };
+
+ std::unique_ptr<custom_data> cdata;
+
+ session_context() = default;
+ session_context(std::unique_ptr<custom_data> data);
+
+ template<typename CDataT>
+ CDataT& get_data()
+ {
+ return static_cast<CDataT&>(*cdata);
+ }
+
+ template<typename CDataT>
+ const CDataT& get_data() const
+ {
+ return static_cast<const CDataT&>(*cdata);
+ }
+
+ std::string_view intern(const xml_token_attr_t& attr);
+ std::string_view intern(std::string_view s);
+};
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/spreadsheet_iface_util.cpp b/src/liborcus/spreadsheet_iface_util.cpp
new file mode 100644
index 0000000..740864c
--- /dev/null
+++ b/src/liborcus/spreadsheet_iface_util.cpp
@@ -0,0 +1,53 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "spreadsheet_iface_util.hpp"
+#include "formula_result.hpp"
+
+#include "orcus/spreadsheet/import_interface.hpp"
+
+namespace orcus {
+
+void push_array_formula(
+ spreadsheet::iface::import_array_formula* xformula,
+ const spreadsheet::range_t& range, std::string_view formula,
+ spreadsheet::formula_grammar_t grammar, const range_formula_results& results)
+{
+ xformula->set_range(range);
+ xformula->set_formula(grammar, formula);
+
+ for (size_t row = 0; row < results.row_size(); ++row)
+ {
+ for (size_t col = 0; col < results.col_size(); ++col)
+ {
+ const formula_result& v = results.get(row, col);
+ switch (v.type)
+ {
+ case formula_result::result_type::numeric:
+ xformula->set_result_value(row, col, v.value_numeric);
+ break;
+ case formula_result::result_type::string:
+ xformula->set_result_string(row, col, {v.value_string.p, v.value_string.n});
+ break;
+ case formula_result::result_type::boolean:
+ xformula->set_result_bool(row, col, v.value_boolean);
+ break;
+ case formula_result::result_type::empty:
+ xformula->set_result_empty(row, col);
+ break;
+ default:
+ ;
+ }
+ }
+ }
+
+ xformula->commit();
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/spreadsheet_iface_util.hpp b/src/liborcus/spreadsheet_iface_util.hpp
new file mode 100644
index 0000000..1262be6
--- /dev/null
+++ b/src/liborcus/spreadsheet_iface_util.hpp
@@ -0,0 +1,36 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_SPREADSHEET_IFACE_UTIL_HPP
+#define INCLUDED_ORCUS_SPREADSHEET_IFACE_UTIL_HPP
+
+#include "orcus/spreadsheet/types.hpp"
+
+namespace orcus {
+
+class range_formula_results;
+
+namespace spreadsheet {
+
+namespace iface {
+
+class import_array_formula;
+
+}
+
+}
+
+void push_array_formula(
+ spreadsheet::iface::import_array_formula* xformula,
+ const spreadsheet::range_t& range, std::string_view formula,
+ spreadsheet::formula_grammar_t grammar, const range_formula_results& results);
+
+} // namespace orcus
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/spreadsheet_impl_types.cpp b/src/liborcus/spreadsheet_impl_types.cpp
new file mode 100644
index 0000000..735f546
--- /dev/null
+++ b/src/liborcus/spreadsheet_impl_types.cpp
@@ -0,0 +1,50 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "spreadsheet_impl_types.hpp"
+
+#include <ostream>
+
+namespace orcus { namespace spreadsheet { namespace detail {
+
+cell_position_t::cell_position_t() : row(-1), col(-1) {}
+
+cell_position_t::cell_position_t(std::string_view _sheet, spreadsheet::row_t _row, spreadsheet::col_t _col) :
+ sheet(_sheet), row(_row), col(_col) {}
+
+cell_position_t::cell_position_t(const cell_position_t& r) : sheet(r.sheet), row(r.row), col(r.col) {}
+
+bool cell_position_t::operator== (const cell_position_t& other) const
+{
+ return sheet == other.sheet && row == other.row && col == other.col;
+}
+
+bool cell_position_t::operator!= (const cell_position_t& other) const
+{
+ return !operator==(other);
+}
+
+std::ostream& operator<< (std::ostream& os, const cell_position_t& ref)
+{
+ os << "[sheet='" << ref.sheet << "' row=" << ref.row << " column=" << ref.col << "]";
+ return os;
+}
+
+bool operator< (const cell_position_t& left, const cell_position_t& right)
+{
+ if (left.sheet != right.sheet)
+ return left.sheet < right.sheet;
+
+ if (left.row != right.row)
+ return left.row < right.row;
+
+ return left.col < right.col;
+}
+
+}}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/spreadsheet_impl_types.hpp b/src/liborcus/spreadsheet_impl_types.hpp
new file mode 100644
index 0000000..0c2c110
--- /dev/null
+++ b/src/liborcus/spreadsheet_impl_types.hpp
@@ -0,0 +1,39 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_SPREADSHEET_IMPL_TYPES_HPP
+#define INCLUDED_ORCUS_SPREADSHEET_IMPL_TYPES_HPP
+
+#include "orcus/spreadsheet/types.hpp"
+
+#include <iosfwd>
+
+namespace orcus { namespace spreadsheet { namespace detail {
+
+struct cell_position_t
+{
+ std::string_view sheet;
+ spreadsheet::row_t row;
+ spreadsheet::col_t col;
+
+ cell_position_t();
+ cell_position_t(std::string_view _sheet, spreadsheet::row_t _row, spreadsheet::col_t _col);
+ cell_position_t(const cell_position_t& r);
+
+ bool operator== (const cell_position_t& other) const;
+ bool operator!= (const cell_position_t& other) const;
+};
+
+std::ostream& operator<< (std::ostream& os, const cell_position_t& ref);
+
+bool operator< (const cell_position_t& left, const cell_position_t& right);
+
+}}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/spreadsheet_interface.cpp b/src/liborcus/spreadsheet_interface.cpp
new file mode 100644
index 0000000..0accf63
--- /dev/null
+++ b/src/liborcus/spreadsheet_interface.cpp
@@ -0,0 +1,159 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/spreadsheet/import_interface.hpp>
+#include <orcus/spreadsheet/import_interface_styles.hpp>
+#include <orcus/spreadsheet/import_interface_pivot.hpp>
+#include <orcus/spreadsheet/import_interface_view.hpp>
+#include <orcus/spreadsheet/export_interface.hpp>
+
+namespace orcus { namespace spreadsheet { namespace iface {
+
+import_sheet_view::~import_sheet_view() {}
+
+import_pivot_cache_definition::~import_pivot_cache_definition() {}
+
+import_pivot_cache_field_group::~import_pivot_cache_field_group() {}
+
+import_pivot_cache_records::~import_pivot_cache_records() {}
+
+import_shared_strings::~import_shared_strings() {}
+
+import_styles::~import_styles() {}
+
+import_font_style::~import_font_style() {}
+
+import_fill_style::~import_fill_style() {}
+
+import_border_style::~import_border_style() {}
+
+import_cell_protection::~import_cell_protection() {}
+
+import_number_format::~import_number_format() {}
+
+import_xf::~import_xf() {}
+
+import_cell_style::~import_cell_style() {}
+
+import_sheet_properties::~import_sheet_properties() {}
+
+import_named_expression::~import_named_expression() {}
+
+import_data_table::~import_data_table() {}
+
+import_auto_filter::~import_auto_filter() {}
+
+import_table::~import_table() {}
+
+import_conditional_format::~import_conditional_format() {}
+
+import_auto_filter* import_table::get_auto_filter()
+{
+ return nullptr;
+}
+
+import_formula::~import_formula() {}
+
+import_array_formula::~import_array_formula() {}
+
+import_sheet::~import_sheet() {}
+
+import_sheet_view* import_sheet::get_sheet_view()
+{
+ return nullptr;
+}
+
+import_sheet_properties* import_sheet::get_sheet_properties()
+{
+ return nullptr;
+}
+
+import_data_table* import_sheet::get_data_table()
+{
+ return nullptr;
+}
+
+import_auto_filter* import_sheet::get_auto_filter()
+{
+ return nullptr;
+}
+
+import_table* import_sheet::get_table()
+{
+ return nullptr;
+}
+
+import_conditional_format* import_sheet::get_conditional_format()
+{
+ return nullptr;
+}
+
+import_named_expression* import_sheet::get_named_expression()
+{
+ return nullptr;
+}
+
+import_array_formula* import_sheet::get_array_formula()
+{
+ return nullptr;
+}
+
+import_formula* import_sheet::get_formula()
+{
+ return nullptr;
+}
+
+import_global_settings::~import_global_settings() {}
+
+import_reference_resolver::~import_reference_resolver() {}
+
+import_factory::~import_factory() {}
+
+import_global_settings* import_factory::get_global_settings()
+{
+ return nullptr;
+}
+
+import_shared_strings* import_factory::get_shared_strings()
+{
+ return nullptr;
+}
+
+import_named_expression* import_factory::get_named_expression()
+{
+ return nullptr;
+}
+
+import_styles* import_factory::get_styles()
+{
+ return nullptr;
+}
+
+import_reference_resolver* import_factory::get_reference_resolver(formula_ref_context_t /*cxt*/)
+{
+ return nullptr;
+}
+
+import_pivot_cache_definition* import_factory::create_pivot_cache_definition(
+ orcus::spreadsheet::pivot_cache_id_t /*cache_id*/)
+{
+ return nullptr;
+}
+
+import_pivot_cache_records* import_factory::create_pivot_cache_records(
+ orcus::spreadsheet::pivot_cache_id_t /*cache_id*/)
+{
+ return nullptr;
+}
+
+export_sheet::~export_sheet() {}
+
+export_factory::~export_factory() {}
+
+}}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/spreadsheet_types.cpp b/src/liborcus/spreadsheet_types.cpp
new file mode 100644
index 0000000..3b7d357
--- /dev/null
+++ b/src/liborcus/spreadsheet_types.cpp
@@ -0,0 +1,763 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/spreadsheet/types.hpp>
+#include <orcus/exception.hpp>
+
+#include <limits>
+#include <sstream>
+
+#include <mdds/sorted_string_map.hpp>
+
+namespace orcus { namespace spreadsheet {
+
+namespace {
+
+namespace trf {
+
+using map_type = mdds::sorted_string_map<totals_row_function_t, mdds::string_view_map_entry>;
+
+// Keys must be sorted.
+constexpr map_type::entry entries[] = {
+ { "average", totals_row_function_t::average },
+ { "count", totals_row_function_t::count },
+ { "countNums", totals_row_function_t::count_numbers },
+ { "custom", totals_row_function_t::custom },
+ { "max", totals_row_function_t::maximum },
+ { "min", totals_row_function_t::minimum },
+ { "none", totals_row_function_t::none },
+ { "stdDev", totals_row_function_t::standard_deviation },
+ { "sum", totals_row_function_t::sum },
+ { "var", totals_row_function_t::variance },
+};
+
+const map_type& get()
+{
+ static const map_type map(entries, std::size(entries), totals_row_function_t::none);
+ return map;
+}
+
+} // namespace trf
+
+namespace pc_group_by {
+
+using map_type = mdds::sorted_string_map<pivot_cache_group_by_t, mdds::string_view_map_entry>;
+
+// Keys must be sorted.
+constexpr map_type::entry entries[] = {
+ { "days", pivot_cache_group_by_t::days },
+ { "hours", pivot_cache_group_by_t::hours },
+ { "minutes", pivot_cache_group_by_t::minutes },
+ { "months", pivot_cache_group_by_t::months },
+ { "quarters", pivot_cache_group_by_t::quarters },
+ { "range", pivot_cache_group_by_t::range },
+ { "seconds", pivot_cache_group_by_t::seconds },
+ { "years", pivot_cache_group_by_t::years },
+};
+
+const map_type& get()
+{
+ static const map_type map(entries, std::size(entries), pivot_cache_group_by_t::unknown);
+ return map;
+}
+
+} // namespace pc_group_by
+
+namespace error_value {
+
+using map_type = mdds::sorted_string_map<error_value_t, mdds::string_view_map_entry>;
+
+// Keys must be sorted.
+constexpr map_type::entry entries[] =
+{
+ { "#DIV/0!", error_value_t::div0 },
+ { "#N/A!", error_value_t::na },
+ { "#NAME?", error_value_t::name },
+ { "#NULL!", error_value_t::null },
+ { "#NUM!", error_value_t::num },
+ { "#REF!", error_value_t::ref },
+ { "#VALUE!", error_value_t::value },
+};
+
+const map_type& get()
+{
+ static const map_type map(entries, std::size(entries), error_value_t::unknown);
+ return map;
+}
+
+} // namespace error_value
+
+namespace named_colors {
+
+using map_type = mdds::sorted_string_map<color_rgb_t, mdds::string_view_map_entry>;
+
+constexpr map_type::entry entries[] =
+{
+ { "aliceblue", { 0xF0, 0xF8, 0xFF } },
+ { "antiquewhite", { 0xFA, 0xEB, 0xD7 } },
+ { "aquamarine", { 0x7F, 0xFF, 0xD4 } },
+ { "azure", { 0xF0, 0xFF, 0xFF } },
+ { "beige", { 0xF5, 0xF5, 0xDC } },
+ { "bisque", { 0xFF, 0xE4, 0xC4 } },
+ { "black", { 0x00, 0x00, 0x00 } },
+ { "blanchedalmond", { 0xFF, 0xEB, 0xCD } },
+ { "blue", { 0x00, 0x00, 0xFF } },
+ { "blueviolet", { 0x8A, 0x2B, 0xE2 } },
+ { "brown", { 0xA5, 0x2A, 0x2A } },
+ { "burlywood", { 0xDE, 0xB8, 0x87 } },
+ { "cadetblue", { 0x5F, 0x9E, 0xA0 } },
+ { "chartreuse", { 0x7F, 0xFF, 0x00 } },
+ { "chocolate", { 0xD2, 0x69, 0x1E } },
+ { "coral", { 0xFF, 0x7F, 0x50 } },
+ { "cornflowerblue", { 0x64, 0x95, 0xED } },
+ { "cornsilk", { 0xFF, 0xF8, 0xDC } },
+ { "crimson", { 0xDC, 0x14, 0x3C } },
+ { "cyan", { 0x00, 0xFF, 0xFF } },
+ { "darkblue", { 0x00, 0x00, 0x8B } },
+ { "darkcyan", { 0x00, 0x8B, 0x8B } },
+ { "darkgoldenrod", { 0xB8, 0x86, 0x0B } },
+ { "darkgray", { 0xA9, 0xA9, 0xA9 } },
+ { "darkgreen", { 0x00, 0x64, 0x00 } },
+ { "darkkhaki", { 0xBD, 0xB7, 0x6B } },
+ { "darkmagenta", { 0x8B, 0x00, 0x8B } },
+ { "darkolivegreen", { 0x55, 0x6B, 0x2F } },
+ { "darkorange", { 0xFF, 0x8C, 0x00 } },
+ { "darkorchid", { 0x99, 0x32, 0xCC } },
+ { "darkred", { 0x8B, 0x00, 0x00 } },
+ { "darksalmon", { 0xE9, 0x96, 0x7A } },
+ { "darkseagreen", { 0x8F, 0xBC, 0x8F } },
+ { "darkslateblue", { 0x48, 0x3D, 0x8B } },
+ { "darkslategray", { 0x2F, 0x4F, 0x4F } },
+ { "darkturquoise", { 0x00, 0xCE, 0xD1 } },
+ { "darkviolet", { 0x94, 0x00, 0xD3 } },
+ { "deeppink", { 0xFF, 0x14, 0x93 } },
+ { "deepskyblue", { 0x00, 0xBF, 0xFF } },
+ { "dimgray", { 0x69, 0x69, 0x69 } },
+ { "dodgerblue", { 0x1E, 0x90, 0xFF } },
+ { "firebrick", { 0xB2, 0x22, 0x22 } },
+ { "floralwhite", { 0xFF, 0xFA, 0xF0 } },
+ { "forestgreen", { 0x22, 0x8B, 0x22 } },
+ { "gainsboro", { 0xDC, 0xDC, 0xDC } },
+ { "ghostwhite", { 0xF8, 0xF8, 0xFF } },
+ { "gold", { 0xFF, 0xD7, 0x00 } },
+ { "goldenrod", { 0xDA, 0xA5, 0x20 } },
+ { "gray", { 0x80, 0x80, 0x80 } },
+ { "green", { 0x00, 0x80, 0x00 } },
+ { "greenyellow", { 0xAD, 0xFF, 0x2F } },
+ { "honeydew", { 0xF0, 0xFF, 0xF0 } },
+ { "hotpink", { 0xFF, 0x69, 0xB4 } },
+ { "indianred", { 0xCD, 0x5C, 0x5C } },
+ { "indigo", { 0x4B, 0x00, 0x82 } },
+ { "ivory", { 0xFF, 0xFF, 0xF0 } },
+ { "khaki", { 0xF0, 0xE6, 0x8C } },
+ { "lavender", { 0xE6, 0xE6, 0xFA } },
+ { "lavenderblush", { 0xFF, 0xF0, 0xF5 } },
+ { "lawngreen", { 0x7C, 0xFC, 0x00 } },
+ { "lemonchiffon", { 0xFF, 0xFA, 0xCD } },
+ { "lightblue", { 0xAD, 0xD8, 0xE6 } },
+ { "lightcoral", { 0xF0, 0x80, 0x80 } },
+ { "lightcyan", { 0xE0, 0xFF, 0xFF } },
+ { "lightgoldenrodyellow", { 0xFA, 0xFA, 0xD2 } },
+ { "lightgray", { 0xD3, 0xD3, 0xD3 } },
+ { "lightgreen", { 0x90, 0xEE, 0x90 } },
+ { "lightpink", { 0xFF, 0xB6, 0xC1 } },
+ { "lightsalmon", { 0xFF, 0xA0, 0x7A } },
+ { "lightseagreen", { 0x20, 0xB2, 0xAA } },
+ { "lightskyblue", { 0x87, 0xCE, 0xFA } },
+ { "lightslategray", { 0x77, 0x88, 0x99 } },
+ { "lightsteelblue", { 0xB0, 0xC4, 0xDE } },
+ { "lightyellow", { 0xFF, 0xFF, 0xE0 } },
+ { "lime", { 0x00, 0xFF, 0x00 } },
+ { "limegreen", { 0x32, 0xCD, 0x32 } },
+ { "linen", { 0xFA, 0xF0, 0xE6 } },
+ { "magenta", { 0xFF, 0x00, 0xFF } },
+ { "maroon", { 0x80, 0x00, 0x00 } },
+ { "mediumaquamarine", { 0x66, 0xCD, 0xAA } },
+ { "mediumblue", { 0x00, 0x00, 0xCD } },
+ { "mediumorchid", { 0xBA, 0x55, 0xD3 } },
+ { "mediumpurple", { 0x93, 0x70, 0xDB } },
+ { "mediumseagreen", { 0x3C, 0xB3, 0x71 } },
+ { "mediumslateblue", { 0x7B, 0x68, 0xEE } },
+ { "mediumspringgreen", { 0x00, 0xFA, 0x9A } },
+ { "mediumturquoise", { 0x48, 0xD1, 0xCC } },
+ { "mediumvioletred", { 0xC7, 0x15, 0x85 } },
+ { "midnightblue", { 0x19, 0x19, 0x70 } },
+ { "mintcream", { 0xF5, 0xFF, 0xFA } },
+ { "mistyrose", { 0xFF, 0xE4, 0xE1 } },
+ { "moccasin", { 0xFF, 0xE4, 0xB5 } },
+ { "navajowhite", { 0xFF, 0xDE, 0xAD } },
+ { "navy", { 0x00, 0x00, 0x80 } },
+ { "oldlace", { 0xFD, 0xF5, 0xE6 } },
+ { "olive", { 0x80, 0x80, 0x00 } },
+ { "olivedrab", { 0x6B, 0x8E, 0x23 } },
+ { "orange", { 0xFF, 0xA5, 0x00 } },
+ { "orangered", { 0xFF, 0x45, 0x00 } },
+ { "orchid", { 0xDA, 0x70, 0xD6 } },
+ { "palegoldenrod", { 0xEE, 0xE8, 0xAA } },
+ { "palegreen", { 0x98, 0xFB, 0x98 } },
+ { "paleturquoise", { 0xAF, 0xEE, 0xEE } },
+ { "palevioletred", { 0xDB, 0x70, 0x93 } },
+ { "papayawhip", { 0xFF, 0xEF, 0xD5 } },
+ { "peachpuff", { 0xFF, 0xDA, 0xB9 } },
+ { "peru", { 0xCD, 0x85, 0x3F } },
+ { "pink", { 0xFF, 0xC0, 0xCB } },
+ { "plum", { 0xDD, 0xA0, 0xDD } },
+ { "powderblue", { 0xB0, 0xE0, 0xE6 } },
+ { "purple", { 0x80, 0x00, 0x80 } },
+ { "red", { 0xFF, 0x00, 0x00 } },
+ { "rosybrown", { 0xBC, 0x8F, 0x8F } },
+ { "royalblue", { 0x41, 0x69, 0xE1 } },
+ { "saddlebrown", { 0x8B, 0x45, 0x13 } },
+ { "salmon", { 0xFA, 0x80, 0x72 } },
+ { "sandybrown", { 0xF4, 0xA4, 0x60 } },
+ { "seagreen", { 0x2E, 0x8B, 0x57 } },
+ { "seashell", { 0xFF, 0xF5, 0xEE } },
+ { "sienna", { 0xA0, 0x52, 0x2D } },
+ { "silver", { 0xC0, 0xC0, 0xC0 } },
+ { "skyblue", { 0x87, 0xCE, 0xEB } },
+ { "slateblue", { 0x6A, 0x5A, 0xCD } },
+ { "slategray", { 0x70, 0x80, 0x90 } },
+ { "snow", { 0xFF, 0xFA, 0xFA } },
+ { "springgreen", { 0x00, 0xFF, 0x7F } },
+ { "steelblue", { 0x46, 0x82, 0xB4 } },
+ { "tan", { 0xD2, 0xB4, 0x8C } },
+ { "teal", { 0x00, 0x80, 0x80 } },
+ { "thistle", { 0xD8, 0xBF, 0xD8 } },
+ { "tomato", { 0xFF, 0x63, 0x47 } },
+ { "turquoise", { 0x40, 0xE0, 0xD0 } },
+ { "violet", { 0xEE, 0x82, 0xEE } },
+ { "wheat", { 0xF5, 0xDE, 0xB3 } },
+ { "white", { 0xFF, 0xFF, 0xFF } },
+ { "whitesmoke", { 0xF5, 0xF5, 0xF5 } },
+ { "yellow", { 0xFF, 0xFF, 0x00 } },
+ { "yellowgreen", { 0x9A, 0xCD, 0x32 } },
+};
+
+const map_type& get()
+{
+ static map_type mt(entries, std::size(entries), { 0x00, 0x00, 0x00 });
+ return mt;
+}
+
+} // namespace named_color
+
+namespace formula_error_policy {
+
+using map_type = mdds::sorted_string_map<formula_error_policy_t, mdds::string_view_map_entry>;
+
+// Keys must be sorted.
+constexpr map_type::entry entries[] = {
+ { "fail", formula_error_policy_t::fail },
+ { "skip", formula_error_policy_t::skip },
+};
+
+const map_type& get()
+{
+ static map_type mt(entries, std::size(entries), formula_error_policy_t::unknown);
+ return mt;
+}
+
+}
+
+class to_size_t
+{
+ std::size_t m_value;
+
+public:
+ template<typename T>
+ to_size_t(T v) : m_value(static_cast<std::size_t>(v))
+ {
+ static_assert(std::is_enum_v<T>, "source value type must be enum!");
+ }
+
+ operator std::size_t() const
+ {
+ return m_value;
+ }
+};
+
+std::ostream& write_name_for_pos(
+ std::ostream& os, const std::string_view* names, std::size_t n_names, to_size_t pos)
+{
+ if (pos < n_names)
+ os << names[pos];
+ else
+ os << "???";
+
+ return os;
+}
+
+} // anonymous namespace
+
+address_t to_rc_address(const src_address_t& r)
+{
+ address_t ret;
+ ret.row = r.row;
+ ret.column = r.column;
+ return ret;
+}
+
+range_t to_rc_range(const src_range_t& r)
+{
+ range_t ret;
+ ret.first.row = r.first.row;
+ ret.first.column = r.first.column;
+ ret.last.row = r.last.row;
+ ret.last.column = r.last.column;
+ return ret;
+}
+
+bool operator== (const address_t& left, const address_t& right)
+{
+ return left.column == right.column && left.row == right.row;
+}
+
+bool operator!= (const address_t& left, const address_t& right)
+{
+ return !operator== (left, right);
+}
+
+bool operator== (const src_address_t& left, const src_address_t& right)
+{
+ return left.column == right.column && left.row == right.row;
+}
+
+bool operator!= (const src_address_t& left, const src_address_t& right)
+{
+ return !operator== (left, right);
+}
+
+bool operator== (const range_t& left, const range_t& right)
+{
+ return left.first == right.first && left.last == right.last;
+}
+
+bool operator!= (const range_t& left, const range_t& right)
+{
+ return !operator== (left, right);
+}
+
+bool operator== (const src_range_t& left, const src_range_t& right)
+{
+ return left.first == right.first && left.last == right.last;
+}
+
+bool operator!= (const src_range_t& left, const src_range_t& right)
+{
+ return !operator== (left, right);
+}
+
+bool operator< (const range_t& left, const range_t& right)
+{
+ if (left.first.row != right.first.row)
+ return left.first.row < right.first.row;
+
+ if (left.first.column != right.first.column)
+ return left.first.column < right.first.column;
+
+ if (left.last.row != right.last.row)
+ return left.last.row < right.last.row;
+
+ return left.last.column < right.last.column;
+}
+
+bool operator> (const range_t& left, const range_t& right)
+{
+ if (left.first.row != right.first.row)
+ return left.first.row > right.first.row;
+
+ if (left.first.column != right.first.column)
+ return left.first.column > right.first.column;
+
+ if (left.last.row != right.last.row)
+ return left.last.row > right.last.row;
+
+ return left.last.column > right.last.column;
+}
+
+range_t& operator+= (range_t& left, const address_t& right)
+{
+ left.first.column += right.column;
+ left.first.row += right.row;
+ left.last.column += right.column;
+ left.last.row += right.row;
+
+ return left;
+}
+
+range_t& operator-= (range_t& left, const address_t& right)
+{
+ left.first.column -= right.column;
+ left.first.row -= right.row;
+ left.last.column -= right.column;
+ left.last.row -= right.row;
+
+ return left;
+}
+
+std::ostream& operator<< (std::ostream& os, const address_t& v)
+{
+ os << "(column=" << v.column << ",row=" << v.row << ")";
+ return os;
+}
+
+std::ostream& operator<< (std::ostream& os, const src_address_t& v)
+{
+ os << "(sheet=" << v.sheet << ",column=" << v.column << ",row=" << v.row << ")";
+ return os;
+}
+
+std::ostream& operator<< (std::ostream& os, const range_t& v)
+{
+ os << v.first << "-" << v.last;
+ return os;
+}
+
+col_width_t get_default_column_width()
+{
+ return std::numeric_limits<col_width_t>::max();
+}
+
+row_height_t get_default_row_height()
+{
+ return std::numeric_limits<row_height_t>::max();
+}
+
+totals_row_function_t to_totals_row_function_enum(std::string_view s)
+{
+ return trf::get().find(s);
+}
+
+pivot_cache_group_by_t to_pivot_cache_group_by_enum(std::string_view s)
+{
+ return pc_group_by::get().find(s);
+}
+
+error_value_t to_error_value_enum(std::string_view s)
+{
+ return error_value::get().find(s);
+}
+
+color_rgb_t to_color_rgb(std::string_view s)
+{
+ const char* p = s.data();
+ std::size_t n = s.size();
+
+ // RGB string is a 6-character string representing 24-bit hexadecimal
+ // number e.g. '004A12' (red - green - blue)
+
+ // store the original head position and size.
+ const char* p0 = p;
+ size_t n0 = n;
+
+ if (n == 7 && *p == '#')
+ {
+ // Skip the leading '#' character.
+ --n;
+ ++p;
+ }
+
+ if (n != 6)
+ {
+ std::ostringstream os;
+ os << "'" << std::string_view(p0, n0) << "' is not a valid RGB color string.";
+ throw value_error(os.str());
+ }
+
+ color_rgb_t ret;
+ long converted = 0;
+ const char* p_end = p + n;
+
+ for (; p != p_end; ++p)
+ {
+ converted <<= 4;
+
+ char c = *p;
+ long this_val = 0;
+
+ if ('0' <= c && c <= '9')
+ this_val = c - '0';
+ else if ('a' <= c && c <= 'f')
+ this_val = 10 + c - 'a';
+ else if ('A' <= c && c <= 'F')
+ this_val = 10 + c - 'A';
+ else
+ {
+ std::ostringstream os;
+ os << "'" << std::string_view(p0, n0) << "' is not a valid RGB color string.";
+ throw value_error(os.str());
+ }
+
+ converted += this_val;
+ }
+
+ ret.blue = (0x000000FF & converted);
+ converted >>= 8;
+ ret.green = (0x000000FF & converted);
+ converted >>= 8;
+ ret.red = (0x000000FF & converted);
+
+ return ret;
+}
+
+color_rgb_t to_color_rgb_from_name(std::string_view s)
+{
+ return named_colors::get().find(s);
+}
+
+formula_error_policy_t to_formula_error_policy(std::string_view s)
+{
+ return formula_error_policy::get().find(s);
+}
+
+std::ostream& operator<< (std::ostream& os, error_value_t ev)
+{
+ switch (ev)
+ {
+ case error_value_t::div0:
+ os << error_value::entries[0].key;
+ break;
+ case error_value_t::na:
+ os << error_value::entries[1].key;
+ break;
+ case error_value_t::name:
+ os << error_value::entries[2].key;
+ break;
+ case error_value_t::null:
+ os << error_value::entries[3].key;
+ break;
+ case error_value_t::num:
+ os << error_value::entries[4].key;
+ break;
+ case error_value_t::ref:
+ os << error_value::entries[5].key;
+ break;
+ case error_value_t::value:
+ os << error_value::entries[6].key;
+ break;
+ case error_value_t::unknown:
+ default:
+ ;
+ }
+ return os;
+}
+
+std::ostream& operator<< (std::ostream& os, border_style_t border)
+{
+ static constexpr std::string_view names[] = {
+ "unknown",
+ "none",
+ "solid",
+ "dash_dot",
+ "dash_dot_dot",
+ "dashed",
+ "dotted",
+ "double_border",
+ "hair",
+ "medium",
+ "medium_dash_dot",
+ "medium_dash_dot_dot",
+ "medium_dashed",
+ "slant_dash_dot",
+ "thick",
+ "thin",
+ "double_thin",
+ "fine_dashed",
+ };
+
+ return write_name_for_pos(os, names, std::size(names), border);
+}
+
+std::ostream& operator<< (std::ostream& os, formula_grammar_t grammar)
+{
+ static constexpr std::string_view names[] = {
+ "unknown",
+ "xls_xml",
+ "xlsx",
+ "ods",
+ "gnumeric"
+ };
+
+ return write_name_for_pos(os, names, std::size(names), grammar);
+}
+
+std::ostream& operator<< (std::ostream& os, underline_t uline)
+{
+ static constexpr std::string_view names[] = {
+ "none",
+ "single_line",
+ "single_accounting",
+ "double_line",
+ "double_accounting",
+ "dotted",
+ "dash",
+ "long_dash",
+ "dot_dash",
+ "dot_dot_dash",
+ "wave",
+ };
+
+ return write_name_for_pos(os, names, std::size(names), uline);
+}
+
+std::ostream& operator<< (std::ostream& os, underline_width_t ulwidth)
+{
+ static constexpr std::string_view names[] = {
+ "none",
+ "automatic",
+ "bold",
+ "dash",
+ "medium",
+ "thick",
+ "thin",
+ "percent",
+ "positive_integer",
+ "positive_length",
+ };
+
+ return write_name_for_pos(os, names, std::size(names), ulwidth);
+}
+
+std::ostream& operator<< (std::ostream& os, underline_mode_t ulmode)
+{
+ static constexpr std::string_view names[] = {
+ "continuous",
+ "skip_white_space",
+ };
+
+ return write_name_for_pos(os, names, std::size(names), ulmode);
+}
+
+std::ostream& operator<< (std::ostream& os, underline_type_t ultype)
+{
+ static constexpr std::string_view names[] = {
+ "none",
+ "single_type",
+ "double_type",
+ };
+
+ return write_name_for_pos(os, names, std::size(names), ultype);
+}
+
+std::ostream& operator<< (std::ostream& os, hor_alignment_t halign)
+{
+ static constexpr std::string_view names[] = {
+ "unknown",
+ "left",
+ "center",
+ "right",
+ "justified",
+ "distributed",
+ "filled",
+ };
+
+ return write_name_for_pos(os, names, std::size(names), halign);
+}
+
+std::ostream& operator<< (std::ostream& os, ver_alignment_t valign)
+{
+ static constexpr std::string_view names[] = {
+ "unknown",
+ "top",
+ "middle",
+ "bottom",
+ "justified",
+ "distributed",
+ };
+
+ return write_name_for_pos(os, names, std::size(names), valign);
+}
+
+std::ostream& operator<< (std::ostream& os, const color_rgb_t& color)
+{
+ os << "(r=" << (int)color.red << ",g=" << (int)color.green << ",b=" << (int)color.blue << ")";
+ return os;
+}
+
+std::ostream& operator<< (std::ostream& os, const fill_pattern_t& fill)
+{
+ static constexpr std::string_view names[] = {
+ "none",
+ "solid",
+ "dark_down",
+ "dark_gray",
+ "dark_grid",
+ "dark_horizontal",
+ "dark_trellis",
+ "dark_up",
+ "dark_vertical",
+ "gray_0625",
+ "gray_125",
+ "light_down",
+ "light_gray",
+ "light_grid",
+ "light_horizontal",
+ "light_trellis",
+ "light_up",
+ "light_vertical",
+ "medium_gray",
+ };
+
+ return write_name_for_pos(os, names, std::size(names), fill);
+}
+
+std::ostream& operator<< (std::ostream& os, const strikethrough_style_t& ss)
+{
+ static constexpr std::string_view names[] = {
+ "none",
+ "solid",
+ "dash",
+ "dot_dash",
+ "dot_dot_dash",
+ "dotted",
+ "long_dash",
+ "wave",
+ };
+
+ return write_name_for_pos(os, names, std::size(names), ss);
+}
+
+std::ostream& operator<< (std::ostream& os, const strikethrough_type_t& st)
+{
+ static constexpr std::string_view names[] = {
+ "unknown",
+ "none",
+ "single_type",
+ "double_type",
+ };
+
+ return write_name_for_pos(os, names, std::size(names), st);
+}
+
+std::ostream& operator<< (std::ostream& os, const strikethrough_width_t& sw)
+{
+ static constexpr std::string_view names[] = {
+ "unknown",
+ "width_auto",
+ "thin",
+ "medium",
+ "thick",
+ "bold",
+ };
+
+ return write_name_for_pos(os, names, std::size(names), sw);
+}
+
+std::ostream& operator<< (std::ostream& os, const strikethrough_text_t& st)
+{
+ static constexpr std::string_view names[] = {
+ "unknown",
+ "slash",
+ "cross",
+ };
+
+ return write_name_for_pos(os, names, std::size(names), st);
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/string_helper.cpp b/src/liborcus/string_helper.cpp
new file mode 100644
index 0000000..3bf9c63
--- /dev/null
+++ b/src/liborcus/string_helper.cpp
@@ -0,0 +1,40 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "string_helper.hpp"
+
+namespace orcus {
+
+std::vector<std::string_view> string_helper::split_string(std::string_view str, const char sep)
+{
+ std::vector<std::string_view> ret;
+
+ std::size_t len = 0;
+ const char* start = str.data();
+ for (size_t i = 0, n = str.size(); i < n; ++i)
+ {
+ if (str[i] == sep)
+ {
+ ret.emplace_back(start, len);
+
+ // if not at the end move the start string
+ if (i < n-1)
+ start = start + len + 1;
+
+ len = 0;
+ }
+ else
+ ++len;
+ }
+ ret.emplace_back(start, len);
+
+ return ret;
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/string_helper.hpp b/src/liborcus/string_helper.hpp
new file mode 100644
index 0000000..1885a33
--- /dev/null
+++ b/src/liborcus/string_helper.hpp
@@ -0,0 +1,21 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <vector>
+#include <string_view>
+
+namespace orcus {
+
+class string_helper
+{
+public:
+ static std::vector<std::string_view> split_string(std::string_view str, const char sep);
+};
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xls_xml_context.cpp b/src/liborcus/xls_xml_context.cpp
new file mode 100644
index 0000000..ed30616
--- /dev/null
+++ b/src/liborcus/xls_xml_context.cpp
@@ -0,0 +1,2396 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xls_xml_context.hpp"
+#include "xls_xml_namespace_types.hpp"
+#include "xls_xml_token_constants.hpp"
+#include "spreadsheet_iface_util.hpp"
+#include "impl_utils.hpp"
+
+#include <orcus/spreadsheet/import_interface.hpp>
+#include <orcus/spreadsheet/import_interface_styles.hpp>
+#include <orcus/spreadsheet/import_interface_view.hpp>
+#include <orcus/measurement.hpp>
+
+#include <mdds/sorted_string_map.hpp>
+
+#include <iostream>
+#include <sstream>
+#include <limits>
+
+namespace ss = orcus::spreadsheet;
+
+namespace orcus {
+
+namespace {
+
+ss::color_rgb_t to_rgb(std::string_view s)
+{
+ if (!s.empty() && s[0] == '#')
+ return ss::to_color_rgb(s);
+ else
+ {
+ // This may be a color name. Lower-case it before sending it to the
+ // function.
+ std::string s_lower(s.size(), '\0');
+ const char* p = s.data();
+ std::transform(p, p + s.size(), s_lower.begin(),
+ [](char c) -> char
+ {
+ if ('A' <= c && c <= 'Z')
+ c += 'a' - 'A';
+ return c;
+ }
+ );
+
+ return ss::to_color_rgb_from_name(s_lower);
+ }
+}
+
+namespace border_dir {
+
+using map_type = mdds::sorted_string_map<ss::border_direction_t, mdds::string_view_map_entry>;
+
+// Keys must be sorted.
+constexpr map_type::entry entries[] = {
+ { "Bottom", ss::border_direction_t::bottom },
+ { "DiagonalLeft", ss::border_direction_t::diagonal_tl_br },
+ { "DiagonalRight", ss::border_direction_t::diagonal_bl_tr },
+ { "Left", ss::border_direction_t::left },
+ { "Right", ss::border_direction_t::right },
+ { "Top", ss::border_direction_t::top },
+};
+
+const map_type& get()
+{
+ static const map_type mt(entries, std::size(entries), ss::border_direction_t::unknown);
+ return mt;
+}
+
+} // namespace border_dir
+
+namespace border_style {
+
+using map_type = mdds::sorted_string_map<ss::border_style_t, mdds::string_view_map_entry>;
+
+// Keys must be sorted.
+constexpr map_type::entry entries[] = {
+ { "Continuous", ss::border_style_t::solid },
+ { "Dash", ss::border_style_t::dashed },
+ { "DashDot", ss::border_style_t::dash_dot },
+ { "DashDotDot", ss::border_style_t::dash_dot_dot },
+ { "Dot", ss::border_style_t::dotted },
+ { "Double", ss::border_style_t::double_border },
+ { "SlantDashDot", ss::border_style_t::slant_dash_dot },
+};
+
+const map_type& get()
+{
+ static const map_type mt(entries, std::size(entries), ss::border_style_t::unknown);
+ return mt;
+}
+
+}
+
+namespace hor_align {
+
+using map_type = mdds::sorted_string_map<ss::hor_alignment_t, mdds::string_view_map_entry>;
+
+// Keys must be sorted.
+constexpr map_type::entry entries[] = {
+ { "Center", ss::hor_alignment_t::center },
+ { "Distributed", ss::hor_alignment_t::distributed },
+ { "Justify", ss::hor_alignment_t::justified },
+ { "Left", ss::hor_alignment_t::left },
+ { "Right", ss::hor_alignment_t::right },
+};
+
+const map_type& get()
+{
+ static const map_type mt(entries, std::size(entries), ss::hor_alignment_t::unknown);
+ return mt;
+}
+
+}
+
+namespace ver_align {
+
+using map_type = mdds::sorted_string_map<ss::ver_alignment_t, mdds::string_view_map_entry>;
+
+// Keys must be sorted.
+constexpr map_type::entry entries[] = {
+ { "Bottom", ss::ver_alignment_t::bottom },
+ { "Center", ss::ver_alignment_t::middle },
+ { "Distributed", ss::ver_alignment_t::distributed },
+ { "Justify", ss::ver_alignment_t::justified },
+ { "Top", ss::ver_alignment_t::top },
+};
+
+const map_type& get()
+{
+ static const map_type mt(entries, std::size(entries), ss::ver_alignment_t::unknown);
+ return mt;
+}
+
+}
+
+namespace num_format {
+
+using map_type = mdds::sorted_string_map<std::string_view, mdds::string_view_map_entry>;
+
+// Keys must be sorted.
+constexpr map_type::entry entries[] = {
+ { "Currency", "$#,##0.00_);[Red]($#,##0.00)" },
+ { "Euro Currency", "[$\xe2\x82\xac-x-euro2] #,##0.00_);[Red]([$\xe2\x82\xac-x-euro2] #,##0.00)" },
+ { "Fixed", "0.00" },
+ { "General Date", "m/d/yyyy h:mm" },
+ { "General Number", "General" },
+ { "Long Date", "d-mmm-yy" },
+ { "Long Time", "h:mm:ss AM/PM" },
+ { "Medium Date", "d-mmm-yy" },
+ { "Medium Time", "h:mm AM/PM" },
+ { "On/Off", "\"On\";\"On\";\"Off\"" },
+ { "Percent", "0.00%" },
+ { "Scientific", "0.00E+00" },
+ { "Short Date", "m/d/yyyy" },
+ { "Short Time", "h:mm" },
+ { "Standard", "#,##0.00" },
+ { "True/False", "\"True\";\"True\";\"False\"" },
+ { "Yes/No", "\"Yes\";\"Yes\";\"No\"" },
+};
+
+const map_type& get()
+{
+ static const map_type mt(entries, std::size(entries), std::string_view{});
+ return mt;
+}
+
+} // namespace num_format
+
+namespace underline {
+
+using map_type = mdds::sorted_string_map<ss::underline_t, mdds::string_view_map_entry>;
+
+// Keys must be sorted.
+constexpr map_type::entry entries[] = {
+ { "Double", ss::underline_t::double_line },
+ { "DoubleAccounting", ss::underline_t::double_accounting },
+ { "None", ss::underline_t::none },
+ { "Single", ss::underline_t::single_line },
+ { "SingleAccounting", ss::underline_t::single_accounting },
+};
+
+const map_type& get()
+{
+ static const map_type mt(entries, std::size(entries), ss::underline_t::none);
+ return mt;
+}
+
+} // namespace underline
+
+} // anonymous namespace
+
+void xls_xml_data_context::format_type::merge(const format_type& fmt)
+{
+ if (fmt.bold)
+ bold = fmt.bold;
+
+ if (fmt.italic)
+ italic = fmt.italic;
+
+ if (fmt.underline)
+ underline = fmt.underline;
+
+ if (fmt.strikethrough)
+ strikethrough = fmt.strikethrough;
+
+ if (fmt.subscript)
+ subscript = fmt.subscript;
+
+ if (fmt.superscript)
+ superscript = fmt.superscript;
+
+ if (fmt.font_face)
+ font_face = fmt.font_face;
+
+ if (fmt.font_size)
+ font_size = fmt.font_size;
+
+ if (fmt.color)
+ color = fmt.color;
+}
+
+bool xls_xml_data_context::format_type::formatted() const
+{
+ return bold || italic || underline || strikethrough
+ || subscript || superscript || font_face || font_size
+ || color;
+}
+
+xls_xml_data_context::string_segment_type::string_segment_type(std::string_view _str) :
+ str(_str) {}
+
+xls_xml_data_context::xls_xml_data_context(
+ session_context& session_cxt, const tokens& tokens, xls_xml_context& parent_cxt) :
+ xml_context_base(session_cxt, tokens),
+ m_parent_cxt(parent_cxt),
+ m_cell_type(ct_unknown),
+ m_cell_value(std::numeric_limits<double>::quiet_NaN())
+{
+ static const xml_element_validator::rule rules[] = {
+ // parent element -> child element
+ { XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN, NS_xls_xml_ss, XML_Data }, // root element
+ { NS_xls_xml_html, XML_B, NS_xls_xml_html, XML_Font },
+ { NS_xls_xml_html, XML_Font, NS_xls_xml_html, XML_B },
+ { NS_xls_xml_html, XML_Font, NS_xls_xml_html, XML_I },
+ { NS_xls_xml_html, XML_Font, NS_xls_xml_html, XML_S },
+ { NS_xls_xml_html, XML_Font, NS_xls_xml_html, XML_Sub },
+ { NS_xls_xml_html, XML_Font, NS_xls_xml_html, XML_Sup },
+ { NS_xls_xml_html, XML_Font, NS_xls_xml_html, XML_U },
+ { NS_xls_xml_html, XML_I, NS_xls_xml_html, XML_Font },
+ { NS_xls_xml_html, XML_S, NS_xls_xml_html, XML_Font },
+ { NS_xls_xml_html, XML_Sub, NS_xls_xml_html, XML_Font },
+ { NS_xls_xml_html, XML_Sup, NS_xls_xml_html, XML_Font },
+ { NS_xls_xml_html, XML_U, NS_xls_xml_html, XML_Font },
+ { NS_xls_xml_ss, XML_Data, NS_xls_xml_html, XML_B },
+ { NS_xls_xml_ss, XML_Data, NS_xls_xml_html, XML_Font },
+ { NS_xls_xml_ss, XML_Data, NS_xls_xml_html, XML_I },
+ { NS_xls_xml_ss, XML_Data, NS_xls_xml_html, XML_S },
+ { NS_xls_xml_ss, XML_Data, NS_xls_xml_html, XML_Sub },
+ { NS_xls_xml_ss, XML_Data, NS_xls_xml_html, XML_Sup },
+ { NS_xls_xml_ss, XML_Data, NS_xls_xml_html, XML_U },
+ };
+
+ init_element_validator(rules, std::size(rules));
+}
+
+xls_xml_data_context::~xls_xml_data_context() {}
+
+xml_context_base* xls_xml_data_context::create_child_context(xmlns_id_t /*ns*/, xml_token_t /*name*/)
+{
+ return nullptr;
+}
+
+void xls_xml_data_context::end_child_context(xmlns_id_t /*ns*/, xml_token_t /*name*/, xml_context_base* /*child*/)
+{
+}
+
+void xls_xml_data_context::start_element(xmlns_id_t ns, xml_token_t name, const::std::vector<xml_token_attr_t>& attrs)
+{
+ xml_token_pair_t parent = push_stack(ns, name);
+
+ if (ns == NS_xls_xml_ss)
+ {
+ switch (name)
+ {
+ case XML_Data:
+ start_element_data(parent, attrs);
+ break;
+ default:
+ warn_unhandled();
+ }
+ }
+ else if (ns == NS_xls_xml_html)
+ {
+ switch (name)
+ {
+ case XML_B:
+ m_format_stack.emplace_back();
+ m_format_stack.back().bold = true;
+ update_current_format();
+ break;
+ case XML_I:
+ m_format_stack.emplace_back();
+ m_format_stack.back().italic = true;
+ update_current_format();
+ break;
+ case XML_U:
+ m_format_stack.emplace_back();
+ m_format_stack.back().underline = true;
+ update_current_format();
+ break;
+ case XML_S:
+ m_format_stack.emplace_back();
+ m_format_stack.back().strikethrough = true;
+ update_current_format();
+ break;
+ case XML_Sub:
+ m_format_stack.emplace_back();
+ m_format_stack.back().subscript = true;
+ update_current_format();
+ break;
+ case XML_Sup:
+ m_format_stack.emplace_back();
+ m_format_stack.back().superscript = true;
+ update_current_format();
+ break;
+ case XML_Font:
+ {
+ m_format_stack.emplace_back();
+ format_type& fmt = m_format_stack.back();
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (ns == NS_xls_xml_html)
+ {
+ switch (attr.name)
+ {
+ case XML_Color:
+ fmt.color = to_rgb(attr.value);
+ break;
+ case XML_Face:
+ fmt.font_face = attr.transient ? intern(attr.value) : attr.value;
+ break;
+ case XML_Size:
+ {
+ const char* p_end = nullptr;
+ double v = to_double(attr.value, &p_end);
+ if (attr.value.data() < p_end)
+ fmt.font_size = v;
+ break;
+ }
+ }
+ }
+ }
+
+ update_current_format();
+ break;
+ }
+ default:
+ warn_unhandled();
+ }
+ }
+ else
+ warn_unhandled();
+}
+
+void xls_xml_data_context::characters(std::string_view str, bool transient)
+{
+ if (str.empty())
+ return;
+
+ switch (m_cell_type)
+ {
+ case ct_unknown:
+ break;
+ case ct_string:
+ {
+ if (transient)
+ m_cell_string.emplace_back(intern(str));
+ else
+ m_cell_string.emplace_back(str);
+
+ if (m_current_format.formatted())
+ {
+ // Apply the current format to this string segment.
+ string_segment_type& ss = m_cell_string.back();
+ ss.format = m_current_format;
+ ss.formatted = true;
+ }
+
+ break;
+ }
+ case ct_number:
+ {
+ m_cell_value = to_double(str);
+ break;
+ }
+ case ct_datetime:
+ m_cell_datetime = date_time_t::from_chars(str);
+ break;
+ default:
+ {
+ std::ostringstream os;
+ os << "unknown cell type '" << m_cell_type << "': characters='" << str << "'";
+ warn(os.str());
+ }
+ }
+}
+
+bool xls_xml_data_context::end_element(xmlns_id_t ns, xml_token_t name)
+{
+ if (ns == NS_xls_xml_ss)
+ {
+ switch (name)
+ {
+ case XML_Data:
+ end_element_data();
+ break;
+ default:
+ ;
+ }
+ }
+ else if (ns == NS_xls_xml_html)
+ {
+ switch (name)
+ {
+ case XML_B:
+ case XML_I:
+ case XML_U:
+ case XML_S:
+ case XML_Sub:
+ case XML_Sup:
+ case XML_Font:
+ assert(!m_format_stack.empty());
+ m_format_stack.pop_back();
+ update_current_format();
+ break;
+ default:
+ ;
+ }
+ }
+
+ return pop_stack(ns, name);
+}
+
+void xls_xml_data_context::reset()
+{
+ m_format_stack.clear();
+ m_format_stack.emplace_back(); // set default format.
+ update_current_format();
+
+ m_cell_type = ct_unknown;
+ m_cell_string.clear();
+
+ m_cell_value = std::numeric_limits<double>::quiet_NaN();
+ m_cell_datetime = date_time_t();
+}
+
+void xls_xml_data_context::start_element_data(
+ const xml_token_pair_t& /*parent*/, const xml_token_attrs_t& attrs)
+{
+ m_cell_type = ct_unknown;
+ m_cell_string.clear();
+ m_cell_datetime = date_time_t();
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.ns != NS_xls_xml_ss)
+ continue;
+
+ switch (attr.name)
+ {
+ case XML_Type:
+ {
+ if (attr.value == "String")
+ m_cell_type = ct_string;
+ else if (attr.value == "Number")
+ m_cell_type = ct_number;
+ else if (attr.value == "DateTime")
+ m_cell_type = ct_datetime;
+ break;
+ }
+ default:
+ ;
+ }
+ }
+}
+
+void xls_xml_data_context::end_element_data()
+{
+ auto formula = m_parent_cxt.pop_and_clear_formula();
+
+ if (!formula.empty())
+ {
+ if (m_parent_cxt.is_array_formula())
+ store_array_formula_parent_cell(formula);
+ else
+ push_formula_cell(formula);
+ m_cell_type = ct_unknown;
+ return;
+ }
+
+ if (handle_array_formula_result())
+ {
+ m_cell_type = ct_unknown;
+ return;
+ }
+
+ ss::iface::import_sheet* sheet = m_parent_cxt.get_import_sheet();
+ ss::address_t pos = m_parent_cxt.get_current_pos();
+
+ switch (m_cell_type)
+ {
+ case ct_unknown:
+ break;
+ case ct_number:
+ sheet->set_value(pos.row, pos.column, m_cell_value);
+ break;
+ case ct_string:
+ {
+ ss::iface::import_shared_strings* ss =
+ m_parent_cxt.get_import_factory()->get_shared_strings();
+
+ if (!ss)
+ break;
+
+ if (m_cell_string.empty())
+ break;
+
+ if (m_cell_string.size() == 1 && !m_cell_string[0].formatted)
+ {
+ // Unformatted string.
+ std::string_view s = m_cell_string.back().str;
+ sheet->set_string(pos.row, pos.column, ss->append(s));
+ }
+ else
+ {
+ // Formatted string. Note that an absence of a format type
+ // appears to mean its negative value is implied.
+
+ for (const string_segment_type& sstr : m_cell_string)
+ {
+ if (sstr.format.bold)
+ ss->set_segment_bold(*sstr.format.bold);
+ else
+ ss->set_segment_bold(false); // implied
+
+ if (sstr.format.italic)
+ ss->set_segment_italic(*sstr.format.italic);
+ else
+ ss->set_segment_italic(false); // implied
+
+ if (sstr.format.font_face)
+ ss->set_segment_font_name(*sstr.format.font_face);
+
+ if (sstr.format.font_size)
+ ss->set_segment_font_size(*sstr.format.font_size);
+
+ if (sstr.format.color)
+ ss->set_segment_font_color(
+ 255,
+ sstr.format.color->red,
+ sstr.format.color->green,
+ sstr.format.color->blue);
+
+ ss->append_segment(sstr.str);
+ }
+
+ size_t si = ss->commit_segments();
+ sheet->set_string(pos.row, pos.column, si);
+ }
+
+ m_cell_string.clear();
+
+ break;
+ }
+ case ct_datetime:
+ {
+ sheet->set_date_time(
+ pos.row, pos.column,
+ m_cell_datetime.year, m_cell_datetime.month, m_cell_datetime.day,
+ m_cell_datetime.hour, m_cell_datetime.minute, m_cell_datetime.second);
+ break;
+ }
+ default:
+ {
+ std::ostringstream os;
+ os <<"unknown cell type '" << m_cell_type << "': value not pushed.";
+ warn(os.str());
+ }
+ }
+
+ m_cell_type = ct_unknown;
+}
+
+bool xls_xml_data_context::handle_array_formula_result()
+{
+ xls_xml_context::array_formulas_type& store = m_parent_cxt.get_array_formula_store();
+ ss::address_t cur_pos = m_parent_cxt.get_current_pos();
+
+ // See if the current cell is within an array formula range.
+ auto it = store.begin(), ite = store.end();
+
+ while (it != ite)
+ {
+ const ss::range_t& ref = it->first;
+ xls_xml_context::array_formula_type& af = *it->second;
+
+ if (ref.last.row < cur_pos.row)
+ {
+ // If this result range lies above the current row, push the array
+ // and delete it from the list.
+
+ ss::iface::import_sheet* sheet = m_parent_cxt.get_import_sheet();
+ ss::iface::import_array_formula* array = nullptr;
+
+ if (sheet)
+ array = sheet->get_array_formula();
+
+ if (array)
+ {
+ push_array_formula(
+ array, ref, af.formula, ss::formula_grammar_t::xls_xml, af.results);
+ }
+
+ store.erase(it++);
+ continue;
+ }
+
+ if (cur_pos.column < ref.first.column || ref.last.column < cur_pos.column ||
+ cur_pos.row < ref.first.row || ref.last.row < cur_pos.row)
+ {
+ // This cell is not within this array formula range. Move on to
+ // the next one.
+ ++it;
+ continue;
+ }
+
+ size_t row_offset = cur_pos.row - ref.first.row;
+ size_t col_offset = cur_pos.column - ref.first.column;
+ range_formula_results& res = af.results;
+ push_array_result(res, row_offset, col_offset);
+
+ return true;
+ }
+
+ return false;
+}
+
+void xls_xml_data_context::push_array_result(
+ range_formula_results& res, size_t row_offset, size_t col_offset)
+{
+ switch (m_cell_type)
+ {
+ case ct_number:
+ {
+ res.set(row_offset, col_offset, m_cell_value);
+ break;
+ }
+ case ct_unknown:
+ case ct_datetime:
+ case ct_string:
+ default:
+ {
+ std::ostringstream os;
+ os << "unknown cell type '" << m_cell_type << "': value not pushed.";
+ warn(os.str());
+ }
+ }
+}
+
+void xls_xml_data_context::push_formula_cell(std::string_view formula)
+{
+ switch (m_cell_type)
+ {
+ case ct_number:
+ m_parent_cxt.store_cell_formula(formula, m_cell_value);
+ break;
+ default:
+ {
+ formula_result res;
+ m_parent_cxt.store_cell_formula(formula, res);
+ }
+ }
+}
+
+void xls_xml_data_context::store_array_formula_parent_cell(std::string_view formula)
+{
+ ss::address_t pos = m_parent_cxt.get_current_pos();
+ ss::range_t range = m_parent_cxt.get_array_range();
+ xls_xml_context::array_formulas_type& store = m_parent_cxt.get_array_formula_store();
+
+ range += pos;
+
+ store.push_back(
+ std::make_pair(
+ range,
+ std::make_unique<xls_xml_context::array_formula_type>(range, formula)));
+
+ xls_xml_context::array_formula_type& af = *store.back().second;
+
+ switch (m_cell_type)
+ {
+ case ct_number:
+ af.results.set(0, 0, m_cell_value);
+ break;
+ default:
+ ;
+ }
+}
+
+void xls_xml_data_context::update_current_format()
+{
+ // format stack should have at least one entry at any given moment.
+ assert(!m_format_stack.empty());
+
+ // Grab the bottom format.
+ auto it = m_format_stack.begin();
+ m_current_format = *it;
+ ++it;
+
+ // Merge in the rest of the format data.
+ std::for_each(it, m_format_stack.end(),
+ [&](const format_type& fmt)
+ {
+ m_current_format.merge(fmt);
+ }
+ );
+}
+
+xls_xml_context::array_formula_type::array_formula_type(
+ const ss::range_t& _range, std::string_view _formula) :
+ formula(_formula),
+ results(_range.last.row-_range.first.row+1, _range.last.column-_range.first.column+1) {}
+
+xls_xml_context::named_exp::named_exp(std::string_view _name, std::string_view _expression, ss::sheet_t _scope) :
+ name(_name), expression(_expression), scope(_scope) {}
+
+xls_xml_context::selection::selection() : pane(ss::sheet_pane_t::unspecified), col(-1), row(-1)
+{
+ range.first.column = -1;
+ range.first.row = -1;
+ range.last.column = -1;
+ range.last.row = -1;
+}
+
+void xls_xml_context::selection::reset()
+{
+ pane = ss::sheet_pane_t::unspecified;
+ col = 0;
+ row = 0;
+
+ range.first.column = -1;
+ range.first.row = -1;
+ range.last.column = -1;
+ range.last.row = -1;
+}
+
+bool xls_xml_context::selection::valid_cursor() const
+{
+ return col >= 0 && row >= 0;
+}
+
+bool xls_xml_context::selection::valid_range() const
+{
+ return range.first.column >= 0 && range.first.row >= 0 && range.last.column >= 0 && range.last.row >= 0;
+}
+
+xls_xml_context::split_pane::split_pane() :
+ pane_state(ss::pane_state_t::split),
+ active_pane(ss::sheet_pane_t::top_left),
+ split_horizontal(0.0), split_vertical(0.0),
+ top_row_bottom_pane(0), left_col_right_pane(0) {}
+
+void xls_xml_context::split_pane::reset()
+{
+ pane_state = ss::pane_state_t::split;
+ active_pane = ss::sheet_pane_t::top_left;
+ split_horizontal = 0.0;
+ split_vertical = 0.0;
+ top_row_bottom_pane = 0;
+ left_col_right_pane = 0;
+}
+
+bool xls_xml_context::split_pane::split() const
+{
+ return (split_horizontal || split_vertical) && (top_row_bottom_pane || left_col_right_pane);
+}
+
+ss::address_t xls_xml_context::split_pane::get_top_left_cell() const
+{
+ ss::address_t pos;
+ pos.column = left_col_right_pane;
+ pos.row = top_row_bottom_pane;
+ return pos;
+}
+
+xls_xml_context::table_properties::table_properties()
+{
+ reset();
+}
+
+void xls_xml_context::table_properties::reset()
+{
+ pos.row = 0;
+ pos.column = 0;
+}
+
+xls_xml_context::xls_xml_context(session_context& session_cxt, const tokens& tokens, ss::iface::import_factory* factory) :
+ xml_context_base(session_cxt, tokens),
+ mp_factory(factory),
+ mp_cur_sheet(nullptr),
+ mp_sheet_props(nullptr),
+ m_cur_sheet(-1),
+ m_cur_row(0), m_cur_col(0),
+ m_cur_prop_col(0),
+ m_cur_merge_down(0), m_cur_merge_across(0),
+ m_cc_data(session_cxt, tokens, *this)
+{
+ register_child(&m_cc_data);
+
+ static const xml_element_validator::rule rules[] = {
+ // parent element -> child element
+ { XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN, NS_xls_xml_ss, XML_Workbook }, // root element
+ { NS_xls_xml_o, XML_DocumentProperties, NS_xls_xml_o, XML_Author },
+ { NS_xls_xml_o, XML_DocumentProperties, NS_xls_xml_o, XML_Company },
+ { NS_xls_xml_o, XML_DocumentProperties, NS_xls_xml_o, XML_Created },
+ { NS_xls_xml_o, XML_DocumentProperties, NS_xls_xml_o, XML_LastAuthor },
+ { NS_xls_xml_o, XML_DocumentProperties, NS_xls_xml_o, XML_LastSaved },
+ { NS_xls_xml_o, XML_DocumentProperties, NS_xls_xml_o, XML_Version },
+ { NS_xls_xml_o, XML_OfficeDocumentSettings, NS_xls_xml_o, XML_AllowPNG },
+ { NS_xls_xml_o, XML_OfficeDocumentSettings, NS_xls_xml_o, XML_DownloadComponents },
+ { NS_xls_xml_o, XML_OfficeDocumentSettings, NS_xls_xml_o, XML_LocationOfComponents },
+ { NS_xls_xml_ss, XML_Borders, NS_xls_xml_ss, XML_Border },
+ { NS_xls_xml_ss, XML_Cell, NS_xls_xml_ss, XML_Data },
+ { NS_xls_xml_ss, XML_Cell, NS_xls_xml_ss, XML_NamedCell },
+ { NS_xls_xml_ss, XML_Names, NS_xls_xml_ss, XML_NamedRange },
+ { NS_xls_xml_ss, XML_Row, NS_xls_xml_ss, XML_Cell },
+ { NS_xls_xml_ss, XML_Style, NS_xls_xml_ss, XML_Alignment },
+ { NS_xls_xml_ss, XML_Style, NS_xls_xml_ss, XML_Borders },
+ { NS_xls_xml_ss, XML_Style, NS_xls_xml_ss, XML_Font },
+ { NS_xls_xml_ss, XML_Style, NS_xls_xml_ss, XML_Interior },
+ { NS_xls_xml_ss, XML_Style, NS_xls_xml_ss, XML_NumberFormat },
+ { NS_xls_xml_ss, XML_Style, NS_xls_xml_ss, XML_Protection },
+ { NS_xls_xml_ss, XML_Styles, NS_xls_xml_ss, XML_Style },
+ { NS_xls_xml_ss, XML_Table, NS_xls_xml_ss, XML_Column },
+ { NS_xls_xml_ss, XML_Table, NS_xls_xml_ss, XML_Row },
+ { NS_xls_xml_ss, XML_Workbook, NS_xls_xml_o, XML_DocumentProperties },
+ { NS_xls_xml_ss, XML_Workbook, NS_xls_xml_o, XML_OfficeDocumentSettings },
+ { NS_xls_xml_ss, XML_Workbook, NS_xls_xml_ss, XML_Names },
+ { NS_xls_xml_ss, XML_Workbook, NS_xls_xml_ss, XML_Styles },
+ { NS_xls_xml_ss, XML_Workbook, NS_xls_xml_ss, XML_Worksheet },
+ { NS_xls_xml_ss, XML_Workbook, NS_xls_xml_x, XML_ExcelWorkbook },
+ { NS_xls_xml_ss, XML_Worksheet, NS_xls_xml_ss, XML_Names },
+ { NS_xls_xml_ss, XML_Worksheet, NS_xls_xml_ss, XML_Table },
+ { NS_xls_xml_ss, XML_Worksheet, NS_xls_xml_x, XML_AutoFilter },
+ { NS_xls_xml_ss, XML_Worksheet, NS_xls_xml_x, XML_WorksheetOptions },
+ { NS_xls_xml_x, XML_AutoFilter, NS_xls_xml_x, XML_AutoFilterColumn },
+ { NS_xls_xml_x, XML_AutoFilterColumn, NS_xls_xml_x, XML_AutoFilterCondition },
+ { NS_xls_xml_x, XML_AutoFilterColumn, NS_xls_xml_x, XML_AutoFilterOr },
+ { NS_xls_xml_x, XML_AutoFilterOr, NS_xls_xml_x, XML_AutoFilterCondition },
+ { NS_xls_xml_x, XML_ExcelWorkbook, NS_xls_xml_x, XML_ActiveSheet },
+ { NS_xls_xml_x, XML_ExcelWorkbook, NS_xls_xml_x, XML_FirstVisibleSheet },
+ { NS_xls_xml_x, XML_ExcelWorkbook, NS_xls_xml_x, XML_ProtectStructure },
+ { NS_xls_xml_x, XML_ExcelWorkbook, NS_xls_xml_x, XML_ProtectWindows },
+ { NS_xls_xml_x, XML_ExcelWorkbook, NS_xls_xml_x, XML_RefModeR1C1 },
+ { NS_xls_xml_x, XML_ExcelWorkbook, NS_xls_xml_x, XML_TabRatio },
+ { NS_xls_xml_x, XML_ExcelWorkbook, NS_xls_xml_x, XML_WindowHeight },
+ { NS_xls_xml_x, XML_ExcelWorkbook, NS_xls_xml_x, XML_WindowTopX },
+ { NS_xls_xml_x, XML_ExcelWorkbook, NS_xls_xml_x, XML_WindowTopY },
+ { NS_xls_xml_x, XML_ExcelWorkbook, NS_xls_xml_x, XML_WindowWidth },
+ { NS_xls_xml_x, XML_PageSetup, NS_xls_xml_x, XML_Footer },
+ { NS_xls_xml_x, XML_PageSetup, NS_xls_xml_x, XML_Header },
+ { NS_xls_xml_x, XML_PageSetup, NS_xls_xml_x, XML_PageMargins },
+ { NS_xls_xml_x, XML_Pane, NS_xls_xml_x, XML_ActiveCol },
+ { NS_xls_xml_x, XML_Pane, NS_xls_xml_x, XML_ActiveRow },
+ { NS_xls_xml_x, XML_Pane, NS_xls_xml_x, XML_Number },
+ { NS_xls_xml_x, XML_Pane, NS_xls_xml_x, XML_RangeSelection },
+ { NS_xls_xml_x, XML_Panes, NS_xls_xml_x, XML_Pane },
+ { NS_xls_xml_x, XML_Print, NS_xls_xml_x, XML_HorizontalResolution },
+ { NS_xls_xml_x, XML_Print, NS_xls_xml_x, XML_ValidPrinterInfo },
+ { NS_xls_xml_x, XML_Print, NS_xls_xml_x, XML_VerticalResolution },
+ { NS_xls_xml_x, XML_WorksheetOptions, NS_xls_xml_x, XML_ActivePane },
+ { NS_xls_xml_x, XML_WorksheetOptions, NS_xls_xml_x, XML_FilterOn },
+ { NS_xls_xml_x, XML_WorksheetOptions, NS_xls_xml_x, XML_FreezePanes },
+ { NS_xls_xml_x, XML_WorksheetOptions, NS_xls_xml_x, XML_FrozenNoSplit },
+ { NS_xls_xml_x, XML_WorksheetOptions, NS_xls_xml_x, XML_LeftColumnRightPane },
+ { NS_xls_xml_x, XML_WorksheetOptions, NS_xls_xml_x, XML_PageSetup },
+ { NS_xls_xml_x, XML_WorksheetOptions, NS_xls_xml_x, XML_Panes },
+ { NS_xls_xml_x, XML_WorksheetOptions, NS_xls_xml_x, XML_Print },
+ { NS_xls_xml_x, XML_WorksheetOptions, NS_xls_xml_x, XML_ProtectObjects },
+ { NS_xls_xml_x, XML_WorksheetOptions, NS_xls_xml_x, XML_ProtectScenarios },
+ { NS_xls_xml_x, XML_WorksheetOptions, NS_xls_xml_x, XML_Selected },
+ { NS_xls_xml_x, XML_WorksheetOptions, NS_xls_xml_x, XML_SplitHorizontal },
+ { NS_xls_xml_x, XML_WorksheetOptions, NS_xls_xml_x, XML_SplitVertical },
+ { NS_xls_xml_x, XML_WorksheetOptions, NS_xls_xml_x, XML_TopRowBottomPane },
+ { NS_xls_xml_x, XML_WorksheetOptions, NS_xls_xml_x, XML_TopRowVisible },
+ { NS_xls_xml_x, XML_WorksheetOptions, NS_xls_xml_x, XML_Unsynced },
+ { NS_xls_xml_x, XML_WorksheetOptions, NS_xls_xml_x, XML_Zoom },
+ };
+
+ init_element_validator(rules, std::size(rules));
+
+ m_cur_array_range.first.column = -1;
+ m_cur_array_range.first.row = -1;
+ m_cur_array_range.last = m_cur_array_range.first;
+}
+
+xls_xml_context::~xls_xml_context()
+{
+}
+
+void xls_xml_context::declaration(const xml_declaration_t& decl)
+{
+ ss::iface::import_global_settings* gs = mp_factory->get_global_settings();
+ if (!gs)
+ return;
+
+ gs->set_character_set(decl.encoding);
+}
+
+xml_context_base* xls_xml_context::create_child_context(xmlns_id_t ns, xml_token_t name)
+{
+ if (ns == NS_xls_xml_ss)
+ {
+ switch (name)
+ {
+ case XML_Data:
+ {
+ // Move the cell formula string to the Data element context.
+ m_cc_data.reset();
+ return &m_cc_data;
+ }
+ default:
+ ;
+ }
+ }
+ return nullptr;
+}
+
+void xls_xml_context::end_child_context(xmlns_id_t /*ns*/, xml_token_t /*name*/, xml_context_base* /*child*/)
+{
+}
+
+void xls_xml_context::start_element(xmlns_id_t ns, xml_token_t name, const xml_token_attrs_t& attrs)
+{
+ push_stack(ns, name);
+
+ if (ns == NS_xls_xml_ss)
+ {
+ switch (name)
+ {
+ case XML_Workbook:
+ // Do nothing.
+ break;
+ case XML_Worksheet:
+ {
+ start_element_worksheet(attrs);
+ break;
+ }
+ case XML_Table:
+ start_element_table(attrs);
+ break;
+ case XML_Row:
+ start_element_row(attrs);
+ break;
+ case XML_Cell:
+ start_element_cell(attrs);
+ break;
+ case XML_Column:
+ start_element_column(attrs);
+ break;
+ case XML_Names:
+ break;
+ case XML_NamedRange:
+ {
+ std::string_view name_s, exp;
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.ns != NS_xls_xml_ss)
+ continue;
+
+ switch (attr.name)
+ {
+ case XML_Name:
+ name_s = intern(attr);
+ break;
+ case XML_RefersTo:
+ {
+ exp = attr.value;
+ if (exp.size() > 1 && exp[0] == '=')
+ exp = std::string_view{exp.data()+1, exp.size()-1};
+ if (!exp.empty() && attr.transient)
+ exp = intern(exp);
+ break;
+ }
+ default:
+ ;
+ }
+ }
+
+ if (!name_s.empty() && !exp.empty())
+ {
+ if (m_cur_sheet >= 0)
+ m_named_exps_sheet.emplace_back(name_s, exp, m_cur_sheet);
+ else
+ m_named_exps_global.emplace_back(name_s, exp, -1);
+ }
+
+ break;
+ }
+ case XML_Styles:
+ break;
+ case XML_Style:
+ {
+ m_current_style = std::make_unique<style_type>();
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.ns != NS_xls_xml_ss)
+ continue;
+
+ switch (attr.name)
+ {
+ case XML_ID:
+ m_current_style->id = intern(attr);
+ break;
+ case XML_Name:
+ m_current_style->name = intern(attr);
+ break;
+ case XML_Parent:
+ m_current_style->parent_id = intern(attr);
+ break;
+ default:
+ ;
+ }
+ }
+
+ break;
+ }
+ case XML_Borders:
+ start_element_borders(attrs);
+ break;
+ case XML_Border:
+ start_element_border(attrs);
+ break;
+ case XML_NumberFormat:
+ start_element_number_format(attrs);
+ break;
+ case XML_Font:
+ {
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.ns != NS_xls_xml_ss)
+ continue;
+
+ switch (attr.name)
+ {
+ case XML_FontName:
+ {
+ m_current_style->font.name = intern(attr);
+ break;
+ }
+ case XML_Bold:
+ {
+ m_current_style->font.bold = to_bool(attr.value);
+ break;
+ }
+ case XML_Italic:
+ {
+ m_current_style->font.italic = to_bool(attr.value);
+ break;
+ }
+ case XML_Color:
+ {
+ m_current_style->font.color = to_rgb(attr.value);
+ break;
+ }
+ case XML_Size:
+ {
+ m_current_style->font.size = to_double(attr.value);
+ break;
+ }
+ case XML_Underline:
+ {
+ m_current_style->font.underline = underline::get().find(attr.value);
+ break;
+ }
+ }
+ }
+ break;
+ }
+ case XML_Interior:
+ {
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.ns != NS_xls_xml_ss)
+ continue;
+
+ switch (attr.name)
+ {
+ case XML_Color:
+ {
+ m_current_style->fill.color = to_rgb(attr.value);
+ break;
+ }
+ case XML_Pattern:
+ {
+ // TODO : support fill types other than 'solid'.
+ m_current_style->fill.solid = (attr.value == "Solid");
+ break;
+ }
+ default:
+ ;
+ }
+ }
+ break;
+ }
+ case XML_Alignment:
+ {
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.ns != NS_xls_xml_ss)
+ continue;
+
+ switch (attr.name)
+ {
+ case XML_Horizontal:
+ {
+ m_current_style->text_alignment.hor = hor_align::get().find(attr.value);
+ break;
+ }
+ case XML_Vertical:
+ {
+ m_current_style->text_alignment.ver = ver_align::get().find(attr.value);
+ break;
+ }
+ case XML_Indent:
+ {
+ m_current_style->text_alignment.indent = to_long(attr.value);
+ break;
+ }
+ case XML_WrapText:
+ {
+ m_current_style->text_alignment.wrap_text = to_bool(attr.value);
+ break;
+ }
+ case XML_ShrinkToFit:
+ {
+ m_current_style->text_alignment.shrink_to_fit = to_bool(attr.value);
+ break;
+ }
+ default:
+ ;
+ }
+ }
+ break;
+ }
+ case XML_Protection:
+ {
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.ns == NS_xls_xml_x && attr.name == XML_HideFormula)
+ {
+ m_current_style->cell_protection.hide_formula = to_bool(attr.value);
+ }
+ else if (attr.ns == NS_xls_xml_ss && attr.name == XML_Protected)
+ {
+ m_current_style->cell_protection.locked = to_bool(attr.value);
+ }
+ }
+ }
+ default:
+ warn_unhandled();
+ }
+ }
+ else if (ns == NS_xls_xml_x)
+ {
+ switch (name)
+ {
+ case XML_WorksheetOptions:
+ m_split_pane.reset();
+ break;
+ case XML_FreezePanes:
+ // TODO : check if this is correct.
+ m_split_pane.pane_state = ss::pane_state_t::frozen_split;
+ break;
+ case XML_FrozenNoSplit:
+ m_split_pane.pane_state = ss::pane_state_t::frozen;
+ break;
+ case XML_ActivePane:
+ m_split_pane.active_pane = ss::sheet_pane_t::unspecified;
+ break;
+ case XML_SplitHorizontal:
+ m_split_pane.split_horizontal = 0.0;
+ break;
+ case XML_SplitVertical:
+ m_split_pane.split_vertical = 0.0;
+ break;
+ case XML_TopRowBottomPane:
+ m_split_pane.top_row_bottom_pane = 0;
+ break;
+ case XML_LeftColumnRightPane:
+ m_split_pane.left_col_right_pane = 0;
+ break;
+ case XML_Panes:
+ break;
+ case XML_Pane:
+ m_cursor_selection.reset();
+ break;
+ case XML_Number:
+ break;
+ case XML_ActiveCol:
+ break;
+ case XML_ActiveRow:
+ break;
+ case XML_RangeSelection:
+ break;
+ case XML_Selected:
+ {
+ if (mp_cur_sheet)
+ {
+ ss::iface::import_sheet_view* sv = mp_cur_sheet->get_sheet_view();
+ if (sv)
+ sv->set_sheet_active();
+ }
+ break;
+ }
+ default:
+ warn_unhandled();
+ }
+ }
+ else
+ warn_unhandled();
+}
+
+bool xls_xml_context::end_element(xmlns_id_t ns, xml_token_t name)
+{
+ if (ns == NS_xls_xml_ss)
+ {
+ switch (name)
+ {
+ case XML_Borders:
+ end_element_borders();
+ break;
+ case XML_Border:
+ end_element_border();
+ break;
+ case XML_NumberFormat:
+ end_element_number_format();
+ break;
+ case XML_Row:
+ end_element_row();
+ break;
+ case XML_Cell:
+ end_element_cell();
+ break;
+ case XML_Column:
+ end_element_column();
+ break;
+ case XML_Table:
+ end_element_table();
+ break;
+ case XML_Workbook:
+ end_element_workbook();
+ break;
+ case XML_Worksheet:
+ end_element_worksheet();
+ break;
+ case XML_Style:
+ {
+ if (m_current_style)
+ {
+ if (m_current_style->id == "Default")
+ m_default_style = std::move(m_current_style);
+ else
+ m_styles.push_back(std::move(m_current_style));
+ }
+ break;
+ }
+ case XML_Styles:
+ {
+ end_element_styles();
+ break;
+ }
+ default:
+ ;
+ }
+ }
+ else if (ns == NS_xls_xml_x)
+ {
+ switch (name)
+ {
+ case XML_Pane:
+ end_element_pane();
+ break;
+ case XML_WorksheetOptions:
+ end_element_worksheet_options();
+ break;
+ default:
+ ;
+ }
+ }
+ return pop_stack(ns, name);
+}
+
+namespace {
+
+ss::sheet_pane_t to_sheet_pane(long v)
+{
+ static const std::vector<ss::sheet_pane_t> mapping = {
+ ss::sheet_pane_t::bottom_right, // 0
+ ss::sheet_pane_t::top_right, // 1
+ ss::sheet_pane_t::bottom_left, // 2
+ ss::sheet_pane_t::top_left, // 3
+ };
+
+ if (v < 0 || size_t(v) >= mapping.size())
+ return ss::sheet_pane_t::unspecified;
+
+ return mapping[v];
+}
+
+}
+
+void xls_xml_context::characters(std::string_view str, bool /*transient*/)
+{
+ if (str.empty())
+ return;
+
+ xml_token_pair_t ce = get_current_element();
+
+ if (ce.first == NS_xls_xml_x)
+ {
+ switch (ce.second)
+ {
+ case XML_Number:
+ // sheet pane position.
+ // 3 | 1
+ //---+---
+ // 2 | 0
+ m_cursor_selection.pane = to_sheet_pane(to_long(str));
+ break;
+ case XML_ActiveCol:
+ m_cursor_selection.col = to_long(str);
+ break;
+ case XML_ActiveRow:
+ m_cursor_selection.row = to_long(str);
+ break;
+ case XML_ActivePane:
+ m_split_pane.active_pane = to_sheet_pane(to_long(str));
+ break;
+ case XML_SplitHorizontal:
+ m_split_pane.split_horizontal = to_double(str);
+ break;
+ case XML_SplitVertical:
+ m_split_pane.split_vertical = to_double(str);
+ break;
+ case XML_TopRowBottomPane:
+ m_split_pane.top_row_bottom_pane = to_long(str);
+ break;
+ case XML_LeftColumnRightPane:
+ m_split_pane.left_col_right_pane = to_long(str);
+ break;
+ case XML_RangeSelection:
+ {
+ ss::iface::import_reference_resolver* resolver =
+ mp_factory->get_reference_resolver(ss::formula_ref_context_t::global);
+
+ if (resolver)
+ m_cursor_selection.range = to_rc_range(resolver->resolve_range(str));
+
+ break;
+ }
+ default:
+ ;
+ }
+ }
+}
+
+void xls_xml_context::start_element_borders(const xml_token_attrs_t& /*attrs*/)
+{
+ m_current_style->borders.clear();
+}
+
+void xls_xml_context::start_element_border(const xml_token_attrs_t& attrs)
+{
+ ss::border_direction_t dir = ss::border_direction_t::unknown;
+ ss::border_style_t style = ss::border_style_t::unknown;
+ std::optional<ss::color_rgb_t> color;
+ long weight = 0;
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.ns != NS_xls_xml_ss)
+ continue;
+
+ switch (attr.name)
+ {
+ case XML_Position:
+ {
+ dir = border_dir::get().find(attr.value);
+ break;
+ }
+ case XML_LineStyle:
+ {
+ style = border_style::get().find(attr.value);
+ break;
+ }
+ case XML_Weight:
+ {
+ weight = to_long(attr.value);
+ break;
+ }
+ case XML_Color:
+ {
+ color = to_rgb(attr.value);
+ break;
+ }
+ default:
+ ;
+ }
+ }
+
+ if (dir == ss::border_direction_t::unknown || style == ss::border_style_t::unknown)
+ return;
+
+ m_current_style->borders.emplace_back();
+ border_style_type& bs = m_current_style->borders.back();
+ bs.dir = dir;
+ bs.style = style;
+ bs.color = color;
+
+ switch (bs.style)
+ {
+ case ss::border_style_t::solid:
+ {
+ switch (weight)
+ {
+ case 0:
+ bs.style = ss::border_style_t::hair;
+ break;
+ case 1:
+ bs.style = ss::border_style_t::thin;
+ break;
+ case 2:
+ bs.style = ss::border_style_t::medium;
+ break;
+ case 3:
+ bs.style = ss::border_style_t::thick;
+ break;
+ default:
+ ;
+ }
+ break;
+ }
+ case ss::border_style_t::dashed:
+ if (weight > 1)
+ bs.style = ss::border_style_t::medium_dashed;
+ break;
+ case ss::border_style_t::dash_dot:
+ if (weight > 1)
+ bs.style = ss::border_style_t::medium_dash_dot;
+ break;
+ case ss::border_style_t::dash_dot_dot:
+ if (weight > 1)
+ bs.style = ss::border_style_t::medium_dash_dot_dot;
+ break;
+ default:
+ ;
+ }
+}
+
+void xls_xml_context::start_element_number_format(const xml_token_attrs_t& attrs)
+{
+ m_current_style->number_format = std::string_view{};
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.ns != NS_xls_xml_ss)
+ continue;
+
+ switch (attr.name)
+ {
+ case XML_Format:
+ {
+ std::string_view code = num_format::get().find(attr.value);
+ m_current_style->number_format = code.empty() ? intern(attr) : code;
+ break;
+ }
+ default:
+ ;
+ }
+ }
+}
+
+void xls_xml_context::start_element_cell(const xml_token_attrs_t& attrs)
+{
+ long col_index = 0;
+ std::string_view formula;
+ m_cur_cell_style_id = std::string_view{};
+
+ m_cur_merge_across = 0; // extra column(s) that are part of the merged cell.
+ m_cur_merge_down = 0; // extra row(s) that are part of the merged cell.
+
+ m_cur_array_range.first.column = -1;
+ m_cur_array_range.first.row = -1;
+ m_cur_array_range.last = m_cur_array_range.first;
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.value.empty())
+ return;
+
+ if (attr.ns != NS_xls_xml_ss)
+ return;
+
+ switch (attr.name)
+ {
+ case XML_Index:
+ col_index = to_long(attr.value);
+ break;
+ case XML_Formula:
+ if (attr.value[0] == '=' && attr.value.size() > 1)
+ {
+ std::string_view s{attr.value.data()+1, attr.value.size()-1};
+ formula = s;
+ if (attr.transient)
+ formula = intern(s);
+ }
+ break;
+ case XML_MergeAcross:
+ m_cur_merge_across = to_long(attr.value);
+ break;
+ case XML_MergeDown:
+ m_cur_merge_down = to_long(attr.value);
+ break;
+ case XML_StyleID:
+ m_cur_cell_style_id = intern(attr);
+ break;
+ case XML_ArrayRange:
+ {
+ ss::iface::import_reference_resolver* resolver =
+ mp_factory->get_reference_resolver(ss::formula_ref_context_t::global);
+ if (resolver)
+ m_cur_array_range = to_rc_range(resolver->resolve_range(attr.value));
+
+ break;
+ }
+ default:
+ ;
+ }
+ }
+
+ if (!formula.empty())
+ m_cur_cell_formula = formula;
+
+ if (col_index > 0)
+ {
+ // 1-based column index. Convert it to a 0-based one.
+ m_cur_col = m_table_props.pos.column + col_index - 1;
+ }
+}
+
+void xls_xml_context::start_element_column(const xml_token_attrs_t& attrs)
+{
+ if (!mp_sheet_props && !mp_cur_sheet)
+ return;
+
+ ss::col_t col_index = m_cur_prop_col;
+ ss::col_t span = 0;
+ double width = 0.0;
+ bool hidden = false;
+ std::optional<std::string_view> style_id;
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.value.empty())
+ continue;
+
+ if (attr.ns != NS_xls_xml_ss)
+ continue;
+
+ switch (attr.name)
+ {
+ case XML_Index:
+ {
+ // Convert from 1-based to 0-based.
+ const char* p_end = nullptr;
+ long v = to_long(attr.value, &p_end);
+ if (attr.value.data() < p_end)
+ col_index = m_table_props.pos.column + v - 1;
+ break;
+ }
+ case XML_Width:
+ width = to_double(attr.value);
+ break;
+ case XML_Span:
+ // Span is the number of extra columns after the first one i.e.
+ // if the span is 1, the properties get applied to two
+ // consecutive columns. Not very intuitive, but this is how it
+ // appears to work.
+ span = to_long(attr.value);
+ break;
+ case XML_Hidden:
+ hidden = to_long(attr.value) != 0;
+ break;
+ case XML_StyleID:
+ style_id = attr.value; // no need to intern since it gets used in the same function scope
+ break;
+ }
+ }
+
+ if (mp_sheet_props)
+ {
+ // Column widths are stored as points.
+ mp_sheet_props->set_column_width(col_index, span + 1, width, orcus::length_unit_t::point);
+ mp_sheet_props->set_column_hidden(col_index, span + 1, hidden);
+ }
+
+ if (mp_cur_sheet && style_id)
+ {
+ auto it = m_style_map_cell.find(*style_id);
+ if (it != m_style_map_cell.end())
+ {
+ std::size_t xfid = it->second;
+ mp_cur_sheet->set_column_format(col_index, span + 1, xfid);
+ }
+ else
+ {
+ std::ostringstream os;
+ os << "xfid for the style ID of '" << *style_id << "' not found in the cache";
+ warn(os.str());
+ }
+ }
+
+ m_cur_prop_col = col_index + span + 1;
+}
+
+void xls_xml_context::start_element_row(const xml_token_attrs_t& attrs)
+{
+ m_cur_col = m_table_props.pos.column;
+ ss::row_t row_index = -1;
+ bool has_height = false;
+ bool hidden = false;
+ double height = 0.0;
+ std::optional<std::string_view> style_id;
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.value.empty())
+ return;
+
+ if (attr.ns == NS_xls_xml_ss)
+ {
+ switch (attr.name)
+ {
+ case XML_Index:
+ row_index = to_long(attr.value);
+ break;
+ case XML_Height:
+ has_height = true;
+ height = to_double(attr.value);
+ break;
+ case XML_Hidden:
+ hidden = to_long(attr.value) != 0;
+ break;
+ case XML_StyleID:
+ style_id = attr.value; // no need to intern since it gets used in the same function scope
+ break;
+ }
+ }
+ }
+
+ if (row_index > 0)
+ {
+ // 1-based row index. Convert it to a 0-based one.
+ m_cur_row = row_index - 1;
+ }
+
+ if (mp_cur_sheet && style_id)
+ {
+ auto it = m_style_map_cell.find(*style_id);
+ if (it != m_style_map_cell.end())
+ {
+ std::size_t xfid = it->second;
+ mp_cur_sheet->set_row_format(m_cur_row, xfid);
+ }
+ else
+ {
+ std::ostringstream os;
+ os << "xfid for the style ID of '" << *style_id << "' not found in the cache";
+ warn(os.str());
+ }
+ }
+
+ if (mp_sheet_props)
+ {
+ if (has_height)
+ mp_sheet_props->set_row_height(m_cur_row, height, length_unit_t::point);
+
+ if (hidden)
+ mp_sheet_props->set_row_hidden(m_cur_row, true);
+ }
+}
+
+void xls_xml_context::start_element_table(const xml_token_attrs_t& attrs)
+{
+ ss::row_t row_index = -1;
+ ss::col_t col_index = -1;
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.value.empty())
+ return;
+
+ if (attr.ns == NS_xls_xml_ss)
+ {
+ switch (attr.name)
+ {
+ case XML_TopCell:
+ col_index = to_long(attr.value);
+ break;
+ case XML_LeftCell:
+ row_index = to_long(attr.value);
+ break;
+ default:
+ ;
+ }
+ }
+ }
+
+ // Convert 1-based indices to 0-based.
+
+ if (row_index > 0)
+ m_table_props.pos.row = row_index - 1;
+
+ if (col_index > 0)
+ m_table_props.pos.column = col_index - 1;
+
+ m_cur_row = m_table_props.pos.row;
+ m_cur_prop_col = m_table_props.pos.column;
+}
+
+void xls_xml_context::start_element_worksheet(const xml_token_attrs_t& attrs)
+{
+ ++m_cur_sheet;
+ std::string_view sheet_name;
+ m_cell_formulas.emplace_back();
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.ns == NS_xls_xml_ss)
+ {
+ switch (attr.name)
+ {
+ case XML_Name:
+ sheet_name = attr.value;
+ break;
+ default:
+ ;
+ }
+ }
+ }
+
+ mp_cur_sheet = mp_factory->append_sheet(m_cur_sheet, sheet_name);
+ ss::iface::import_named_expression* sheet_named_exp = nullptr;
+ if (mp_cur_sheet)
+ {
+ mp_sheet_props = mp_cur_sheet->get_sheet_properties();
+ sheet_named_exp = mp_cur_sheet->get_named_expression();
+ }
+
+ m_sheet_named_exps.push_back(sheet_named_exp);
+
+ m_cur_row = 0;
+ m_cur_col = 0;
+
+ if (get_config().debug)
+ std::cout << "worksheet: name: '" << sheet_name << "'" << std::endl;
+}
+
+void xls_xml_context::end_element_borders()
+{
+}
+
+void xls_xml_context::end_element_border()
+{
+}
+
+void xls_xml_context::end_element_number_format()
+{
+}
+
+void xls_xml_context::end_element_cell()
+{
+ if (mp_sheet_props && (m_cur_merge_across > 0 || m_cur_merge_down > 0))
+ {
+ ss::range_t merge_range;
+ merge_range.first.column = m_cur_col;
+ merge_range.first.row = m_cur_row;
+ merge_range.last.column = m_cur_col + m_cur_merge_across;
+ merge_range.last.row = m_cur_row + m_cur_merge_down;
+
+ mp_sheet_props->set_merge_cell_range(merge_range);
+ }
+
+ if (mp_cur_sheet && !m_cur_cell_style_id.empty())
+ {
+ auto it = m_style_map_cell.find(m_cur_cell_style_id);
+ if (it != m_style_map_cell.end())
+ {
+ auto xf_id = it->second;
+ mp_cur_sheet->set_format(m_cur_row, m_cur_col, xf_id);
+ }
+ }
+
+ if (mp_cur_sheet && !m_cur_cell_formula.empty())
+ {
+ // Likely a Cell element without a child Data element.
+ store_cell_formula(m_cur_cell_formula, formula_result());
+ }
+
+ m_cur_cell_formula = std::string_view{};
+
+ ++m_cur_col;
+ if (m_cur_merge_across > 0)
+ m_cur_col += m_cur_merge_across;
+}
+
+void xls_xml_context::end_element_column()
+{
+}
+
+void xls_xml_context::end_element_row()
+{
+ ++m_cur_row;
+}
+
+void xls_xml_context::end_element_table()
+{
+ push_all_array_formulas();
+ m_array_formulas.clear();
+ m_table_props.reset();
+ m_cur_row = 0;
+ m_cur_prop_col = 0;
+}
+
+void xls_xml_context::end_element_worksheet()
+{
+ mp_cur_sheet = nullptr;
+}
+
+void xls_xml_context::end_element_workbook()
+{
+ if (!mp_factory)
+ return;
+
+ ss::iface::import_named_expression* ne_global = mp_factory->get_named_expression();
+ if (ne_global)
+ {
+ // global scope named expressions.
+
+ for (const named_exp& ne : m_named_exps_global)
+ {
+ ne_global->set_named_expression(ne.name, ne.expression);
+ ne_global->commit();
+ }
+ }
+
+ // sheet-local named expressions follow.
+
+ for (const named_exp& ne : m_named_exps_sheet)
+ {
+ ss::iface::import_named_expression* p = nullptr;
+ if (ne.scope >= 0 && size_t(ne.scope) < m_sheet_named_exps.size())
+ p = m_sheet_named_exps[ne.scope]; // it may be nullptr.
+
+ if (p)
+ {
+ p->set_named_expression(ne.name, ne.expression);
+ p->commit();
+ }
+ }
+
+ // push all cell formulas
+ for (size_t sheet_pos = 0; sheet_pos < m_cell_formulas.size(); ++sheet_pos)
+ {
+ ss::iface::import_sheet* sheet = mp_factory->get_sheet(sheet_pos);
+ if (!sheet)
+ continue;
+
+ ss::iface::import_formula* xformula = sheet->get_formula();
+ if (!xformula)
+ continue;
+
+ const std::deque<cell_formula_type>& store = m_cell_formulas[sheet_pos];
+ for (const cell_formula_type& cf : store)
+ {
+ xformula->set_position(cf.pos.row, cf.pos.column);
+ xformula->set_formula(ss::formula_grammar_t::xls_xml, cf.formula);
+
+ switch (cf.result.type)
+ {
+ case formula_result::result_type::numeric:
+ xformula->set_result_value(cf.result.value_numeric);
+ break;
+ case formula_result::result_type::string:
+ case formula_result::result_type::boolean:
+ case formula_result::result_type::empty:
+ ;
+ }
+
+ xformula->commit();
+ }
+ }
+}
+
+void xls_xml_context::end_element_styles()
+{
+ commit_default_style(); // Commit the default style first.
+ commit_styles();
+}
+
+void xls_xml_context::end_element_pane()
+{
+ ss::iface::import_sheet_view* sv = mp_cur_sheet->get_sheet_view();
+ if (!sv)
+ return;
+
+ if (m_cursor_selection.pane == ss::sheet_pane_t::unspecified)
+ return;
+
+ if (m_cursor_selection.valid_range())
+ {
+ sv->set_selected_range(m_cursor_selection.pane, m_cursor_selection.range);
+ }
+ else if (m_cursor_selection.valid_cursor())
+ {
+ ss::range_t sel;
+ sel.first.column = m_cursor_selection.col;
+ sel.first.row = m_cursor_selection.row;
+ sel.last = sel.first;
+
+ sv->set_selected_range(m_cursor_selection.pane, sel);
+ }
+}
+
+void xls_xml_context::end_element_worksheet_options()
+{
+ commit_split_pane();
+}
+
+void xls_xml_context::commit_split_pane()
+{
+ ss::iface::import_sheet_view* sv = mp_cur_sheet->get_sheet_view();
+ if (!sv)
+ return;
+
+ if (!m_split_pane.split())
+ return;
+
+ switch (m_split_pane.pane_state)
+ {
+ case ss::pane_state_t::split:
+ {
+ ss::address_t top_left_cell = m_split_pane.get_top_left_cell();
+
+ // NB: The term "split vertical" in Excel 2003 XML refers to the
+ // vertical split bar position which in this case corresponds with
+ // the "horizontal split" position of the set_split_pane() call,
+ // and vice versa.
+ sv->set_split_pane(
+ m_split_pane.split_vertical, m_split_pane.split_horizontal,
+ top_left_cell, m_split_pane.active_pane);
+ break;
+ }
+ case ss::pane_state_t::frozen:
+ {
+ ss::address_t top_left_cell = m_split_pane.get_top_left_cell();
+
+ // NB: Note for the split pane above also applies here.
+ ss::col_t visible_cols = m_split_pane.split_vertical;
+ ss::row_t visible_rows = m_split_pane.split_horizontal;
+
+ sv->set_frozen_pane(
+ visible_cols, visible_rows,
+ top_left_cell, m_split_pane.active_pane);
+ break;
+ }
+ case ss::pane_state_t::frozen_split:
+ // not handled yet.
+ break;
+ case ss::pane_state_t::unspecified:
+ default:
+ ;
+ }
+
+ m_split_pane.reset();
+}
+
+void xls_xml_context::commit_default_style()
+{
+ ss::iface::import_styles* styles = mp_factory->get_styles();
+ if (!styles)
+ return;
+
+ ss::iface::import_font_style* font_style = styles->start_font_style();
+ ENSURE_INTERFACE(font_style, import_font_style);
+
+ if (m_default_style)
+ {
+ const auto& font = m_default_style->font;
+
+ if (!font.name.empty())
+ font_style->set_name(font.name);
+
+ if (font.size)
+ font_style->set_size(*font.size);
+
+ if (font.underline)
+ font_style->set_underline(*font.underline);
+
+ font_style->set_bold(font.bold);
+ font_style->set_italic(font.italic);
+ font_style->set_color(255, font.color.red, font.color.green, font.color.blue);
+ }
+
+ std::size_t id = font_style->commit();
+ assert(id == 0);
+
+ ss::iface::import_fill_style* fill_style = styles->start_fill_style();
+ ENSURE_INTERFACE(fill_style, import_fill_style);
+
+ if (m_default_style)
+ {
+ if (m_default_style->fill.solid)
+ fill_style->set_pattern_type(ss::fill_pattern_t::solid);
+
+ fill_style->set_fg_color(
+ 255,
+ m_default_style->fill.color.red,
+ m_default_style->fill.color.green,
+ m_default_style->fill.color.blue
+ );
+ }
+
+ id = fill_style->commit();
+ assert(id == 0);
+
+ auto* border_style = styles->start_border_style();
+ ENSURE_INTERFACE(border_style, import_border_style);
+
+ if (m_default_style && !m_default_style->borders.empty())
+ {
+ for (const border_style_type& b : m_default_style->borders)
+ {
+ if (b.dir == ss::border_direction_t::unknown)
+ continue;
+
+ if (b.style != ss::border_style_t::unknown)
+ border_style->set_style(b.dir, b.style);
+
+ if (b.color)
+ border_style->set_color(b.dir, 255, b.color->red, b.color->green, b.color->blue);
+ }
+ }
+
+ id = border_style->commit();
+ assert(id == 0);
+
+ auto* cell_protection = styles->start_cell_protection();
+ ENSURE_INTERFACE(cell_protection, import_cell_protection);
+
+ if (m_default_style)
+ {
+ const auto& cp = m_default_style->cell_protection;
+ cell_protection->set_locked(cp.locked);
+ cell_protection->set_formula_hidden(cp.hide_formula);
+ }
+
+ id = cell_protection->commit();
+ assert(id == 0);
+
+ auto* number_format = styles->start_number_format();
+ ENSURE_INTERFACE(number_format, import_number_format);
+
+ if (m_default_style)
+ number_format->set_code(m_default_style->number_format);
+
+ id = number_format->commit();
+ assert(id == 0);
+
+ auto* xf = styles->start_xf(ss::xf_category_t::cell);
+ ENSURE_INTERFACE(xf, import_xf);
+
+ auto set_default_style = [this](ss::iface::import_xf* ixf)
+ {
+ bool apply_alignment =
+ m_default_style->text_alignment.hor != ss::hor_alignment_t::unknown ||
+ m_default_style->text_alignment.ver != ss::ver_alignment_t::unknown ||
+ m_default_style->text_alignment.wrap_text || m_default_style->text_alignment.shrink_to_fit;
+
+ ixf->set_apply_alignment(apply_alignment);
+ ixf->set_horizontal_alignment(m_default_style->text_alignment.hor);
+ ixf->set_vertical_alignment(m_default_style->text_alignment.ver);
+ ixf->set_wrap_text(m_default_style->text_alignment.wrap_text);
+ ixf->set_shrink_to_fit(m_default_style->text_alignment.shrink_to_fit);
+ };
+
+ if (m_default_style)
+ set_default_style(xf);
+
+ id = xf->commit();
+ assert(id == 0);
+
+ xf = styles->start_xf(ss::xf_category_t::cell_style);
+ ENSURE_INTERFACE(xf, import_xf);
+
+ if (m_default_style && m_default_style->name == "Normal")
+ set_default_style(xf);
+
+ id = xf->commit();
+ assert(id == 0);
+
+ auto* cell_style = styles->start_cell_style();
+ ENSURE_INTERFACE(cell_style, import_cell_style);
+
+ if (m_default_style && m_default_style->name == "Normal")
+ {
+ if (!m_default_style->name.empty())
+ cell_style->set_name(m_default_style->name);
+ }
+
+ cell_style->commit();
+}
+
+void xls_xml_context::commit_styles()
+{
+ if (m_styles.empty())
+ return;
+
+ ss::iface::import_styles* styles = mp_factory->get_styles();
+ if (!styles)
+ return;
+
+ // Build a map of cell style textural ID's to cell format (xf) numeric ID's.
+
+ for (const std::unique_ptr<style_type>& style : m_styles)
+ {
+ auto category = style->name.empty() ? ss::xf_category_t::cell : ss::xf_category_t::cell_style;
+
+ auto* xf = styles->start_xf(category);
+ ENSURE_INTERFACE(xf, import_xf);
+
+ if (!style->parent_id.empty())
+ {
+ auto it = m_style_map_named_style.find(style->parent_id);
+ if (it == m_style_map_named_style.end())
+ {
+ std::ostringstream os;
+ os << "style '" << style->id << "' inherits from a parent style of '" << style->parent_id << "' but no record for the parent style exists";
+ warn(os.str());
+ }
+ else
+ xf->set_style_xf(it->second);
+ }
+
+ auto* font_style = styles->start_font_style();
+ ENSURE_INTERFACE(font_style, import_font_style);
+
+ if (!style->font.name.empty())
+ font_style->set_name(style->font.name);
+
+ if (style->font.size)
+ font_style->set_size(*style->font.size);
+
+ if (style->font.underline)
+ font_style->set_underline(*style->font.underline);
+
+ font_style->set_bold(style->font.bold);
+ font_style->set_italic(style->font.italic);
+ font_style->set_color(255,
+ style->font.color.red,
+ style->font.color.green,
+ style->font.color.blue);
+
+ size_t font_id = font_style->commit();
+
+ xf->set_font(font_id);
+
+ auto* fill_style = styles->start_fill_style();
+ ENSURE_INTERFACE(fill_style, import_fill_style);
+
+ if (style->fill.solid)
+ {
+ // TODO : add support for fill types other than 'solid'.
+ fill_style->set_pattern_type(ss::fill_pattern_t::solid);
+ fill_style->set_fg_color(255,
+ style->fill.color.red,
+ style->fill.color.green,
+ style->fill.color.blue);
+
+ size_t fill_id = fill_style->commit();
+ xf->set_fill(fill_id);
+ }
+
+ auto* protect = styles->start_cell_protection();
+ ENSURE_INTERFACE(protect, import_cell_protection);
+
+ protect->set_locked(style->cell_protection.locked);
+ protect->set_formula_hidden(style->cell_protection.hide_formula);
+
+ std::size_t protect_id = protect->commit();
+ xf->set_protection(protect_id);
+
+ if (!style->borders.empty())
+ {
+ styles->set_border_count(style->borders.size());
+
+ auto* border_style = styles->start_border_style();
+ ENSURE_INTERFACE(border_style, import_border_style);
+
+ for (const border_style_type& b : style->borders)
+ {
+ if (b.dir == ss::border_direction_t::unknown)
+ continue;
+
+ if (b.style != ss::border_style_t::unknown)
+ border_style->set_style(b.dir, b.style);
+
+ if (b.color)
+ border_style->set_color(b.dir, 255, b.color->red, b.color->green, b.color->blue);
+ }
+
+ size_t border_id = border_style->commit();
+ xf->set_border(border_id);
+ }
+
+ bool apply_alignment =
+ style->text_alignment.hor != ss::hor_alignment_t::unknown ||
+ style->text_alignment.ver != ss::ver_alignment_t::unknown ||
+ style->text_alignment.wrap_text || style->text_alignment.shrink_to_fit;
+
+ xf->set_apply_alignment(apply_alignment);
+ xf->set_horizontal_alignment(style->text_alignment.hor);
+ xf->set_vertical_alignment(style->text_alignment.ver);
+ xf->set_wrap_text(style->text_alignment.wrap_text);
+ xf->set_shrink_to_fit(style->text_alignment.shrink_to_fit);
+
+ if (!style->number_format.empty())
+ {
+ auto* number_format = styles->start_number_format();
+ ENSURE_INTERFACE(number_format, import_number_format);
+ number_format->set_code(style->number_format);
+ size_t number_format_id = number_format->commit();
+ xf->set_number_format(number_format_id);
+ }
+
+ // TODO : handle text indent level.
+
+ std::size_t xfid = xf->commit();
+
+ switch (category)
+ {
+ case ss::xf_category_t::cell:
+ {
+ m_style_map_cell.insert({style->id, xfid});
+ break;
+ }
+ case ss::xf_category_t::cell_style:
+ {
+ m_style_map_named_style.insert({style->id, xfid});
+
+ // Push the named cell style record.
+ auto* cell_style = styles->start_cell_style();
+ ENSURE_INTERFACE(cell_style, import_cell_style);
+ cell_style->set_name(style->name);
+ cell_style->set_xf(xfid);
+ cell_style->commit();
+
+ // Since we don't allow directly referencing a named cell style,
+ // we will create a regular cell style that references the named
+ // style instead.
+ auto* xf_cell = styles->start_xf(ss::xf_category_t::cell);
+ ENSURE_INTERFACE(xf_cell, import_xf);
+ xf_cell->set_style_xf(xfid); // reference the named style
+ xfid = xf_cell->commit();
+ m_style_map_cell.insert({style->id, xfid});
+ break;
+ }
+ case ss::xf_category_t::differential:
+ {
+ std::ostringstream os;
+ os << "differential cell format type is not supported";
+ warn(os.str());
+ break;
+ }
+ case ss::xf_category_t::unknown:
+ {
+ std::ostringstream os;
+ os << "cell format type is unknown";
+ warn(os.str());
+ break;
+ }
+ }
+ }
+}
+
+void xls_xml_context::push_all_array_formulas()
+{
+ if (!mp_cur_sheet)
+ return;
+
+ ss::iface::import_array_formula* array = mp_cur_sheet->get_array_formula();
+ if (!array)
+ return;
+
+ for (const array_formula_pair_type& pair : m_array_formulas)
+ {
+ const array_formula_type& af = *pair.second;
+ push_array_formula(
+ array, pair.first, af.formula, ss::formula_grammar_t::xls_xml, af.results);
+ }
+}
+
+ss::iface::import_factory* xls_xml_context::get_import_factory()
+{
+ return mp_factory;
+}
+
+ss::iface::import_sheet* xls_xml_context::get_import_sheet()
+{
+ return mp_cur_sheet;
+}
+
+ss::address_t xls_xml_context::get_current_pos() const
+{
+ ss::address_t pos;
+ pos.row = m_cur_row;
+ pos.column = m_cur_col;
+ return pos;
+}
+
+std::string_view xls_xml_context::pop_and_clear_formula()
+{
+ std::string_view f = m_cur_cell_formula;
+ m_cur_cell_formula = std::string_view{};
+ return f;
+}
+
+bool xls_xml_context::is_array_formula() const
+{
+ if (m_cur_array_range.first.column < 0 || m_cur_array_range.first.row < 0)
+ return false;
+
+ if (m_cur_array_range.last.column < 0 || m_cur_array_range.last.row < 0)
+ return false;
+
+ if (m_cur_array_range.first.column > m_cur_array_range.last.column ||
+ m_cur_array_range.first.row > m_cur_array_range.last.row)
+ return false;
+
+ return true;
+}
+
+const ss::range_t& xls_xml_context::get_array_range() const
+{
+ return m_cur_array_range;
+}
+
+xls_xml_context::array_formulas_type& xls_xml_context::get_array_formula_store()
+{
+ return m_array_formulas;
+}
+
+void xls_xml_context::store_cell_formula(std::string_view formula, const formula_result& res)
+{
+ assert(m_cur_sheet < ss::sheet_t(m_cell_formulas.size()));
+
+ cell_formula_type cf;
+ cf.pos = get_current_pos();
+ cf.formula = formula;
+ cf.result = res;
+ std::deque<cell_formula_type>& store = m_cell_formulas[m_cur_sheet];
+ store.push_back(std::move(cf));
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xls_xml_context.hpp b/src/liborcus/xls_xml_context.hpp
new file mode 100644
index 0000000..24cb803
--- /dev/null
+++ b/src/liborcus/xls_xml_context.hpp
@@ -0,0 +1,334 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_XLS_XML_CONTEXT_HPP
+#define INCLUDED_ORCUS_XLS_XML_CONTEXT_HPP
+
+#include "xml_context_base.hpp"
+#include "orcus/spreadsheet/types.hpp"
+#include "orcus/spreadsheet/view_types.hpp"
+#include "orcus/string_pool.hpp"
+
+#include "formula_result.hpp"
+
+#include <string>
+#include <unordered_map>
+#include <list>
+#include <deque>
+#include <optional>
+
+namespace orcus {
+
+namespace spreadsheet { namespace iface {
+
+class import_factory;
+class import_sheet;
+class import_sheet_properties;
+class import_named_expression;
+class import_array_formula;
+
+}}
+
+class xls_xml_context;
+
+/**
+ * Context for handling <Data> element scopes.
+ */
+class xls_xml_data_context : public xml_context_base
+{
+ struct format_type
+ {
+ std::optional<bool> bold;
+ std::optional<bool> italic;
+ std::optional<bool> underline;
+ std::optional<bool> strikethrough;
+ std::optional<bool> subscript;
+ std::optional<bool> superscript;
+
+ std::optional<std::string_view> font_face;
+ std::optional<double> font_size;
+ std::optional<spreadsheet::color_rgb_t> color;
+
+ void merge(const format_type& other);
+ bool formatted() const;
+ };
+
+ struct string_segment_type
+ {
+ std::string_view str;
+ format_type format;
+ bool formatted = false;
+
+ string_segment_type(std::string_view _str);
+ };
+
+ enum cell_type { ct_unknown = 0, ct_string, ct_number, ct_datetime };
+
+ xls_xml_context& m_parent_cxt;
+
+ cell_type m_cell_type;
+ std::vector<string_segment_type> m_cell_string;
+ std::vector<format_type> m_format_stack;
+
+ format_type m_current_format;
+
+ double m_cell_value;
+ date_time_t m_cell_datetime;
+
+public:
+ xls_xml_data_context(session_context& session_cxt, const tokens& tokens, xls_xml_context& parent_cxt);
+ virtual ~xls_xml_data_context() override;
+
+ virtual xml_context_base* create_child_context(xmlns_id_t ns, xml_token_t name) override;
+ virtual void end_child_context(xmlns_id_t ns, xml_token_t name, xml_context_base* child) override;
+
+ virtual void start_element(xmlns_id_t ns, xml_token_t name, const::std::vector<xml_token_attr_t>& attrs) override;
+ virtual void characters(std::string_view str, bool transient) override;
+ virtual bool end_element(xmlns_id_t ns, xml_token_t name) override;
+
+ /**
+ * Intendted to be called from the parent context instance, to reset its
+ * internal state before its use.
+ */
+ void reset();
+
+private:
+
+ void start_element_data(const xml_token_pair_t& parent, const xml_token_attrs_t& attrs);
+ void end_element_data();
+
+ bool handle_array_formula_result();
+ void push_array_result(
+ range_formula_results& res, size_t row_offset, size_t col_offset);
+
+ void push_formula_cell(std::string_view formula);
+ void store_array_formula_parent_cell(std::string_view formula);
+ void update_current_format();
+};
+
+class xls_xml_context : public xml_context_base
+{
+ friend class xls_xml_data_context;
+
+ struct cell_formula_type
+ {
+ spreadsheet::address_t pos;
+ std::string_view formula;
+ formula_result result;
+ };
+
+ struct array_formula_type
+ {
+ std::string_view formula;
+ range_formula_results results;
+
+ array_formula_type(const spreadsheet::range_t& _range, std::string_view _formula);
+ };
+
+ struct border_style_type
+ {
+ spreadsheet::border_direction_t dir = spreadsheet::border_direction_t::unknown;
+ spreadsheet::border_style_t style = spreadsheet::border_style_t::unknown;
+ std::optional<spreadsheet::color_rgb_t> color;
+ };
+
+ struct font_style_type
+ {
+ std::string_view name;
+ std::string_view family;
+ std::optional<double> size;
+ std::optional<spreadsheet::underline_t> underline;
+ bool bold = false;
+ bool italic = false;
+
+ spreadsheet::color_rgb_t color;
+ };
+
+ /**
+ * TODO: we only support solid fill for now. More fill types to be added
+ * later.
+ */
+ struct fill_style_type
+ {
+ bool solid = false;
+ spreadsheet::color_rgb_t color;
+ };
+
+ struct text_alignment_type
+ {
+ spreadsheet::hor_alignment_t hor = spreadsheet::hor_alignment_t::unknown;
+ spreadsheet::ver_alignment_t ver = spreadsheet::ver_alignment_t::unknown;
+ int8_t indent = 0;
+ bool wrap_text = false;
+ bool shrink_to_fit = false;
+ };
+
+ struct cell_protection_type
+ {
+ bool locked = true; // NB: default is locked
+ bool hide_formula = false;
+ };
+
+ struct style_type
+ {
+ std::string_view id;
+ std::string_view parent_id;
+ std::string_view name;
+
+ font_style_type font;
+ fill_style_type fill;
+ text_alignment_type text_alignment;
+ cell_protection_type cell_protection;
+ std::string_view number_format;
+ std::vector<border_style_type> borders;
+ };
+
+ struct named_exp
+ {
+ std::string_view name;
+ std::string_view expression;
+ spreadsheet::sheet_t scope;
+
+ named_exp(std::string_view _name, std::string_view _expression, spreadsheet::sheet_t _scope);
+ };
+
+ struct selection
+ {
+ spreadsheet::sheet_pane_t pane;
+ spreadsheet::col_t col;
+ spreadsheet::row_t row;
+ spreadsheet::range_t range;
+
+ selection();
+ void reset();
+ bool valid_cursor() const;
+ bool valid_range() const;
+ };
+
+ struct split_pane
+ {
+ spreadsheet::pane_state_t pane_state;
+ spreadsheet::sheet_pane_t active_pane;
+ double split_horizontal;
+ double split_vertical;
+ spreadsheet::row_t top_row_bottom_pane;
+ spreadsheet::col_t left_col_right_pane;
+
+ split_pane();
+ void reset();
+ bool split() const;
+ spreadsheet::address_t get_top_left_cell() const;
+ };
+
+ struct table_properties
+ {
+ spreadsheet::address_t pos; // top-left position
+
+ table_properties();
+ void reset();
+ };
+
+ using named_expressions_type = std::vector<named_exp>;
+ using styles_type = std::vector<std::unique_ptr<style_type>>;
+ using style_id_xf_map_type = std::unordered_map<std::string_view, std::size_t>;
+ using array_formula_pair_type = std::pair<spreadsheet::range_t, std::unique_ptr<array_formula_type>>;
+ using array_formulas_type = std::list<array_formula_pair_type>;
+ using cell_formulas_type = std::deque<std::deque<cell_formula_type>>;
+
+public:
+ xls_xml_context(session_context& session_cxt, const tokens& tokens, spreadsheet::iface::import_factory* factory);
+ virtual ~xls_xml_context();
+
+ virtual void declaration(const xml_declaration_t& decl) override;
+
+ virtual xml_context_base* create_child_context(xmlns_id_t ns, xml_token_t name) override;
+ virtual void end_child_context(xmlns_id_t ns, xml_token_t name, xml_context_base* child) override;
+
+ virtual void start_element(xmlns_id_t ns, xml_token_t name, const xml_token_attrs_t& attrs) override;
+ virtual bool end_element(xmlns_id_t ns, xml_token_t name) override;
+ virtual void characters(std::string_view str, bool transient) override;
+
+private:
+
+ void start_element_borders(const xml_token_attrs_t& attrs);
+ void start_element_border(const xml_token_attrs_t& attrs);
+ void start_element_number_format(const xml_token_attrs_t& attrs);
+ void start_element_cell(const xml_token_attrs_t& attrs);
+ void start_element_column(const xml_token_attrs_t& attrs);
+ void start_element_row(const xml_token_attrs_t& attrs);
+ void start_element_table(const xml_token_attrs_t& attrs);
+ void start_element_worksheet(const xml_token_attrs_t& attrs);
+
+ void end_element_borders();
+ void end_element_border();
+ void end_element_number_format();
+ void end_element_cell();
+ void end_element_column();
+ void end_element_row();
+ void end_element_table();
+ void end_element_worksheet();
+ void end_element_workbook();
+ void end_element_styles();
+ void end_element_pane();
+ void end_element_worksheet_options();
+
+ void commit_split_pane();
+ void commit_default_style();
+ void commit_styles();
+
+ void push_all_array_formulas();
+
+private:
+ spreadsheet::iface::import_factory* get_import_factory();
+ spreadsheet::iface::import_sheet* get_import_sheet();
+ spreadsheet::address_t get_current_pos() const;
+ std::string_view pop_and_clear_formula();
+ bool is_array_formula() const;
+ const spreadsheet::range_t& get_array_range() const;
+ array_formulas_type& get_array_formula_store();
+
+ void store_cell_formula(std::string_view formula, const formula_result& res);
+
+private:
+ spreadsheet::iface::import_factory* mp_factory;
+ spreadsheet::iface::import_sheet* mp_cur_sheet;
+ spreadsheet::iface::import_sheet_properties* mp_sheet_props;
+
+ std::vector<spreadsheet::iface::import_named_expression*> m_sheet_named_exps;
+
+ spreadsheet::sheet_t m_cur_sheet;
+ spreadsheet::row_t m_cur_row;
+ spreadsheet::col_t m_cur_col;
+ spreadsheet::col_t m_cur_prop_col; /// current column position for column properties.
+ spreadsheet::row_t m_cur_merge_down;
+ spreadsheet::col_t m_cur_merge_across;
+ spreadsheet::range_t m_cur_array_range;
+ std::string_view m_cur_cell_formula;
+ std::string_view m_cur_cell_style_id;
+
+ cell_formulas_type m_cell_formulas;
+ array_formulas_type m_array_formulas;
+ named_expressions_type m_named_exps_global;
+ named_expressions_type m_named_exps_sheet;
+ selection m_cursor_selection; /// cursor selection in a single pane.
+ split_pane m_split_pane;
+
+ std::unique_ptr<style_type> m_current_style;
+ std::unique_ptr<style_type> m_default_style;
+ styles_type m_styles;
+ table_properties m_table_props;
+
+ style_id_xf_map_type m_style_map_cell;
+ style_id_xf_map_type m_style_map_named_style;
+
+ xls_xml_data_context m_cc_data;
+};
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xls_xml_detection_handler.cpp b/src/liborcus/xls_xml_detection_handler.cpp
new file mode 100644
index 0000000..775cfb7
--- /dev/null
+++ b/src/liborcus/xls_xml_detection_handler.cpp
@@ -0,0 +1,113 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xls_xml_detection_handler.hpp"
+#include "xls_xml_token_constants.hpp"
+#include "xls_xml_namespace_types.hpp"
+#include "xml_context_base.hpp"
+#include "detection_result.hpp"
+
+namespace orcus {
+
+namespace {
+
+/**
+ * Try to parse the XML stream up to the 1st Worksheet element while
+ * checking its structure along the way. If the structure up to that element
+ * is correct, then we call it "detected".
+ */
+class xls_xml_detection_context : public xml_context_base
+{
+public:
+ xls_xml_detection_context(session_context& session_cxt, const tokens& tokens) :
+ xml_context_base(session_cxt, tokens) {}
+
+ virtual xml_context_base* create_child_context(xmlns_id_t, xml_token_t)
+ {
+ return nullptr;
+ }
+
+ virtual void start_element(xmlns_id_t ns, xml_token_t name, const::std::vector<xml_token_attr_t>& /*attrs*/)
+ {
+ xml_token_pair_t parent = push_stack(ns, name);
+ if (ns == NS_xls_xml_ss)
+ {
+ switch (name)
+ {
+ case XML_Workbook:
+ xml_element_expected(parent, XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN);
+ break;
+ case XML_Styles:
+ case XML_Worksheet:
+ {
+ xml_element_expected(parent, NS_xls_xml_ss, XML_Workbook);
+
+ // All good. Let's call it detected.
+ throw detection_result(true);
+ }
+ break;
+ case XML_Style:
+ xml_element_expected(parent, NS_xls_xml_ss, XML_Style);
+ break;
+ default:
+ ;
+ }
+ }
+ else if (ns == NS_xls_xml_o)
+ {
+ switch (name)
+ {
+ case XML_DocumentProperties:
+ case XML_OfficeDocumentSettings:
+ xml_element_expected(parent, NS_xls_xml_ss, XML_Workbook);
+ break;
+ default:
+ ;
+ }
+ }
+ else if (ns == NS_xls_xml_x)
+ {
+ switch (name)
+ {
+ case XML_ExcelWorkbook:
+ xml_element_expected(parent, NS_xls_xml_ss, XML_Workbook);
+ break;
+ default:
+ ;
+ }
+ }
+ }
+
+ virtual bool end_element(xmlns_id_t ns, xml_token_t name)
+ {
+ return pop_stack(ns, name);
+ }
+
+ virtual void characters(std::string_view, bool)
+ {
+ }
+
+ virtual void end_child_context(xmlns_id_t, xml_token_t, xml_context_base*)
+ {
+ }
+};
+
+}
+
+xls_xml_detection_handler::xls_xml_detection_handler(
+ session_context& session_cxt, const tokens& t) :
+ xml_stream_handler(session_cxt, t, std::make_unique<xls_xml_detection_context>(session_cxt, t))
+{
+}
+
+xls_xml_detection_handler::~xls_xml_detection_handler() {}
+
+void xls_xml_detection_handler::start_document() {}
+void xls_xml_detection_handler::end_document() {}
+
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xls_xml_detection_handler.hpp b/src/liborcus/xls_xml_detection_handler.hpp
new file mode 100644
index 0000000..e8fd57d
--- /dev/null
+++ b/src/liborcus/xls_xml_detection_handler.hpp
@@ -0,0 +1,31 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef ORCUS_XLS_XML_DETECTION_HANDLER_HPP
+#define ORCUS_XLS_XML_DETECTION_HANDLER_HPP
+
+#include "xml_stream_handler.hpp"
+
+namespace orcus {
+
+class tokens;
+struct session_context;
+
+class xls_xml_detection_handler : public xml_stream_handler
+{
+public:
+ xls_xml_detection_handler(session_context& session_cxt, const tokens& t);
+ virtual ~xls_xml_detection_handler();
+
+ virtual void start_document();
+ virtual void end_document();
+};
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xls_xml_handler.cpp b/src/liborcus/xls_xml_handler.cpp
new file mode 100644
index 0000000..5095b1e
--- /dev/null
+++ b/src/liborcus/xls_xml_handler.cpp
@@ -0,0 +1,22 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xls_xml_handler.hpp"
+#include "xls_xml_context.hpp"
+
+namespace orcus {
+
+xls_xml_handler::xls_xml_handler(
+ session_context& session_cxt, const tokens& t, spreadsheet::iface::import_factory* factory) :
+ xml_stream_handler(session_cxt, t, std::make_unique<xls_xml_context>(session_cxt, t, factory))
+{
+}
+
+xls_xml_handler::~xls_xml_handler() {}
+
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xls_xml_handler.hpp b/src/liborcus/xls_xml_handler.hpp
new file mode 100644
index 0000000..d9a454b
--- /dev/null
+++ b/src/liborcus/xls_xml_handler.hpp
@@ -0,0 +1,35 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef ORCUS_XLS_XML_HANDLER_HPP
+#define ORCUS_XLS_XML_HANDLER_HPP
+
+#include "xml_stream_handler.hpp"
+
+namespace orcus {
+
+namespace spreadsheet { namespace iface {
+
+class import_factory;
+
+}}
+
+class tokens;
+struct session_context;
+
+class xls_xml_handler : public xml_stream_handler
+{
+public:
+ xls_xml_handler(session_context& session_cxt, const tokens& t, spreadsheet::iface::import_factory* factory);
+ virtual ~xls_xml_handler() override;
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xls_xml_namespace_types.cpp b/src/liborcus/xls_xml_namespace_types.cpp
new file mode 100644
index 0000000..96ccf6d
--- /dev/null
+++ b/src/liborcus/xls_xml_namespace_types.cpp
@@ -0,0 +1,32 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xls_xml_namespace_types.hpp"
+
+namespace orcus {
+
+const xmlns_id_t NS_xls_xml_ss = "urn:schemas-microsoft-com:office:spreadsheet";
+const xmlns_id_t NS_xls_xml_o ="urn:schemas-microsoft-com:office:office";
+const xmlns_id_t NS_xls_xml_x ="urn:schemas-microsoft-com:office:excel";
+const xmlns_id_t NS_xls_xml_html ="http://www.w3.org/TR/REC-html40";
+
+namespace {
+
+xmlns_id_t xls_xml_ns[] = {
+ NS_xls_xml_ss,
+ NS_xls_xml_o,
+ NS_xls_xml_x,
+ NS_xls_xml_html,
+ nullptr
+};
+
+}
+
+const xmlns_id_t* NS_xls_xml_all = xls_xml_ns;
+
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xls_xml_namespace_types.hpp b/src/liborcus/xls_xml_namespace_types.hpp
new file mode 100644
index 0000000..37de5b0
--- /dev/null
+++ b/src/liborcus/xls_xml_namespace_types.hpp
@@ -0,0 +1,28 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef ORCUS_XLS_XML_NAMESPACE_TYPES_HPP
+#define ORCUS_XLS_XML_NAMESPACE_TYPES_HPP
+
+#include "orcus/types.hpp"
+
+namespace orcus {
+
+extern const xmlns_id_t NS_xls_xml_ss;
+extern const xmlns_id_t NS_xls_xml_o;
+extern const xmlns_id_t NS_xls_xml_x;
+extern const xmlns_id_t NS_xls_xml_html;
+
+/**
+ * Null-terminated array of all xls xml namespaces.
+ */
+extern const xmlns_id_t* NS_xls_xml_all;
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xls_xml_token_constants.hpp b/src/liborcus/xls_xml_token_constants.hpp
new file mode 100644
index 0000000..9aca315
--- /dev/null
+++ b/src/liborcus/xls_xml_token_constants.hpp
@@ -0,0 +1,20 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef ORCUS_XLS_XML_TOKEN_CONSTANTS_HPP
+#define ORCUS_XLS_XML_TOKEN_CONSTANTS_HPP
+
+#include "orcus/types.hpp"
+
+namespace orcus {
+
+#include "xls_xml_token_constants.inl"
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xls_xml_token_constants.inl b/src/liborcus/xls_xml_token_constants.inl
new file mode 100644
index 0000000..902e2d5
--- /dev/null
+++ b/src/liborcus/xls_xml_token_constants.inl
@@ -0,0 +1,992 @@
+// This file has been auto-generated. Do not hand-edit this.
+
+const xml_token_t XML_AcceptLabelsInFormulas = 1;
+const xml_token_t XML_Action = 2;
+const xml_token_t XML_ActiveChart = 3;
+const xml_token_t XML_ActiveCol = 4;
+const xml_token_t XML_ActiveColumn = 5;
+const xml_token_t XML_ActivePane = 6;
+const xml_token_t XML_ActiveRow = 7;
+const xml_token_t XML_ActiveRows = 8;
+const xml_token_t XML_ActiveSheet = 9;
+const xml_token_t XML_Aggregate = 10;
+const xml_token_t XML_AlertVersion = 11;
+const xml_token_t XML_Alignment = 12;
+const xml_token_t XML_AllItemName = 13;
+const xml_token_t XML_AllowDeleteCols = 14;
+const xml_token_t XML_AllowDeleteRows = 15;
+const xml_token_t XML_AllowFilter = 16;
+const xml_token_t XML_AllowFormatCells = 17;
+const xml_token_t XML_AllowInsertCols = 18;
+const xml_token_t XML_AllowInsertHyperlinks = 19;
+const xml_token_t XML_AllowInsertRows = 20;
+const xml_token_t XML_AllowPNG = 21;
+const xml_token_t XML_AllowSizeCols = 22;
+const xml_token_t XML_AllowSizeRows = 23;
+const xml_token_t XML_AllowSort = 24;
+const xml_token_t XML_AllowUsePivotTables = 25;
+const xml_token_t XML_AlternateMethod = 26;
+const xml_token_t XML_AppName = 27;
+const xml_token_t XML_Append = 28;
+const xml_token_t XML_ApplyAutomaticOutlineStyles = 29;
+const xml_token_t XML_Area = 30;
+const xml_token_t XML_ArrayRange = 31;
+const xml_token_t XML_Async = 32;
+const xml_token_t XML_Attribute = 33;
+const xml_token_t XML_AttributeType = 34;
+const xml_token_t XML_Authentication = 35;
+const xml_token_t XML_Author = 36;
+const xml_token_t XML_AutoFilter = 37;
+const xml_token_t XML_AutoFilterAnd = 38;
+const xml_token_t XML_AutoFilterColumn = 39;
+const xml_token_t XML_AutoFilterCondition = 40;
+const xml_token_t XML_AutoFilterOr = 41;
+const xml_token_t XML_AutoFitHeight = 42;
+const xml_token_t XML_AutoFitWidth = 43;
+const xml_token_t XML_AutoFormatAlignment = 44;
+const xml_token_t XML_AutoFormatBorder = 45;
+const xml_token_t XML_AutoFormatFont = 46;
+const xml_token_t XML_AutoFormatName = 47;
+const xml_token_t XML_AutoFormatNumber = 48;
+const xml_token_t XML_AutoFormatPattern = 49;
+const xml_token_t XML_AutoFormatWidth = 50;
+const xml_token_t XML_AutoRepublish = 51;
+const xml_token_t XML_AutoShowCount = 52;
+const xml_token_t XML_AutoShowField = 53;
+const xml_token_t XML_AutoShowRange = 54;
+const xml_token_t XML_AutoShowType = 55;
+const xml_token_t XML_AutoSortField = 56;
+const xml_token_t XML_AutoSortOrder = 57;
+const xml_token_t XML_B = 58;
+const xml_token_t XML_BackgroundQuery = 59;
+const xml_token_t XML_BaseField = 60;
+const xml_token_t XML_BaseItem = 61;
+const xml_token_t XML_Basic = 62;
+const xml_token_t XML_Behavior = 63;
+const xml_token_t XML_Binding = 64;
+const xml_token_t XML_BlackAndWhite = 65;
+const xml_token_t XML_BlankLineAfterItems = 66;
+const xml_token_t XML_BlockTotal = 67;
+const xml_token_t XML_Bold = 68;
+const xml_token_t XML_Boolean = 69;
+const xml_token_t XML_Border = 70;
+const xml_token_t XML_Borders = 71;
+const xml_token_t XML_Bottom = 72;
+const xml_token_t XML_BoundField = 73;
+const xml_token_t XML_Bytes = 74;
+const xml_token_t XML_CacheDetails = 75;
+const xml_token_t XML_CacheFile = 76;
+const xml_token_t XML_CacheIndex = 77;
+const xml_token_t XML_CachePosition = 78;
+const xml_token_t XML_CalculatedMember = 79;
+const xml_token_t XML_Calculation = 80;
+const xml_token_t XML_CantGetUniqueItems = 81;
+const xml_token_t XML_Caption = 82;
+const xml_token_t XML_CaptionAlignment = 83;
+const xml_token_t XML_CaseSensitive = 84;
+const xml_token_t XML_Category = 85;
+const xml_token_t XML_Cell = 86;
+const xml_token_t XML_CellRangeList = 87;
+const xml_token_t XML_CellsExpanded = 88;
+const xml_token_t XML_CellsExpandedSeqNum = 89;
+const xml_token_t XML_CellsNotExpanded = 90;
+const xml_token_t XML_CenterHorizontal = 91;
+const xml_token_t XML_CenterVertical = 92;
+const xml_token_t XML_Cf = 93;
+const xml_token_t XML_CharSet = 94;
+const xml_token_t XML_Characters = 95;
+const xml_token_t XML_CharactersWithSpaces = 96;
+const xml_token_t XML_ClientParameter = 97;
+const xml_token_t XML_ClientParameterBinding = 98;
+const xml_token_t XML_ClientParameterBindings = 99;
+const xml_token_t XML_ClientParameterValue = 100;
+const xml_token_t XML_Clipped = 101;
+const xml_token_t XML_CodeName = 102;
+const xml_token_t XML_Col1 = 103;
+const xml_token_t XML_Col10 = 104;
+const xml_token_t XML_Col11 = 105;
+const xml_token_t XML_Col12 = 106;
+const xml_token_t XML_Col13 = 107;
+const xml_token_t XML_Col14 = 108;
+const xml_token_t XML_Col15 = 109;
+const xml_token_t XML_Col16 = 110;
+const xml_token_t XML_Col17 = 111;
+const xml_token_t XML_Col18 = 112;
+const xml_token_t XML_Col19 = 113;
+const xml_token_t XML_Col2 = 114;
+const xml_token_t XML_Col20 = 115;
+const xml_token_t XML_Col3 = 116;
+const xml_token_t XML_Col4 = 117;
+const xml_token_t XML_Col5 = 118;
+const xml_token_t XML_Col6 = 119;
+const xml_token_t XML_Col7 = 120;
+const xml_token_t XML_Col8 = 121;
+const xml_token_t XML_Col9 = 122;
+const xml_token_t XML_ColBreak = 123;
+const xml_token_t XML_ColBreaks = 124;
+const xml_token_t XML_ColFirst = 125;
+const xml_token_t XML_ColLast = 126;
+const xml_token_t XML_Color = 127;
+const xml_token_t XML_Column = 128;
+const xml_token_t XML_ColumnInfo = 129;
+const xml_token_t XML_ColumnInputCell = 130;
+const xml_token_t XML_ColumnName = 131;
+const xml_token_t XML_ComboHide = 132;
+const xml_token_t XML_Comma = 133;
+const xml_token_t XML_CommandText = 134;
+const xml_token_t XML_CommandTextOrignal = 135;
+const xml_token_t XML_CommandType = 136;
+const xml_token_t XML_Comment = 137;
+const xml_token_t XML_CommentsLayout = 138;
+const xml_token_t XML_Company = 139;
+const xml_token_t XML_ComponentOptions = 140;
+const xml_token_t XML_Condition = 141;
+const xml_token_t XML_ConditionalFormatting = 142;
+const xml_token_t XML_Connection = 143;
+const xml_token_t XML_ConnectionInfo = 144;
+const xml_token_t XML_ConnectionString = 145;
+const xml_token_t XML_Consecutive = 146;
+const xml_token_t XML_ConsolidationReference = 147;
+const xml_token_t XML_Count = 148;
+const xml_token_t XML_CountOfSameItems = 149;
+const xml_token_t XML_CreateBackup = 150;
+const xml_token_t XML_Created = 151;
+const xml_token_t XML_Credential = 152;
+const xml_token_t XML_CredentialBinding = 153;
+const xml_token_t XML_CredentialValue = 154;
+const xml_token_t XML_Crn = 155;
+const xml_token_t XML_CubeField = 156;
+const xml_token_t XML_CubeSource = 157;
+const xml_token_t XML_CurrentPage = 158;
+const xml_token_t XML_Custom = 159;
+const xml_token_t XML_CustomDocumentProperties = 160;
+const xml_token_t XML_Data = 161;
+const xml_token_t XML_DataAxisEmpty = 162;
+const xml_token_t XML_DataField = 163;
+const xml_token_t XML_DataMember = 164;
+const xml_token_t XML_DataSource = 165;
+const xml_token_t XML_DataTable = 166;
+const xml_token_t XML_DataType = 167;
+const xml_token_t XML_DataValidation = 168;
+const xml_token_t XML_DataValueEditing = 169;
+const xml_token_t XML_Date1904 = 170;
+const xml_token_t XML_Decimal = 171;
+const xml_token_t XML_DefaultColumnWidth = 172;
+const xml_token_t XML_DefaultItem = 173;
+const xml_token_t XML_DefaultRowHeight = 174;
+const xml_token_t XML_DefaultValue = 175;
+const xml_token_t XML_DefaultVersion = 176;
+const xml_token_t XML_DeletedTitle = 177;
+const xml_token_t XML_Delimiters = 178;
+const xml_token_t XML_Descending = 179;
+const xml_token_t XML_Description = 180;
+const xml_token_t XML_DetailFormat = 181;
+const xml_token_t XML_DetailMaxHeight = 182;
+const xml_token_t XML_DetailMaxWidth = 183;
+const xml_token_t XML_DetailRowHeight = 184;
+const xml_token_t XML_DetailSortOrder = 185;
+const xml_token_t XML_DetailWidth = 186;
+const xml_token_t XML_Dimension = 187;
+const xml_token_t XML_DisableDateRecognition = 188;
+const xml_token_t XML_DisableDrillDown = 189;
+const xml_token_t XML_DisableEdit = 190;
+const xml_token_t XML_DisableFieldDialog = 191;
+const xml_token_t XML_DisableRefresh = 192;
+const xml_token_t XML_DisableWizard = 193;
+const xml_token_t XML_DisplayDrawingObjects = 194;
+const xml_token_t XML_DisplayEmptyMembers = 195;
+const xml_token_t XML_DisplayErrorString = 196;
+const xml_token_t XML_DisplayFieldList = 197;
+const xml_token_t XML_DisplayFormulas = 198;
+const xml_token_t XML_DisplayIn = 199;
+const xml_token_t XML_DisplayInkNotes = 200;
+const xml_token_t XML_DisplayPageBreak = 201;
+const xml_token_t XML_DisplayRightToLeft = 202;
+const xml_token_t XML_DivID = 203;
+const xml_token_t XML_DoNotCalculateBeforeSave = 204;
+const xml_token_t XML_DoNotDisplayColHeaders = 205;
+const xml_token_t XML_DoNotDisplayGridlines = 206;
+const xml_token_t XML_DoNotDisplayHeadings = 207;
+const xml_token_t XML_DoNotDisplayOutline = 208;
+const xml_token_t XML_DoNotDisplayRowHeaders = 209;
+const xml_token_t XML_DoNotDisplayZeros = 210;
+const xml_token_t XML_DoNotJoinDelimiters = 211;
+const xml_token_t XML_DoNotPersist = 212;
+const xml_token_t XML_DoNotPersistSort = 213;
+const xml_token_t XML_DoNotPersstAF = 214;
+const xml_token_t XML_DoNotPromptForFile = 215;
+const xml_token_t XML_DoNotSaveLinkValues = 216;
+const xml_token_t XML_DocumentProperties = 217;
+const xml_token_t XML_DontShowInFieldList = 218;
+const xml_token_t XML_DownloadComponents = 219;
+const xml_token_t XML_DraftQuality = 220;
+const xml_token_t XML_DrawAspect = 221;
+const xml_token_t XML_DrilledLevel = 222;
+const xml_token_t XML_DrilledMember = 223;
+const xml_token_t XML_EditWebPage = 224;
+const xml_token_t XML_ElementType = 225;
+const xml_token_t XML_EmbedSaveSmartTags = 226;
+const xml_token_t XML_EnableMultiplePageItems = 227;
+const xml_token_t XML_EnableRedirections = 228;
+const xml_token_t XML_EnableSelection = 229;
+const xml_token_t XML_Encode = 230;
+const xml_token_t XML_EntirePage = 231;
+const xml_token_t XML_Entry = 232;
+const xml_token_t XML_Error = 233;
+const xml_token_t XML_ErrorHide = 234;
+const xml_token_t XML_ErrorMessage = 235;
+const xml_token_t XML_ErrorString = 236;
+const xml_token_t XML_ErrorStyle = 237;
+const xml_token_t XML_ErrorTitle = 238;
+const xml_token_t XML_ExcelName = 239;
+const xml_token_t XML_ExcelType = 240;
+const xml_token_t XML_ExcelWorkbook = 241;
+const xml_token_t XML_ExcelWorksheetType = 242;
+const xml_token_t XML_Expanded = 243;
+const xml_token_t XML_ExpandedColumnCount = 244;
+const xml_token_t XML_ExpandedRowCount = 245;
+const xml_token_t XML_ExternName = 246;
+const xml_token_t XML_ExtraLeftColumns = 247;
+const xml_token_t XML_ExtraRightColumns = 248;
+const xml_token_t XML_Face = 249;
+const xml_token_t XML_Family = 250;
+const xml_token_t XML_Field = 251;
+const xml_token_t XML_FieldLabelFormat = 252;
+const xml_token_t XML_FieldListBottom = 253;
+const xml_token_t XML_FieldListLeft = 254;
+const xml_token_t XML_FieldListRight = 255;
+const xml_token_t XML_FieldListTop = 256;
+const xml_token_t XML_FieldStart = 257;
+const xml_token_t XML_FieldType = 258;
+const xml_token_t XML_File = 259;
+const xml_token_t XML_FileName = 260;
+const xml_token_t XML_FillDown = 261;
+const xml_token_t XML_Filled = 262;
+const xml_token_t XML_FilterCaption = 263;
+const xml_token_t XML_FilterMember = 264;
+const xml_token_t XML_FilterOn = 265;
+const xml_token_t XML_FirstVisibleSheet = 266;
+const xml_token_t XML_FitHeight = 267;
+const xml_token_t XML_FitToPage = 268;
+const xml_token_t XML_FitWidth = 269;
+const xml_token_t XML_Font = 270;
+const xml_token_t XML_FontName = 271;
+const xml_token_t XML_Footer = 272;
+const xml_token_t XML_Format = 273;
+const xml_token_t XML_FormatSettings = 274;
+const xml_token_t XML_FormatType = 275;
+const xml_token_t XML_Formula = 276;
+const xml_token_t XML_FormulaIndex = 277;
+const xml_token_t XML_FormulaV10 = 278;
+const xml_token_t XML_FreezePanes = 279;
+const xml_token_t XML_FrozenNoSplit = 280;
+const xml_token_t XML_FullColumns = 281;
+const xml_token_t XML_FullRows = 282;
+const xml_token_t XML_Function = 283;
+const xml_token_t XML_FunctionGroup = 284;
+const xml_token_t XML_FunctionGroupIndex = 285;
+const xml_token_t XML_FuturePersist = 286;
+const xml_token_t XML_FutureVer = 287;
+const xml_token_t XML_GrandTotalString = 288;
+const xml_token_t XML_GridlineColor = 289;
+const xml_token_t XML_GridlineColorIndex = 290;
+const xml_token_t XML_Gridlines = 291;
+const xml_token_t XML_GroupBy = 292;
+const xml_token_t XML_GroupDefinition = 293;
+const xml_token_t XML_GroupEnd = 294;
+const xml_token_t XML_GroupEndAuto = 295;
+const xml_token_t XML_GroupLevel = 296;
+const xml_token_t XML_GroupMember = 297;
+const xml_token_t XML_GroupNumber = 298;
+const xml_token_t XML_GroupStart = 299;
+const xml_token_t XML_GroupStartAuto = 300;
+const xml_token_t XML_GroupType = 301;
+const xml_token_t XML_GroupedWidth = 302;
+const xml_token_t XML_Guid = 303;
+const xml_token_t XML_HRef = 304;
+const xml_token_t XML_HRefScreenTip = 305;
+const xml_token_t XML_HTMLFormat = 306;
+const xml_token_t XML_HTMLTables = 307;
+const xml_token_t XML_HasNoAutoFormat = 308;
+const xml_token_t XML_HasNoRecords = 309;
+const xml_token_t XML_Header = 310;
+const xml_token_t XML_HeaderRange = 311;
+const xml_token_t XML_HeaderRow = 312;
+const xml_token_t XML_Height = 313;
+const xml_token_t XML_Hidden = 314;
+const xml_token_t XML_HideDetail = 315;
+const xml_token_t XML_HideDropDowns = 316;
+const xml_token_t XML_HideFormula = 317;
+const xml_token_t XML_HideHorizontalScrollBar = 318;
+const xml_token_t XML_HideInactiveListBorder = 319;
+const xml_token_t XML_HideOfficeLogo = 320;
+const xml_token_t XML_HidePivotTableFieldList = 321;
+const xml_token_t XML_HideTotalsAnnotation = 322;
+const xml_token_t XML_HideVerticalScrollBar = 323;
+const xml_token_t XML_HideWorkbookTabs = 324;
+const xml_token_t XML_Horizontal = 325;
+const xml_token_t XML_HorizontalResolution = 326;
+const xml_token_t XML_Href = 327;
+const xml_token_t XML_HtmlType = 328;
+const xml_token_t XML_HyperlinkBase = 329;
+const xml_token_t XML_I = 330;
+const xml_token_t XML_ID = 331;
+const xml_token_t XML_IMEMode = 332;
+const xml_token_t XML_Id = 333;
+const xml_token_t XML_IdWrapped = 334;
+const xml_token_t XML_If = 335;
+const xml_token_t XML_ImmediateItemsOnDrop = 336;
+const xml_token_t XML_Indent = 337;
+const xml_token_t XML_Index = 338;
+const xml_token_t XML_IndividualCellBorders = 339;
+const xml_token_t XML_InputHide = 340;
+const xml_token_t XML_InputMessage = 341;
+const xml_token_t XML_InputTitle = 342;
+const xml_token_t XML_InsertEntireRows = 343;
+const xml_token_t XML_InstanceShape = 344;
+const xml_token_t XML_Interior = 345;
+const xml_token_t XML_IntlMacro = 346;
+const xml_token_t XML_Invalid = 347;
+const xml_token_t XML_InvertedColumnMember = 348;
+const xml_token_t XML_InvertedRowMember = 349;
+const xml_token_t XML_IsGroupLevel = 350;
+const xml_token_t XML_IsMemberProperty = 351;
+const xml_token_t XML_IsNotFiltered = 352;
+const xml_token_t XML_Italic = 353;
+const xml_token_t XML_Item = 354;
+const xml_token_t XML_ItemType = 355;
+const xml_token_t XML_Iteration = 356;
+const xml_token_t XML_KeyboardShortcut = 357;
+const xml_token_t XML_Keywords = 358;
+const xml_token_t XML_Label = 359;
+const xml_token_t XML_LastAuthor = 360;
+const xml_token_t XML_LastPrinted = 361;
+const xml_token_t XML_LastSaved = 362;
+const xml_token_t XML_Layout = 363;
+const xml_token_t XML_LayoutForm = 364;
+const xml_token_t XML_LayoutPageBreak = 365;
+const xml_token_t XML_LayoutSubtotalLocation = 366;
+const xml_token_t XML_LeafColumnMember = 367;
+const xml_token_t XML_LeafRowMember = 368;
+const xml_token_t XML_Left = 369;
+const xml_token_t XML_LeftCell = 370;
+const xml_token_t XML_LeftColumnRightPane = 371;
+const xml_token_t XML_LeftColumnVisible = 372;
+const xml_token_t XML_LeftToRight = 373;
+const xml_token_t XML_LengthLevelUniqueName = 374;
+const xml_token_t XML_Level = 375;
+const xml_token_t XML_LineStyle = 376;
+const xml_token_t XML_Lines = 377;
+const xml_token_t XML_LoadMode = 378;
+const xml_token_t XML_LocalConnection = 379;
+const xml_token_t XML_Location = 380;
+const xml_token_t XML_LocationOfComponents = 381;
+const xml_token_t XML_Macro = 382;
+const xml_token_t XML_MainFile = 383;
+const xml_token_t XML_Maintain = 384;
+const xml_token_t XML_MajorVersion = 385;
+const xml_token_t XML_Manager = 386;
+const xml_token_t XML_Map = 387;
+const xml_token_t XML_MapChildItems = 388;
+const xml_token_t XML_MapID = 389;
+const xml_token_t XML_MapInfo = 390;
+const xml_token_t XML_Mapdata = 391;
+const xml_token_t XML_Margin = 392;
+const xml_token_t XML_Max = 393;
+const xml_token_t XML_MaxChange = 394;
+const xml_token_t XML_MaxHeight = 395;
+const xml_token_t XML_MaxIterations = 396;
+const xml_token_t XML_MaxWidth = 397;
+const xml_token_t XML_Measure = 398;
+const xml_token_t XML_Member = 399;
+const xml_token_t XML_MemberExpand = 400;
+const xml_token_t XML_MemberFormat = 401;
+const xml_token_t XML_MemberName = 402;
+const xml_token_t XML_MemberPropertiesOrder = 403;
+const xml_token_t XML_MemberProperty = 404;
+const xml_token_t XML_MemberPropertyParent = 405;
+const xml_token_t XML_MergeAcross = 406;
+const xml_token_t XML_MergeDown = 407;
+const xml_token_t XML_MergeLabels = 408;
+const xml_token_t XML_Min = 409;
+const xml_token_t XML_MinorVersion = 410;
+const xml_token_t XML_Missing = 411;
+const xml_token_t XML_MissingItemsLimit = 412;
+const xml_token_t XML_Moper = 413;
+const xml_token_t XML_MoveAfterReturn = 414;
+const xml_token_t XML_Name = 415;
+const xml_token_t XML_NamedCell = 416;
+const xml_token_t XML_NamedRange = 417;
+const xml_token_t XML_Names = 418;
+const xml_token_t XML_Namespace = 419;
+const xml_token_t XML_NewAsync = 420;
+const xml_token_t XML_NewItemsHidden = 421;
+const xml_token_t XML_NextId = 422;
+const xml_token_t XML_NextSheetNumber = 423;
+const xml_token_t XML_NoAutoFit = 424;
+const xml_token_t XML_NoAutoFormatWidth = 425;
+const xml_token_t XML_NoAutoPage = 426;
+const xml_token_t XML_NoAutoRecover = 427;
+const xml_token_t XML_NoAutofit = 428;
+const xml_token_t XML_NoColumnGrand = 429;
+const xml_token_t XML_NoDetailAutoFit = 430;
+const xml_token_t XML_NoDisplayNullString = 431;
+const xml_token_t XML_NoDragToColumn = 432;
+const xml_token_t XML_NoDragToData = 433;
+const xml_token_t XML_NoDragToHide = 434;
+const xml_token_t XML_NoDragToPage = 435;
+const xml_token_t XML_NoDragToRow = 436;
+const xml_token_t XML_NoInserts = 437;
+const xml_token_t XML_NoPreserveFormatting = 438;
+const xml_token_t XML_NoPrintRepeatItems = 439;
+const xml_token_t XML_NoPrinterInfo = 440;
+const xml_token_t XML_NoRefreshCache = 441;
+const xml_token_t XML_NoRowGrand = 442;
+const xml_token_t XML_NoSaveData = 443;
+const xml_token_t XML_NoSummaryColumnsRightDetail = 444;
+const xml_token_t XML_NoSummaryRowsBelowDetail = 445;
+const xml_token_t XML_NoTextToColumns = 446;
+const xml_token_t XML_NoTitles = 447;
+const xml_token_t XML_NoToggleDataHeader = 448;
+const xml_token_t XML_NoViewCalculatedMembers = 449;
+const xml_token_t XML_NonDefaultName = 450;
+const xml_token_t XML_NotInverted = 451;
+const xml_token_t XML_NotVisible = 452;
+const xml_token_t XML_NullString = 453;
+const xml_token_t XML_Number = 454;
+const xml_token_t XML_NumberFormat = 455;
+const xml_token_t XML_NumberOfCopies = 456;
+const xml_token_t XML_OLEObject = 457;
+const xml_token_t XML_OWCVersion = 458;
+const xml_token_t XML_ObjectID = 459;
+const xml_token_t XML_OfficeDocumentSettings = 460;
+const xml_token_t XML_OleLink = 461;
+const xml_token_t XML_Operator = 462;
+const xml_token_t XML_OptimizeCache = 463;
+const xml_token_t XML_Orientation = 464;
+const xml_token_t XML_Outline = 465;
+const xml_token_t XML_OverwriteCells = 466;
+const xml_token_t XML_PLCaption = 467;
+const xml_token_t XML_PLDataOrientation = 468;
+const xml_token_t XML_PLExport = 469;
+const xml_token_t XML_PLGroupType = 470;
+const xml_token_t XML_PLName = 471;
+const xml_token_t XML_PLPivotField = 472;
+const xml_token_t XML_PLPosition = 473;
+const xml_token_t XML_PLSubtotal = 474;
+const xml_token_t XML_PLTPivotItem = 475;
+const xml_token_t XML_PLTotal = 476;
+const xml_token_t XML_PTFormat = 477;
+const xml_token_t XML_PTFormula = 478;
+const xml_token_t XML_PTLineItem = 479;
+const xml_token_t XML_PTLineItems = 480;
+const xml_token_t XML_PTPivotData = 481;
+const xml_token_t XML_PTRule = 482;
+const xml_token_t XML_PTSource = 483;
+const xml_token_t XML_PageBreakZoom = 484;
+const xml_token_t XML_PageBreaks = 485;
+const xml_token_t XML_PageFieldOrder = 486;
+const xml_token_t XML_PageFieldStyle = 487;
+const xml_token_t XML_PageFieldWrapCount = 488;
+const xml_token_t XML_PageMargins = 489;
+const xml_token_t XML_PageSetup = 490;
+const xml_token_t XML_Pages = 491;
+const xml_token_t XML_Pane = 492;
+const xml_token_t XML_Panes = 493;
+const xml_token_t XML_PaperSizeIndex = 494;
+const xml_token_t XML_Paragraphs = 495;
+const xml_token_t XML_Parameter = 496;
+const xml_token_t XML_ParameterType = 497;
+const xml_token_t XML_ParameterValue = 498;
+const xml_token_t XML_Parent = 499;
+const xml_token_t XML_ParentField = 500;
+const xml_token_t XML_ParentIsOther = 501;
+const xml_token_t XML_ParentName = 502;
+const xml_token_t XML_ParentUniqueName = 503;
+const xml_token_t XML_ParseFormulaAsV10 = 504;
+const xml_token_t XML_ParseRuleAsV10 = 505;
+const xml_token_t XML_PasteFormula = 506;
+const xml_token_t XML_PasteRefersTo = 507;
+const xml_token_t XML_Path = 508;
+const xml_token_t XML_Pattern = 509;
+const xml_token_t XML_PatternColor = 510;
+const xml_token_t XML_PivotAxis = 511;
+const xml_token_t XML_PivotCache = 512;
+const xml_token_t XML_PivotField = 513;
+const xml_token_t XML_PivotItem = 514;
+const xml_token_t XML_PivotTable = 515;
+const xml_token_t XML_PivotView = 516;
+const xml_token_t XML_Position = 517;
+const xml_token_t XML_PrecisionAsDisplayed = 518;
+const xml_token_t XML_PresentationFormat = 519;
+const xml_token_t XML_Print = 520;
+const xml_token_t XML_PrintErrors = 521;
+const xml_token_t XML_PrintSetTitles = 522;
+const xml_token_t XML_ProgID = 523;
+const xml_token_t XML_PromptString = 524;
+const xml_token_t XML_ProtectContents = 525;
+const xml_token_t XML_ProtectObjects = 526;
+const xml_token_t XML_ProtectScenarios = 527;
+const xml_token_t XML_ProtectStructure = 528;
+const xml_token_t XML_ProtectWindows = 529;
+const xml_token_t XML_Protected = 530;
+const xml_token_t XML_Protection = 531;
+const xml_token_t XML_Proxy = 532;
+const xml_token_t XML_PublishObject = 533;
+const xml_token_t XML_PublishObjects = 534;
+const xml_token_t XML_Purpose = 535;
+const xml_token_t XML_QTSource = 536;
+const xml_token_t XML_Qualifier = 537;
+const xml_token_t XML_Query97 = 538;
+const xml_token_t XML_QuerySource = 539;
+const xml_token_t XML_QueryTable = 540;
+const xml_token_t XML_QueryType = 541;
+const xml_token_t XML_Range = 542;
+const xml_token_t XML_RangeSelection = 543;
+const xml_token_t XML_ReadOnly = 544;
+const xml_token_t XML_ReadingOrder = 545;
+const xml_token_t XML_RefModeR1C1 = 546;
+const xml_token_t XML_Reference = 547;
+const xml_token_t XML_RefersTo = 548;
+const xml_token_t XML_RefreshDate = 549;
+const xml_token_t XML_RefreshDateCopy = 550;
+const xml_token_t XML_RefreshInfo = 551;
+const xml_token_t XML_RefreshName = 552;
+const xml_token_t XML_RefreshOnChange = 553;
+const xml_token_t XML_RefreshOnFileOpen = 554;
+const xml_token_t XML_RefreshTimeSpan = 555;
+const xml_token_t XML_RefreshedInXl9 = 556;
+const xml_token_t XML_Resource = 557;
+const xml_token_t XML_Revision = 558;
+const xml_token_t XML_Right = 559;
+const xml_token_t XML_RightToLeft = 560;
+const xml_token_t XML_RobustConnect = 561;
+const xml_token_t XML_RootElement = 562;
+const xml_token_t XML_Rotate = 563;
+const xml_token_t XML_Rotation = 564;
+const xml_token_t XML_Row = 565;
+const xml_token_t XML_RowBreak = 566;
+const xml_token_t XML_RowBreaks = 567;
+const xml_token_t XML_RowColHeadings = 568;
+const xml_token_t XML_RowInputCell = 569;
+const xml_token_t XML_RowLast = 570;
+const xml_token_t XML_RowNumbers = 571;
+const xml_token_t XML_Rule = 572;
+const xml_token_t XML_RuleType = 573;
+const xml_token_t XML_RuleV10 = 574;
+const xml_token_t XML_S = 575;
+const xml_token_t XML_SOAPAction = 576;
+const xml_token_t XML_SQLType = 577;
+const xml_token_t XML_Scale = 578;
+const xml_token_t XML_Schema = 579;
+const xml_token_t XML_SchemaID = 580;
+const xml_token_t XML_SchemaRef = 581;
+const xml_token_t XML_Selected = 582;
+const xml_token_t XML_SelectedSheets = 583;
+const xml_token_t XML_Selection = 584;
+const xml_token_t XML_SelectionNamespaces = 585;
+const xml_token_t XML_SemiColon = 586;
+const xml_token_t XML_SeqNum = 587;
+const xml_token_t XML_Sequence = 588;
+const xml_token_t XML_ServerBased = 589;
+const xml_token_t XML_ServerSortOrder = 590;
+const xml_token_t XML_Set = 591;
+const xml_token_t XML_Shadow = 592;
+const xml_token_t XML_ShapeID = 593;
+const xml_token_t XML_SheetIndex = 594;
+const xml_token_t XML_SheetName = 595;
+const xml_token_t XML_ShowAllItems = 596;
+const xml_token_t XML_ShowAlways = 597;
+const xml_token_t XML_ShowCellBackgroundFromOLAP = 598;
+const xml_token_t XML_ShowImportExportValidationErrors = 599;
+const xml_token_t XML_ShowPageBreakZoom = 600;
+const xml_token_t XML_ShowPageMultipleItemLabel = 601;
+const xml_token_t XML_ShowTotals = 602;
+const xml_token_t XML_ShrinkToFit = 603;
+const xml_token_t XML_Size = 604;
+const xml_token_t XML_SmallGrid = 605;
+const xml_token_t XML_SmartTagType = 606;
+const xml_token_t XML_SmartTags = 607;
+const xml_token_t XML_SolveOrder = 608;
+const xml_token_t XML_Sort = 609;
+const xml_token_t XML_SortKey = 610;
+const xml_token_t XML_SortOrder = 611;
+const xml_token_t XML_Sorting = 612;
+const xml_token_t XML_Source = 613;
+const xml_token_t XML_SourceConnectionFile = 614;
+const xml_token_t XML_SourceConsolidation = 615;
+const xml_token_t XML_SourceDataFile = 616;
+const xml_token_t XML_SourceHierarchy = 617;
+const xml_token_t XML_SourceHierarchyLevel = 618;
+const xml_token_t XML_SourceName = 619;
+const xml_token_t XML_SourceType = 620;
+const xml_token_t XML_Space = 621;
+const xml_token_t XML_SpaceAbove = 622;
+const xml_token_t XML_SpaceBelow = 623;
+const xml_token_t XML_Span = 624;
+const xml_token_t XML_SplitHorizontal = 625;
+const xml_token_t XML_SplitVertical = 626;
+const xml_token_t XML_SpreadsheetAutoFit = 627;
+const xml_token_t XML_StandardWidth = 628;
+const xml_token_t XML_StartPageNumber = 629;
+const xml_token_t XML_StartRow = 630;
+const xml_token_t XML_StrikeThrough = 631;
+const xml_token_t XML_Style = 632;
+const xml_token_t XML_StyleID = 633;
+const xml_token_t XML_Styles = 634;
+const xml_token_t XML_Sub = 635;
+const xml_token_t XML_SubType = 636;
+const xml_token_t XML_Subject = 637;
+const xml_token_t XML_Subtotal = 638;
+const xml_token_t XML_SubtotalFormat = 639;
+const xml_token_t XML_SubtotalHiddenPageItems = 640;
+const xml_token_t XML_SubtotalName = 641;
+const xml_token_t XML_Sup = 642;
+const xml_token_t XML_SupBook = 643;
+const xml_token_t XML_Synchronous = 644;
+const xml_token_t XML_Tab = 645;
+const xml_token_t XML_TabColorIndex = 646;
+const xml_token_t XML_TabRatio = 647;
+const xml_token_t XML_Table = 648;
+const xml_token_t XML_TableStyle = 649;
+const xml_token_t XML_Tag = 650;
+const xml_token_t XML_Text = 651;
+const xml_token_t XML_TextQualifier = 652;
+const xml_token_t XML_TextWizardSettings = 653;
+const xml_token_t XML_ThousandSeparator = 654;
+const xml_token_t XML_Ticked = 655;
+const xml_token_t XML_Title = 656;
+const xml_token_t XML_Toolbar = 657;
+const xml_token_t XML_TooltipInfo = 658;
+const xml_token_t XML_Top = 659;
+const xml_token_t XML_TopCell = 660;
+const xml_token_t XML_TopRowBottomPane = 661;
+const xml_token_t XML_TopRowVisible = 662;
+const xml_token_t XML_TotalAlignment = 663;
+const xml_token_t XML_TotalAllMembers = 664;
+const xml_token_t XML_TotalCaptionAlignment = 665;
+const xml_token_t XML_TotalFormat = 666;
+const xml_token_t XML_TotalTime = 667;
+const xml_token_t XML_TotalWidth = 668;
+const xml_token_t XML_TransitionExpressionEvaluation = 669;
+const xml_token_t XML_TransitionFormulaEntry = 670;
+const xml_token_t XML_Type = 671;
+const xml_token_t XML_U = 672;
+const xml_token_t XML_URLString = 673;
+const xml_token_t XML_Uncalced = 674;
+const xml_token_t XML_Underline = 675;
+const xml_token_t XML_UniqueName = 676;
+const xml_token_t XML_Unsynced = 677;
+const xml_token_t XML_UseBlank = 678;
+const xml_token_t XML_UseLocalConnection = 679;
+const xml_token_t XML_UseSameSettings = 680;
+const xml_token_t XML_User = 681;
+const xml_token_t XML_VMLFrame = 682;
+const xml_token_t XML_VacatedStyle = 683;
+const xml_token_t XML_ValidPrinterInfo = 684;
+const xml_token_t XML_Value = 685;
+const xml_token_t XML_Value1 = 686;
+const xml_token_t XML_Value2 = 687;
+const xml_token_t XML_Version = 688;
+const xml_token_t XML_VersionLastEdit = 689;
+const xml_token_t XML_VersionLastRefresh = 690;
+const xml_token_t XML_VersionLastUpdate = 691;
+const xml_token_t XML_VersionRefreshableMin = 692;
+const xml_token_t XML_VersionUpdateableMin = 693;
+const xml_token_t XML_Vertical = 694;
+const xml_token_t XML_VerticalAlign = 695;
+const xml_token_t XML_VerticalResolution = 696;
+const xml_token_t XML_VerticalText = 697;
+const xml_token_t XML_ViewableRange = 698;
+const xml_token_t XML_Visible = 699;
+const xml_token_t XML_VisualTotals = 700;
+const xml_token_t XML_WantAdvise = 701;
+const xml_token_t XML_WantPict = 702;
+const xml_token_t XML_Watch = 703;
+const xml_token_t XML_Watches = 704;
+const xml_token_t XML_WebPostString = 705;
+const xml_token_t XML_Weight = 706;
+const xml_token_t XML_Width = 707;
+const xml_token_t XML_WindowHeight = 708;
+const xml_token_t XML_WindowHidden = 709;
+const xml_token_t XML_WindowIconic = 710;
+const xml_token_t XML_WindowTopX = 711;
+const xml_token_t XML_WindowTopY = 712;
+const xml_token_t XML_WindowWidth = 713;
+const xml_token_t XML_Windows = 714;
+const xml_token_t XML_Words = 715;
+const xml_token_t XML_Workbook = 716;
+const xml_token_t XML_WorkbookOptions = 717;
+const xml_token_t XML_Worksheet = 718;
+const xml_token_t XML_WorksheetOptions = 719;
+const xml_token_t XML_WorksheetSource = 720;
+const xml_token_t XML_WrapText = 721;
+const xml_token_t XML_XPath = 722;
+const xml_token_t XML_XSDType = 723;
+const xml_token_t XML_Xct = 724;
+const xml_token_t XML_ZeroHeight = 725;
+const xml_token_t XML_Zoom = 726;
+const xml_token_t XML_accentbar = 727;
+const xml_token_t XML_adj = 728;
+const xml_token_t XML_adjusthandles = 729;
+const xml_token_t XML_alignshape = 730;
+const xml_token_t XML_allowincell = 731;
+const xml_token_t XML_allowoverlap = 732;
+const xml_token_t XML_alt = 733;
+const xml_token_t XML_althref = 734;
+const xml_token_t XML_angle = 735;
+const xml_token_t XML_arc = 736;
+const xml_token_t XML_arcsize = 737;
+const xml_token_t XML_arrowok = 738;
+const xml_token_t XML_aspect = 739;
+const xml_token_t XML_aspectratio = 740;
+const xml_token_t XML_attribute = 741;
+const xml_token_t XML_autorotationcenter = 742;
+const xml_token_t XML_backdepth = 743;
+const xml_token_t XML_background = 744;
+const xml_token_t XML_bilevel = 745;
+const xml_token_t XML_blacklevel = 746;
+const xml_token_t XML_borderbottomcolor = 747;
+const xml_token_t XML_borderleftcolor = 748;
+const xml_token_t XML_borderrightcolor = 749;
+const xml_token_t XML_bordertopcolor = 750;
+const xml_token_t XML_brightness = 751;
+const xml_token_t XML_bullet = 752;
+const xml_token_t XML_button = 753;
+const xml_token_t XML_bwmode = 754;
+const xml_token_t XML_bwnormal = 755;
+const xml_token_t XML_bwpure = 756;
+const xml_token_t XML_callout = 757;
+const xml_token_t XML_caption = 758;
+const xml_token_t XML_chromakey = 759;
+const xml_token_t XML_class = 760;
+const xml_token_t XML_clip = 761;
+const xml_token_t XML_color = 762;
+const xml_token_t XML_color2 = 763;
+const xml_token_t XML_colormenu = 764;
+const xml_token_t XML_colormode = 765;
+const xml_token_t XML_colormru = 766;
+const xml_token_t XML_colors = 767;
+const xml_token_t XML_complex = 768;
+const xml_token_t XML_connectangles = 769;
+const xml_token_t XML_connectloc = 770;
+const xml_token_t XML_connectlocs = 771;
+const xml_token_t XML_connectortype = 772;
+const xml_token_t XML_connecttype = 773;
+const xml_token_t XML_content = 774;
+const xml_token_t XML_control1 = 775;
+const xml_token_t XML_control2 = 776;
+const xml_token_t XML_coordorigin = 777;
+const xml_token_t XML_coordsize = 778;
+const xml_token_t XML_cropbottom = 779;
+const xml_token_t XML_cropleft = 780;
+const xml_token_t XML_cropping = 781;
+const xml_token_t XML_cropright = 782;
+const xml_token_t XML_croptop = 783;
+const xml_token_t XML_curve = 784;
+const xml_token_t XML_dashstyle = 785;
+const xml_token_t XML_data = 786;
+const xml_token_t XML_datatype = 787;
+const xml_token_t XML_detectmouseclick = 788;
+const xml_token_t XML_diffusity = 789;
+const xml_token_t XML_displaycustomheaders = 790;
+const xml_token_t XML_distance = 791;
+const xml_token_t XML_doubleclicknotify = 792;
+const xml_token_t XML_drop = 793;
+const xml_token_t XML_dropauto = 794;
+const xml_token_t XML_dt = 795;
+const xml_token_t XML_edge = 796;
+const xml_token_t XML_editas = 797;
+const xml_token_t XML_embosscolor = 798;
+const xml_token_t XML_end = 799;
+const xml_token_t XML_endAngle = 800;
+const xml_token_t XML_endarrow = 801;
+const xml_token_t XML_endarrowlength = 802;
+const xml_token_t XML_endarrowwidth = 803;
+const xml_token_t XML_endcap = 804;
+const xml_token_t XML_entry = 805;
+const xml_token_t XML_eqn = 806;
+const xml_token_t XML_ext = 807;
+const xml_token_t XML_extends = 808;
+const xml_token_t XML_extrusion = 809;
+const xml_token_t XML_extrusioncolor = 810;
+const xml_token_t XML_extrusionok = 811;
+const xml_token_t XML_f = 812;
+const xml_token_t XML_facet = 813;
+const xml_token_t XML_fill = 814;
+const xml_token_t XML_fillcolor = 815;
+const xml_token_t XML_filled = 816;
+const xml_token_t XML_fillok = 817;
+const xml_token_t XML_filltype = 818;
+const xml_token_t XML_fitpath = 819;
+const xml_token_t XML_fitshape = 820;
+const xml_token_t XML_focus = 821;
+const xml_token_t XML_focusposition = 822;
+const xml_token_t XML_focussize = 823;
+const xml_token_t XML_forcedash = 824;
+const xml_token_t XML_foredepth = 825;
+const xml_token_t XML_formulas = 826;
+const xml_token_t XML_from = 827;
+const xml_token_t XML_gain = 828;
+const xml_token_t XML_gamma = 829;
+const xml_token_t XML_gap = 830;
+const xml_token_t XML_gradientshapeok = 831;
+const xml_token_t XML_grayscale = 832;
+const xml_token_t XML_group = 833;
+const xml_token_t XML_grouping = 834;
+const xml_token_t XML_h = 835;
+const xml_token_t XML_handles = 836;
+const xml_token_t XML_hidden = 837;
+const xml_token_t XML_how = 838;
+const xml_token_t XML_hr = 839;
+const xml_token_t XML_hralign = 840;
+const xml_token_t XML_href = 841;
+const xml_token_t XML_hrheight = 842;
+const xml_token_t XML_hrnoshade = 843;
+const xml_token_t XML_hrpct = 844;
+const xml_token_t XML_hrstd = 845;
+const xml_token_t XML_hrwidth = 846;
+const xml_token_t XML_id = 847;
+const xml_token_t XML_idmap = 848;
+const xml_token_t XML_idref = 849;
+const xml_token_t XML_image = 850;
+const xml_token_t XML_imagealignshape = 851;
+const xml_token_t XML_imageaspect = 852;
+const xml_token_t XML_imagedata = 853;
+const xml_token_t XML_imagesize = 854;
+const xml_token_t XML_inset = 855;
+const xml_token_t XML_insetmode = 856;
+const xml_token_t XML_invx = 857;
+const xml_token_t XML_invy = 858;
+const xml_token_t XML_joinstyle = 859;
+const xml_token_t XML_length = 860;
+const xml_token_t XML_lengthspecified = 861;
+const xml_token_t XML_lightface = 862;
+const xml_token_t XML_lightharsh = 863;
+const xml_token_t XML_lightharsh2 = 864;
+const xml_token_t XML_lightlevel = 865;
+const xml_token_t XML_lightlevel2 = 866;
+const xml_token_t XML_lightposition = 867;
+const xml_token_t XML_lightposition2 = 868;
+const xml_token_t XML_limo = 869;
+const xml_token_t XML_line = 870;
+const xml_token_t XML_linestyle = 871;
+const xml_token_t XML_lock = 872;
+const xml_token_t XML_lockrotationcenter = 873;
+const xml_token_t XML_map = 874;
+const xml_token_t XML_master = 875;
+const xml_token_t XML_matrix = 876;
+const xml_token_t XML_maxLength = 877;
+const xml_token_t XML_metal = 878;
+const xml_token_t XML_method = 879;
+const xml_token_t XML_minusx = 880;
+const xml_token_t XML_minusy = 881;
+const xml_token_t XML_miterlimit = 882;
+const xml_token_t XML_movie = 883;
+const xml_token_t XML_name = 884;
+const xml_token_t XML_namespaceuri = 885;
+const xml_token_t XML_new = 886;
+const xml_token_t XML_obscured = 887;
+const xml_token_t XML_offset = 888;
+const xml_token_t XML_offset2 = 889;
+const xml_token_t XML_old = 890;
+const xml_token_t XML_ole = 891;
+const xml_token_t XML_oleicon = 892;
+const xml_token_t XML_oleid = 893;
+const xml_token_t XML_on = 894;
+const xml_token_t XML_oned = 895;
+const xml_token_t XML_onmouseover = 896;
+const xml_token_t XML_opacity = 897;
+const xml_token_t XML_opacity2 = 898;
+const xml_token_t XML_orientation = 899;
+const xml_token_t XML_orientationangle = 900;
+const xml_token_t XML_origin = 901;
+const xml_token_t XML_oval = 902;
+const xml_token_t XML_password = 903;
+const xml_token_t XML_path = 904;
+const xml_token_t XML_phonetictext = 905;
+const xml_token_t XML_plane = 906;
+const xml_token_t XML_points = 907;
+const xml_token_t XML_polar = 908;
+const xml_token_t XML_polyline = 909;
+const xml_token_t XML_position = 910;
+const xml_token_t XML_preferrelative = 911;
+const xml_token_t XML_print = 912;
+const xml_token_t XML_proxy = 913;
+const xml_token_t XML_r = 914;
+const xml_token_t XML_radiusrange = 915;
+const xml_token_t XML_rect = 916;
+const xml_token_t XML_regroupid = 917;
+const xml_token_t XML_regrouptable = 918;
+const xml_token_t XML_relativeposition = 919;
+const xml_token_t XML_render = 920;
+const xml_token_t XML_rotation = 921;
+const xml_token_t XML_rotationangle = 922;
+const xml_token_t XML_rotationcenter = 923;
+const xml_token_t XML_roundrect = 924;
+const xml_token_t XML_row = 925;
+const xml_token_t XML_ruleinitiator = 926;
+const xml_token_t XML_ruleproxy = 927;
+const xml_token_t XML_rules = 928;
+const xml_token_t XML_selection = 929;
+const xml_token_t XML_shadow = 930;
+const xml_token_t XML_shadowcolor = 931;
+const xml_token_t XML_shadowok = 932;
+const xml_token_t XML_shape = 933;
+const xml_token_t XML_shapedefaults = 934;
+const xml_token_t XML_shapelayout = 935;
+const xml_token_t XML_shapetype = 936;
+const xml_token_t XML_shininess = 937;
+const xml_token_t XML_singleclick = 938;
+const xml_token_t XML_size = 939;
+const xml_token_t XML_skew = 940;
+const xml_token_t XML_skewamt = 941;
+const xml_token_t XML_skewangle = 942;
+const xml_token_t XML_specularity = 943;
+const xml_token_t XML_spid = 944;
+const xml_token_t XML_spidmax = 945;
+const xml_token_t XML_spt = 946;
+const xml_token_t XML_src = 947;
+const xml_token_t XML_start = 948;
+const xml_token_t XML_startAngle = 949;
+const xml_token_t XML_startarrow = 950;
+const xml_token_t XML_startarrowlength = 951;
+const xml_token_t XML_startarrowwidth = 952;
+const xml_token_t XML_string = 953;
+const xml_token_t XML_stroke = 954;
+const xml_token_t XML_strokecolor = 955;
+const xml_token_t XML_stroked = 956;
+const xml_token_t XML_strokeok = 957;
+const xml_token_t XML_strokeweight = 958;
+const xml_token_t XML_style = 959;
+const xml_token_t XML_switch = 960;
+const xml_token_t XML_tablelimits = 961;
+const xml_token_t XML_tableproperties = 962;
+const xml_token_t XML_target = 963;
+const xml_token_t XML_targetscreensize = 964;
+const xml_token_t XML_text = 965;
+const xml_token_t XML_textborder = 966;
+const xml_token_t XML_textbox = 967;
+const xml_token_t XML_textboxrect = 968;
+const xml_token_t XML_textpath = 969;
+const xml_token_t XML_textpathok = 970;
+const xml_token_t XML_title = 971;
+const xml_token_t XML_to = 972;
+const xml_token_t XML_trim = 973;
+const xml_token_t XML_type = 974;
+const xml_token_t XML_url = 975;
+const xml_token_t XML_useExplicit = 976;
+const xml_token_t XML_userId = 977;
+const xml_token_t XML_userdrawn = 978;
+const xml_token_t XML_userhidden = 979;
+const xml_token_t XML_v = 980;
+const xml_token_t XML_verticies = 981;
+const xml_token_t XML_viewpoint = 982;
+const xml_token_t XML_viewpointorigin = 983;
+const xml_token_t XML_visible = 984;
+const xml_token_t XML_weight = 985;
+const xml_token_t XML_worksheetoptions = 986;
+const xml_token_t XML_wrapcoords = 987;
+const xml_token_t XML_xrange = 988;
+const xml_token_t XML_xscale = 989;
+const xml_token_t XML_yrange = 990;
diff --git a/src/liborcus/xls_xml_tokens.cpp b/src/liborcus/xls_xml_tokens.cpp
new file mode 100644
index 0000000..1ba9001
--- /dev/null
+++ b/src/liborcus/xls_xml_tokens.cpp
@@ -0,0 +1,21 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xls_xml_tokens.hpp"
+
+namespace orcus {
+
+namespace {
+
+#include "xls_xml_tokens.inl"
+
+}
+
+tokens xls_xml_tokens = tokens(token_names, token_name_count);
+
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xls_xml_tokens.hpp b/src/liborcus/xls_xml_tokens.hpp
new file mode 100644
index 0000000..0180db1
--- /dev/null
+++ b/src/liborcus/xls_xml_tokens.hpp
@@ -0,0 +1,20 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef ORCUS_XLS_XML_TOKENS_HPP
+#define ORCUS_XLS_XML_TOKENS_HPP
+
+#include "orcus/tokens.hpp"
+
+namespace orcus {
+
+extern tokens xls_xml_tokens;
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xls_xml_tokens.inl b/src/liborcus/xls_xml_tokens.inl
new file mode 100644
index 0000000..73cd1fc
--- /dev/null
+++ b/src/liborcus/xls_xml_tokens.inl
@@ -0,0 +1,997 @@
+// This file has been auto-generated. Do not hand-edit this.
+
+const char* token_names[] = {
+ "??", // 0
+ "AcceptLabelsInFormulas", // 1
+ "Action", // 2
+ "ActiveChart", // 3
+ "ActiveCol", // 4
+ "ActiveColumn", // 5
+ "ActivePane", // 6
+ "ActiveRow", // 7
+ "ActiveRows", // 8
+ "ActiveSheet", // 9
+ "Aggregate", // 10
+ "AlertVersion", // 11
+ "Alignment", // 12
+ "AllItemName", // 13
+ "AllowDeleteCols", // 14
+ "AllowDeleteRows", // 15
+ "AllowFilter", // 16
+ "AllowFormatCells", // 17
+ "AllowInsertCols", // 18
+ "AllowInsertHyperlinks", // 19
+ "AllowInsertRows", // 20
+ "AllowPNG", // 21
+ "AllowSizeCols", // 22
+ "AllowSizeRows", // 23
+ "AllowSort", // 24
+ "AllowUsePivotTables", // 25
+ "AlternateMethod", // 26
+ "AppName", // 27
+ "Append", // 28
+ "ApplyAutomaticOutlineStyles", // 29
+ "Area", // 30
+ "ArrayRange", // 31
+ "Async", // 32
+ "Attribute", // 33
+ "AttributeType", // 34
+ "Authentication", // 35
+ "Author", // 36
+ "AutoFilter", // 37
+ "AutoFilterAnd", // 38
+ "AutoFilterColumn", // 39
+ "AutoFilterCondition", // 40
+ "AutoFilterOr", // 41
+ "AutoFitHeight", // 42
+ "AutoFitWidth", // 43
+ "AutoFormatAlignment", // 44
+ "AutoFormatBorder", // 45
+ "AutoFormatFont", // 46
+ "AutoFormatName", // 47
+ "AutoFormatNumber", // 48
+ "AutoFormatPattern", // 49
+ "AutoFormatWidth", // 50
+ "AutoRepublish", // 51
+ "AutoShowCount", // 52
+ "AutoShowField", // 53
+ "AutoShowRange", // 54
+ "AutoShowType", // 55
+ "AutoSortField", // 56
+ "AutoSortOrder", // 57
+ "B", // 58
+ "BackgroundQuery", // 59
+ "BaseField", // 60
+ "BaseItem", // 61
+ "Basic", // 62
+ "Behavior", // 63
+ "Binding", // 64
+ "BlackAndWhite", // 65
+ "BlankLineAfterItems", // 66
+ "BlockTotal", // 67
+ "Bold", // 68
+ "Boolean", // 69
+ "Border", // 70
+ "Borders", // 71
+ "Bottom", // 72
+ "BoundField", // 73
+ "Bytes", // 74
+ "CacheDetails", // 75
+ "CacheFile", // 76
+ "CacheIndex", // 77
+ "CachePosition", // 78
+ "CalculatedMember", // 79
+ "Calculation", // 80
+ "CantGetUniqueItems", // 81
+ "Caption", // 82
+ "CaptionAlignment", // 83
+ "CaseSensitive", // 84
+ "Category", // 85
+ "Cell", // 86
+ "CellRangeList", // 87
+ "CellsExpanded", // 88
+ "CellsExpandedSeqNum", // 89
+ "CellsNotExpanded", // 90
+ "CenterHorizontal", // 91
+ "CenterVertical", // 92
+ "Cf", // 93
+ "CharSet", // 94
+ "Characters", // 95
+ "CharactersWithSpaces", // 96
+ "ClientParameter", // 97
+ "ClientParameterBinding", // 98
+ "ClientParameterBindings", // 99
+ "ClientParameterValue", // 100
+ "Clipped", // 101
+ "CodeName", // 102
+ "Col1", // 103
+ "Col10", // 104
+ "Col11", // 105
+ "Col12", // 106
+ "Col13", // 107
+ "Col14", // 108
+ "Col15", // 109
+ "Col16", // 110
+ "Col17", // 111
+ "Col18", // 112
+ "Col19", // 113
+ "Col2", // 114
+ "Col20", // 115
+ "Col3", // 116
+ "Col4", // 117
+ "Col5", // 118
+ "Col6", // 119
+ "Col7", // 120
+ "Col8", // 121
+ "Col9", // 122
+ "ColBreak", // 123
+ "ColBreaks", // 124
+ "ColFirst", // 125
+ "ColLast", // 126
+ "Color", // 127
+ "Column", // 128
+ "ColumnInfo", // 129
+ "ColumnInputCell", // 130
+ "ColumnName", // 131
+ "ComboHide", // 132
+ "Comma", // 133
+ "CommandText", // 134
+ "CommandTextOrignal", // 135
+ "CommandType", // 136
+ "Comment", // 137
+ "CommentsLayout", // 138
+ "Company", // 139
+ "ComponentOptions", // 140
+ "Condition", // 141
+ "ConditionalFormatting", // 142
+ "Connection", // 143
+ "ConnectionInfo", // 144
+ "ConnectionString", // 145
+ "Consecutive", // 146
+ "ConsolidationReference", // 147
+ "Count", // 148
+ "CountOfSameItems", // 149
+ "CreateBackup", // 150
+ "Created", // 151
+ "Credential", // 152
+ "CredentialBinding", // 153
+ "CredentialValue", // 154
+ "Crn", // 155
+ "CubeField", // 156
+ "CubeSource", // 157
+ "CurrentPage", // 158
+ "Custom", // 159
+ "CustomDocumentProperties", // 160
+ "Data", // 161
+ "DataAxisEmpty", // 162
+ "DataField", // 163
+ "DataMember", // 164
+ "DataSource", // 165
+ "DataTable", // 166
+ "DataType", // 167
+ "DataValidation", // 168
+ "DataValueEditing", // 169
+ "Date1904", // 170
+ "Decimal", // 171
+ "DefaultColumnWidth", // 172
+ "DefaultItem", // 173
+ "DefaultRowHeight", // 174
+ "DefaultValue", // 175
+ "DefaultVersion", // 176
+ "DeletedTitle", // 177
+ "Delimiters", // 178
+ "Descending", // 179
+ "Description", // 180
+ "DetailFormat", // 181
+ "DetailMaxHeight", // 182
+ "DetailMaxWidth", // 183
+ "DetailRowHeight", // 184
+ "DetailSortOrder", // 185
+ "DetailWidth", // 186
+ "Dimension", // 187
+ "DisableDateRecognition", // 188
+ "DisableDrillDown", // 189
+ "DisableEdit", // 190
+ "DisableFieldDialog", // 191
+ "DisableRefresh", // 192
+ "DisableWizard", // 193
+ "DisplayDrawingObjects", // 194
+ "DisplayEmptyMembers", // 195
+ "DisplayErrorString", // 196
+ "DisplayFieldList", // 197
+ "DisplayFormulas", // 198
+ "DisplayIn", // 199
+ "DisplayInkNotes", // 200
+ "DisplayPageBreak", // 201
+ "DisplayRightToLeft", // 202
+ "DivID", // 203
+ "DoNotCalculateBeforeSave", // 204
+ "DoNotDisplayColHeaders", // 205
+ "DoNotDisplayGridlines", // 206
+ "DoNotDisplayHeadings", // 207
+ "DoNotDisplayOutline", // 208
+ "DoNotDisplayRowHeaders", // 209
+ "DoNotDisplayZeros", // 210
+ "DoNotJoinDelimiters", // 211
+ "DoNotPersist", // 212
+ "DoNotPersistSort", // 213
+ "DoNotPersstAF", // 214
+ "DoNotPromptForFile", // 215
+ "DoNotSaveLinkValues", // 216
+ "DocumentProperties", // 217
+ "DontShowInFieldList", // 218
+ "DownloadComponents", // 219
+ "DraftQuality", // 220
+ "DrawAspect", // 221
+ "DrilledLevel", // 222
+ "DrilledMember", // 223
+ "EditWebPage", // 224
+ "ElementType", // 225
+ "EmbedSaveSmartTags", // 226
+ "EnableMultiplePageItems", // 227
+ "EnableRedirections", // 228
+ "EnableSelection", // 229
+ "Encode", // 230
+ "EntirePage", // 231
+ "Entry", // 232
+ "Error", // 233
+ "ErrorHide", // 234
+ "ErrorMessage", // 235
+ "ErrorString", // 236
+ "ErrorStyle", // 237
+ "ErrorTitle", // 238
+ "ExcelName", // 239
+ "ExcelType", // 240
+ "ExcelWorkbook", // 241
+ "ExcelWorksheetType", // 242
+ "Expanded", // 243
+ "ExpandedColumnCount", // 244
+ "ExpandedRowCount", // 245
+ "ExternName", // 246
+ "ExtraLeftColumns", // 247
+ "ExtraRightColumns", // 248
+ "Face", // 249
+ "Family", // 250
+ "Field", // 251
+ "FieldLabelFormat", // 252
+ "FieldListBottom", // 253
+ "FieldListLeft", // 254
+ "FieldListRight", // 255
+ "FieldListTop", // 256
+ "FieldStart", // 257
+ "FieldType", // 258
+ "File", // 259
+ "FileName", // 260
+ "FillDown", // 261
+ "Filled", // 262
+ "FilterCaption", // 263
+ "FilterMember", // 264
+ "FilterOn", // 265
+ "FirstVisibleSheet", // 266
+ "FitHeight", // 267
+ "FitToPage", // 268
+ "FitWidth", // 269
+ "Font", // 270
+ "FontName", // 271
+ "Footer", // 272
+ "Format", // 273
+ "FormatSettings", // 274
+ "FormatType", // 275
+ "Formula", // 276
+ "FormulaIndex", // 277
+ "FormulaV10", // 278
+ "FreezePanes", // 279
+ "FrozenNoSplit", // 280
+ "FullColumns", // 281
+ "FullRows", // 282
+ "Function", // 283
+ "FunctionGroup", // 284
+ "FunctionGroupIndex", // 285
+ "FuturePersist", // 286
+ "FutureVer", // 287
+ "GrandTotalString", // 288
+ "GridlineColor", // 289
+ "GridlineColorIndex", // 290
+ "Gridlines", // 291
+ "GroupBy", // 292
+ "GroupDefinition", // 293
+ "GroupEnd", // 294
+ "GroupEndAuto", // 295
+ "GroupLevel", // 296
+ "GroupMember", // 297
+ "GroupNumber", // 298
+ "GroupStart", // 299
+ "GroupStartAuto", // 300
+ "GroupType", // 301
+ "GroupedWidth", // 302
+ "Guid", // 303
+ "HRef", // 304
+ "HRefScreenTip", // 305
+ "HTMLFormat", // 306
+ "HTMLTables", // 307
+ "HasNoAutoFormat", // 308
+ "HasNoRecords", // 309
+ "Header", // 310
+ "HeaderRange", // 311
+ "HeaderRow", // 312
+ "Height", // 313
+ "Hidden", // 314
+ "HideDetail", // 315
+ "HideDropDowns", // 316
+ "HideFormula", // 317
+ "HideHorizontalScrollBar", // 318
+ "HideInactiveListBorder", // 319
+ "HideOfficeLogo", // 320
+ "HidePivotTableFieldList", // 321
+ "HideTotalsAnnotation", // 322
+ "HideVerticalScrollBar", // 323
+ "HideWorkbookTabs", // 324
+ "Horizontal", // 325
+ "HorizontalResolution", // 326
+ "Href", // 327
+ "HtmlType", // 328
+ "HyperlinkBase", // 329
+ "I", // 330
+ "ID", // 331
+ "IMEMode", // 332
+ "Id", // 333
+ "IdWrapped", // 334
+ "If", // 335
+ "ImmediateItemsOnDrop", // 336
+ "Indent", // 337
+ "Index", // 338
+ "IndividualCellBorders", // 339
+ "InputHide", // 340
+ "InputMessage", // 341
+ "InputTitle", // 342
+ "InsertEntireRows", // 343
+ "InstanceShape", // 344
+ "Interior", // 345
+ "IntlMacro", // 346
+ "Invalid", // 347
+ "InvertedColumnMember", // 348
+ "InvertedRowMember", // 349
+ "IsGroupLevel", // 350
+ "IsMemberProperty", // 351
+ "IsNotFiltered", // 352
+ "Italic", // 353
+ "Item", // 354
+ "ItemType", // 355
+ "Iteration", // 356
+ "KeyboardShortcut", // 357
+ "Keywords", // 358
+ "Label", // 359
+ "LastAuthor", // 360
+ "LastPrinted", // 361
+ "LastSaved", // 362
+ "Layout", // 363
+ "LayoutForm", // 364
+ "LayoutPageBreak", // 365
+ "LayoutSubtotalLocation", // 366
+ "LeafColumnMember", // 367
+ "LeafRowMember", // 368
+ "Left", // 369
+ "LeftCell", // 370
+ "LeftColumnRightPane", // 371
+ "LeftColumnVisible", // 372
+ "LeftToRight", // 373
+ "LengthLevelUniqueName", // 374
+ "Level", // 375
+ "LineStyle", // 376
+ "Lines", // 377
+ "LoadMode", // 378
+ "LocalConnection", // 379
+ "Location", // 380
+ "LocationOfComponents", // 381
+ "Macro", // 382
+ "MainFile", // 383
+ "Maintain", // 384
+ "MajorVersion", // 385
+ "Manager", // 386
+ "Map", // 387
+ "MapChildItems", // 388
+ "MapID", // 389
+ "MapInfo", // 390
+ "Mapdata", // 391
+ "Margin", // 392
+ "Max", // 393
+ "MaxChange", // 394
+ "MaxHeight", // 395
+ "MaxIterations", // 396
+ "MaxWidth", // 397
+ "Measure", // 398
+ "Member", // 399
+ "MemberExpand", // 400
+ "MemberFormat", // 401
+ "MemberName", // 402
+ "MemberPropertiesOrder", // 403
+ "MemberProperty", // 404
+ "MemberPropertyParent", // 405
+ "MergeAcross", // 406
+ "MergeDown", // 407
+ "MergeLabels", // 408
+ "Min", // 409
+ "MinorVersion", // 410
+ "Missing", // 411
+ "MissingItemsLimit", // 412
+ "Moper", // 413
+ "MoveAfterReturn", // 414
+ "Name", // 415
+ "NamedCell", // 416
+ "NamedRange", // 417
+ "Names", // 418
+ "Namespace", // 419
+ "NewAsync", // 420
+ "NewItemsHidden", // 421
+ "NextId", // 422
+ "NextSheetNumber", // 423
+ "NoAutoFit", // 424
+ "NoAutoFormatWidth", // 425
+ "NoAutoPage", // 426
+ "NoAutoRecover", // 427
+ "NoAutofit", // 428
+ "NoColumnGrand", // 429
+ "NoDetailAutoFit", // 430
+ "NoDisplayNullString", // 431
+ "NoDragToColumn", // 432
+ "NoDragToData", // 433
+ "NoDragToHide", // 434
+ "NoDragToPage", // 435
+ "NoDragToRow", // 436
+ "NoInserts", // 437
+ "NoPreserveFormatting", // 438
+ "NoPrintRepeatItems", // 439
+ "NoPrinterInfo", // 440
+ "NoRefreshCache", // 441
+ "NoRowGrand", // 442
+ "NoSaveData", // 443
+ "NoSummaryColumnsRightDetail", // 444
+ "NoSummaryRowsBelowDetail", // 445
+ "NoTextToColumns", // 446
+ "NoTitles", // 447
+ "NoToggleDataHeader", // 448
+ "NoViewCalculatedMembers", // 449
+ "NonDefaultName", // 450
+ "NotInverted", // 451
+ "NotVisible", // 452
+ "NullString", // 453
+ "Number", // 454
+ "NumberFormat", // 455
+ "NumberOfCopies", // 456
+ "OLEObject", // 457
+ "OWCVersion", // 458
+ "ObjectID", // 459
+ "OfficeDocumentSettings", // 460
+ "OleLink", // 461
+ "Operator", // 462
+ "OptimizeCache", // 463
+ "Orientation", // 464
+ "Outline", // 465
+ "OverwriteCells", // 466
+ "PLCaption", // 467
+ "PLDataOrientation", // 468
+ "PLExport", // 469
+ "PLGroupType", // 470
+ "PLName", // 471
+ "PLPivotField", // 472
+ "PLPosition", // 473
+ "PLSubtotal", // 474
+ "PLTPivotItem", // 475
+ "PLTotal", // 476
+ "PTFormat", // 477
+ "PTFormula", // 478
+ "PTLineItem", // 479
+ "PTLineItems", // 480
+ "PTPivotData", // 481
+ "PTRule", // 482
+ "PTSource", // 483
+ "PageBreakZoom", // 484
+ "PageBreaks", // 485
+ "PageFieldOrder", // 486
+ "PageFieldStyle", // 487
+ "PageFieldWrapCount", // 488
+ "PageMargins", // 489
+ "PageSetup", // 490
+ "Pages", // 491
+ "Pane", // 492
+ "Panes", // 493
+ "PaperSizeIndex", // 494
+ "Paragraphs", // 495
+ "Parameter", // 496
+ "ParameterType", // 497
+ "ParameterValue", // 498
+ "Parent", // 499
+ "ParentField", // 500
+ "ParentIsOther", // 501
+ "ParentName", // 502
+ "ParentUniqueName", // 503
+ "ParseFormulaAsV10", // 504
+ "ParseRuleAsV10", // 505
+ "PasteFormula", // 506
+ "PasteRefersTo", // 507
+ "Path", // 508
+ "Pattern", // 509
+ "PatternColor", // 510
+ "PivotAxis", // 511
+ "PivotCache", // 512
+ "PivotField", // 513
+ "PivotItem", // 514
+ "PivotTable", // 515
+ "PivotView", // 516
+ "Position", // 517
+ "PrecisionAsDisplayed", // 518
+ "PresentationFormat", // 519
+ "Print", // 520
+ "PrintErrors", // 521
+ "PrintSetTitles", // 522
+ "ProgID", // 523
+ "PromptString", // 524
+ "ProtectContents", // 525
+ "ProtectObjects", // 526
+ "ProtectScenarios", // 527
+ "ProtectStructure", // 528
+ "ProtectWindows", // 529
+ "Protected", // 530
+ "Protection", // 531
+ "Proxy", // 532
+ "PublishObject", // 533
+ "PublishObjects", // 534
+ "Purpose", // 535
+ "QTSource", // 536
+ "Qualifier", // 537
+ "Query97", // 538
+ "QuerySource", // 539
+ "QueryTable", // 540
+ "QueryType", // 541
+ "Range", // 542
+ "RangeSelection", // 543
+ "ReadOnly", // 544
+ "ReadingOrder", // 545
+ "RefModeR1C1", // 546
+ "Reference", // 547
+ "RefersTo", // 548
+ "RefreshDate", // 549
+ "RefreshDateCopy", // 550
+ "RefreshInfo", // 551
+ "RefreshName", // 552
+ "RefreshOnChange", // 553
+ "RefreshOnFileOpen", // 554
+ "RefreshTimeSpan", // 555
+ "RefreshedInXl9", // 556
+ "Resource", // 557
+ "Revision", // 558
+ "Right", // 559
+ "RightToLeft", // 560
+ "RobustConnect", // 561
+ "RootElement", // 562
+ "Rotate", // 563
+ "Rotation", // 564
+ "Row", // 565
+ "RowBreak", // 566
+ "RowBreaks", // 567
+ "RowColHeadings", // 568
+ "RowInputCell", // 569
+ "RowLast", // 570
+ "RowNumbers", // 571
+ "Rule", // 572
+ "RuleType", // 573
+ "RuleV10", // 574
+ "S", // 575
+ "SOAPAction", // 576
+ "SQLType", // 577
+ "Scale", // 578
+ "Schema", // 579
+ "SchemaID", // 580
+ "SchemaRef", // 581
+ "Selected", // 582
+ "SelectedSheets", // 583
+ "Selection", // 584
+ "SelectionNamespaces", // 585
+ "SemiColon", // 586
+ "SeqNum", // 587
+ "Sequence", // 588
+ "ServerBased", // 589
+ "ServerSortOrder", // 590
+ "Set", // 591
+ "Shadow", // 592
+ "ShapeID", // 593
+ "SheetIndex", // 594
+ "SheetName", // 595
+ "ShowAllItems", // 596
+ "ShowAlways", // 597
+ "ShowCellBackgroundFromOLAP", // 598
+ "ShowImportExportValidationErrors", // 599
+ "ShowPageBreakZoom", // 600
+ "ShowPageMultipleItemLabel", // 601
+ "ShowTotals", // 602
+ "ShrinkToFit", // 603
+ "Size", // 604
+ "SmallGrid", // 605
+ "SmartTagType", // 606
+ "SmartTags", // 607
+ "SolveOrder", // 608
+ "Sort", // 609
+ "SortKey", // 610
+ "SortOrder", // 611
+ "Sorting", // 612
+ "Source", // 613
+ "SourceConnectionFile", // 614
+ "SourceConsolidation", // 615
+ "SourceDataFile", // 616
+ "SourceHierarchy", // 617
+ "SourceHierarchyLevel", // 618
+ "SourceName", // 619
+ "SourceType", // 620
+ "Space", // 621
+ "SpaceAbove", // 622
+ "SpaceBelow", // 623
+ "Span", // 624
+ "SplitHorizontal", // 625
+ "SplitVertical", // 626
+ "SpreadsheetAutoFit", // 627
+ "StandardWidth", // 628
+ "StartPageNumber", // 629
+ "StartRow", // 630
+ "StrikeThrough", // 631
+ "Style", // 632
+ "StyleID", // 633
+ "Styles", // 634
+ "Sub", // 635
+ "SubType", // 636
+ "Subject", // 637
+ "Subtotal", // 638
+ "SubtotalFormat", // 639
+ "SubtotalHiddenPageItems", // 640
+ "SubtotalName", // 641
+ "Sup", // 642
+ "SupBook", // 643
+ "Synchronous", // 644
+ "Tab", // 645
+ "TabColorIndex", // 646
+ "TabRatio", // 647
+ "Table", // 648
+ "TableStyle", // 649
+ "Tag", // 650
+ "Text", // 651
+ "TextQualifier", // 652
+ "TextWizardSettings", // 653
+ "ThousandSeparator", // 654
+ "Ticked", // 655
+ "Title", // 656
+ "Toolbar", // 657
+ "TooltipInfo", // 658
+ "Top", // 659
+ "TopCell", // 660
+ "TopRowBottomPane", // 661
+ "TopRowVisible", // 662
+ "TotalAlignment", // 663
+ "TotalAllMembers", // 664
+ "TotalCaptionAlignment", // 665
+ "TotalFormat", // 666
+ "TotalTime", // 667
+ "TotalWidth", // 668
+ "TransitionExpressionEvaluation", // 669
+ "TransitionFormulaEntry", // 670
+ "Type", // 671
+ "U", // 672
+ "URLString", // 673
+ "Uncalced", // 674
+ "Underline", // 675
+ "UniqueName", // 676
+ "Unsynced", // 677
+ "UseBlank", // 678
+ "UseLocalConnection", // 679
+ "UseSameSettings", // 680
+ "User", // 681
+ "VMLFrame", // 682
+ "VacatedStyle", // 683
+ "ValidPrinterInfo", // 684
+ "Value", // 685
+ "Value1", // 686
+ "Value2", // 687
+ "Version", // 688
+ "VersionLastEdit", // 689
+ "VersionLastRefresh", // 690
+ "VersionLastUpdate", // 691
+ "VersionRefreshableMin", // 692
+ "VersionUpdateableMin", // 693
+ "Vertical", // 694
+ "VerticalAlign", // 695
+ "VerticalResolution", // 696
+ "VerticalText", // 697
+ "ViewableRange", // 698
+ "Visible", // 699
+ "VisualTotals", // 700
+ "WantAdvise", // 701
+ "WantPict", // 702
+ "Watch", // 703
+ "Watches", // 704
+ "WebPostString", // 705
+ "Weight", // 706
+ "Width", // 707
+ "WindowHeight", // 708
+ "WindowHidden", // 709
+ "WindowIconic", // 710
+ "WindowTopX", // 711
+ "WindowTopY", // 712
+ "WindowWidth", // 713
+ "Windows", // 714
+ "Words", // 715
+ "Workbook", // 716
+ "WorkbookOptions", // 717
+ "Worksheet", // 718
+ "WorksheetOptions", // 719
+ "WorksheetSource", // 720
+ "WrapText", // 721
+ "XPath", // 722
+ "XSDType", // 723
+ "Xct", // 724
+ "ZeroHeight", // 725
+ "Zoom", // 726
+ "accentbar", // 727
+ "adj", // 728
+ "adjusthandles", // 729
+ "alignshape", // 730
+ "allowincell", // 731
+ "allowoverlap", // 732
+ "alt", // 733
+ "althref", // 734
+ "angle", // 735
+ "arc", // 736
+ "arcsize", // 737
+ "arrowok", // 738
+ "aspect", // 739
+ "aspectratio", // 740
+ "attribute", // 741
+ "autorotationcenter", // 742
+ "backdepth", // 743
+ "background", // 744
+ "bilevel", // 745
+ "blacklevel", // 746
+ "borderbottomcolor", // 747
+ "borderleftcolor", // 748
+ "borderrightcolor", // 749
+ "bordertopcolor", // 750
+ "brightness", // 751
+ "bullet", // 752
+ "button", // 753
+ "bwmode", // 754
+ "bwnormal", // 755
+ "bwpure", // 756
+ "callout", // 757
+ "caption", // 758
+ "chromakey", // 759
+ "class", // 760
+ "clip", // 761
+ "color", // 762
+ "color2", // 763
+ "colormenu", // 764
+ "colormode", // 765
+ "colormru", // 766
+ "colors", // 767
+ "complex", // 768
+ "connectangles", // 769
+ "connectloc", // 770
+ "connectlocs", // 771
+ "connectortype", // 772
+ "connecttype", // 773
+ "content", // 774
+ "control1", // 775
+ "control2", // 776
+ "coordorigin", // 777
+ "coordsize", // 778
+ "cropbottom", // 779
+ "cropleft", // 780
+ "cropping", // 781
+ "cropright", // 782
+ "croptop", // 783
+ "curve", // 784
+ "dashstyle", // 785
+ "data", // 786
+ "datatype", // 787
+ "detectmouseclick", // 788
+ "diffusity", // 789
+ "displaycustomheaders", // 790
+ "distance", // 791
+ "doubleclicknotify", // 792
+ "drop", // 793
+ "dropauto", // 794
+ "dt", // 795
+ "edge", // 796
+ "editas", // 797
+ "embosscolor", // 798
+ "end", // 799
+ "endAngle", // 800
+ "endarrow", // 801
+ "endarrowlength", // 802
+ "endarrowwidth", // 803
+ "endcap", // 804
+ "entry", // 805
+ "eqn", // 806
+ "ext", // 807
+ "extends", // 808
+ "extrusion", // 809
+ "extrusioncolor", // 810
+ "extrusionok", // 811
+ "f", // 812
+ "facet", // 813
+ "fill", // 814
+ "fillcolor", // 815
+ "filled", // 816
+ "fillok", // 817
+ "filltype", // 818
+ "fitpath", // 819
+ "fitshape", // 820
+ "focus", // 821
+ "focusposition", // 822
+ "focussize", // 823
+ "forcedash", // 824
+ "foredepth", // 825
+ "formulas", // 826
+ "from", // 827
+ "gain", // 828
+ "gamma", // 829
+ "gap", // 830
+ "gradientshapeok", // 831
+ "grayscale", // 832
+ "group", // 833
+ "grouping", // 834
+ "h", // 835
+ "handles", // 836
+ "hidden", // 837
+ "how", // 838
+ "hr", // 839
+ "hralign", // 840
+ "href", // 841
+ "hrheight", // 842
+ "hrnoshade", // 843
+ "hrpct", // 844
+ "hrstd", // 845
+ "hrwidth", // 846
+ "id", // 847
+ "idmap", // 848
+ "idref", // 849
+ "image", // 850
+ "imagealignshape", // 851
+ "imageaspect", // 852
+ "imagedata", // 853
+ "imagesize", // 854
+ "inset", // 855
+ "insetmode", // 856
+ "invx", // 857
+ "invy", // 858
+ "joinstyle", // 859
+ "length", // 860
+ "lengthspecified", // 861
+ "lightface", // 862
+ "lightharsh", // 863
+ "lightharsh2", // 864
+ "lightlevel", // 865
+ "lightlevel2", // 866
+ "lightposition", // 867
+ "lightposition2", // 868
+ "limo", // 869
+ "line", // 870
+ "linestyle", // 871
+ "lock", // 872
+ "lockrotationcenter", // 873
+ "map", // 874
+ "master", // 875
+ "matrix", // 876
+ "maxLength", // 877
+ "metal", // 878
+ "method", // 879
+ "minusx", // 880
+ "minusy", // 881
+ "miterlimit", // 882
+ "movie", // 883
+ "name", // 884
+ "namespaceuri", // 885
+ "new", // 886
+ "obscured", // 887
+ "offset", // 888
+ "offset2", // 889
+ "old", // 890
+ "ole", // 891
+ "oleicon", // 892
+ "oleid", // 893
+ "on", // 894
+ "oned", // 895
+ "onmouseover", // 896
+ "opacity", // 897
+ "opacity2", // 898
+ "orientation", // 899
+ "orientationangle", // 900
+ "origin", // 901
+ "oval", // 902
+ "password", // 903
+ "path", // 904
+ "phonetictext", // 905
+ "plane", // 906
+ "points", // 907
+ "polar", // 908
+ "polyline", // 909
+ "position", // 910
+ "preferrelative", // 911
+ "print", // 912
+ "proxy", // 913
+ "r", // 914
+ "radiusrange", // 915
+ "rect", // 916
+ "regroupid", // 917
+ "regrouptable", // 918
+ "relativeposition", // 919
+ "render", // 920
+ "rotation", // 921
+ "rotationangle", // 922
+ "rotationcenter", // 923
+ "roundrect", // 924
+ "row", // 925
+ "ruleinitiator", // 926
+ "ruleproxy", // 927
+ "rules", // 928
+ "selection", // 929
+ "shadow", // 930
+ "shadowcolor", // 931
+ "shadowok", // 932
+ "shape", // 933
+ "shapedefaults", // 934
+ "shapelayout", // 935
+ "shapetype", // 936
+ "shininess", // 937
+ "singleclick", // 938
+ "size", // 939
+ "skew", // 940
+ "skewamt", // 941
+ "skewangle", // 942
+ "specularity", // 943
+ "spid", // 944
+ "spidmax", // 945
+ "spt", // 946
+ "src", // 947
+ "start", // 948
+ "startAngle", // 949
+ "startarrow", // 950
+ "startarrowlength", // 951
+ "startarrowwidth", // 952
+ "string", // 953
+ "stroke", // 954
+ "strokecolor", // 955
+ "stroked", // 956
+ "strokeok", // 957
+ "strokeweight", // 958
+ "style", // 959
+ "switch", // 960
+ "tablelimits", // 961
+ "tableproperties", // 962
+ "target", // 963
+ "targetscreensize", // 964
+ "text", // 965
+ "textborder", // 966
+ "textbox", // 967
+ "textboxrect", // 968
+ "textpath", // 969
+ "textpathok", // 970
+ "title", // 971
+ "to", // 972
+ "trim", // 973
+ "type", // 974
+ "url", // 975
+ "useExplicit", // 976
+ "userId", // 977
+ "userdrawn", // 978
+ "userhidden", // 979
+ "v", // 980
+ "verticies", // 981
+ "viewpoint", // 982
+ "viewpointorigin", // 983
+ "visible", // 984
+ "weight", // 985
+ "worksheetoptions", // 986
+ "wrapcoords", // 987
+ "xrange", // 988
+ "xscale", // 989
+ "yrange" // 990
+};
+
+size_t token_name_count = 991;
diff --git a/src/liborcus/xlsx_autofilter_context.cpp b/src/liborcus/xlsx_autofilter_context.cpp
new file mode 100644
index 0000000..7a4d5ab
--- /dev/null
+++ b/src/liborcus/xlsx_autofilter_context.cpp
@@ -0,0 +1,140 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xlsx_autofilter_context.hpp"
+#include "xml_context_global.hpp"
+#include "ooxml_namespace_types.hpp"
+#include "ooxml_token_constants.hpp"
+
+#include "orcus/spreadsheet/import_interface.hpp"
+
+#include <iostream>
+
+using namespace std;
+
+namespace orcus {
+
+xlsx_autofilter_context::xlsx_autofilter_context(
+ session_context& session_cxt, const tokens& tokens,
+ spreadsheet::iface::import_reference_resolver& resolver) :
+ xml_context_base(session_cxt, tokens),
+ m_resolver(resolver),
+ m_cur_col(-1) {}
+
+xlsx_autofilter_context::~xlsx_autofilter_context() {}
+
+xml_context_base* xlsx_autofilter_context::create_child_context(xmlns_id_t /*ns*/, xml_token_t /*name*/)
+{
+ return nullptr;
+}
+
+void xlsx_autofilter_context::end_child_context(
+ xmlns_id_t /*ns*/, xml_token_t /*name*/, xml_context_base* /*child*/)
+{
+}
+
+void xlsx_autofilter_context::start_element(xmlns_id_t ns, xml_token_t name, const xml_token_attrs_t& attrs)
+{
+ xml_token_pair_t parent = push_stack(ns, name);
+
+ if (ns != NS_ooxml_xlsx)
+ return;
+
+ switch (name)
+ {
+ case XML_autoFilter:
+ {
+ xml_element_expected(parent, XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN);
+ m_ref_range = for_each(
+ attrs.begin(), attrs.end(),
+ single_attr_getter(m_pool, NS_ooxml_xlsx, XML_ref)).get_value();
+ }
+ break;
+ case XML_filterColumn:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_autoFilter);
+ m_cur_col = for_each(
+ attrs.begin(), attrs.end(),
+ single_long_attr_getter(NS_ooxml_xlsx, XML_colId)).get_value();
+ }
+ break;
+ case XML_filters:
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_filterColumn);
+ break;
+ case XML_filter:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_filters);
+ std::string_view val = for_each(
+ attrs.begin(), attrs.end(),
+ single_attr_getter(m_pool, NS_ooxml_xlsx, XML_val)).get_value();
+ if (!val.empty())
+ m_cur_match_values.push_back(val);
+ }
+ break;
+ default:
+ warn_unhandled();
+ }
+}
+
+bool xlsx_autofilter_context::end_element(xmlns_id_t ns, xml_token_t name)
+{
+ if (ns == NS_ooxml_xlsx)
+ {
+ switch (name)
+ {
+ case XML_filterColumn:
+ {
+ if (m_cur_col >= 0)
+ {
+ m_column_filters.insert(
+ column_filters_type::value_type(m_cur_col, m_cur_match_values));
+ }
+ m_cur_col = -1;
+ m_cur_match_values.clear();
+ }
+ break;
+ default:
+ ;
+ }
+ }
+ return pop_stack(ns, name);
+}
+
+void xlsx_autofilter_context::characters(std::string_view /*str*/, bool /*transient*/)
+{
+}
+
+void xlsx_autofilter_context::push_to_model(spreadsheet::iface::import_auto_filter& af) const
+{
+ spreadsheet::src_range_t range = m_resolver.resolve_range(m_ref_range);
+ af.set_range(to_rc_range(range));
+
+ for (const auto& v : m_column_filters)
+ {
+ spreadsheet::col_t col = v.first;
+ const match_values_type& match_values = v.second;
+
+ af.set_column(col);
+ for (std::string_view value : match_values)
+ af.append_column_match_value(value);
+ af.commit_column();
+ }
+ af.commit();
+}
+
+void xlsx_autofilter_context::reset()
+{
+ m_pool.clear();
+ m_ref_range = std::string_view{};
+ m_cur_col = -1;
+ m_cur_match_values.clear();
+ m_column_filters.clear();
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xlsx_autofilter_context.hpp b/src/liborcus/xlsx_autofilter_context.hpp
new file mode 100644
index 0000000..27f5e7b
--- /dev/null
+++ b/src/liborcus/xlsx_autofilter_context.hpp
@@ -0,0 +1,64 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef ORCUS_XLSX_AUTOFILTER_CONTEXT_HPP
+#define ORCUS_XLSX_AUTOFILTER_CONTEXT_HPP
+
+#include "xml_context_base.hpp"
+#include "orcus/string_pool.hpp"
+#include "orcus/spreadsheet/types.hpp"
+
+#include <vector>
+#include <map>
+
+namespace orcus {
+
+namespace spreadsheet { namespace iface {
+
+class import_auto_filter;
+class import_reference_resolver;
+
+}}
+
+class xlsx_autofilter_context : public xml_context_base
+{
+public:
+ typedef std::vector<std::string_view> match_values_type;
+ typedef std::map<spreadsheet::col_t, match_values_type> column_filters_type;
+
+ xlsx_autofilter_context(
+ session_context& session_cxt, const tokens& tokens,
+ spreadsheet::iface::import_reference_resolver& resolver);
+ virtual ~xlsx_autofilter_context();
+
+ virtual xml_context_base* create_child_context(xmlns_id_t ns, xml_token_t name);
+ virtual void end_child_context(xmlns_id_t ns, xml_token_t name, xml_context_base* child);
+
+ virtual void start_element(xmlns_id_t ns, xml_token_t name, const xml_token_attrs_t& attrs);
+ virtual bool end_element(xmlns_id_t ns, xml_token_t name);
+ virtual void characters(std::string_view str, bool transient);
+
+ void push_to_model(spreadsheet::iface::import_auto_filter& af) const;
+
+ void reset();
+
+private:
+ spreadsheet::iface::import_reference_resolver& m_resolver;
+
+ string_pool m_pool;
+
+ std::string_view m_ref_range;
+ spreadsheet::col_t m_cur_col;
+ match_values_type m_cur_match_values;
+ column_filters_type m_column_filters;
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xlsx_conditional_format_context.cpp b/src/liborcus/xlsx_conditional_format_context.cpp
new file mode 100644
index 0000000..e667d83
--- /dev/null
+++ b/src/liborcus/xlsx_conditional_format_context.cpp
@@ -0,0 +1,878 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xlsx_conditional_format_context.hpp"
+#include "xlsx_helper.hpp"
+#include "xlsx_types.hpp"
+#include "ooxml_token_constants.hpp"
+#include "ooxml_namespace_types.hpp"
+
+#include "orcus/exception.hpp"
+#include "orcus/spreadsheet/import_interface.hpp"
+#include "orcus/measurement.hpp"
+
+#include <mdds/sorted_string_map.hpp>
+#include <mdds/global.hpp>
+
+namespace ss = orcus::spreadsheet;
+
+namespace orcus {
+
+namespace {
+
+enum xlsx_cond_format_type
+{
+ none = 0,
+ expression,
+ cellIs,
+ colorScale,
+ dataBar,
+ iconSet,
+ top10,
+ uniqueValues,
+ duplicateValues,
+ containsText,
+ notContainsText,
+ beginsWith,
+ endsWith,
+ containsBlanks,
+ notContainsBlanks,
+ containsErrors,
+ notContainsErrors,
+ timePeriod,
+ aboveAverage
+};
+
+enum xlsx_cond_format_operator
+{
+ operator_default = 0,
+ operator_beginsWith,
+ operator_between,
+ operator_containsText,
+ operator_endsWith,
+ operator_equal,
+ operator_greaterThan,
+ operator_greaterThanOrEqual,
+ operator_lessThan,
+ operator_lessThanOrEqual,
+ operator_notBetween,
+ operator_notContains,
+ operator_notEqual
+};
+
+enum xlsx_cond_format_date
+{
+ date_default = 0,
+ date_last7Days,
+ date_lastMonth,
+ date_lastWeek,
+ date_nextMonth,
+ date_thisMonth,
+ date_thisWeek,
+ date_today,
+ date_tomorrow,
+ date_yesterday
+};
+
+enum xlsx_cond_format_boolean
+{
+ boolean_default = 0,
+ boolean_true,
+ boolean_false
+};
+
+typedef mdds::sorted_string_map<xlsx_cond_format_type> cond_format_type_map;
+
+typedef mdds::sorted_string_map<xlsx_cond_format_boolean> cond_format_boolean_map;
+
+typedef mdds::sorted_string_map<xlsx_cond_format_operator> cond_format_operator_map;
+
+typedef mdds::sorted_string_map<xlsx_cond_format_date> cond_format_date_map;
+
+cond_format_type_map::entry cond_format_type_entries[] =
+{
+ { MDDS_ASCII("aboveAverage"), aboveAverage },
+ { MDDS_ASCII("beginsWith"), beginsWith },
+ { MDDS_ASCII("cellIs"), cellIs },
+ { MDDS_ASCII("colorScale"), colorScale },
+ { MDDS_ASCII("containsBlanks"), containsBlanks },
+ { MDDS_ASCII("containsErrors"), containsErrors },
+ { MDDS_ASCII("containsText"), containsText },
+ { MDDS_ASCII("dataBar"), dataBar },
+ { MDDS_ASCII("duplicateValues"), duplicateValues },
+ { MDDS_ASCII("endsWith"), endsWith },
+ { MDDS_ASCII("expression"), expression },
+ { MDDS_ASCII("iconSet"), iconSet },
+ { MDDS_ASCII("notContainsErrors"), notContainsErrors },
+ { MDDS_ASCII("notContainsText"), notContainsText },
+ { MDDS_ASCII("timePeriod"), timePeriod },
+ { MDDS_ASCII("top10"), top10 },
+ { MDDS_ASCII("uniqueValues"), uniqueValues }
+};
+
+cond_format_operator_map::entry cond_format_operator_entries[] =
+{
+ { MDDS_ASCII("beginsWith"), operator_beginsWith },
+ { MDDS_ASCII("between"), operator_between },
+ { MDDS_ASCII("containsText"), operator_containsText },
+ { MDDS_ASCII("endsWith"), operator_endsWith },
+ { MDDS_ASCII("equal"), operator_equal },
+ { MDDS_ASCII("greaterThan"), operator_greaterThan },
+ { MDDS_ASCII("greaterThanOrEqual"), operator_greaterThanOrEqual },
+ { MDDS_ASCII("lessThan"), operator_lessThan },
+ { MDDS_ASCII("lessThanOrEqual"), operator_lessThanOrEqual },
+ { MDDS_ASCII("notBetween"), operator_notBetween },
+ { MDDS_ASCII("notContains"), operator_notContains },
+ { MDDS_ASCII("notEqual"), operator_notEqual }
+};
+
+cond_format_date_map::entry cond_format_date_entries[] =
+{
+ { MDDS_ASCII("last7Days"), date_last7Days },
+ { MDDS_ASCII("lastMonth"), date_lastMonth },
+ { MDDS_ASCII("lastWeek"), date_lastWeek },
+ { MDDS_ASCII("nextMonth"), date_nextMonth },
+ { MDDS_ASCII("thisMonth"), date_thisMonth },
+ { MDDS_ASCII("thisWeek"), date_thisWeek },
+ { MDDS_ASCII("today"), date_today },
+ { MDDS_ASCII("tomorrow"), date_tomorrow },
+ { MDDS_ASCII("yesterday"), date_yesterday }
+};
+
+cond_format_boolean_map::entry cond_format_boolean_entries[] =
+{
+ { MDDS_ASCII("0"), boolean_false },
+ { MDDS_ASCII("1"), boolean_true },
+ { MDDS_ASCII("false"), boolean_true },
+ { MDDS_ASCII("true"), boolean_false }
+};
+
+bool parse_boolean_flag(const xml_token_attr_t& attr, bool default_value)
+{
+ static const cond_format_boolean_map boolean_map(cond_format_boolean_entries, sizeof(cond_format_boolean_entries)/sizeof(cond_format_boolean_entries[0]), boolean_default);
+ xlsx_cond_format_boolean val = boolean_map.find(attr.value.data(), attr.value.size());
+ switch (val)
+ {
+ case boolean_default:
+ return default_value;
+ case boolean_true:
+ return true;
+ case boolean_false:
+ return false;
+ }
+
+ return default_value;
+}
+
+struct cfRule_attr_parser
+{
+
+ cfRule_attr_parser(ss::iface::import_conditional_format& cond_format):
+ m_cond_format(cond_format),
+ m_type(none),
+ m_operator(operator_default),
+ m_date(date_default),
+ m_above_average(true),
+ m_equal_average(false),
+ m_percent(false),
+ m_bottom(false)
+ {
+ }
+
+ void operator()(const xml_token_attr_t& attr)
+ {
+ switch(attr.name)
+ {
+ case XML_type:
+ {
+ cond_format_type_map type_map(cond_format_type_entries, sizeof(cond_format_type_entries)/sizeof(cond_format_type_entries[0]), none);
+ m_type = type_map.find(attr.value.data(), attr.value.size());
+ }
+ break;
+ case XML_dxfId:
+ {
+ // TODO: actually we need to translate between dxf id and xf id
+ size_t dxf_id = to_long(attr.value);
+ m_cond_format.set_xf_id(dxf_id);
+ }
+ break;
+ case XML_aboveAverage:
+ {
+ m_above_average = parse_boolean_flag(attr, true);
+ }
+ break;
+ case XML_percent:
+ m_percent = parse_boolean_flag(attr, false);
+ break;
+ case XML_bottom:
+ m_bottom = parse_boolean_flag(attr, false);
+ break;
+ case XML_operator:
+ {
+ cond_format_operator_map operator_map(cond_format_operator_entries, sizeof(cond_format_operator_entries)/sizeof(cond_format_operator_entries[0]), operator_default);
+ m_operator = operator_map.find(attr.value.data(), attr.value.size());
+ }
+ break;
+ case XML_text:
+ // do we need to worry about the transient flag here?
+ m_text = attr.value;
+ break;
+ case XML_timePeriod:
+ {
+ cond_format_date_map date_map(cond_format_date_entries, sizeof(cond_format_date_entries)/sizeof(cond_format_date_entries[0]), date_default);
+ m_date = date_map.find(attr.value.data(), attr.value.size());
+ }
+ break;
+ case XML_rank:
+ // do we need to worry about the transient flag here?
+ m_rank = attr.value;
+ break;
+ case XML_stdDev:
+ // do we need to worry about the transient flag here?
+ m_std_dev = attr.value;
+ break;
+ case XML_equalAverage:
+ m_equal_average = parse_boolean_flag(attr, false);
+ break;
+ default:
+ break;
+ }
+ }
+
+ void set_type()
+ {
+ switch (m_type)
+ {
+ case expression:
+ m_cond_format.set_type(ss::conditional_format_t::condition);
+ m_cond_format.set_operator(ss::condition_operator_t::expression);
+ break;
+ case cellIs:
+ m_cond_format.set_type(ss::conditional_format_t::condition);
+ m_cond_format.set_operator(ss::condition_operator_t::expression);
+ switch (m_operator)
+ {
+ case operator_beginsWith:
+ m_cond_format.set_operator(ss::condition_operator_t::begins_with);
+ break;
+ case operator_between:
+ m_cond_format.set_operator(ss::condition_operator_t::between);
+ break;
+ case operator_containsText:
+ m_cond_format.set_operator(ss::condition_operator_t::contains);
+ break;
+ case operator_endsWith:
+ m_cond_format.set_operator(ss::condition_operator_t::ends_with);
+ break;
+ case operator_equal:
+ m_cond_format.set_operator(ss::condition_operator_t::equal);
+ break;
+ case operator_greaterThan:
+ m_cond_format.set_operator(ss::condition_operator_t::greater);
+ break;
+ case operator_greaterThanOrEqual:
+ m_cond_format.set_operator(ss::condition_operator_t::greater_equal);
+ break;
+ case operator_lessThan:
+ m_cond_format.set_operator(ss::condition_operator_t::less);
+ break;
+ case operator_lessThanOrEqual:
+ m_cond_format.set_operator(ss::condition_operator_t::less_equal);
+ break;
+ case operator_notBetween:
+ m_cond_format.set_operator(ss::condition_operator_t::not_between);
+ break;
+ case operator_notContains:
+ m_cond_format.set_operator(ss::condition_operator_t::not_contains);
+ break;
+ case operator_notEqual:
+ m_cond_format.set_operator(ss::condition_operator_t::not_equal);
+ break;
+ default:
+ break;
+ }
+ break;
+ case colorScale:
+ m_cond_format.set_type(ss::conditional_format_t::colorscale);
+ break;
+ case dataBar:
+ m_cond_format.set_type(ss::conditional_format_t::databar);
+ break;
+ case iconSet:
+ m_cond_format.set_type(ss::conditional_format_t::iconset);
+ break;
+ case top10:
+ m_cond_format.set_type(ss::conditional_format_t::condition);
+ if (m_bottom)
+ {
+ m_cond_format.set_operator(ss::condition_operator_t::bottom_n);
+ }
+ else
+ {
+ m_cond_format.set_operator(ss::condition_operator_t::top_n);
+ }
+ m_cond_format.set_formula(m_rank);
+ break;
+ case uniqueValues:
+ m_cond_format.set_type(ss::conditional_format_t::condition);
+ m_cond_format.set_operator(ss::condition_operator_t::unique);
+ break;
+ case duplicateValues:
+ m_cond_format.set_type(ss::conditional_format_t::condition);
+ m_cond_format.set_operator(ss::condition_operator_t::duplicate);
+ break;
+ case containsText:
+ m_cond_format.set_type(ss::conditional_format_t::condition);
+ m_cond_format.set_operator(ss::condition_operator_t::contains);
+ m_cond_format.set_formula(m_text);
+ break;
+ case notContainsText:
+ m_cond_format.set_type(ss::conditional_format_t::condition);
+ m_cond_format.set_operator(ss::condition_operator_t::not_contains);
+ m_cond_format.set_formula(m_text);
+ break;
+ case beginsWith:
+ m_cond_format.set_type(ss::conditional_format_t::condition);
+ m_cond_format.set_operator(ss::condition_operator_t::begins_with);
+ m_cond_format.set_formula(m_text);
+ break;
+ case endsWith:
+ m_cond_format.set_type(ss::conditional_format_t::condition);
+ m_cond_format.set_operator(ss::condition_operator_t::ends_with);
+ m_cond_format.set_formula(m_text);
+ break;
+ case containsBlanks:
+ m_cond_format.set_type(ss::conditional_format_t::condition);
+ m_cond_format.set_operator(ss::condition_operator_t::contains_blanks);
+ break;
+ case containsErrors:
+ m_cond_format.set_type(ss::conditional_format_t::condition);
+ m_cond_format.set_operator(ss::condition_operator_t::contains_error);
+ break;
+ case notContainsErrors:
+ m_cond_format.set_type(ss::conditional_format_t::condition);
+ m_cond_format.set_operator(ss::condition_operator_t::contains_no_error);
+ break;
+ case timePeriod:
+ m_cond_format.set_type(ss::conditional_format_t::date);
+ switch (m_date)
+ {
+ case date_last7Days:
+ m_cond_format.set_date(ss::condition_date_t::last_7_days);
+ break;
+ case date_lastMonth:
+ m_cond_format.set_date(ss::condition_date_t::last_month);
+ break;
+ case date_lastWeek:
+ m_cond_format.set_date(ss::condition_date_t::last_week);
+ break;
+ case date_nextMonth:
+ m_cond_format.set_date(ss::condition_date_t::next_month);
+ break;
+ case date_thisMonth:
+ m_cond_format.set_date(ss::condition_date_t::this_month);
+ break;
+ case date_thisWeek:
+ m_cond_format.set_date(ss::condition_date_t::this_week);
+ break;
+ case date_today:
+ m_cond_format.set_date(ss::condition_date_t::today);
+ break;
+ case date_tomorrow:
+ m_cond_format.set_date(ss::condition_date_t::tomorrow);
+ break;
+ case date_yesterday:
+ m_cond_format.set_date(ss::condition_date_t::yesterday);
+ break;
+ default:
+ break;
+ }
+ break;
+ case aboveAverage:
+ m_cond_format.set_type(ss::conditional_format_t::condition);
+ if (!m_std_dev.empty())
+ {
+ // TODO: we need a way to mark that as std dev in the interfaces
+ m_cond_format.set_formula(m_std_dev);
+ }
+ if (m_above_average)
+ {
+ if (m_equal_average)
+ {
+ m_cond_format.set_operator(ss::condition_operator_t::above_equal_average);
+ }
+ else
+ {
+ m_cond_format.set_operator(ss::condition_operator_t::above_average);
+ }
+ }
+ else
+ {
+ if (m_equal_average)
+ {
+ m_cond_format.set_operator(ss::condition_operator_t::below_equal_average);
+ }
+ else
+ {
+ m_cond_format.set_operator(ss::condition_operator_t::below_average);
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+private:
+ ss::iface::import_conditional_format& m_cond_format;
+ xlsx_cond_format_type m_type;
+ xlsx_cond_format_operator m_operator;
+ xlsx_cond_format_date m_date;
+ bool m_above_average;
+ bool m_equal_average;
+ bool m_percent;
+ bool m_bottom;
+ std::string_view m_text;
+ std::string_view m_std_dev;
+ std::string_view m_rank;
+};
+
+struct conditional_formatting_attr_parser
+{
+ conditional_formatting_attr_parser(ss::iface::import_conditional_format* cond_format):
+ m_cond_format(cond_format)
+ {
+ }
+
+ void operator()(const xml_token_attr_t& attr)
+ {
+ switch (attr.name)
+ {
+ case XML_sqref:
+ m_cond_format->set_range(attr.value);
+ break;
+ }
+ }
+
+private:
+ ss::iface::import_conditional_format* m_cond_format;
+};
+
+enum xlsx_cond_format_cfvo_type
+{
+ cfvo_default = 0,
+ cfvo_num,
+ cfvo_percent,
+ cfvo_max,
+ cfvo_min,
+ cfvo_formula,
+ cfvo_percentile
+};
+
+typedef mdds::sorted_string_map<xlsx_cond_format_cfvo_type> cond_format_cfvo_type_map;
+
+cond_format_cfvo_type_map::entry cond_format_cfvo_entries[] =
+{
+ { MDDS_ASCII("num"), cfvo_num },
+ { MDDS_ASCII("percent"), cfvo_percent },
+ { MDDS_ASCII("max"), cfvo_max },
+ { MDDS_ASCII("min"), cfvo_min },
+ { MDDS_ASCII("formula"), cfvo_formula },
+ { MDDS_ASCII("percentile"), cfvo_percentile },
+};
+
+}
+
+struct cfvo_values
+{
+ cfvo_values():
+ m_include_equal(true),
+ m_type(cfvo_default)
+ {
+ }
+
+ bool m_include_equal;
+ xlsx_cond_format_cfvo_type m_type;
+ std::string_view m_value;
+};
+
+namespace {
+
+struct cfvo_attr_parser
+{
+ cfvo_attr_parser(string_pool& pool):
+ m_string_pool(pool)
+ {
+ }
+
+ void operator()(const xml_token_attr_t& attr)
+ {
+ switch (attr.name)
+ {
+ case XML_gte:
+ m_values.m_include_equal = parse_boolean_flag(attr, true);
+ break;
+ case XML_type:
+ {
+ cond_format_cfvo_type_map cfvo_type_map(cond_format_cfvo_entries, sizeof(cond_format_cfvo_entries)/sizeof(cond_format_cfvo_entries[0]), cfvo_default);
+ m_values.m_type = cfvo_type_map.find(attr.value.data(), attr.value.size());
+ }
+ break;
+ case XML_val:
+ if (attr.transient)
+ {
+ m_values.m_value = m_string_pool.intern(attr.value).first;
+ }
+ else
+ {
+ m_values.m_value = attr.value;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ cfvo_values get_values()
+ {
+ return m_values;
+ }
+
+private:
+ cfvo_values m_values;
+ string_pool& m_string_pool;
+};
+
+struct data_bar_attr_parser
+{
+ data_bar_attr_parser():
+ m_show_value(true),
+ m_min_length(10),
+ m_max_length(90)
+ {
+ }
+
+ void operator()(const xml_token_attr_t& attr)
+ {
+ switch (attr.name)
+ {
+ case XML_showValue:
+ m_show_value = parse_boolean_flag(attr, true);
+ break;
+ case XML_maxLength:
+ m_max_length = to_long(attr.value);
+ break;
+ case XML_minLength:
+ m_min_length = to_long(attr.value);
+ break;
+ default:
+ break;
+ }
+ }
+
+ void import_data(ss::iface::import_conditional_format& cond_format)
+ {
+ cond_format.set_show_value(m_show_value);
+ cond_format.set_min_databar_length(m_min_length);
+ cond_format.set_max_databar_length(m_max_length);
+ }
+
+private:
+ bool m_show_value;
+ size_t m_min_length;
+ size_t m_max_length;
+};
+
+struct icon_set_attr_parser
+{
+ icon_set_attr_parser():
+ m_reverse(false),
+ m_percent(true),
+ m_show_value(true),
+ icon_name("3Arrows")
+ {
+ }
+
+ void operator()(const xml_token_attr_t& attr)
+ {
+ switch (attr.name)
+ {
+ case XML_iconSet:
+ icon_name = attr.value;
+ break;
+ case XML_percent:
+ m_percent = parse_boolean_flag(attr, true);
+ break;
+ case XML_reverse:
+ m_reverse = parse_boolean_flag(attr, false);
+ break;
+ case XML_showValue:
+ m_show_value = parse_boolean_flag(attr, true);
+ break;
+ default:
+ break;
+ }
+ }
+
+ void import_data(ss::iface::import_conditional_format& cond_format)
+ {
+ cond_format.set_show_value(m_show_value);
+ cond_format.set_iconset_reverse(m_reverse);
+ cond_format.set_icon_name(icon_name);
+ }
+
+private:
+ bool m_reverse;
+ bool m_percent;
+ bool m_show_value;
+ std::string_view icon_name;
+};
+
+}
+
+xlsx_conditional_format_context::xlsx_conditional_format_context(
+ session_context& session_cxt, const tokens& tokens,
+ ss::iface::import_conditional_format* import_cond_format):
+ xml_context_base(session_cxt, tokens),
+ m_cond_format(import_cond_format)
+{
+}
+
+xlsx_conditional_format_context::~xlsx_conditional_format_context()
+{
+}
+
+xml_context_base* xlsx_conditional_format_context::create_child_context(xmlns_id_t /*ns*/, xml_token_t /*name*/)
+{
+ return nullptr;
+}
+
+void xlsx_conditional_format_context::end_child_context(xmlns_id_t /*ns*/, xml_token_t /*name*/, xml_context_base* /*child*/)
+{
+}
+
+void xlsx_conditional_format_context::start_element(xmlns_id_t ns, xml_token_t name, const xml_token_attrs_t& attrs)
+{
+ xml_token_pair_t parent = push_stack(ns, name);
+
+ switch (name)
+ {
+ case XML_conditionalFormatting:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_worksheet);
+ if (m_cond_format)
+ std::for_each(attrs.begin(), attrs.end(), conditional_formatting_attr_parser(m_cond_format));
+ break;
+ }
+ case XML_cfRule:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_conditionalFormatting);
+ if (m_cond_format)
+ {
+ cfRule_attr_parser parser = std::for_each(attrs.begin(), attrs.end(), cfRule_attr_parser(*m_cond_format));
+ parser.set_type();
+ }
+ break;
+ }
+ case XML_cfvo:
+ {
+ cfvo_attr_parser parser = std::for_each(attrs.begin(), attrs.end(), cfvo_attr_parser(m_pool));
+ m_cfvo_values.push_back(parser.get_values());
+ break;
+ }
+ case XML_dataBar:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_cfRule);
+ data_bar_attr_parser parser = std::for_each(attrs.begin(), attrs.end(), data_bar_attr_parser());
+ if (m_cond_format)
+ parser.import_data(*m_cond_format);
+ break;
+ }
+ case XML_iconSet:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_cfRule);
+ icon_set_attr_parser parser = std::for_each(attrs.begin(), attrs.end(), icon_set_attr_parser());
+ if (m_cond_format)
+ parser.import_data(*m_cond_format);
+ break;
+ }
+ case XML_color:
+ {
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ switch (attr.name)
+ {
+ case XML_rgb:
+ {
+ argb_color color;
+ if (to_rgb(attr.value, color.alpha, color.red, color.green, color.blue))
+ m_colors.push_back(color);
+ break;
+ }
+ default:
+ ;
+ }
+ }
+ break;
+ }
+ case XML_formula:
+ break;
+ case XML_colorScale:
+ break;
+ default:
+ warn_unhandled();
+ }
+}
+
+namespace {
+
+void import_cfvo(const cfvo_values& values, ss::iface::import_conditional_format& cond_format)
+{
+ if (!values.m_value.empty())
+ cond_format.set_formula(values.m_value);
+
+ switch (values.m_type)
+ {
+ case cfvo_num:
+ cond_format.set_condition_type(ss::condition_type_t::value);
+ break;
+ case cfvo_percent:
+ cond_format.set_condition_type(ss::condition_type_t::percent);
+ break;
+ case cfvo_max:
+ cond_format.set_condition_type(ss::condition_type_t::max);
+ break;
+ case cfvo_min:
+ cond_format.set_condition_type(ss::condition_type_t::min);
+ break;
+ case cfvo_formula:
+ cond_format.set_condition_type(ss::condition_type_t::formula);
+ break;
+ case cfvo_percentile:
+ cond_format.set_condition_type(ss::condition_type_t::percentile);
+ break;
+ default:;
+ }
+}
+
+}
+
+bool xlsx_conditional_format_context::end_element(xmlns_id_t ns, xml_token_t name)
+{
+ switch (name)
+ {
+ case XML_conditionalFormatting:
+ {
+ if (m_cond_format)
+ m_cond_format->commit_format();
+ break;
+ }
+ case XML_cfRule:
+ {
+ if (m_cond_format)
+ m_cond_format->commit_entry();
+ m_cfvo_values.clear();
+ m_colors.clear();
+ break;
+ }
+ case XML_cfvo:
+ break;
+ case XML_color:
+ break;
+ case XML_formula:
+ {
+ if (m_cond_format)
+ {
+ m_cond_format->set_formula(m_cur_str);
+ m_cond_format->commit_condition();
+ }
+ break;
+ }
+ case XML_dataBar:
+ {
+ if (m_colors.size() != 1)
+ throw general_error("invalid dataBar record");
+
+ if (m_cfvo_values.size() != 2)
+ throw general_error("invalid dataBar record");
+
+ if (m_cond_format)
+ {
+ argb_color& color = m_colors[0];
+ m_cond_format->set_databar_color_positive(color.alpha, color.red,
+ color.green, color.blue);
+ m_cond_format->set_databar_color_negative(color.alpha, color.red,
+ color.green, color.blue);
+
+ for (const auto& cfvo : m_cfvo_values)
+ {
+ import_cfvo(cfvo, *m_cond_format);
+ m_cond_format->commit_condition();
+ }
+ }
+ break;
+ }
+ case XML_iconSet:
+ {
+ if (m_cfvo_values.size() < 2)
+ throw general_error("invalid iconSet record");
+
+ if (m_cond_format)
+ {
+ for (const auto& cfvo : m_cfvo_values)
+ {
+ import_cfvo(cfvo, *m_cond_format);
+ m_cond_format->commit_condition();
+ }
+ }
+ break;
+ }
+ case XML_colorScale:
+ {
+ if (m_cfvo_values.size() < 2)
+ throw general_error("invalid colorScale record");
+
+ if (m_cfvo_values.size() != m_colors.size())
+ throw general_error("invalid colorScale record");
+
+ if (m_cond_format)
+ {
+ std::vector<argb_color>::const_iterator itrColor = m_colors.begin();
+ for (std::vector<cfvo_values>::const_iterator itr = m_cfvo_values.begin(); itr != m_cfvo_values.end(); ++itr, ++itrColor)
+ {
+ import_cfvo(*itr, *m_cond_format);
+ m_cond_format->set_color(itrColor->alpha, itrColor->red,
+ itrColor->green, itrColor->blue);
+ m_cond_format->commit_condition();
+ }
+ }
+ break;
+ }
+ }
+
+ m_cur_str = std::string_view{};
+ return pop_stack(ns, name);
+}
+
+void xlsx_conditional_format_context::characters(std::string_view str, bool transient)
+{
+ m_cur_str = str;
+ if (transient)
+ m_cur_str = m_pool.intern(m_cur_str).first;
+}
+
+void xlsx_conditional_format_context::reset()
+{
+ m_pool.clear();
+ m_cur_str = std::string_view{};
+ m_cfvo_values.clear();
+ m_colors.clear();
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xlsx_conditional_format_context.hpp b/src/liborcus/xlsx_conditional_format_context.hpp
new file mode 100644
index 0000000..f03d53d
--- /dev/null
+++ b/src/liborcus/xlsx_conditional_format_context.hpp
@@ -0,0 +1,68 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef ORCUS_XLSX_CONDITIONAL_FORMAT_CONTEXT_HPP
+#define ORCUS_XLSX_CONDITIONAL_FORMAT_CONTEXT_HPP
+
+#include "xml_context_base.hpp"
+#include "ooxml_types.hpp"
+#include "xlsx_types.hpp"
+
+#include "orcus/spreadsheet/types.hpp"
+#include "orcus/string_pool.hpp"
+
+namespace orcus {
+
+struct session_context;
+
+namespace spreadsheet { namespace iface {
+ class import_conditional_format;
+} }
+
+struct cfvo_values;
+
+struct argb_color
+{
+ spreadsheet::color_elem_t alpha;
+ spreadsheet::color_elem_t red;
+ spreadsheet::color_elem_t green;
+ spreadsheet::color_elem_t blue;
+};
+
+class xlsx_conditional_format_context : public xml_context_base
+{
+public:
+
+ xlsx_conditional_format_context(
+ session_context& session_cxt, const tokens& tokens,
+ spreadsheet::iface::import_conditional_format* import_cond_format);
+ virtual ~xlsx_conditional_format_context() override;
+
+ virtual xml_context_base* create_child_context(xmlns_id_t ns, xml_token_t name) override;
+ virtual void end_child_context(xmlns_id_t ns, xml_token_t name, xml_context_base* child) override;
+
+ virtual void start_element(xmlns_id_t ns, xml_token_t name, const xml_token_attrs_t& attrs) override;
+ virtual bool end_element(xmlns_id_t ns, xml_token_t name) override;
+ virtual void characters(std::string_view str, bool transient) override;
+
+ void reset();
+
+private:
+ spreadsheet::iface::import_conditional_format* m_cond_format;
+
+ string_pool m_pool;
+ std::string_view m_cur_str;
+
+ std::vector<cfvo_values> m_cfvo_values;
+ std::vector<argb_color> m_colors;
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xlsx_drawing_context.cpp b/src/liborcus/xlsx_drawing_context.cpp
new file mode 100644
index 0000000..606cd62
--- /dev/null
+++ b/src/liborcus/xlsx_drawing_context.cpp
@@ -0,0 +1,173 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xlsx_drawing_context.hpp"
+#include "ooxml_namespace_types.hpp"
+#include "ooxml_token_constants.hpp"
+#include "ooxml_global.hpp"
+
+#include "orcus/measurement.hpp"
+
+#include <iostream>
+
+using namespace std;
+
+namespace orcus {
+
+xlsx_drawing_context::xlsx_drawing_context(session_context& cxt, const tokens& tkns) :
+ xml_context_base(cxt, tkns),
+ m_col(-1), m_row(-1), m_col_offset(-1), m_row_offset(-1)
+{
+ init_ooxml_context(*this);
+}
+
+xlsx_drawing_context::~xlsx_drawing_context() {}
+
+xml_context_base* xlsx_drawing_context::create_child_context(xmlns_id_t /*ns*/, xml_token_t /*name*/)
+{
+ return nullptr;
+}
+
+void xlsx_drawing_context::end_child_context(xmlns_id_t /*ns*/, xml_token_t /*name*/, xml_context_base* /*child*/)
+{
+}
+
+void xlsx_drawing_context::start_element(xmlns_id_t ns, xml_token_t name, const::std::vector<xml_token_attr_t>& /*attrs*/)
+{
+ xml_token_pair_t parent = push_stack(ns, name);
+
+ if (ns == NS_ooxml_xdr)
+ {
+ switch (name)
+ {
+ case XML_oneCellAnchor:
+ case XML_twoCellAnchor:
+ {
+ xml_element_expected(parent, NS_ooxml_xdr, XML_wsDr);
+ reset();
+ break;
+ }
+ case XML_from:
+ case XML_sp:
+ case XML_clientData:
+ {
+ const xml_elem_set_t expected = {
+ { NS_ooxml_xdr, XML_absoluteAnchor },
+ { NS_ooxml_xdr, XML_grpSp },
+ { NS_ooxml_xdr, XML_oneCellAnchor },
+ { NS_ooxml_xdr, XML_twoCellAnchor },
+ };
+ xml_element_expected(parent, expected);
+ break;
+ }
+ case XML_to:
+ {
+ xml_element_expected(parent, NS_ooxml_xdr, XML_twoCellAnchor);
+ break;
+ }
+ case XML_col:
+ case XML_colOff:
+ case XML_row:
+ case XML_rowOff:
+ {
+ xml_elem_stack_t expected;
+ expected.emplace_back(NS_ooxml_xdr, XML_from);
+ expected.emplace_back(NS_ooxml_xdr, XML_to);
+ xml_element_expected(parent, expected);
+ break;
+ }
+ case XML_nvSpPr:
+ case XML_style:
+ case XML_txBody:
+ {
+ const xml_elem_stack_t expected = {
+ { NS_ooxml_xdr, XML_cxnSp },
+ { NS_ooxml_xdr, XML_sp },
+ };
+ xml_element_expected(parent, expected);
+ break;
+ }
+ case XML_spPr:
+ {
+ const xml_elem_stack_t expected = {
+ { NS_ooxml_xdr, XML_cxnSp },
+ { NS_ooxml_xdr, XML_sp },
+ { NS_ooxml_xdr, XML_pic },
+ };
+ xml_element_expected(parent, expected);
+ break;
+ }
+ default:
+ warn_unhandled();
+ }
+ }
+ else if (ns == NS_ooxml_a)
+ {
+ warn_unhandled();
+ }
+ else
+ warn_unhandled();
+}
+
+bool xlsx_drawing_context::end_element(xmlns_id_t ns, xml_token_t name)
+{
+ if (ns == NS_ooxml_xdr)
+ {
+ switch (name)
+ {
+ case XML_twoCellAnchor:
+ case XML_oneCellAnchor:
+ if (get_config().debug)
+ cout << "col: " << m_col << "; row: " << m_row << "; col offset: " << m_col_offset << "; row offset: " << m_row_offset << endl;
+ break;
+ default:
+ ;
+ }
+ }
+ else if (ns == NS_ooxml_a)
+ {
+
+ }
+ return pop_stack(ns, name);
+}
+
+void xlsx_drawing_context::characters(std::string_view str, bool /*transient*/)
+{
+ xml_token_pair_t elem = get_current_element();
+ if (elem.first == NS_ooxml_xdr)
+ {
+ switch (elem.second)
+ {
+ case XML_col:
+ m_col = to_long(str);
+ break;
+ case XML_row:
+ m_row = to_long(str);
+ break;
+ case XML_colOff:
+ m_col_offset = to_long(str);
+ break;
+ case XML_rowOff:
+ m_row_offset = to_long(str);
+ break;
+ default:
+ ;
+ }
+ }
+}
+
+void xlsx_drawing_context::reset()
+{
+ m_col = -1;
+ m_row = -1;
+ m_col_offset = -1;
+ m_row_offset = -1;
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xlsx_drawing_context.hpp b/src/liborcus/xlsx_drawing_context.hpp
new file mode 100644
index 0000000..5089326
--- /dev/null
+++ b/src/liborcus/xlsx_drawing_context.hpp
@@ -0,0 +1,48 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_XLSX_DRAWING_CONTEXT_HPP
+#define INCLUDED_ORCUS_XLSX_DRAWING_CONTEXT_HPP
+
+#include "xml_context_base.hpp"
+
+namespace orcus {
+
+struct session_context;
+class tokens;
+
+class xlsx_drawing_context : public xml_context_base
+{
+ long m_col;
+ long m_row;
+ long m_col_offset;
+ long m_row_offset;
+
+public:
+ xlsx_drawing_context(session_context& cxt, const tokens& tkns);
+
+ virtual ~xlsx_drawing_context();
+
+ virtual xml_context_base* create_child_context(xmlns_id_t ns, xml_token_t name);
+
+ virtual void end_child_context(xmlns_id_t ns, xml_token_t name, xml_context_base* child);
+
+ virtual void start_element(xmlns_id_t ns, xml_token_t name, const::std::vector<xml_token_attr_t>& attrs);
+
+ virtual bool end_element(xmlns_id_t ns, xml_token_t name);
+
+ virtual void characters(std::string_view str, bool transient);
+
+private:
+ void reset();
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xlsx_handler.cpp b/src/liborcus/xlsx_handler.cpp
new file mode 100644
index 0000000..e013bde
--- /dev/null
+++ b/src/liborcus/xlsx_handler.cpp
@@ -0,0 +1,76 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xlsx_handler.hpp"
+#include "xlsx_sheet_context.hpp"
+#include "xlsx_table_context.hpp"
+#include "xlsx_pivot_context.hpp"
+#include "xlsx_drawing_context.hpp"
+
+#include <iostream>
+
+using namespace std;
+
+namespace orcus {
+
+xlsx_sheet_xml_handler::xlsx_sheet_xml_handler(
+ session_context& session_cxt, const tokens& t,
+ spreadsheet::sheet_t sheet_id,
+ spreadsheet::iface::import_reference_resolver& resolver,
+ spreadsheet::iface::import_sheet& sheet) :
+ xml_stream_handler(session_cxt, t, std::make_unique<xlsx_sheet_context>(session_cxt, t, sheet_id, resolver, sheet))
+{
+}
+
+xlsx_sheet_xml_handler::~xlsx_sheet_xml_handler()
+{
+}
+
+void xlsx_sheet_xml_handler::pop_rel_extras(opc_rel_extras_t& other)
+{
+ xlsx_sheet_context& cxt = static_cast<xlsx_sheet_context&>(get_root_context());
+ cxt.pop_rel_extras(other);
+}
+
+xlsx_table_xml_handler::xlsx_table_xml_handler(
+ session_context& session_cxt, const tokens& t,
+ spreadsheet::iface::import_table& table,
+ spreadsheet::iface::import_reference_resolver& resolver) :
+ xml_stream_handler(session_cxt, t, std::make_unique<xlsx_table_context>(session_cxt, t, table, resolver))
+{
+}
+
+xlsx_pivot_cache_def_xml_handler::xlsx_pivot_cache_def_xml_handler(
+ session_context& cxt, const tokens& t,
+ spreadsheet::iface::import_pivot_cache_definition& pcache,
+ spreadsheet::pivot_cache_id_t pcache_id) :
+ xml_stream_handler(cxt, t, std::make_unique<xlsx_pivot_cache_def_context>(cxt, t, pcache, pcache_id)) {}
+
+opc_rel_extras_t xlsx_pivot_cache_def_xml_handler::pop_rel_extras()
+{
+ xlsx_pivot_cache_def_context& cxt =
+ static_cast<xlsx_pivot_cache_def_context&>(get_root_context());
+
+ return cxt.pop_rel_extras();
+}
+
+xlsx_pivot_cache_rec_xml_handler::xlsx_pivot_cache_rec_xml_handler(
+ session_context& cxt, const tokens& t,
+ spreadsheet::iface::import_pivot_cache_records& pc_records) :
+ xml_stream_handler(cxt, t, std::make_unique<xlsx_pivot_cache_rec_context>(cxt, t, pc_records)) {}
+
+xlsx_pivot_table_xml_handler::xlsx_pivot_table_xml_handler(
+ session_context& cxt, const tokens& t) :
+ xml_stream_handler(cxt, t, std::make_unique<xlsx_pivot_table_context>(cxt, t)) {}
+
+xlsx_drawing_xml_handler::xlsx_drawing_xml_handler(
+ session_context& cxt, const tokens& t) :
+ xml_stream_handler(cxt, t, std::make_unique<xlsx_drawing_context>(cxt, t)) {}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xlsx_handler.hpp b/src/liborcus/xlsx_handler.hpp
new file mode 100644
index 0000000..81676c5
--- /dev/null
+++ b/src/liborcus/xlsx_handler.hpp
@@ -0,0 +1,91 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_XLSX_HANDLER_HPP
+#define INCLUDED_ORCUS_XLSX_HANDLER_HPP
+
+#include "xml_stream_handler.hpp"
+#include "xml_context_base.hpp"
+
+#include "orcus/spreadsheet/types.hpp"
+
+#include <string>
+#include <vector>
+
+namespace orcus {
+
+struct session_context;
+struct opc_rel_extras_t;
+
+namespace spreadsheet { namespace iface {
+
+class import_sheet;
+class import_table;
+class import_reference_resolver;
+class import_pivot_cache_definition;
+class import_pivot_cache_records;
+
+}}
+
+class xlsx_sheet_xml_handler : public xml_stream_handler
+{
+public:
+ xlsx_sheet_xml_handler(
+ session_context& cxt, const tokens& t,
+ spreadsheet::sheet_t sheet_id,
+ spreadsheet::iface::import_reference_resolver& resolver,
+ spreadsheet::iface::import_sheet& sheet);
+
+ virtual ~xlsx_sheet_xml_handler();
+
+ void pop_rel_extras(opc_rel_extras_t& other);
+};
+
+class xlsx_table_xml_handler : public xml_stream_handler
+{
+public:
+ xlsx_table_xml_handler(
+ session_context& cxt, const tokens& t,
+ spreadsheet::iface::import_table& table,
+ spreadsheet::iface::import_reference_resolver& resolver);
+};
+
+class xlsx_pivot_cache_def_xml_handler : public xml_stream_handler
+{
+public:
+ xlsx_pivot_cache_def_xml_handler(
+ session_context& cxt, const tokens& t,
+ spreadsheet::iface::import_pivot_cache_definition& pcache,
+ spreadsheet::pivot_cache_id_t pcache_id);
+
+ opc_rel_extras_t pop_rel_extras();
+};
+
+class xlsx_pivot_cache_rec_xml_handler : public xml_stream_handler
+{
+public:
+ xlsx_pivot_cache_rec_xml_handler(
+ session_context& cxt, const tokens& t,
+ spreadsheet::iface::import_pivot_cache_records& pc_records);
+};
+
+class xlsx_pivot_table_xml_handler : public xml_stream_handler
+{
+public:
+ xlsx_pivot_table_xml_handler(session_context& cxt, const tokens& t);
+};
+
+class xlsx_drawing_xml_handler : public xml_stream_handler
+{
+public:
+ xlsx_drawing_xml_handler(session_context& cxt, const tokens& t);
+};
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xlsx_helper.cpp b/src/liborcus/xlsx_helper.cpp
new file mode 100644
index 0000000..9559d2b
--- /dev/null
+++ b/src/liborcus/xlsx_helper.cpp
@@ -0,0 +1,33 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xlsx_helper.hpp"
+
+namespace orcus {
+
+bool to_rgb(
+ std::string_view ps, spreadsheet::color_elem_t& alpha,
+ spreadsheet::color_elem_t& red, spreadsheet::color_elem_t& green, spreadsheet::color_elem_t& blue)
+{
+ // RGB string is a 8-character string representing 32-bit hexadecimal
+ // number e.g. 'FF004A12' (alpha - red - green - blue)
+ size_t n = ps.size();
+ if (n != 8)
+ return false;
+
+ unsigned long v = strtoul(ps.data(), nullptr, 16);
+ blue = (0x000000FF & v);
+ green = (0x000000FF & (v >> 8));
+ red = (0x000000FF & (v >> 16));
+ alpha = (0x000000FF & (v >> 24));
+
+ return true;
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xlsx_helper.hpp b/src/liborcus/xlsx_helper.hpp
new file mode 100644
index 0000000..1643db1
--- /dev/null
+++ b/src/liborcus/xlsx_helper.hpp
@@ -0,0 +1,18 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/spreadsheet/types.hpp>
+
+namespace orcus {
+
+bool to_rgb(std::string_view ps, spreadsheet::color_elem_t& alpha,
+ spreadsheet::color_elem_t& red, spreadsheet::color_elem_t& gree,
+ spreadsheet::color_elem_t& blue);
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xlsx_pivot_context.cpp b/src/liborcus/xlsx_pivot_context.cpp
new file mode 100644
index 0000000..026914d
--- /dev/null
+++ b/src/liborcus/xlsx_pivot_context.cpp
@@ -0,0 +1,1734 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xlsx_pivot_context.hpp"
+#include "ooxml_namespace_types.hpp"
+#include "ooxml_token_constants.hpp"
+#include "xml_context_global.hpp"
+#include "session_context.hpp"
+#include "xlsx_types.hpp"
+
+#include "orcus/measurement.hpp"
+#include "orcus/spreadsheet/import_interface_pivot.hpp"
+
+#include <iostream>
+#include <optional>
+#include <mdds/sorted_string_map.hpp>
+
+using std::cout;
+using std::endl;
+
+namespace orcus {
+
+namespace {
+
+namespace pc_source {
+
+using map_type = mdds::sorted_string_map<xlsx_pivot_cache_def_context::source_type, mdds::string_view_map_entry>;
+
+// Keys must be sorted.
+constexpr map_type::entry entries[] = {
+ { "consolidation", xlsx_pivot_cache_def_context::source_type::consolidation },
+ { "external", xlsx_pivot_cache_def_context::source_type::external },
+ { "scenario", xlsx_pivot_cache_def_context::source_type::scenario },
+ { "worksheet", xlsx_pivot_cache_def_context::source_type::worksheet },
+};
+
+const map_type& get()
+{
+ static const map_type map(
+ entries, std::size(entries),
+ xlsx_pivot_cache_def_context::source_type::unknown);
+
+ return map;
+}
+
+} // namespace pc_source
+
+}
+
+xlsx_pivot_cache_def_context::xlsx_pivot_cache_def_context(
+ session_context& cxt, const tokens& tokens,
+ spreadsheet::iface::import_pivot_cache_definition& pcache,
+ spreadsheet::pivot_cache_id_t pcache_id) :
+ xml_context_base(cxt, tokens), m_pcache(pcache), m_pcache_id(pcache_id) {}
+
+xml_context_base* xlsx_pivot_cache_def_context::create_child_context(xmlns_id_t /*ns*/, xml_token_t /*name*/)
+{
+ return nullptr;
+}
+
+void xlsx_pivot_cache_def_context::end_child_context(xmlns_id_t /*ns*/, xml_token_t /*name*/, xml_context_base* /*child*/)
+{
+}
+
+void xlsx_pivot_cache_def_context::start_element(xmlns_id_t ns, xml_token_t name, const::std::vector<xml_token_attr_t>& attrs)
+{
+ xml_token_pair_t parent = push_stack(ns, name);
+ if (ns != NS_ooxml_xlsx)
+ return;
+
+ switch (name)
+ {
+ case XML_pivotCacheDefinition:
+ {
+ xml_element_expected(parent, XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN);
+
+ std::string_view refreshed_by;
+ std::string_view rid;
+ long record_count = -1;
+
+ for_each(attrs.begin(), attrs.end(),
+ [&](const xml_token_attr_t& attr)
+ {
+ if (!attr.ns || attr.ns == NS_ooxml_xlsx)
+ {
+ switch (attr.name)
+ {
+ case XML_refreshedBy:
+ refreshed_by = attr.value;
+ break;
+ case XML_recordCount:
+ record_count = to_long(attr.value);
+ break;
+ default:
+ ;
+ }
+ }
+ else if (attr.ns == NS_ooxml_r)
+ {
+ switch (attr.name)
+ {
+ case XML_id:
+ // relation id for its cache record.
+ rid = attr.value;
+ break;
+ default:
+ ;
+ }
+ }
+ }
+ );
+
+ if (get_config().debug)
+ {
+ cout << "---" << endl;
+ cout << "pivot cache definition" << endl;
+ cout << "refreshed by: " << refreshed_by << endl;
+ cout << "record count: " << record_count << endl;
+ cout << "rid: " << rid << endl;
+ }
+
+ if (!rid.empty())
+ {
+ // The rid string here must be persistent beyond the current
+ // context.
+ rid = get_session_context().spool.intern(rid).first;
+
+ m_pcache_info.data.insert(
+ opc_rel_extras_t::map_type::value_type(
+ rid, std::make_unique<xlsx_rel_pivot_cache_record_info>(m_pcache_id)));
+ }
+
+ break;
+ }
+ case XML_cacheSource:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_pivotCacheDefinition);
+
+ std::string_view source_type_s;
+
+ for_each(attrs.begin(), attrs.end(),
+ [&](const xml_token_attr_t& attr)
+ {
+ if (attr.ns && attr.ns != NS_ooxml_xlsx)
+ return;
+
+ switch (attr.name)
+ {
+ case XML_type:
+ m_source_type = pc_source::get().find(attr.value);
+ source_type_s = attr.value;
+ break;
+ default:
+ ;
+ }
+ }
+ );
+
+ if (get_config().debug)
+ cout << "type: " << source_type_s << endl;
+
+ break;
+ }
+ case XML_worksheetSource:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_cacheSource);
+ if (m_source_type != source_type::worksheet)
+ throw xml_structure_error(
+ "worksheetSource element encountered while the source type is not worksheet.");
+
+ std::string_view ref, sheet_name, table_name;
+
+ for_each(attrs.begin(), attrs.end(),
+ [&](const xml_token_attr_t& attr)
+ {
+ if (attr.ns && attr.ns != NS_ooxml_xlsx)
+ return;
+
+ switch (attr.name)
+ {
+ case XML_ref:
+ ref = attr.value;
+ break;
+ case XML_sheet:
+ sheet_name = attr.value;
+ break;
+ case XML_name:
+ table_name = attr.value;
+ break;
+ default:
+ ;
+ }
+ }
+ );
+
+ if (get_config().debug)
+ {
+ cout << "table: " << table_name << endl;
+ cout << "ref: " << ref << endl;
+ cout << "sheet: " << sheet_name << endl;
+ }
+
+ if (!table_name.empty())
+ m_pcache.set_worksheet_source(table_name);
+ else
+ m_pcache.set_worksheet_source(ref, sheet_name);
+ break;
+ }
+ case XML_cacheFields:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_pivotCacheDefinition);
+ single_long_attr_getter func(NS_ooxml_xlsx, XML_count);
+ long field_count = for_each(attrs.begin(), attrs.end(), func).get_value();
+
+ if (get_config().debug)
+ cout << "field count: " << field_count << endl;
+
+ if (field_count < 0)
+ throw xml_structure_error("field count of a pivot cache must be positive.");
+
+ m_pcache.set_field_count(field_count);
+ break;
+ }
+ case XML_cacheField:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_cacheFields);
+
+ std::string_view field_name;
+ long numfmt_id = -1;
+
+ for_each(attrs.begin(), attrs.end(),
+ [&](const xml_token_attr_t& attr)
+ {
+ if (attr.ns && attr.ns != NS_ooxml_xlsx)
+ return;
+
+ switch (attr.name)
+ {
+ case XML_name:
+ field_name = attr.value;
+ break;
+ case XML_numFmtId:
+ numfmt_id = to_long(attr.value);
+ break;
+ default:
+ ;
+ }
+ }
+ );
+
+ // TODO : Handle number format ID here.
+ m_pcache.set_field_name(field_name);
+
+ if (get_config().debug)
+ {
+ cout << "* name: " << field_name << endl;
+ cout << " number format id: " << numfmt_id << endl;
+ }
+ break;
+ }
+ case XML_fieldGroup:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_cacheField);
+ long group_parent = -1;
+ long group_base = -1;
+
+ for_each(attrs.begin(), attrs.end(),
+ [&](const xml_token_attr_t& attr)
+ {
+ if (attr.ns && attr.ns != NS_ooxml_xlsx)
+ return;
+
+ switch (attr.name)
+ {
+ case XML_par:
+ group_parent = to_long(attr.value);
+ break;
+ case XML_base:
+ group_base = to_long(attr.value);
+ break;
+ default:
+ ;
+ }
+ }
+ );
+
+ if (get_config().debug)
+ {
+ if (group_parent >= 0)
+ cout << " * group parent index: " << group_parent << endl;
+ if (group_base >= 0)
+ cout << " * group base index: " << group_base << endl;
+ }
+
+ if (group_base >= 0)
+ {
+ // This is a group field.
+ m_pcache_field_group = m_pcache.start_field_group(group_base);
+ }
+ break;
+ }
+ case XML_discretePr:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_fieldGroup);
+
+ long count = -1;
+
+ for_each(attrs.begin(), attrs.end(),
+ [&](const xml_token_attr_t& attr)
+ {
+ if (attr.ns && attr.ns != NS_ooxml_xlsx)
+ return;
+
+ switch (attr.name)
+ {
+ case XML_count:
+ count = to_long(attr.value);
+ break;
+ default:
+ ;
+ }
+ }
+ );
+
+ if (get_config().debug)
+ cout << " * group child member count: " << count << endl;
+
+ break;
+ }
+ case XML_rangePr:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_fieldGroup);
+
+ bool auto_start = true;
+ bool auto_end = true;
+ double start = 0.0;
+ double end = 0.0;
+ double interval = 1.0;
+
+ std::optional<date_time_t> start_date;
+ std::optional<date_time_t> end_date;
+
+ // Default group-by type appears to be 'range'.
+ spreadsheet::pivot_cache_group_by_t group_by =
+ spreadsheet::pivot_cache_group_by_t::range;
+
+ for_each(attrs.begin(), attrs.end(),
+ [&](const xml_token_attr_t& attr)
+ {
+ if (attr.ns && attr.ns != NS_ooxml_xlsx)
+ return;
+
+ switch (attr.name)
+ {
+ case XML_autoStart:
+ auto_start = to_bool(attr.value);
+ break;
+ case XML_autoEnd:
+ auto_end = to_bool(attr.value);
+ break;
+ case XML_startNum:
+ start = to_double(attr.value);
+ break;
+ case XML_endNum:
+ end = to_double(attr.value);
+ break;
+ case XML_groupInterval:
+ interval = to_double(attr.value);
+ break;
+ case XML_startDate:
+ start_date = date_time_t::from_chars(attr.value);
+ break;
+ case XML_endDate:
+ end_date = date_time_t::from_chars(attr.value);
+ break;
+ case XML_groupBy:
+ group_by = spreadsheet::to_pivot_cache_group_by_enum(attr.value);
+ break;
+ default:
+ ;
+ }
+ }
+ );
+
+ if (m_pcache_field_group)
+ {
+ // Pass the values to the interface.
+ m_pcache_field_group->set_range_grouping_type(group_by);
+ m_pcache_field_group->set_range_auto_start(auto_start);
+ m_pcache_field_group->set_range_auto_end(auto_end);
+ m_pcache_field_group->set_range_start_number(start);
+ m_pcache_field_group->set_range_end_number(end);
+ m_pcache_field_group->set_range_interval(interval);
+
+ if (start_date)
+ m_pcache_field_group->set_range_start_date(*start_date);
+ if (end_date)
+ m_pcache_field_group->set_range_end_date(*end_date);
+ }
+
+ if (get_config().debug)
+ {
+ cout << " auto start: " << auto_start << endl;
+ cout << " auto end: " << auto_end << endl;
+ cout << " start: " << start << endl;
+ cout << " end: " << end << endl;
+ cout << " interval: " << interval << endl;
+
+ if (start_date)
+ cout << "start date: " << *start_date << endl;
+ if (end_date)
+ cout << "end date: " << *end_date << endl;
+ }
+
+ break;
+ }
+ case XML_sharedItems:
+ {
+ start_element_shared_items(parent, attrs);
+ break;
+ }
+ case XML_groupItems:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_fieldGroup);
+
+ long count = -1;
+
+ for_each(attrs.begin(), attrs.end(),
+ [&](const xml_token_attr_t& attr)
+ {
+ if (attr.ns && attr.ns != NS_ooxml_xlsx)
+ return;
+
+ switch (attr.name)
+ {
+ case XML_count:
+ count = to_long(attr.value);
+ break;
+ default:
+ ;
+ }
+ }
+ );
+
+ if (get_config().debug)
+ cout << " * group member count: " << count << endl;
+
+ break;
+ }
+ case XML_s:
+ {
+ start_element_s(parent, attrs);
+ break;
+ }
+ case XML_n:
+ {
+ start_element_n(parent, attrs);
+ break;
+ }
+ case XML_d:
+ {
+ start_element_d(parent, attrs);
+ break;
+ }
+ case XML_e:
+ {
+ start_element_e(parent, attrs);
+ break;
+ }
+ case XML_x:
+ {
+ const xml_elem_set_t expected = {
+ { NS_ooxml_xlsx, XML_discretePr },
+ { NS_ooxml_xlsx, XML_reference },
+ };
+ xml_element_expected(parent, expected);
+
+ long index = -1;
+
+ for_each(attrs.begin(), attrs.end(),
+ [&](const xml_token_attr_t& attr)
+ {
+ if (attr.ns && attr.ns != NS_ooxml_xlsx)
+ return;
+
+ switch (attr.name)
+ {
+ case XML_v:
+ index = to_long(attr.value);
+ break;
+ default:
+ ;
+ }
+ }
+ );
+
+ if (index < 0)
+ throw xml_structure_error("element 'x' without a required attribute 'v'.");
+
+ if (get_config().debug)
+ cout << " * index = " << index << endl;
+
+ if (m_pcache_field_group)
+ m_pcache_field_group->link_base_to_group_items(index);
+
+ break;
+ }
+ default:
+ warn_unhandled();
+ }
+}
+
+bool xlsx_pivot_cache_def_context::end_element(xmlns_id_t ns, xml_token_t name)
+{
+ if (ns == NS_ooxml_xlsx)
+ {
+ switch (name)
+ {
+ case XML_pivotCacheDefinition:
+ {
+ m_pcache.commit();
+ break;
+ }
+ case XML_cacheField:
+ {
+ m_pcache.commit_field();
+ m_pcache_field_group = nullptr;
+ break;
+ }
+ case XML_discretePr:
+ {
+ break;
+ }
+ case XML_fieldGroup:
+ {
+ if (m_pcache_field_group)
+ m_pcache_field_group->commit();
+ break;
+ }
+ case XML_s:
+ end_element_s();
+ break;
+ case XML_n:
+ end_element_n();
+ break;
+ case XML_d:
+ end_element_d();
+ break;
+ case XML_e:
+ end_element_e();
+ break;
+ default:
+ ;
+ }
+ }
+
+ return pop_stack(ns, name);
+}
+
+void xlsx_pivot_cache_def_context::characters(std::string_view /*str*/, bool /*transient*/)
+{
+}
+
+opc_rel_extras_t xlsx_pivot_cache_def_context::pop_rel_extras()
+{
+ return std::move(m_pcache_info);
+}
+
+void xlsx_pivot_cache_def_context::start_element_s(
+ const xml_token_pair_t& parent, const std::vector<xml_token_attr_t>& attrs)
+{
+ if (parent.first != NS_ooxml_xlsx)
+ {
+ warn_unhandled();
+ return;
+ }
+
+ std::string_view value;
+
+ for_each(attrs.begin(), attrs.end(),
+ [&](const xml_token_attr_t& attr)
+ {
+ if (attr.ns && attr.ns != NS_ooxml_xlsx)
+ return;
+
+ switch (attr.name)
+ {
+ case XML_v:
+ value = attr.value;
+ break;
+ default:
+ ;
+ }
+ }
+ );
+
+ switch (parent.second)
+ {
+ case XML_sharedItems:
+ {
+ // regular (non-group) field member name.
+
+ if (get_config().debug)
+ cout << " * field member: " << value << endl;
+
+ m_field_item_used = true;
+ m_pcache.set_field_item_string(value);
+ break;
+ }
+ case XML_groupItems:
+ {
+ // group field member name.
+
+ if (get_config().debug)
+ cout << " * group field member: " << value << endl;
+
+ m_field_item_used = true;
+ if (m_pcache_field_group)
+ m_pcache_field_group->set_field_item_string(value);
+ break;
+ }
+ default:
+ warn_unhandled();
+ }
+}
+
+void xlsx_pivot_cache_def_context::end_element_s()
+{
+ const xml_token_pair_t& parent = get_parent_element();
+ if (parent.first != NS_ooxml_xlsx)
+ return;
+
+ switch (parent.second)
+ {
+ case XML_sharedItems:
+ {
+ if (m_field_item_used)
+ m_pcache.commit_field_item();
+ break;
+ }
+ case XML_groupItems:
+ {
+ if (m_pcache_field_group && m_field_item_used)
+ m_pcache_field_group->commit_field_item();
+ break;
+ }
+ default:
+ ;
+ }
+}
+
+void xlsx_pivot_cache_def_context::start_element_n(
+ const xml_token_pair_t& parent, const std::vector<xml_token_attr_t>& attrs)
+{
+ if (parent.first != NS_ooxml_xlsx)
+ {
+ warn_unhandled();
+ return;
+ }
+
+ switch (parent.second)
+ {
+ case XML_sharedItems:
+ {
+ // numeric item of a cache field.
+ double value = 0.0;
+ m_field_item_used = true;
+
+ for_each(attrs.begin(), attrs.end(),
+ [&](const xml_token_attr_t& attr)
+ {
+ if (attr.ns && attr.ns != NS_ooxml_xlsx)
+ return;
+
+ switch (attr.name)
+ {
+ case XML_v:
+ value = to_double(attr.value);
+ break;
+ case XML_u:
+ // flag for unused item.
+ m_field_item_used = !to_bool(attr.value);
+ default:
+ ;
+ }
+ }
+ );
+
+ if (get_config().debug)
+ {
+ cout << " * n: " << value;
+ if (!m_field_item_used)
+ cout << " (unused)";
+ cout << endl;
+
+ }
+
+ if (m_field_item_used)
+ m_pcache.set_field_item_numeric(value);
+
+ break;
+ }
+ default:
+ warn_unhandled();
+ }
+}
+
+void xlsx_pivot_cache_def_context::end_element_n()
+{
+ const xml_token_pair_t& parent = get_parent_element();
+ if (parent.first != NS_ooxml_xlsx)
+ return;
+
+ switch (parent.second)
+ {
+ case XML_sharedItems:
+ {
+ if (m_field_item_used)
+ m_pcache.commit_field_item();
+ break;
+ }
+ default:
+ ;
+ }
+}
+
+void xlsx_pivot_cache_def_context::start_element_d(
+ const xml_token_pair_t& parent, const std::vector<xml_token_attr_t>& attrs)
+{
+ if (parent.first != NS_ooxml_xlsx)
+ {
+ warn_unhandled();
+ return;
+ }
+
+ switch (parent.second)
+ {
+ case XML_sharedItems:
+ {
+ // date item of a cache field.
+ date_time_t dt;
+ m_field_item_used = true;
+
+ for_each(attrs.begin(), attrs.end(),
+ [&](const xml_token_attr_t& attr)
+ {
+ if (attr.ns && attr.ns != NS_ooxml_xlsx)
+ return;
+
+ switch (attr.name)
+ {
+ case XML_v:
+ dt = date_time_t::from_chars(attr.value);
+ break;
+ case XML_u:
+ // flag for unused item.
+ m_field_item_used = !to_bool(attr.value);
+ default:
+ ;
+ }
+ }
+ );
+
+ if (get_config().debug)
+ {
+ cout << " * d: " << dt;
+ if (!m_field_item_used)
+ cout << " (unused)";
+ cout << endl;
+
+ }
+
+ if (m_field_item_used)
+ m_pcache.set_field_item_date_time(dt);
+
+ break;
+ }
+ default:
+ ;
+ }
+}
+
+void xlsx_pivot_cache_def_context::end_element_d()
+{
+ const xml_token_pair_t& parent = get_parent_element();
+ if (parent.first != NS_ooxml_xlsx)
+ return;
+
+ switch (parent.second)
+ {
+ case XML_sharedItems:
+ {
+ if (m_field_item_used)
+ m_pcache.commit_field_item();
+ break;
+ }
+ default:
+ ;
+ }
+}
+
+void xlsx_pivot_cache_def_context::start_element_e(
+ const xml_token_pair_t& parent, const std::vector<xml_token_attr_t>& attrs)
+{
+ if (parent.first != NS_ooxml_xlsx)
+ {
+ warn_unhandled();
+ return;
+ }
+
+ switch (parent.second)
+ {
+ case XML_sharedItems:
+ {
+ // error value item of a cache field.
+ spreadsheet::error_value_t ev = spreadsheet::error_value_t::unknown;
+ m_field_item_used = true;
+
+ for_each(attrs.begin(), attrs.end(),
+ [&](const xml_token_attr_t& attr)
+ {
+ if (attr.ns && attr.ns != NS_ooxml_xlsx)
+ return;
+
+ switch (attr.name)
+ {
+ case XML_v:
+ ev = spreadsheet::to_error_value_enum(attr.value);
+ break;
+ case XML_u:
+ // flag for unused item.
+ m_field_item_used = !to_bool(attr.value);
+ default:
+ ;
+ }
+ }
+ );
+
+ if (get_config().debug)
+ {
+ cout << " * e: " << ev;
+ if (!m_field_item_used)
+ cout << " (unused)";
+ cout << endl;
+ }
+
+ if (m_field_item_used)
+ m_pcache.set_field_item_error(ev);
+
+ break;
+ }
+ default:
+ ;
+ }
+}
+
+void xlsx_pivot_cache_def_context::end_element_e()
+{
+ const xml_token_pair_t& parent = get_parent_element();
+ if (parent.first != NS_ooxml_xlsx)
+ return;
+
+ switch (parent.second)
+ {
+ case XML_sharedItems:
+ {
+ if (m_field_item_used)
+ m_pcache.commit_field_item();
+ break;
+ }
+ default:
+ ;
+ }
+}
+
+void xlsx_pivot_cache_def_context::start_element_shared_items(
+ const xml_token_pair_t& parent, const std::vector<xml_token_attr_t>& attrs)
+{
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_cacheField);
+
+ // If "semi-mixed types" is set, the field contains text values and at
+ // least one other type.
+ bool semi_mixed_types = true;
+
+ bool has_non_date = true;
+ bool has_date = false;
+ bool has_string = true;
+ bool has_blank = false;
+
+ // If "mixed types" is set, the field contains more than one data types.
+ bool mixed_types = false;
+
+ bool has_number = false;
+ bool has_integer = false;
+ bool has_long_text = false;
+
+ long count = -1;
+ std::optional<double> min_value;
+ std::optional<double> max_value;
+ std::optional<date_time_t> min_date;
+ std::optional<date_time_t> max_date;
+
+ for_each(attrs.begin(), attrs.end(),
+ [&](const xml_token_attr_t& attr)
+ {
+ if (attr.ns && attr.ns != NS_ooxml_xlsx)
+ return;
+
+ switch (attr.name)
+ {
+ case XML_count:
+ count = to_long(attr.value);
+ break;
+ case XML_containsMixedTypes:
+ mixed_types = to_bool(attr.value);
+ break;
+ case XML_containsSemiMixedTypes:
+ semi_mixed_types = to_bool(attr.value);
+ break;
+ case XML_containsNonDate:
+ has_non_date = to_bool(attr.value);
+ break;
+ case XML_containsString:
+ has_string = to_bool(attr.value);
+ break;
+ case XML_containsBlank:
+ has_blank = to_bool(attr.value);
+ break;
+ case XML_containsNumber:
+ has_number = to_bool(attr.value);
+ break;
+ case XML_containsInteger:
+ has_integer = to_bool(attr.value);
+ break;
+ case XML_minValue:
+ min_value = to_double(attr.value);
+ break;
+ case XML_maxValue:
+ max_value = to_double(attr.value);
+ break;
+ case XML_minDate:
+ min_date = date_time_t::from_chars(attr.value);
+ break;
+ case XML_maxDate:
+ max_date = date_time_t::from_chars(attr.value);
+ break;
+ case XML_longText:
+ has_long_text = to_bool(attr.value);
+ break;
+ default:
+ ;
+ }
+ }
+ );
+
+ if (min_value)
+ m_pcache.set_field_min_value(*min_value);
+
+ if (max_value)
+ m_pcache.set_field_max_value(*max_value);
+
+ if (min_date)
+ m_pcache.set_field_min_date(*min_date);
+
+ if (max_date)
+ m_pcache.set_field_max_date(*max_date);
+
+ if (get_config().debug)
+ {
+ cout << " contains semi-mixed types: " << semi_mixed_types << endl;
+ cout << " contains non-date: " << has_non_date << endl;
+ cout << " contains date: " << has_date << endl;
+ cout << " contains string: " << has_string << endl;
+ cout << " contains blank: " << has_blank << endl;
+ cout << " contains mixed types: " << mixed_types << endl;
+ cout << " contains number: " << has_number << endl;
+ cout << " contains integer: " << has_integer << endl;
+ cout << " contains long text: " << has_long_text << endl;
+ cout << " count: " << count << endl;
+
+ if (min_value)
+ cout << " min value: " << *min_value << endl;
+ if (max_value)
+ cout << " max value: " << *max_value << endl;
+ if (min_date)
+ cout << " min date: " << *min_date << endl;
+ if (max_date)
+ cout << " max date: " << *max_date << endl;
+ }
+}
+
+xlsx_pivot_cache_rec_context::xlsx_pivot_cache_rec_context(
+ session_context& cxt, const tokens& tokens,
+ spreadsheet::iface::import_pivot_cache_records& pc_records) :
+ xml_context_base(cxt, tokens),
+ m_pc_records(pc_records) {}
+
+xml_context_base* xlsx_pivot_cache_rec_context::create_child_context(xmlns_id_t /*ns*/, xml_token_t /*name*/)
+{
+ return nullptr;
+}
+
+void xlsx_pivot_cache_rec_context::end_child_context(xmlns_id_t /*ns*/, xml_token_t /*name*/, xml_context_base* /*child*/)
+{
+}
+
+void xlsx_pivot_cache_rec_context::start_element(xmlns_id_t ns, xml_token_t name, const::std::vector<xml_token_attr_t>& attrs)
+{
+ xml_token_pair_t parent = push_stack(ns, name);
+
+ if (ns != NS_ooxml_xlsx)
+ return;
+
+ switch (name)
+ {
+ case XML_pivotCacheRecords:
+ {
+ xml_element_expected(parent, XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN);
+ long count = single_long_attr_getter::get(attrs, NS_ooxml_xlsx, XML_count);
+
+ if (get_config().debug)
+ {
+ cout << "---" << endl;
+ cout << "pivot cache record (count: " << count << ")" << endl;
+ }
+
+ m_pc_records.set_record_count(count);
+ break;
+ }
+ case XML_r: // record
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_pivotCacheRecords);
+ if (get_config().debug)
+ cout << "* record" << endl;
+
+ break;
+ case XML_s: // character value
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_r);
+
+ std::string_view cv = single_attr_getter::get(attrs, NS_ooxml_xlsx, XML_v);
+
+ if (get_config().debug)
+ cout << " * s = '" << cv << "'" << endl;
+
+ m_pc_records.append_record_value_character(cv);
+ break;
+ }
+ case XML_x: // shared item index
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_r);
+ long v = single_long_attr_getter::get(attrs, NS_ooxml_xlsx, XML_v);
+ if (get_config().debug)
+ cout << " * x = " << v << endl;
+
+ m_pc_records.append_record_value_shared_item(v);
+ break;
+ }
+ case XML_n: // numeric
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_r);
+ double val = single_double_attr_getter::get(attrs, NS_ooxml_xlsx, XML_v);
+ if (get_config().debug)
+ cout << " * n = " << val << endl;
+
+ m_pc_records.append_record_value_numeric(val);
+ break;
+ }
+ case XML_e: // error value
+ {
+ std::string_view cv = single_attr_getter::get(attrs, NS_ooxml_xlsx, XML_v);
+
+ if (get_config().debug)
+ cout << " * e = " << cv << endl;
+
+ break;
+ }
+ case XML_b: // boolean
+ case XML_d: // date time
+ case XML_m: // no value
+ default:
+ warn_unhandled();
+ }
+}
+
+bool xlsx_pivot_cache_rec_context::end_element(xmlns_id_t ns, xml_token_t name)
+{
+ if (ns == NS_ooxml_xlsx)
+ {
+ switch (name)
+ {
+ case XML_pivotCacheRecords:
+ m_pc_records.commit();
+ break;
+ case XML_r: // record
+ m_pc_records.commit_record();
+ break;
+ default:
+ ;
+ }
+ }
+
+ return pop_stack(ns, name);
+}
+
+xlsx_pivot_table_context::xlsx_pivot_table_context(session_context& cxt, const tokens& tokens) :
+ xml_context_base(cxt, tokens) {}
+
+xml_context_base* xlsx_pivot_table_context::create_child_context(xmlns_id_t /*ns*/, xml_token_t /*name*/)
+{
+ return nullptr;
+}
+
+void xlsx_pivot_table_context::end_child_context(xmlns_id_t /*ns*/, xml_token_t /*name*/, xml_context_base* /*child*/)
+{
+}
+
+void xlsx_pivot_table_context::start_element(xmlns_id_t ns, xml_token_t name, const::std::vector<xml_token_attr_t>& attrs)
+{
+ xml_token_pair_t parent = push_stack(ns, name);
+ if (ns == NS_ooxml_xlsx)
+ {
+ switch (name)
+ {
+ case XML_pivotTableDefinition:
+ {
+ xml_element_expected(parent, XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN);
+ if (get_config().debug)
+ cout << "---" << endl;
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.ns && attr.ns != NS_ooxml_xlsx)
+ continue;
+
+ long v = 0;
+ bool b = false;
+
+ switch (attr.name)
+ {
+ case XML_name:
+ if (get_config().debug)
+ cout << "name: " << attr.value << endl;
+ break;
+ case XML_cacheId:
+ v = to_long(attr.value);
+ if (get_config().debug)
+ cout << "cache ID: " << v << endl;
+ break;
+ case XML_applyNumberFormats:
+ b = to_bool(attr.value);
+ if (get_config().debug)
+ cout << "apply number formats: " << b << endl;
+ break;
+ case XML_applyBorderFormats:
+ b = to_bool(attr.value);
+ if (get_config().debug)
+ cout << "apply border formats: " << b << endl;
+ break;
+ case XML_applyFontFormats:
+ b = to_bool(attr.value);
+ if (get_config().debug)
+ cout << "apply font formats: " << b << endl;
+ break;
+ case XML_applyPatternFormats:
+ b = to_bool(attr.value);
+ if (get_config().debug)
+ cout << "apply pattern formats: " << b << endl;
+ break;
+ case XML_applyAlignmentFormats:
+ b = to_bool(attr.value);
+ if (get_config().debug)
+ cout << "apply alignment formats: " << b << endl;
+ break;
+ case XML_applyWidthHeightFormats:
+ b = to_bool(attr.value);
+ if (get_config().debug)
+ cout << "apply width/height formats: " << b << endl;
+ break;
+ case XML_dataCaption:
+ if (get_config().debug)
+ cout << "data caption: " << attr.value << endl;
+ break;
+ case XML_updatedVersion:
+ v = to_long(attr.value);
+ if (get_config().debug)
+ cout << "updated version: " << v << endl;
+ break;
+ case XML_minRefreshableVersion:
+ v = to_long(attr.value);
+ if (get_config().debug)
+ cout << "minimum refreshable version: " << v << endl;
+ break;
+ case XML_showCalcMbrs:
+ b = to_bool(attr.value);
+ if (get_config().debug)
+ cout << "show calc members (?): " << b << endl;
+ break;
+ case XML_useAutoFormatting:
+ b = to_bool(attr.value);
+ if (get_config().debug)
+ cout << "use auto formatting: " << b << endl;
+ break;
+ case XML_itemPrintTitles:
+ b = to_bool(attr.value);
+ if (get_config().debug)
+ cout << "item print titles (?): " << b << endl;
+ break;
+ case XML_createdVersion:
+ v = to_long(attr.value);
+ if (get_config().debug)
+ cout << "created version: " << v << endl;
+ break;
+ case XML_indent:
+ b = to_bool(attr.value);
+ if (get_config().debug)
+ cout << "indent: " << b << endl;
+ break;
+ case XML_compact:
+ b = to_bool(attr.value);
+ if (get_config().debug)
+ cout << "compact: " << b << endl;
+ break;
+ case XML_compactData:
+ b = to_bool(attr.value);
+ if (get_config().debug)
+ cout << "compact data: " << b << endl;
+ break;
+ case XML_outline:
+ b = to_bool(attr.value);
+ if (get_config().debug)
+ cout << "outline: " << b << endl;
+ break;
+ case XML_outlineData:
+ b = to_bool(attr.value);
+ if (get_config().debug)
+ cout << "outline data: " << b << endl;
+ break;
+ case XML_gridDropZones:
+ b = to_bool(attr.value);
+ if (get_config().debug)
+ cout << "grid drop zones: " << b << endl;
+ break;
+ case XML_multipleFieldFilters:
+ b = to_bool(attr.value);
+ if (get_config().debug)
+ cout << "multiple field filters: " << b << endl;
+ break;
+ default:
+ ;
+ }
+ }
+ }
+ break;
+ case XML_location:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_pivotTableDefinition);
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.ns && attr.ns != NS_ooxml_xlsx)
+ continue;
+
+ long v = -1;
+ switch (attr.name)
+ {
+ case XML_ref:
+ if (get_config().debug)
+ cout << "ref: " << attr.value << endl;
+ break;
+ case XML_firstHeaderRow:
+ v = to_long(attr.value);
+ if (get_config().debug)
+ cout << "first header row: " << v << endl;
+ break;
+ case XML_firstDataRow:
+ v = to_long(attr.value);
+ if (get_config().debug)
+ cout << "first data row: " << v << endl;
+ break;
+ case XML_firstDataCol:
+ v = to_long(attr.value);
+ if (get_config().debug)
+ cout << "first data column: " << v << endl;
+ break;
+ default:
+ ;
+ }
+ }
+ }
+ break;
+ case XML_pivotFields:
+ {
+ // pivotFields and its child elements represent the visual
+ // appearances of the fields inside pivot table.
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_pivotTableDefinition);
+ size_t count = single_long_attr_getter::get(attrs, NS_ooxml_xlsx, XML_count);
+ if (get_config().debug)
+ cout << "field count: " << count << endl;
+ }
+ break;
+ case XML_pivotField:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_pivotFields);
+
+ if (get_config().debug)
+ cout << "---" << endl;
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.ns && attr.ns != NS_ooxml_xlsx)
+ continue;
+
+ switch (attr.name)
+ {
+ case XML_axis:
+ if (get_config().debug)
+ cout << " * axis: " << attr.value << endl;
+ break;
+ case XML_compact:
+ {
+ bool b = to_bool(attr.value);
+ if (get_config().debug)
+ cout << " * compact: " << b << endl;
+ }
+ break;
+ case XML_outline:
+ {
+ bool b = to_bool(attr.value);
+ if (get_config().debug)
+ cout << " * outline: " << b << endl;
+ }
+ break;
+ case XML_showAll:
+ {
+ bool b = to_bool(attr.value);
+ if (get_config().debug)
+ cout << " * show all: " << b << endl;
+ }
+ break;
+ case XML_dataField:
+ {
+ bool b = to_bool(attr.value);
+ if (get_config().debug)
+ cout << " * data field: " << b << endl;
+ }
+ break;
+ default:
+ ;
+ }
+ }
+ }
+ break;
+ case XML_items:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_pivotField);
+ size_t count = single_long_attr_getter::get(attrs, NS_ooxml_xlsx, XML_count);
+ if (get_config().debug)
+ cout << " * item count: " << count << endl;
+ }
+ break;
+ case XML_item:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_items);
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.ns && attr.ns != NS_ooxml_xlsx)
+ continue;
+
+ switch (attr.name)
+ {
+ case XML_x:
+ {
+ // field item index as defined in the pivot cache.
+ long idx = to_long(attr.value);
+ if (get_config().debug)
+ cout << " * x = " << idx << endl;
+ }
+ break;
+ case XML_t:
+ {
+ // When the <item> element has attribute 't', it's subtotal or
+ // some sort of function item. See 3.18.45 ST_ItemType
+ // (PivotItem Type) for possible values.
+ if (get_config().debug)
+ cout << " * type = " << attr.value << endl;
+ }
+ break;
+ default:
+ ;
+ }
+ }
+ }
+ break;
+ case XML_rowFields:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_pivotTableDefinition);
+ size_t count = single_long_attr_getter::get(attrs, NS_ooxml_xlsx, XML_count);
+ if (get_config().debug)
+ {
+ cout << "---" << endl;
+ cout << "row field count: " << count << endl;
+ }
+ }
+ break;
+ case XML_colFields:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_pivotTableDefinition);
+ size_t count = single_long_attr_getter::get(attrs, NS_ooxml_xlsx, XML_count);
+ if (get_config().debug)
+ {
+ cout << "---" << endl;
+ cout << "column field count: " << count << endl;
+ }
+ }
+ break;
+ case XML_pageFields:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_pivotTableDefinition);
+ size_t count = single_long_attr_getter::get(attrs, NS_ooxml_xlsx, XML_count);
+ if (get_config().debug)
+ {
+ cout << "---" << endl;
+ cout << "page field count: " << count << endl;
+ }
+ }
+ break;
+ case XML_pageField:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_pageFields);
+
+ if (get_config().debug)
+ cout << " * page field:";
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.ns && attr.ns != NS_ooxml_xlsx)
+ continue;
+
+ switch (attr.name)
+ {
+ case XML_fld:
+ {
+ long fld = to_long(attr.value);
+ if (get_config().debug)
+ cout << "field index = " << fld << "; ";
+ break;
+ }
+ case XML_item:
+ {
+ long item = to_long(attr.value);
+ if (get_config().debug)
+ cout << "item index = " << item << "; ";
+ break;
+ }
+ case XML_hier:
+ {
+ long hier = to_long(attr.value);
+ // -1 if not applicable.
+ if (get_config().debug)
+ cout << "OLAP hierarchy index = " << hier << "; ";
+ break;
+ }
+ default:
+ ;
+ }
+ }
+
+ if (get_config().debug)
+ cout << endl;
+ break;
+ }
+ case XML_field:
+ {
+ xml_elem_stack_t expected;
+ expected.reserve(3);
+ expected.push_back(xml_token_pair_t(NS_ooxml_xlsx, XML_rowFields));
+ expected.push_back(xml_token_pair_t(NS_ooxml_xlsx, XML_colFields));
+ xml_element_expected(parent, expected);
+
+ // Index into the list of <pivotField> collection which is
+ // given earlier under the <pivotFields> element. The value
+ // of -2 represents a special field that displays the list of
+ // data fields when the pivot table contains more than one
+ // data field.
+ long idx = single_long_attr_getter::get(attrs, NS_ooxml_xlsx, XML_x);
+ if (get_config().debug)
+ cout << " * x = " << idx << endl;
+ }
+ break;
+ case XML_dataFields:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_pivotTableDefinition);
+ size_t count = single_long_attr_getter::get(attrs, NS_ooxml_xlsx, XML_count);
+ if (get_config().debug)
+ {
+ cout << "---" << endl;
+ cout << "data field count: " << count << endl;
+ }
+ }
+ break;
+ case XML_dataField:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_dataFields);
+
+ if (get_config().debug)
+ cout << " * data field: ";
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.ns && attr.ns != NS_ooxml_xlsx)
+ continue;
+
+ switch (attr.name)
+ {
+ case XML_name:
+ {
+ if (get_config().debug)
+ cout << "name = " << attr.value << "; ";
+ break;
+ }
+ case XML_fld:
+ {
+ long fld = to_long(attr.value);
+ if (get_config().debug)
+ cout << "field = " << fld << "; ";
+ break;
+ }
+ case XML_baseField:
+ {
+ long fld = to_long(attr.value);
+ if (get_config().debug)
+ cout << "base field = " << fld << "; ";
+ break;
+ }
+ case XML_baseItem:
+ {
+ long fld = to_long(attr.value);
+ if (get_config().debug)
+ cout << "base item = " << fld << "; ";
+ break;
+ }
+ case XML_subtotal:
+ {
+ if (get_config().debug)
+ cout << "subtotal = " << attr.value << "; ";
+ break;
+ }
+ default:
+ ;
+ }
+ }
+
+ if (get_config().debug)
+ cout << endl;
+ }
+ break;
+ case XML_rowItems:
+ {
+ // <rowItems> structure describes the displayed content of
+ // cells in the row field area. Each <i> child element
+ // represents a single row.
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_pivotTableDefinition);
+ size_t count = single_long_attr_getter::get(attrs, NS_ooxml_xlsx, XML_count);
+ if (get_config().debug)
+ {
+ cout << "---" << endl;
+ cout << "row item count: " << count << endl;
+ }
+ }
+ break;
+ case XML_colItems:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_pivotTableDefinition);
+ size_t count = single_long_attr_getter::get(attrs, NS_ooxml_xlsx, XML_count);
+ if (get_config().debug)
+ {
+ cout << "---" << endl;
+ cout << "column item count: " << count << endl;
+ }
+ }
+ break;
+ case XML_i:
+ {
+ xml_elem_stack_t expected;
+ expected.reserve(2);
+ expected.push_back(xml_token_pair_t(NS_ooxml_xlsx, XML_rowItems));
+ expected.push_back(xml_token_pair_t(NS_ooxml_xlsx, XML_colItems));
+ xml_element_expected(parent, expected);
+
+ if (get_config().debug)
+ cout << "---" << endl;
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.ns && attr.ns != NS_ooxml_xlsx)
+ continue;
+
+ switch (attr.name)
+ {
+ case XML_t:
+ {
+ // total or subtotal function type.
+ if (get_config().debug)
+ cout << " * type = " << attr.value << endl;
+ }
+ break;
+ case XML_r:
+ {
+ // "repeated item count" which basically is the number of
+ // blank cells that occur after the preivous non-empty cell on
+ // the same row (in the classic layout mode).
+ long v = to_long(attr.value);
+ if (get_config().debug)
+ cout << " * repeat item count = " << v << endl;
+ }
+ break;
+ case XML_i:
+ {
+ // zero-based data field index in case of multiple data fields.
+ long v = to_long(attr.value);
+ if (get_config().debug)
+ cout << " * data field index = " << v << endl;
+ }
+ break;
+ default:
+ ;
+ }
+ }
+ }
+ break;
+ case XML_x:
+ {
+ if (parent.first != NS_ooxml_xlsx)
+ {
+ warn_unhandled();
+ break;
+ }
+
+ if (parent.second == XML_i)
+ {
+ long idx = single_long_attr_getter::get(attrs, NS_ooxml_xlsx, XML_v);
+ if (idx < 0)
+ // 0 is default when not set.
+ idx = 0;
+
+ if (get_config().debug)
+ cout << " * v = " << idx << endl;
+ break;
+ }
+
+ warn_unhandled();
+ }
+ break;
+ case XML_pivotTableStyleInfo:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_pivotTableDefinition);
+
+ if (get_config().debug)
+ {
+ cout << "---" << endl;
+ cout << "* style info: ";
+ }
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.ns && attr.ns != NS_ooxml_xlsx)
+ continue;
+
+ bool b = false;
+
+ switch (attr.name)
+ {
+ case XML_name:
+ if (get_config().debug)
+ cout << "name='" << attr.value << "'; ";
+ break;
+ case XML_showRowHeaders:
+ b = to_bool(attr.value);
+ if (get_config().debug)
+ cout << "show row headers=" << b << "; ";
+ break;
+ case XML_showColHeaders:
+ b = to_bool(attr.value);
+ if (get_config().debug)
+ cout << "show column headers=" << b << "; ";
+ break;
+ case XML_showRowStripes:
+ b = to_bool(attr.value);
+ if (get_config().debug)
+ cout << "show row stripes=" << b << "; ";
+ break;
+ case XML_showColStripes:
+ b = to_bool(attr.value);
+ if (get_config().debug)
+ cout << "show column stripes=" << b << "; ";
+ break;
+ case XML_showLastColumn:
+ b = to_bool(attr.value);
+ if (get_config().debug)
+ cout << "show last column=" << b << "; ";
+ break;
+ default:
+ ;
+ }
+ }
+
+ if (get_config().debug)
+ cout << endl;
+ break;
+ }
+ default:
+ warn_unhandled();
+ }
+ }
+ else
+ warn_unhandled();
+}
+
+bool xlsx_pivot_table_context::end_element(xmlns_id_t ns, xml_token_t name)
+{
+ return pop_stack(ns, name);
+}
+
+void xlsx_pivot_table_context::characters(std::string_view /*str*/, bool /*transient*/)
+{
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xlsx_pivot_context.hpp b/src/liborcus/xlsx_pivot_context.hpp
new file mode 100644
index 0000000..f9610ba
--- /dev/null
+++ b/src/liborcus/xlsx_pivot_context.hpp
@@ -0,0 +1,118 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef ORCUS_XLSX_PIVOT_CONTEXT_HPP
+#define ORCUS_XLSX_PIVOT_CONTEXT_HPP
+
+#include "xml_context_base.hpp"
+#include "ooxml_types.hpp"
+#include "orcus/spreadsheet/types.hpp"
+
+namespace orcus {
+
+namespace spreadsheet { namespace iface {
+
+class import_pivot_cache_definition;
+class import_pivot_cache_field_group;
+class import_pivot_cache_records;
+
+}}
+
+/**
+ * Base context for pivotCacheDefinition[n].xml part, which defines the
+ * structure of a pivot cache.
+ */
+class xlsx_pivot_cache_def_context : public xml_context_base
+{
+public:
+ enum class source_type {
+ unknown = 0,
+ worksheet,
+ external,
+ consolidation,
+ scenario
+ };
+
+private:
+ spreadsheet::iface::import_pivot_cache_definition& m_pcache;
+ spreadsheet::pivot_cache_id_t m_pcache_id;
+ spreadsheet::iface::import_pivot_cache_field_group* m_pcache_field_group = nullptr;
+ source_type m_source_type = source_type::unknown;
+ bool m_field_item_used = true;
+
+ opc_rel_extras_t m_pcache_info;
+
+public:
+ xlsx_pivot_cache_def_context(
+ session_context& cxt, const tokens& tokens,
+ spreadsheet::iface::import_pivot_cache_definition& pcache,
+ spreadsheet::pivot_cache_id_t pcache_id);
+
+ virtual xml_context_base* create_child_context(xmlns_id_t ns, xml_token_t name);
+ virtual void end_child_context(xmlns_id_t ns, xml_token_t name, xml_context_base* child);
+ virtual void start_element(xmlns_id_t ns, xml_token_t name, const::std::vector<xml_token_attr_t>& attrs);
+ virtual bool end_element(xmlns_id_t ns, xml_token_t name);
+ virtual void characters(std::string_view str, bool transient);
+
+ opc_rel_extras_t pop_rel_extras();
+
+private:
+ void start_element_s(const xml_token_pair_t& parent, const std::vector<xml_token_attr_t>& attrs);
+ void end_element_s();
+
+ void start_element_n(const xml_token_pair_t& parent, const std::vector<xml_token_attr_t>& attrs);
+ void end_element_n();
+
+ void start_element_d(const xml_token_pair_t& parent, const std::vector<xml_token_attr_t>& attrs);
+ void end_element_d();
+
+ void start_element_e(const xml_token_pair_t& parent, const std::vector<xml_token_attr_t>& attrs);
+ void end_element_e();
+
+ void start_element_shared_items(const xml_token_pair_t& parent, const std::vector<xml_token_attr_t>& attrs);
+};
+
+/**
+ * Context for pivotCacheRecords[n].xml part, which contains the records in
+ * a pivot cache.
+ */
+class xlsx_pivot_cache_rec_context : public xml_context_base
+{
+ spreadsheet::iface::import_pivot_cache_records& m_pc_records;
+
+public:
+ xlsx_pivot_cache_rec_context(
+ session_context& cxt, const tokens& tokens,
+ spreadsheet::iface::import_pivot_cache_records& pc_records);
+
+ virtual xml_context_base* create_child_context(xmlns_id_t ns, xml_token_t name);
+ virtual void end_child_context(xmlns_id_t ns, xml_token_t name, xml_context_base* child);
+ virtual void start_element(xmlns_id_t ns, xml_token_t name, const::std::vector<xml_token_attr_t>& attrs);
+ virtual bool end_element(xmlns_id_t ns, xml_token_t name);
+};
+
+/**
+ * Context for pivotTable[n].xml part which defines the structure of a pivot
+ * table model.
+ */
+class xlsx_pivot_table_context : public xml_context_base
+{
+public:
+ xlsx_pivot_table_context(session_context& cxt, const tokens& tokens);
+
+ virtual xml_context_base* create_child_context(xmlns_id_t ns, xml_token_t name);
+ virtual void end_child_context(xmlns_id_t ns, xml_token_t name, xml_context_base* child);
+ virtual void start_element(xmlns_id_t ns, xml_token_t name, const::std::vector<xml_token_attr_t>& attrs);
+ virtual bool end_element(xmlns_id_t ns, xml_token_t name);
+ virtual void characters(std::string_view str, bool transient);
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xlsx_revision_context.cpp b/src/liborcus/xlsx_revision_context.cpp
new file mode 100644
index 0000000..637659f
--- /dev/null
+++ b/src/liborcus/xlsx_revision_context.cpp
@@ -0,0 +1,578 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xlsx_revision_context.hpp"
+#include "ooxml_namespace_types.hpp"
+#include "ooxml_token_constants.hpp"
+#include "session_context.hpp"
+#include "xml_context_global.hpp"
+
+#include "orcus/measurement.hpp"
+#include "orcus/string_pool.hpp"
+
+#include <iostream>
+#include <limits>
+
+using namespace std;
+
+namespace orcus {
+
+namespace {
+
+class headers_attr_parser
+{
+ std::string_view m_guid;
+ long m_highest_revid;
+ long m_version;
+ bool m_disk_revisions;
+
+public:
+ headers_attr_parser() : m_highest_revid(-1), m_version(-1), m_disk_revisions(false) {}
+
+ std::string_view get_last_guid() const { return m_guid; }
+ long get_highest_revid() const { return m_highest_revid; }
+ long get_version() const { return m_version; }
+ bool is_disk_revisions() const { return m_disk_revisions; }
+
+ void operator() (const xml_token_attr_t& attr)
+ {
+ if (attr.ns != NS_ooxml_xlsx)
+ // All attributes are in the xlsx namespace.
+ return;
+
+ switch (attr.name)
+ {
+ case XML_guid:
+ // guid should never be transient as it's not supposed to contain any encoded characters.
+ // TODO : We should convert guid to a numeric value here.
+ m_guid = attr.value;
+ break;
+ case XML_diskRevisions:
+ m_disk_revisions = to_long(attr.value) != 0;
+ break;
+ case XML_revisionId:
+ m_highest_revid = to_long(attr.value);
+ break;
+ case XML_version:
+ m_version = to_long(attr.value);
+ break;
+ default:
+ ;
+ }
+ }
+};
+
+class header_attr_parser
+{
+ string_pool* m_pool;
+
+ std::string_view m_guid;
+ std::string_view m_username;
+ std::string_view m_rid;
+
+ date_time_t m_date_time;
+ long m_next_sheet_id;
+ long m_min_revid;
+ long m_max_revid;
+
+public:
+ header_attr_parser(string_pool& pool) :
+ m_pool(&pool), m_next_sheet_id(-1), m_min_revid(-1), m_max_revid(-1) {}
+
+ std::string_view get_guid() const { return m_guid; }
+ std::string_view get_username() const { return m_username; }
+ std::string_view get_rid() const { return m_rid; }
+ date_time_t get_date_time() const { return m_date_time; }
+ long get_next_sheet_id() const { return m_next_sheet_id; }
+ long get_min_revid() const { return m_min_revid; }
+ long get_max_revid() const { return m_max_revid; }
+
+ void operator() (const xml_token_attr_t& attr)
+ {
+ if (attr.ns == NS_ooxml_xlsx)
+ {
+ switch (attr.name)
+ {
+ case XML_guid:
+ m_guid = attr.value;
+ break;
+ case XML_dateTime:
+ m_date_time = date_time_t::from_chars(attr.value);
+ break;
+ case XML_maxSheetId:
+ m_next_sheet_id = to_long(attr.value);
+ break;
+ case XML_userName:
+ m_username = attr.value;
+ if (attr.transient)
+ m_username = m_pool->intern(m_username).first;
+ break;
+ case XML_minRId:
+ m_min_revid = to_long(attr.value);
+ break;
+ case XML_maxRId:
+ m_max_revid = to_long(attr.value);
+ break;
+ default:
+ ;
+ }
+ }
+ else if (attr.ns == NS_ooxml_r && attr.name == XML_id)
+ {
+ // Pick up a rel id here.
+ if (attr.transient)
+ // Rel ID's should never be transient.
+ return;
+
+ m_rid = attr.value;
+ }
+ }
+};
+
+}
+
+xlsx_revheaders_context::xlsx_revheaders_context(session_context& session_cxt, const tokens& tokens) :
+ xml_context_base(session_cxt, tokens) {}
+
+xlsx_revheaders_context::~xlsx_revheaders_context() {}
+
+xml_context_base* xlsx_revheaders_context::create_child_context(xmlns_id_t /*ns*/, xml_token_t /*name*/)
+{
+ return nullptr;
+}
+
+void xlsx_revheaders_context::end_child_context(xmlns_id_t /*ns*/, xml_token_t /*name*/, xml_context_base* /*child*/)
+{
+}
+
+void xlsx_revheaders_context::start_element(xmlns_id_t ns, xml_token_t name, const vector<xml_token_attr_t>& attrs)
+{
+ xml_token_pair_t parent = push_stack(ns, name);
+ if (ns == NS_ooxml_xlsx)
+ {
+ switch (name)
+ {
+ case XML_headers:
+ {
+ xml_element_expected(parent, XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN);
+ headers_attr_parser func;
+ func = for_each(attrs.begin(), attrs.end(), func);
+ cout << "* last guid: " << func.get_last_guid() << endl;
+ cout << "* highest revision ID: " << func.get_highest_revid() << endl;
+ cout << "* version: " << func.get_version() << endl;
+ cout << "* disk revisions: " << func.is_disk_revisions() << endl;
+ }
+ break;
+ case XML_header:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_headers);
+ header_attr_parser func(get_session_context().spool);
+ func = for_each(attrs.begin(), attrs.end(), func);
+ cout << "* revision header (guid:" << func.get_guid() << ")" << endl;
+ cout << " - timestamp: " << func.get_date_time().to_string() << endl;
+ cout << " - user name: " << func.get_username() << endl;
+
+ if (func.get_min_revid() != -1 && func.get_max_revid() != -1)
+ cout << " - revision range: " << func.get_min_revid() << "-" << func.get_max_revid() << endl;
+
+ long next_sheet = func.get_next_sheet_id();
+ if (next_sheet != -1)
+ cout << " - next available sheet: " << (next_sheet - 1) << endl;
+
+ cout << " - revision log rid: " << func.get_rid() << endl;
+ // TODO : Intern the rid here when passing it to the revision log stream.
+ }
+ break;
+ case XML_sheetIdMap:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_header);
+ m_cur_sheet_ids.clear();
+ long n = single_long_attr_getter::get(attrs, NS_ooxml_xlsx, XML_count);
+ if (n > 0)
+ m_cur_sheet_ids.reserve(n);
+ }
+ break;
+ case XML_sheetId:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_sheetIdMap);
+ long val = single_long_attr_getter::get(attrs, NS_ooxml_xlsx, XML_val);
+ if (val > 0)
+ m_cur_sheet_ids.push_back(val-1); // convert from 1-based to 0-based.
+ }
+ break;
+ default:
+ warn_unhandled();
+ }
+ }
+}
+
+bool xlsx_revheaders_context::end_element(xmlns_id_t ns, xml_token_t name)
+{
+ if (ns == NS_ooxml_xlsx)
+ {
+ switch (name)
+ {
+ case XML_sheetIdMap:
+ {
+ cout << " - sheet indices: ";
+ for (size_t i = 0; i < m_cur_sheet_ids.size(); ++i)
+ cout << m_cur_sheet_ids[i] << " ";
+ cout << endl;
+ }
+ break;
+ default:
+ ;
+ }
+ }
+ return pop_stack(ns, name);
+}
+
+void xlsx_revheaders_context::characters(std::string_view /*str*/, bool /*transient*/)
+{
+}
+
+namespace {
+
+class rcc_attr_parser
+{
+ long m_revision_id;
+ long m_sheet_id;
+
+public:
+ rcc_attr_parser() : m_revision_id(-1), m_sheet_id(-1) {}
+
+ long get_revision_id() const { return m_revision_id; }
+ long get_sheet_id() const { return m_sheet_id; }
+
+ void operator() (const xml_token_attr_t& attr)
+ {
+ if (attr.ns != NS_ooxml_xlsx)
+ return;
+
+ switch (attr.name)
+ {
+ case XML_rId:
+ // revision ID
+ m_revision_id = to_long(attr.value);
+ break;
+ case XML_sId:
+ // sheet ID
+ m_sheet_id = to_long(attr.value);
+ break;
+ default:
+ ;
+ }
+ }
+};
+
+class rrc_attr_parser
+{
+ long m_revision_id;
+ long m_sheet_id;
+
+ std::string_view m_ref;
+ xlsx_rev_row_column_action_t m_action_type;
+
+ bool m_end_of_list;
+
+public:
+ rrc_attr_parser() : m_revision_id(-1), m_sheet_id(-1),
+ m_action_type(xlsx_rev_rca_unknown), m_end_of_list(false) {}
+
+ long get_revision_id() const { return m_revision_id; }
+ long get_sheet_id() const { return m_sheet_id; }
+ bool is_end_of_list() const { return m_end_of_list; }
+ std::string_view get_ref() const { return m_ref; }
+ xlsx_rev_row_column_action_t get_action_type() const { return m_action_type; }
+
+ void operator() (const xml_token_attr_t& attr)
+ {
+ if (attr.ns != NS_ooxml_xlsx)
+ return;
+
+ switch (attr.name)
+ {
+ case XML_rId:
+ // revision ID
+ m_revision_id = to_long(attr.value);
+ break;
+ case XML_sId:
+ // sheet ID
+ m_sheet_id = to_long(attr.value);
+ break;
+ case XML_eol:
+ m_end_of_list = to_long(attr.value) > 0;
+ break;
+ case XML_ref:
+ if (!attr.transient)
+ m_ref = attr.value;
+ break;
+ case XML_action:
+ m_action_type = to_xlsx_rev_row_column_action_type(attr.value);
+ break;
+ default:
+ ;
+ }
+ }
+};
+
+class cell_data_attr_parser
+{
+ std::string_view m_ref;
+ xlsx_cell_t m_type;
+
+public:
+ cell_data_attr_parser() : m_type(xlsx_ct_numeric) {}
+
+ std::string_view get_ref() const { return m_ref; }
+ xlsx_cell_t get_cell_type() const { return m_type; }
+
+ void operator() (const xml_token_attr_t& attr)
+ {
+ if (attr.ns != NS_ooxml_xlsx)
+ return;
+
+ switch (attr.name)
+ {
+ case XML_r:
+ if (!attr.transient)
+ m_ref = attr.value;
+ break;
+ case XML_t:
+ m_type = to_xlsx_cell_type(attr.value);
+ default:
+ ;
+ }
+ }
+};
+
+}
+
+xlsx_revlog_context::xlsx_revlog_context(session_context& session_cxt, const tokens& tokens) :
+ xml_context_base(session_cxt, tokens),
+ m_cur_value(std::numeric_limits<double>::quiet_NaN()),
+ m_cur_cell_type(xlsx_ct_unknown), m_cur_formula(false)
+{
+}
+
+xlsx_revlog_context::~xlsx_revlog_context() {}
+
+xml_context_base* xlsx_revlog_context::create_child_context(xmlns_id_t /*ns*/, xml_token_t /*name*/)
+{
+ return nullptr;
+}
+
+void xlsx_revlog_context::end_child_context(xmlns_id_t /*ns*/, xml_token_t /*name*/, xml_context_base* /*child*/)
+{
+}
+
+void xlsx_revlog_context::start_element(xmlns_id_t ns, xml_token_t name, const vector<xml_token_attr_t>& attrs)
+{
+ xml_token_pair_t parent = push_stack(ns, name);
+
+ if (ns == NS_ooxml_xlsx)
+ {
+ switch (name)
+ {
+ case XML_revisions:
+ xml_element_expected(parent, XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN);
+ break;
+ case XML_raf:
+ // revision auto format
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_revisions);
+ break;
+ case XML_rcc:
+ {
+ // revision cell change
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_revisions);
+ rcc_attr_parser func;
+ func = for_each(attrs.begin(), attrs.end(), func);
+ cout << "* revision id: " << func.get_revision_id() << " type: cell change" << endl;
+ cout << " - sheet index: " << func.get_sheet_id() << endl;
+ m_cur_cell_type = xlsx_ct_unknown;
+ }
+ break;
+ case XML_rcft:
+ // revision merge conflict
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_revisions);
+ break;
+ case XML_rcmt:
+ // revision cell comment
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_revisions);
+ break;
+ case XML_rcv:
+ // revision custom view
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_revisions);
+ break;
+ case XML_rdn:
+ // revision defined name
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_revisions);
+ break;
+ case XML_rfmt:
+ {
+ // revision format
+ const xml_elem_set_t expected = {
+ { NS_ooxml_xlsx, XML_revisions },
+ { NS_ooxml_xlsx, XML_rm },
+ { NS_ooxml_xlsx, XML_rrc },
+ };
+ xml_element_expected(parent, expected);
+ break;
+ }
+ case XML_ris:
+ // revision insert sheet
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_revisions);
+ break;
+ case XML_rm:
+ // revision cell move
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_revisions);
+ break;
+ case XML_rqt:
+ // revision query table
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_revisions);
+ break;
+ case XML_rrc:
+ {
+ // revision row column insert delete
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_revisions);
+ rrc_attr_parser func;
+ func = for_each(attrs.begin(), attrs.end(), func);
+ cout << "* revision id: " << func.get_revision_id() << " type: row column insert delete" << endl;
+ cout << " - sheet index: " << func.get_sheet_id() << endl;
+ cout << " - action type: " << to_string(func.get_action_type()) << endl;
+ cout << " - range: " << func.get_ref() << endl;
+ cout << " - end of list: " << (func.is_end_of_list() ? "true":"false") << endl;
+ }
+ break;
+ case XML_rsnm:
+ // revision sheet name
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_revisions);
+ break;
+ case XML_oc:
+ // old cell data
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_rcc);
+ break;
+ case XML_nc:
+ {
+ // new cell data
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_rcc);
+ cell_data_attr_parser func;
+ func = for_each(attrs.begin(), attrs.end(), func);
+ m_cur_cell_type = func.get_cell_type();
+
+ m_cur_formula = false;
+ m_cur_value = 0.0;
+ m_cur_string = std::string_view{};
+
+ cout << " - new cell position: " << func.get_ref() << endl;
+ cout << " - new cell type: " << to_string(m_cur_cell_type) << endl;
+ }
+ break;
+ case XML_f:
+ {
+ xml_elem_stack_t elems;
+ elems.push_back(xml_token_pair_t(NS_ooxml_xlsx, XML_oc));
+ elems.push_back(xml_token_pair_t(NS_ooxml_xlsx, XML_nc));
+ xml_element_expected(parent, elems);
+ }
+ break;
+ case XML_v:
+ {
+ xml_elem_stack_t elems;
+ elems.push_back(xml_token_pair_t(NS_ooxml_xlsx, XML_oc));
+ elems.push_back(xml_token_pair_t(NS_ooxml_xlsx, XML_nc));
+ xml_element_expected(parent, elems);
+ }
+ break;
+ case XML_is:
+ {
+ xml_elem_stack_t elems;
+ elems.push_back(xml_token_pair_t(NS_ooxml_xlsx, XML_oc));
+ elems.push_back(xml_token_pair_t(NS_ooxml_xlsx, XML_nc));
+ xml_element_expected(parent, elems);
+ }
+ break;
+ case XML_t:
+ {
+ xml_elem_stack_t elems;
+ elems.push_back(xml_token_pair_t(NS_ooxml_xlsx, XML_is));
+ elems.push_back(xml_token_pair_t(NS_ooxml_xlsx, XML_r));
+ xml_element_expected(parent, elems);
+ }
+ break;
+ default:
+ warn_unhandled();
+ }
+ }
+}
+
+bool xlsx_revlog_context::end_element(xmlns_id_t ns, xml_token_t name)
+{
+ if (ns == NS_ooxml_xlsx)
+ {
+ switch (name)
+ {
+ case XML_nc:
+ {
+ cout << " - new cell value: ";
+ switch (m_cur_cell_type)
+ {
+ case xlsx_ct_boolean:
+ if (m_cur_value != 0.0)
+ cout << "true";
+ else
+ cout << "false";
+ break;
+ case xlsx_ct_numeric:
+ if (m_cur_formula)
+ cout << m_cur_string;
+ else
+ cout << m_cur_value;
+ break;
+ case xlsx_ct_inline_string:
+ cout << m_cur_string;
+ break;
+ default:
+ ;
+ }
+ cout << endl;
+ }
+ break;
+ default:
+ ;
+ }
+ }
+ return pop_stack(ns, name);
+}
+
+void xlsx_revlog_context::characters(std::string_view str, bool transient)
+{
+ xml_token_pair_t elem = get_current_element();
+ if (elem.first == NS_ooxml_xlsx)
+ {
+ switch (elem.second)
+ {
+ case XML_v:
+ m_cur_value = to_double(str);
+ break;
+ case XML_f:
+ m_cur_formula = true;
+ // fall through to get the string.
+ case XML_t:
+ m_cur_string = str;
+ if (transient)
+ m_cur_string = get_session_context().spool.intern(m_cur_string).first;
+ break;
+ default:
+ ;
+ }
+ }
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xlsx_revision_context.hpp b/src/liborcus/xlsx_revision_context.hpp
new file mode 100644
index 0000000..a560e07
--- /dev/null
+++ b/src/liborcus/xlsx_revision_context.hpp
@@ -0,0 +1,53 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef ORCUS_XLSX_REVHEADERS_CONTEXT_HPP
+#define ORCUS_XLSX_REVHEADERS_CONTEXT_HPP
+
+#include "xml_context_base.hpp"
+#include "xlsx_types.hpp"
+
+namespace orcus {
+
+class xlsx_revheaders_context : public xml_context_base
+{
+ std::vector<long> m_cur_sheet_ids; /// current sheet ID's.
+public:
+ xlsx_revheaders_context(session_context& session_cxt, const tokens& tokens);
+ virtual ~xlsx_revheaders_context();
+
+ virtual xml_context_base* create_child_context(xmlns_id_t ns, xml_token_t name);
+ virtual void end_child_context(xmlns_id_t ns, xml_token_t name, xml_context_base* child);
+ virtual void start_element(xmlns_id_t ns, xml_token_t name, const::std::vector<xml_token_attr_t>& attrs);
+ virtual bool end_element(xmlns_id_t ns, xml_token_t name);
+ virtual void characters(std::string_view str, bool transient);
+};
+
+class xlsx_revlog_context : public xml_context_base
+{
+ double m_cur_value;
+ std::string_view m_cur_string;
+ xlsx_cell_t m_cur_cell_type;
+
+ bool m_cur_formula;
+
+public:
+ xlsx_revlog_context(session_context& session_cxt, const tokens& tokens);
+ virtual ~xlsx_revlog_context();
+
+ virtual xml_context_base* create_child_context(xmlns_id_t ns, xml_token_t name);
+ virtual void end_child_context(xmlns_id_t ns, xml_token_t name, xml_context_base* child);
+ virtual void start_element(xmlns_id_t ns, xml_token_t name, const::std::vector<xml_token_attr_t>& attrs);
+ virtual bool end_element(xmlns_id_t ns, xml_token_t name);
+ virtual void characters(std::string_view str, bool transient);
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xlsx_session_data.cpp b/src/liborcus/xlsx_session_data.cpp
new file mode 100644
index 0000000..599a136
--- /dev/null
+++ b/src/liborcus/xlsx_session_data.cpp
@@ -0,0 +1,47 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xlsx_session_data.hpp"
+
+namespace orcus {
+
+xlsx_session_data::formula::formula(
+ spreadsheet::sheet_t _sheet, spreadsheet::row_t _row, spreadsheet::col_t _column,
+ std::string_view _exp) :
+ sheet(_sheet), exp(_exp)
+{
+ ref.column = _column;
+ ref.row = _row;
+}
+
+xlsx_session_data::array_formula::array_formula(
+ spreadsheet::sheet_t _sheet, const spreadsheet::range_t& _ref, std::string_view _exp) :
+ sheet(_sheet),
+ ref(_ref),
+ exp(_exp),
+ results(
+ std::make_shared<range_formula_results>(
+ ref.last.row-ref.first.row+1,
+ ref.last.column-ref.first.column+1))
+{
+}
+
+xlsx_session_data::shared_formula::shared_formula(
+ spreadsheet::sheet_t _sheet, spreadsheet::row_t _row, spreadsheet::col_t _column, size_t _identifier) :
+ sheet(_sheet), row(_row), column(_column), identifier(_identifier), master(false) {}
+
+xlsx_session_data::shared_formula::shared_formula(
+ spreadsheet::sheet_t _sheet, spreadsheet::row_t _row, spreadsheet::col_t _column,
+ size_t _identifier, std::string_view _formula) :
+ sheet(_sheet), row(_row), column(_column),
+ identifier(_identifier), formula(_formula), master(true) {}
+
+xlsx_session_data::~xlsx_session_data() = default;
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xlsx_session_data.hpp b/src/liborcus/xlsx_session_data.hpp
new file mode 100644
index 0000000..af254d0
--- /dev/null
+++ b/src/liborcus/xlsx_session_data.hpp
@@ -0,0 +1,92 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_XLSX_SESSION_DATA_HPP
+#define INCLUDED_ORCUS_XLSX_SESSION_DATA_HPP
+
+#include "session_context.hpp"
+#include "formula_result.hpp"
+
+#include "orcus/spreadsheet/types.hpp"
+
+#include <string>
+#include <vector>
+#include <memory>
+#include <unordered_map>
+
+namespace orcus {
+
+/**
+ * Collection of global data that need to be persistent across different
+ * parts during a single import session.
+ */
+struct xlsx_session_data : public session_context::custom_data
+{
+ struct formula
+ {
+ spreadsheet::sheet_t sheet;
+ spreadsheet::address_t ref;
+ std::string exp;
+
+ formula_result result;
+
+ formula(
+ spreadsheet::sheet_t _sheet, spreadsheet::row_t _row, spreadsheet::col_t _column,
+ std::string_view _exp);
+ };
+
+ struct array_formula
+ {
+ spreadsheet::sheet_t sheet;
+ spreadsheet::range_t ref;
+ std::string exp;
+
+ std::shared_ptr<range_formula_results> results;
+
+ array_formula(
+ spreadsheet::sheet_t sheet, const spreadsheet::range_t& ref,
+ std::string_view exp);
+ };
+
+ struct shared_formula
+ {
+ spreadsheet::sheet_t sheet;
+ spreadsheet::row_t row;
+ spreadsheet::col_t column;
+ size_t identifier;
+ std::string formula;
+ bool master;
+
+ formula_result result;
+
+ shared_formula(
+ spreadsheet::sheet_t _sheet, spreadsheet::row_t _row, spreadsheet::col_t _column,
+ size_t _identifier);
+
+ shared_formula(
+ spreadsheet::sheet_t _sheet, spreadsheet::row_t _row, spreadsheet::col_t _column,
+ size_t _identifier, std::string_view _formula);
+ };
+
+ typedef std::vector<std::unique_ptr<formula>> formulas_type;
+ typedef std::vector<std::unique_ptr<array_formula>> array_formulas_type;
+ typedef std::vector<std::unique_ptr<shared_formula>> shared_formulas_type;
+ typedef std::unordered_map<std::string_view, spreadsheet::sheet_t> sheet_name_map_type;
+
+ formulas_type m_formulas;
+ array_formulas_type m_array_formulas;
+ shared_formulas_type m_shared_formulas;
+ string_pool m_formula_result_strings;
+
+ virtual ~xlsx_session_data();
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xlsx_shared_strings_context.cpp b/src/liborcus/xlsx_shared_strings_context.cpp
new file mode 100644
index 0000000..29fac3e
--- /dev/null
+++ b/src/liborcus/xlsx_shared_strings_context.cpp
@@ -0,0 +1,253 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xlsx_shared_strings_context.hpp"
+#include "ooxml_token_constants.hpp"
+#include "ooxml_namespace_types.hpp"
+#include "xlsx_helper.hpp"
+#include "xml_context_global.hpp"
+
+#include <orcus/spreadsheet/import_interface.hpp>
+#include <orcus/measurement.hpp>
+
+#include <optional>
+
+namespace ss = orcus::spreadsheet;
+
+namespace orcus {
+
+namespace {
+
+class shared_strings_root_attr_parser
+{
+public:
+ shared_strings_root_attr_parser() : m_count(0), m_unique_count(0) {}
+
+ void operator() (const xml_token_attr_t &attr)
+ {
+ switch (attr.name)
+ {
+ case XML_count:
+ m_count = to_long(attr.value);
+ break;
+ case XML_uniqueCount:
+ m_unique_count = to_long(attr.value);
+ break;
+ }
+ }
+
+ shared_strings_root_attr_parser& operator= (const shared_strings_root_attr_parser& r)
+ {
+ m_count = r.m_count;
+ m_unique_count = r.m_unique_count;
+ return *this;
+ }
+
+ size_t get_count() const { return m_count; }
+ size_t get_unique_count() const { return m_unique_count; }
+private:
+ size_t m_count;
+ size_t m_unique_count;
+};
+
+}
+
+xlsx_shared_strings_context::xlsx_shared_strings_context(session_context& session_cxt, const tokens& tokens, spreadsheet::iface::import_shared_strings* strings) :
+ xml_context_base(session_cxt, tokens), mp_strings(strings), m_in_segments(false) {}
+
+xlsx_shared_strings_context::~xlsx_shared_strings_context() {}
+
+void xlsx_shared_strings_context::start_element(xmlns_id_t ns, xml_token_t name, const xml_token_attrs_t& attrs)
+{
+ xml_token_pair_t parent = push_stack(ns, name);
+ switch (name)
+ {
+ case XML_sst:
+ {
+ // root element for the shared string part.
+ xml_element_expected(parent, XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN);
+ if (get_config().debug)
+ print_attrs(get_tokens(), attrs);
+
+ shared_strings_root_attr_parser func;
+ func = for_each(attrs.begin(), attrs.end(), func);
+
+ if (get_config().debug)
+ std::cout << "count: " << func.get_count() << " unique count: " << func.get_unique_count() << std::endl;
+ }
+ break;
+ case XML_si:
+ // single shared string entry.
+ m_in_segments = false;
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_sst);
+ break;
+ case XML_r:
+ // rich text run
+ m_in_segments = true;
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_si);
+ break;
+ case XML_rPr:
+ // rich text run property
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_r);
+ break;
+ case XML_b:
+ // bold
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_rPr);
+ break;
+ case XML_i:
+ // italic
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_rPr);
+ break;
+ case XML_sz:
+ {
+ // font size
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_rPr);
+ std::string_view s = for_each(attrs.begin(), attrs.end(), single_attr_getter(m_pool, NS_ooxml_xlsx, XML_val)).get_value();
+ double point = to_double(s);
+ mp_strings->set_segment_font_size(point);
+ }
+ break;
+ case XML_color:
+ {
+ // font color
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_rPr);
+
+ std::optional<std::string_view> rgb;
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ switch (attr.name)
+ {
+ case XML_rgb:
+ rgb = attr.value;
+ break;
+ case XML_theme:
+ // TODO : handle this.
+ break;
+ }
+ }
+
+ if (rgb)
+ {
+ ss::color_elem_t alpha;
+ ss::color_elem_t red;
+ ss::color_elem_t green;
+ ss::color_elem_t blue;
+ if (to_rgb(*rgb, alpha, red, green, blue))
+ mp_strings->set_segment_font_color(alpha, red, green, blue);
+ }
+ }
+ break;
+ case XML_rFont:
+ {
+ // font
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_rPr);
+ std::string_view font = for_each(attrs.begin(), attrs.end(), single_attr_getter(m_pool, NS_ooxml_xlsx, XML_val)).get_value();
+ mp_strings->set_segment_font_name(font);
+ }
+ break;
+ case XML_family:
+ // font family
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_rPr);
+ break;
+ case XML_scheme:
+ // font scheme
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_rPr);
+ break;
+ case XML_t:
+ {
+ // actual text stored as its content.
+ const xml_elem_set_t expected = {
+ { NS_ooxml_xlsx, XML_r },
+ { NS_ooxml_xlsx, XML_rPh },
+ { NS_ooxml_xlsx, XML_si },
+ };
+ xml_element_expected(parent, expected);
+ }
+ break;
+ default:
+ warn_unhandled();
+ }
+}
+
+bool xlsx_shared_strings_context::end_element(xmlns_id_t ns, xml_token_t name)
+{
+ switch (name)
+ {
+ case XML_t:
+ break;
+ case XML_b:
+ mp_strings->set_segment_bold(true);
+ break;
+ case XML_i:
+ mp_strings->set_segment_italic(true);
+ break;
+ case XML_r:
+ mp_strings->append_segment(m_cur_str);
+ break;
+ case XML_si:
+ {
+ if (m_in_segments)
+ // commit all formatted segments.
+ mp_strings->commit_segments();
+ else
+ {
+ // unformatted text should only have one text segment.
+ mp_strings->append(m_cur_str);
+ }
+ }
+ break;
+ }
+ return pop_stack(ns, name);
+}
+
+void xlsx_shared_strings_context::characters(std::string_view str, bool transient)
+{
+ xml_token_pair_t cur_token = get_current_element();
+ if (cur_token.first == NS_ooxml_xlsx && cur_token.second == XML_t)
+ {
+ m_cur_str = str;
+
+ // In case the string contains carriage returns (CRs), remove them.
+ m_cell_buffer.reset();
+ const char* p = m_cur_str.data();
+ const char* p_end = p + m_cur_str.size();
+ const char* p0 = nullptr;
+
+ for (; p != p_end; ++p)
+ {
+ if (!p0)
+ p0 = p;
+
+ if (*p == 0x0D)
+ {
+ // Append the segment up to this CR, and skip the CR.
+ m_cell_buffer.append(p0, std::distance(p0, p));
+ p0 = nullptr;
+ }
+ }
+
+ if (!m_cell_buffer.empty())
+ {
+ // This string contains at least one CR.
+
+ if (p0)
+ // Append the tail end.
+ m_cell_buffer.append(p0, std::distance(p0, p));
+
+ m_cur_str = m_pool.intern(m_cell_buffer.str()).first;
+ transient = false;
+ }
+
+ if (transient)
+ m_cur_str = m_pool.intern(m_cur_str).first;
+ }
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xlsx_shared_strings_context.hpp b/src/liborcus/xlsx_shared_strings_context.hpp
new file mode 100644
index 0000000..b10d9fd
--- /dev/null
+++ b/src/liborcus/xlsx_shared_strings_context.hpp
@@ -0,0 +1,48 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#pragma once
+
+#include <orcus/spreadsheet/types.hpp>
+#include <orcus/string_pool.hpp>
+#include <orcus/cell_buffer.hpp>
+
+#include "xml_context_base.hpp"
+#include "xlsx_types.hpp"
+
+namespace orcus {
+
+namespace spreadsheet { namespace iface {
+ class import_shared_strings;
+}}
+
+/**
+ * Context for xl/sharedStrings.xml part.
+ */
+class xlsx_shared_strings_context : public xml_context_base
+{
+public:
+ xlsx_shared_strings_context(
+ session_context& session_cxt, const tokens& tokens,
+ spreadsheet::iface::import_shared_strings* strings);
+ virtual ~xlsx_shared_strings_context();
+
+ virtual void start_element(xmlns_id_t ns, xml_token_t name, const xml_token_attrs_t& attrs);
+ virtual bool end_element(xmlns_id_t ns, xml_token_t name);
+ virtual void characters(std::string_view str, bool transient);
+
+private:
+ spreadsheet::iface::import_shared_strings* mp_strings = nullptr;
+ string_pool m_pool;
+ cell_buffer m_cell_buffer;
+ std::string_view m_cur_str;
+ bool m_in_segments;
+};
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xlsx_sheet_context.cpp b/src/liborcus/xlsx_sheet_context.cpp
new file mode 100644
index 0000000..1363c51
--- /dev/null
+++ b/src/liborcus/xlsx_sheet_context.cpp
@@ -0,0 +1,943 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xlsx_sheet_context.hpp"
+#include "xlsx_session_data.hpp"
+#include "xlsx_types.hpp"
+#include "ooxml_global.hpp"
+#include "ooxml_schemas.hpp"
+#include "ooxml_token_constants.hpp"
+#include "ooxml_namespace_types.hpp"
+#include "xml_context_global.hpp"
+#include "orcus/exception.hpp"
+#include "orcus/spreadsheet/import_interface.hpp"
+#include "orcus/spreadsheet/import_interface_view.hpp"
+#include "orcus/measurement.hpp"
+
+#include <mdds/sorted_string_map.hpp>
+
+#include <algorithm>
+#include <sstream>
+#include <vector>
+#include <optional>
+
+namespace ss = orcus::spreadsheet;
+
+namespace orcus {
+
+namespace {
+
+namespace sheet_pane {
+
+using map_type = mdds::sorted_string_map<ss::sheet_pane_t, mdds::string_view_map_entry>;
+
+// Keys must be sorted.
+constexpr map_type::entry entries[] = {
+ { "bottomLeft", ss::sheet_pane_t::bottom_left },
+ { "bottomRight", ss::sheet_pane_t::bottom_right },
+ { "topLeft", ss::sheet_pane_t::top_left },
+ { "topRight", ss::sheet_pane_t::top_right },
+};
+
+const map_type& get()
+{
+ static const map_type mt(entries, std::size(entries), ss::sheet_pane_t::unspecified);
+ return mt;
+}
+
+}
+
+namespace pane_state {
+
+using map_type = mdds::sorted_string_map<ss::pane_state_t, mdds::string_view_map_entry>;
+
+// Keys must be sorted.
+constexpr map_type::entry entries[] = {
+ { "frozen", ss::pane_state_t::frozen },
+ { "frozenSplit", ss::pane_state_t::frozen_split },
+ { "split", ss::pane_state_t::split },
+};
+
+const map_type& get()
+{
+ static const map_type mt(entries, std::size(entries), ss::pane_state_t::unspecified);
+ return mt;
+}
+
+} // namespace pane_state
+
+namespace formula_type {
+
+using map_type = mdds::sorted_string_map<ss::formula_t, mdds::string_view_map_entry>;
+
+// Keys must be sorted.
+constexpr map_type::entry entries[] = {
+ { "array", ss::formula_t::array },
+ { "dataTable", ss::formula_t::data_table },
+ { "normal", ss::formula_t::normal },
+ { "shared", ss::formula_t::shared },
+};
+
+const map_type& get()
+{
+ static const map_type mt(entries, std::size(entries), ss::formula_t::unknown);
+ return mt;
+}
+
+} // namespace formula_type
+
+} // anonymous namespace
+
+xlsx_sheet_context::formula::formula() :
+ type(ss::formula_t::unknown),
+ str(),
+ data_table_ref1(),
+ data_table_ref2(),
+ shared_id(-1),
+ data_table_2d(false),
+ data_table_row_based(false),
+ data_table_ref1_deleted(false),
+ data_table_ref2_deleted(false)
+{
+ ref.first.column = -1;
+ ref.first.row = -1;
+ ref.last = ref.first;
+}
+
+void xlsx_sheet_context::formula::reset()
+{
+ *this = formula();
+}
+
+xlsx_sheet_context::xlsx_sheet_context(
+ session_context& session_cxt, const tokens& tokens, ss::sheet_t sheet_id,
+ ss::iface::import_reference_resolver& resolver,
+ ss::iface::import_sheet& sheet) :
+ xml_context_base(session_cxt, tokens),
+ m_resolver(resolver),
+ m_sheet(sheet),
+ m_sheet_id(sheet_id),
+ m_cur_row(-1),
+ m_cur_col(-1),
+ m_cur_cell_type(xlsx_ct_numeric),
+ m_cur_cell_xf(0),
+ m_cxt_autofilter(session_cxt, tokens, m_resolver),
+ m_cxt_cond_format(session_cxt, tokens, m_sheet.get_conditional_format())
+{
+ register_child(&m_cxt_autofilter);
+ register_child(&m_cxt_cond_format);
+
+ init_ooxml_context(*this);
+}
+
+xlsx_sheet_context::~xlsx_sheet_context()
+{
+}
+
+xml_context_base* xlsx_sheet_context::create_child_context(xmlns_id_t ns, xml_token_t name)
+{
+ if (ns == NS_ooxml_xlsx && name == XML_autoFilter)
+ {
+ m_cxt_autofilter.reset();
+ return &m_cxt_autofilter;
+ }
+ else if (ns == NS_ooxml_xlsx && name == XML_conditionalFormatting)
+ {
+ m_cxt_cond_format.reset();
+ return &m_cxt_cond_format;
+ }
+ return nullptr;
+}
+
+void xlsx_sheet_context::end_child_context(xmlns_id_t ns, xml_token_t name, xml_context_base* child)
+{
+ if (!child)
+ return;
+
+ if (ns == NS_ooxml_xlsx && name == XML_autoFilter)
+ {
+ ss::iface::import_auto_filter* af = m_sheet.get_auto_filter();
+ if (!af)
+ return;
+
+ const xlsx_autofilter_context& cxt = static_cast<const xlsx_autofilter_context&>(*child);
+ cxt.push_to_model(*af);
+ }
+}
+
+void xlsx_sheet_context::start_element(xmlns_id_t ns, xml_token_t name, const xml_token_attrs_t& attrs)
+{
+ xml_token_pair_t parent = push_stack(ns, name);
+
+ if (ns == NS_ooxml_xlsx)
+ {
+ switch (name)
+ {
+ case XML_worksheet:
+ {
+ if (get_config().debug)
+ print_attrs(get_tokens(), attrs);
+ break;
+ }
+ case XML_cols:
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_worksheet);
+ break;
+ case XML_col:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_cols);
+ start_element_col(attrs);
+ break;
+ }
+ case XML_dimension:
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_worksheet);
+ break;
+ case XML_mergeCells:
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_worksheet);
+ break;
+ case XML_mergeCell:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_mergeCells);
+
+ ss::iface::import_sheet_properties* sheet_props = m_sheet.get_sheet_properties();
+ if (sheet_props)
+ {
+ // ref contains merged range in A1 reference style.
+ std::string_view ref = for_each(
+ attrs.begin(), attrs.end(), single_attr_getter(m_pool, NS_ooxml_xlsx, XML_ref)).get_value();
+
+ ss::src_range_t range = m_resolver.resolve_range(ref);
+ sheet_props->set_merge_cell_range(to_rc_range(range));
+ }
+ break;
+ }
+ case XML_pageMargins:
+ {
+ xml_elem_stack_t elems;
+ elems.push_back(xml_token_pair_t(NS_ooxml_xlsx, XML_worksheet));
+ elems.push_back(xml_token_pair_t(NS_ooxml_xlsx, XML_customSheetView));
+ xml_element_expected(parent, elems);
+ break;
+ }
+ case XML_sheetViews:
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_worksheet);
+ break;
+ case XML_sheetView:
+ start_element_sheet_view(parent, attrs);
+ break;
+ case XML_selection:
+ start_element_selection(parent, attrs);
+ break;
+ case XML_pane:
+ start_element_pane(parent, attrs);
+ break;
+ case XML_sheetData:
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_worksheet);
+ break;
+ case XML_sheetFormatPr:
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_worksheet);
+ break;
+ case XML_row:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_sheetData);
+ start_element_row(attrs);
+ break;
+ }
+ case XML_c:
+ {
+ start_element_cell(parent, attrs);
+ break;
+ }
+ case XML_f:
+ start_element_formula(parent, attrs);
+ break;
+ case XML_v:
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_c);
+ break;
+ case XML_tableParts:
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_worksheet);
+ break;
+ case XML_tablePart:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_tableParts);
+
+ // The rid string must be pooled to the session context's string
+ // pool as it is used long after thet sheet context is deleted.
+ single_attr_getter func(get_session_context().spool, NS_ooxml_r, XML_id);
+ std::string_view rid = for_each(attrs.begin(), attrs.end(), func).get_value();
+
+ std::unique_ptr<xlsx_rel_table_info> p(new xlsx_rel_table_info);
+ p->sheet_interface = &m_sheet;
+ m_rel_extras.data.insert(
+ opc_rel_extras_t::map_type::value_type(rid, std::move(p)));
+ break;
+ }
+ default:
+ warn_unhandled();
+ }
+ }
+ else
+ warn_unhandled();
+}
+
+bool xlsx_sheet_context::end_element(xmlns_id_t ns, xml_token_t name)
+{
+ if (ns == NS_ooxml_xlsx)
+ {
+ switch (name)
+ {
+ case XML_c:
+ end_element_cell();
+ break;
+ case XML_f:
+ m_cur_formula.str = m_cur_str;
+ break;
+ case XML_v:
+ m_cur_value = m_cur_str;
+ break;
+ default:
+ ;
+ }
+ }
+
+ m_cur_str = std::string_view{};
+ return pop_stack(ns, name);
+}
+
+void xlsx_sheet_context::characters(std::string_view str, bool transient)
+{
+ m_cur_str = intern_in_context(str, transient);
+}
+
+void xlsx_sheet_context::start_element_formula(const xml_token_pair_t& parent, const xml_token_attrs_t& attrs)
+{
+ const xml_elem_set_t expected = {
+ { NS_ooxml_xlsx, XML_c },
+ { NS_mso_x14, XML_cfRule },
+ };
+ xml_element_expected(parent, expected);
+
+ m_cur_formula.reset();
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.ns && attr.ns != NS_ooxml_xlsx)
+ continue;
+
+ switch (attr.name)
+ {
+ case XML_t:
+ m_cur_formula.type = formula_type::get().find(attr.value);
+ break;
+ case XML_ref:
+ m_cur_formula.ref = to_rc_range(m_resolver.resolve_range(attr.value));
+ break;
+ case XML_si:
+ m_cur_formula.shared_id = to_long(attr.value);
+ break;
+ case XML_dt2D:
+ m_cur_formula.data_table_2d = to_long(attr.value) != 0;
+ break;
+ case XML_dtr:
+ m_cur_formula.data_table_row_based = to_long(attr.value) != 0;
+ break;
+ case XML_del1:
+ m_cur_formula.data_table_ref1_deleted = to_long(attr.value) != 0;
+ break;
+ case XML_del2:
+ m_cur_formula.data_table_ref2_deleted = to_long(attr.value) != 0;
+ break;
+ case XML_r1:
+ m_cur_formula.data_table_ref1 = intern_in_context(attr);
+ break;
+ case XML_r2:
+ m_cur_formula.data_table_ref2 = intern_in_context(attr);
+ break;
+ default:
+ ;
+ }
+ }
+}
+
+void xlsx_sheet_context::start_element_sheet_view(
+ const xml_token_pair_t& parent, const xml_token_attrs_t& attrs)
+{
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_sheetViews);
+
+ ss::iface::import_sheet_view* view = m_sheet.get_sheet_view();
+ if (!view)
+ return;
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (!attr.ns || attr.ns == NS_ooxml_xlsx)
+ {
+ switch (attr.name)
+ {
+ case XML_tabSelected:
+ {
+ bool v = to_bool(attr.value);
+ if (v)
+ // This sheet is active.
+ view->set_sheet_active();
+ break;
+ }
+ default:
+ ;
+ }
+ }
+ }
+}
+
+void xlsx_sheet_context::start_element_selection(
+ const xml_token_pair_t& parent, const xml_token_attrs_t& attrs)
+{
+ xml_elem_stack_t elems;
+ elems.emplace_back(NS_ooxml_xlsx, XML_sheetView);
+ elems.emplace_back(NS_ooxml_xlsx, XML_customSheetView);
+ xml_element_expected(parent, elems);
+
+ ss::iface::import_sheet_view* view = m_sheet.get_sheet_view();
+ if (!view)
+ return;
+
+ // example: <selection pane="topRight" activeCell="H2" sqref="H2:L2"/>
+
+ ss::sheet_pane_t pane = ss::sheet_pane_t::unspecified;
+ ss::range_t range;
+ range.first.column = -1;
+ range.first.row = -1;
+ range.last = range.first;
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (!attr.ns || attr.ns == NS_ooxml_xlsx)
+ {
+ switch (attr.name)
+ {
+ case XML_pane:
+ {
+ pane = sheet_pane::get().find(attr.value);
+ break;
+ }
+ case XML_activeCell:
+ // Single cell where the cursor is. Ignore this for now.
+ break;
+ case XML_sqref:
+ {
+ // Single cell address for a non-range cursor, or range
+ // address if a range selection is present.
+ range = to_rc_range(m_resolver.resolve_range(attr.value));
+ break;
+ }
+ default:
+ ;
+ }
+ }
+ }
+
+ if (pane == ss::sheet_pane_t::unspecified)
+ pane = ss::sheet_pane_t::top_left;
+
+ view->set_selected_range(pane, range);
+}
+
+void xlsx_sheet_context::start_element_pane(
+ const xml_token_pair_t& parent, const xml_token_attrs_t& attrs)
+{
+ xml_elem_stack_t elems;
+ elems.emplace_back(NS_ooxml_xlsx, XML_sheetView);
+ elems.emplace_back(NS_ooxml_xlsx, XML_customSheetView);
+ xml_element_expected(parent, elems);
+
+ ss::iface::import_sheet_view* view = m_sheet.get_sheet_view();
+ if (!view)
+ return;
+
+ // <pane xSplit="4" ySplit="8" topLeftCell="E9" activePane="bottomRight" state="frozen"/>
+
+ double xsplit = 0.0, ysplit = 0.0;
+ ss::address_t top_left_cell;
+ ss::sheet_pane_t active_pane = ss::sheet_pane_t::unspecified;
+ ss::pane_state_t pane_state = ss::pane_state_t::unspecified;
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.ns && attr.ns != NS_ooxml_xlsx)
+ continue;
+
+ switch (attr.name)
+ {
+ case XML_xSplit:
+ xsplit = to_double(attr.value);
+ break;
+ case XML_ySplit:
+ ysplit = to_double(attr.value);
+ break;
+ case XML_topLeftCell:
+ top_left_cell = to_rc_address(m_resolver.resolve_address(attr.value));
+ break;
+ case XML_activePane:
+ active_pane = sheet_pane::get().find(attr.value);
+ break;
+ case XML_state:
+ pane_state = pane_state::get().find(attr.value);
+ break;
+ default:
+ ;
+ }
+ }
+
+ if (active_pane == ss::sheet_pane_t::unspecified)
+ active_pane = ss::sheet_pane_t::top_left;
+
+ if (pane_state == ss::pane_state_t::unspecified)
+ pane_state = ss::pane_state_t::split;
+
+ switch (pane_state)
+ {
+ case ss::pane_state_t::frozen:
+ view->set_frozen_pane(xsplit, ysplit, top_left_cell, active_pane);
+ break;
+ case ss::pane_state_t::split:
+ view->set_split_pane(xsplit, ysplit, top_left_cell, active_pane);
+ break;
+ case ss::pane_state_t::frozen_split:
+ warn("FIXME: frozen-split state not yet handled.");
+ break;
+ default:
+ ;
+ }
+}
+
+void xlsx_sheet_context::start_element_cell(const xml_token_pair_t& parent, const xml_token_attrs_t& attrs)
+{
+ xlsx_cell_t cell_type = xlsx_ct_numeric;
+ ss::address_t address;
+ address.column = 0;
+ address.row = 0;
+ size_t xf = 0;
+ bool contains_address = false;
+
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_row);
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ switch (attr.name)
+ {
+ case XML_r:
+ // cell address in A1 notation.
+ address = to_rc_address(
+ m_resolver.resolve_address(attr.value));
+
+ contains_address = true;
+ break;
+ case XML_t:
+ // cell type
+ cell_type = to_xlsx_cell_type(attr.value);
+ break;
+ case XML_s:
+ // cell style
+ xf = to_long(attr.value);
+ break;
+ }
+ }
+
+ if (contains_address)
+ {
+ if (m_cur_row != address.row)
+ {
+ std::ostringstream os;
+ os << "row numbers differ! (current=" << m_cur_row << ")";
+ throw xml_structure_error(os.str());
+ }
+
+ m_cur_col = address.column;
+ }
+ else
+ {
+ ++m_cur_col;
+ }
+
+ m_cur_cell_type = cell_type;
+ m_cur_cell_xf = xf;
+}
+
+void xlsx_sheet_context::start_element_col(const xml_token_attrs_t& attrs)
+{
+ long col_min = 0; // 1-based
+ long col_max = 0; // 1-based
+ bool col_hidden = false;
+ std::optional<double> col_width;
+ std::optional<std::size_t> xfid;
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.value.empty())
+ continue;
+
+ switch (attr.name)
+ {
+ case XML_min:
+ col_min = to_long(attr.value);
+ break;
+ case XML_max:
+ col_max = to_long(attr.value);
+ break;
+ case XML_width:
+ col_width = to_double(attr.value);
+ break;
+ case XML_hidden:
+ col_hidden = to_long(attr.value);
+ break;
+ case XML_style:
+ xfid = to_long(attr.value);
+ break;
+ }
+ }
+
+ if (!col_min || !col_max || col_min > col_max)
+ {
+ std::ostringstream os;
+ os << "column element has invalid column indices: (min=" << col_min << "; max=" << col_max << ")";
+ warn(os.str());
+ return;
+ }
+
+ if (xfid)
+ m_sheet.set_column_format(col_min - 1, col_max - col_min + 1, *xfid);
+
+ ss::iface::import_sheet_properties* sheet_props = m_sheet.get_sheet_properties();
+ if (sheet_props)
+ {
+ if (col_width)
+ sheet_props->set_column_width(
+ col_min - 1, col_max - col_min + 1, *col_width, length_unit_t::xlsx_column_digit);
+
+ sheet_props->set_column_hidden(col_min - 1, col_max - col_min + 1, col_hidden);
+ }
+}
+
+void xlsx_sheet_context::start_element_row(const xml_token_attrs_t& attrs)
+{
+ std::optional<ss::row_t> row;
+ length_t height;
+ bool hidden = false;
+ bool custom_format = false;
+ std::optional<std::size_t> xfid;
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ switch (attr.name)
+ {
+ case XML_r:
+ {
+ // row index
+ long this_row = to_long(attr.value);
+ if (!this_row)
+ throw xml_structure_error("row number can never be zero!");
+
+ this_row -= 1; // from 1-based to 0-based.
+ row = this_row;
+ break;
+ }
+ case XML_ht:
+ {
+ height.value = to_double(attr.value);
+ height.unit = length_unit_t::point;
+ break;
+ }
+ case XML_hidden:
+ hidden = to_long(attr.value) != 0;
+ break;
+ case XML_s:
+ xfid = to_long(attr.value);
+ break;
+ case XML_customFormat:
+ custom_format = to_bool(attr.value);
+ break;
+ }
+ }
+
+ if (row)
+ m_cur_row = *row;
+ else
+ ++m_cur_row;
+
+ m_cur_col = -1;
+
+ if (custom_format && xfid)
+ // The specs say we only honor this style id only when the custom format is set.
+ m_sheet.set_row_format(m_cur_row, *xfid);
+
+ ss::iface::import_sheet_properties* sheet_props = m_sheet.get_sheet_properties();
+ if (sheet_props)
+ {
+ if (height.unit != length_unit_t::unknown)
+ sheet_props->set_row_height(m_cur_row, height.value, height.unit);
+
+ sheet_props->set_row_hidden(m_cur_row, hidden);
+ }
+}
+
+void xlsx_sheet_context::end_element_cell()
+{
+ session_context& cxt = get_session_context();
+ auto& session_data = cxt.get_data<xlsx_session_data>();
+
+ bool array_formula_result = handle_array_formula_result(session_data);
+
+ if (array_formula_result)
+ {
+ // Do nothing.
+ }
+ else if (!m_cur_formula.str.empty())
+ {
+ if (m_cur_formula.type == ss::formula_t::shared && m_cur_formula.shared_id >= 0)
+ {
+ // shared formula expression
+ session_data.m_shared_formulas.push_back(
+ std::make_unique<xlsx_session_data::shared_formula>(
+ m_sheet_id, m_cur_row, m_cur_col, m_cur_formula.shared_id,
+ m_cur_formula.str
+ )
+ );
+
+ xlsx_session_data::shared_formula& f = *session_data.m_shared_formulas.back();
+ push_raw_cell_result(f.result, session_data);
+ }
+ else if (m_cur_formula.type == ss::formula_t::array)
+ {
+ // array formula expression
+ session_data.m_array_formulas.push_back(
+ std::make_unique<xlsx_session_data::array_formula>(
+ m_sheet_id, m_cur_formula.ref, m_cur_formula.str
+ )
+ );
+
+ xlsx_session_data::array_formula& af = *session_data.m_array_formulas.back();
+ push_raw_cell_result(*af.results, 0, 0, session_data);
+ m_array_formula_results.push_back(std::make_pair(m_cur_formula.ref, af.results));
+ }
+ else
+ {
+ // normal (non-shared) formula expression
+ session_data.m_formulas.push_back(
+ std::make_unique<xlsx_session_data::formula>(
+ m_sheet_id, m_cur_row, m_cur_col, m_cur_formula.str
+ )
+ );
+
+ xlsx_session_data::formula& f = *session_data.m_formulas.back();
+ push_raw_cell_result(f.result, session_data);
+ }
+ }
+ else if (m_cur_formula.type == ss::formula_t::shared && m_cur_formula.shared_id >= 0)
+ {
+ // shared formula without formula expression
+ session_data.m_shared_formulas.push_back(
+ std::make_unique<xlsx_session_data::shared_formula>(
+ m_sheet_id, m_cur_row, m_cur_col, m_cur_formula.shared_id));
+
+ xlsx_session_data::shared_formula& f = *session_data.m_shared_formulas.back();
+ push_raw_cell_result(f.result, session_data);
+ }
+ else if (m_cur_formula.type == ss::formula_t::data_table)
+ {
+ // Import data table.
+ ss::iface::import_data_table* dt = m_sheet.get_data_table();
+ if (dt)
+ {
+ if (m_cur_formula.data_table_2d)
+ {
+ dt->set_type(ss::data_table_type_t::both);
+ dt->set_range(m_cur_formula.ref);
+ dt->set_first_reference(
+ m_cur_formula.data_table_ref1,
+ m_cur_formula.data_table_ref1_deleted);
+ dt->set_second_reference(
+ m_cur_formula.data_table_ref2,
+ m_cur_formula.data_table_ref2_deleted);
+ }
+ else if (m_cur_formula.data_table_row_based)
+ {
+ dt->set_type(ss::data_table_type_t::row);
+ dt->set_range(m_cur_formula.ref);
+ dt->set_first_reference(
+ m_cur_formula.data_table_ref1,
+ m_cur_formula.data_table_ref1_deleted);
+ }
+ else
+ {
+ dt->set_type(ss::data_table_type_t::column);
+ dt->set_range(m_cur_formula.ref);
+ dt->set_first_reference(
+ m_cur_formula.data_table_ref1,
+ m_cur_formula.data_table_ref1_deleted);
+ }
+ dt->commit();
+ }
+
+ push_raw_cell_value();
+ }
+ else if (!m_cur_value.empty())
+ {
+ push_raw_cell_value();
+ }
+
+ if (m_cur_cell_xf)
+ m_sheet.set_format(m_cur_row, m_cur_col, m_cur_cell_xf);
+
+ // reset cell related parameters.
+ m_cur_value = std::string_view{};
+ m_cur_formula.reset();
+ m_cur_cell_xf = 0;
+ m_cur_cell_type = xlsx_ct_numeric;
+}
+
+void xlsx_sheet_context::push_raw_cell_value()
+{
+ if (m_cur_value.empty())
+ return;
+
+ switch (m_cur_cell_type)
+ {
+ case xlsx_ct_shared_string:
+ {
+ // string cell
+ size_t str_id = to_long(m_cur_value);
+ m_sheet.set_string(m_cur_row, m_cur_col, str_id);
+ }
+ break;
+ case xlsx_ct_numeric:
+ {
+ // value cell
+ double val = to_double(m_cur_value);
+ m_sheet.set_value(m_cur_row, m_cur_col, val);
+ }
+ break;
+ case xlsx_ct_boolean:
+ {
+ // boolean cell
+ bool val = to_long(m_cur_value) != 0;
+ m_sheet.set_bool(m_cur_row, m_cur_col, val);
+ }
+ break;
+ default:
+ warn("unhanlded cell content type");
+ }
+}
+
+void xlsx_sheet_context::push_raw_cell_result(
+ range_formula_results& res, size_t row_offset, size_t col_offset, xlsx_session_data& /*session_data*/) const
+{
+ if (m_cur_value.empty())
+ return;
+
+ switch (m_cur_cell_type)
+ {
+ case xlsx_ct_numeric:
+ {
+ // value cell
+ double val = to_double(m_cur_value);
+ res.set(row_offset, col_offset, val);
+ break;
+ }
+ case xlsx_ct_boolean:
+ {
+ // boolean cell
+ bool val = to_long(m_cur_value) != 0;
+ res.set(row_offset, col_offset, val);
+ break;
+ }
+ default:
+ warn("unhanlded cell content type");
+ }
+}
+
+void xlsx_sheet_context::push_raw_cell_result(formula_result& res, xlsx_session_data& session_data) const
+{
+ switch (m_cur_cell_type)
+ {
+ case xlsx_ct_numeric:
+ res.type = formula_result::result_type::numeric;
+ res.value_numeric = to_double(m_cur_value);
+ break;
+ case xlsx_ct_formula_string:
+ {
+ std::string_view interned = session_data.m_formula_result_strings.intern(m_cur_value).first;
+ res.type = formula_result::result_type::string;
+ res.value_string.p = interned.data();
+ res.value_string.n = interned.size();
+ break;
+ }
+ default:
+ {
+ std::ostringstream os;
+ os << "unhandled cached formula result (type=" << m_cur_cell_type << ")";
+ warn(os.str().data());
+ }
+ }
+}
+
+bool xlsx_sheet_context::handle_array_formula_result(xlsx_session_data& session_data)
+{
+ // See if the current cell is within an array formula range.
+ auto it = m_array_formula_results.begin(), ite = m_array_formula_results.end();
+
+ while (it != ite)
+ {
+ const ss::range_t& ref = it->first;
+
+ if (ref.last.row < m_cur_row)
+ {
+ // If this result range lies above the current row, delete it as
+ // we no longer have use for it.
+
+ m_array_formula_results.erase(it++);
+ continue;
+ }
+
+ if (m_cur_col < ref.first.column || ref.last.column < m_cur_col || m_cur_row < ref.first.row || ref.last.row < m_cur_row)
+ {
+ // This cell is not within this array formula range. Move on to
+ // the next one.
+ ++it;
+ continue;
+ }
+
+ size_t row_offset = m_cur_row - ref.first.row;
+ size_t col_offset = m_cur_col - ref.first.column;
+ range_formula_results& res = *it->second;
+ push_raw_cell_result(res, row_offset, col_offset, session_data);
+
+ return true;
+ }
+
+ return false;
+}
+
+std::string_view xlsx_sheet_context::intern_in_context(const xml_token_attr_t& attr)
+{
+ return intern_in_context(attr.value, attr.transient);
+}
+
+std::string_view xlsx_sheet_context::intern_in_context(const std::string_view& str, bool transient)
+{
+ if (transient)
+ return m_pool.intern(str).first;
+
+ return str;
+}
+
+void xlsx_sheet_context::pop_rel_extras(opc_rel_extras_t& other)
+{
+ m_rel_extras.swap(other);
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xlsx_sheet_context.hpp b/src/liborcus/xlsx_sheet_context.hpp
new file mode 100644
index 0000000..c91382d
--- /dev/null
+++ b/src/liborcus/xlsx_sheet_context.hpp
@@ -0,0 +1,141 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef ORCUS_XLSX_SHEET_CONTEXT_HPP
+#define ORCUS_XLSX_SHEET_CONTEXT_HPP
+
+#include "xml_context_base.hpp"
+#include "ooxml_types.hpp"
+#include "xlsx_types.hpp"
+#include "xlsx_autofilter_context.hpp"
+#include "xlsx_conditional_format_context.hpp"
+
+#include "orcus/spreadsheet/types.hpp"
+#include "orcus/string_pool.hpp"
+
+#include <list>
+
+namespace orcus {
+
+struct session_context;
+struct formula_result;
+struct xlsx_session_data;
+class range_formula_results;
+
+namespace spreadsheet { namespace iface {
+
+class import_sheet;
+class import_reference_resolver;
+
+}}
+
+/**
+ * Top-level context for xl/worksheets/sheet<num>.xml.
+ */
+class xlsx_sheet_context : public xml_context_base
+{
+public:
+
+ struct formula
+ {
+ spreadsheet::formula_t type;
+ spreadsheet::range_t ref; /// formula reference range
+ std::string_view str; /// formula expression string
+ std::string_view data_table_ref1;
+ std::string_view data_table_ref2;
+ int shared_id;
+ bool data_table_2d:1;
+ bool data_table_row_based:1;
+ bool data_table_ref1_deleted:1;
+ bool data_table_ref2_deleted:1;
+ formula();
+
+ void reset();
+ };
+
+ using array_formula_pair_type = std::pair<spreadsheet::range_t, std::shared_ptr<range_formula_results>>;
+ using array_formula_results_type = std::list<array_formula_pair_type>;
+
+ xlsx_sheet_context(
+ session_context& session_cxt, const tokens& tokens,
+ spreadsheet::sheet_t sheet_id,
+ spreadsheet::iface::import_reference_resolver& resolver,
+ spreadsheet::iface::import_sheet& sheet);
+ virtual ~xlsx_sheet_context();
+
+ virtual xml_context_base* create_child_context(xmlns_id_t ns, xml_token_t name);
+ virtual void end_child_context(xmlns_id_t ns, xml_token_t name, xml_context_base* child);
+
+ virtual void start_element(xmlns_id_t ns, xml_token_t name, const xml_token_attrs_t& attrs);
+ virtual bool end_element(xmlns_id_t ns, xml_token_t name);
+ virtual void characters(std::string_view str, bool transient);
+
+ void pop_rel_extras(opc_rel_extras_t& other);
+
+private:
+ void start_element_formula(const xml_token_pair_t& parent, const xml_token_attrs_t& attrs);
+ void start_element_sheet_view(const xml_token_pair_t& parent, const xml_token_attrs_t& attrs);
+ void start_element_selection(const xml_token_pair_t& parent, const xml_token_attrs_t& attrs);
+ void start_element_pane(const xml_token_pair_t& parent, const xml_token_attrs_t& attrs);
+ void start_element_cell(const xml_token_pair_t& parent, const xml_token_attrs_t& attrs);
+ void start_element_col(const xml_token_attrs_t& attrs);
+ void start_element_row(const xml_token_attrs_t& attrs);
+
+ void end_element_cell();
+ void push_raw_cell_value();
+ void push_raw_cell_result(range_formula_results& res, size_t row_offset, size_t col_offset, xlsx_session_data& session_data) const;
+ void push_raw_cell_result(formula_result& res, xlsx_session_data& session_data) const;
+
+ /**
+ * See if the current cell is a part of an array formula, and if so, store
+ * its value as a cached result.
+ *
+ * @return true if this is part of an array formula, false otherwise.
+ */
+ bool handle_array_formula_result(xlsx_session_data& session_data);
+
+ /**
+ * Potentially intern a transient attribute string value for the duration
+ * of the current sheet context.
+ */
+ std::string_view intern_in_context(const xml_token_attr_t& attr);
+
+ /**
+ * Potentially intern a transient string value for the duration of the
+ * current sheet context.
+ */
+ std::string_view intern_in_context(const std::string_view& str, bool transient);
+
+private:
+ spreadsheet::iface::import_reference_resolver& m_resolver;
+ spreadsheet::iface::import_sheet& m_sheet; /// sheet model instance for the loaded document.
+ string_pool m_pool;
+ spreadsheet::sheet_t m_sheet_id; /// ID of this sheet.
+ spreadsheet::row_t m_cur_row;
+ spreadsheet::col_t m_cur_col;
+ xlsx_cell_t m_cur_cell_type;
+ size_t m_cur_cell_xf;
+ std::string_view m_cur_str;
+ std::string_view m_cur_value;
+ formula m_cur_formula;
+
+ array_formula_results_type m_array_formula_results;
+
+ /**
+ * Extra data to pass on to subsequent parts via relations.
+ */
+ opc_rel_extras_t m_rel_extras;
+
+ xlsx_autofilter_context m_cxt_autofilter;
+ xlsx_conditional_format_context m_cxt_cond_format;
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xlsx_sheet_context_test.cpp b/src/liborcus/xlsx_sheet_context_test.cpp
new file mode 100644
index 0000000..20492b5
--- /dev/null
+++ b/src/liborcus/xlsx_sheet_context_test.cpp
@@ -0,0 +1,281 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+#include "mock_spreadsheet.hpp"
+#include "ooxml_namespace_types.hpp"
+#include "ooxml_tokens.hpp"
+#include "ooxml_schemas.hpp"
+#include "xlsx_sheet_context.hpp"
+#include "ooxml_token_constants.hpp"
+#include "xlsx_session_data.hpp"
+#include "orcus/types.hpp"
+#include "orcus/config.hpp"
+
+using namespace orcus;
+using namespace std;
+using namespace orcus::spreadsheet;
+using namespace orcus::spreadsheet::mock;
+
+namespace {
+
+class mock_ref_resolver : public import_reference_resolver
+{
+ virtual src_address_t resolve_address(std::string_view) override
+ {
+ src_address_t ret;
+ ret.sheet = 0;
+ ret.row = 0;
+ ret.column = 0;
+
+ return ret;
+ }
+
+ virtual src_range_t resolve_range(std::string_view) override
+ {
+ src_range_t ret;
+ ret.first.sheet = 0;
+ ret.first.row = 0;
+ ret.first.column = 0;
+ ret.last.sheet = 0;
+ ret.last.row = 0;
+ ret.last.column = 0;
+
+ return ret;
+ }
+};
+
+class mock_array_formula : public import_array_formula
+{
+public:
+ virtual void set_range(const range_t& range) override
+ {
+ assert(range.first.row == 2);
+ assert(range.first.column == 1);
+ assert(range.last.row == 3);
+ assert(range.last.column == 1);
+ }
+
+ virtual void set_formula(formula_grammar_t grammar, std::string_view formula) override
+ {
+ assert(grammar == formula_grammar_t::xlsx);
+ assert(formula == "A1:A2");
+ }
+
+ virtual void set_result_bool(row_t, col_t, bool) override
+ {
+ }
+
+ virtual void set_result_empty(row_t, col_t) override
+ {
+ }
+
+ virtual void set_result_string(row_t, col_t, std::string_view) override
+ {
+ }
+
+ virtual void set_result_value(row_t, col_t, double) override
+ {
+ }
+
+ virtual void commit() override
+ {
+ }
+};
+
+class mock_sheet : public import_sheet
+{
+ mock_array_formula m_array_formula;
+
+public:
+ virtual void set_value(row_t row, col_t col, double val) override
+ {
+ assert(row == -1);
+ assert(col == 0);
+ assert(val == 5.0);
+ }
+
+ virtual void set_bool(row_t row, col_t col, bool val) override
+ {
+ assert(row == -1);
+ assert(col == 0);
+ assert(val == true);
+ }
+
+ virtual iface::import_array_formula* get_array_formula() override
+ {
+ return &m_array_formula;
+ }
+};
+
+class mock_sheet_properties : public import_sheet_properties
+{
+public:
+ void set_column_hidden(col_t col, col_t col_span, bool hidden)
+ {
+ assert(col == 1);
+ assert(col_span == 1);
+ assert(hidden);
+ }
+
+ void set_row_hidden(row_t row, bool hidden)
+ {
+ assert(row == 3);
+ assert(hidden);
+ }
+};
+
+class mock_sheet2 : public import_sheet
+{
+public:
+ virtual import_sheet_properties* get_sheet_properties()
+ {
+ return &m_sheet_prop;
+ }
+
+private:
+ mock_sheet_properties m_sheet_prop;
+};
+
+void test_cell_value()
+{
+ mock_sheet sheet;
+ mock_ref_resolver resolver;
+ session_context cxt(std::make_unique<xlsx_session_data>());
+ config opt(format_t::xlsx);
+ opt.structure_check = false;
+
+ orcus::xlsx_sheet_context context(cxt, orcus::ooxml_tokens, 0, resolver, sheet);
+ context.set_config(opt);
+
+ orcus::xmlns_id_t ns = NS_ooxml_xlsx;
+ orcus::xml_token_t elem = XML_c;
+ orcus::xml_token_attrs_t attrs;
+ context.start_element(ns, elem, attrs);
+
+ {
+ xml_token_attrs_t val_attrs;
+ context.start_element(ns, XML_v, val_attrs);
+ context.characters("5", false);
+ context.end_element(ns, XML_v);
+ }
+
+ context.end_element(ns, elem);
+}
+
+void test_cell_bool()
+{
+ mock_sheet sheet;
+ mock_ref_resolver resolver;
+ session_context cxt(std::make_unique<xlsx_session_data>());
+ config opt(format_t::xlsx);
+ opt.structure_check = false;
+
+ orcus::xlsx_sheet_context context(cxt, orcus::ooxml_tokens, 0, resolver, sheet);
+ context.set_config(opt);
+
+ orcus::xmlns_id_t ns = NS_ooxml_xlsx;
+ orcus::xml_token_t elem = XML_c;
+ orcus::xml_token_attrs_t attrs;
+ attrs.push_back(xml_token_attr_t(NS_ooxml_xlsx, XML_t, "b", false));
+ context.start_element(ns, elem, attrs);
+
+ {
+ xml_token_attrs_t val_attrs;
+ context.start_element(ns, XML_v, val_attrs);
+ context.characters("1", false);
+ context.end_element(ns, XML_v);
+ }
+
+ context.end_element(ns, elem);
+}
+
+void test_array_formula()
+{
+ mock_sheet sheet;
+ mock_ref_resolver resolver;
+ session_context cxt(std::make_unique<xlsx_session_data>());
+ config opt(format_t::xlsx);
+ opt.structure_check = false;
+
+ orcus::xlsx_sheet_context context(cxt, orcus::ooxml_tokens, 0, resolver, sheet);
+ context.set_config(opt);
+
+ orcus::xmlns_id_t ns = NS_ooxml_xlsx;
+ orcus::xml_token_t elem = XML_c;
+ orcus::xml_token_attrs_t attrs;
+ context.start_element(ns, elem, attrs);
+
+ {
+ xml_token_attrs_t formula_attrs;
+ formula_attrs.push_back(xml_token_attr_t(NS_ooxml_xlsx, XML_t, "array", false));
+ formula_attrs.push_back(xml_token_attr_t(NS_ooxml_xlsx, XML_ref, "B3:B4", false));
+ context.start_element(ns, XML_f, formula_attrs);
+ context.characters("A1:A2", false);
+ context.end_element(ns, XML_f);
+ }
+ {
+ xml_token_attrs_t val_attrs;
+ context.start_element(ns, XML_v, val_attrs);
+ context.characters("5", false);
+ context.end_element(ns, XML_v);
+ }
+
+ context.end_element(ns, elem);
+}
+
+void test_hidden_col()
+{
+ mock_sheet2 sheet;
+ mock_ref_resolver resolver;
+ session_context cxt(std::make_unique<xlsx_session_data>());
+ config opt(format_t::xlsx);
+ opt.structure_check = false;
+
+ orcus::xlsx_sheet_context context(cxt, orcus::ooxml_tokens, 0, resolver, sheet);
+ context.set_config(opt);
+
+ orcus::xmlns_id_t ns = NS_ooxml_xlsx;
+ orcus::xml_token_t elem = XML_col;
+ orcus::xml_token_attrs_t attrs;
+ attrs.push_back(orcus::xml_token_attr_t(ns, XML_min, "2", false));
+ attrs.push_back(orcus::xml_token_attr_t(ns, XML_max, "2", false));
+ attrs.push_back(orcus::xml_token_attr_t(ns, XML_hidden, "1", false));
+ context.start_element(ns, elem, attrs);
+ context.end_element(ns, elem);
+}
+
+void test_hidden_row()
+{
+ mock_sheet2 sheet;
+ mock_ref_resolver resolver;
+ session_context cxt(std::make_unique<xlsx_session_data>());
+ config opt(format_t::xlsx);
+ opt.structure_check = false;
+
+ orcus::xlsx_sheet_context context(cxt, orcus::ooxml_tokens, 0, resolver, sheet);
+ context.set_config(opt);
+
+ orcus::xmlns_id_t ns = NS_ooxml_xlsx;
+ orcus::xml_token_t elem = XML_row;
+ orcus::xml_token_attrs_t attrs;
+ attrs.push_back(orcus::xml_token_attr_t(ns, XML_r, "4", false));
+ attrs.push_back(orcus::xml_token_attr_t(ns, XML_hidden, "1", false));
+ context.start_element(ns, elem, attrs);
+ context.end_element(ns, elem);
+}
+
+}
+
+int main()
+{
+ test_cell_value();
+ test_cell_bool();
+ test_array_formula();
+ test_hidden_col();
+ test_hidden_row();
+ return 0;
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xlsx_styles_context.cpp b/src/liborcus/xlsx_styles_context.cpp
new file mode 100644
index 0000000..29454b1
--- /dev/null
+++ b/src/liborcus/xlsx_styles_context.cpp
@@ -0,0 +1,1055 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xlsx_styles_context.hpp"
+#include "impl_utils.hpp"
+#include "ooxml_namespace_types.hpp"
+#include "ooxml_token_constants.hpp"
+#include "xlsx_helper.hpp"
+#include "xml_context_global.hpp"
+
+#include <orcus/tokens.hpp>
+#include <orcus/measurement.hpp>
+#include <orcus/spreadsheet/import_interface_styles.hpp>
+
+#include <mdds/sorted_string_map.hpp>
+#include <mdds/global.hpp>
+
+#include <optional>
+
+namespace ss = orcus::spreadsheet;
+
+namespace orcus {
+
+namespace {
+
+namespace border_style {
+
+using map_type = mdds::sorted_string_map<ss::border_style_t, mdds::string_view_map_entry>;
+
+// Keys must be sorted.
+constexpr map_type::entry entries[] = {
+ { "dashDot", ss::border_style_t::dash_dot },
+ { "dashDotDot", ss::border_style_t::dash_dot_dot },
+ { "dashed", ss::border_style_t::dashed },
+ { "dotted", ss::border_style_t::dotted },
+ { "double", ss::border_style_t::double_border },
+ { "hair", ss::border_style_t::hair },
+ { "medium", ss::border_style_t::medium },
+ { "mediumDashDot", ss::border_style_t::medium_dash_dot },
+ { "mediumDashDotDot", ss::border_style_t::medium_dash_dot_dot },
+ { "mediumDashed", ss::border_style_t::medium_dashed },
+ { "none", ss::border_style_t::none },
+ { "slantDashDot", ss::border_style_t::slant_dash_dot },
+ { "thick", ss::border_style_t::thick },
+ { "thin", ss::border_style_t::thin }
+};
+
+const map_type& get()
+{
+ static const map_type mt(entries, std::size(entries), ss::border_style_t::none);
+ return mt;
+}
+
+} // border_style namespace
+
+namespace fill_pattern {
+
+using map_type = mdds::sorted_string_map<ss::fill_pattern_t, mdds::string_view_map_entry>;
+
+// Keys must be sorted.
+constexpr map_type::entry entries[] = {
+ { "darkDown", ss::fill_pattern_t::dark_down },
+ { "darkGray", ss::fill_pattern_t::dark_gray },
+ { "darkGrid", ss::fill_pattern_t::dark_grid },
+ { "darkHorizontal", ss::fill_pattern_t::dark_horizontal },
+ { "darkTrellis", ss::fill_pattern_t::dark_trellis },
+ { "darkUp", ss::fill_pattern_t::dark_up },
+ { "darkVertical", ss::fill_pattern_t::dark_vertical },
+ { "gray0625", ss::fill_pattern_t::gray_0625 },
+ { "gray125", ss::fill_pattern_t::gray_125 },
+ { "lightDown", ss::fill_pattern_t::light_down },
+ { "lightGray", ss::fill_pattern_t::light_gray },
+ { "lightGrid", ss::fill_pattern_t::light_grid },
+ { "lightHorizontal", ss::fill_pattern_t::light_horizontal },
+ { "lightTrellis", ss::fill_pattern_t::light_trellis },
+ { "lightUp", ss::fill_pattern_t::light_up },
+ { "lightVertical", ss::fill_pattern_t::light_vertical },
+ { "mediumGray", ss::fill_pattern_t::medium_gray },
+ { "none", ss::fill_pattern_t::none },
+ { "solid", ss::fill_pattern_t::solid },
+};
+
+const map_type& get()
+{
+ static const map_type mt(entries, std::size(entries), ss::fill_pattern_t::none);
+ return mt;
+}
+
+} // fill_pattern namespace
+
+namespace underline {
+
+using map_type = mdds::sorted_string_map<ss::underline_t, mdds::string_view_map_entry>;
+
+// Keys must be sorted.
+constexpr map_type::entry entries[] = {
+ { "double", ss::underline_t::double_line },
+ { "doubleAccounting", ss::underline_t::double_accounting },
+ { "none", ss::underline_t::none },
+ { "single", ss::underline_t::single_line },
+ { "singleAccounting", ss::underline_t::single_accounting },
+};
+
+const map_type& get()
+{
+ static const map_type mt(entries, std::size(entries), ss::underline_t::none);
+ return mt;
+}
+
+} // namespace underline
+
+class border_attr_parser
+{
+ ss::border_direction_t m_dir;
+ ss::iface::import_border_style& m_border_style;
+public:
+ border_attr_parser(ss::border_direction_t dir, ss::iface::import_border_style& style) :
+ m_dir(dir), m_border_style(style) {}
+
+ void operator() (const xml_token_attr_t& attr)
+ {
+ switch (attr.name)
+ {
+ case XML_style:
+ {
+ m_border_style.set_style(m_dir,
+ border_style::get().find(attr.value.data(), attr.value.size()));
+ break;
+ }
+ }
+ }
+};
+
+std::optional<std::size_t> extract_count(const xml_token_attrs_t& attrs)
+{
+ std::optional<std::size_t> count;
+
+ for (const auto& attr : attrs)
+ {
+ if (attr.ns)
+ continue;
+
+ switch (attr.name)
+ {
+ case XML_count:
+ {
+ const char* p_end = nullptr;
+ long v = to_long(attr.value, &p_end);
+ if (attr.value.data() < p_end && v >= 0)
+ count = v;
+ break;
+ }
+ }
+ }
+
+ return count;
+}
+
+} // anonymous namespace
+
+xlsx_styles_context::xlsx_styles_context(session_context& session_cxt, const tokens& tokens, ss::iface::import_styles* styles) :
+ xml_context_base(session_cxt, tokens),
+ mp_styles(styles),
+ m_diagonal_up(false), m_diagonal_down(false),
+ m_cur_border_dir(ss::border_direction_t::unknown)
+{
+ static const xml_element_validator::rule rules[] = {
+ // parent element -> child element
+ { XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN, NS_ooxml_xlsx, XML_styleSheet }, // root element
+ { NS_ooxml_xlsx, XML_border, NS_ooxml_xlsx, XML_bottom },
+ { NS_ooxml_xlsx, XML_border, NS_ooxml_xlsx, XML_diagonal },
+ { NS_ooxml_xlsx, XML_border, NS_ooxml_xlsx, XML_left },
+ { NS_ooxml_xlsx, XML_border, NS_ooxml_xlsx, XML_right },
+ { NS_ooxml_xlsx, XML_border, NS_ooxml_xlsx, XML_top },
+ { NS_ooxml_xlsx, XML_borders, NS_ooxml_xlsx, XML_border },
+ { NS_ooxml_xlsx, XML_bottom, NS_ooxml_xlsx, XML_color },
+ { NS_ooxml_xlsx, XML_cellStyleXfs, NS_ooxml_xlsx, XML_xf },
+ { NS_ooxml_xlsx, XML_cellStyles, NS_ooxml_xlsx, XML_cellStyle },
+ { NS_ooxml_xlsx, XML_cellXfs, NS_ooxml_xlsx, XML_xf },
+ { NS_ooxml_xlsx, XML_diagonal, NS_ooxml_xlsx, XML_color },
+ { NS_ooxml_xlsx, XML_dx, NS_ooxml_xlsx, XML_fill },
+ { NS_ooxml_xlsx, XML_dxf, NS_ooxml_xlsx, XML_alignment },
+ { NS_ooxml_xlsx, XML_dxf, NS_ooxml_xlsx, XML_border },
+ { NS_ooxml_xlsx, XML_dxf, NS_ooxml_xlsx, XML_font },
+ { NS_ooxml_xlsx, XML_dxf, NS_ooxml_xlsx, XML_numFmt },
+ { NS_ooxml_xlsx, XML_dxf, NS_ooxml_xlsx, XML_protection },
+ { NS_ooxml_xlsx, XML_end, NS_ooxml_xlsx, XML_color },
+ { NS_ooxml_xlsx, XML_fill, NS_ooxml_xlsx, XML_patternFill },
+ { NS_ooxml_xlsx, XML_fills, NS_ooxml_xlsx, XML_fill },
+ { NS_ooxml_xlsx, XML_font, NS_ooxml_xlsx, XML_b },
+ { NS_ooxml_xlsx, XML_font, NS_ooxml_xlsx, XML_color },
+ { NS_ooxml_xlsx, XML_font, NS_ooxml_xlsx, XML_family },
+ { NS_ooxml_xlsx, XML_font, NS_ooxml_xlsx, XML_i },
+ { NS_ooxml_xlsx, XML_font, NS_ooxml_xlsx, XML_name },
+ { NS_ooxml_xlsx, XML_font, NS_ooxml_xlsx, XML_scheme },
+ { NS_ooxml_xlsx, XML_font, NS_ooxml_xlsx, XML_sz },
+ { NS_ooxml_xlsx, XML_font, NS_ooxml_xlsx, XML_u },
+ { NS_ooxml_xlsx, XML_fonts, NS_ooxml_xlsx, XML_font },
+ { NS_ooxml_xlsx, XML_horizontal, NS_ooxml_xlsx, XML_color },
+ { NS_ooxml_xlsx, XML_left, NS_ooxml_xlsx, XML_color },
+ { NS_ooxml_xlsx, XML_mruColors, NS_ooxml_xlsx, XML_color },
+ { NS_ooxml_xlsx, XML_numFmts, NS_ooxml_xlsx, XML_numFmt },
+ { NS_ooxml_xlsx, XML_patternFill, NS_ooxml_xlsx, XML_bgColor },
+ { NS_ooxml_xlsx, XML_patternFill, NS_ooxml_xlsx, XML_fgColor },
+ { NS_ooxml_xlsx, XML_right, NS_ooxml_xlsx, XML_color },
+ { NS_ooxml_xlsx, XML_start, NS_ooxml_xlsx, XML_color },
+ { NS_ooxml_xlsx, XML_stop, NS_ooxml_xlsx, XML_color },
+ { NS_ooxml_xlsx, XML_styleSheet, NS_ooxml_xlsx, XML_borders },
+ { NS_ooxml_xlsx, XML_styleSheet, NS_ooxml_xlsx, XML_cellStyleXfs },
+ { NS_ooxml_xlsx, XML_styleSheet, NS_ooxml_xlsx, XML_cellStyles },
+ { NS_ooxml_xlsx, XML_styleSheet, NS_ooxml_xlsx, XML_cellXfs },
+ { NS_ooxml_xlsx, XML_styleSheet, NS_ooxml_xlsx, XML_dxfs },
+ { NS_ooxml_xlsx, XML_styleSheet, NS_ooxml_xlsx, XML_fills },
+ { NS_ooxml_xlsx, XML_styleSheet, NS_ooxml_xlsx, XML_fonts },
+ { NS_ooxml_xlsx, XML_styleSheet, NS_ooxml_xlsx, XML_numFmts },
+ { NS_ooxml_xlsx, XML_top, NS_ooxml_xlsx, XML_color },
+ { NS_ooxml_xlsx, XML_vertical, NS_ooxml_xlsx, XML_color },
+ { NS_ooxml_xlsx, XML_xf, NS_ooxml_xlsx, XML_alignment },
+ { NS_ooxml_xlsx, XML_xf, NS_ooxml_xlsx, XML_protection },
+ };
+
+ init_element_validator(rules, std::size(rules));
+}
+
+xlsx_styles_context::~xlsx_styles_context() = default;
+
+void xlsx_styles_context::start_element(xmlns_id_t ns, xml_token_t name, const xml_token_attrs_t& attrs)
+{
+ xml_token_pair_t parent = push_stack(ns, name);
+
+ if (ns == NS_ooxml_xlsx)
+ {
+ switch (name)
+ {
+ case XML_styleSheet:
+ {
+ // root element
+ if (get_config().debug)
+ print_attrs(get_tokens(), attrs);
+ break;
+ }
+ case XML_fonts:
+ {
+ std::string_view ps = for_each(
+ attrs.begin(), attrs.end(), single_attr_getter(m_pool, NS_ooxml_xlsx, XML_count)).get_value();
+ size_t font_count = to_long(ps);
+ mp_styles->set_font_count(font_count);
+ m_font_ids.reserve(font_count);
+ break;
+ }
+ case XML_font:
+ {
+ mp_font = mp_styles->start_font_style();
+ ENSURE_INTERFACE(mp_font, import_font_style);
+ break;
+ }
+ case XML_b:
+ assert(mp_font);
+ mp_font->set_bold(true);
+ break;
+ case XML_i:
+ assert(mp_font);
+ mp_font->set_italic(true);
+ break;
+ case XML_u:
+ {
+ assert(mp_font);
+ ss::underline_t v = ss::underline_t::single_line; // default value
+
+ for (const auto& attr : attrs)
+ {
+ switch (name)
+ {
+ case XML_val:
+ v = underline::get().find(attr.value);
+ break;
+ }
+ }
+
+ mp_font->set_underline(v);
+ break;
+ }
+ case XML_sz:
+ {
+ assert(mp_font);
+ std::optional<double> font_size;
+
+ for (const auto& attr : attrs)
+ {
+ switch (attr.name)
+ {
+ case XML_val:
+ {
+ const char* p_end = nullptr;
+ double v = to_double(attr.value, &p_end);
+ if (attr.value.data() < p_end)
+ font_size = v;
+ break;
+ }
+ }
+ }
+
+ if (font_size)
+ mp_font->set_size(*font_size);
+
+ break;
+ }
+ case XML_color:
+ {
+ if (parent.first == NS_ooxml_xlsx)
+ {
+ switch (parent.second)
+ {
+ case XML_top:
+ case XML_bottom:
+ case XML_left:
+ case XML_right:
+ case XML_diagonal:
+ // This color is for a border.
+ start_border_color(attrs);
+ break;
+ case XML_font:
+ start_font_color(attrs);
+ default:
+ ;
+ }
+ }
+ break;
+ }
+ case XML_name:
+ {
+ std::string_view ps = for_each(
+ attrs.begin(), attrs.end(), single_attr_getter(m_pool, NS_ooxml_xlsx, XML_val)).get_value();
+ mp_font->set_name(ps);
+ break;
+ }
+ case XML_fills:
+ {
+ std::string_view ps = for_each(
+ attrs.begin(), attrs.end(), single_attr_getter(m_pool, NS_ooxml_xlsx, XML_count)).get_value();
+ size_t fill_count = to_long(ps);
+ mp_styles->set_fill_count(fill_count);
+ m_fill_ids.reserve(fill_count);
+ break;
+ }
+ case XML_fill:
+ {
+ mp_fill = mp_styles->start_fill_style();
+ ENSURE_INTERFACE(mp_fill, import_fill_style);
+
+ break;
+ }
+ case XML_patternFill:
+ {
+ std::string_view ps = for_each(
+ attrs.begin(), attrs.end(), single_attr_getter(m_pool, NS_ooxml_xlsx, XML_patternType)).get_value();
+ assert(mp_fill);
+ mp_fill->set_pattern_type(fill_pattern::get().find(ps.data(), ps.size()));
+ break;
+ }
+ case XML_fgColor:
+ {
+ assert(mp_fill);
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ switch (attr.name)
+ {
+ case XML_rgb:
+ {
+ ss::color_elem_t alpha;
+ ss::color_elem_t red;
+ ss::color_elem_t green;
+ ss::color_elem_t blue;
+ if (!to_rgb(attr.value, alpha, red, green, blue))
+ // invalid RGB color format.
+ continue;
+
+ mp_fill->set_fg_color(alpha, red, green, blue);
+ break;
+ }
+ case XML_indexed:
+ break;
+ default:
+ if (get_config().debug)
+ std::cerr << "warning: unknown attribute [ " << get_tokens().get_token_name(attr.name) << " ]" << std::endl;
+ }
+ }
+
+ break;
+ }
+ case XML_bgColor:
+ {
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ switch (attr.name)
+ {
+ case XML_rgb:
+ {
+ ss::color_elem_t alpha;
+ ss::color_elem_t red;
+ ss::color_elem_t green;
+ ss::color_elem_t blue;
+ if (!to_rgb(attr.value, alpha, red, green, blue))
+ // invalid RGB color format.
+ continue;
+
+ mp_fill->set_bg_color(alpha, red, green, blue);
+ break;
+ }
+ case XML_indexed:
+ break;
+ default:
+ if (get_config().debug)
+ std::cerr << "warning: unknown attribute [ " << get_tokens().get_token_name(attr.name) << " ]" << std::endl;
+ }
+ }
+
+ break;
+ }
+ case XML_borders:
+ {
+ std::string_view ps = for_each(
+ attrs.begin(), attrs.end(), single_attr_getter(m_pool, NS_ooxml_xlsx, XML_count)).get_value();
+ size_t border_count = to_long(ps);
+ mp_styles->set_border_count(border_count);
+ m_border_ids.reserve(border_count);
+ break;
+ }
+ case XML_border:
+ {
+ start_element_border(attrs);
+
+ mp_border = mp_styles->start_border_style();
+ ENSURE_INTERFACE(mp_border, import_border_style);
+
+ break;
+ }
+ case XML_top:
+ {
+ assert(mp_border);
+ m_cur_border_dir = ss::border_direction_t::top;
+ border_attr_parser func(ss::border_direction_t::top, *mp_border);
+ for_each(attrs.begin(), attrs.end(), func);
+ break;
+ }
+ case XML_bottom:
+ {
+ assert(mp_border);
+ m_cur_border_dir = ss::border_direction_t::bottom;
+ border_attr_parser func(ss::border_direction_t::bottom, *mp_border);
+ for_each(attrs.begin(), attrs.end(), func);
+ break;
+ }
+ case XML_left:
+ {
+ assert(mp_border);
+ m_cur_border_dir = ss::border_direction_t::left;
+ border_attr_parser func(ss::border_direction_t::left, *mp_border);
+ for_each(attrs.begin(), attrs.end(), func);
+ break;
+ }
+ case XML_right:
+ {
+ assert(mp_border);
+ m_cur_border_dir = ss::border_direction_t::right;
+ border_attr_parser func(ss::border_direction_t::right, *mp_border);
+ for_each(attrs.begin(), attrs.end(), func);
+ break;
+ }
+ case XML_diagonal:
+ {
+ start_element_diagonal(attrs);
+ break;
+ }
+ case XML_cellStyleXfs:
+ {
+ if (std::optional<std::size_t> count = extract_count(attrs); count)
+ {
+ mp_styles->set_xf_count(ss::xf_category_t::cell_style, *count);
+ m_cell_style_xf_ids.reserve(*count);
+ }
+
+ mp_xf = mp_styles->start_xf(ss::xf_category_t::cell_style);
+ ENSURE_INTERFACE(mp_xf, import_xf);
+ m_xf_type = ss::xf_category_t::cell_style;
+ break;
+ }
+ case XML_cellXfs:
+ {
+ if (std::optional<std::size_t> count = extract_count(attrs); count)
+ mp_styles->set_xf_count(ss::xf_category_t::cell, *count);
+
+ mp_xf = mp_styles->start_xf(ss::xf_category_t::cell);
+ ENSURE_INTERFACE(mp_xf, import_xf);
+ m_xf_type = ss::xf_category_t::cell;
+ break;
+ }
+ case XML_dxfs:
+ {
+ if (std::optional<std::size_t> count = extract_count(attrs); count)
+ mp_styles->set_xf_count(ss::xf_category_t::differential, *count);
+
+ mp_xf = mp_styles->start_xf(ss::xf_category_t::differential);
+ ENSURE_INTERFACE(mp_xf, import_xf);
+ m_xf_type = ss::xf_category_t::differential;
+ break;
+ }
+ case XML_cellStyles:
+ {
+ std::string_view ps = for_each(
+ attrs.begin(), attrs.end(), single_attr_getter(m_pool, NS_ooxml_xlsx, XML_count)).get_value();
+ if (!ps.empty())
+ {
+ size_t n = strtoul(ps.data(), nullptr, 10);
+ mp_styles->set_cell_style_count(n);
+ }
+ mp_cell_style = mp_styles->start_cell_style();
+ ENSURE_INTERFACE(mp_cell_style, import_cell_style);
+ break;
+ }
+ case XML_cellStyle:
+ {
+ // named cell style, some of which are built-in such as 'Normal'.
+ assert(mp_cell_style);
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ switch (attr.name)
+ {
+ case XML_name:
+ mp_cell_style->set_name(attr.value);
+ break;
+ case XML_xfId:
+ {
+ // reference ID to an xf entry in cellStyleXfs
+ const char* p_end = nullptr;
+ size_t n = to_long(attr.value, &p_end);
+ if (attr.value.data() < p_end)
+ {
+ if (n < m_cell_style_xf_ids.size())
+ mp_cell_style->set_xf(m_cell_style_xf_ids[n]);
+ else
+ {
+ std::ostringstream os;
+ os << "out-of-bound cellStyle@xfId: id=" << n << "; count=" << m_cell_style_xf_ids.size();
+ warn(os.str());
+ }
+ }
+ break;
+ }
+ case XML_builtinId:
+ {
+ size_t n = to_long(attr.value);
+ mp_cell_style->set_builtin(n);
+ }
+ break;
+ }
+ }
+ break;
+ }
+ case XML_xf:
+ {
+ start_xf(attrs);
+ break;
+ }
+ case XML_protection:
+ {
+ mp_protection = mp_styles->start_cell_protection();
+ ENSURE_INTERFACE(mp_protection, import_cell_protection);
+
+ for (const auto& attr : attrs)
+ {
+ switch (attr.name)
+ {
+ case XML_hidden:
+ {
+ bool b = to_long(attr.value) != 0;
+ mp_protection->set_hidden(b);
+ break;
+ }
+ case XML_locked:
+ {
+ bool b = to_long(attr.value) != 0;
+ mp_protection->set_locked(b);
+ break;
+ }
+ }
+ }
+
+ break;
+ }
+ case XML_alignment:
+ {
+ assert(mp_xf);
+
+ // NB: default vertical alignment is 'bottom'.
+ ss::hor_alignment_t hor_align = ss::hor_alignment_t::unknown;
+ ss::ver_alignment_t ver_align = ss::ver_alignment_t::bottom;
+ bool wrap_text = false;
+ bool shrink_to_fit = false;
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ switch (attr.name)
+ {
+ case XML_horizontal:
+ {
+ if (attr.value == "center")
+ hor_align = ss::hor_alignment_t::center;
+ else if (attr.value == "right")
+ hor_align = ss::hor_alignment_t::right;
+ else if (attr.value == "left")
+ hor_align = ss::hor_alignment_t::left;
+ else if (attr.value == "justify")
+ hor_align = ss::hor_alignment_t::justified;
+ else if (attr.value == "distributed")
+ hor_align = ss::hor_alignment_t::distributed;
+ break;
+ }
+ case XML_vertical:
+ {
+ if (attr.value == "top")
+ ver_align = ss::ver_alignment_t::top;
+ else if (attr.value == "center")
+ ver_align = ss::ver_alignment_t::middle;
+ else if (attr.value == "bottom")
+ ver_align = ss::ver_alignment_t::bottom;
+ else if (attr.value == "justify")
+ ver_align = ss::ver_alignment_t::justified;
+ else if (attr.value == "distributed")
+ ver_align = ss::ver_alignment_t::distributed;
+ break;
+ }
+ case XML_wrapText:
+ wrap_text = to_bool(attr.value);
+ break;
+ case XML_shrinkToFit:
+ shrink_to_fit = to_bool(attr.value);
+ break;
+ }
+ }
+
+ mp_xf->set_horizontal_alignment(hor_align);
+ mp_xf->set_vertical_alignment(ver_align);
+ mp_xf->set_wrap_text(wrap_text);
+ mp_xf->set_shrink_to_fit(shrink_to_fit);
+ break;
+ }
+ case XML_numFmts:
+ {
+ std::string_view val =
+ for_each(
+ attrs.begin(), attrs.end(),
+ single_attr_getter(m_pool, NS_ooxml_xlsx, XML_count)).get_value();
+ if (!val.empty())
+ {
+ size_t n = to_long(val);
+ mp_styles->set_number_format_count(n);
+ }
+ break;
+ }
+ case XML_numFmt:
+ start_number_format(attrs);
+ break;
+ default:
+ warn_unhandled();
+ }
+ }
+ else
+ warn_unhandled();
+}
+
+bool xlsx_styles_context::end_element(xmlns_id_t ns, xml_token_t name)
+{
+ switch (name)
+ {
+ case XML_font:
+ {
+ assert(mp_font);
+ std::size_t id = mp_font->commit();
+ m_font_ids.push_back(id);
+ mp_font = nullptr;
+ break;
+ }
+ case XML_fill:
+ {
+ assert(mp_fill);
+ std::size_t id = mp_fill->commit();
+ m_fill_ids.push_back(id);
+ mp_fill = nullptr;
+ break;
+ }
+ case XML_border:
+ {
+ assert(mp_border);
+ std::size_t id = mp_border->commit();
+ m_border_ids.push_back(id);
+ mp_border = nullptr;
+ break;
+ }
+ case XML_cellStyle:
+ assert(mp_cell_style);
+ mp_cell_style->commit();
+ break;
+ case XML_cellStyles:
+ assert(mp_cell_style);
+ mp_cell_style = nullptr;
+ break;
+ case XML_cellStyleXfs:
+ case XML_cellXfs:
+ case XML_dxfs:
+ assert(mp_xf);
+ mp_xf = nullptr;
+ m_xf_type = ss::xf_category_t::unknown;
+ break;
+ case XML_xf:
+ case XML_dxf:
+ {
+ assert(mp_xf);
+ std::size_t id = mp_xf->commit();
+ switch (m_xf_type)
+ {
+ break;
+ case ss::xf_category_t::cell_style:
+ // only cell style xf ID is referenced.
+ m_cell_style_xf_ids.push_back(id);
+ break;
+ case ss::xf_category_t::cell:
+ case ss::xf_category_t::differential:
+ // not used
+ break;
+ case ss::xf_category_t::unknown:
+ warn("xf entry committed while the current xf category is unknown");
+ break;
+ }
+ break;
+ }
+ case XML_protection:
+ {
+ assert(mp_protection);
+ size_t prot_id = mp_protection->commit();
+ assert(mp_xf);
+ mp_xf->set_protection(prot_id);
+ break;
+ }
+ case XML_numFmt:
+ end_number_format();
+ break;
+ }
+ return pop_stack(ns, name);
+}
+
+void xlsx_styles_context::characters(std::string_view /*str*/, bool /*transient*/)
+{
+ // not used in the styles.xml part.
+}
+
+void xlsx_styles_context::start_number_format(const xml_token_attrs_t& attrs)
+{
+ if (!mp_styles)
+ return;
+
+ mp_numfmt = mp_styles->start_number_format();
+ ENSURE_INTERFACE(mp_numfmt, import_number_format);
+
+ m_cur_numfmt_id.reset();
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.ns)
+ continue;
+
+ switch (attr.name)
+ {
+ case XML_numFmtId:
+ {
+ const char* p_end = nullptr;
+ long id = to_long(attr.value, &p_end);
+ if (attr.value.data() < p_end && id >= 0)
+ {
+ mp_numfmt->set_identifier(id);
+ m_cur_numfmt_id = id;
+ }
+ break;
+ }
+ case XML_formatCode:
+ {
+ mp_numfmt->set_code(attr.value);
+ break;
+ }
+ }
+ }
+}
+
+void xlsx_styles_context::start_element_border(const xml_token_attrs_t& attrs)
+{
+ bool diagonal_up = false;
+ bool diagonal_down = false;
+
+ std::for_each(attrs.begin(), attrs.end(),
+ [&diagonal_up,&diagonal_down](const xml_token_attr_t& attr)
+ {
+ if (attr.ns && attr.ns != NS_ooxml_xlsx)
+ return;
+
+ switch (attr.name)
+ {
+ case XML_diagonalDown:
+ // top-left to bottom-right.
+ diagonal_down = to_long(attr.value) != 0;
+ break;
+ case XML_diagonalUp:
+ // bottom-left to top-right.
+ diagonal_up = to_long(attr.value) != 0;
+ break;
+ default:
+ ;
+ }
+ }
+ );
+
+ m_diagonal_up = diagonal_up;
+ m_diagonal_down = diagonal_down;
+}
+
+void xlsx_styles_context::start_element_diagonal(const xml_token_attrs_t& attrs)
+{
+ assert(mp_border);
+
+ m_cur_border_dir = ss::border_direction_t::unknown;
+
+ if (m_diagonal_up)
+ {
+ m_cur_border_dir = m_diagonal_down ?
+ ss::border_direction_t::diagonal :
+ ss::border_direction_t::diagonal_bl_tr;
+ }
+ else
+ {
+ m_cur_border_dir = m_diagonal_down ?
+ ss::border_direction_t::diagonal_tl_br :
+ ss::border_direction_t::unknown;
+ }
+
+ if (m_cur_border_dir == ss::border_direction_t::unknown)
+ return;
+
+ border_attr_parser func(m_cur_border_dir, *mp_border);
+ for_each(attrs.begin(), attrs.end(), func);
+}
+
+void xlsx_styles_context::start_border_color(const xml_token_attrs_t& attrs)
+{
+ assert(mp_border);
+
+ std::optional<std::string_view> rgb;
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ switch (attr.name)
+ {
+ case XML_rgb:
+ rgb = attr.value;
+ break;
+ case XML_theme:
+ // TODO : handle this.
+ break;
+ }
+ }
+
+ if (rgb)
+ {
+ ss::color_elem_t alpha;
+ ss::color_elem_t red;
+ ss::color_elem_t green;
+ ss::color_elem_t blue;
+
+ if (to_rgb(*rgb, alpha, red, green, blue))
+ mp_border->set_color(m_cur_border_dir, alpha, red, green, blue);
+ }
+}
+
+void xlsx_styles_context::start_font_color(const xml_token_attrs_t& attrs)
+{
+ assert(mp_font);
+
+ std::optional<std::string_view> rgb;
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ switch (attr.name)
+ {
+ case XML_rgb:
+ rgb = attr.value;
+ break;
+ case XML_theme:
+ // TODO : handle this.
+ break;
+ }
+ }
+
+ if (rgb)
+ {
+ ss::color_elem_t alpha;
+ ss::color_elem_t red;
+ ss::color_elem_t green;
+ ss::color_elem_t blue;
+ if (to_rgb(*rgb, alpha, red, green, blue))
+ mp_font->set_color(alpha, red, green, blue);
+ }
+}
+
+void xlsx_styles_context::start_xf(const xml_token_attrs_t& attrs)
+{
+ assert(mp_xf);
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ switch (attr.name)
+ {
+ case XML_borderId:
+ {
+ const char* p_end = nullptr;
+ size_t n = to_long(attr.value, &p_end);
+ if (attr.value.data() < p_end)
+ {
+ if (n < m_border_ids.size())
+ mp_xf->set_border(m_border_ids[n]);
+ else
+ {
+ std::ostringstream os;
+ os << "out-of-bound borderId: id=" << n << "; count=" << m_border_ids.size();
+ warn(os.str());
+ }
+ }
+ break;
+ }
+ case XML_fillId:
+ {
+ const char* p_end = nullptr;
+ size_t n = to_long(attr.value, &p_end);
+ if (attr.value.data() < p_end)
+ {
+ if (n < m_fill_ids.size())
+ mp_xf->set_fill(m_fill_ids[n]);
+ else
+ {
+ std::ostringstream os;
+ os << "out-of-bound fillId: id=" << n << "; count=" << m_fill_ids.size();
+ warn(os.str());
+ }
+ }
+ break;
+ }
+ case XML_fontId:
+ {
+ const char* p_end = nullptr;
+ size_t n = to_long(attr.value, &p_end);
+ if (attr.value.data() < p_end)
+ {
+ if (n < m_font_ids.size())
+ mp_xf->set_font(m_font_ids[n]);
+ else
+ {
+ std::ostringstream os;
+ os << "out-of-bound fontId: id=" << n << "; count=" << m_font_ids.size();
+ warn(os.str());
+ }
+ }
+ break;
+ }
+ case XML_numFmtId:
+ {
+ const char* p_end = nullptr;
+ long n = to_long(attr.value, &p_end);
+ if (attr.value.data() < p_end && n >= 0)
+ {
+ auto it = m_numfmt_ids.find(n);
+ if (it == m_numfmt_ids.end())
+ {
+ std::ostringstream os;
+ os << "no entry for xf@numFmtId = " << n;
+ warn(os.str());
+ }
+ else
+ mp_xf->set_number_format(it->second);
+ }
+ break;
+ }
+ case XML_xfId:
+ {
+ // reference ID to an xf entry in cellStyleXfs
+ const char* p_end = nullptr;
+ size_t n = to_long(attr.value, &p_end);
+ if (attr.value.data() < p_end)
+ {
+ if (n < m_cell_style_xf_ids.size())
+ mp_xf->set_style_xf(m_cell_style_xf_ids[n]);
+ else
+ {
+ std::ostringstream os;
+ os << "out-of-bound xf@xfId: id=" << n << "; count=" << m_cell_style_xf_ids.size();
+ warn(os.str());
+ }
+ }
+ break;
+ }
+ case XML_applyBorder:
+ break;
+ case XML_applyFill:
+ break;
+ case XML_applyFont:
+ break;
+ case XML_applyNumberFormat:
+ break;
+ case XML_applyAlignment:
+ {
+ bool b = to_long(attr.value) != 0;
+ mp_xf->set_apply_alignment(b);
+ break;
+ }
+ }
+ }
+}
+
+void xlsx_styles_context::end_number_format()
+{
+ if (!mp_styles)
+ return;
+
+ assert(mp_numfmt);
+ std::size_t id = mp_numfmt->commit();
+ mp_numfmt = nullptr;
+
+ if (m_cur_numfmt_id)
+ {
+ auto res = m_numfmt_ids.insert_or_assign(*m_cur_numfmt_id, id);
+ if (!res.second)
+ {
+ // assigned to an existing key
+ std::ostringstream os;
+ os << "number format id of " << *m_cur_numfmt_id << " referenced multiple times";
+ warn(os.str());
+ }
+ }
+}
+
+} // namespace orcus
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xlsx_styles_context.hpp b/src/liborcus/xlsx_styles_context.hpp
new file mode 100644
index 0000000..3cd8310
--- /dev/null
+++ b/src/liborcus/xlsx_styles_context.hpp
@@ -0,0 +1,86 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#pragma once
+
+#include "xml_context_base.hpp"
+#include "xlsx_types.hpp"
+
+#include <orcus/string_pool.hpp>
+
+#include <vector>
+#include <unordered_map>
+#include <optional>
+
+namespace orcus {
+
+namespace spreadsheet { namespace iface {
+ class import_styles;
+ class import_font_style;
+ class import_fill_style;
+ class import_border_style;
+ class import_cell_protection;
+ class import_number_format;
+ class import_xf;
+ class import_cell_style;
+}}
+
+/**
+ * Context for xl/styles.xml part. This part contains various styles used
+ * in the sheets.
+ */
+class xlsx_styles_context : public xml_context_base
+{
+public:
+ xlsx_styles_context(
+ session_context& session_cxt, const tokens& tokens,
+ spreadsheet::iface::import_styles* import_styles);
+ virtual ~xlsx_styles_context();
+
+ virtual void start_element(xmlns_id_t ns, xml_token_t name, const xml_token_attrs_t& attrs);
+ virtual bool end_element(xmlns_id_t ns, xml_token_t name);
+ virtual void characters(std::string_view str, bool transient);
+
+private:
+ void start_number_format(const xml_token_attrs_t& attrs);
+
+ void start_element_border(const xml_token_attrs_t& attrs);
+ void start_element_diagonal(const xml_token_attrs_t& attrs);
+ void start_border_color(const xml_token_attrs_t& attrs);
+ void start_font_color(const xml_token_attrs_t& attrs);
+ void start_xf(const xml_token_attrs_t& attrs);
+
+ void end_number_format();
+
+private:
+ spreadsheet::iface::import_styles* mp_styles = nullptr;
+ spreadsheet::iface::import_font_style* mp_font = nullptr;
+ spreadsheet::iface::import_fill_style* mp_fill = nullptr;
+ spreadsheet::iface::import_border_style* mp_border = nullptr;
+ spreadsheet::iface::import_cell_protection* mp_protection = nullptr;
+ spreadsheet::iface::import_number_format* mp_numfmt = nullptr;
+ spreadsheet::iface::import_xf* mp_xf = nullptr;
+ spreadsheet::iface::import_cell_style* mp_cell_style = nullptr;
+ spreadsheet::xf_category_t m_xf_type = spreadsheet::xf_category_t::unknown;
+
+ string_pool m_pool;
+ bool m_diagonal_up;
+ bool m_diagonal_down;
+ spreadsheet::border_direction_t m_cur_border_dir;
+
+ std::vector<std::size_t> m_font_ids;
+ std::vector<std::size_t> m_fill_ids;
+ std::vector<std::size_t> m_border_ids;
+ std::vector<std::size_t> m_cell_style_xf_ids;
+ // numFmt@numFmtId values as keys
+ std::unordered_map<std::size_t, std::size_t> m_numfmt_ids;
+ std::optional<std::size_t> m_cur_numfmt_id;
+};
+
+} // namespace orcus
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xlsx_table_context.cpp b/src/liborcus/xlsx_table_context.cpp
new file mode 100644
index 0000000..06f16ce
--- /dev/null
+++ b/src/liborcus/xlsx_table_context.cpp
@@ -0,0 +1,319 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xlsx_table_context.hpp"
+#include "xlsx_autofilter_context.hpp"
+#include "ooxml_namespace_types.hpp"
+#include "ooxml_token_constants.hpp"
+#include "ooxml_global.hpp"
+#include "session_context.hpp"
+#include "xml_context_global.hpp"
+
+#include "orcus/measurement.hpp"
+#include "orcus/spreadsheet/import_interface.hpp"
+
+#include <iostream>
+#include <optional>
+
+namespace ss = orcus::spreadsheet;
+
+namespace orcus {
+
+namespace {
+
+class table_column_attr_parser
+{
+ string_pool* m_pool;
+
+ long m_id;
+ std::string_view m_name;
+ std::string_view m_totals_row_label;
+ spreadsheet::totals_row_function_t m_totals_row_func;
+
+public:
+ table_column_attr_parser(string_pool* pool) :
+ m_pool(pool), m_id(-1), m_totals_row_func(spreadsheet::totals_row_function_t::none) {}
+
+ void operator() (const xml_token_attr_t& attr)
+ {
+ if (attr.ns && attr.ns != NS_ooxml_xlsx)
+ return;
+
+ switch (attr.name)
+ {
+ case XML_id:
+ m_id = to_long(attr.value);
+ break;
+ case XML_name:
+ m_name = attr.value;
+ if (attr.transient)
+ m_name = m_pool->intern(m_name).first;
+ break;
+ case XML_totalsRowLabel:
+ m_totals_row_label = attr.value;
+ if (attr.transient)
+ m_totals_row_label = m_pool->intern(m_totals_row_label).first;
+ break;
+ case XML_totalsRowFunction:
+ m_totals_row_func = spreadsheet::to_totals_row_function_enum(attr.value);
+ break;
+ default:
+ ;
+ }
+ }
+
+ long get_id() const { return m_id; }
+ std::string_view get_name() const { return m_name; }
+ std::string_view get_totals_row_label() const { return m_totals_row_label; }
+ spreadsheet::totals_row_function_t get_totals_row_function() const { return m_totals_row_func; }
+};
+
+class table_style_info_attr_parser
+{
+ spreadsheet::iface::import_table* mp_table;
+ bool m_debug;
+
+public:
+ table_style_info_attr_parser(spreadsheet::iface::import_table* table, bool debug) :
+ mp_table(table), m_debug(debug) {}
+
+ void operator() (const xml_token_attr_t& attr)
+ {
+ if (attr.ns && attr.ns != NS_ooxml_xlsx)
+ return;
+
+ bool b = false;
+
+ switch (attr.name)
+ {
+ case XML_name:
+ mp_table->set_style_name(attr.value);
+ if (m_debug)
+ std::cout << " * table style info (name=" << attr.value << ")" << std::endl;
+ break;
+ case XML_showFirstColumn:
+ b = to_bool(attr.value);
+ mp_table->set_style_show_first_column(b);
+ if (m_debug)
+ std::cout << " * show first column: " << b << std::endl;
+ break;
+ case XML_showLastColumn:
+ b = to_bool(attr.value);
+ mp_table->set_style_show_last_column(b);
+ if (m_debug)
+ std::cout << " * show last column: " << b << std::endl;
+ break;
+ case XML_showRowStripes:
+ b = to_bool(attr.value);
+ mp_table->set_style_show_row_stripes(b);
+ if (m_debug)
+ std::cout << " * show row stripes: " << b << std::endl;
+ break;
+ case XML_showColumnStripes:
+ b = to_bool(attr.value);
+ mp_table->set_style_show_column_stripes(b);
+ if (m_debug)
+ std::cout << " * show column stripes: " << b << std::endl;
+ break;
+ default:
+ ;
+ }
+ }
+};
+
+}
+
+xlsx_table_context::xlsx_table_context(
+ session_context& session_cxt, const tokens& tokens,
+ spreadsheet::iface::import_table& table,
+ spreadsheet::iface::import_reference_resolver& resolver) :
+ xml_context_base(session_cxt, tokens), m_table(table), m_resolver(resolver),
+ m_cxt_autofilter(session_cxt, tokens, resolver)
+{
+ register_child(&m_cxt_autofilter);
+
+ init_ooxml_context(*this);
+}
+
+xlsx_table_context::~xlsx_table_context() {}
+
+xml_context_base* xlsx_table_context::create_child_context(xmlns_id_t ns, xml_token_t name)
+{
+ if (ns == NS_ooxml_xlsx && name == XML_autoFilter)
+ {
+ m_cxt_autofilter.reset();
+ return &m_cxt_autofilter;
+ }
+ return nullptr;
+}
+
+void xlsx_table_context::end_child_context(xmlns_id_t ns, xml_token_t name, xml_context_base* child)
+{
+ if (ns == NS_ooxml_xlsx && name == XML_autoFilter)
+ {
+ assert(child == &m_cxt_autofilter);
+
+ spreadsheet::iface::import_auto_filter* af = m_table.get_auto_filter();
+ if (!af)
+ return;
+
+ const xlsx_autofilter_context& cxt = static_cast<const xlsx_autofilter_context&>(*child);
+ cxt.push_to_model(*af);
+ }
+}
+
+void xlsx_table_context::start_element(xmlns_id_t ns, xml_token_t name, const xml_token_attrs_t& attrs)
+{
+ xml_token_pair_t parent = push_stack(ns, name);
+ if (ns != NS_ooxml_xlsx)
+ return;
+
+ std::string_view str;
+
+ switch (name)
+ {
+ case XML_table:
+ {
+ xml_element_expected(parent, XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN);
+ start_element_table(attrs);
+ break;
+ }
+ case XML_tableColumns:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_table);
+ single_long_attr_getter func(NS_ooxml_xlsx, XML_count);
+ long column_count = for_each(attrs.begin(), attrs.end(), func).get_value();
+ if (get_config().debug)
+ std::cout << " * column count: " << column_count << std::endl;
+
+ m_table.set_column_count(column_count);
+ }
+ break;
+ case XML_tableColumn:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_tableColumns);
+ table_column_attr_parser func(&get_session_context().spool);
+ func = for_each(attrs.begin(), attrs.end(), func);
+ if (get_config().debug)
+ {
+ std::cout << " * table column (id=" << func.get_id() << "; name=" << func.get_name() << ")" << std::endl;
+ std::cout << " * totals row label: " << func.get_totals_row_label() << std::endl;
+ std::cout << " * totals func: " << static_cast<int>(func.get_totals_row_function()) << std::endl;
+ }
+
+ m_table.set_column_identifier(func.get_id());
+ str = func.get_name();
+ m_table.set_column_name(str);
+ str = func.get_totals_row_label();
+ m_table.set_column_totals_row_label(str);
+ m_table.set_column_totals_row_function(func.get_totals_row_function());
+ }
+ break;
+ case XML_tableStyleInfo:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_table);
+ table_style_info_attr_parser func(&m_table, get_config().debug);
+ for_each(attrs.begin(), attrs.end(), func);
+ }
+ break;
+ default:
+ warn_unhandled();
+ }
+
+}
+
+bool xlsx_table_context::end_element(xmlns_id_t ns, xml_token_t name)
+{
+ if (ns == NS_ooxml_xlsx)
+ {
+ switch (name)
+ {
+ case XML_table:
+ m_table.commit();
+ break;
+ case XML_tableColumn:
+ m_table.commit_column();
+ break;
+ default:
+ ;
+ }
+ }
+
+ return pop_stack(ns, name);
+}
+
+void xlsx_table_context::start_element_table(const xml_token_attrs_t& attrs)
+{
+ long id = -1;
+ long totals_row_count = -1;
+
+ std::optional<std::string_view> name;
+ std::optional<std::string_view> display_name;
+ std::optional<std::string_view> ref;
+
+ for (const xml_token_attr_t& attr : attrs)
+ {
+ if (attr.ns)
+ continue;
+
+ switch (attr.name)
+ {
+ case XML_id:
+ id = to_long(attr.value);
+ break;
+ case XML_totalsRowCount:
+ totals_row_count = to_long(attr.value);
+ break;
+ case XML_name:
+ name = attr.value;
+ break;
+ case XML_displayName:
+ display_name = attr.value;
+ break;
+ case XML_ref:
+ ref = attr.value;
+ break;
+ }
+ }
+
+ if (get_config().debug)
+ {
+ auto str_or_not = [](const auto& v) -> std::string_view
+ {
+ return v ? *v : "-";
+ };
+
+ std::cout << "* table (range=" << str_or_not(ref)
+ << "; id=" << id
+ << "; name=" << str_or_not(name)
+ << "; display name=" << str_or_not(display_name) << ")" << std::endl;
+
+ std::cout << " * totals row count: " << totals_row_count << std::endl;
+ }
+
+ if (id >= 0)
+ m_table.set_identifier(id);
+
+ if (ref)
+ {
+ ss::range_t range = to_rc_range(m_resolver.resolve_range(*ref));
+ m_table.set_range(range);
+ }
+
+ if (name)
+ m_table.set_name(*name);
+
+ if (display_name)
+ m_table.set_display_name(*display_name);
+
+ if (totals_row_count >= 0)
+ m_table.set_totals_row_count(totals_row_count);
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xlsx_table_context.hpp b/src/liborcus/xlsx_table_context.hpp
new file mode 100644
index 0000000..8b3e629
--- /dev/null
+++ b/src/liborcus/xlsx_table_context.hpp
@@ -0,0 +1,52 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef ORCUS_XLSX_TABLE_CONTEXT_HPP
+#define ORCUS_XLSX_TABLE_CONTEXT_HPP
+
+#include "xml_context_base.hpp"
+#include "xlsx_autofilter_context.hpp"
+
+namespace orcus {
+
+namespace spreadsheet { namespace iface {
+
+class import_table;
+class import_reference_resolver;
+
+}}
+
+class xlsx_table_context : public xml_context_base
+{
+public:
+ xlsx_table_context(
+ session_context& session_cxt, const tokens& tokens,
+ spreadsheet::iface::import_table& table,
+ spreadsheet::iface::import_reference_resolver& resolver);
+ virtual ~xlsx_table_context();
+
+ virtual xml_context_base* create_child_context(xmlns_id_t ns, xml_token_t name);
+ virtual void end_child_context(xmlns_id_t ns, xml_token_t name, xml_context_base* child);
+
+ virtual void start_element(xmlns_id_t ns, xml_token_t name, const xml_token_attrs_t& attrs);
+ virtual bool end_element(xmlns_id_t ns, xml_token_t name);
+
+private:
+ void start_element_table(const xml_token_attrs_t& attrs);
+
+private:
+ spreadsheet::iface::import_table& m_table;
+ spreadsheet::iface::import_reference_resolver& m_resolver;
+
+ xlsx_autofilter_context m_cxt_autofilter;
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xlsx_types.cpp b/src/liborcus/xlsx_types.cpp
new file mode 100644
index 0000000..3c0ba2a
--- /dev/null
+++ b/src/liborcus/xlsx_types.cpp
@@ -0,0 +1,116 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xlsx_types.hpp"
+
+#include <mdds/sorted_string_map.hpp>
+
+namespace orcus {
+
+namespace {
+
+constexpr std::string_view str_unknown = "unknown";
+
+namespace cell_type {
+
+using map_type = mdds::sorted_string_map<xlsx_cell_t, mdds::string_view_map_entry>;
+
+// Keys must be sorted.
+constexpr map_type::entry entries[] = {
+ { "b", xlsx_ct_boolean },
+ { "e", xlsx_ct_error },
+ { "inlineStr", xlsx_ct_inline_string },
+ { "n", xlsx_ct_numeric },
+ { "s", xlsx_ct_shared_string },
+ { "str", xlsx_ct_formula_string }
+};
+
+const map_type& get()
+{
+ static const map_type map(entries, std::size(entries), xlsx_ct_unknown);
+ return map;
+}
+
+} // namespace cell_type
+
+namespace rca {
+
+using map_type = mdds::sorted_string_map<xlsx_rev_row_column_action_t, mdds::string_view_map_entry>;
+
+// Keys must be sorted.
+constexpr map_type::entry entries[] = {
+ { "deleteCol", xlsx_rev_rca_delete_column },
+ { "deleteRow", xlsx_rev_rca_delete_row },
+ { "insertCol", xlsx_rev_rca_insert_column },
+ { "insertRow", xlsx_rev_rca_insert_row }
+};
+
+const map_type& get()
+{
+ static const map_type map(entries, std::size(entries), xlsx_rev_rca_unknown);
+ return map;
+}
+
+} // namespace rca
+
+} // anonymous namespace
+
+xlsx_cell_t to_xlsx_cell_type(std::string_view s)
+{
+ return cell_type::get().find(s);
+}
+
+std::string_view to_string(xlsx_cell_t type)
+{
+ switch (type)
+ {
+ case xlsx_ct_boolean:
+ return cell_type::entries[0].key;
+ case xlsx_ct_error:
+ return cell_type::entries[1].key;
+ case xlsx_ct_inline_string:
+ return cell_type::entries[2].key;
+ case xlsx_ct_numeric:
+ return cell_type::entries[3].key;
+ case xlsx_ct_shared_string:
+ return cell_type::entries[4].key;
+ case xlsx_ct_formula_string:
+ return cell_type::entries[5].key;
+ default:
+ ;
+ }
+ return str_unknown;
+}
+
+xlsx_rev_row_column_action_t to_xlsx_rev_row_column_action_type(std::string_view s)
+{
+ return rca::get().find(s);
+}
+
+std::string_view to_string(xlsx_rev_row_column_action_t type)
+{
+ switch (type)
+ {
+ case xlsx_rev_rca_delete_column:
+ return rca::entries[0].key;
+ case xlsx_rev_rca_delete_row:
+ return rca::entries[1].key;
+ case xlsx_rev_rca_insert_column:
+ return rca::entries[2].key;
+ case xlsx_rev_rca_insert_row:
+ return rca::entries[3].key;
+ case xlsx_rev_rca_unknown:
+ default:
+ ;
+ }
+
+ return str_unknown;
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xlsx_types.hpp b/src/liborcus/xlsx_types.hpp
new file mode 100644
index 0000000..6d61e1f
--- /dev/null
+++ b/src/liborcus/xlsx_types.hpp
@@ -0,0 +1,93 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef __ORCUS_XLSX_TYPES_HPP__
+#define __ORCUS_XLSX_TYPES_HPP__
+
+#include "ooxml_types.hpp"
+#include "orcus/spreadsheet/types.hpp"
+
+namespace orcus {
+
+namespace spreadsheet { namespace iface {
+
+class import_sheet;
+
+}}
+
+struct xlsx_rel_sheet_info : public opc_rel_extra
+{
+ std::string_view name;
+ size_t id;
+
+ xlsx_rel_sheet_info() : id(0) {}
+
+ virtual ~xlsx_rel_sheet_info() override {}
+};
+
+struct xlsx_rel_pivot_cache_info : public opc_rel_extra
+{
+ spreadsheet::pivot_cache_id_t id;
+
+ xlsx_rel_pivot_cache_info(spreadsheet::pivot_cache_id_t _id) : id(_id) {}
+
+ virtual ~xlsx_rel_pivot_cache_info() override {}
+};
+
+/**
+ * Data to pass to the pivot cache record handler.
+ */
+struct xlsx_rel_pivot_cache_record_info : public opc_rel_extra
+{
+ spreadsheet::pivot_cache_id_t id;
+
+ xlsx_rel_pivot_cache_record_info(spreadsheet::pivot_cache_id_t _id) : id(_id) {}
+
+ virtual ~xlsx_rel_pivot_cache_record_info() override {}
+};
+
+struct xlsx_rel_table_info : public opc_rel_extra
+{
+ spreadsheet::iface::import_sheet* sheet_interface;
+
+ xlsx_rel_table_info() : sheet_interface(nullptr) {}
+
+ virtual ~xlsx_rel_table_info() override {}
+};
+
+enum xlsx_cell_t
+{
+ xlsx_ct_unknown = 0,
+ xlsx_ct_boolean,
+ xlsx_ct_error,
+ xlsx_ct_numeric,
+ xlsx_ct_inline_string,
+ xlsx_ct_shared_string,
+ xlsx_ct_formula_string,
+};
+
+xlsx_cell_t to_xlsx_cell_type(std::string_view s);
+
+std::string_view to_string(xlsx_cell_t type);
+
+enum xlsx_rev_row_column_action_t
+{
+ xlsx_rev_rca_unknown = 0,
+ xlsx_rev_rca_delete_column,
+ xlsx_rev_rca_delete_row,
+ xlsx_rev_rca_insert_column,
+ xlsx_rev_rca_insert_row
+};
+
+xlsx_rev_row_column_action_t to_xlsx_rev_row_column_action_type(std::string_view s);
+
+std::string_view to_string(xlsx_rev_row_column_action_t type);
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xlsx_workbook_context.cpp b/src/liborcus/xlsx_workbook_context.cpp
new file mode 100644
index 0000000..4980418
--- /dev/null
+++ b/src/liborcus/xlsx_workbook_context.cpp
@@ -0,0 +1,253 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xlsx_workbook_context.hpp"
+#include "ooxml_global.hpp"
+#include "ooxml_schemas.hpp"
+#include "ooxml_token_constants.hpp"
+#include "ooxml_namespace_types.hpp"
+#include "session_context.hpp"
+#include "xlsx_session_data.hpp"
+
+#include "orcus/measurement.hpp"
+#include "orcus/spreadsheet/import_interface.hpp"
+
+namespace orcus {
+
+xlsx_workbook_context::xlsx_workbook_context(
+ session_context& session_cxt, const tokens& tokens,
+ spreadsheet::iface::import_factory& factory) :
+ xml_context_base(session_cxt, tokens),
+ m_defined_name_scope(-1),
+ m_sheet_count(0),
+ m_factory(factory),
+ mp_named_exp(factory.get_named_expression())
+{
+ init_ooxml_context(*this);
+}
+
+xlsx_workbook_context::~xlsx_workbook_context() = default;
+
+xml_context_base* xlsx_workbook_context::create_child_context(xmlns_id_t /*ns*/, xml_token_t /*name*/)
+{
+ return nullptr;
+}
+
+void xlsx_workbook_context::end_child_context(xmlns_id_t /*ns*/, xml_token_t /*name*/, xml_context_base* /*child*/)
+{
+}
+
+void xlsx_workbook_context::start_element(xmlns_id_t ns, xml_token_t name, const xml_token_attrs_t& attrs)
+{
+ xml_token_pair_t parent = push_stack(ns, name);
+ session_context& cxt = get_session_context();
+ string_pool& sp = cxt.spool;
+
+ if (ns == NS_ooxml_xlsx)
+ {
+ switch (name)
+ {
+ case XML_workbook:
+ {
+ xml_element_expected(parent, XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN);
+ if (get_config().debug)
+ print_attrs(get_tokens(), attrs);
+
+ break;
+ }
+ case XML_sheets:
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_workbook);
+ break;
+ case XML_sheet:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_sheets);
+
+ std::string_view rid;
+ xlsx_rel_sheet_info sheet;
+
+ std::for_each(attrs.begin(), attrs.end(),
+ [&](const xml_token_attr_t& attr)
+ {
+ if (!attr.ns || attr.ns == NS_ooxml_xlsx)
+ {
+ switch (attr.name)
+ {
+ case XML_name:
+ sheet.name = sp.intern(attr.value).first;
+ break;
+ case XML_sheetId:
+ {
+ if (!attr.value.empty())
+ sheet.id = to_long(attr.value);
+ break;
+ }
+ default:
+ ;
+ }
+ }
+ else if (attr.ns == NS_ooxml_r && attr.name == XML_id)
+ {
+ rid = sp.intern(attr.value).first;
+ }
+ }
+ );
+
+ if (sheet.name.empty())
+ throw xml_structure_error("workbook.xml: sheet element must have a valid name element.");
+
+ // Insert the sheet here so that we have all the sheets available
+ // prior to parsing global named expressions.
+ m_factory.append_sheet(m_sheet_count++, sheet.name);
+
+ m_workbook_info.data.insert(
+ opc_rel_extras_t::map_type::value_type(
+ rid, std::make_unique<xlsx_rel_sheet_info>(sheet)));
+
+ break;
+ }
+ case XML_definedNames:
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_workbook);
+ break;
+ case XML_definedName:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_definedNames);
+
+ std::for_each(attrs.begin(), attrs.end(),
+ [&](const xml_token_attr_t& attr)
+ {
+ if (attr.ns && attr.ns != NS_ooxml_xlsx)
+ return;
+
+ switch (attr.name)
+ {
+ case XML_name:
+ {
+ m_defined_name = attr.value;
+ if (attr.transient)
+ {
+ m_defined_name =
+ cxt.spool.intern(m_defined_name).first;
+ }
+ break;
+ }
+ case XML_localSheetId:
+ m_defined_name_scope = to_long(attr.value);
+ break;
+ default:
+ ;
+ }
+ }
+ );
+
+ break;
+ }
+ case XML_pivotCaches:
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_workbook);
+ break;
+ case XML_pivotCache:
+ {
+ xml_element_expected(parent, NS_ooxml_xlsx, XML_pivotCaches);
+
+ std::string_view rid;
+ long cache_id = -1;
+ std::for_each(attrs.begin(), attrs.end(),
+ [&](const xml_token_attr_t& attr)
+ {
+ if (!attr.ns || attr.ns == NS_ooxml_xlsx)
+ {
+ switch (attr.name)
+ {
+ case XML_cacheId:
+ cache_id = to_long(attr.value);
+ break;
+ default:
+ ;
+ }
+ }
+ else if (attr.ns == NS_ooxml_r)
+ {
+ switch (attr.name)
+ {
+ case XML_id:
+ rid = attr.value;
+ break;
+ default:
+ ;
+ }
+ }
+ }
+ );
+
+ m_workbook_info.data.insert(
+ opc_rel_extras_t::map_type::value_type(
+ rid, std::make_unique<xlsx_rel_pivot_cache_info>(cache_id)));
+
+ break;
+ }
+ default:
+ warn_unhandled();
+ }
+ }
+}
+
+bool xlsx_workbook_context::end_element(xmlns_id_t ns, xml_token_t name)
+{
+ if (ns == NS_ooxml_xlsx)
+ {
+ if (name == XML_definedName)
+ {
+ push_defined_name();
+
+ m_defined_name = std::string_view{};
+ m_defined_name_exp = std::string_view{};
+ m_defined_name_scope = -1;
+ }
+ }
+ return pop_stack(ns, name);
+}
+
+void xlsx_workbook_context::characters(std::string_view str, bool transient)
+{
+ std::string_view sv(str);
+ xml_token_pair_t cur = get_current_element();
+ string_pool& sp = get_session_context().spool;
+
+ if (cur.first == NS_ooxml_xlsx)
+ {
+ if (cur.second == XML_definedName)
+ m_defined_name_exp = transient ? sp.intern(sv).first : sv;
+ }
+}
+
+void xlsx_workbook_context::pop_workbook_info(opc_rel_extras_t& workbook_data)
+{
+ m_workbook_info.swap(workbook_data);
+}
+
+void xlsx_workbook_context::push_defined_name()
+{
+ spreadsheet::iface::import_named_expression* named_exp = mp_named_exp;
+
+ if (m_defined_name_scope >= 0)
+ {
+ // sheet local scope.
+ spreadsheet::iface::import_sheet* sheet = m_factory.get_sheet(m_defined_name_scope);
+ if (!sheet)
+ return;
+
+ named_exp = sheet->get_named_expression();
+ }
+
+ if (named_exp)
+ {
+ named_exp->set_named_expression(m_defined_name, m_defined_name_exp);
+ named_exp->commit();
+ }
+}
+
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xlsx_workbook_context.hpp b/src/liborcus/xlsx_workbook_context.hpp
new file mode 100644
index 0000000..71d1958
--- /dev/null
+++ b/src/liborcus/xlsx_workbook_context.hpp
@@ -0,0 +1,65 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_XLSX_WORKBOOK_CONTEXT_HPP
+#define INCLUDED_ORCUS_XLSX_WORKBOOK_CONTEXT_HPP
+
+#include "xml_context_base.hpp"
+#include "orcus/spreadsheet/types.hpp"
+#include "xlsx_types.hpp"
+
+#include <unordered_map>
+
+namespace orcus {
+
+namespace spreadsheet { namespace iface {
+
+class import_factory;
+class import_named_expression;
+
+}}
+
+/**
+ * Context for xl/workbook.xml.
+ */
+class xlsx_workbook_context : public xml_context_base
+{
+public:
+ typedef std::unordered_map<std::string_view, xlsx_rel_sheet_info> sheet_info_type;
+
+ xlsx_workbook_context(
+ session_context& session_cxt, const tokens& tokens,
+ spreadsheet::iface::import_factory& factory);
+
+ virtual ~xlsx_workbook_context();
+
+ virtual xml_context_base* create_child_context(xmlns_id_t ns, xml_token_t name);
+ virtual void end_child_context(xmlns_id_t ns, xml_token_t name, xml_context_base* child);
+
+ virtual void start_element(xmlns_id_t ns, xml_token_t name, const xml_token_attrs_t& attrs);
+ virtual bool end_element(xmlns_id_t ns, xml_token_t name);
+ virtual void characters(std::string_view str, bool transient);
+
+ void pop_workbook_info(opc_rel_extras_t& sheets);
+
+private:
+ void push_defined_name();
+
+private:
+ opc_rel_extras_t m_workbook_info;
+ std::string_view m_defined_name;
+ std::string_view m_defined_name_exp;
+ spreadsheet::sheet_t m_defined_name_scope;
+ size_t m_sheet_count;
+ spreadsheet::iface::import_factory& m_factory;
+ spreadsheet::iface::import_named_expression* mp_named_exp;
+};
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xml_context_base.cpp b/src/liborcus/xml_context_base.cpp
new file mode 100644
index 0000000..4d61926
--- /dev/null
+++ b/src/liborcus/xml_context_base.cpp
@@ -0,0 +1,348 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xml_context_base.hpp"
+#include "session_context.hpp"
+
+#include "orcus/exception.hpp"
+#include "orcus/tokens.hpp"
+
+#include <iostream>
+#include <sstream>
+
+using namespace std;
+
+namespace orcus {
+
+namespace {
+
+void print_stack(const tokens& tokens, const xml_elem_stack_t& elem_stack, const xmlns_context* ns_cxt)
+{
+ cerr << "[ ";
+ xml_elem_stack_t::const_iterator itr, itr_beg = elem_stack.begin(), itr_end = elem_stack.end();
+ for (itr = itr_beg; itr != itr_end; ++itr)
+ {
+ if (itr != itr_beg)
+ cerr << " -> ";
+
+ xmlns_id_t ns = itr->first;
+ if (ns_cxt)
+ {
+ std::string_view alias = ns_cxt->get_alias(ns);
+ if (!alias.empty())
+ cerr << alias << ":";
+ }
+ else
+ cerr << ns << ":";
+
+ cerr << tokens.get_token_name(itr->second);
+ }
+ cerr << " ]";
+}
+
+}
+
+xml_context_base::xml_context_base(session_context& session_cxt, const tokens& tokens) :
+ m_config(format_t::unknown),
+ mp_ns_cxt(nullptr), m_session_cxt(session_cxt), m_tokens(tokens),
+ m_elem_printer(m_tokens)
+{
+}
+
+xml_context_base::~xml_context_base()
+{
+}
+
+void xml_context_base::declaration(const xml_declaration_t& /*decl*/)
+{
+}
+
+xml_context_base* xml_context_base::create_child_context(xmlns_id_t /*ns*/, xml_token_t /*name*/)
+{
+ return nullptr;
+}
+
+void xml_context_base::end_child_context(xmlns_id_t /*ns*/, xml_token_t /*name*/, xml_context_base* /*child*/)
+{
+}
+
+void xml_context_base::characters(std::string_view /*str*/, bool /*transient*/)
+{
+}
+
+bool xml_context_base::evaluate_child_element(xmlns_id_t ns, xml_token_t name) const
+{
+ const xml_token_pair_t parent = get_current_element();
+
+ if (xml_element_always_allowed(parent))
+ return true;
+
+ const xml_token_pair_t child(ns, name);
+
+ xml_element_validator::result res = m_elem_validator.validate(parent, child);
+
+ if (get_config().debug)
+ {
+ switch (res)
+ {
+ case xml_element_validator::result::child_invalid:
+ {
+ std::ostringstream os;
+ print_element(os, child);
+ os << " cannot be a child element of ";
+ print_element(os, parent);
+ warn(os.str());
+ break;
+ }
+ case xml_element_validator::result::parent_unknown:
+ {
+ std::ostringstream os;
+ os << "parent ";
+ print_element(os, parent);
+ os << " does not have any rules defined (child: ";
+ print_element(os, child);
+ os << ')';
+ warn(os.str());
+ break;
+ }
+ case xml_element_validator::result::child_valid:
+ break;
+ }
+ }
+
+ return res != xml_element_validator::result::child_invalid;
+}
+
+void xml_context_base::set_ns_context(const xmlns_context* p)
+{
+ mp_ns_cxt = p;
+ m_elem_printer.set_ns_context(p);
+
+ for (auto* child : m_child_contexts)
+ child->set_ns_context(p);
+}
+
+void xml_context_base::set_config(const config& opt)
+{
+ m_config = opt;
+
+ for (auto* child : m_child_contexts)
+ child->set_config(opt);
+}
+
+void xml_context_base::set_always_allowed_elements(xml_elem_set_t elems)
+{
+ m_always_allowed_elements = std::move(elems);
+}
+
+void xml_context_base::init_element_validator(
+ const xml_element_validator::rule* rules, std::size_t n_rules)
+{
+ m_elem_validator.init(rules, n_rules);
+}
+
+session_context& xml_context_base::get_session_context()
+{
+ return m_session_cxt;
+}
+
+const session_context& xml_context_base::get_session_context() const
+{
+ return m_session_cxt;
+}
+
+const tokens& xml_context_base::get_tokens() const
+{
+ return m_tokens;
+}
+
+xml_token_pair_t xml_context_base::push_stack(xmlns_id_t ns, xml_token_t name)
+{
+ xml_token_pair_t parent = get_current_element();
+ m_stack.emplace_back(ns, name);
+ return parent;
+}
+
+bool xml_context_base::pop_stack(xmlns_id_t ns, xml_token_t name)
+{
+ const xml_token_pair_t& r = m_stack.back();
+
+ if (ns != r.first || name != r.second)
+ throw general_error("mismatched element name");
+
+ m_stack.pop_back();
+ return m_stack.empty();
+}
+
+xml_token_pair_t xml_context_base::get_current_element() const
+{
+ return m_stack.empty() ? xml_token_pair_t(XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN) : m_stack.back();
+}
+
+const xml_token_pair_t& xml_context_base::get_parent_element() const
+{
+ if (m_stack.size() < 2)
+ throw general_error("element stack has no parent element");
+
+ return m_stack[m_stack.size() - 2];
+}
+
+void xml_context_base::warn_unhandled() const
+{
+ if (!m_config.debug)
+ return;
+
+ cerr << "warning: unhandled element ";
+ print_stack(m_tokens, m_stack, mp_ns_cxt);
+ cerr << endl;
+}
+
+void xml_context_base::warn_unexpected() const
+{
+ if (!m_config.debug)
+ return;
+
+ cerr << "warning: unexpected element ";
+ print_stack(m_tokens, m_stack, mp_ns_cxt);
+ cerr << endl;
+}
+
+void xml_context_base::warn(std::string_view msg) const
+{
+ if (!m_config.debug)
+ return;
+
+ cerr << "warning: " << msg << endl;
+}
+
+void xml_context_base::xml_element_expected(
+ const xml_token_pair_t& elem, xmlns_id_t ns, xml_token_t name,
+ const string* error) const
+{
+ if (!m_config.structure_check)
+ return;
+
+ if (elem.first == ns && elem.second == name)
+ // This is an expected element. Good.
+ return;
+
+ if (m_always_allowed_elements.count(elem))
+ return;
+
+ if (error)
+ {
+ throw xml_structure_error(*error);
+ }
+
+ // Create a generic error message.
+ std::ostringstream os;
+ os << "element ";
+ print_element(os, {ns, name});
+ os << " expected, but ";
+ print_element(os, elem);
+ os << " encountered." << std::endl << std::endl;
+
+ print_current_element_stack(os);
+ throw xml_structure_error(os.str());
+}
+
+void xml_context_base::xml_element_expected(
+ const xml_token_pair_t& elem, const xml_elem_stack_t& expected_elems) const
+{
+ if (!m_config.structure_check)
+ return;
+
+ for (const xml_token_pair_t& e : expected_elems)
+ {
+ if (elem == e)
+ return;
+ }
+
+ if (m_always_allowed_elements.count(elem))
+ return;
+
+ throw_unknown_element_error(elem);
+}
+
+void xml_context_base::xml_element_expected(
+ const xml_token_pair_t& elem, const xml_elem_set_t& expected_elems) const
+{
+ if (!m_config.structure_check)
+ return;
+
+ if (expected_elems.count(elem))
+ return;
+
+ if (m_always_allowed_elements.count(elem))
+ return;
+
+ throw_unknown_element_error(elem);
+}
+
+bool xml_context_base::xml_element_always_allowed(const xml_token_pair_t& elem) const
+{
+ return m_always_allowed_elements.count(elem) > 0;
+}
+
+void xml_context_base::print_namespace(std::ostream& os, xmlns_id_t ns) const
+{
+ m_elem_printer.print_namespace(os, ns);
+}
+
+void xml_context_base::print_element(std::ostream& os, const xml_token_pair_t& elem) const
+{
+ m_elem_printer.print_element(os, elem.first, elem.second);
+}
+
+void xml_context_base::print_current_element_stack(std::ostream& os) const
+{
+ os << "current element stack:" << std::endl << std::endl;
+
+ for (const auto& [ns, name] : m_stack)
+ {
+ os << " - ";
+ print_element(os, {ns, name});
+ os << std::endl;
+ }
+}
+
+void xml_context_base::throw_unknown_element_error(const xml_token_pair_t& elem) const
+{
+ // Create a generic error message.
+ std::ostringstream os;
+ os << "unexpected element encountered: ";
+ print_element(os, elem);
+ os << std::endl << std::endl;
+
+ print_current_element_stack(os);
+ throw xml_structure_error(os.str());
+}
+
+const config& xml_context_base::get_config() const
+{
+ return m_config;
+}
+
+std::string_view xml_context_base::intern(const xml_token_attr_t& attr)
+{
+ return m_session_cxt.intern(attr);
+}
+
+std::string_view xml_context_base::intern(std::string_view s)
+{
+ return m_session_cxt.intern(s);
+}
+
+void xml_context_base::register_child(xml_context_base* child)
+{
+ assert(child);
+ m_child_contexts.push_back(child);
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xml_context_base.hpp b/src/liborcus/xml_context_base.hpp
new file mode 100644
index 0000000..6956806
--- /dev/null
+++ b/src/liborcus/xml_context_base.hpp
@@ -0,0 +1,192 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_XML_CONTEXT_BASE_HPP
+#define INCLUDED_ORCUS_XML_CONTEXT_BASE_HPP
+
+#include "xml_element_validator.hpp"
+#include "xml_stream_handler.hpp"
+#include "xml_util.hpp"
+
+namespace orcus {
+
+struct session_context;
+class tokens;
+class xmlns_context;
+class xml_element_validator;
+
+class xml_context_base
+{
+public:
+ xml_context_base(const xml_context_base&) = delete;
+ xml_context_base& operator=(const xml_context_base&) = delete;
+
+ xml_context_base(session_context& session_cxt, const tokens& tokens);
+ virtual ~xml_context_base() = 0;
+
+ /**
+ * This gets called at the end of the initial XML declaration block i.e.
+ * &lt;?xml ... ?&gt;. Obviously this gets called only on the root context.
+ *
+ * @param decl XML declaration attributes
+ */
+ virtual void declaration(const xml_declaration_t& decl);
+
+ /**
+ * This method gets called by the stream handler to fetch a child context
+ * object if applicable. If the current context can handle the specified
+ * element, it should return nullptr. If the current context should spawn a
+ * new context to handle the specified element and its sub structure, then
+ * it should return a pointer to a child context.
+ *
+ * @note The caller is not responsible for managing the life cycle of the
+ * returned context object; the current context object must manage the life
+ * cycle of the context object it returns.
+ *
+ * @param ns namespace value for the element.
+ * @param name name of the element.
+ *
+ * @return pointer to the context object that should handle the specified
+ * element, or nullptr if the current context can handle the
+ * element.
+ */
+ virtual xml_context_base* create_child_context(xmlns_id_t ns, xml_token_t name);
+
+ /**
+ * This method gets called when the child context is about to get phased
+ * out, to give the parent context object to communicate with the child
+ * context object before it gets phased out.
+ *
+ * @param ns namespace value for the element.
+ * @param name name of the element.
+ * @param child pointer to the child context object that is about to get
+ * phased out.
+ */
+ virtual void end_child_context(xmlns_id_t ns, xml_token_t name, xml_context_base* child);
+
+ /**
+ * Called on the opening of each element. The implementor should call
+ * push_stack() at the beginning of this method to have the base class keep
+ * track of the element stack. Be sure to also call pop_stack() in
+ * end_element() to maintain correct element stack.
+ *
+ * @param ns namespace token
+ * @param name element name
+ * @param attrs attributes
+ */
+ virtual void start_element(xmlns_id_t ns, xml_token_t name, const std::vector<xml_token_attr_t>& attrs) = 0;
+
+ /**
+ * Called on the closing of each element.
+ *
+ * @param ns namespace token
+ * @param name element name
+ *
+ * @return true if the element that's closing is the root element of the
+ * context, else return false. The implementor should simply call
+ * pop_stack() and use the returned value from it as this method's
+ * return value.
+ */
+ virtual bool end_element(xmlns_id_t ns, xml_token_t name) = 0;
+
+ /**
+ * Called when passing xml content. When the content value is transient,
+ * the value is not expected to survive beyond the scope of the callback.
+ *
+ * @param str content value.
+ * @param transient whether or not the value is transient.
+ */
+ virtual void characters(std::string_view str, bool transient);
+
+ bool evaluate_child_element(xmlns_id_t ns, xml_token_t name) const;
+
+ void set_ns_context(const xmlns_context* p);
+
+ const config& get_config() const;
+
+ void set_config(const config& opt);
+
+ void set_always_allowed_elements(xml_elem_set_t elems);
+
+protected:
+ void init_element_validator(const xml_element_validator::rule* rules, std::size_t n_rules);
+
+ session_context& get_session_context();
+ const session_context& get_session_context() const;
+ const tokens& get_tokens() const;
+ xml_token_pair_t push_stack(xmlns_id_t ns, xml_token_t name);
+ bool pop_stack(xmlns_id_t ns, xml_token_t name);
+ xml_token_pair_t get_current_stack(xmlns_id_t ns, xml_token_t name);
+ xml_token_pair_t get_current_element() const;
+
+ /**
+ * @warning Don't call this at the root element, or it will throw an
+ * exception.
+ */
+ const xml_token_pair_t& get_parent_element() const;
+ void warn_unhandled() const;
+ void warn_unexpected() const;
+ void warn(std::string_view msg) const;
+
+ /**
+ * Check if observed element equals expected element. If not, it throws an
+ * xml_structure_error exception.
+ *
+ * @param elem element observed.
+ * @param ns namespace of expected element.
+ * @param name name of expected element.
+ * @param error custom error message if needed.
+ */
+ void xml_element_expected(
+ const xml_token_pair_t& elem, xmlns_id_t ns, xml_token_t name,
+ const ::std::string* error = nullptr) const;
+
+ void xml_element_expected(
+ const xml_token_pair_t& elem, const xml_elem_stack_t& expected_elems) const;
+
+ void xml_element_expected(
+ const xml_token_pair_t& elem, const xml_elem_set_t& expected_elems) const;
+
+ bool xml_element_always_allowed(const xml_token_pair_t& elem) const;
+
+ void print_namespace(std::ostream& os, xmlns_id_t ns) const;
+
+ void print_element(std::ostream& os, const xml_token_pair_t& elem) const;
+
+ void print_current_element_stack(std::ostream& os) const;
+
+ /**
+ * Throw a viewer-friendly XML structure error with the information about an
+ * unknown element encountered.
+ *
+ * @param elem unknown element encountered.
+ */
+ void throw_unknown_element_error(const xml_token_pair_t& elem) const;
+
+ std::string_view intern(const xml_token_attr_t& attr);
+ std::string_view intern(std::string_view s);
+
+ void register_child(xml_context_base* child);
+
+private:
+ std::vector<xml_context_base*> m_child_contexts;
+
+ config m_config;
+ const xmlns_context* mp_ns_cxt;
+ session_context& m_session_cxt;
+ const tokens& m_tokens;
+ xml_element_printer m_elem_printer;
+ xml_element_validator m_elem_validator;
+ xml_elem_stack_t m_stack;
+ xml_elem_set_t m_always_allowed_elements;
+};
+
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xml_context_global.cpp b/src/liborcus/xml_context_global.cpp
new file mode 100644
index 0000000..5c98f07
--- /dev/null
+++ b/src/liborcus/xml_context_global.cpp
@@ -0,0 +1,106 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xml_context_global.hpp"
+#include "orcus/string_pool.hpp"
+#include "orcus/measurement.hpp"
+
+#include <algorithm>
+
+namespace orcus {
+
+single_attr_getter::single_attr_getter(string_pool& pool, xmlns_id_t ns, xml_token_t name) :
+ m_pool(&pool), m_ns(ns), m_name(name) {}
+
+single_attr_getter::single_attr_getter(xmlns_id_t ns, xml_token_t name) :
+ m_pool(nullptr), m_ns(ns), m_name(name) {}
+
+void single_attr_getter::operator() (const xml_token_attr_t& attr)
+{
+ if (attr.name != m_name)
+ return;
+
+ if (attr.ns && attr.ns != m_ns)
+ return;
+
+ m_value = attr.value;
+ if (attr.transient && m_pool)
+ m_value = m_pool->intern(m_value).first;
+}
+
+std::string_view single_attr_getter::get_value() const
+{
+ return m_value;
+}
+
+std::string_view single_attr_getter::get(
+ const std::vector<xml_token_attr_t>& attrs, xmlns_id_t ns, xml_token_t name)
+{
+ single_attr_getter func(ns, name);
+ return std::for_each(attrs.begin(), attrs.end(), func).get_value();
+}
+
+std::string_view single_attr_getter::get(
+ const std::vector<xml_token_attr_t>& attrs, string_pool& pool, xmlns_id_t ns, xml_token_t name)
+{
+ single_attr_getter func(pool, ns, name);
+ return std::for_each(attrs.begin(), attrs.end(), func).get_value();
+}
+
+single_long_attr_getter::single_long_attr_getter(xmlns_id_t ns, xml_token_t name) :
+ m_value(-1), m_ns(ns), m_name(name) {}
+
+void single_long_attr_getter::operator() (const xml_token_attr_t& attr)
+{
+ if (attr.name != m_name)
+ return;
+
+ if (attr.ns && attr.ns != m_ns)
+ return;
+
+ m_value = to_long(attr.value);
+}
+
+long single_long_attr_getter::get_value() const
+{
+ return m_value;
+}
+
+long single_long_attr_getter::get(const std::vector<xml_token_attr_t>& attrs, xmlns_id_t ns, xml_token_t name)
+{
+ single_long_attr_getter func(ns, name);
+ return std::for_each(attrs.begin(), attrs.end(), func).get_value();
+}
+
+single_double_attr_getter::single_double_attr_getter(xmlns_id_t ns, xml_token_t name) :
+ m_value(-1.0), m_ns(ns), m_name(name) {}
+
+void single_double_attr_getter::operator() (const xml_token_attr_t& attr)
+{
+ if (attr.name != m_name)
+ return;
+
+ if (attr.ns && attr.ns != m_ns)
+ return;
+
+ m_value = to_double(attr.value);
+}
+
+double single_double_attr_getter::get_value() const
+{
+ return m_value;
+}
+
+double single_double_attr_getter::get(const std::vector<xml_token_attr_t>& attrs, xmlns_id_t ns, xml_token_t name)
+{
+ single_double_attr_getter func(ns, name);
+ return std::for_each(attrs.begin(), attrs.end(), func).get_value();
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xml_context_global.hpp b/src/liborcus/xml_context_global.hpp
new file mode 100644
index 0000000..b05dd28
--- /dev/null
+++ b/src/liborcus/xml_context_global.hpp
@@ -0,0 +1,71 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef ORCUS_XML_CONTEXT_GLOBAL_HPP
+#define ORCUS_XML_CONTEXT_GLOBAL_HPP
+
+#include <orcus/types.hpp>
+
+#include <functional>
+
+namespace orcus {
+
+class string_pool;
+
+/**
+ * Use this just to get the value of a single attribute for a given element.
+ */
+class single_attr_getter
+{
+ string_pool* m_pool;
+ std::string_view m_value;
+ xmlns_id_t m_ns;
+ xml_token_t m_name;
+
+public:
+ single_attr_getter(xmlns_id_t ns, xml_token_t name);
+ single_attr_getter(string_pool& pool, xmlns_id_t ns, xml_token_t name);
+
+ void operator() (const xml_token_attr_t& attr);
+ std::string_view get_value() const;
+
+ static std::string_view get(const std::vector<xml_token_attr_t>& attrs, xmlns_id_t ns, xml_token_t name);
+ static std::string_view get(const std::vector<xml_token_attr_t>& attrs, string_pool& pool, xmlns_id_t ns, xml_token_t name);
+};
+
+class single_long_attr_getter
+{
+ long m_value;
+ xmlns_id_t m_ns;
+ xml_token_t m_name;
+
+public:
+ single_long_attr_getter(xmlns_id_t ns, xml_token_t name);
+ void operator() (const xml_token_attr_t& attr);
+ long get_value() const;
+
+ static long get(const std::vector<xml_token_attr_t>& attrs, xmlns_id_t ns, xml_token_t name);
+};
+
+class single_double_attr_getter
+{
+ double m_value;
+ xmlns_id_t m_ns;
+ xml_token_t m_name;
+
+public:
+ single_double_attr_getter(xmlns_id_t ns, xml_token_t name);
+ void operator() (const xml_token_attr_t& attr);
+ double get_value() const;
+
+ static double get(const std::vector<xml_token_attr_t>& attrs, xmlns_id_t ns, xml_token_t name);
+};
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xml_element_types.cpp b/src/liborcus/xml_element_types.cpp
new file mode 100644
index 0000000..967b4d4
--- /dev/null
+++ b/src/liborcus/xml_element_types.cpp
@@ -0,0 +1,19 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xml_element_types.hpp"
+
+namespace orcus {
+
+size_t xml_token_pair_hash::operator()(const xml_token_pair_t& v) const
+{
+ return std::hash<const char*>()(v.first) ^ std::hash<size_t>()(v.second);
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xml_element_types.hpp b/src/liborcus/xml_element_types.hpp
new file mode 100644
index 0000000..2e7bc15
--- /dev/null
+++ b/src/liborcus/xml_element_types.hpp
@@ -0,0 +1,30 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#pragma once
+
+#include <orcus/types.hpp>
+
+namespace orcus {
+
+/**
+ * Holds a pair of XML namespace identifier and an element token. Typically
+ * used when managing the element stack inside element context classes.
+ */
+using xml_token_pair_t = std::pair<xmlns_id_t, xml_token_t>;
+
+struct xml_token_pair_hash
+{
+ size_t operator()(const xml_token_pair_t& v) const;
+};
+
+using xml_elem_stack_t = std::vector<xml_token_pair_t>;
+using xml_elem_set_t = std::unordered_set<xml_token_pair_t, xml_token_pair_hash>;
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xml_element_validator.cpp b/src/liborcus/xml_element_validator.cpp
new file mode 100644
index 0000000..ceb632c
--- /dev/null
+++ b/src/liborcus/xml_element_validator.cpp
@@ -0,0 +1,60 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xml_element_validator.hpp"
+
+namespace orcus {
+
+xml_element_validator::xml_element_validator()
+{
+}
+
+xml_element_validator::xml_element_validator(const rule* rules, std::size_t n_rules)
+{
+ init(rules, n_rules);
+}
+
+void xml_element_validator::init(const rule* rules, std::size_t n_rules)
+{
+ const rule* end_rules = rules + n_rules;
+
+ for (; rules != end_rules; ++rules)
+ {
+ const xml_token_pair_t parent(rules->ns_parent, rules->name_parent);
+ const xml_token_pair_t child(rules->ns_child, rules->name_child);
+
+ auto it = m_rules.find(parent);
+ if (it == m_rules.end())
+ {
+ auto res = m_rules.emplace(parent, xml_elem_set_t{});
+ it = res.first;
+ }
+
+ xml_elem_set_t& children = it->second;
+ children.insert(child);
+ }
+}
+
+xml_element_validator::result xml_element_validator::validate(
+ const xml_token_pair_t& parent, const xml_token_pair_t& child) const
+{
+ if (m_rules.empty())
+ // No rules are defined. Allow everything.
+ return result::child_valid;
+
+ auto it = m_rules.find(parent);
+ if (it == m_rules.end())
+ // No rules for this parent.
+ return result::parent_unknown;
+
+ const xml_elem_set_t& rules = it->second;
+ return rules.count(child) > 0 ? result::child_valid : result::child_invalid;
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xml_element_validator.hpp b/src/liborcus/xml_element_validator.hpp
new file mode 100644
index 0000000..43a44e0
--- /dev/null
+++ b/src/liborcus/xml_element_validator.hpp
@@ -0,0 +1,50 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#pragma once
+
+#include "xml_element_types.hpp"
+
+#include <unordered_map>
+
+namespace orcus {
+
+class xml_element_validator
+{
+ using rule_map_type = std::unordered_map<xml_token_pair_t, xml_elem_set_t, xml_token_pair_hash>;
+ rule_map_type m_rules;
+
+public:
+
+ /** represents a single parent to child mapping rule. It must be a POD. */
+ struct rule
+ {
+ const xmlns_id_t ns_parent;
+ const xml_token_t name_parent;
+ const xmlns_id_t ns_child;
+ const xml_token_t name_child;
+ };
+
+ /** validation result */
+ enum class result
+ {
+ parent_unknown, //< no rules defined for this parent
+ child_valid, //< parent allows this child
+ child_invalid //< parent does not allow this child
+ };
+
+ xml_element_validator();
+ xml_element_validator(const rule* rules, std::size_t n_rules);
+
+ void init(const rule* rules, std::size_t n_rules);
+
+ result validate(const xml_token_pair_t& parent, const xml_token_pair_t& child) const;
+};
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xml_empty_context.cpp b/src/liborcus/xml_empty_context.cpp
new file mode 100644
index 0000000..f39636b
--- /dev/null
+++ b/src/liborcus/xml_empty_context.cpp
@@ -0,0 +1,44 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xml_empty_context.hpp"
+
+namespace orcus {
+
+xml_empty_context::xml_empty_context(session_context& session_cxt, const tokens& tokens) :
+ xml_context_base(session_cxt, tokens)
+{
+}
+
+xml_context_base* xml_empty_context::create_child_context(xmlns_id_t /*ns*/, xml_token_t /*name*/)
+{
+ return nullptr;
+}
+
+void xml_empty_context::end_child_context(
+ xmlns_id_t /*ns*/, xml_token_t /*name*/, xml_context_base* /*child*/)
+{
+}
+
+void xml_empty_context::start_element(
+ xmlns_id_t ns, xml_token_t name, const::std::vector<xml_token_attr_t>& /*attrs*/)
+{
+ push_stack(ns, name);
+}
+
+bool xml_empty_context::end_element(xmlns_id_t ns, xml_token_t name)
+{
+ return pop_stack(ns, name);
+}
+
+void xml_empty_context::characters(std::string_view /*str*/, bool /*transient*/)
+{
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xml_empty_context.hpp b/src/liborcus/xml_empty_context.hpp
new file mode 100644
index 0000000..502e199
--- /dev/null
+++ b/src/liborcus/xml_empty_context.hpp
@@ -0,0 +1,39 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#pragma once
+
+#include "xml_context_base.hpp"
+
+namespace orcus {
+
+/**
+ * This context only tracks the scopes of all encountered elements but does
+ * nothing else. It is to be used when you need to ignore a whole sub
+ * structure of an XML document.
+ */
+class xml_empty_context : public xml_context_base
+{
+public:
+ xml_empty_context(session_context& session_cxt, const tokens& tokens);
+
+ virtual xml_context_base* create_child_context(xmlns_id_t ns, xml_token_t name) override;
+
+ virtual void end_child_context(
+ xmlns_id_t ns, xml_token_t name, xml_context_base* child) override;
+
+ virtual void start_element(
+ xmlns_id_t ns, xml_token_t name, const std::vector<xml_token_attr_t>& attrs) override;
+
+ virtual bool end_element(xmlns_id_t ns, xml_token_t name) override;
+
+ virtual void characters(std::string_view str, bool transient) override;
+};
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xml_map_tree.cpp b/src/liborcus/xml_map_tree.cpp
new file mode 100644
index 0000000..5d2ea72
--- /dev/null
+++ b/src/liborcus/xml_map_tree.cpp
@@ -0,0 +1,772 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xml_map_tree.hpp"
+#include "xpath_parser.hpp"
+
+#define ORCUS_DEBUG_XML_MAP_TREE 0
+
+#if ORCUS_DEBUG_XML_MAP_TREE
+#include <iostream>
+#endif
+
+#include <cassert>
+#include <algorithm>
+#include <iostream>
+#include <sstream>
+
+namespace orcus {
+
+namespace {
+
+template<typename T>
+void print_element_stack(std::ostream& os, const T& elem_stack)
+{
+ for (const auto& elem : elem_stack)
+ os << '/' << elem->name.name;
+}
+
+} // anonymous namespace
+
+xml_map_tree::range_field_link::range_field_link(std::string_view _xpath, std::string_view _label) :
+ xpath(_xpath), label(_label) {}
+
+xml_map_tree::element_position::element_position() :
+ open_begin(0), open_end(0), close_begin(0), close_end(0) {}
+
+xml_map_tree::cell_reference::cell_reference() {}
+
+xml_map_tree::range_reference::range_reference(const cell_position& _pos) :
+ pos(_pos), row_position(0) {}
+
+xml_map_tree::linkable::linkable(
+ xml_map_tree& parent, const xml_name_t& _name, linkable_node_type _node_type, reference_type _ref_type) :
+ name(_name), node_type(_node_type), ref_type(_ref_type)
+{
+ parent.create_ref_store(*this);
+}
+
+xml_map_tree::attribute::attribute(args_type args) :
+ linkable(std::get<0>(args), xml_name_t(std::get<1>(args)), linkable_node_type::attribute, std::get<2>(args)) {}
+
+xml_map_tree::attribute::~attribute() {}
+
+xml_map_tree::element::element(args_type args) :
+ linkable(std::get<0>(args), std::get<1>(args), linkable_node_type::element, std::get<3>(args)),
+ elem_type(std::get<2>(args)),
+ child_elements(nullptr),
+ range_parent(nullptr),
+ row_group(nullptr),
+ row_group_position(0)
+{
+ xml_map_tree& parent = std::get<0>(args);
+
+ if (elem_type == element_type::unlinked)
+ {
+ child_elements = parent.m_element_store_pool.construct();
+ return;
+ }
+
+ assert(elem_type == element_type::linked);
+}
+
+xml_map_tree::element::~element() {}
+
+xml_map_tree::element* xml_map_tree::element::get_child(const xml_name_t& _name)
+{
+ if (elem_type != element_type::unlinked)
+ return nullptr;
+
+ assert(child_elements);
+
+ auto it = std::find_if(
+ child_elements->begin(), child_elements->end(),
+ [&_name](const element* p) -> bool
+ {
+ return p->name == _name;
+ }
+ );
+
+ return it == child_elements->end() ? nullptr : *it;
+}
+
+xml_map_tree::element* xml_map_tree::element::get_or_create_child(
+ xml_map_tree& parent, const xml_name_t& _name)
+{
+ auto it = std::find_if(
+ child_elements->begin(), child_elements->end(),
+ [&_name](const element* p) -> bool
+ {
+ return p->name == _name;
+ }
+ );
+
+ if (it != child_elements->end())
+ return *it;
+
+ string_pool& sp = parent.m_names;
+
+ // Insert a new element of this name.
+ auto const nm = sp.intern(_name.name).first; // work around LLVM < 7 libc++ bug
+ child_elements->push_back(
+ parent.m_element_pool.construct(
+ element::args_type(
+ parent,
+ xml_name_t(_name.ns, nm),
+ element_type::unlinked,
+ reference_type::unknown
+ )
+ )
+ );
+
+ return child_elements->back();
+}
+
+xml_map_tree::element* xml_map_tree::element::get_or_create_linked_child(
+ xml_map_tree& parent, const xml_name_t& _name, reference_type _ref_type)
+{
+ if (!child_elements)
+ {
+ assert(elem_type == element_type::linked);
+ std::ostringstream os;
+ constexpr xml_name_t::to_string_type type = xml_name_t::use_alias;
+
+ os << "You can't add a child element under an already linked element (this='"
+ << name.to_string(parent.m_xmlns_cxt, type) << "'; child='"
+ << _name.to_string(parent.m_xmlns_cxt, type) << "')";
+
+ throw invalid_map_error(os.str());
+ }
+
+ auto it = std::find_if(
+ child_elements->begin(), child_elements->end(),
+ [&_name](const element* p) -> bool
+ {
+ return p->name == _name;
+ }
+ );
+
+ if (it != child_elements->end())
+ {
+ // Specified child element already exists. Make sure it's unlinked.
+ element* elem = *it;
+ if (elem->ref_type != reference_type::unknown || elem->elem_type != element_type::unlinked)
+ throw xpath_error("This element is already linked. You can't link the same element twice.");
+
+ elem->link_reference(parent, _ref_type);
+ return elem;
+ }
+
+ string_pool& sp = parent.m_names;
+
+ // Insert a new linked element of this name.
+ auto const nm = sp.intern(_name.name).first; // work around LLVM < 7 libc++ bug
+ child_elements->push_back(
+ parent.m_element_pool.construct(
+ element::args_type(
+ parent,
+ xml_name_t(_name.ns, nm),
+ element_type::linked,
+ _ref_type
+ )
+ )
+ );
+
+ return child_elements->back();
+}
+
+void xml_map_tree::element::link_reference(xml_map_tree& parent, reference_type _ref_type)
+{
+ if (elem_type == element_type::unlinked)
+ parent.m_element_store_pool.destroy(child_elements);
+
+ elem_type = element_type::linked;
+ ref_type = _ref_type;
+ parent.create_ref_store(*this);
+}
+
+bool xml_map_tree::element::unlinked_attribute_anchor() const
+{
+ return elem_type == element_type::unlinked && ref_type == reference_type::unknown && !attributes.empty();
+}
+
+xml_map_tree::walker::walker(const xml_map_tree& parent) :
+ m_parent(parent) {}
+xml_map_tree::walker::walker(const xml_map_tree::walker& r) :
+ m_parent(r.m_parent), m_stack(r.m_stack), m_unlinked_stack(r.m_unlinked_stack) {}
+
+void xml_map_tree::walker::reset()
+{
+ m_stack.clear();
+ m_unlinked_stack.clear();
+}
+
+xml_map_tree::element* xml_map_tree::walker::push_element(const xml_name_t& name)
+{
+ if (!m_unlinked_stack.empty())
+ {
+ // We're still in the unlinked region.
+ m_unlinked_stack.push_back(name);
+ return nullptr;
+ }
+
+ if (m_stack.empty())
+ {
+ if (!m_parent.mp_root)
+ {
+ // Tree is empty.
+ m_unlinked_stack.push_back(name);
+ return nullptr;
+ }
+
+ element* p = m_parent.mp_root;
+ if (p->name != name)
+ {
+ // Names differ.
+ m_unlinked_stack.push_back(name);
+ return nullptr;
+ }
+
+ m_stack.push_back(p);
+ return p;
+ }
+
+ if (m_stack.back()->elem_type == element_type::unlinked)
+ {
+ // Check if the current element has a child of the same name.
+ element* p = m_stack.back()->get_child(name);
+ if (p)
+ {
+ m_stack.push_back(p);
+ return p;
+ }
+ }
+
+ m_unlinked_stack.push_back(name);
+ return nullptr;
+}
+
+xml_map_tree::element* xml_map_tree::walker::pop_element(const xml_name_t& name)
+{
+ if (!m_unlinked_stack.empty())
+ {
+ // We're in the unlinked region. Pop element from the unlinked stack.
+ if (m_unlinked_stack.back() != name)
+ throw general_error("Closing element has a different name than the opening element. (unlinked stack)");
+
+ m_unlinked_stack.pop_back();
+
+ if (!m_unlinked_stack.empty())
+ // We are still in the unlinked region.
+ return nullptr;
+
+ return m_stack.empty() ? nullptr : m_stack.back();
+ }
+
+ if (m_stack.empty())
+ throw general_error("Element was popped while the stack was empty.");
+
+ if (m_stack.back()->name != name)
+ throw general_error("Closing element has a different name than the opening element. (linked stack)");
+
+ m_stack.pop_back();
+ return m_stack.empty() ? nullptr : m_stack.back();
+}
+
+xml_map_tree::xml_map_tree(xmlns_repository& xmlns_repo) :
+ m_xmlns_cxt(xmlns_repo.create_context()),
+ mp_root(nullptr),
+ m_default_ns(XMLNS_UNKNOWN_ID) {}
+
+xml_map_tree::~xml_map_tree() {}
+
+void xml_map_tree::set_namespace_alias(std::string_view alias, std::string_view uri, bool default_ns)
+{
+#if ORCUS_DEBUG_XML_MAP_TREE
+ cout << "xml_map_tree::set_namespace_alias: alias='" << alias << "', uri='" << uri << "', default=" << default_ns << endl;
+#endif
+ // We need to turn the alias string persistent because the xmlns context
+ // doesn't intern the alias strings.
+ std::string_view alias_safe = m_names.intern(alias).first;
+ xmlns_id_t ns = m_xmlns_cxt.push(alias_safe, uri);
+
+ if (default_ns)
+ m_default_ns = ns;
+}
+
+xmlns_id_t xml_map_tree::get_namespace(std::string_view alias) const
+{
+ return m_xmlns_cxt.get(alias);
+}
+
+void xml_map_tree::set_cell_link(std::string_view xpath, const cell_position& ref)
+{
+ if (xpath.empty())
+ return;
+
+#if ORCUS_DEBUG_XML_MAP_TREE
+ cout << "xml_map_tree::set_cell_link: xpath='" << xpath << "' (ref=" << ref << ")" << endl;
+#endif
+
+ linked_node_type linked_node = get_linked_node(xpath, reference_type::cell);
+ assert(linked_node.node);
+ assert(!linked_node.elem_stack.empty());
+ cell_reference* cell_ref = nullptr;
+ switch (linked_node.node->node_type)
+ {
+ case linkable_node_type::element:
+ assert(static_cast<element*>(linked_node.node)->cell_ref);
+ cell_ref = static_cast<element*>(linked_node.node)->cell_ref;
+ break;
+ case linkable_node_type::attribute:
+ assert(static_cast<attribute*>(linked_node.node)->cell_ref);
+ cell_ref = static_cast<attribute*>(linked_node.node)->cell_ref;
+ break;
+ default:
+ throw general_error("unknown node type returned from get_element_stack call in xml_map_tree::set_cell_link().");
+ }
+
+ cell_ref->pos = ref;
+}
+
+void xml_map_tree::start_range(const cell_position& pos)
+{
+ m_cur_range_field_links.clear();
+ m_cur_range_pos = pos;
+}
+
+void xml_map_tree::append_range_field_link(std::string_view xpath, std::string_view label)
+{
+ if (xpath.empty())
+ return;
+
+ m_cur_range_field_links.emplace_back(xpath, label);
+}
+
+void xml_map_tree::insert_range_field_link(
+ range_reference& range_ref, element_list_type& range_parent, const range_field_link& field)
+{
+ linked_node_type linked_node = get_linked_node(field.xpath, reference_type::range_field);
+ if (linked_node.elem_stack.size() < 2)
+ throw xpath_error("Path of a range field link must be at least 2 levels.");
+
+ if (linked_node.node->node_type == linkable_node_type::unknown)
+ throw xpath_error("Unrecognized node type");
+
+ if (linked_node.anchor_elem)
+ linked_node.anchor_elem->linked_range_fields.push_back(range_ref.field_nodes.size());
+
+ if (!field.label.empty())
+ linked_node.node->label = intern_string(field.label);
+
+ switch (linked_node.node->node_type)
+ {
+ case linkable_node_type::element:
+ {
+ element* p = static_cast<element*>(linked_node.node);
+ assert(p && p->ref_type == reference_type::range_field && p->field_ref);
+ p->field_ref->ref = &range_ref;
+ p->field_ref->column_pos = range_ref.field_nodes.size();
+
+ range_ref.field_nodes.push_back(p);
+ break;
+ }
+ case linkable_node_type::attribute:
+ {
+ attribute* p = static_cast<attribute*>(linked_node.node);
+ assert(p && p->ref_type == reference_type::range_field && p->field_ref);
+ p->field_ref->ref = &range_ref;
+ p->field_ref->column_pos = range_ref.field_nodes.size();
+
+ range_ref.field_nodes.push_back(p);
+ break;
+ }
+ default:
+ ;
+ }
+
+ // Determine the deepest common element for all field link elements in the
+ // current range reference.
+ if (range_parent.empty())
+ {
+ // First field link in this range. Find the first row-group element
+ // going up from the linked node.
+ auto rit = linked_node.elem_stack.rbegin();
+ while (rit != linked_node.elem_stack.rend() && !(*rit)->row_group)
+ ++rit;
+
+ ++rit; // parent of the raw group
+ auto it_end = rit.base();
+
+ range_parent.assign(linked_node.elem_stack.begin(), it_end);
+ }
+ else
+ {
+ // Determine the deepest common element between the two.
+ element_list_type::iterator it_elem = linked_node.elem_stack.begin(), it_elem_end = linked_node.elem_stack.end();
+ element_list_type::iterator it_cur = range_parent.begin(), it_cur_end = range_parent.end();
+ if (*it_elem != *it_cur)
+ throw xpath_error("Two field links in the same range reference start with different root elements.");
+
+ ++it_elem;
+ ++it_cur;
+
+ for (; it_elem != it_elem_end && it_cur != it_cur_end; ++it_elem, ++it_cur)
+ {
+ if (*it_elem == *it_cur)
+ continue;
+
+ // The two elements differ. Take their parent element as the new common element.
+ range_parent.assign(linked_node.elem_stack.begin(), it_elem); // current elemnt excluded.
+ break;
+ }
+
+ if (range_parent.empty())
+ throw xpath_error("Two field links in the same range reference must at least share the first level of their paths.");
+ }
+
+#if ORCUS_DEBUG_XML_MAP_TREE
+ print_element_stack(std::cout, range_parent);
+ std::cout << std::endl;
+#endif
+}
+
+void xml_map_tree::set_range_row_group(std::string_view xpath)
+{
+ if (xpath.empty())
+ return;
+
+ range_reference* range_ref = get_range_reference(m_cur_range_pos);
+ assert(range_ref);
+
+ element* elem = get_element(xpath);
+ assert(elem);
+ elem->row_group = range_ref;
+}
+
+void xml_map_tree::commit_range()
+{
+ if (m_cur_range_field_links.empty())
+ // Nothing to commit.
+ return;
+
+ range_reference* range_ref = get_range_reference(m_cur_range_pos);
+ assert(range_ref);
+
+ // commont parent element for this range.
+ element_list_type range_parent;
+
+ for (const range_field_link& field : m_cur_range_field_links)
+ insert_range_field_link(*range_ref, range_parent, field);
+
+#if ORCUS_DEBUG_XML_MAP_TREE
+ cout << "parent element path for this range: ";
+ for (const element* elem : range_parent)
+ cout << "/" << elem->name.to_string(m_xmlns_cxt, xml_name_t::use_alias);
+ cout << endl;
+#endif
+
+ assert(!range_parent.empty());
+ // Mark the range parent element.
+ range_parent.back()->range_parent = range_ref;
+
+ // Set the current position invalid.
+ m_cur_range_pos.row = -1;
+ m_cur_range_pos.col = -1;
+}
+
+const xml_map_tree::linkable* xml_map_tree::get_link(std::string_view xpath) const
+{
+ if (!mp_root)
+ return nullptr;
+
+ if (xpath.empty())
+ return nullptr;
+
+#if ORCUS_DEBUG_XML_MAP_TREE
+ cout << "xml_map_tree::get_link: xpath = '" << xpath << "'" << endl;
+#endif
+ const linkable* cur_node = mp_root;
+
+ xpath_parser parser(m_xmlns_cxt, xpath.data(), xpath.size(), m_default_ns);
+
+ // Check the root element first.
+ xpath_parser::token token = parser.next();
+ if (cur_node->name.ns != token.ns || cur_node->name.name != token.name)
+ // Root element name doesn't match.
+ return nullptr;
+
+#if ORCUS_DEBUG_XML_MAP_TREE
+ cout << "xml_map_tree::get_link: root = (ns=" << token.ns << ", name=" << token.name << ")" << endl;
+#endif
+ for (token = parser.next(); !token.name.empty(); token = parser.next())
+ {
+ if (token.attribute)
+ {
+ // The current node should be an element and should have an attribute of the same name.
+ if (cur_node->node_type != linkable_node_type::element)
+ return nullptr;
+
+ const element* elem = static_cast<const element*>(cur_node);
+ const attribute_store_type& attrs = elem->attributes;
+ auto it = std::find_if(
+ attrs.begin(), attrs.end(),
+ [&token](const attribute* p) -> bool
+ {
+ return p->name.ns == token.ns && p->name.name == token.name;
+ }
+ );
+
+ if (it == attrs.end())
+ // No such attribute exists.
+ return nullptr;
+
+ return *it;
+ }
+
+ // See if an element of this name exists below the current element.
+
+ if (cur_node->node_type != linkable_node_type::element)
+ return nullptr;
+
+ const element* elem = static_cast<const element*>(cur_node);
+ if (elem->elem_type != element_type::unlinked)
+ return nullptr;
+
+ if (!elem->child_elements)
+ return nullptr;
+
+ auto it = std::find_if(
+ elem->child_elements->begin(), elem->child_elements->end(),
+ [&token](const element* p) -> bool
+ {
+ return p->name.ns == token.ns && p->name.name == token.name;
+ }
+ );
+
+ if (it == elem->child_elements->end())
+ // No such child element exists.
+ return nullptr;
+
+ cur_node = *it;
+ }
+
+ if (cur_node->node_type != linkable_node_type::element || static_cast<const element*>(cur_node)->elem_type == element_type::unlinked)
+ // Non-leaf elements are not links.
+ return nullptr;
+
+ return cur_node;
+}
+
+xml_map_tree::walker xml_map_tree::get_tree_walker() const
+{
+ return walker(*this);
+}
+
+xml_map_tree::range_ref_map_type& xml_map_tree::get_range_references()
+{
+ return m_field_refs;
+}
+
+std::string_view xml_map_tree::intern_string(std::string_view str) const
+{
+ return m_names.intern(str).first;
+}
+
+xml_map_tree::range_reference* xml_map_tree::get_range_reference(const cell_position& pos)
+{
+ range_ref_map_type::iterator it = m_field_refs.lower_bound(pos);
+ if (it == m_field_refs.end() || m_field_refs.key_comp()(pos, it->first))
+ {
+ // This reference does not exist yet. Insert a new one.
+
+ // Make sure the sheet name string is persistent.
+ cell_position pos_safe = pos;
+ pos_safe.sheet = m_names.intern(pos.sheet).first;
+
+ it = m_field_refs.insert(
+ it, range_ref_map_type::value_type(
+ pos_safe,
+ m_range_reference_pool.construct(pos_safe)));
+ }
+
+ return it->second;
+}
+
+void xml_map_tree::create_ref_store(linkable& node)
+{
+ switch (node.ref_type)
+ {
+ case xml_map_tree::reference_type::cell:
+ node.cell_ref = m_cell_reference_pool.construct();
+ break;
+ case xml_map_tree::reference_type::range_field:
+ node.field_ref = m_field_in_range_pool.construct();
+ break;
+ case xml_map_tree::reference_type::unknown:
+ break;
+ }
+}
+
+xml_map_tree::linked_node_type xml_map_tree::get_linked_node(std::string_view xpath, reference_type ref_type)
+{
+ linked_node_type ret;
+
+ assert(!xpath.empty());
+ xpath_parser parser(m_xmlns_cxt, xpath.data(), xpath.size(), m_default_ns);
+
+ // Get the root element first.
+ xpath_parser::token token = parser.next();
+ if (mp_root)
+ {
+ // Make sure the root element's names are the same.
+ if (mp_root->name.ns != token.ns || mp_root->name.name != token.name)
+ throw xpath_error("path begins with inconsistent root level name.");
+ }
+ else
+ {
+ // First time the root element is encountered.
+ if (token.attribute)
+ throw xpath_error("root element cannot be an attribute.");
+
+ auto const nm = m_names.intern(token.name).first; // work around LLVM < 7 libc++ bug
+ mp_root = m_element_pool.construct(
+ element::args_type(
+ *this,
+ xml_name_t(token.ns, nm),
+ element_type::unlinked,
+ reference_type::unknown
+ )
+ );
+ }
+
+ ret.elem_stack.push_back(mp_root);
+ element* cur_element = ret.elem_stack.back();
+ assert(cur_element);
+ assert(cur_element->child_elements);
+
+ element* row_group_elem = nullptr;
+
+ token = parser.next();
+ for (xpath_parser::token token_next = parser.next(); !token_next.name.empty(); token_next = parser.next())
+ {
+ // Check if the current element contains a child element of the same name.
+ if (token.attribute)
+ throw xpath_error("attribute must always be at the end of the path.");
+
+ cur_element = cur_element->get_or_create_child(*this, {token.ns, token.name});
+ ret.elem_stack.push_back(cur_element);
+ token = token_next;
+
+ if (cur_element->row_group)
+ row_group_elem = cur_element;
+ }
+
+ assert(cur_element);
+
+ // Insert a leaf node.
+
+ if (token.attribute)
+ {
+ // This is an attribute. Insert it into the current element.
+ attribute_store_type& attrs = cur_element->attributes;
+
+ // Check if an attribute of the same name already exists.
+ auto it = std::find_if(
+ attrs.begin(), attrs.end(),
+ [&token](const attribute* p) -> bool
+ {
+ return p->name.ns == token.ns && p->name.name == token.name;
+ }
+ );
+
+ if (it != attrs.end())
+ throw xpath_error("This attribute is already linked. You can't link the same attribute twice.");
+
+ auto const nm = m_names.intern(token.name).first; // work around LLVM < 7 libc++ bug
+ attribute* p = m_attribute_pool.construct(
+ attribute::args_type(
+ *this,
+ xml_name_t(token.ns, nm),
+ ref_type
+ )
+ );
+
+ attrs.push_back(p);
+ ret.node = attrs.back();
+ }
+ else
+ {
+ element* elem = cur_element->get_or_create_linked_child(*this, {token.ns, token.name}, ref_type);
+ ret.elem_stack.push_back(elem);
+ ret.node = elem;
+
+ if (elem->row_group)
+ row_group_elem = elem;
+ }
+
+ ret.anchor_elem = row_group_elem;
+ return ret;
+}
+
+xml_map_tree::element* xml_map_tree::get_element(std::string_view xpath)
+{
+ assert(!xpath.empty());
+ xpath_parser parser(m_xmlns_cxt, xpath.data(), xpath.size(), m_default_ns);
+
+ // Get the root element first.
+ xpath_parser::token token = parser.next();
+ if (mp_root)
+ {
+ // Make sure the root element's names are the same.
+ if (mp_root->name.ns != token.ns || mp_root->name.name != token.name)
+ throw xpath_error("path begins with inconsistent root level name.");
+ }
+ else
+ {
+ // First time the root element is encountered.
+ if (token.attribute)
+ throw xpath_error("root element cannot be an attribute.");
+
+ auto const nm = m_names.intern(token.name).first; // work around LLVM < 7 libc++ bug
+ mp_root = m_element_pool.construct(
+ element::args_type(
+ *this,
+ xml_name_t(token.ns, nm),
+ element_type::unlinked,
+ reference_type::unknown
+ )
+ );
+ }
+
+ element* cur_element = mp_root;
+ assert(cur_element->child_elements);
+
+ for (token = parser.next(); !token.name.empty(); token = parser.next())
+ {
+ // Check if the current element contains a child element of the same name.
+ if (token.attribute)
+ throw xpath_error("attribute was not expected.");
+
+ cur_element = cur_element->get_or_create_child(*this, {token.ns, token.name});
+ }
+
+ assert(cur_element);
+ return cur_element;
+}
+
+std::ostream& operator<< (std::ostream& os, const xml_map_tree::linkable& link)
+{
+ if (!link.ns_alias.empty())
+ os << link.ns_alias << ':';
+ os << link.name.name;
+ return os;
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xml_map_tree.hpp b/src/liborcus/xml_map_tree.hpp
new file mode 100644
index 0000000..841df0d
--- /dev/null
+++ b/src/liborcus/xml_map_tree.hpp
@@ -0,0 +1,316 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_XML_MAP_TREE_HPP
+#define INCLUDED_ORCUS_XML_MAP_TREE_HPP
+
+#include "orcus/spreadsheet/types.hpp"
+#include "orcus/exception.hpp"
+#include "orcus/types.hpp"
+#include "orcus/xml_namespace.hpp"
+#include "orcus/string_pool.hpp"
+
+#include "spreadsheet_impl_types.hpp"
+
+#include <ostream>
+#include <map>
+#include <vector>
+#include <deque>
+#include <memory>
+
+#include <boost/pool/object_pool.hpp>
+
+namespace orcus {
+
+class xmlns_repository;
+
+/**
+ * Tree structure representing XML-to-sheet mapping rules for mapped XML
+ * import. This structure only contains linked elements and attributes and
+ * their parent elements; it does not contain the entire structure of the
+ * imported XML.
+ */
+class xml_map_tree
+{
+ struct range_field_link
+ {
+ std::string_view xpath;
+ std::string_view label;
+
+ range_field_link(std::string_view _xpath, std::string_view _label);
+ };
+
+public:
+ /**
+ * A single cell position. Used both for single cell as well as range
+ * links. For a range link, this represents the upper-left cell of a
+ * range.
+ */
+ using cell_position = spreadsheet::detail::cell_position_t;
+
+ /**
+ * Positions of opening and closing elements in xml stream.
+ */
+ struct element_position
+ {
+ std::ptrdiff_t open_begin;
+ std::ptrdiff_t open_end;
+ std::ptrdiff_t close_begin;
+ std::ptrdiff_t close_end;
+
+ element_position();
+ };
+
+ struct cell_reference
+ {
+ cell_position pos;
+
+ cell_reference(const cell_reference&) = delete;
+ cell_reference& operator=(const cell_reference&) = delete;
+
+ cell_reference();
+ };
+
+ struct element;
+ struct linkable;
+ using element_store_type = std::deque<element*>;
+ using element_list_type = std::vector<element*>;
+ using const_element_list_type = std::vector<const element*>;
+
+ struct range_reference
+ {
+ cell_position pos;
+
+ /**
+ * List of elements comprising the fields, in order of appearance from
+ * left to right.
+ */
+ std::vector<const linkable*> field_nodes;
+
+ /**
+ * Total number of rows comprising data. This does not include the
+ * label row at the top.
+ */
+ spreadsheet::row_t row_position;
+
+ range_reference(const range_reference&) = delete;
+ range_reference& operator=(const range_reference&) = delete;
+
+ range_reference(const cell_position& _pos);
+
+ void reset();
+ };
+
+ struct field_in_range
+ {
+ range_reference* ref = nullptr;
+ spreadsheet::col_t column_pos = -1;
+ };
+
+ typedef std::map<cell_position, range_reference*> range_ref_map_type;
+
+ enum class linkable_node_type { unknown, element, attribute };
+ enum class reference_type { unknown, cell, range_field };
+ enum class element_type { unknown, linked, unlinked };
+
+ struct linkable
+ {
+ xml_name_t name;
+ linkable_node_type node_type;
+ reference_type ref_type;
+
+ union
+ {
+ cell_reference* cell_ref = nullptr;
+ field_in_range* field_ref;
+ };
+
+ std::string_view label; // custom header label
+ mutable std::string_view ns_alias; // namespace alias used in the content stream.
+
+ linkable(const linkable&) = delete;
+ linkable& operator=(const linkable&) = delete;
+
+ linkable(xml_map_tree& parent, const xml_name_t& _name, linkable_node_type _node_type, reference_type _ref_type);
+ };
+
+ struct attribute : public linkable
+ {
+ using args_type = std::tuple<xml_map_tree&, const xml_name_t&, reference_type>;
+
+ attribute(args_type args);
+ ~attribute();
+ };
+
+ using attribute_store_type = std::deque<attribute*>;
+
+ struct element : public linkable
+ {
+ element_type elem_type;
+ element_store_type* child_elements;
+
+ mutable element_position stream_pos; // position of this element in the content stream
+
+ attribute_store_type attributes;
+
+ /**
+ * Points to a range reference instance of which this element is a
+ * parent. nullptr if this element is not a parent element of any range
+ * reference.
+ */
+ range_reference* range_parent;
+
+ /**
+ * The element is a row-group element (element that defines a row
+ * boundary) if this value is not null. If this is not null, it
+ * points to the range_reference instance it belongs to.
+ */
+ range_reference* row_group;
+
+ spreadsheet::row_t row_group_position;
+
+ std::vector<spreadsheet::col_t> linked_range_fields;
+
+ using args_type = std::tuple<xml_map_tree&, const xml_name_t&, element_type, reference_type>;
+
+ element(args_type args);
+ ~element();
+
+ element* get_child(const xml_name_t& _name);
+
+ element* get_or_create_child(
+ xml_map_tree& parent, const xml_name_t& _name);
+
+ element* get_or_create_linked_child(
+ xml_map_tree& parent, const xml_name_t& _name, reference_type _ref_type);
+
+ void link_reference(xml_map_tree& parent, reference_type _ref_type);
+
+ /**
+ * Unlinked attribute anchor is an element that's not linked but has
+ * one or more attributes that are linked.
+ *
+ * @return true if the element is an unlinked attribute anchor, false
+ * otherwise.
+ */
+ bool unlinked_attribute_anchor() const;
+ };
+
+ friend struct linkable;
+
+public:
+
+ /**
+ * Wrapper class to allow walking through the element tree.
+ */
+ class walker
+ {
+ typedef std::vector<element*> ref_element_stack_type;
+ typedef std::vector<xml_name_t> name_stack_type;
+ const xml_map_tree& m_parent;
+ ref_element_stack_type m_stack;
+ name_stack_type m_unlinked_stack;
+ public:
+ walker(const xml_map_tree& parent);
+ walker(const walker& r);
+
+ void reset();
+ element* push_element(const xml_name_t& name);
+ element* pop_element(const xml_name_t& name);
+ };
+
+ xml_map_tree() = delete;
+ xml_map_tree(const xml_map_tree&) = delete;
+ xml_map_tree& operator=(const xml_map_tree&) = delete;
+
+ xml_map_tree(xmlns_repository& xmlns_repo);
+ ~xml_map_tree();
+
+ void set_namespace_alias(std::string_view alias, std::string_view uri, bool default_ns);
+ xmlns_id_t get_namespace(std::string_view alias) const;
+
+ void set_cell_link(std::string_view xpath, const cell_position& ref);
+
+ void start_range(const cell_position& pos);
+ void append_range_field_link(std::string_view xpath, std::string_view label);
+ void set_range_row_group(std::string_view xpath);
+ void commit_range();
+
+ const linkable* get_link(std::string_view xpath) const;
+
+ walker get_tree_walker() const;
+
+ range_ref_map_type& get_range_references();
+
+ std::string_view intern_string(std::string_view str) const;
+
+private:
+ void insert_range_field_link(
+ range_reference& range_ref, element_list_type& range_parent, const range_field_link& field);
+
+ range_reference* get_range_reference(const cell_position& pos);
+
+ void create_ref_store(linkable& node);
+
+ struct linked_node_type
+ {
+ element_list_type elem_stack;
+ linkable* node = nullptr;
+ element* anchor_elem = nullptr;
+ };
+
+ /**
+ * Get a linked node (element or attribute) referenced by the specified
+ * xpath.
+ *
+ * @param xpath path to the linked node.
+ * @param type type of reference, either a cell or a range field.
+ */
+ linked_node_type get_linked_node(std::string_view xpath, reference_type type);
+
+ element* get_element(std::string_view xpath);
+
+private:
+
+ using range_field_links = std::vector<range_field_link>;
+
+ xmlns_context m_xmlns_cxt;
+
+ /**
+ * Stores field links to insert into the current range reference.
+ */
+ range_field_links m_cur_range_field_links;
+
+ cell_position m_cur_range_pos;
+
+ /**
+ * All range references present in the tree. This container manages the
+ * life cycles of stored range references.
+ */
+ range_ref_map_type m_field_refs;
+
+ /** pool of element names. */
+ mutable string_pool m_names;
+
+ boost::object_pool<element_store_type> m_element_store_pool;
+ boost::object_pool<cell_reference> m_cell_reference_pool;
+ boost::object_pool<range_reference> m_range_reference_pool;
+ boost::object_pool<field_in_range> m_field_in_range_pool;
+ boost::object_pool<attribute> m_attribute_pool;
+ boost::object_pool<element> m_element_pool;
+
+ element* mp_root;
+
+ xmlns_id_t m_default_ns;
+};
+
+std::ostream& operator<< (std::ostream& os, const xml_map_tree::linkable& link);
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xml_map_tree_test.cpp b/src/liborcus/xml_map_tree_test.cpp
new file mode 100644
index 0000000..f3523f1
--- /dev/null
+++ b/src/liborcus/xml_map_tree_test.cpp
@@ -0,0 +1,274 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "test_global.hpp"
+#include "xml_map_tree.hpp"
+#include "orcus/xml_namespace.hpp"
+
+#include <cstdlib>
+#include <cassert>
+#include <iostream>
+
+using namespace orcus;
+
+void test_path_insertion()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ xmlns_repository repo;
+ xml_map_tree tree(repo);
+ xml_map_tree::cell_position ref;
+ ref.sheet = std::string_view{"test"};
+ ref.row = 2;
+ ref.col = 1;
+
+ // Single cell links
+ tree.set_cell_link("/data/elem1", ref);
+ const xml_map_tree::linkable* p0 = tree.get_link("/data/elem1");
+ assert(p0 && p0->node_type == xml_map_tree::linkable_node_type::element);
+ const xml_map_tree::element* p = static_cast<const xml_map_tree::element*>(p0);
+ assert(p->ref_type == xml_map_tree::reference_type::cell);
+ assert(p->cell_ref->pos.sheet == "test");
+ assert(p->cell_ref->pos.row == 2);
+ assert(p->cell_ref->pos.col == 1);
+
+ const xml_map_tree::element* elem1 = p;
+
+ ref.row = 3;
+ ref.col = 2;
+ tree.set_cell_link("/data/elem2", ref);
+ p0 = tree.get_link("/data/elem2");
+ assert(p0 && p0->node_type == xml_map_tree::linkable_node_type::element);
+ p = static_cast<const xml_map_tree::element*>(p0);
+ assert(p && p->ref_type == xml_map_tree::reference_type::cell);
+ assert(p->cell_ref->pos.sheet == "test");
+ assert(p->cell_ref->pos.row == 3);
+ assert(p->cell_ref->pos.col == 2);
+
+ // The link in elem1 should be unchanged.
+ p0 = tree.get_link("/data/elem1");
+ assert(p0 == elem1);
+
+ ref.sheet = std::string_view{"test2"};
+ ref.row = 10;
+ ref.col = 5;
+ tree.set_cell_link("/data/meta/title", ref);
+ p0 = tree.get_link("/data/meta/title");
+ assert(p0 && p0->node_type == xml_map_tree::linkable_node_type::element);
+ p = static_cast<const xml_map_tree::element*>(p0);
+ assert(p && p->ref_type == xml_map_tree::reference_type::cell);
+ assert(p->cell_ref->pos.sheet == "test2");
+ assert(p->cell_ref->pos.row == 10);
+ assert(p->cell_ref->pos.col == 5);
+
+ // Range field links
+ ref.row = 5;
+ ref.col = 0;
+ ref.sheet = std::string_view{"test3"};
+ tree.start_range(ref);
+ tree.append_range_field_link("/data/entries/entry/id", std::string_view{});
+ tree.append_range_field_link("/data/entries/entry/name", std::string_view{});
+ tree.append_range_field_link("/data/entries/entry/score", std::string_view{});
+ tree.set_range_row_group("/data/entries/entry");
+ tree.commit_range();
+ p0 = tree.get_link("/data/entries/entry/id");
+ assert(p0 && p0->node_type == xml_map_tree::linkable_node_type::element);
+ p = static_cast<const xml_map_tree::element*>(p0);
+ assert(p && p->ref_type == xml_map_tree::reference_type::range_field);
+ assert(p->field_ref->ref->pos.sheet == "test3");
+ assert(p->field_ref->ref->pos.row == 5);
+ assert(p->field_ref->ref->pos.col == 0);
+ assert(p->field_ref->column_pos == 0);
+
+ p0 = tree.get_link("/data/entries/entry/name");
+ assert(p0 && p0->node_type == xml_map_tree::linkable_node_type::element);
+ p = static_cast<const xml_map_tree::element*>(p0);
+ assert(p && p->ref_type == xml_map_tree::reference_type::range_field);
+ assert(p->field_ref->ref->pos.sheet == "test3");
+ assert(p->field_ref->ref->pos.row == 5);
+ assert(p->field_ref->ref->pos.col == 0);
+ assert(p->field_ref->column_pos == 1);
+
+ p0 = tree.get_link("/data/entries/entry/score");
+ assert(p0 && p0->node_type == xml_map_tree::linkable_node_type::element);
+ p = static_cast<const xml_map_tree::element*>(p0);
+ assert(p && p->ref_type == xml_map_tree::reference_type::range_field);
+ assert(p->field_ref->ref->pos.sheet == "test3");
+ assert(p->field_ref->ref->pos.row == 5);
+ assert(p->field_ref->ref->pos.col == 0);
+ assert(p->field_ref->column_pos == 2);
+}
+
+void test_attr_path_insertion()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ xmlns_repository repo;
+ xml_map_tree tree(repo);
+ xml_map_tree::cell_position ref;
+ ref.sheet = std::string_view{"test"};
+ ref.row = 2;
+ ref.col = 3;
+
+ // 'attr1' is an attribute of 'elem'.
+ tree.set_cell_link("/root/elem/@attr1", ref);
+ const xml_map_tree::linkable* p = tree.get_link("/root/elem/@attr1");
+ assert(p && p->node_type == xml_map_tree::linkable_node_type::attribute);
+ const xml_map_tree::attribute* attr = static_cast<const xml_map_tree::attribute*>(p);
+ assert(attr->ref_type == xml_map_tree::reference_type::cell);
+ assert(attr->cell_ref->pos.sheet == "test");
+ assert(attr->cell_ref->pos.row == 2);
+ assert(attr->cell_ref->pos.col == 3);
+
+ // Insert another attribute in the same element.
+ ref.sheet = std::string_view{"test2"};
+ ref.row = 11;
+ ref.col = 4;
+ tree.set_cell_link("/root/elem/@attr2", ref);
+ p = tree.get_link("/root/elem/@attr2");
+ assert(p && p->node_type == xml_map_tree::linkable_node_type::attribute);
+ attr = static_cast<const xml_map_tree::attribute*>(p);
+ assert(attr->ref_type == xml_map_tree::reference_type::cell);
+ assert(attr->cell_ref->pos.sheet == "test2");
+ assert(attr->cell_ref->pos.row == 11);
+ assert(attr->cell_ref->pos.col == 4);
+
+ // At this point, /root/elem is not linked.
+ p = tree.get_link("/root/elem");
+ assert(!p);
+
+ // Now, link /root/elem.
+ ref.sheet = std::string_view{"test3"};
+ ref.row = 4;
+ ref.col = 6;
+ tree.set_cell_link("/root/elem", ref);
+ p = tree.get_link("/root/elem");
+ assert(p && p->node_type == xml_map_tree::linkable_node_type::element);
+ const xml_map_tree::element* elem = static_cast<const xml_map_tree::element*>(p);
+ assert(elem->elem_type == xml_map_tree::element_type::linked);
+ assert(elem->ref_type == xml_map_tree::reference_type::cell);
+ assert(elem->cell_ref->pos.sheet == "test3");
+ assert(elem->cell_ref->pos.row == 4);
+ assert(elem->cell_ref->pos.col == 6);
+}
+
+void test_tree_walk()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ xmlns_repository repo;
+ xml_map_tree tree(repo);
+ xml_map_tree::cell_position ref;
+ ref.sheet = std::string_view{"test"};
+ ref.row = 2;
+ ref.col = 1;
+
+ tree.set_cell_link("/data/header/title", ref);
+ xml_map_tree::walker walker = tree.get_tree_walker();
+ walker.reset();
+
+ // Root element.
+ const xml_map_tree::element* elem = walker.push_element({XMLNS_UNKNOWN_ID, "data"});
+ assert(elem);
+ assert(elem->name.name == "data");
+ assert(elem->elem_type == xml_map_tree::element_type::unlinked);
+
+ elem = walker.push_element({XMLNS_UNKNOWN_ID, "header"});
+ assert(elem);
+ assert(elem->name.name == "header");
+ assert(elem->elem_type == xml_map_tree::element_type::unlinked);
+
+ elem = walker.push_element({XMLNS_UNKNOWN_ID, "title"});
+ assert(elem);
+ assert(elem->name.name == "title");
+ assert(elem->ref_type == xml_map_tree::reference_type::cell);
+
+ elem = walker.pop_element({XMLNS_UNKNOWN_ID, "title"});
+ assert(elem);
+ assert(elem->name.name == "header");
+ assert(elem->elem_type == xml_map_tree::element_type::unlinked);
+
+ elem = walker.pop_element({XMLNS_UNKNOWN_ID, "header"});
+ assert(elem);
+ assert(elem->name.name == "data");
+ assert(elem->elem_type == xml_map_tree::element_type::unlinked);
+
+ elem = walker.pop_element({XMLNS_UNKNOWN_ID, "data"});
+ assert(!elem);
+}
+
+void test_tree_walk_namespace()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ xmlns_repository repo;
+ xml_map_tree tree(repo);
+ xml_map_tree::cell_position ref;
+ ref.sheet = std::string_view{"data"};
+ ref.row = 1;
+ ref.col = 2;
+
+ tree.set_namespace_alias("a", "http://some-namespace", false);
+ tree.set_namespace_alias("skip", "http://namespace-to-skip", false);
+ tree.set_cell_link("/a:table/a:title", ref);
+ tree.start_range(ref);
+ ref.row = 2;
+ ref.col = 0;
+ tree.append_range_field_link("/a:table/a:rows/a:row/a:city", std::string_view{});
+ ++ref.col;
+ tree.append_range_field_link("/a:table/a:rows/a:row/a:population", std::string_view{});
+ ++ref.col;
+ tree.append_range_field_link("/a:table/a:rows/a:row/a:year", std::string_view{});
+ tree.set_range_row_group("/a:table/a:rows/a:row");
+ tree.commit_range();
+
+ xmlns_id_t ns_a = tree.get_namespace("a");
+ assert(ns_a != XMLNS_UNKNOWN_ID);
+ xmlns_id_t ns_skip = tree.get_namespace("skip");
+ assert(ns_skip != XMLNS_UNKNOWN_ID);
+
+ xml_map_tree::walker walker = tree.get_tree_walker();
+ walker.reset();
+
+ // Root element. This is not linked.
+ const xml_map_tree::element* elem = walker.push_element({ns_a, "table"});
+ assert(elem);
+ assert(elem->name.ns == ns_a);
+ assert(elem->name.name == "table");
+ assert(elem->node_type == xml_map_tree::linkable_node_type::element);
+ assert(elem->elem_type == xml_map_tree::element_type::unlinked);
+ assert(elem->ref_type == xml_map_tree::reference_type::unknown);
+
+ // Intentionally push a foreign element.
+ const xml_map_tree::element* elem_old = elem;
+ elem = walker.push_element({ns_skip, "foo"});
+ assert(!elem);
+ elem = walker.pop_element({ns_skip, "foo"});
+ assert(elem == elem_old);
+
+ // Push a foreign element and a valid element under it. A valid element
+ // placed under a foreign element should be invalid.
+ elem_old = elem;
+ elem = walker.push_element({ns_skip, "foo"});
+ assert(!elem);
+ elem = walker.push_element({ns_a, "title"});
+ assert(!elem);
+ elem = walker.pop_element({ns_a, "title"});
+ assert(!elem);
+ elem = walker.pop_element({ns_skip, "foo"});
+ assert(elem == elem_old);
+}
+
+int main()
+{
+ test_path_insertion();
+ test_attr_path_insertion();
+ test_tree_walk();
+ test_tree_walk_namespace();
+ return EXIT_SUCCESS;
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xml_simple_stream_handler.cpp b/src/liborcus/xml_simple_stream_handler.cpp
new file mode 100644
index 0000000..1ee7c1d
--- /dev/null
+++ b/src/liborcus/xml_simple_stream_handler.cpp
@@ -0,0 +1,54 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xml_simple_stream_handler.hpp"
+#include "xml_context_base.hpp"
+
+#include <cassert>
+
+namespace orcus {
+
+xml_simple_stream_handler::xml_simple_stream_handler(
+ session_context& session_cxt, const tokens& t, std::unique_ptr<xml_context_base> context) :
+ xml_stream_handler(session_cxt, t, std::move(context))
+{
+}
+
+xml_simple_stream_handler::~xml_simple_stream_handler()
+{
+}
+
+xml_context_base& xml_simple_stream_handler::get_context()
+{
+ return get_current_context();
+}
+
+void xml_simple_stream_handler::start_document()
+{
+}
+
+void xml_simple_stream_handler::end_document()
+{
+}
+
+void xml_simple_stream_handler::start_element(const xml_token_element_t& elem)
+{
+ get_current_context().start_element(elem.ns, elem.name, elem.attrs);
+}
+
+void xml_simple_stream_handler::end_element(const xml_token_element_t& elem)
+{
+ get_current_context().end_element(elem.ns, elem.name);
+}
+
+void xml_simple_stream_handler::characters(std::string_view str, bool transient)
+{
+ get_current_context().characters(str, transient);
+}
+
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xml_simple_stream_handler.hpp b/src/liborcus/xml_simple_stream_handler.hpp
new file mode 100644
index 0000000..186e7d3
--- /dev/null
+++ b/src/liborcus/xml_simple_stream_handler.hpp
@@ -0,0 +1,40 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef __ORCUS_XML_SIMPLE_HANDLER_HPP__
+#define __ORCUS_XML_SIMPLE_HANDLER_HPP__
+
+#include "xml_stream_handler.hpp"
+
+namespace orcus {
+
+class xml_context_base;
+
+/**
+ * Simple stream handler that only uses a single context instance.
+ */
+class xml_simple_stream_handler : public xml_stream_handler
+{
+public:
+ xml_simple_stream_handler(
+ session_context& session_cxt, const tokens& t, std::unique_ptr<xml_context_base> context);
+ virtual ~xml_simple_stream_handler() override;
+
+ xml_context_base& get_context();
+
+ virtual void start_document() override;
+ virtual void end_document() override;
+
+ virtual void start_element(const xml_token_element_t& elem) override;
+ virtual void end_element(const xml_token_element_t& elem) override;
+ virtual void characters(std::string_view str, bool transient) override;
+};
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xml_stream_handler.cpp b/src/liborcus/xml_stream_handler.cpp
new file mode 100644
index 0000000..859a08f
--- /dev/null
+++ b/src/liborcus/xml_stream_handler.cpp
@@ -0,0 +1,139 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xml_stream_handler.hpp"
+#include "xml_context_base.hpp"
+#include "xml_empty_context.hpp"
+
+#include "orcus/exception.hpp"
+
+#include <iostream>
+
+namespace orcus {
+
+xml_stream_handler::xml_stream_handler(
+ session_context& session_cxt, const tokens& t, std::unique_ptr<xml_context_base> root_context) :
+ m_session_cxt(session_cxt),
+ m_tokens(t),
+ m_config(format_t::unknown),
+ m_elem_printer(m_tokens),
+ mp_root_context(std::move(root_context)),
+ mp_invalid_context(std::make_unique<xml_empty_context>(session_cxt, t))
+{
+ assert(mp_root_context);
+ m_context_stack.push_back(mp_root_context.get());
+}
+
+xml_stream_handler::~xml_stream_handler()
+{
+}
+
+void xml_stream_handler::start_document()
+{
+}
+
+void xml_stream_handler::end_document()
+{
+}
+
+void xml_stream_handler::declaration(const xml_declaration_t& decl)
+{
+ get_current_context().declaration(decl);
+}
+
+void xml_stream_handler::start_element(const xml_token_element_t& elem)
+{
+ xml_context_base& cur = get_current_context();
+ if (cur.evaluate_child_element(elem.ns, elem.name))
+ {
+ // new child element is valid against parent element.
+ xml_context_base* p = cur.create_child_context(elem.ns, elem.name);
+ if (p)
+ m_context_stack.push_back(p);
+ }
+ else
+ {
+ // new child element is not valid for the current element. Ignore the
+ // whole sub structure.
+ m_context_stack.push_back(&get_invalid_context());
+
+ if (m_config.debug)
+ {
+ // TODO: print the top element of the sub structure being ignored.
+ std::cerr << "warning: ignoring the whole sub-structure below ";
+ m_elem_printer.print_element(std::cerr, elem.ns, elem.name);
+ std::cerr << std::endl;
+ }
+ }
+
+ get_current_context().start_element(elem.ns, elem.name, elem.attrs);
+}
+
+void xml_stream_handler::end_element(const xml_token_element_t& elem)
+{
+ bool ended = get_current_context().end_element(elem.ns, elem.name);
+
+ if (ended)
+ {
+ size_t n = m_context_stack.size();
+
+ if (n > 1)
+ {
+ // Call end_child_context of the parent context to provide a way for
+ // the two adjacent contexts to communicate with each other.
+ context_stack_type::reverse_iterator itr_cur = m_context_stack.rbegin();
+ context_stack_type::reverse_iterator itr_par = itr_cur + 1;
+ (*itr_par)->end_child_context(elem.ns, elem.name, *itr_cur);
+ }
+
+ m_context_stack.pop_back();
+ }
+}
+
+void xml_stream_handler::characters(std::string_view str, bool transient)
+{
+ get_current_context().characters(str, transient);
+}
+
+void xml_stream_handler::set_ns_context(const xmlns_context* p)
+{
+ for (auto* context : m_context_stack)
+ context->set_ns_context(p);
+
+ mp_invalid_context->set_ns_context(p);
+ m_elem_printer.set_ns_context(p);
+}
+
+void xml_stream_handler::set_config(const config& opt)
+{
+ m_config = opt;
+ for (auto* context : m_context_stack)
+ context->set_config(m_config);
+
+ mp_invalid_context->set_config(m_config);
+}
+
+xml_context_base& xml_stream_handler::get_current_context()
+{
+ if (m_context_stack.empty())
+ return *mp_root_context;
+
+ return *m_context_stack.back();
+}
+
+xml_context_base& xml_stream_handler::get_root_context()
+{
+ return *mp_root_context;
+}
+
+xml_context_base& xml_stream_handler::get_invalid_context()
+{
+ return *mp_invalid_context;
+}
+
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xml_stream_handler.hpp b/src/liborcus/xml_stream_handler.hpp
new file mode 100644
index 0000000..2b09c95
--- /dev/null
+++ b/src/liborcus/xml_stream_handler.hpp
@@ -0,0 +1,66 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef ORCUS_XML_STREAM_HANDLER_HPP
+#define ORCUS_XML_STREAM_HANDLER_HPP
+
+#include <orcus/sax_token_parser.hpp>
+#include <orcus/config.hpp>
+
+#include "xml_util.hpp"
+
+#include <cstdlib>
+#include <string>
+#include <vector>
+#include <memory>
+
+namespace orcus {
+
+class xml_context_base;
+class xmlns_context;
+struct session_context;
+
+class xml_stream_handler
+{
+ session_context& m_session_cxt;
+ const tokens& m_tokens;
+
+ config m_config;
+ xml_element_printer m_elem_printer;
+ std::unique_ptr<xml_context_base> mp_root_context;
+ std::unique_ptr<xml_context_base> mp_invalid_context;
+ typedef std::vector<xml_context_base*> context_stack_type;
+ context_stack_type m_context_stack;
+
+public:
+ xml_stream_handler() = delete;
+ xml_stream_handler(const xml_stream_handler&) = delete;
+
+ xml_stream_handler(session_context& session_cxt, const tokens& t, std::unique_ptr<xml_context_base> root_context);
+ virtual ~xml_stream_handler();
+
+ virtual void start_document();
+ virtual void end_document();
+
+ virtual void declaration(const xml_declaration_t& decl);
+ virtual void start_element(const xml_token_element_t& elem);
+ virtual void end_element(const xml_token_element_t& elem);
+ virtual void characters(std::string_view str, bool transient);
+
+ void set_ns_context(const xmlns_context* p);
+ void set_config(const config& opt);
+
+protected:
+ xml_context_base& get_current_context();
+ xml_context_base& get_root_context();
+ xml_context_base& get_invalid_context();
+};
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xml_stream_parser.cpp b/src/liborcus/xml_stream_parser.cpp
new file mode 100644
index 0000000..895821c
--- /dev/null
+++ b/src/liborcus/xml_stream_parser.cpp
@@ -0,0 +1,96 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xml_stream_parser.hpp"
+#include "xml_stream_handler.hpp"
+
+#include "orcus/tokens.hpp"
+
+#include "orcus/threaded_sax_token_parser.hpp"
+#include "orcus/sax_token_parser.hpp"
+
+#include <iostream>
+#include <vector>
+#include <sstream>
+
+using namespace std;
+
+namespace orcus {
+
+xml_stream_parser_base::xml_stream_parser_base(
+ const config& opt,
+ xmlns_repository& ns_repo, const tokens& tokens, const char* content, size_t size) :
+ m_config(opt),
+ m_ns_cxt(ns_repo.create_context()),
+ m_tokens(tokens),
+ mp_handler(nullptr),
+ m_content(content),
+ m_size(size)
+{
+}
+
+xml_stream_parser_base::~xml_stream_parser_base()
+{
+}
+
+void xml_stream_parser_base::set_handler(xml_stream_handler* handler)
+{
+ mp_handler = handler;
+ if (mp_handler)
+ {
+ mp_handler->set_ns_context(&m_ns_cxt);
+ mp_handler->set_config(m_config);
+ }
+}
+
+xml_stream_handler* xml_stream_parser_base::get_handler() const
+{
+ return mp_handler;
+}
+
+xml_stream_parser::xml_stream_parser(
+ const config& opt,
+ xmlns_repository& ns_repo, const tokens& tokens, const char* content, size_t size) :
+ xml_stream_parser_base(opt, ns_repo, tokens, content, size) {}
+
+xml_stream_parser::~xml_stream_parser() {}
+
+void xml_stream_parser::parse()
+{
+ if (!mp_handler)
+ return;
+
+ sax_token_parser<xml_stream_handler> sax({m_content, m_size}, m_tokens, m_ns_cxt, *mp_handler);
+ sax.parse();
+}
+
+threaded_xml_stream_parser::threaded_xml_stream_parser(
+ const config& opt,
+ xmlns_repository& ns_repo, const tokens& tokens, const char* content, size_t size) :
+ xml_stream_parser_base(opt, ns_repo, tokens, content, size) {}
+
+threaded_xml_stream_parser::~threaded_xml_stream_parser() {}
+
+void threaded_xml_stream_parser::parse()
+{
+ if (!mp_handler)
+ return;
+
+ threaded_sax_token_parser<xml_stream_handler> sax(m_content, m_size, m_tokens, m_ns_cxt, *mp_handler, 1000);
+ sax.parse();
+
+ sax.swap_string_pool(m_pool);
+}
+
+void threaded_xml_stream_parser::swap_string_pool(string_pool& pool)
+{
+ m_pool.swap(pool);
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xml_stream_parser.hpp b/src/liborcus/xml_stream_parser.hpp
new file mode 100644
index 0000000..0b75222
--- /dev/null
+++ b/src/liborcus/xml_stream_parser.hpp
@@ -0,0 +1,84 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_XMLPARSER_HPP
+#define INCLUDED_ORCUS_XMLPARSER_HPP
+
+#include <cstdlib>
+#include <string>
+#include <exception>
+
+#include "orcus/xml_namespace.hpp"
+#include "orcus/string_pool.hpp"
+
+namespace orcus {
+
+struct config;
+
+class xml_stream_handler;
+class tokens;
+
+/**
+ * This class does NOT store the stream content which is just a pointer to
+ * the first char of the content stream. Make sure you finish parsing while
+ * the content pointer is valid.
+ */
+class xml_stream_parser_base
+{
+public:
+ xml_stream_parser_base() = delete;
+
+ virtual void parse() = 0;
+
+ void set_handler(xml_stream_handler* handler);
+ xml_stream_handler* get_handler() const;
+
+protected:
+ xml_stream_parser_base(
+ const config& opt,
+ xmlns_repository& ns_repo, const tokens& tokens, const char* content, size_t size);
+ virtual ~xml_stream_parser_base();
+
+ const config& m_config;
+ xmlns_context m_ns_cxt;
+ const tokens& m_tokens;
+ xml_stream_handler* mp_handler;
+ const char* m_content;
+ size_t m_size;
+};
+
+class xml_stream_parser : public xml_stream_parser_base
+{
+public:
+ xml_stream_parser(
+ const config& opt,
+ xmlns_repository& ns_repo, const tokens& tokens, const char* content, size_t size);
+ virtual ~xml_stream_parser() override;
+
+ virtual void parse() override;
+};
+
+class threaded_xml_stream_parser : public xml_stream_parser_base
+{
+ string_pool m_pool;
+
+public:
+ threaded_xml_stream_parser(
+ const config& opt,
+ xmlns_repository& ns_repo, const tokens& tokens, const char* content, size_t size);
+ virtual ~threaded_xml_stream_parser() override;
+
+ virtual void parse() override;
+
+ void swap_string_pool(string_pool& pool);
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xml_structure_mapper.cpp b/src/liborcus/xml_structure_mapper.cpp
new file mode 100644
index 0000000..1242947
--- /dev/null
+++ b/src/liborcus/xml_structure_mapper.cpp
@@ -0,0 +1,84 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xml_structure_mapper.hpp"
+
+namespace orcus { namespace detail {
+
+xml_structure_mapper::xml_structure_mapper(
+ xml_structure_tree::range_handler_type rh, const xml_structure_tree::walker& walker) :
+ m_range_handler(std::move(rh)),
+ m_walker(walker),
+ m_repeat_count(0)
+{
+}
+
+void xml_structure_mapper::run()
+{
+ reset();
+ traverse();
+}
+
+void xml_structure_mapper::reset()
+{
+ m_cur_elem = m_walker.root();
+ m_repeat_count = 0;
+}
+
+void xml_structure_mapper::traverse()
+{
+ auto elem = m_cur_elem;
+ const bool row_group = elem.repeat;
+
+ if (row_group)
+ {
+ ++m_repeat_count;
+ m_current_range.row_groups.push_back(m_walker.get_path());
+ }
+
+ xml_structure_tree::entity_names_type children = m_walker.get_children();
+
+ if (m_repeat_count)
+ {
+ std::string path = m_walker.get_path();
+
+ xml_structure_tree::entity_names_type attr_names = m_walker.get_attributes();
+ for (const auto& attr_name : attr_names)
+ {
+ std::string attr_path = path + "/@" + m_walker.to_string(attr_name);
+ m_current_range.paths.push_back(attr_path);
+ }
+
+ if (children.empty() && elem.has_content)
+ // Only add leaf elements to the range, and only those with contents.
+ m_current_range.paths.push_back(path);
+ }
+
+ for (const auto& child_name : children)
+ {
+ m_cur_elem = m_walker.descend(child_name);
+ traverse();
+ m_cur_elem = m_walker.ascend();
+ }
+
+ if (row_group)
+ {
+ --m_repeat_count;
+
+ if (!m_repeat_count)
+ push_range();
+ }
+}
+
+void xml_structure_mapper::push_range()
+{
+ m_range_handler(std::move(m_current_range));
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xml_structure_mapper.hpp b/src/liborcus/xml_structure_mapper.hpp
new file mode 100644
index 0000000..aae4bfa
--- /dev/null
+++ b/src/liborcus/xml_structure_mapper.hpp
@@ -0,0 +1,40 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_XML_STRUCTURE_MAPPER_HPP
+#define INCLUDED_XML_STRUCTURE_MAPPER_HPP
+
+#include "orcus/xml_structure_tree.hpp"
+
+namespace orcus { namespace detail {
+
+class xml_structure_mapper
+{
+ xml_table_range_t m_current_range;
+
+ xml_structure_tree::range_handler_type m_range_handler;
+ xml_structure_tree::walker m_walker;
+ xml_structure_tree::element m_cur_elem;
+ size_t m_repeat_count;
+
+ void reset();
+
+ void traverse();
+
+ void push_range();
+
+public:
+ xml_structure_mapper(xml_structure_tree::range_handler_type rh, const xml_structure_tree::walker& walker);
+
+ void run();
+};
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xml_structure_tree.cpp b/src/liborcus/xml_structure_tree.cpp
new file mode 100644
index 0000000..dbdb029
--- /dev/null
+++ b/src/liborcus/xml_structure_tree.cpp
@@ -0,0 +1,625 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/xml_structure_tree.hpp>
+#include <orcus/sax_ns_parser.hpp>
+#include <orcus/xml_namespace.hpp>
+#include <orcus/exception.hpp>
+#include <orcus/string_pool.hpp>
+
+#include "string_helper.hpp"
+#include "xml_structure_mapper.hpp"
+
+#include <iostream>
+#include <sstream>
+#include <vector>
+#include <cstdio>
+#include <memory>
+
+#include <unordered_map>
+#include <unordered_set>
+
+namespace orcus {
+
+namespace {
+
+/** Element properties. */
+struct elem_prop
+{
+ using element_store_type = std::unordered_map<
+ xml_structure_tree::entity_name, std::unique_ptr<elem_prop>, xml_structure_tree::entity_name::hash>;
+
+ using attribute_names_type = std::unordered_set<
+ xml_structure_tree::entity_name, xml_structure_tree::entity_name::hash>;
+
+ element_store_type child_elements;
+ attribute_names_type attributes;
+
+ /** Store child element names in order of appearance. */
+ xml_structure_tree::entity_names_type child_element_names;
+
+ /** Store attribute names in order of appearance. */
+ xml_structure_tree::entity_names_type attribute_names;
+
+ size_t appearance_order;
+
+ size_t in_scope_count;
+
+ /**
+ * When true, this element is the base element of repeated structures.
+ * This flag is set only with the base element; none of the child
+ * elements below the base element have this flag set.
+ */
+ bool repeat;
+
+ bool has_content;
+
+ elem_prop(const elem_prop&) = delete;
+ elem_prop& operator=(const elem_prop&) = delete;
+
+ elem_prop() :
+ appearance_order(0),
+ in_scope_count(1),
+ repeat(false),
+ has_content(false) {}
+
+ elem_prop(size_t _appearance_order) :
+ appearance_order(_appearance_order),
+ in_scope_count(1),
+ repeat(false),
+ has_content(false) {}
+};
+
+struct root
+{
+ xml_structure_tree::entity_name name;
+ elem_prop prop;
+};
+
+struct element_ref
+{
+ xml_structure_tree::entity_name name;
+ elem_prop* prop;
+
+ element_ref() : prop(nullptr) {}
+ element_ref(xml_structure_tree::entity_name _name, elem_prop* _prop) :
+ name(_name), prop(_prop) {}
+};
+
+typedef std::vector<element_ref> elements_type;
+
+class xml_sax_handler
+{
+ string_pool& m_pool;
+ std::unique_ptr<root> mp_root;
+ elements_type m_stack;
+ xml_structure_tree::entity_names_type m_attrs;
+
+private:
+ void merge_attributes(elem_prop& prop)
+ {
+ xml_structure_tree::entity_names_type::const_iterator it = m_attrs.begin(), it_end = m_attrs.end();
+ for (; it != it_end; ++it)
+ {
+ if (prop.attributes.find(*it) == prop.attributes.end())
+ {
+ // New attribute. Insert it.
+ prop.attributes.insert(*it);
+ prop.attribute_names.push_back(*it);
+ }
+ }
+
+ m_attrs.clear();
+ }
+
+public:
+ xml_sax_handler(string_pool& pool) :
+ m_pool(pool), mp_root(nullptr) {}
+
+ void doctype(const sax::doctype_declaration&) {}
+
+ void start_declaration(std::string_view /*name*/)
+ {
+ }
+
+ void end_declaration(std::string_view /*name*/)
+ {
+ m_attrs.clear();
+ }
+
+ void start_element(const sax_ns_parser_element& elem)
+ {
+ if (!mp_root)
+ {
+ // This is a root element.
+ mp_root.reset(new root);
+ mp_root->name.ns = elem.ns;
+ mp_root->name.name = m_pool.intern(elem.name).first;
+ element_ref ref(mp_root->name, &mp_root->prop);
+ merge_attributes(mp_root->prop);
+ m_stack.push_back(ref);
+ return;
+ }
+
+ // See if the current element already has a child element of the same name.
+ assert(!m_stack.empty());
+ element_ref& current = m_stack.back();
+ xml_structure_tree::entity_name key(elem.ns, elem.name);
+ auto it = current.prop->child_elements.find(key);
+ if (it != current.prop->child_elements.end())
+ {
+ // Recurring element. Set its repeat flag only when it occurs
+ // multiple times in the same scope.
+ ++it->second->in_scope_count;
+ if (it->second->in_scope_count > 1)
+ it->second->repeat = true;
+
+ element_ref ref(it->first, it->second.get());
+ merge_attributes(*it->second);
+ m_stack.push_back(ref);
+ return;
+ }
+
+ // New element.
+ size_t order = current.prop->child_elements.size();
+ key.name = m_pool.intern(key.name).first;
+ auto r = current.prop->child_elements.insert(
+ std::make_pair(key, std::make_unique<elem_prop>(order)));
+
+ if (!r.second)
+ throw general_error("Insertion failed");
+
+ current.prop->child_element_names.push_back(key);
+
+ it = r.first;
+ element_ref ref(it->first, it->second.get());
+ merge_attributes(*it->second);
+ m_stack.push_back(ref);
+ }
+
+ void end_element(const sax_ns_parser_element& /*elem*/)
+ {
+ if (m_stack.empty())
+ throw general_error("Element stack is empty.");
+
+ const element_ref& current = m_stack.back();
+
+ // Reset the in-scope count of all child elements to 0 before ending
+ // the current scope.
+ for (auto& [name, p] : current.prop->child_elements)
+ p->in_scope_count = 0;
+
+ m_stack.pop_back();
+ }
+
+ void characters(std::string_view, bool)
+ {
+ if (m_stack.empty())
+ return;
+
+ element_ref& current = m_stack.back();
+ current.prop->has_content = true;
+ }
+
+ void attribute(std::string_view, std::string_view)
+ {
+ // Attribute for declaration. We don't handle this.
+ }
+
+ void attribute(const sax_ns_parser_attribute& attr)
+ {
+ m_attrs.push_back(xml_structure_tree::entity_name(attr.ns, attr.name));
+ }
+
+ std::unique_ptr<root> release_root_element()
+ {
+ return std::move(mp_root);
+ }
+};
+
+struct sort_by_appearance
+{
+ bool operator() (const element_ref& left, const element_ref& right) const
+ {
+ return left.prop->appearance_order < right.prop->appearance_order;
+ }
+};
+
+struct scope
+{
+ xml_structure_tree::entity_name name;
+ elements_type elements;
+ elements_type::const_iterator current_pos;
+ bool repeat:1;
+
+ scope(const scope&) = delete;
+ scope& operator=(const scope&) = delete;
+
+ scope(const xml_structure_tree::entity_name& _name, bool _repeat, const element_ref& _elem) :
+ name(_name), repeat(_repeat)
+ {
+ elements.push_back(_elem);
+ current_pos = elements.begin();
+ }
+
+ scope(const xml_structure_tree::entity_name& _name, bool _repeat) :
+ name(_name), repeat(_repeat) {}
+};
+
+typedef std::vector<std::unique_ptr<scope>> scopes_type;
+
+void print_scope(std::ostream& os, const scopes_type& scopes, const xmlns_context& cxt)
+{
+ if (scopes.empty())
+ throw general_error("scope stack shouldn't be empty while dumping tree.");
+
+ // Skip the first scope which is root.
+ scopes_type::const_iterator it = scopes.begin(), it_end = scopes.end();
+ for (++it; it != it_end; ++it)
+ {
+ os << "/";
+ size_t num_id = cxt.get_index((*it)->name.ns);
+ if (num_id != INDEX_NOT_FOUND)
+ os << "ns" << num_id << ":";
+ os << (*it)->name.name;
+ if ((*it)->repeat)
+ os << "[*]";
+ }
+}
+
+}
+
+xml_table_range_t::xml_table_range_t() {}
+
+xml_table_range_t::~xml_table_range_t() {}
+
+struct xml_structure_tree::impl
+{
+ string_pool m_pool;
+ xmlns_context& m_xmlns_cxt;
+ std::unique_ptr<root> mp_root;
+
+ impl(const impl&) = delete;
+ impl& operator=(const impl&) = delete;
+
+ impl(xmlns_context& xmlns_cxt) : m_xmlns_cxt(xmlns_cxt) {}
+ ~impl() {}
+
+ std::string to_string(const xml_structure_tree::entity_name& name) const
+ {
+ std::ostringstream ss;
+ if (m_xmlns_cxt.get_index(name.ns) != INDEX_NOT_FOUND)
+ ss << m_xmlns_cxt.get_short_name(name.ns) << ":";
+ ss << name.name;
+ return ss.str();
+ }
+};
+
+struct xml_structure_tree::walker_impl
+{
+ const xml_structure_tree::impl& m_parent_impl;
+ root* mp_root; /// Root element of the authoritative tree.
+ element_ref m_cur_elem;
+ std::vector<element_ref> m_scopes;
+
+ walker_impl& operator=(const walker_impl&) = delete;
+
+ walker_impl(const xml_structure_tree::impl& parent_impl) :
+ m_parent_impl(parent_impl), mp_root(parent_impl.mp_root.get()) {}
+
+ walker_impl(const walker_impl& r) :
+ m_parent_impl(r.m_parent_impl), mp_root(r.mp_root), m_cur_elem(r.m_cur_elem), m_scopes(r.m_scopes) {}
+};
+
+xml_structure_tree::entity_name::entity_name() :
+ ns(XMLNS_UNKNOWN_ID) {}
+
+xml_structure_tree::entity_name::entity_name(xmlns_id_t _ns, std::string_view _name) :
+ ns(_ns), name(_name) {}
+
+bool xml_structure_tree::entity_name::operator< (const entity_name& r) const
+{
+ if (ns != r.ns)
+ return ns < r.ns;
+
+ return name < r.name;
+}
+
+bool xml_structure_tree::entity_name::operator== (const entity_name& r) const
+{
+ return ns == r.ns && name == r.name;
+}
+
+size_t xml_structure_tree::entity_name::hash::operator() (const entity_name& val) const
+{
+ size_t n = reinterpret_cast<size_t>(val.ns);
+ n += std::hash<std::string_view>{}(val.name);
+ return n;
+}
+
+xml_structure_tree::element::element() :
+ repeat(false), has_content(false) {}
+
+xml_structure_tree::element::element(const entity_name& _name, bool _repeat, bool _has_content) :
+ name(_name), repeat(_repeat), has_content(_has_content) {}
+
+xml_structure_tree::walker::walker(const xml_structure_tree::impl& parent_impl) :
+ mp_impl(std::make_unique<walker_impl>(parent_impl))
+{
+}
+
+xml_structure_tree::walker::walker(const walker& r) :
+ mp_impl(std::make_unique<walker_impl>(*r.mp_impl))
+{
+}
+
+xml_structure_tree::walker::~walker() {}
+
+xml_structure_tree::walker& xml_structure_tree::walker::operator= (const walker& r)
+{
+ mp_impl->mp_root = r.mp_impl->mp_root;
+ return *this;
+}
+
+xml_structure_tree::element xml_structure_tree::walker::root()
+{
+ if (!mp_impl->mp_root)
+ throw general_error("Tree is empty.");
+
+ mp_impl->m_scopes.clear();
+
+ // Set the current element to root.
+ element_ref ref(mp_impl->mp_root->name, &mp_impl->mp_root->prop);
+ mp_impl->m_cur_elem = ref;
+ mp_impl->m_scopes.push_back(ref);
+ return xml_structure_tree::element(ref.name, false, ref.prop->has_content);
+}
+
+xml_structure_tree::element xml_structure_tree::walker::descend(const entity_name& name)
+{
+ if (mp_impl->m_scopes.empty())
+ throw general_error("Scope is empty.");
+
+ assert(mp_impl->m_scopes.back().prop);
+ const auto& child_elems = mp_impl->m_scopes.back().prop->child_elements;
+ auto it = child_elems.find(name);
+
+ if (it == child_elems.end())
+ throw general_error("Specified child element does not exist.");
+
+ // Push this new child element onto the stack.
+ element_ref ref(name, it->second.get());
+ mp_impl->m_scopes.push_back(ref);
+
+ return element(name, it->second->repeat, it->second->has_content);
+}
+
+xml_structure_tree::element xml_structure_tree::walker::ascend()
+{
+ if (mp_impl->m_scopes.empty())
+ throw general_error("Scope is empty.");
+
+ if (mp_impl->m_scopes.size() == 1)
+ throw general_error("You can't ascend from the root element.");
+
+ mp_impl->m_scopes.pop_back();
+ const element_ref& ref = mp_impl->m_scopes.back();
+ return element(ref.name, ref.prop->repeat, ref.prop->has_content);
+}
+
+xml_structure_tree::entity_names_type xml_structure_tree::walker::get_children()
+{
+ if (mp_impl->m_scopes.empty())
+ throw general_error("Scope is empty.");
+
+ entity_names_type names;
+ assert(mp_impl->m_scopes.back().prop);
+ const elem_prop& prop = *mp_impl->m_scopes.back().prop;
+ names.assign(prop.child_element_names.begin(), prop.child_element_names.end());
+ return names;
+}
+
+xml_structure_tree::entity_names_type xml_structure_tree::walker::get_attributes()
+{
+ if (mp_impl->m_scopes.empty())
+ throw general_error("Scope is empty.");
+
+ entity_names_type names;
+ assert(mp_impl->m_scopes.back().prop);
+ const elem_prop& prop = *mp_impl->m_scopes.back().prop;
+ names.assign(prop.attribute_names.begin(), prop.attribute_names.end());
+ return names;
+}
+
+size_t xml_structure_tree::walker::get_xmlns_index(xmlns_id_t ns) const
+{
+ return mp_impl->m_parent_impl.m_xmlns_cxt.get_index(ns);
+}
+
+std::string xml_structure_tree::walker::get_xmlns_short_name(xmlns_id_t ns) const
+{
+ return mp_impl->m_parent_impl.m_xmlns_cxt.get_short_name(ns);
+}
+
+std::string xml_structure_tree::walker::to_string(const entity_name& name) const
+{
+ return mp_impl->m_parent_impl.to_string(name);
+}
+
+std::string xml_structure_tree::walker::get_path() const
+{
+ std::ostringstream ss;
+ for (auto& element : mp_impl->m_scopes)
+ {
+ ss << "/" << mp_impl->m_parent_impl.to_string(element.name);
+ }
+
+ return ss.str();
+}
+
+xml_structure_tree::element xml_structure_tree::walker::move_to(const std::string& path)
+{
+ auto parts = string_helper::split_string(path, '/');
+ if (parts.empty())
+ throw general_error("invalid format for path");
+
+ // string_helper::split_string will create an empty first element due to leading '/'
+ if (parts[0] != "")
+ {
+ throw general_error("invalid format for path");
+ }
+ else
+ {
+ parts.erase(parts.begin());
+ }
+
+ if (parts.empty())
+ throw general_error("invalid format for path");
+
+ element_ref root_ref(mp_impl->mp_root->name, &mp_impl->mp_root->prop);
+ if (mp_impl->m_parent_impl.to_string(root_ref.name) != parts[0])
+ throw general_error("path does not match any element");
+
+ std::vector<element_ref> scopes;
+ scopes.push_back(root_ref);
+
+ for (size_t i = 1; i < parts.size(); ++i)
+ {
+ const elem_prop& prop = *scopes.back().prop;
+ bool found = false;
+ for (auto& child : prop.child_elements)
+ {
+ if (mp_impl->m_parent_impl.to_string(child.first) == parts[i])
+ {
+ scopes.emplace_back(child.first, child.second.get());
+ found = true;
+ break;
+ }
+ }
+ if (!found)
+ throw general_error("path does not match any element");
+ }
+
+ std::swap(mp_impl->m_scopes, scopes);
+ const element_ref& ref = mp_impl->m_scopes.back();
+ return element(ref.name, ref.prop->repeat, ref.prop->has_content);
+}
+
+xml_structure_tree::xml_structure_tree(xmlns_context& xmlns_cxt) :
+ mp_impl(std::make_unique<impl>(xmlns_cxt)) {}
+
+xml_structure_tree::xml_structure_tree(xml_structure_tree&& other) :
+ mp_impl(std::move(other.mp_impl))
+{
+ other.mp_impl = std::make_unique<impl>(mp_impl->m_xmlns_cxt);
+}
+
+xml_structure_tree::~xml_structure_tree() {}
+
+void xml_structure_tree::parse(std::string_view s)
+{
+ xml_sax_handler hdl(mp_impl->m_pool);
+ sax_ns_parser<xml_sax_handler> parser(s, mp_impl->m_xmlns_cxt, hdl);
+ parser.parse();
+ mp_impl->mp_root = hdl.release_root_element();
+}
+
+void xml_structure_tree::dump_compact(std::ostream& os) const
+{
+ if (!mp_impl->mp_root)
+ return;
+
+ scopes_type scopes;
+ const xmlns_context& cxt = mp_impl->m_xmlns_cxt;
+
+ // Dump all namespaces first.
+ cxt.dump(os);
+
+ element_ref ref(mp_impl->mp_root->name, &mp_impl->mp_root->prop);
+ scopes.push_back(std::make_unique<scope>(entity_name(), false, ref));
+ while (!scopes.empty())
+ {
+ bool new_scope = false;
+
+ // Iterate through all elements in the current scope.
+ scope& cur_scope = *scopes.back();
+ for (; cur_scope.current_pos != cur_scope.elements.end(); ++cur_scope.current_pos)
+ {
+ const element_ref& this_elem = *cur_scope.current_pos;
+ std::ostringstream ss;
+ print_scope(ss, scopes, cxt);
+
+ ss << "/";
+ size_t num_id = cxt.get_index(this_elem.name.ns);
+ if (num_id != INDEX_NOT_FOUND)
+ ss << "ns" << num_id << ":";
+ ss << this_elem.name.name;
+ if (this_elem.prop->repeat)
+ ss << "[*]";
+
+ std::string elem_name = ss.str();
+ os << elem_name << std::endl;
+
+ // Print all attributes that belong to this element.
+ for (const entity_name& attr : this_elem.prop->attribute_names)
+ os << elem_name << "/@" << mp_impl->to_string(attr) << std::endl;
+
+ if (this_elem.prop->child_elements.empty())
+ continue;
+
+ // This element has child elements. Push a new scope and populate
+ // it with all child elements.
+ elements_type elems;
+ for (const auto& entry : this_elem.prop->child_elements)
+ {
+ ref.name = entry.first;
+ ref.prop = entry.second.get();
+ elems.push_back(ref);
+ }
+
+ // Sort the elements by order of appearance.
+ std::sort(elems.begin(), elems.end(), sort_by_appearance());
+
+ assert(!elems.empty());
+
+ // Push a new scope, and restart the loop with the new scope.
+ ++cur_scope.current_pos;
+ scopes.push_back(std::make_unique<scope>(this_elem.name, this_elem.prop->repeat));
+ scope& child_scope = *scopes.back();
+ child_scope.elements.swap(elems);
+ child_scope.current_pos = child_scope.elements.begin();
+
+ new_scope = true;
+ break;
+ }
+
+ if (new_scope)
+ continue;
+
+ scopes.pop_back();
+ }
+}
+
+xml_structure_tree::walker xml_structure_tree::get_walker() const
+{
+ return walker(*mp_impl);
+}
+
+void xml_structure_tree::process_ranges(range_handler_type rh) const
+{
+ detail::xml_structure_mapper mapper(rh, get_walker());
+ mapper.run();
+}
+
+void xml_structure_tree::swap(xml_structure_tree& other)
+{
+ mp_impl.swap(other.mp_impl);
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xml_structure_tree_test.cpp b/src/liborcus/xml_structure_tree_test.cpp
new file mode 100644
index 0000000..ba8b550
--- /dev/null
+++ b/src/liborcus/xml_structure_tree_test.cpp
@@ -0,0 +1,286 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/xml_structure_tree.hpp>
+#include <orcus/xml_namespace.hpp>
+#include <orcus/stream.hpp>
+#include <orcus/parser_global.hpp>
+
+#include <cstdlib>
+#include <cassert>
+#include <iostream>
+#include <sstream>
+#include <vector>
+
+#include "filesystem_env.hpp"
+
+using namespace std;
+using namespace orcus;
+
+const fs::path test_base_dir(SRCDIR"/test/xml-structure");
+
+std::vector<fs::path> base_dirs = {
+ test_base_dir / "basic-1/",
+ test_base_dir / "basic-2/",
+ test_base_dir / "basic-3/",
+ test_base_dir / "attribute-1/",
+ test_base_dir / "nested-repeat-1/",
+ test_base_dir / "namespace-default/"
+};
+
+struct loaded_tree
+{
+ xmlns_context cxt;
+ file_content strm;
+ xml_structure_tree tree;
+
+ loaded_tree(xmlns_repository& repo) :
+ cxt(repo.create_context()),
+ tree(cxt) {}
+
+ loaded_tree(const loaded_tree&) = delete;
+};
+
+std::unique_ptr<loaded_tree> load_tree(xmlns_repository& repo, fs::path& filepath)
+{
+ auto ret = std::make_unique<loaded_tree>(repo);
+ ret->strm.load(filepath.string().data());
+ assert(!ret->strm.empty());
+ xml_structure_tree tree(ret->cxt);
+ tree.parse(ret->strm.str());
+ ret->tree.swap(tree);
+
+ return ret;
+}
+
+void test_basic()
+{
+ xmlns_repository xmlns_repo;
+
+ for (const fs::path& base_dir : base_dirs)
+ {
+ fs::path filepath = base_dir / "input.xml";
+ cout << filepath << endl;
+ auto lt = load_tree(xmlns_repo, filepath);
+
+ std::ostringstream os;
+ lt->tree.dump_compact(os);
+ string data_content = os.str();
+ cout << "--" << endl;
+ cout << data_content;
+
+ // Check the dump content against known datum.
+ filepath = base_dir / "check.txt";
+ file_content strm_check(filepath.string().data());
+ assert(!strm_check.empty());
+
+ // They should be identical, plus or minus leading/trailing whitespaces.
+ std::string_view s1(data_content.data(), data_content.size());
+ std::string_view s2 = strm_check.str();
+ assert(trim(s1) == trim(s2));
+ }
+}
+
+void test_walker()
+{
+ xmlns_repository xmlns_repo;
+
+ {
+ fs::path filepath = base_dirs[0] / "input.xml";
+ auto lt = load_tree(xmlns_repo, filepath);
+
+ // Get walker from the tree.
+ xml_structure_tree::entity_names_type elem_names;
+ xml_structure_tree::walker wkr = lt->tree.get_walker();
+
+ // Root element.
+ xml_structure_tree::element elem = wkr.root();
+ assert(elem.name.name == "root");
+ assert(!elem.repeat);
+
+ // Get names of child elements. There should only one one and it should be 'entry'.
+ elem_names = wkr.get_children();
+ assert(elem_names.size() == 1);
+ xml_structure_tree::entity_name elem_name = elem_names.front();
+ assert(elem_name.name == "entry");
+
+ // Descend into 'entry'.
+ elem = wkr.descend(elem_name);
+ assert(elem.name.name == "entry");
+ assert(elem.repeat);
+
+ // Element 'entry' should have 2 child elements 'name' and 'id' in this order.
+ elem_names = wkr.get_children();
+ assert(elem_names.size() == 2);
+ assert(elem_names[0].name == "name");
+ assert(elem_names[1].name == "id");
+
+ // Descend into 'name'.
+ elem_name = elem_names[0];
+ elem = wkr.descend(elem_name);
+ assert(elem.name.name == "name");
+ assert(!elem.repeat);
+
+ // This is a leaf element. It should have no child elements.
+ xml_structure_tree::entity_names_type test_names = wkr.get_children();
+ assert(test_names.empty());
+
+ // Move up to 'entry'.
+ elem = wkr.ascend();
+ assert(elem.name.name == "entry");
+ assert(elem.repeat);
+
+ // Move down to 'id'.
+ elem = wkr.descend(elem_names[1]);
+ assert(elem.name.name == "id");
+ assert(!elem.repeat);
+
+ // Move up to 'entry' again.
+ elem = wkr.ascend();
+ assert(elem.name.name == "entry");
+ assert(elem.repeat);
+
+ // Move up to 'root'.
+ elem = wkr.ascend();
+ assert(elem.name.name == "root");
+ assert(!elem.repeat);
+ }
+
+ {
+ fs::path filepath = base_dirs[3] / "input.xml"; // attribute-1
+ auto lt = load_tree(xmlns_repo, filepath);
+
+ // Get walker from the tree.
+ xml_structure_tree::entity_names_type elem_names;
+ xml_structure_tree::walker wkr = lt->tree.get_walker();
+
+ // Root element.
+ xml_structure_tree::element elem = wkr.root();
+ assert(elem.name.name == "root");
+ assert(!elem.repeat);
+
+ // Check attributes of root, which should have 'version' and 'type' in this order.
+ xml_structure_tree::entity_names_type names = wkr.get_attributes();
+ assert(names.size() == 2);
+ assert(names[0].name == "version");
+ assert(names[1].name == "type");
+
+ // Root element should have only one child element 'entry'.
+ names = wkr.get_children();
+ assert(names.size() == 1);
+ assert(names[0].name == "entry");
+ elem = wkr.descend(names[0]);
+ assert(elem.name.name == "entry");
+ assert(elem.repeat);
+
+ // The 'entry' element should have 3 attributes 'attr1', 'attr2', and 'attr3'.
+ names = wkr.get_attributes();
+ assert(names.size() == 3);
+ assert(names[0].name == "attr1");
+ assert(names[1].name == "attr2");
+ assert(names[2].name == "attr3");
+ }
+}
+
+void test_walker_path()
+{
+ fs::path filepath = base_dirs[0] / "input.xml";
+ xmlns_repository xmlns_repo;
+ auto lt = load_tree(xmlns_repo, filepath);
+
+ // Get walker from the tree.
+ xml_structure_tree::entity_names_type elem_names;
+ xml_structure_tree::walker wkr = lt->tree.get_walker();
+ wkr.root();
+ assert("/root" == wkr.get_path());
+
+ elem_names = wkr.get_children();
+ xml_structure_tree::entity_name elem_name = elem_names.front();
+ wkr.descend(elem_name);
+ assert("/root/entry" == wkr.get_path());
+
+ xml_structure_tree::element element = wkr.move_to("/root/entry");
+ assert(element.name.name == "entry");
+
+ try
+ {
+ wkr.move_to("/root/not-there");
+ assert(false);
+ }
+ catch (...)
+ {
+ }
+
+ try
+ {
+ wkr.move_to("something_different");
+ assert(false);
+ }
+ catch (...)
+ {
+ }
+
+ try
+ {
+ wkr.move_to("/non-exist");
+ assert(false);
+ }
+ catch (...)
+ {
+ }
+}
+
+void test_element_contents()
+{
+ xmlns_repository xmlns_repo;
+
+ {
+ fs::path filepath = test_base_dir / "attribute-1" / "input.xml";
+ auto lt = load_tree(xmlns_repo, filepath);
+ auto wkr = lt->tree.get_walker();
+ auto elem = wkr.move_to("/root/entry");
+ assert(wkr.to_string(elem.name) == "entry");
+ assert(elem.repeat);
+ assert(!elem.has_content);
+ }
+
+ {
+ fs::path filepath = test_base_dir / "basic-1" / "input.xml";
+ auto lt = load_tree(xmlns_repo, filepath);
+ auto wkr = lt->tree.get_walker();
+ auto elem = wkr.move_to("/root/entry/name");
+ assert(wkr.to_string(elem.name) == "name");
+ assert(!elem.repeat);
+ assert(elem.has_content);
+
+ elem = wkr.move_to("/root/entry/id");
+ assert(wkr.to_string(elem.name) == "id");
+ assert(!elem.repeat);
+ assert(elem.has_content);
+ }
+
+ {
+ fs::path filepath = test_base_dir / "nested-repeat-1" / "input.xml";
+ auto lt = load_tree(xmlns_repo, filepath);
+ auto wkr = lt->tree.get_walker();
+ auto elem = wkr.move_to("/root/mode/insert/command");
+ assert(wkr.to_string(elem.name) == "command");
+ assert(!elem.repeat);
+ assert(!elem.has_content);
+ }
+}
+
+int main()
+{
+ test_basic();
+ test_walker();
+ test_walker_path();
+ test_element_contents();
+
+ return EXIT_SUCCESS;
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xml_util.cpp b/src/liborcus/xml_util.cpp
new file mode 100644
index 0000000..7c15adf
--- /dev/null
+++ b/src/liborcus/xml_util.cpp
@@ -0,0 +1,70 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xml_util.hpp"
+
+#include <orcus/xml_namespace.hpp>
+#include <orcus/tokens.hpp>
+
+#include <sstream>
+#include <iostream>
+
+namespace orcus {
+
+xml_element_printer::xml_element_printer(const tokens& t) :
+ m_tokens(t)
+{
+}
+
+void xml_element_printer::set_ns_context(const xmlns_context* ns_cxt)
+{
+ mp_ns_cxt = ns_cxt;
+}
+
+void xml_element_printer::print_namespace(std::ostream& os, xmlns_id_t ns) const
+{
+ if (mp_ns_cxt)
+ {
+ std::string_view alias = mp_ns_cxt->get_alias(ns);
+ if (!alias.empty())
+ os << alias;
+ else
+ os << mp_ns_cxt->get_short_name(ns);
+ }
+ else
+ os << ns;
+}
+
+void xml_element_printer::print_element(std::ostream& os, xmlns_id_t ns, xml_token_t name) const
+{
+ os << '<';
+
+ std::ostringstream os_ns;
+ print_namespace(os_ns, ns);
+ std::string ns_str = os_ns.str();
+
+ if (!ns_str.empty())
+ os << ns_str << ':';
+
+ os << m_tokens.get_token_name(name) << '>';
+}
+
+void print_attrs(const tokens& tokens, const xml_token_attrs_t& attrs)
+{
+ for (const auto& attr : attrs)
+ {
+ std::cout << " ";
+ if (attr.ns != XMLNS_UNKNOWN_ID)
+ std::cout << attr.ns << ":";
+
+ std::cout << tokens.get_token_name(attr.name) << " = \"" << attr.value << "\"" << std::endl;
+ }
+}
+
+} // namespace orcus
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xml_util.hpp b/src/liborcus/xml_util.hpp
new file mode 100644
index 0000000..1021ccf
--- /dev/null
+++ b/src/liborcus/xml_util.hpp
@@ -0,0 +1,43 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#pragma once
+
+#include <orcus/types.hpp>
+
+#include <ostream>
+
+namespace orcus {
+
+class tokens;
+class xmlns_context;
+
+class xml_element_printer
+{
+ const tokens& m_tokens;
+ const xmlns_context* mp_ns_cxt = nullptr;
+
+public:
+ xml_element_printer(const tokens& t);
+
+ void set_ns_context(const xmlns_context* ns_cxt);
+
+ void print_namespace(std::ostream& os, xmlns_id_t ns) const;
+
+ void print_element(std::ostream& os, xmlns_id_t ns, xml_token_t name) const;
+};
+
+void print_element(std::ostream& os, const tokens& t, xmlns_id_t ns, xml_token_t name);
+
+/**
+ * Print attributes to stdout for debugging purposes.
+ */
+void print_attrs(const tokens& tokens, const xml_token_attrs_t& attrs);
+
+} // namespace orcus
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xpath_parser.cpp b/src/liborcus/xpath_parser.cpp
new file mode 100644
index 0000000..306b367
--- /dev/null
+++ b/src/liborcus/xpath_parser.cpp
@@ -0,0 +1,90 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xpath_parser.hpp"
+#include "orcus/exception.hpp"
+#include "orcus/xml_namespace.hpp"
+
+#define ORCUS_DEBUG_XPATH_PARSER 0
+
+namespace orcus {
+
+xpath_parser::token::token(xmlns_id_t _ns, std::string_view _name, bool _attribute) :
+ ns(_ns), name(_name), attribute(_attribute)
+{
+#if ORCUS_DEBUG_XPATH_PARSER
+ cout << "xpath_parser::token: (ns='" << (ns ? ns : "none") << "', name='" << name << "', attribute=" << attribute << ")" << endl;
+#endif
+}
+
+xpath_parser::token::token() : ns(XMLNS_UNKNOWN_ID), attribute(false) {}
+xpath_parser::token::token(const token& r) : ns(r.ns), name(r.name), attribute(r.attribute) {}
+
+xpath_parser::xpath_parser(const xmlns_context& cxt, const char* p, size_t n, xmlns_id_t default_ns) :
+ m_cxt(cxt),
+ mp_char(p),
+ mp_end(p+n),
+ m_default_ns(default_ns)
+{
+ if (!n)
+ throw xpath_error("empty path");
+
+ if (*p != '/')
+ throw xpath_error("first character must be '/'.");
+
+ ++mp_char;
+}
+
+xpath_parser::token xpath_parser::next()
+{
+ if (mp_char == mp_end)
+ return token();
+
+ const char* p0 = nullptr;
+ size_t len = 0;
+ xmlns_id_t ns = m_default_ns;
+
+ bool attribute = *mp_char == '@';
+ if (attribute)
+ ++mp_char;
+
+ for (; mp_char != mp_end; ++mp_char, ++len)
+ {
+ if (!p0)
+ {
+ p0 = mp_char;
+ len = 0;
+ }
+
+ switch (*mp_char)
+ {
+ case '/':
+ {
+ ++mp_char; // skip the '/'.
+ return token(ns, std::string_view(p0, len), attribute);
+ }
+ case ':':
+ {
+ // What comes before ':' is a namespace. Reset the name and
+ // convert the namespace to a proper ID.
+ std::string_view ns_name(p0, len);
+ ns = m_cxt.get(ns_name);
+ p0 = nullptr; // reset the name.
+ break;
+ }
+ default:
+ ;
+ }
+ }
+
+ // '/' has never been encountered. It must be the last name in the path.
+ return token(ns, std::string_view(p0, len), attribute);
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xpath_parser.hpp b/src/liborcus/xpath_parser.hpp
new file mode 100644
index 0000000..211d749
--- /dev/null
+++ b/src/liborcus/xpath_parser.hpp
@@ -0,0 +1,49 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_XPATH_PARSER_HPP
+#define INCLUDED_ORCUS_XPATH_PARSER_HPP
+
+#include <orcus/types.hpp>
+
+namespace orcus {
+
+class xmlns_context;
+
+class xpath_parser
+{
+ const xmlns_context& m_cxt;
+ const char* mp_char;
+ const char* mp_end;
+
+ xmlns_id_t m_default_ns;
+
+ enum class token_type { element, attribute };
+
+public:
+
+ struct token
+ {
+ xmlns_id_t ns;
+ std::string_view name;
+ bool attribute;
+
+ token(xmlns_id_t _ns, std::string_view _name, bool _attribute);
+ token();
+ token(const token& r);
+ };
+
+ xpath_parser(const xmlns_context& cxt, const char* p, size_t n, xmlns_id_t default_ns);
+
+ token next();
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/xpath_parser_test.cpp b/src/liborcus/xpath_parser_test.cpp
new file mode 100644
index 0000000..26e7d6b
--- /dev/null
+++ b/src/liborcus/xpath_parser_test.cpp
@@ -0,0 +1,74 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xpath_parser.hpp"
+#include "orcus/xml_namespace.hpp"
+
+#include <iostream>
+#include <cassert>
+
+using namespace orcus;
+
+void test_elements()
+{
+ xmlns_repository repo;
+ xmlns_context cxt = repo.create_context();
+
+ std::string_view path("/A/B/C");
+
+ xpath_parser parser(cxt, path.data(), path.size(), XMLNS_UNKNOWN_ID);
+ auto token = parser.next();
+ assert(token.name == "A");
+ assert(!token.attribute);
+
+ token = parser.next();
+ assert(token.name == "B");
+ assert(!token.attribute);
+
+ token = parser.next();
+ assert(token.name == "C");
+ assert(!token.attribute);
+
+ token = parser.next();
+ assert(token.name.empty());
+}
+
+void test_attributes()
+{
+ xmlns_repository repo;
+ xmlns_context cxt = repo.create_context();
+
+ std::string_view path("/A/B/C/@foo");
+
+ xpath_parser parser(cxt, path.data(), path.size(), XMLNS_UNKNOWN_ID);
+ auto token = parser.next();
+ assert(token.name == "A");
+ assert(!token.attribute);
+
+ token = parser.next();
+ assert(token.name == "B");
+ assert(!token.attribute);
+
+ token = parser.next();
+ assert(token.name == "C");
+ assert(!token.attribute);
+
+ token = parser.next();
+ assert(token.name == "foo");
+ assert(token.attribute);
+}
+
+int main()
+{
+ test_elements();
+ test_attributes();
+
+ return EXIT_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+
diff --git a/src/liborcus/yaml_document_tree.cpp b/src/liborcus/yaml_document_tree.cpp
new file mode 100644
index 0000000..1bd37a8
--- /dev/null
+++ b/src/liborcus/yaml_document_tree.cpp
@@ -0,0 +1,856 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/yaml_document_tree.hpp"
+#include "orcus/yaml_parser.hpp"
+
+#include "json_util.hpp"
+
+#include <vector>
+#include <memory>
+#include <unordered_map>
+#include <algorithm>
+#include <iostream>
+
+#include <boost/current_function.hpp>
+
+#define ORCUS_DEBUG_YAML_TREE 0
+
+#if ORCUS_DEBUG_YAML_TREE
+#include <iostream>
+#endif
+
+namespace orcus { namespace yaml {
+
+document_error::document_error(const std::string& msg) :
+ general_error("yaml_document_error", msg) {}
+
+document_error::~document_error() = default;
+
+struct yaml_value
+{
+ node_t type;
+ yaml_value* parent;
+
+ yaml_value() : type(node_t::unset), parent(nullptr) {}
+ yaml_value(node_t _type) : type(_type), parent(nullptr) {}
+ virtual ~yaml_value() {}
+
+ virtual size_t get_hash() const
+ {
+ return reinterpret_cast<size_t>(this);
+ }
+
+ virtual std::string print() const
+ {
+ std::ostringstream os;
+ os << "type: ";
+ switch (type)
+ {
+ case node_t::unset:
+ os << "unset";
+ break;
+ case node_t::string:
+ os << "string";
+ break;
+ case node_t::number:
+ os << "number";
+ break;
+ case node_t::map:
+ os << "map";
+ break;
+ case node_t::sequence:
+ os << "sequence";
+ break;
+ case node_t::boolean_true:
+ os << "true";
+ break;
+ case node_t::boolean_false:
+ os << "false";
+ break;
+ case node_t::null:
+ os << "null";
+ break;
+ }
+ return os.str();
+ }
+
+ struct hash
+ {
+ size_t operator() (const yaml_value& v) const
+ {
+ return v.get_hash();
+ }
+ };
+};
+
+namespace {
+
+struct yaml_value_string : public yaml_value
+{
+ std::string value_string;
+
+ yaml_value_string() : yaml_value(node_t::string) {}
+ yaml_value_string(std::string_view s) : yaml_value(node_t::string), value_string(s) {}
+ virtual ~yaml_value_string() {}
+
+ virtual std::string print() const
+ {
+ std::ostringstream os;
+ os << "type: string, value: " << value_string;
+ return os.str();
+ }
+};
+
+struct yaml_value_number : public yaml_value
+{
+ double value_number;
+
+ yaml_value_number(double num) : yaml_value(node_t::number), value_number(num) {}
+ virtual ~yaml_value_number() {}
+
+ virtual std::string print() const
+ {
+ std::ostringstream os;
+ os << "type: number, value: " << value_number;
+ return os.str();
+ }
+};
+
+struct yaml_value_sequence : public yaml_value
+{
+ std::vector<std::unique_ptr<yaml_value>> value_sequence;
+
+ yaml_value_sequence() : yaml_value(node_t::sequence) {}
+ virtual ~yaml_value_sequence() {}
+};
+
+struct yaml_value_map : public yaml_value
+{
+ std::vector<std::unique_ptr<yaml_value>> key_order; // owns the key instances.
+ std::unordered_map<const yaml_value*, std::unique_ptr<yaml_value>> value_map;
+
+ yaml_value_map() : yaml_value(node_t::map) {}
+ virtual ~yaml_value_map() {}
+};
+
+struct parser_stack
+{
+ std::unique_ptr<yaml_value> key;
+ yaml_value* node;
+
+ parser_stack(yaml_value* _node) : node(_node) {}
+ parser_stack(const parser_stack&) = delete;
+ parser_stack(parser_stack&& r) : key(std::move(r.key)), node(r.node) {}
+};
+
+typedef std::unique_ptr<yaml_value> document_root_type;
+
+class handler
+{
+ std::vector<document_root_type> m_docs;
+
+ std::vector<parser_stack> m_stack;
+ std::vector<parser_stack> m_key_stack;
+
+ document_root_type m_root;
+ document_root_type m_key_root;
+
+ bool m_in_document;
+
+#if ORCUS_DEBUG_YAML_TREE
+ void print_stack()
+ {
+ std::ostringstream os;
+ os << '(';
+ for (auto i = m_stack.begin(), ie = m_stack.end(); i != ie; ++i)
+ os << i->node->print() << ',';
+ os << ')';
+ std::cout << os.str() << std::endl;
+ }
+#endif
+
+ yaml_value* push_value(std::unique_ptr<yaml_value>&& value)
+ {
+ assert(!m_stack.empty());
+ parser_stack& cur = m_stack.back();
+
+ switch (cur.node->type)
+ {
+ case node_t::sequence:
+ {
+ yaml_value_sequence* yvs = static_cast<yaml_value_sequence*>(cur.node);
+ value->parent = yvs;
+ yvs->value_sequence.push_back(std::move(value));
+ return yvs->value_sequence.back().get();
+ }
+ case node_t::map:
+ {
+ yaml_value_map* yvm = static_cast<yaml_value_map*>(cur.node);
+ value->parent = yvm;
+
+ yvm->key_order.push_back(std::move(cur.key));
+
+ auto r = yvm->value_map.insert(
+ std::make_pair(
+ yvm->key_order.back().get(), std::move(value)));
+
+ return r.first->second.get();
+ }
+ default:
+ break;
+ }
+
+ std::ostringstream os;
+ os << BOOST_CURRENT_FUNCTION << ": unstackable YAML value type (" << cur.node->print() << ").";
+ throw document_error(os.str());
+ }
+
+public:
+ handler() : m_in_document(false) {}
+
+ void begin_parse()
+ {
+ }
+
+ void end_parse()
+ {
+ }
+
+ void begin_document()
+ {
+ assert(!m_in_document);
+ m_in_document = true;
+ m_root.reset();
+ }
+
+ void end_document()
+ {
+ assert(m_stack.empty());
+ m_in_document = false;
+ m_docs.push_back(std::move(m_root));
+ }
+
+ void begin_sequence()
+ {
+ assert(m_in_document);
+
+ if (m_root)
+ {
+ yaml_value* yv = push_value(std::make_unique<yaml_value_sequence>());
+ assert(yv && yv->type == node_t::sequence);
+ m_stack.push_back(parser_stack(yv));
+ }
+ else
+ {
+ m_root = std::make_unique<yaml_value_sequence>();
+ m_stack.push_back(parser_stack(m_root.get()));
+ }
+ }
+
+ void end_sequence()
+ {
+ assert(!m_stack.empty());
+ m_stack.pop_back();
+ }
+
+ void begin_map()
+ {
+ assert(m_in_document);
+ if (m_root)
+ {
+ yaml_value* yv = push_value(std::make_unique<yaml_value_map>());
+ assert(yv && yv->type == node_t::map);
+ m_stack.push_back(parser_stack(yv));
+ }
+ else
+ {
+ m_root = std::make_unique<yaml_value_map>();
+ m_stack.push_back(parser_stack(m_root.get()));
+ }
+ }
+
+ void begin_map_key()
+ {
+ assert(!m_key_root);
+ assert(m_key_stack.empty());
+ m_key_root.swap(m_root);
+ m_key_stack.swap(m_stack);
+ }
+
+ void end_map_key()
+ {
+ m_key_root.swap(m_root);
+ m_key_stack.swap(m_stack);
+
+ assert(!m_stack.empty());
+ parser_stack& cur = m_stack.back();
+ cur.key.swap(m_key_root);
+ m_key_stack.clear();
+ m_key_root.reset();
+ }
+
+ void end_map()
+ {
+ assert(!m_stack.empty());
+ m_stack.pop_back();
+ }
+
+ void string(std::string_view v)
+ {
+ assert(m_in_document);
+
+ if (m_root)
+ {
+ yaml_value* yv = push_value(std::make_unique<yaml_value_string>(v));
+ assert(yv && yv->type == node_t::string);
+ }
+ else
+ m_root = std::make_unique<yaml_value_string>(v);
+ }
+
+ void number(double val)
+ {
+ assert(m_in_document);
+ if (m_root)
+ {
+ yaml_value* yv = push_value(std::make_unique<yaml_value_number>(val));
+ assert(yv && yv->type == node_t::number);
+ }
+ else
+ m_root = std::make_unique<yaml_value_number>(val);
+ }
+
+ void boolean_true()
+ {
+ assert(m_in_document);
+ if (m_root)
+ {
+ yaml_value* yv = push_value(std::make_unique<yaml_value>(node_t::boolean_true));
+ assert(yv && yv->type == node_t::boolean_true);
+ }
+ else
+ m_root = std::make_unique<yaml_value>(node_t::boolean_true);
+ }
+
+ void boolean_false()
+ {
+ assert(m_in_document);
+ if (m_root)
+ {
+ yaml_value* yv = push_value(std::make_unique<yaml_value>(node_t::boolean_false));
+ assert(yv && yv->type == node_t::boolean_false);
+ }
+ else
+ m_root = std::make_unique<yaml_value>(node_t::boolean_false);
+ }
+
+ void null()
+ {
+ assert(m_in_document);
+ if (m_root)
+ {
+ yaml_value* yv = push_value(std::make_unique<yaml_value>(node_t::null));
+ assert(yv && yv->type == node_t::null);
+ }
+ else
+ m_root = std::make_unique<yaml_value>(node_t::null);
+ }
+
+ void swap(std::vector<document_root_type>& docs)
+ {
+ m_docs.swap(docs);
+ }
+};
+
+} // anonymous namespace
+
+struct document_tree::impl
+{
+ std::vector<document_root_type> m_docs;
+};
+
+struct const_node::impl
+{
+ const yaml_value* m_node;
+
+ impl(const yaml_value* yv) : m_node(yv) {}
+};
+
+const_node::const_node(const yaml_value* yv) : mp_impl(std::make_unique<impl>(yv)) {}
+const_node::const_node(const const_node& other) : mp_impl(std::make_unique<impl>(other.mp_impl->m_node)) {}
+const_node::const_node(const_node&& rhs) : mp_impl(std::move(rhs.mp_impl)) {}
+const_node::~const_node() {}
+
+const_node& const_node::operator=(const const_node& other)
+{
+ if (this == &other)
+ return *this;
+
+ const_node tmp(other);
+ mp_impl.swap(tmp.mp_impl);
+ return *this;
+}
+
+uintptr_t const_node::identity() const
+{
+ return reinterpret_cast<uintptr_t>(mp_impl->m_node);
+}
+
+node_t const_node::type() const
+{
+ return mp_impl->m_node->type;
+}
+
+size_t const_node::child_count() const
+{
+ switch (mp_impl->m_node->type)
+ {
+ case node_t::map:
+ return static_cast<const yaml_value_map*>(mp_impl->m_node)->value_map.size();
+ case node_t::sequence:
+ return static_cast<const yaml_value_sequence*>(mp_impl->m_node)->value_sequence.size();
+ case node_t::string:
+ case node_t::number:
+ case node_t::boolean_true:
+ case node_t::boolean_false:
+ case node_t::null:
+ case node_t::unset:
+ default:
+ ;
+ }
+ return 0;
+}
+
+std::vector<const_node> const_node::keys() const
+{
+ if (mp_impl->m_node->type != node_t::map)
+ throw document_error("node::keys: this node is not of map type.");
+
+ const yaml_value_map* yvm = static_cast<const yaml_value_map*>(mp_impl->m_node);
+ std::vector<const_node> keys;
+ std::for_each(yvm->key_order.begin(), yvm->key_order.end(),
+ [&](const std::unique_ptr<yaml_value>& key)
+ {
+ keys.push_back(const_node(key.get()));
+ }
+ );
+
+ return keys;
+}
+
+const_node const_node::key(size_t index) const
+{
+ if (mp_impl->m_node->type != node_t::map)
+ throw document_error("node::key: this node is not of map type.");
+
+ const yaml_value_map* yvm = static_cast<const yaml_value_map*>(mp_impl->m_node);
+ if (index >= yvm->key_order.size())
+ throw std::out_of_range("node::key: index is out-of-range.");
+
+ return const_node(yvm->key_order[index].get());
+}
+
+const_node const_node::child(size_t index) const
+{
+ switch (mp_impl->m_node->type)
+ {
+ case node_t::map:
+ {
+ const yaml_value_map* yvm = static_cast<const yaml_value_map*>(mp_impl->m_node);
+ if (index >= yvm->key_order.size())
+ throw std::out_of_range("node::child: index is out-of-range");
+
+ const yaml_value* key = yvm->key_order[index].get();
+ auto it = yvm->value_map.find(key);
+ assert(it != yvm->value_map.end());
+ return const_node(it->second.get());
+ }
+ break;
+ case node_t::sequence:
+ {
+ const yaml_value_sequence* yvs = static_cast<const yaml_value_sequence*>(mp_impl->m_node);
+ if (index >= yvs->value_sequence.size())
+ throw std::out_of_range("node::child: index is out-of-range");
+
+ return const_node(yvs->value_sequence[index].get());
+ }
+ break;
+ case node_t::string:
+ case node_t::number:
+ case node_t::boolean_true:
+ case node_t::boolean_false:
+ case node_t::null:
+ case node_t::unset:
+ default:
+ throw document_error("node::child: this node cannot have child nodes.");
+ }
+}
+
+const_node const_node::child(const const_node& key) const
+{
+ if (mp_impl->m_node->type != node_t::map)
+ throw document_error("node::child: this node is not of map type.");
+
+ const yaml_value_map* yvm = static_cast<const yaml_value_map*>(mp_impl->m_node);
+ auto it = yvm->value_map.find(key.mp_impl->m_node);
+ if (it == yvm->value_map.end())
+ throw document_error("node::child: this map does not have the specified key.");
+
+ return const_node(it->second.get());
+}
+
+const_node const_node::parent() const
+{
+ if (!mp_impl->m_node->parent)
+ throw document_error("node::parent: this node has no parent.");
+
+ return const_node(mp_impl->m_node->parent);
+}
+
+std::string_view const_node::string_value() const
+{
+ if (mp_impl->m_node->type != node_t::string)
+ throw document_error("node::key: current node is not of string type.");
+
+ const yaml_value_string* yvs = static_cast<const yaml_value_string*>(mp_impl->m_node);
+ return yvs->value_string;
+}
+
+double const_node::numeric_value() const
+{
+ if (mp_impl->m_node->type != node_t::number)
+ throw document_error("node::key: current node is not of numeric type.");
+
+ const yaml_value_number* yvn = static_cast<const yaml_value_number*>(mp_impl->m_node);
+ return yvn->value_number;
+}
+
+document_tree::document_tree() :
+ mp_impl(std::make_unique<impl>()) {}
+
+document_tree::document_tree(document_tree&& other) :
+ mp_impl(std::move(other.mp_impl)) {}
+
+document_tree::~document_tree() {}
+
+void document_tree::load(std::string_view s)
+{
+ handler hdl;
+ yaml_parser<handler> parser(s, hdl);
+ parser.parse();
+ hdl.swap(mp_impl->m_docs);
+}
+
+size_t document_tree::get_document_count() const
+{
+ return mp_impl->m_docs.size();
+}
+
+const_node document_tree::get_document_root(size_t index) const
+{
+ return const_node(mp_impl->m_docs[index].get());
+}
+
+namespace {
+
+const char* indent = " ";
+const char* kw_true = "true";
+const char* kw_false = "false";
+const char* kw_tilde = "~";
+const char* kw_null = "null";
+
+const char quote = '"';
+
+void dump_indent(std::ostringstream& os, size_t scope)
+{
+ for (size_t i = 0; i < scope; ++i)
+ os << indent;
+}
+
+bool needs_quoting(const std::string& s)
+{
+ // See if it contains certain characters...
+ for (auto it = s.begin(), ite = s.end(); it != ite; ++it)
+ if (is_in(*it, "#'"))
+ return true;
+
+ // See if the whole string is parsed as a number.
+ const char* p = s.data();
+ const char* p_end = p + s.size();
+ double v;
+ p = parse_numeric(p, p_end, v);
+ if (p == p_end)
+ return true;
+
+ return false;
+}
+
+void dump_yaml_string(std::ostringstream& os, const std::string& s)
+{
+ if (needs_quoting(s))
+ os << quote << s << quote;
+ else
+ os << s;
+}
+
+void dump_yaml_map(std::ostringstream& os, const yaml_value& node, size_t scope);
+void dump_yaml_sequence(std::ostringstream& os, const yaml_value& node, size_t scope);
+
+void dump_yaml_node(std::ostringstream& os, const yaml_value& node, size_t scope)
+{
+ switch (node.type)
+ {
+ case node_t::map:
+ dump_yaml_map(os, node, scope);
+ break;
+ case node_t::sequence:
+ dump_yaml_sequence(os, node, scope);
+ break;
+ case node_t::boolean_true:
+ dump_indent(os, scope);
+ os << kw_true << std::endl;
+ break;
+ case node_t::boolean_false:
+ dump_indent(os, scope);
+ os << kw_false << std::endl;
+ break;
+ case node_t::null:
+ dump_indent(os, scope);
+ os << kw_tilde << std::endl;
+ break;
+ case node_t::number:
+ dump_indent(os, scope);
+ os << static_cast<const yaml_value_number&>(node).value_number << std::endl;
+ break;
+ case node_t::string:
+ dump_indent(os, scope);
+ dump_yaml_string(os, static_cast<const yaml_value_string&>(node).value_string);
+ os << std::endl;
+ break;
+ case node_t::unset:
+ default:
+ ;
+ }
+}
+
+void dump_yaml_container_item(std::ostringstream& os, const yaml_value& node, size_t scope)
+{
+ switch (node.type)
+ {
+ case node_t::map:
+ case node_t::sequence:
+ // End the line and dump this child container in the next scope.
+ os << std::endl;
+ dump_yaml_node(os, node, scope+1);
+ break;
+ default:
+ // Dump inline.
+ os << " ";
+ dump_yaml_node(os, node, 0);
+ }
+}
+
+void dump_yaml_map(std::ostringstream& os, const yaml_value& node, size_t scope)
+{
+ const yaml_value_map& yvm = static_cast<const yaml_value_map&>(node);
+
+ std::for_each(yvm.key_order.begin(), yvm.key_order.end(),
+ [&](const std::unique_ptr<yaml_value>& pkey)
+ {
+ const yaml_value* key = pkey.get();
+
+ switch (key->type)
+ {
+ case node_t::map:
+ // TODO
+ break;
+ case node_t::sequence:
+ // TODO
+ break;
+ case node_t::boolean_true:
+ dump_indent(os, scope);
+ os << kw_true;
+ break;
+ case node_t::boolean_false:
+ dump_indent(os, scope);
+ os << kw_false;
+ break;
+ case node_t::null:
+ dump_indent(os, scope);
+ os << kw_tilde;
+ break;
+ case node_t::number:
+ dump_indent(os, scope);
+ os << static_cast<const yaml_value_number*>(key)->value_number;
+ break;
+ case node_t::string:
+ dump_indent(os, scope);
+ dump_yaml_string(os, static_cast<const yaml_value_string*>(key)->value_string);
+ break;
+ case node_t::unset:
+ default:
+ ;
+ }
+
+ os << ":";
+ auto it = yvm.value_map.find(key);
+ assert(it != yvm.value_map.end());
+ const yaml_value& value = *it->second;
+ dump_yaml_container_item(os, value, scope);
+ }
+ );
+}
+
+void dump_yaml_sequence(std::ostringstream& os, const yaml_value& node, size_t scope)
+{
+ const yaml_value_sequence& yvs = static_cast<const yaml_value_sequence&>(node);
+
+ std::for_each(yvs.value_sequence.begin(), yvs.value_sequence.end(),
+ [&](const std::unique_ptr<yaml_value>& p)
+ {
+ const yaml_value& child = *p;
+ dump_indent(os, scope);
+ os << "-";
+ dump_yaml_container_item(os, child, scope);
+ }
+ );
+}
+
+void dump_yaml_document(std::ostringstream& os, const yaml_value& root)
+{
+ os << "---" << std::endl;
+ dump_yaml_node(os, root, 0);
+}
+
+void dump_json_node(std::ostringstream& os, const yaml_value& node, size_t scope, const std::string* key);
+
+void dump_json_item(
+ std::ostringstream& os, const std::string* key, const yaml_value& val,
+ size_t scope, bool sep)
+{
+ dump_json_node(os, val, scope+1, key);
+ if (sep)
+ os << ",";
+ os << std::endl;
+}
+
+void dump_json_node(std::ostringstream& os, const yaml_value& node, size_t scope, const std::string* key = nullptr)
+{
+ dump_indent(os, scope);
+
+ if (key)
+ {
+ os << quote << *key << quote << ": ";
+ }
+
+ switch (node.type)
+ {
+ case node_t::map:
+ {
+ auto& key_order = static_cast<const yaml_value_map&>(node).key_order;
+ auto& vals = static_cast<const yaml_value_map&>(node).value_map;
+ os << "{" << std::endl;
+ size_t n = vals.size();
+
+ // Dump them based on key's original ordering.
+ size_t pos = 0;
+ for (auto it = key_order.begin(), ite = key_order.end(); it != ite; ++it, ++pos)
+ {
+ const yaml_value* this_key = it->get();
+ if (this_key->type != node_t::string)
+ throw document_error("JSON doesn't support non-string key.");
+
+ auto val_pos = vals.find(this_key);
+ assert(val_pos != vals.end());
+
+ dump_json_item(
+ os,
+ &static_cast<const yaml_value_string*>(this_key)->value_string,
+ *val_pos->second, scope, pos < (n-1));
+ }
+
+ dump_indent(os, scope);
+ os << "}";
+ }
+ break;
+ case node_t::sequence:
+ {
+ auto& vals = static_cast<const yaml_value_sequence&>(node).value_sequence;
+ os << "[" << std::endl;
+ size_t n = vals.size();
+ size_t pos = 0;
+ for (auto it = vals.begin(), ite = vals.end(); it != ite; ++it, ++pos)
+ dump_json_item(os, nullptr, **it, scope, pos < (n-1));
+
+ dump_indent(os, scope);
+ os << "]";
+ }
+ break;
+ case node_t::boolean_true:
+ os << kw_true;
+ break;
+ case node_t::boolean_false:
+ os << kw_false;
+ break;
+ case node_t::null:
+ os << kw_null;
+ break;
+ case node_t::number:
+ os << static_cast<const yaml_value_number&>(node).value_number;
+ break;
+ case node_t::string:
+ json::dump_string(os, static_cast<const yaml_value_string&>(node).value_string);
+ break;
+ case node_t::unset:
+ default:
+ ;
+ }
+}
+
+const char* warning_multiple_documents =
+"warning: this YAML file contains multiple documents. Only the first document\n"
+"will be written.";
+
+}
+
+std::string document_tree::dump_yaml() const
+{
+ std::ostringstream os;
+
+ std::for_each(
+ mp_impl->m_docs.begin(), mp_impl->m_docs.end(),
+ [&](const document_root_type& root)
+ {
+ dump_yaml_document(os, *root);
+ }
+ );
+
+ return os.str();
+}
+
+std::string document_tree::dump_json() const
+{
+ if (mp_impl->m_docs.empty())
+ return std::string();
+
+ if (mp_impl->m_docs.size() > 1)
+ std::cerr << warning_multiple_documents << std::endl;
+
+ const yaml_value& root = *mp_impl->m_docs.front();
+
+ std::ostringstream os;
+ dump_json_node(os, root, 0);
+
+ os << std::endl;
+
+ return os.str();
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/liborcus/yaml_document_tree_test.cpp b/src/liborcus/yaml_document_tree_test.cpp
new file mode 100644
index 0000000..cb674ea
--- /dev/null
+++ b/src/liborcus/yaml_document_tree_test.cpp
@@ -0,0 +1,642 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/yaml_document_tree.hpp"
+#include "orcus/stream.hpp"
+#include "orcus/yaml_parser_base.hpp"
+
+#include <cassert>
+#include <iostream>
+#include <cmath>
+
+#include "filesystem_env.hpp"
+
+using namespace orcus;
+using namespace std;
+
+bool string_expected(const yaml::const_node& node, const char* expected)
+{
+ if (node.type() != yaml::node_t::string)
+ return false;
+
+ if (node.string_value() == expected)
+ return true;
+
+ cerr << "expected='" << expected << "', actual='" << node.string_value() << "'" << endl;
+ return false;
+}
+
+bool number_expected(
+ const yaml::const_node& node, double expected,
+ double decimal = 0.0, double exponent = 0.0)
+{
+ if (node.type() != yaml::node_t::number)
+ return false;
+
+ double actual = node.numeric_value();
+ if (!decimal || !exponent)
+ return actual == expected;
+
+ // Remove the exponent component.
+ actual /= std::pow(10.0, exponent);
+ expected /= std::pow(10.0, exponent);
+
+ // Only compare down to the specified decimal place.
+ actual *= std::pow(10.0, decimal);
+ expected *= std::pow(10.0, decimal);
+
+ actual = std::round(actual);
+ expected = std::round(expected);
+
+ return actual == expected;
+}
+
+yaml::document_tree load_doc(const char* filepath)
+{
+ cout << filepath << endl;
+ file_content strm(filepath);
+ cout << strm.str() << endl;
+ yaml::document_tree doc;
+ doc.load(strm.str());
+
+ return doc;
+}
+
+void test_yaml_invalids()
+{
+ // Get all yaml files in this directory.
+ fs::path dirpath(SRCDIR"/test/yaml/invalids/");
+ fs::directory_iterator it_end;
+
+ size_t file_count = 0;
+
+ for (fs::directory_iterator it(dirpath); it != it_end; ++it)
+ {
+ auto path = it->path();
+ if (!fs::is_regular_file(path))
+ continue;
+
+ if (path.extension().string() != ".yaml")
+ continue;
+
+ ++file_count;
+
+ file_content strm(path.string().data());
+ yaml::document_tree doc;
+
+ try
+ {
+ doc.load(strm.str());
+ assert(!"yaml::parse_error was not thrown, but expected to be.");
+ }
+ catch (const parse_error&)
+ {
+ // This is expected.
+ }
+ }
+
+ assert(file_count > 0);
+}
+
+void test_yaml_parse_basic1()
+{
+ yaml::document_tree doc = load_doc(SRCDIR"/test/yaml/basic1/input.yaml");
+
+ assert(doc.get_document_count() == 1);
+
+ // Document root is a map node with 4 elements.
+ yaml::const_node root = doc.get_document_root(0);
+ uintptr_t root_id = root.identity();
+ assert(root.type() == yaml::node_t::map);
+ assert(root.child_count() == 4);
+
+ std::vector<yaml::const_node> keys = root.keys();
+ assert(keys.size() == 4);
+
+ yaml::const_node key = keys[0];
+ assert(key.type() == yaml::node_t::string);
+ assert(key.string_value() == "dict");
+
+ key = keys[1];
+ assert(key.type() == yaml::node_t::string);
+ assert(key.string_value() == "list");
+
+ key = keys[2];
+ assert(key.type() == yaml::node_t::string);
+ assert(key.string_value() == "number");
+
+ key = keys[3];
+ assert(key.type() == yaml::node_t::string);
+ assert(key.string_value() == "string");
+
+ // first child is a map.
+ yaml::const_node node = root.child(keys[0]);
+ assert(node.type() == yaml::node_t::map);
+ assert(node.child_count() == 3);
+
+ key = node.key(0);
+ assert(key.type() == yaml::node_t::string);
+ assert(key.string_value() == "a");
+
+ key = node.key(1);
+ assert(key.type() == yaml::node_t::string);
+ assert(key.string_value() == "b");
+
+ key = node.key(2);
+ assert(key.type() == yaml::node_t::string);
+ assert(key.string_value() == "c");
+
+ node = node.child(0);
+ assert(node.type() == yaml::node_t::number);
+ assert(node.numeric_value() == 1.0);
+ node = node.parent();
+
+ node = node.child(1);
+ assert(node.type() == yaml::node_t::number);
+ assert(node.numeric_value() == 2.0);
+ node = node.parent();
+
+ node = node.child(2);
+ assert(node.type() == yaml::node_t::sequence);
+ assert(node.child_count() == 2);
+ yaml::const_node child = node.child(0);
+ assert(child.type() == yaml::node_t::string);
+ assert(child.string_value() == "foo");
+ child = node.child(1);
+ assert(child.type() == yaml::node_t::string);
+ assert(child.string_value() == "bar");
+
+ // Go up to the root node.
+ node = node.parent().parent();
+ assert(node.type() == yaml::node_t::map);
+ assert(node.identity() == root_id);
+
+ node = node.child(keys[1]);
+ assert(node.type() == yaml::node_t::sequence);
+ assert(node.child_count() == 3);
+
+ node = node.child(0);
+ assert(node.type() == yaml::node_t::number);
+ assert(node.numeric_value() == 1.0);
+ node = node.parent();
+
+ node = node.child(1);
+ assert(node.type() == yaml::node_t::number);
+ assert(node.numeric_value() == 2.0);
+ node = node.parent();
+
+ node = node.child(2);
+ assert(node.type() == yaml::node_t::map);
+ assert(node.child_count() == 3);
+
+ key = node.key(0);
+ assert(key.type() == yaml::node_t::string);
+ assert(key.string_value() == "a");
+
+ key = node.key(1);
+ assert(key.type() == yaml::node_t::string);
+ assert(key.string_value() == "b");
+
+ key = node.key(2);
+ assert(key.type() == yaml::node_t::string);
+ assert(key.string_value() == "c");
+
+ node = node.child(0);
+ assert(node.type() == yaml::node_t::number);
+ assert(node.numeric_value() == 1.1);
+ node = node.parent();
+
+ node = node.child(1);
+ assert(node.type() == yaml::node_t::number);
+ assert(node.numeric_value() == 1.2);
+ node = node.parent();
+
+ node = node.child(2);
+ assert(node.type() == yaml::node_t::number);
+ assert(node.numeric_value() == 1.3);
+ node = node.parent();
+
+ node = node.parent().parent(); // back to the root.
+ assert(node.identity() == root_id);
+
+ key = node.key(2);
+ assert(key.type() == yaml::node_t::string);
+ assert(key.string_value() == "number");
+
+ key = node.key(3);
+ assert(key.type() == yaml::node_t::string);
+ assert(key.string_value() == "string");
+
+ node = node.child(2);
+ assert(node.type() == yaml::node_t::number);
+ assert(node.numeric_value() == 12.3);
+ node = node.parent();
+
+ node = node.child(3);
+ assert(node.type() == yaml::node_t::string);
+ assert(node.string_value() == "foo");
+ node = node.parent();
+}
+
+void test_yaml_parse_basic2()
+{
+ yaml::document_tree doc = load_doc(SRCDIR"/test/yaml/basic2/input.yaml");
+
+ assert(doc.get_document_count() == 1);
+ yaml::const_node node = doc.get_document_root(0);
+
+ assert(node.type() == yaml::node_t::sequence);
+ assert(node.child_count() == 3);
+
+ node = node.child(0);
+ assert(node.type() == yaml::node_t::number);
+ assert(node.numeric_value() == 1);
+ node = node.parent();
+
+ node = node.child(1);
+ assert(node.type() == yaml::node_t::number);
+ assert(node.numeric_value() == 2);
+ node = node.parent();
+
+ node = node.child(2);
+ assert(node.type() == yaml::node_t::number);
+ assert(node.numeric_value() == 3);
+ node = node.parent();
+}
+
+void test_yaml_parse_basic3()
+{
+ yaml::document_tree doc = load_doc(SRCDIR"/test/yaml/basic3/input.yaml");
+
+ assert(doc.get_document_count() == 1);
+ yaml::const_node node = doc.get_document_root(0);
+
+ assert(node.type() == yaml::node_t::sequence);
+ assert(node.child_count() == 2);
+
+ node = node.child(0);
+ assert(node.type() == yaml::node_t::map);
+ assert(node.child_count() == 3);
+
+ assert(string_expected(node.key(0), "a"));
+ assert(string_expected(node.key(1), "b"));
+ assert(string_expected(node.key(2), "c"));
+
+ assert(number_expected(node.child(0), 1));
+ assert(number_expected(node.child(1), 2));
+ assert(number_expected(node.child(2), 3));
+
+ node = node.parent();
+
+ node = node.child(1);
+ assert(node.type() == yaml::node_t::map);
+ assert(node.child_count() == 3);
+
+ assert(string_expected(node.key(0), "d"));
+ assert(string_expected(node.key(1), "e"));
+ assert(string_expected(node.key(2), "f"));
+
+ assert(number_expected(node.child(0), 4));
+ assert(number_expected(node.child(1), 5));
+ assert(number_expected(node.child(2), 6));
+}
+
+void test_yaml_parse_null()
+{
+ yaml::document_tree doc = load_doc(SRCDIR"/test/yaml/null/input.yaml");
+
+ assert(doc.get_document_count() == 1);
+ yaml::const_node node = doc.get_document_root(0);
+
+ assert(node.type() == yaml::node_t::sequence);
+ assert(node.child_count() == 6);
+
+ node = node.child(0);
+ assert(node.type() == yaml::node_t::null);
+ node = node.parent();
+
+ node = node.child(1);
+ assert(node.type() == yaml::node_t::null);
+ node = node.parent();
+
+ node = node.child(2);
+ assert(node.type() == yaml::node_t::null);
+ node = node.parent();
+
+ node = node.child(3);
+ assert(node.type() == yaml::node_t::null);
+ node = node.parent();
+
+ node = node.child(4);
+ assert(node.type() == yaml::node_t::string);
+ assert(node.string_value() == "nULL");
+ node = node.parent();
+
+ node = node.child(5);
+ assert(node.type() == yaml::node_t::string);
+ assert(node.string_value() == "NUll");
+ node = node.parent();
+}
+
+void test_yaml_parse_boolean()
+{
+ yaml::document_tree doc = load_doc(SRCDIR"/test/yaml/boolean/input.yaml");
+
+ assert(doc.get_document_count() == 1);
+ yaml::const_node node = doc.get_document_root(0);
+
+ assert(node.type() == yaml::node_t::map);
+ assert(node.child_count() == 3);
+
+ yaml::const_node key = node.key(0);
+ assert(key.type() == yaml::node_t::string);
+ assert(key.string_value() == "positive");
+
+ key = node.key(1);
+ assert(key.type() == yaml::node_t::string);
+ assert(key.string_value() == "negative");
+
+ key = node.key(2);
+ assert(key.type() == yaml::node_t::string);
+ assert(key.string_value() == "non boolean");
+
+ // list of boolean true's.
+ node = node.child(0);
+ assert(node.type() == yaml::node_t::sequence);
+ assert(node.child_count() == 11);
+ for (size_t i = 0; i < node.child_count(); ++i)
+ {
+ yaml::const_node child = node.child(i);
+ assert(child.type() == yaml::node_t::boolean_true);
+ }
+ node = node.parent();
+
+ // list of boolean false's.
+ node = node.child(1);
+ assert(node.type() == yaml::node_t::sequence);
+ assert(node.child_count() == 11);
+ for (size_t i = 0; i < node.child_count(); ++i)
+ {
+ yaml::const_node child = node.child(i);
+ assert(child.type() == yaml::node_t::boolean_false);
+ }
+ node = node.parent();
+
+ // list of strings.
+ const char* values[] = {
+ "yES",
+ "nO",
+ "tRUE",
+ "faLSE",
+ "oN",
+ "oFF"
+ };
+
+ node = node.child(2);
+ assert(node.type() == yaml::node_t::sequence);
+ assert(node.child_count() == std::size(values));
+
+ for (size_t i = 0; i < std::size(values); ++i)
+ {
+ node = node.child(i);
+ assert(node.type() == yaml::node_t::string);
+ assert(node.string_value() == values[i]);
+ node = node.parent();
+ }
+}
+
+void test_yaml_parse_quoted_string()
+{
+ yaml::document_tree doc = load_doc(SRCDIR"/test/yaml/quoted-string/input.yaml");
+
+ assert(doc.get_document_count() == 1);
+ yaml::const_node node = doc.get_document_root(0);
+
+ assert(node.type() == yaml::node_t::map);
+ assert(node.child_count() == 3);
+
+ assert(string_expected(node.key(0), "I am quoted: ~ "));
+ assert(string_expected(node.key(1), "list with quoted string values"));
+ assert(string_expected(node.key(2), "single quoted string values"));
+ assert(string_expected(node.child(0), "Here is another quote."));
+
+ node = node.child(1);
+
+ {
+ // list of strings.
+ const char* values[] = {
+ "1 2 3",
+ "null",
+ "true",
+ "false",
+ "#hashtag",
+ "\"quoted inside\"",
+ "'single quote inside'",
+ "Japan's finest beer"
+ };
+
+ size_t n = std::size(values);
+ assert(node.type() == yaml::node_t::sequence);
+ assert(node.child_count() == n);
+
+ for (size_t i = 0; i < n; ++i)
+ assert(string_expected(node.child(i), values[i]));
+ }
+
+ node = node.parent().child(2);
+
+ {
+ // list of strings.
+ const char* values[] = {
+ "8.8.8.8",
+ "'single quote inside'",
+ "prefix 'quoted' suffix",
+ "\"double quote\"",
+ "before \"quote\" after",
+ "http://www.google.com",
+ "'''",
+ " ' ' ' ",
+ "#hashtag"
+ };
+
+ size_t n = std::size(values);
+ assert(node.type() == yaml::node_t::sequence);
+ assert(node.child_count() == n);
+
+ for (size_t i = 0; i < n; ++i)
+ assert(string_expected(node.child(i), values[i]));
+ }
+}
+
+void test_yaml_parse_multi_line_1()
+{
+ yaml::document_tree doc = load_doc(SRCDIR"/test/yaml/multi-line-1/input.yaml");
+
+ assert(doc.get_document_count() == 1);
+ yaml::const_node node = doc.get_document_root(0);
+ assert(string_expected(node, "1 2 3"));
+ assert(node.child_count() == 0);
+}
+
+void test_yaml_parse_multi_line_2()
+{
+ yaml::document_tree doc = load_doc(SRCDIR"/test/yaml/multi-line-2/input.yaml");
+
+ assert(doc.get_document_count() == 1);
+ yaml::const_node node = doc.get_document_root(0);
+ assert(string_expected(node, "1 - 2 - 3"));
+ assert(node.child_count() == 0);
+}
+
+void test_yaml_parse_literal_block_1()
+{
+ yaml::document_tree doc = load_doc(SRCDIR"/test/yaml/literal-block-1/input.yaml");
+
+ assert(doc.get_document_count() == 1);
+ yaml::const_node node = doc.get_document_root(0);
+
+ assert(string_expected(node, "line 1\n line 2\nline 3\n2 blanks follow "));
+ assert(node.child_count() == 0);
+}
+
+void test_yaml_parse_literal_block_2()
+{
+ yaml::document_tree doc = load_doc(SRCDIR"/test/yaml/literal-block-2/input.yaml");
+
+ assert(doc.get_document_count() == 1);
+ yaml::const_node node = doc.get_document_root(0);
+
+ assert(node.type() == yaml::node_t::map);
+ assert(node.child_count() == 2);
+
+ assert(string_expected(node.key(0), "literal block"));
+ assert(string_expected(node.child(0), "line 1\n line 2\n line 3"));
+ assert(string_expected(node.key(1), "multi line"));
+ assert(string_expected(node.child(1), "line 1 line 2 line 3"));
+}
+
+void test_yaml_parse_url()
+{
+ yaml::document_tree doc = load_doc(SRCDIR"/test/yaml/url/input.yaml");
+
+ assert(doc.get_document_count() == 1);
+ yaml::const_node node = doc.get_document_root(0);
+
+ assert(node.type() == yaml::node_t::sequence);
+ assert(node.child_count() == 3);
+
+ assert(string_expected(node.child(0), "http://www.google.com/"));
+ assert(string_expected(node.child(1), "mailto:joe@joe-me.com"));
+
+ node = node.child(2);
+ assert(node.type() == yaml::node_t::map);
+ assert(node.child_count() == 2);
+
+ assert(string_expected(node.key(0), "orcus-url"));
+ assert(string_expected(node.key(1), "debian-bugs"));
+ assert(string_expected(node.child(0), "http://gitlab.com/orcus/orcus"));
+ assert(string_expected(node.child(1), "mailto:submit@bugs.debian.org"));
+}
+
+void test_yaml_parse_empty_value_map_1()
+{
+ yaml::document_tree doc = load_doc(SRCDIR"/test/yaml/empty-value-map-1/input.yaml");
+
+ assert(doc.get_document_count() == 1);
+ yaml::const_node node = doc.get_document_root(0);
+
+ assert(node.type() == yaml::node_t::map);
+ assert(node.child_count() == 1);
+
+ assert(string_expected(node.key(0), "key"));
+ assert(node.child(0).type() == yaml::node_t::null);
+}
+
+void test_yaml_parse_empty_value_map_2()
+{
+ yaml::document_tree doc = load_doc(SRCDIR"/test/yaml/empty-value-map-2/input.yaml");
+
+ assert(doc.get_document_count() == 1);
+ yaml::const_node node = doc.get_document_root(0);
+
+ assert(node.type() == yaml::node_t::map);
+ assert(node.child_count() == 2);
+
+ assert(string_expected(node.key(0), "key1"));
+ assert(node.child(0).type() == yaml::node_t::null);
+ assert(string_expected(node.key(1), "key2"));
+ assert(node.child(1).type() == yaml::node_t::null);
+}
+
+void test_yaml_parse_empty_value_sequence_1()
+{
+ yaml::document_tree doc = load_doc(SRCDIR"/test/yaml/empty-value-sequence-1/input.yaml");
+
+ assert(doc.get_document_count() == 1);
+ yaml::const_node node = doc.get_document_root(0);
+
+ assert(node.type() == yaml::node_t::sequence);
+ assert(node.child_count() == 1);
+
+ assert(node.child(0).type() == yaml::node_t::null);
+}
+
+void test_yaml_parse_empty_value_sequence_2()
+{
+ yaml::document_tree doc = load_doc(SRCDIR"/test/yaml/empty-value-sequence-2/input.yaml");
+
+ assert(doc.get_document_count() == 1);
+ yaml::const_node node = doc.get_document_root(0);
+
+ assert(node.type() == yaml::node_t::sequence);
+ assert(node.child_count() == 2);
+
+ assert(node.child(0).type() == yaml::node_t::null);
+ assert(node.child(1).type() == yaml::node_t::null);
+}
+
+void test_yaml_map_key_1()
+{
+ yaml::document_tree doc = load_doc(SRCDIR"/test/yaml/map-key-1/input.yaml");
+
+ assert(doc.get_document_count() == 1);
+ yaml::const_node node = doc.get_document_root(0);
+
+ assert(node.type() == yaml::node_t::map);
+ assert(node.child_count() == 2);
+
+ assert(string_expected(node.key(0), "-key"));
+ assert(string_expected(node.child(0), "value"));
+ assert(string_expected(node.key(1), "key"));
+ assert(string_expected(node.child(1), "value"));
+}
+
+int main()
+{
+ test_yaml_invalids();
+ test_yaml_parse_basic1();
+ test_yaml_parse_basic2();
+ test_yaml_parse_basic3();
+ test_yaml_parse_null();
+ test_yaml_parse_boolean();
+ test_yaml_parse_quoted_string();
+ test_yaml_parse_multi_line_1();
+ test_yaml_parse_multi_line_2();
+ test_yaml_parse_literal_block_1();
+ test_yaml_parse_literal_block_2();
+ test_yaml_parse_url();
+ test_yaml_parse_empty_value_map_1();
+ test_yaml_parse_empty_value_map_2();
+ test_yaml_parse_empty_value_sequence_1();
+ test_yaml_parse_empty_value_sequence_2();
+ test_yaml_map_key_1();
+
+ return EXIT_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+
diff --git a/src/mso/Makefile.am b/src/mso/Makefile.am
new file mode 100644
index 0000000..b21e225
--- /dev/null
+++ b/src/mso/Makefile.am
@@ -0,0 +1,13 @@
+
+AM_CPPFLAGS = \
+ -I$(top_srcdir)/include \
+ -I$(top_srcdir)/src/include \
+ -D__ORCUS_MSO_BUILDING_DLL
+
+lib_LTLIBRARIES = liborcus-mso-@ORCUS_API_VERSION@.la
+liborcus_mso_@ORCUS_API_VERSION@_la_SOURCES = \
+ encryption_info.cpp
+
+liborcus_mso_@ORCUS_API_VERSION@_la_LDFLAGS = -no-undefined
+liborcus_mso_@ORCUS_API_VERSION@_la_LIBADD = \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la
diff --git a/src/mso/Makefile.in b/src/mso/Makefile.in
new file mode 100644
index 0000000..783cdcc
--- /dev/null
+++ b/src/mso/Makefile.in
@@ -0,0 +1,702 @@
+# Makefile.in generated by automake 1.16.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2021 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.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+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@
+subdir = src/mso
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
+ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_17.m4 \
+ $(top_srcdir)/m4/boost.m4 $(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)/m4/m4_ax_valgrind_check.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+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)"
+LTLIBRARIES = $(lib_LTLIBRARIES)
+liborcus_mso_@ORCUS_API_VERSION@_la_DEPENDENCIES = \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la
+am_liborcus_mso_@ORCUS_API_VERSION@_la_OBJECTS = encryption_info.lo
+liborcus_mso_@ORCUS_API_VERSION@_la_OBJECTS = \
+ $(am_liborcus_mso_@ORCUS_API_VERSION@_la_OBJECTS)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+liborcus_mso_@ORCUS_API_VERSION@_la_LINK = $(LIBTOOL) $(AM_V_lt) \
+ --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+ $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \
+ $(liborcus_mso_@ORCUS_API_VERSION@_la_LDFLAGS) $(LDFLAGS) -o \
+ $@
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/encryption_info.Plo
+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_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+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_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(liborcus_mso_@ORCUS_API_VERSION@_la_SOURCES)
+DIST_SOURCES = $(liborcus_mso_@ORCUS_API_VERSION@_la_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__extra_recursive_targets = check-valgrind-recursive \
+ check-valgrind-memcheck-recursive \
+ check-valgrind-helgrind-recursive check-valgrind-drd-recursive \
+ check-valgrind-sgcheck-recursive
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BOOST_CPPFLAGS = @BOOST_CPPFLAGS@
+BOOST_DATE_TIME_LDFLAGS = @BOOST_DATE_TIME_LDFLAGS@
+BOOST_DATE_TIME_LDPATH = @BOOST_DATE_TIME_LDPATH@
+BOOST_DATE_TIME_LIBS = @BOOST_DATE_TIME_LIBS@
+BOOST_FILESYSTEM_LDFLAGS = @BOOST_FILESYSTEM_LDFLAGS@
+BOOST_FILESYSTEM_LDPATH = @BOOST_FILESYSTEM_LDPATH@
+BOOST_FILESYSTEM_LIBS = @BOOST_FILESYSTEM_LIBS@
+BOOST_IOSTREAMS_LDFLAGS = @BOOST_IOSTREAMS_LDFLAGS@
+BOOST_IOSTREAMS_LDPATH = @BOOST_IOSTREAMS_LDPATH@
+BOOST_IOSTREAMS_LIBS = @BOOST_IOSTREAMS_LIBS@
+BOOST_LDPATH = @BOOST_LDPATH@
+BOOST_PROGRAM_OPTIONS_LDFLAGS = @BOOST_PROGRAM_OPTIONS_LDFLAGS@
+BOOST_PROGRAM_OPTIONS_LDPATH = @BOOST_PROGRAM_OPTIONS_LDPATH@
+BOOST_PROGRAM_OPTIONS_LIBS = @BOOST_PROGRAM_OPTIONS_LIBS@
+BOOST_ROOT = @BOOST_ROOT@
+BOOST_SYSTEM_LDFLAGS = @BOOST_SYSTEM_LDFLAGS@
+BOOST_SYSTEM_LDPATH = @BOOST_SYSTEM_LDPATH@
+BOOST_SYSTEM_LIBS = @BOOST_SYSTEM_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CSCOPE = @CSCOPE@
+CTAGS = @CTAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_VALGRIND_drd = @ENABLE_VALGRIND_drd@
+ENABLE_VALGRIND_helgrind = @ENABLE_VALGRIND_helgrind@
+ENABLE_VALGRIND_memcheck = @ENABLE_VALGRIND_memcheck@
+ENABLE_VALGRIND_sgcheck = @ENABLE_VALGRIND_sgcheck@
+ETAGS = @ETAGS@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+HAVE_CXX17 = @HAVE_CXX17@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+IXION_REQUIRED_API_VERSION = @IXION_REQUIRED_API_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBIXION_CFLAGS = @LIBIXION_CFLAGS@
+LIBIXION_LIBS = @LIBIXION_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MDDS_CFLAGS = @MDDS_CFLAGS@
+MDDS_LIBS = @MDDS_LIBS@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+ORCUS_API_VERSION = @ORCUS_API_VERSION@
+ORCUS_MAJOR_VERSION = @ORCUS_MAJOR_VERSION@
+ORCUS_MICRO_VERSION = @ORCUS_MICRO_VERSION@
+ORCUS_MINOR_VERSION = @ORCUS_MINOR_VERSION@
+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@
+PARQUET_CFLAGS = @PARQUET_CFLAGS@
+PARQUET_LIBS = @PARQUET_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POW_LIB = @POW_LIB@
+PYTHON = @PYTHON@
+PYTHON_CFLAGS = @PYTHON_CFLAGS@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VALGRIND = @VALGRIND@
+VALGRIND_ENABLED = @VALGRIND_ENABLED@
+VERSION = @VERSION@
+ZLIB_CFLAGS = @ZLIB_CFLAGS@
+ZLIB_LIBS = @ZLIB_LIBS@
+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@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+runstatedir = @runstatedir@
+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@
+valgrind_enabled_tools = @valgrind_enabled_tools@
+valgrind_tools = @valgrind_tools@
+AM_CPPFLAGS = \
+ -I$(top_srcdir)/include \
+ -I$(top_srcdir)/src/include \
+ -D__ORCUS_MSO_BUILDING_DLL
+
+lib_LTLIBRARIES = liborcus-mso-@ORCUS_API_VERSION@.la
+liborcus_mso_@ORCUS_API_VERSION@_la_SOURCES = \
+ encryption_info.cpp
+
+liborcus_mso_@ORCUS_API_VERSION@_la_LDFLAGS = -no-undefined
+liborcus_mso_@ORCUS_API_VERSION@_la_LIBADD = \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cpp .lo .o .obj
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/mso/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign src/mso/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+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)'; \
+ locs=`for p in $$list; do echo $$p; done | \
+ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+ sort -u`; \
+ test -z "$$locs" || { \
+ echo rm -f $${locs}; \
+ rm -f $${locs}; \
+ }
+
+liborcus-mso-@ORCUS_API_VERSION@.la: $(liborcus_mso_@ORCUS_API_VERSION@_la_OBJECTS) $(liborcus_mso_@ORCUS_API_VERSION@_la_DEPENDENCIES) $(EXTRA_liborcus_mso_@ORCUS_API_VERSION@_la_DEPENDENCIES)
+ $(AM_V_CXXLD)$(liborcus_mso_@ORCUS_API_VERSION@_la_LINK) -rpath $(libdir) $(liborcus_mso_@ORCUS_API_VERSION@_la_OBJECTS) $(liborcus_mso_@ORCUS_API_VERSION@_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/encryption_info.Plo@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.cpp.o:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cpp.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cpp.lo:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+check-valgrind-local:
+check-valgrind-memcheck-local:
+check-valgrind-helgrind-local:
+check-valgrind-drd-local:
+check-valgrind-sgcheck-local:
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @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
+check-am: all-am
+check: check-am
+all-am: Makefile $(LTLIBRARIES)
+installdirs:
+ for dir in "$(DESTDIR)$(libdir)"; 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:
+
+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)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+check-valgrind: check-valgrind-am
+
+check-valgrind-am: check-valgrind-local
+
+check-valgrind-drd: check-valgrind-drd-am
+
+check-valgrind-drd-am: check-valgrind-drd-local
+
+check-valgrind-helgrind: check-valgrind-helgrind-am
+
+check-valgrind-helgrind-am: check-valgrind-helgrind-local
+
+check-valgrind-memcheck: check-valgrind-memcheck-am
+
+check-valgrind-memcheck-am: check-valgrind-memcheck-local
+
+check-valgrind-sgcheck: check-valgrind-sgcheck-am
+
+check-valgrind-sgcheck-am: check-valgrind-sgcheck-local
+
+clean: clean-am
+
+clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -f ./$(DEPDIR)/encryption_info.Plo
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-libLTLIBRARIES
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+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 ./$(DEPDIR)/encryption_info.Plo
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-libLTLIBRARIES
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am am--depfiles check check-am check-valgrind-am \
+ check-valgrind-drd-am check-valgrind-drd-local \
+ check-valgrind-helgrind-am check-valgrind-helgrind-local \
+ check-valgrind-local check-valgrind-memcheck-am \
+ check-valgrind-memcheck-local check-valgrind-sgcheck-am \
+ check-valgrind-sgcheck-local clean clean-generic \
+ clean-libLTLIBRARIES clean-libtool cscopelist-am ctags-am \
+ distclean distclean-compile distclean-generic \
+ distclean-libtool distdir dvi dvi-am html html-am info info-am \
+ install install-am 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-man install-pdf install-pdf-am \
+ 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 \
+ tags-am uninstall uninstall-am uninstall-libLTLIBRARIES
+
+.PRECIOUS: Makefile
+
+
+# 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/src/mso/encryption_info.cpp b/src/mso/encryption_info.cpp
new file mode 100644
index 0000000..bca2bcd
--- /dev/null
+++ b/src/mso/encryption_info.cpp
@@ -0,0 +1,227 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/sax_ns_parser.hpp>
+#include <orcus/xml_namespace.hpp>
+#include <orcus/base64.hpp>
+
+#include "mso/encryption_info.hpp"
+
+#define ORCUS_DEBUG_MSO_ENCRYPTION_INFO 1
+
+#if ORCUS_DEBUG_MSO_ENCRYPTION_INFO
+#include <iostream>
+#endif
+
+#include <vector>
+#include <ostream>
+
+using namespace std;
+
+namespace orcus { namespace mso {
+
+namespace {
+
+const xmlns_id_t NS_mso_encryption = "http://schemas.microsoft.com/office/2006/encryption";
+const xmlns_id_t NS_mso_password = "http://schemas.microsoft.com/office/2006/keyEncryptor/password";
+
+const xmlns_id_t NS_mso_all[] = {
+ NS_mso_encryption,
+ NS_mso_password,
+ nullptr
+};
+
+class char_printer
+{
+ ostream& m_os;
+public:
+ char_printer(ostream& os) : m_os(os) {}
+ void operator() (const char c) const
+ {
+ short v = c;
+ v &= 0x00FF;
+ m_os << hex << uppercase;
+ if (v < 16)
+ m_os << '0';
+ m_os << v << ' ';
+ }
+};
+
+void print_base64(const char* caption, std::string_view base64)
+{
+ cout << caption << " (base64): " << base64 << endl;
+ vector<uint8_t> value = orcus::decode_from_base64(base64);
+ cout << caption << " (binary): ";
+ for_each(value.begin(), value.end(), char_printer(cout));
+ cout << endl;
+}
+
+class key_data_attr_handler
+{
+public:
+ void operator() (const sax_ns_parser_attribute& attr)
+ {
+ if (attr.ns != NS_mso_encryption)
+ // wrong namespace
+ return;
+
+ if (attr.name == "saltSize")
+ cout << "salt size: " << attr.value << endl;
+ else if (attr.name == "blockSize")
+ cout << "block size: " << attr.value << endl;
+ else if (attr.name == "keyBits")
+ cout << "key bits: " << attr.value << endl;
+ else if (attr.name == "hashSize")
+ cout << "hash size: " << attr.value << endl;
+ else if (attr.name == "cipherAlgorithm")
+ cout << "cipher algorithm: " << attr.value << endl;
+ else if (attr.name == "cipherChaining")
+ cout << "cipher chaining: " << attr.value << endl;
+ else if (attr.name == "hashAlgorithm")
+ cout << "hash algorithm: " << attr.value << endl;
+ else if (attr.name == "saltValue")
+ print_base64("salt value", attr.value);
+ }
+};
+
+class data_integrity_attr_handler
+{
+public:
+ void operator() (const sax_ns_parser_attribute& attr)
+ {
+ if (attr.ns != NS_mso_encryption)
+ // wrong namespace
+ return;
+
+ if (attr.name == "encryptedHmacKey")
+ print_base64("encrypted HMAC key", attr.value);
+ else if (attr.name == "encryptedHmacValue")
+ print_base64("encrypted HMAC value", attr.value);
+ }
+};
+
+class password_encrypted_key_attr_handler
+{
+public:
+ void operator() (const sax_ns_parser_attribute& attr)
+ {
+ if (attr.ns != NS_mso_encryption)
+ // wrong namespace
+ return;
+
+ if (attr.name == "spinCount")
+ cout << "spin count: " << attr.value << endl;
+ else if (attr.name == "saltSize")
+ cout << "salt size: " << attr.value << endl;
+ else if (attr.name == "blockSize")
+ cout << "block size: " << attr.value << endl;
+ else if (attr.name == "keyBits")
+ cout << "key bits: " << attr.value << endl;
+ else if (attr.name == "hashSize")
+ cout << "hash size: " << attr.value << endl;
+ else if (attr.name == "cipherAlgorithm")
+ cout << "cipher algorithm: " << attr.value << endl;
+ else if (attr.name == "cipherChaining")
+ cout << "cipher chaining: " << attr.value << endl;
+ else if (attr.name == "hashAlgorithm")
+ cout << "hash algorithm: " << attr.value << endl;
+ else if (attr.name == "saltValue")
+ print_base64("salt value", attr.value);
+ else if (attr.name == "encryptedVerifierHashInput")
+ print_base64("encrypted verifier hash input", attr.value);
+ else if (attr.name == "encryptedVerifierHashValue")
+ print_base64("encrypted verifier hash value", attr.value);
+ else if (attr.name == "encryptedKeyValue")
+ print_base64("encrypted key value", attr.value);
+
+ }
+};
+
+class sax_handler
+{
+ vector<sax_ns_parser_attribute> m_attrs;
+
+public:
+ sax_handler(xmlns_context& /*ns_cxt*/) {}
+ void doctype(const sax::doctype_declaration&) {}
+ void start_declaration(std::string_view) {}
+ void end_declaration(std::string_view) {}
+ void attribute(std::string_view, std::string_view) {}
+
+ void attribute(const sax_ns_parser_attribute& attr)
+ {
+ m_attrs.push_back(attr);
+ }
+
+ void characters(std::string_view, bool) {}
+
+ void start_element(const sax_ns_parser_element& elem)
+ {
+ if (elem.ns == NS_mso_encryption)
+ {
+ if (elem.name == "keyData")
+ {
+ cout << "--- key data" << endl;
+ key_data_attr_handler func;
+ for_each(m_attrs.begin(), m_attrs.end(), func);
+ }
+ else if (elem.name == "dataIntegrity")
+ {
+ cout << "--- data integrity" << endl;
+ data_integrity_attr_handler func;
+ for_each(m_attrs.begin(), m_attrs.end(), func);
+ }
+ }
+ else if (elem.ns == NS_mso_password)
+ {
+ if (elem.name == "encryptedKey")
+ {
+ cout << "--- encrypted key" << endl;
+ password_encrypted_key_attr_handler func;
+ for_each(m_attrs.begin(), m_attrs.end(), func);
+ }
+ }
+
+ m_attrs.clear();
+ }
+
+ void end_element(const sax_ns_parser_element&) {}
+};
+
+}
+
+struct encryption_info_reader_impl
+{
+ orcus::xmlns_repository m_ns_repo;
+
+ encryption_info_reader_impl()
+ {
+ m_ns_repo.add_predefined_values(NS_mso_all);
+ }
+};
+
+encryption_info_reader::encryption_info_reader() :
+ mp_impl(new encryption_info_reader_impl) {}
+
+encryption_info_reader::~encryption_info_reader()
+{
+ delete mp_impl;
+}
+
+void encryption_info_reader::read(const char* p, size_t n)
+{
+#if ORCUS_DEBUG_MSO_ENCRYPTION_INFO
+ cout << "encryption_info_reader::read: stream size=" << n << endl;
+#endif
+ orcus::xmlns_context cxt = mp_impl->m_ns_repo.create_context();
+ sax_handler hdl(cxt);
+ orcus::sax_ns_parser<sax_handler> parser({p, n}, cxt, hdl);
+ parser.parse();
+}
+
+}}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/orcus_css_dump.cpp b/src/orcus_css_dump.cpp
new file mode 100644
index 0000000..f02ba77
--- /dev/null
+++ b/src/orcus_css_dump.cpp
@@ -0,0 +1,35 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/css_document_tree.hpp"
+#include "orcus/stream.hpp"
+
+#include <iostream>
+
+int main(int argc, char** argv)
+{
+ if (argc < 2)
+ return EXIT_FAILURE;
+
+ const char* filepath = argv[1];
+ try
+ {
+ orcus::file_content content(filepath);
+ orcus::css_document_tree doc;
+ doc.load(content.str());
+ doc.dump();
+ }
+ catch (const std::exception& e)
+ {
+ std::cerr << e.what() << std::endl;
+ return EXIT_FAILURE;
+ }
+
+ return EXIT_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/orcus_csv_main.cpp b/src/orcus_csv_main.cpp
new file mode 100644
index 0000000..718fa28
--- /dev/null
+++ b/src/orcus_csv_main.cpp
@@ -0,0 +1,80 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/orcus_csv.hpp"
+#include "orcus/spreadsheet/document.hpp"
+#include "orcus/spreadsheet/factory.hpp"
+#include "orcus/config.hpp"
+
+#include "orcus_filter_global.hpp"
+
+#include <cstdlib>
+#include <iostream>
+
+using namespace std;
+using namespace orcus;
+namespace po = boost::program_options;
+
+class csv_args_handler : public extra_args_handler
+{
+ constexpr static const char* help_row_header =
+ "Specify the number of header rows to repeat if the source content gets split into multiple sheets.";
+
+ constexpr static const char* help_row_size =
+ "Specify the number of maximum rows in each sheet.";
+
+ constexpr static const char* help_split =
+ "Specify whether or not to split the data into multiple sheets in case it won't fit in a single sheet.";
+
+ spreadsheet::import_factory& m_fact;
+
+public:
+ csv_args_handler(spreadsheet::import_factory& fact) : m_fact(fact) {}
+ virtual ~csv_args_handler() override {}
+
+ virtual void add_options(po::options_description& desc) override
+ {
+ desc.add_options()
+ ("row-header", po::value<size_t>(), help_row_header)
+ ("split", help_split);
+ }
+
+ virtual void map_to_config(config& opt, const po::variables_map& vm) override
+ {
+ auto csv = std::get<config::csv_config>(opt.data);
+
+ if (vm.count("row-header"))
+ csv.header_row_size = vm["row-header"].as<size_t>();
+
+ csv.split_to_multiple_sheets = vm.count("split") > 0;
+
+ opt.data = csv;
+ }
+};
+
+int main(int argc, char** argv)
+{
+ spreadsheet::range_size_t ss{1048576, 16384};
+ spreadsheet::document doc{ss};
+ spreadsheet::import_factory fact(doc);
+ orcus_csv app(&fact);
+ csv_args_handler hdl(fact);
+
+ try
+ {
+ if (!parse_import_filter_args(argc, argv, fact, app, doc, &hdl))
+ return EXIT_FAILURE;
+ }
+ catch (const std::exception& e)
+ {
+ cerr << e.what() << endl;
+ return EXIT_FAILURE;
+ }
+
+ return EXIT_SUCCESS;
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/orcus_detect_main.cpp b/src/orcus_detect_main.cpp
new file mode 100644
index 0000000..8dc89c6
--- /dev/null
+++ b/src/orcus_detect_main.cpp
@@ -0,0 +1,70 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/format_detection.hpp"
+#include "orcus/exception.hpp"
+#include "orcus/stream.hpp"
+
+#include <cstdlib>
+#include <iostream>
+#include <string>
+
+using namespace orcus;
+using namespace std;
+
+int main(int argc, char** argv) try
+{
+ if (argc != 2)
+ return EXIT_FAILURE;
+
+ const char* filepath = argv[1];
+ file_content content(filepath);
+
+ if (content.empty())
+ {
+ cerr << "file is empty" << endl;
+ return EXIT_FAILURE;
+ }
+
+ format_t detected_type = detect(content.str());
+
+ cout << "type: ";
+ switch (detected_type)
+ {
+ case format_t::csv:
+ cout << "plain text format";
+ break;
+ case format_t::gnumeric:
+ cout << "Gnumeric";
+ break;
+ case format_t::ods:
+ cout << "OpenDocument Spreadsheet";
+ break;
+ case format_t::xls_xml:
+ cout << "Microsoft Excel XML";
+ break;
+ case format_t::xlsx:
+ cout << "Microsoft Office Open XML Excel 2007+";
+ break;
+ case format_t::parquet:
+ cout << "Apache Parquet";
+ break;
+ case format_t::unknown:
+ default:
+ cout << "unknown";
+ }
+ cout << endl;
+
+ return EXIT_SUCCESS;
+}
+catch (const std::exception& e)
+{
+ cerr << e.what() << endl;
+ return EXIT_FAILURE;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/orcus_env_dump.cpp b/src/orcus_env_dump.cpp
new file mode 100644
index 0000000..2a60fb7
--- /dev/null
+++ b/src/orcus_env_dump.cpp
@@ -0,0 +1,33 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "cpu_features.hpp"
+
+#include <iostream>
+
+using std::cout;
+using std::endl;
+
+int main()
+{
+ cout << "CPU flags:" << endl;
+ cout << " SSE 4.2: " << orcus::detail::cpu::has_sse42() << endl;
+ cout << " AVX2: " << orcus::detail::cpu::has_avx2() << endl;
+
+#if defined(_MSC_VER)
+ cout << "MSVC macros:" << endl;
+ #ifdef _M_IX86_FP
+ cout << " _M_IX86_FP: " << _M_IX86_FP << endl;
+ #else
+ cout << " _M_IX86_FP: not defined" << endl;
+ #endif
+#endif
+
+ return EXIT_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/orcus_filter_global.cpp b/src/orcus_filter_global.cpp
new file mode 100644
index 0000000..6df8563
--- /dev/null
+++ b/src/orcus_filter_global.cpp
@@ -0,0 +1,240 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus_filter_global.hpp"
+#include "orcus/config.hpp"
+#include "orcus/interface.hpp"
+#include "orcus/spreadsheet/factory.hpp"
+
+#include <mdds/sorted_string_map.hpp>
+#include <vector>
+#include <iostream>
+#include <fstream>
+
+#include "filesystem_env.hpp"
+
+using namespace std;
+using namespace orcus;
+
+namespace po = boost::program_options;
+
+namespace orcus {
+
+extra_args_handler::~extra_args_handler() {}
+
+namespace {
+
+const std::map<dump_format_t, std::string_view> descriptions =
+{
+ std::make_pair(dump_format_t::check, "Flat format that fully encodes document content. Suitable for automated testing."),
+ std::make_pair(dump_format_t::csv, "CSV format."),
+ std::make_pair(dump_format_t::flat, "Flat text format that displays document content in grid."),
+ std::make_pair(dump_format_t::html, "HTML format."),
+ std::make_pair(dump_format_t::json, "JSON format."),
+ std::make_pair(dump_format_t::xml, "This format is currently unsupported."),
+ std::make_pair(dump_format_t::yaml, "This format is currently unsupported."),
+ std::make_pair(dump_format_t::debug_state, "This format dumps the internal state of the document in detail, useful for debugging."),
+ std::make_pair(dump_format_t::none, "No output to be generated. Maybe useful during development."),
+};
+
+const char* help_program =
+"The FILE must specify a path to an existing file.";
+
+const char* help_output =
+"Output directory path, or output file when --dump-check option is used.";
+
+const char* help_dump_check =
+"Dump the content to stdout in a special format used for content verification "
+"in automated tests.";
+
+const char* help_debug =
+"Turn on a debug mode and optionally specify a debug level in order to generate run-time debug outputs.";
+
+const char* help_recalc =
+"Re-calculate all formula cells after the documetn is loaded.";
+
+const char* help_formula_error_policy =
+"Specify whether to abort immediately when the loader fails to parse the first "
+"formula cell ('fail'), or skip the offending cells and continue ('skip').";
+
+const char* help_row_size =
+"Specify the number of maximum rows in each sheet.";
+
+const char* err_no_input_file = "No input file.";
+
+}
+
+std::string gen_help_output_format()
+{
+ std::ostringstream os;
+ os << "Specify the output format. Supported format types are:" << endl;
+
+ for (std::pair<std::string_view, dump_format_t> entry : get_dump_format_entries())
+ {
+ std::string_view desc;
+ auto it_desc = descriptions.find(entry.second);
+ if (it_desc != descriptions.end())
+ desc = it_desc->second;
+
+ os << std::endl << "* " << entry.first << " - " << desc;
+ }
+
+ return os.str();
+}
+
+bool handle_dump_check(
+ iface::import_filter& app, iface::document_dumper& doc, const string& infile, const string& outfile)
+{
+ if (outfile.empty())
+ {
+ // Dump to stdout when no output file is specified.
+ app.read_file(infile);
+ doc.dump_check(cout);
+ return true;
+ }
+
+ if (fs::exists(outfile) && fs::is_directory(outfile))
+ {
+ cerr << "A directory named '" << outfile << "' already exists." << endl;
+ return false;
+ }
+
+ ofstream file(outfile.c_str());
+ app.read_file(infile);
+ doc.dump_check(file);
+ return true;
+}
+
+bool parse_import_filter_args(
+ int argc, char** argv, spreadsheet::import_factory& fact,
+ iface::import_filter& app, iface::document_dumper& doc,
+ extra_args_handler* args_handler)
+{
+ bool debug = false;
+ bool recalc_formula_cells = false;
+
+ po::options_description desc("Options");
+ desc.add_options()
+ ("help,h", "Print this help.")
+ ("debug,d", po::bool_switch(&debug), help_debug)
+ ("recalc,r", po::bool_switch(&recalc_formula_cells), help_recalc)
+ ("error-policy,e", po::value<string>()->default_value("fail"), help_formula_error_policy)
+ ("dump-check", help_dump_check)
+ ("output,o", po::value<string>(), help_output)
+ ("output-format,f", po::value<string>(), gen_help_output_format().data())
+ ("row-size", po::value<spreadsheet::row_t>(), help_row_size);
+
+ if (args_handler)
+ args_handler->add_options(desc);
+
+ po::options_description hidden("Hidden options");
+ hidden.add_options()
+ ("input", po::value<string>(), "input file");
+
+ po::options_description cmd_opt;
+ cmd_opt.add(desc).add(hidden);
+
+ po::positional_options_description po_desc;
+ po_desc.add("input", -1);
+
+ po::variables_map vm;
+ try
+ {
+ po::store(
+ po::command_line_parser(argc, argv).options(cmd_opt).positional(po_desc).run(), vm);
+ po::notify(vm);
+ }
+ catch (const exception& e)
+ {
+ // Unknown options.
+ cout << e.what() << endl;
+ cout << desc;
+ return false;
+ }
+
+ if (vm.count("help"))
+ {
+ cout << "Usage: orcus-" << app.get_name() << " [options] FILE" << endl << endl;
+ cout << help_program << endl << endl << desc;
+ return true;
+ }
+
+ std::string infile, outdir;
+ dump_format_t outformat = dump_format_t::unknown;
+
+ if (vm.count("input"))
+ infile = vm["input"].as<string>();
+
+ if (vm.count("output"))
+ outdir = vm["output"].as<string>();
+
+ if (vm.count("output-format"))
+ {
+ std::string outformat_s = vm["output-format"].as<string>();
+ outformat = to_dump_format_enum(outformat_s);
+ }
+
+ if (vm.count("row-size"))
+ fact.set_default_row_size(vm["row-size"].as<spreadsheet::row_t>());
+
+ std::string error_policy_s = vm["error-policy"].as<std::string>();
+ spreadsheet::formula_error_policy_t error_policy =
+ spreadsheet::to_formula_error_policy(error_policy_s);
+
+ if (error_policy == spreadsheet::formula_error_policy_t::unknown)
+ {
+ cerr << "Unrecognized error policy: " << error_policy_s << endl;
+ return false;
+ }
+
+ fact.set_formula_error_policy(error_policy);
+
+ if (infile.empty())
+ {
+ cerr << err_no_input_file << endl;
+ return false;
+ }
+
+ config opt = app.get_config();
+ opt.debug = debug;
+
+ if (args_handler)
+ args_handler->map_to_config(opt, vm);
+
+ app.set_config(opt);
+
+ fact.set_recalc_formula_cells(recalc_formula_cells);
+
+ if (vm.count("dump-check"))
+ {
+ // 'outdir' is used as the output file path in this mode.
+ return handle_dump_check(app, doc, infile, outdir);
+ }
+
+ if (outformat == dump_format_t::unknown)
+ {
+ std::cerr << "You must specify one of the supported output formats." << endl;
+ return false;
+ }
+
+ try
+ {
+ app.read_file(infile);
+ doc.dump(outformat, outdir);
+ }
+ catch (const std::exception& e)
+ {
+ std::cerr << e.what() << std::endl;
+ return false;
+ }
+
+ return true;
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/orcus_filter_global.hpp b/src/orcus_filter_global.hpp
new file mode 100644
index 0000000..6fdf344
--- /dev/null
+++ b/src/orcus_filter_global.hpp
@@ -0,0 +1,53 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef ORCUS_ORCUS_FILTER_GLOBAL_HPP
+#define ORCUS_ORCUS_FILTER_GLOBAL_HPP
+
+#include <boost/program_options.hpp>
+
+namespace orcus {
+
+struct config;
+
+namespace spreadsheet {
+
+class import_factory;
+
+}
+
+namespace iface {
+
+class import_filter;
+class document_dumper;
+
+}
+
+/**
+ * Interface for supporting additional command-line options.
+ */
+class extra_args_handler
+{
+public:
+ virtual ~extra_args_handler();
+
+ virtual void add_options(boost::program_options::options_description& desc) = 0;
+ virtual void map_to_config(
+ config& opt, const boost::program_options::variables_map& vm) = 0;
+};
+
+bool parse_import_filter_args(
+ int argc, char** argv, spreadsheet::import_factory& fact,
+ iface::import_filter& app, iface::document_dumper& doc,
+ extra_args_handler* args_handler = nullptr);
+
+std::string gen_help_output_format();
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/orcus_gnumeric_main.cpp b/src/orcus_gnumeric_main.cpp
new file mode 100644
index 0000000..5eda3dc
--- /dev/null
+++ b/src/orcus_gnumeric_main.cpp
@@ -0,0 +1,36 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/orcus_gnumeric.hpp"
+#include "orcus/spreadsheet/factory.hpp"
+#include "orcus/spreadsheet/document.hpp"
+
+#include "orcus_filter_global.hpp"
+
+#include <iostream>
+
+using namespace orcus;
+
+int main(int argc, char** argv) try
+{
+ spreadsheet::range_size_t ss{1048576, 16384};
+ spreadsheet::document doc{ss};
+ spreadsheet::import_factory fact(doc);
+ orcus_gnumeric app(&fact);
+
+ if (!parse_import_filter_args(argc, argv, fact, app, doc))
+ return EXIT_FAILURE;
+
+ return EXIT_SUCCESS;
+}
+catch (const std::exception& e)
+{
+ std::cerr << e.what() << std::endl;
+ return EXIT_FAILURE;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/orcus_json_cli.cpp b/src/orcus_json_cli.cpp
new file mode 100644
index 0000000..98a4f39
--- /dev/null
+++ b/src/orcus_json_cli.cpp
@@ -0,0 +1,443 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus_json_cli.hpp"
+#include "orcus/json_document_tree.hpp"
+#include "orcus/json_parser_base.hpp"
+#include "orcus/json_structure_tree.hpp"
+#include "orcus/config.hpp"
+#include "orcus/stream.hpp"
+#include "orcus/xml_namespace.hpp"
+#include "orcus/dom_tree.hpp"
+
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <memory>
+#include <sstream>
+
+#include <mdds/sorted_string_map.hpp>
+#include <boost/program_options.hpp>
+
+#include "filesystem_env.hpp"
+
+using namespace std;
+using namespace orcus;
+namespace po = boost::program_options;
+
+namespace orcus { namespace detail {
+
+cmd_params::cmd_params() {}
+
+cmd_params::cmd_params(cmd_params&& other) :
+ config(std::move(other.config)),
+ os(std::move(other.os)),
+ mode(other.mode),
+ map_file(std::move(other.map_file))
+{
+}
+
+cmd_params::~cmd_params() {}
+
+}}
+
+namespace {
+
+namespace mode {
+
+using map_type = mdds::sorted_string_map<detail::mode_t, mdds::string_view_map_entry>;
+
+// Keys must be sorted.
+constexpr map_type::entry entries[] =
+{
+ { "convert", detail::mode_t::convert },
+ { "map", detail::mode_t::map },
+ { "map-gen", detail::mode_t::map_gen },
+ { "structure", detail::mode_t::structure },
+};
+
+const map_type& get()
+{
+ static map_type mt(entries, std::size(entries), detail::mode_t::unknown);
+ return mt;
+}
+
+} // namespace mode
+
+const char* help_program =
+"The FILE must specify the path to an existing file.";
+
+const char* help_json_output =
+"Output file path.";
+
+const char* help_json_output_format =
+"Specify the format of output file. Supported format types are:\n"
+"\n"
+" * XML (xml)\n"
+" * JSON (json)\n"
+" * YAML (yaml)\n"
+" * flat tree dump (check)\n"
+" * no output (none)";
+
+const char* help_json_map =
+"Path to a map file. This parameter is only used for map mode, and it is "
+"required for map mode."
+;
+
+const char* err_no_input_file = "No input file.";
+
+void print_json_usage(std::ostream& os, const po::options_description& desc)
+{
+ os << "Usage: orcus-json [options] FILE" << endl << endl;
+ os << help_program << endl << endl << desc;
+}
+
+std::string build_mode_help_text()
+{
+ std::ostringstream os;
+ os << "Mode of operation. Select one of the following options: ";
+ auto it = mode::entries, ite = mode::entries + std::size(mode::entries);
+ --ite;
+
+ for (; it != ite; ++it)
+ os << it->key << ", ";
+
+ os << "or " << it->key << ".";
+ return os.str();
+}
+
+/**
+ * Reset params.config in case of failure.
+ */
+void parse_args_for_convert(
+ detail::cmd_params& params, const po::options_description& desc, const po::variables_map& vm)
+{
+ if (vm.count("resolve-refs"))
+ params.config->resolve_references = true;
+
+ if (vm.count("output-format"))
+ {
+ std::string s = vm["output-format"].as<string>();
+ params.config->output_format = to_dump_format_enum(s);
+
+ if (params.config->output_format == dump_format_t::unknown)
+ {
+ cerr << "Unknown output format type '" << s << "'." << endl;
+ params.config.reset();
+ return;
+ }
+ }
+ else
+ {
+ cerr << "Output format is not specified." << endl;
+ print_json_usage(cerr, desc);
+ params.config.reset();
+ return;
+ }
+}
+
+/**
+ * Reset params.config in case of failure.
+ */
+void parse_args_for_map(
+ detail::cmd_params& params, const po::options_description& desc, const po::variables_map& vm)
+{
+ if (vm.count("map"))
+ {
+ fs::path map_path = vm["map"].as<std::string>();
+ if (!fs::is_regular_file(map_path))
+ {
+ cerr << map_path.string() << " is not a valid file." << endl;
+ params.config.reset();
+ return;
+ }
+
+ params.map_file.load(map_path.string().data());
+ }
+ else
+ {
+ // Auto-mapping mode
+ }
+
+ parse_args_for_convert(params, desc, vm);
+}
+
+/**
+ * Parse the command-line options, populate the json_config object, and
+ * return that to the caller.
+ */
+detail::cmd_params parse_json_args(int argc, char** argv)
+{
+ detail::cmd_params params;
+
+ po::options_description desc("Options");
+ desc.add_options()
+ ("help,h", "Print this help.")
+ ("mode", po::value<std::string>(), build_mode_help_text().data())
+ ("resolve-refs", "Resolve JSON references to external files.")
+ ("output,o", po::value<string>(), help_json_output)
+ ("output-format,f", po::value<string>(), help_json_output_format)
+ ("map,m", po::value<string>(), help_json_map)
+ ;
+
+ po::options_description hidden("Hidden options");
+ hidden.add_options()
+ ("input", po::value<string>(), "input file");
+
+ po::options_description cmd_opt;
+ cmd_opt.add(desc).add(hidden);
+
+ po::positional_options_description po_desc;
+ po_desc.add("input", -1);
+
+ po::variables_map vm;
+ try
+ {
+ po::store(
+ po::command_line_parser(argc, argv).options(cmd_opt).positional(po_desc).run(), vm);
+ po::notify(vm);
+ }
+ catch (const exception& e)
+ {
+ // Unknown options.
+ cerr << e.what() << endl;
+ print_json_usage(cerr, desc);
+ return params;
+ }
+
+ if (vm.count("help"))
+ {
+ print_json_usage(cout, desc);
+ return params;
+ }
+
+ if (vm.count("mode"))
+ {
+ std::string s = vm["mode"].as<std::string>();
+ params.mode = mode::get().find(s);
+ if (params.mode == detail::mode_t::unknown)
+ {
+ cerr << "Unknown mode string '" << s << "'." << endl;
+ return params;
+ }
+ }
+
+ params.config = std::make_unique<json_config>();
+
+ if (vm.count("input"))
+ params.config->input_path = vm["input"].as<string>();
+
+ if (params.config->input_path.empty())
+ {
+ // No input file is given.
+ cerr << err_no_input_file << endl;
+ print_json_usage(cerr, desc);
+ params.config.reset();
+ return params;
+ }
+
+ if (!fs::exists(params.config->input_path))
+ {
+ cerr << "Input file does not exist: " << params.config->input_path << endl;
+ params.config.reset();
+ return params;
+ }
+
+ if (vm.count("output"))
+ params.config->output_path = vm["output"].as<string>();
+
+ switch (params.mode)
+ {
+ case detail::mode_t::map_gen:
+ case detail::mode_t::structure:
+ // Structure and map-gen modes only need input and output parameters.
+ params.os = std::make_unique<output_stream>(vm);
+ break;
+ case detail::mode_t::convert:
+ params.os = std::make_unique<output_stream>(vm);
+ parse_args_for_convert(params, desc, vm);
+ break;
+ case detail::mode_t::map:
+ parse_args_for_map(params, desc, vm);
+ break;
+ default:
+ assert(!"This should not happen since the mode check is done way earlier.");
+ }
+
+ return params;
+}
+
+std::unique_ptr<json::document_tree> load_doc(const orcus::file_content& content, const json_config& config)
+{
+ std::unique_ptr<json::document_tree> doc(std::make_unique<json::document_tree>());
+ doc->load(content.str(), config);
+ return doc;
+}
+
+void build_doc_and_dump(const orcus::file_content& content, detail::cmd_params& params)
+{
+ std::unique_ptr<json::document_tree> doc = load_doc(content, *params.config);
+ std::ostream& os = params.os->get();
+
+ switch (params.config->output_format)
+ {
+ case dump_format_t::xml:
+ {
+ os << doc->dump_xml();
+ break;
+ }
+ case dump_format_t::json:
+ {
+ os << doc->dump();
+ break;
+ }
+ case dump_format_t::yaml:
+ {
+ os << doc->dump_yaml();
+ break;
+ }
+ case dump_format_t::check:
+ {
+ string xml_strm = doc->dump_xml();
+ xmlns_repository repo;
+ xmlns_context ns_cxt = repo.create_context();
+ dom::document_tree dom(ns_cxt);
+ dom.load(xml_strm);
+
+ dom.dump_compact(os);
+ break;
+ }
+ default:
+ ;
+ }
+}
+
+void parse_and_write_map_file(const orcus::file_content& content, detail::cmd_params& params)
+{
+ std::vector<json::table_range_t> ranges;
+
+ json::structure_tree::range_handler_type rh = [&ranges](json::table_range_t&& range)
+ {
+ ranges.push_back(std::move(range));
+ };
+
+ json::structure_tree tree;
+ tree.parse(content.str());
+
+ tree.process_ranges(rh);
+
+ json::document_tree map_doc = {
+ {"sheets", json::array()},
+ {"ranges", json::array()}
+ };
+
+ json::node root = map_doc.get_document_root();
+ json::node sheets_node = root["sheets"];
+ json::node ranges_node = root["ranges"];
+
+ size_t range_count = 0;
+ for (const json::table_range_t& range : ranges)
+ {
+ std::ostringstream os;
+ os << "range-" << range_count++;
+ std::string sheet = os.str();
+ sheets_node.push_back(sheet);
+
+ ranges_node.push_back({
+ {"sheet", sheet},
+ {"row", 0},
+ {"column", 0},
+ {"row-header", true},
+ {"fields", json::array()},
+ {"row-groups", json::array()},
+ });
+
+ json::node range_node = ranges_node.back();
+ json::node fields_node = range_node["fields"];
+ json::node row_groups_node = range_node["row-groups"];
+
+ for (const std::string& path : range.paths)
+ {
+ fields_node.push_back(json::object());
+ json::node path_node = fields_node.back();
+ path_node["path"] = path;
+ }
+
+ for (const std::string& row_group : range.row_groups)
+ {
+ row_groups_node.push_back(json::object());
+ json::node path_node = row_groups_node.back();
+ path_node["path"] = row_group;
+ }
+ }
+
+ std::ostream& os = params.os->get();
+ os << map_doc.dump();
+}
+
+} // anonymous namespace
+
+int main(int argc, char** argv)
+{
+ file_content content;
+
+ try
+ {
+ detail::cmd_params params = parse_json_args(argc, argv);
+
+ if (!params.config || params.mode == detail::mode_t::unknown)
+ return EXIT_FAILURE;
+
+ assert(!params.config->input_path.empty());
+ content.load(params.config->input_path.data());
+
+ switch (params.mode)
+ {
+ case detail::mode_t::structure:
+ {
+ json::structure_tree tree;
+ tree.parse(content.str());
+ tree.normalize_tree();
+ tree.dump_compact(params.os->get());
+ break;
+ }
+ case detail::mode_t::map:
+ {
+ map_to_sheets_and_dump(content, params);
+ break;
+ }
+ case detail::mode_t::map_gen:
+ {
+ parse_and_write_map_file(content, params);
+ break;
+ }
+ case detail::mode_t::convert:
+ {
+ build_doc_and_dump(content, params);
+ break;
+ }
+ default:
+ cerr << "Unkonwn mode has been given." << endl;
+ return EXIT_FAILURE;
+ }
+ }
+ catch (const parse_error& e)
+ {
+ cerr << create_parse_error_output(content.str(), e.offset()) << endl;
+ cerr << e.what() << endl;
+ return EXIT_FAILURE;
+ }
+ catch (const std::exception& e)
+ {
+ cerr << e.what() << endl;
+ return EXIT_FAILURE;
+ }
+
+ return EXIT_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/orcus_json_cli.hpp b/src/orcus_json_cli.hpp
new file mode 100644
index 0000000..2f8db9f
--- /dev/null
+++ b/src/orcus_json_cli.hpp
@@ -0,0 +1,54 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_ORCUS_JSON_CLI_HPP
+#define INCLUDED_ORCUS_ORCUS_JSON_CLI_HPP
+
+#include "orcus/stream.hpp"
+#include "cli_global.hpp"
+
+#include <ostream>
+
+namespace orcus {
+
+struct json_config;
+
+namespace detail {
+
+enum class mode_t
+{
+ unknown,
+ convert,
+ map,
+ map_gen,
+ structure
+};
+
+struct cmd_params
+{
+ std::unique_ptr<json_config> config; //< json parser configuration.
+ std::unique_ptr<output_stream> os;
+ mode_t mode = mode_t::convert;
+ file_content map_file;
+
+ cmd_params(const cmd_params&) = delete;
+ cmd_params& operator= (const cmd_params&) = delete;
+
+ cmd_params();
+ cmd_params(cmd_params&& other);
+ ~cmd_params();
+};
+
+void map_to_sheets_and_dump(const file_content& content, cmd_params& params);
+
+}
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/orcus_json_cli_map.cpp b/src/orcus_json_cli_map.cpp
new file mode 100644
index 0000000..563b7e3
--- /dev/null
+++ b/src/orcus_json_cli_map.cpp
@@ -0,0 +1,57 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus_json_cli.hpp"
+#include "orcus/config.hpp"
+
+#ifdef __ORCUS_SPREADSHEET_MODEL
+#include "orcus/spreadsheet/document.hpp"
+#include "orcus/spreadsheet/factory.hpp"
+#include "orcus/orcus_json.hpp"
+#endif
+
+#include <iostream>
+#include <cassert>
+#include <vector>
+#include <sstream>
+
+using namespace std;
+
+namespace orcus { namespace detail {
+
+#ifdef __ORCUS_SPREADSHEET_MODEL
+
+void map_to_sheets_and_dump(const file_content& content, cmd_params& params)
+{
+ spreadsheet::range_size_t ss{1048576, 16384};
+ spreadsheet::document doc{ss};
+ spreadsheet::import_factory factory(doc);
+ orcus_json app(&factory);
+
+ if (params.map_file.empty())
+ // Automatic mapping of JSON to table.
+ app.detect_map_definition(content.str());
+ else
+ app.read_map_definition(params.map_file.str());
+
+ app.read_stream(content.str());
+ doc.dump(params.config->output_format, params.config->output_path);
+}
+
+#else
+
+void map_to_sheets_and_dump(const file_content& /*content*/, cmd_params& /*params*/)
+{
+ throw std::runtime_error(
+ "map mode disabled as the spreadsheet model backend is not available.");
+}
+
+#endif
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/orcus_mso_encryption.cpp b/src/orcus_mso_encryption.cpp
new file mode 100644
index 0000000..30eb4b3
--- /dev/null
+++ b/src/orcus_mso_encryption.cpp
@@ -0,0 +1,34 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/stream.hpp>
+
+#include "mso/encryption_info.hpp"
+
+using namespace orcus;
+using namespace std;
+
+int main(int argc, char** argv) try
+{
+ if (argc != 2)
+ return EXIT_FAILURE;
+
+ mso::encryption_info_reader reader;
+ file_content content(argv[1]);
+
+ if (content.empty())
+ return EXIT_FAILURE;
+
+ reader.read(content.data(), content.size());
+
+ return EXIT_SUCCESS;
+}
+catch (...)
+{
+ return EXIT_FAILURE;
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/orcus_ods_main.cpp b/src/orcus_ods_main.cpp
new file mode 100644
index 0000000..16c24f0
--- /dev/null
+++ b/src/orcus_ods_main.cpp
@@ -0,0 +1,38 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/orcus_ods.hpp"
+#include "orcus/spreadsheet/document.hpp"
+#include "orcus/spreadsheet/factory.hpp"
+
+#include "orcus_filter_global.hpp"
+
+#include <cstdlib>
+#include <iostream>
+
+using namespace std;
+using namespace orcus;
+
+int main(int argc, char** argv) try
+{
+ spreadsheet::range_size_t ss{1048576, 16384};
+ spreadsheet::document doc{ss};
+ spreadsheet::import_factory fact(doc);
+ orcus_ods app(&fact);
+
+ if (!parse_import_filter_args(argc, argv, fact, app, doc))
+ return EXIT_FAILURE;
+
+ return EXIT_SUCCESS;
+}
+catch (const std::exception& e)
+{
+ cerr << e.what() << endl;
+ return EXIT_FAILURE;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/orcus_ods_styles.cpp b/src/orcus_ods_styles.cpp
new file mode 100644
index 0000000..443d4ab
--- /dev/null
+++ b/src/orcus_ods_styles.cpp
@@ -0,0 +1,44 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/orcus_import_ods.hpp"
+#include "orcus/spreadsheet/styles.hpp"
+#include "orcus/spreadsheet/factory.hpp"
+#include "orcus/string_pool.hpp"
+#include "orcus/stream.hpp"
+
+#include "orcus_filter_global.hpp"
+
+#include <cstdlib>
+#include <iostream>
+
+using namespace std;
+using namespace orcus;
+
+int main(int argc, char** argv)
+{
+ if (argc != 2)
+ return EXIT_FAILURE;
+
+ string_pool sp;
+ spreadsheet::styles styles_store;
+ spreadsheet::import_styles istyles(styles_store, sp);
+
+ try
+ {
+ file_content content(argv[1]);
+ import_ods::read_styles(content.str(), &istyles);
+ }
+ catch(std::exception& ex)
+ {
+ std::cerr << ex.what() << std::endl;
+ return EXIT_FAILURE;
+ }
+
+ return EXIT_SUCCESS;
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/orcus_parquet_main.cpp b/src/orcus_parquet_main.cpp
new file mode 100644
index 0000000..a4730a0
--- /dev/null
+++ b/src/orcus_parquet_main.cpp
@@ -0,0 +1,35 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/orcus_parquet.hpp"
+#include "orcus/spreadsheet/document.hpp"
+#include "orcus/spreadsheet/factory.hpp"
+
+#include "orcus_filter_global.hpp"
+
+#include <iostream>
+
+int main(int argc, char** argv) try
+{
+ orcus::spreadsheet::range_size_t ss{1048576, 16384};
+ orcus::spreadsheet::document doc{ss};
+ orcus::spreadsheet::import_factory fact(doc);
+ orcus::orcus_parquet app(&fact);
+
+ if (!parse_import_filter_args(argc, argv, fact, app, doc))
+ return EXIT_FAILURE;
+
+ return EXIT_SUCCESS;
+}
+catch (const std::exception& e)
+{
+ std::cerr << e.what() << std::endl;
+ return EXIT_FAILURE;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+
diff --git a/src/orcus_test_csv.cpp b/src/orcus_test_csv.cpp
new file mode 100644
index 0000000..438f9a7
--- /dev/null
+++ b/src/orcus_test_csv.cpp
@@ -0,0 +1,253 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus_test_global.hpp"
+#include "orcus/orcus_csv.hpp"
+#include <orcus/format_detection.hpp>
+#include "orcus/config.hpp"
+#include "orcus/stream.hpp"
+#include "orcus/spreadsheet/factory.hpp"
+#include "orcus/spreadsheet/document.hpp"
+#include "orcus/spreadsheet/sheet.hpp"
+
+#include <cstdlib>
+#include <string>
+#include <iostream>
+#include <sstream>
+#include <vector>
+
+using namespace orcus;
+namespace ss = orcus::spreadsheet;
+
+namespace {
+
+std::vector<const char*> dirs = {
+ SRCDIR"/test/csv/simple-numbers/",
+ SRCDIR"/test/csv/normal-quotes/",
+ SRCDIR"/test/csv/double-quotes/",
+ SRCDIR"/test/csv/quoted-with-delim/",
+};
+
+void test_csv_create_filter()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ ss::range_size_t ssize{1048576, 16384};
+ std::unique_ptr<ss::document> doc = std::make_unique<ss::document>(ssize);
+ ss::import_factory factory(*doc);
+
+ auto f = create_filter(format_t::csv, &factory);
+ assert(f);
+ assert(f->get_name() == "csv");
+}
+
+void test_csv_import()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ for (const char* dir : dirs)
+ {
+ std::string path(dir);
+
+ // Read the input.csv document.
+ path.append("input.csv");
+
+ std::cout << "checking " << path << "..." << std::endl;
+
+ spreadsheet::range_size_t ss{1048576, 16384};
+ spreadsheet::document doc{ss};
+ {
+ spreadsheet::import_factory factory(doc);
+ orcus_csv app(&factory);
+ app.read_file(path.c_str());
+ }
+
+ // Dump the content of the model.
+ std::string check = test::get_content_check(doc);
+
+ // Check that against known control.
+ path = dir;
+ path.append("check.txt");
+ file_content control(path.c_str());
+
+ assert(!check.empty());
+ assert(!control.empty());
+
+ test::verify_content(__FILE__, __LINE__, control.str(), check);
+
+ // Dump the first sheet as csv.
+ std::string stream = test::get_content_as_csv(doc, 0);
+ assert(!stream.empty());
+
+ // Re-import the dumped csv.
+ doc.clear();
+ {
+ spreadsheet::import_factory factory(doc);
+ orcus_csv app(&factory);
+ app.read_stream(stream);
+ }
+
+ // Dump the content of the re-imported model, and make sure it's still
+ // identical to the control.
+ check = test::get_content_check(doc);
+ assert(!check.empty());
+
+ test::verify_content(__FILE__, __LINE__, control.str(), check);
+ }
+}
+
+void test_csv_import_split_sheet()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ const char* dir = SRCDIR"/test/csv/split-sheet/";
+
+ std::string path(dir);
+ path.append("input.csv");
+
+ std::cout << "checking " << path << "..." << std::endl;
+
+ config conf(format_t::csv);
+ std::get<config::csv_config>(conf.data).header_row_size = 0;
+ std::get<config::csv_config>(conf.data).split_to_multiple_sheets = true;
+
+ // Set the row size to 11 to make sure the split occurs.
+ spreadsheet::range_size_t ss{11, 4};
+ spreadsheet::document doc{ss};
+ {
+ spreadsheet::import_factory factory(doc);
+ orcus_csv app(&factory);
+ app.set_config(conf);
+
+ app.read_file(path.c_str());
+ }
+
+ assert(doc.get_sheet_count() == 2);
+
+ // Dump the content of the model.
+ std::string check = test::get_content_check(doc);
+
+ // Check that against known control.
+ path = dir;
+ path.append("check-1.txt");
+ file_content control(path.data());
+
+ test::verify_content(__FILE__, __LINE__, control.str(), check);
+
+ // Re-import the same input file, but have the first row repeated on every
+ // sheet.
+ path = dir;
+ path.append("input.csv");
+ doc.clear();
+ std::get<config::csv_config>(conf.data).header_row_size = 1;
+ {
+ spreadsheet::import_factory factory(doc);
+ orcus_csv app(&factory);
+ app.set_config(conf);
+
+ app.read_file(path.c_str());
+ }
+
+ assert(doc.get_sheet_count() == 2);
+
+ // Dump the content of the model.
+ check = test::get_content_check(doc);
+
+ // Check that against known control.
+ path = dir;
+ path.append("check-2.txt");
+ control.load(path.data());
+
+ test::verify_content(__FILE__, __LINE__, control.str(), check);
+
+ // Re-import it again, but this time disable the splitting. The data should
+ // get trucated on the first sheet.
+ std::get<config::csv_config>(conf.data).split_to_multiple_sheets = false;
+
+ path = dir;
+ path.append("input.csv");
+ doc.clear();
+
+ {
+ spreadsheet::import_factory factory(doc);
+ orcus_csv app(&factory);
+ app.set_config(conf);
+
+ app.read_file(path.c_str());
+ }
+
+ assert(doc.get_sheet_count() == 1);
+
+ // Dump the content of the model.
+ check = test::get_content_check(doc);
+
+ // Check that against known control.
+ path = dir;
+ path.append("check-3.txt");
+ control.load(path.data());
+
+ test::verify_content(__FILE__, __LINE__, control.str(), check);
+}
+
+void test_csv_dump_flat_utf8()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ constexpr std::string_view src =
+ "New York,fabriqué\n"
+ "garçon,вход\n"
+ "выход,помогите\n"
+ "Nähe,San Diego";
+
+ constexpr std::string_view expected =
+ "rows: 4 cols: 2\n"
+ "+----------+-----------+\n"
+ "| New York | fabriqué |\n"
+ "+----------+-----------+\n"
+ "| garçon | вход |\n"
+ "+----------+-----------+\n"
+ "| выход | помогите |\n"
+ "+----------+-----------+\n"
+ "| Nähe | San Diego |\n"
+ "+----------+-----------+\n";
+
+ ss::range_size_t ss{1048576, 16384};
+ ss::document doc{ss};
+ ss::import_factory factory(doc);
+ orcus_csv app(&factory);
+ app.read_stream(src);
+
+ const ss::sheet* sh = doc.get_sheet(0);
+ assert(sh);
+ std::ostringstream os;
+ sh->dump_flat(os);
+ std::string flat_dump = os.str();
+
+ test::verify_content(__FILE__, __LINE__, expected, flat_dump);
+}
+
+} // anonymous namespace
+
+int main()
+{
+ try
+ {
+ test_csv_create_filter();
+ test_csv_import();
+ test_csv_import_split_sheet();
+ test_csv_dump_flat_utf8();
+ }
+ catch (const std::exception& e)
+ {
+ std::cout << e.what() << std::endl;
+ return EXIT_FAILURE;
+ }
+
+ return EXIT_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/orcus_test_global.cpp b/src/orcus_test_global.cpp
new file mode 100644
index 0000000..78de0f2
--- /dev/null
+++ b/src/orcus_test_global.cpp
@@ -0,0 +1,98 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus_test_global.hpp"
+
+#include <orcus/spreadsheet/document.hpp>
+#include <orcus/spreadsheet/sheet.hpp>
+#include <orcus/stream.hpp>
+#include <orcus/parser_global.hpp>
+
+#include <sstream>
+#include <cmath>
+#include <iostream>
+#include <chrono>
+
+namespace orcus { namespace test {
+
+std::string get_content_check(const spreadsheet::document& doc)
+{
+ std::ostringstream os;
+ doc.dump_check(os);
+ return os.str();
+}
+
+std::string get_content_as_csv(const spreadsheet::document& doc, spreadsheet::sheet_t sheet_index)
+{
+ const spreadsheet::sheet* sh = doc.get_sheet(sheet_index);
+ if (!sh)
+ return std::string();
+
+ std::ostringstream os;
+ sh->dump_csv(os);
+ return os.str();
+}
+
+void verify_content(
+ const char* filename, size_t line_no, const spreadsheet::document& doc, std::string_view expected)
+{
+ std::string actual = get_content_check(doc);
+ verify_content(filename, line_no, expected, actual);
+}
+
+void verify_value_to_decimals(
+ const char* filename, size_t line_no, double expected, double actual, int decimals)
+{
+ double expected_f = expected;
+ double actual_f = actual;
+
+ for (int i = 0; i < decimals; ++i)
+ {
+ expected_f *= 10.0;
+ actual_f *= 10.0;
+ }
+
+ long expected_i = std::lround(expected_f);
+ long actual_i = std::lround(actual_f);
+
+ if (expected_i == actual_i)
+ return;
+
+ std::ostringstream os;
+ os << "value is not as expected: (expected: " << expected << "; actual: " << actual << ")";
+ throw assert_error(filename, line_no, os.str().data());
+}
+
+std::string prefix_multiline_string(std::string_view str, std::string_view prefix)
+{
+ std::ostringstream os;
+
+ const char* p = str.data();
+ const char* p_end = p + str.size();
+
+ const char* p0 = nullptr;
+ for (; p != p_end; ++p)
+ {
+ if (!p0)
+ p0 = p;
+
+ if (*p == '\n')
+ {
+ os << prefix << std::string_view(p0, std::distance(p0, p)) << '\n';
+ p0 = nullptr;
+ }
+ }
+
+ if (p0)
+ os << prefix << std::string_view(p0, std::distance(p0, p));
+
+ return os.str();
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/orcus_test_global.hpp b/src/orcus_test_global.hpp
new file mode 100644
index 0000000..dc3e314
--- /dev/null
+++ b/src/orcus_test_global.hpp
@@ -0,0 +1,42 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_ORCUS_TEST_GLOBAL_HPP
+#define INCLUDED_ORCUS_ORCUS_TEST_GLOBAL_HPP
+
+#include "test_global.hpp"
+#include <orcus/spreadsheet/types.hpp>
+
+#include <string>
+
+namespace orcus {
+
+namespace spreadsheet {
+
+class document;
+
+}
+
+namespace test {
+
+std::string get_content_check(const spreadsheet::document& doc);
+
+std::string get_content_as_csv(const spreadsheet::document& doc, spreadsheet::sheet_t sheet_index);
+
+void verify_content(
+ const char* filename, size_t line_no, const spreadsheet::document& doc, std::string_view expected);
+
+void verify_value_to_decimals(
+ const char* filename, size_t line_no, double expected, double actual, int decimals);
+
+std::string prefix_multiline_string(std::string_view str, std::string_view prefix);
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/orcus_test_gnumeric.cpp b/src/orcus_test_gnumeric.cpp
new file mode 100644
index 0000000..f2ba3b6
--- /dev/null
+++ b/src/orcus_test_gnumeric.cpp
@@ -0,0 +1,1386 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus_test_global.hpp"
+#include "filesystem_env.hpp"
+
+#include <orcus/orcus_gnumeric.hpp>
+#include <orcus/format_detection.hpp>
+#include <orcus/stream.hpp>
+#include <orcus/spreadsheet/factory.hpp>
+#include <orcus/spreadsheet/document.hpp>
+#include <orcus/spreadsheet/sheet.hpp>
+#include <orcus/spreadsheet/auto_filter.hpp>
+#include <orcus/spreadsheet/shared_strings.hpp>
+#include <orcus/spreadsheet/styles.hpp>
+#include <orcus/types.hpp>
+
+#include <ixion/address.hpp>
+#include <ixion/model_context.hpp>
+#include <iostream>
+#include <sstream>
+
+using namespace orcus;
+namespace ss = orcus::spreadsheet;
+
+namespace {
+
+std::vector<fs::path> dirs = {
+ SRCDIR"/test/gnumeric/raw-values-1/",
+ SRCDIR"/test/gnumeric/cell-value-types/",
+ SRCDIR"/test/gnumeric/formula-cells/",
+ SRCDIR"/test/gnumeric/named-expression/",
+ SRCDIR"/test/gnumeric/named-expression-sheet-local/",
+};
+
+std::unique_ptr<ss::document> load_doc(const fs::path& filepath)
+{
+ ss::range_size_t ss{1048576, 16384};
+ auto doc = std::make_unique<ss::document>(ss);
+ ss::import_factory factory(*doc);
+ orcus_gnumeric app(&factory);
+ app.read_file(filepath.string());
+
+ // Gnumeric doc doesn't cache formula results.
+ doc->recalc_formula_cells();
+
+ return doc;
+}
+
+void test_gnumeric_detection()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ for (const auto& dir : dirs)
+ {
+ fs::path filepath = dir / "input.gnumeric";
+ file_content fc(filepath.string());
+ assert(!fc.empty());
+
+ format_t detected = detect(fc.str());
+ assert(detected == format_t::gnumeric);
+ }
+}
+
+void test_gnumeric_create_filter()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ ss::range_size_t ssize{1048576, 16384};
+ std::unique_ptr<ss::document> doc = std::make_unique<ss::document>(ssize);
+ ss::import_factory factory(*doc);
+
+ auto f = create_filter(format_t::gnumeric, &factory);
+ assert(f);
+ assert(f->get_name() == "gnumeric");
+}
+
+void test_gnumeric_import()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ for (const auto& dir : dirs)
+ {
+ std::cout << "checking " << dir << "..." << std::endl;
+
+ // Read the input.gnumeric document.
+ fs::path filepath = dir / "input.gnumeric";
+ auto doc = load_doc(filepath);
+
+ // Dump the content of the model.
+ std::ostringstream os;
+ doc->dump_check(os);
+ std::string check = os.str();
+
+ // Check that against known control.
+ filepath = dir / "check.txt";
+ file_content control(filepath.string());
+
+ assert(!check.empty());
+ assert(!control.empty());
+
+ test::verify_content(__FILE__, __LINE__, control.str(), check);
+ }
+}
+
+void test_gnumeric_column_widths_row_heights()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ fs::path filepath = SRCDIR"/test/gnumeric/column-width-row-height/input.gnumeric";
+ auto doc = load_doc(filepath);
+
+ assert(doc->get_sheet_count() == 1);
+ const ss::sheet* sh = doc->get_sheet(0);
+ assert(sh);
+
+ {
+ // column, column width (twips), column span
+ const std::tuple<ss::col_t, ss::col_width_t, ss::col_t> expected[] = {
+ { 0, 99 * 20, 1 },
+ { 1, 57 * 20, 1 },
+ { 2, 84 * 20, 1 },
+ { 3, 111 * 20, 1 },
+ { 4, ss::get_default_column_width(), 1 },
+ { 5, 69 * 20, 3 },
+ { 10, 120 * 20, 2 },
+ };
+
+ for (const auto& [col, cw_expected, span_expected] : expected)
+ {
+ ss::col_t col_start, col_end;
+ ss::col_width_t cw = sh->get_col_width(col, &col_start, &col_end);
+ ss::col_t span = col_end - col_start;
+
+ std::cout << "column: " << col << "; expected=" << cw_expected << "; actual=" << cw
+ << "; span-expected=" << span_expected << "; span-actual=" << span << std::endl;
+
+ assert(cw == cw_expected);
+ assert(span == span_expected);
+ }
+ }
+
+ {
+ // row, row height (twips), row span
+ const std::tuple<ss::row_t, ss::row_height_t, ss::row_t> expected[] = {
+ { 0, 18 * 20, 3 },
+ { 3, 30 * 20, 1 },
+ { 4, 42 * 20, 1 },
+ { 5, 51 * 20, 1 },
+ { 6, ss::get_default_row_height(), 1 },
+ { 7, 27 * 20, 3 },
+ { 10, ss::get_default_row_height(), 2 },
+ { 12, 36 * 20, 2 },
+ };
+
+ for (const auto& [row, rh_expected, span_expected] : expected)
+ {
+ ss::row_t row_start, row_end;
+ ss::row_height_t rh = sh->get_row_height(row, &row_start, &row_end);
+ ss::row_t span = row_end - row_start;
+
+ std::cout << "row: " << row << "; expected=" << rh_expected << "; actual=" << rh
+ << "; span-expected=" << span_expected << "; span-actual=" << span << std::endl;
+
+ assert(rh == rh_expected);
+ assert(span == span_expected);
+ }
+ }
+}
+
+void test_gnumeric_auto_filter()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ fs::path filepath = SRCDIR"/test/gnumeric/table/autofilter.gnumeric";
+ auto doc = load_doc(filepath);
+
+ assert(doc->get_sheet_count() == 1);
+ const ss::sheet* sh = doc->get_sheet(0);
+ assert(sh);
+
+ const ss::auto_filter_t* af = sh->get_auto_filter_data();
+ assert(af);
+ ixion::abs_range_t b2_c11{0, 1, 1, 10, 2};
+ assert(af->range == b2_c11);
+ assert(af->columns.size() == 2);
+
+ auto it = af->columns.begin();
+ assert(it->first == 0);
+ {
+ const ss::auto_filter_column_t& afc = it->second;
+ assert(afc.match_values.size() == 1);
+ assert(*afc.match_values.begin() == "A");
+ }
+
+ ++it;
+ assert(it->first == 1);
+ {
+ const ss::auto_filter_column_t& afc = it->second;
+ assert(afc.match_values.size() == 1);
+ assert(*afc.match_values.begin() == "1");
+ }
+}
+
+void test_gnumeric_hidden_rows_columns()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ fs::path filepath = SRCDIR"/test/gnumeric/hidden-rows-columns/input.gnumeric";
+ auto doc = load_doc(filepath);
+
+ ss::sheet* sh = doc->get_sheet("Hidden Rows");
+ assert(sh);
+
+ ss::row_t row_start = -1, row_end = -1;
+
+ // Row 1 is visible.
+ assert(!sh->is_row_hidden(0, &row_start, &row_end));
+ assert(row_start == 0);
+ assert(row_end == 1); // the end position is non-inclusive.
+
+ // Rows 2-3 are hidden.
+ assert(sh->is_row_hidden(1, &row_start, &row_end));
+ assert(row_start == 1);
+ assert(row_end == 3); // the end position is non-inclusive.
+
+ // Row 4 is visible.
+ assert(!sh->is_row_hidden(3, &row_start, &row_end));
+ assert(row_start == 3);
+ assert(row_end == 4); // the end position is non-inclusive.
+
+ // Row 5 is hidden.
+ assert(sh->is_row_hidden(4, &row_start, &row_end));
+ assert(row_start == 4);
+ assert(row_end == 5); // the end position is non-inclusive.
+
+ // Rows 6-8 are visible.
+ assert(!sh->is_row_hidden(5, &row_start, &row_end));
+ assert(row_start == 5);
+ assert(row_end == 8); // the end position is non-inclusive.
+
+ // Row 9 is hidden.
+ assert(sh->is_row_hidden(8, &row_start, &row_end));
+ assert(row_start == 8);
+ assert(row_end == 9); // the end position is non-inclusive.
+
+ // The rest of the rows are visible.
+ assert(!sh->is_row_hidden(9, &row_start, &row_end));
+ assert(row_start == 9);
+ assert(row_end == doc->get_sheet_size().rows); // the end position is non-inclusive.
+
+ sh = doc->get_sheet("Hidden Columns");
+ assert(sh);
+
+ ss::col_t col_start = -1, col_end = -1;
+
+ // Columns A-B are visible.
+ assert(!sh->is_col_hidden(0, &col_start, &col_end));
+ assert(col_start == 0);
+ assert(col_end == 2); // non-inclusive
+
+ // Columns C-E are hidden.
+ assert(sh->is_col_hidden(2, &col_start, &col_end));
+ assert(col_start == 2);
+ assert(col_end == 6); // non-inclusive
+
+ // Columns G-J are visible.
+ assert(!sh->is_col_hidden(6, &col_start, &col_end));
+ assert(col_start == 6);
+ assert(col_end == 10); // non-inclusive
+
+ // Column K is hidden.
+ assert(sh->is_col_hidden(10, &col_start, &col_end));
+ assert(col_start == 10);
+ assert(col_end == 11); // non-inclusive
+
+ // The rest of the columns are all visible.
+ assert(!sh->is_col_hidden(11, &col_start, &col_end));
+ assert(col_start == 11);
+ assert(col_end == doc->get_sheet_size().columns); // non-inclusive
+}
+
+void test_gnumeric_merged_cells()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ fs::path filepath = SRCDIR"/test/gnumeric/merged-cells/input.gnumeric";
+ auto doc = load_doc(filepath);
+
+ const ss::sheet* sheet1 = doc->get_sheet("Sheet1");
+ assert(sheet1);
+
+ ss::range_t merge_range = sheet1->get_merge_cell_range(0, 1);
+ assert(merge_range.first.column == 1);
+ assert(merge_range.last.column == 2);
+ assert(merge_range.first.row == 0);
+ assert(merge_range.last.row == 0);
+
+ merge_range = sheet1->get_merge_cell_range(0, 3);
+ assert(merge_range.first.column == 3);
+ assert(merge_range.last.column == 5);
+ assert(merge_range.first.row == 0);
+ assert(merge_range.last.row == 0);
+
+ merge_range = sheet1->get_merge_cell_range(1, 0);
+ assert(merge_range.first.column == 0);
+ assert(merge_range.last.column == 0);
+ assert(merge_range.first.row == 1);
+ assert(merge_range.last.row == 2);
+
+ merge_range = sheet1->get_merge_cell_range(3, 0);
+ assert(merge_range.first.column == 0);
+ assert(merge_range.last.column == 0);
+ assert(merge_range.first.row == 3);
+ assert(merge_range.last.row == 5);
+
+ merge_range = sheet1->get_merge_cell_range(2, 2);
+ assert(merge_range.first.column == 2);
+ assert(merge_range.last.column == 5);
+ assert(merge_range.first.row == 2);
+ assert(merge_range.last.row == 5);
+}
+
+void test_gnumeric_text_alignment()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ fs::path filepath = SRCDIR"/test/gnumeric/text-alignment/input.gnumeric";
+ auto doc = load_doc(filepath);
+
+ ss::styles& styles = doc->get_styles();
+
+ ss::sheet* sh = doc->get_sheet(0);
+ assert(sh);
+
+ struct check
+ {
+ ss::row_t row;
+ ss::col_t col;
+ bool apply_align;
+ ss::hor_alignment_t hor_align;
+ ss::ver_alignment_t ver_align;
+ };
+
+ std::vector<check> checks =
+ {
+ { 1, 2, true, ss::hor_alignment_t::unknown, ss::ver_alignment_t::bottom }, // C2
+ { 2, 2, true, ss::hor_alignment_t::left, ss::ver_alignment_t::bottom }, // C3
+ { 3, 2, true, ss::hor_alignment_t::center, ss::ver_alignment_t::bottom }, // C4
+ { 4, 2, true, ss::hor_alignment_t::right, ss::ver_alignment_t::bottom }, // C5
+ { 5, 2, true, ss::hor_alignment_t::left, ss::ver_alignment_t::bottom }, // C6
+ { 6, 2, true, ss::hor_alignment_t::left, ss::ver_alignment_t::bottom }, // C7
+ { 7, 2, true, ss::hor_alignment_t::right, ss::ver_alignment_t::bottom }, // C8
+ { 8, 2, true, ss::hor_alignment_t::right, ss::ver_alignment_t::bottom }, // C9
+ { 9, 2, true, ss::hor_alignment_t::unknown, ss::ver_alignment_t::middle }, // C10
+ { 10, 2, true, ss::hor_alignment_t::left, ss::ver_alignment_t::middle }, // C11
+ { 11, 2, true, ss::hor_alignment_t::center, ss::ver_alignment_t::middle }, // C12
+ { 12, 2, true, ss::hor_alignment_t::right, ss::ver_alignment_t::middle }, // C13
+ { 13, 2, true, ss::hor_alignment_t::left, ss::ver_alignment_t::middle }, // C14
+ { 14, 2, true, ss::hor_alignment_t::left, ss::ver_alignment_t::middle }, // C15
+ { 15, 2, true, ss::hor_alignment_t::right, ss::ver_alignment_t::middle }, // C16
+ { 16, 2, true, ss::hor_alignment_t::right, ss::ver_alignment_t::middle }, // C17
+ { 17, 2, true, ss::hor_alignment_t::unknown, ss::ver_alignment_t::top }, // C18
+ { 18, 2, true, ss::hor_alignment_t::left, ss::ver_alignment_t::top }, // C19
+ { 19, 2, true, ss::hor_alignment_t::center, ss::ver_alignment_t::top }, // C20
+ { 20, 2, true, ss::hor_alignment_t::right, ss::ver_alignment_t::top }, // C21
+ { 21, 2, true, ss::hor_alignment_t::left, ss::ver_alignment_t::top }, // C22
+ { 22, 2, true, ss::hor_alignment_t::left, ss::ver_alignment_t::top }, // C23
+ { 23, 2, true, ss::hor_alignment_t::right, ss::ver_alignment_t::top }, // C24
+ { 24, 2, true, ss::hor_alignment_t::right, ss::ver_alignment_t::top }, // C25
+ { 25, 2, true, ss::hor_alignment_t::unknown, ss::ver_alignment_t::justified }, // C26
+ { 26, 2, true, ss::hor_alignment_t::justified, ss::ver_alignment_t::bottom }, // C27
+ { 27, 2, true, ss::hor_alignment_t::distributed, ss::ver_alignment_t::distributed }, // C28
+ };
+
+ for (const check& c : checks)
+ {
+ std::cout << "row=" << c.row << "; col=" << c.col << std::endl;
+ size_t xf = sh->get_cell_format(c.row, c.col);
+
+ const ss::cell_format_t* cf = styles.get_cell_format(xf);
+ assert(cf);
+ assert(c.apply_align == cf->apply_alignment);
+
+ if (!cf->apply_alignment)
+ continue;
+
+ assert(c.hor_align == cf->hor_align);
+ assert(c.ver_align == cf->ver_align);
+ }
+}
+
+void test_gnumeric_cell_properties_wrap_and_shrink()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ // NB : Gnumeric doesn't appear to support shrink-to-fit, so we only check
+ // wrap-text for now. When Gnumeric supports shrink-to-fit, re-generate the
+ // test file from test/xls-xml/cell-properties/wrap-and-shrink.xml.
+
+ fs::path filepath = SRCDIR"/test/gnumeric/cell-properties/wrap-and-shrink.gnumeric";
+ auto doc = load_doc(filepath);
+
+ const ss::styles& styles = doc->get_styles();
+ const ss::sheet* sh = doc->get_sheet(0);
+ assert(sh);
+
+ std::size_t xfid = sh->get_cell_format(0, 1); // B1
+ const ss::cell_format_t* xf = styles.get_cell_format(xfid);
+ assert(xf);
+ assert(xf->wrap_text);
+ assert(!*xf->wrap_text);
+// assert(xf->shrink_to_fit);
+// assert(!*xf->shrink_to_fit);
+
+ xfid = sh->get_cell_format(1, 1); // B2
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+ assert(xf->wrap_text);
+ assert(*xf->wrap_text);
+// assert(xf->shrink_to_fit);
+// assert(!*xf->shrink_to_fit);
+
+ xfid = sh->get_cell_format(2, 1); // B3
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+ assert(xf->wrap_text);
+ assert(!*xf->wrap_text);
+// assert(xf->shrink_to_fit);
+// assert(*xf->shrink_to_fit);
+}
+
+void test_gnumeric_background_fill()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ fs::path filepath = SRCDIR"/test/gnumeric/background-color/standard.gnumeric";
+ auto doc = load_doc(filepath);
+
+ ss::styles& styles = doc->get_styles();
+
+ ss::sheet* sh = doc->get_sheet(0);
+ assert(sh);
+
+ struct check
+ {
+ ss::row_t row;
+ ss::col_t col;
+ ss::fill_pattern_t pattern_type;
+ ss::color_t fg_color;
+ };
+
+ std::vector<check> checks =
+ {
+ { 1, 0, ss::fill_pattern_t::solid, { 255, 192, 0, 0 } }, // A2 - dark red
+ { 2, 0, ss::fill_pattern_t::solid, { 255, 255, 0, 0 } }, // A3 - red
+ { 3, 0, ss::fill_pattern_t::solid, { 255, 255, 192, 0 } }, // A4 - orange
+ { 4, 0, ss::fill_pattern_t::solid, { 255, 255, 255, 0 } }, // A5 - yellow
+ { 5, 0, ss::fill_pattern_t::solid, { 255, 146, 208, 80 } }, // A6 - light green
+ { 6, 0, ss::fill_pattern_t::solid, { 255, 0, 176, 80 } }, // A7 - green
+ { 7, 0, ss::fill_pattern_t::solid, { 255, 0, 176, 240 } }, // A8 - light blue
+ { 8, 0, ss::fill_pattern_t::solid, { 255, 0, 112, 192 } }, // A9 - blue
+ { 9, 0, ss::fill_pattern_t::solid, { 255, 0, 32, 96 } }, // A10 - dark blue
+ { 10, 0, ss::fill_pattern_t::solid, { 255, 112, 48, 160 } }, // A11 - purple
+ };
+
+ ss::color_t color_white(255, 255, 255, 255);
+
+ for (const check& c : checks)
+ {
+ size_t xf = sh->get_cell_format(c.row, c.col);
+
+ const ss::cell_format_t* cf = styles.get_cell_format(xf);
+ assert(cf);
+
+ const ss::fill_t* fill_data = styles.get_fill(cf->fill);
+ assert(fill_data);
+ assert(fill_data->pattern_type == c.pattern_type);
+ assert(fill_data->fg_color == c.fg_color);
+
+ // The font colors are all white in the colored cells.
+ const ss::font_t* font_data = styles.get_font(cf->font);
+ assert(font_data);
+
+ assert(font_data->color == color_white);
+ }
+}
+
+void test_gnumeric_colored_text()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ fs::path filepath = SRCDIR"/test/gnumeric/colored-text/input.gnumeric";
+ auto doc = load_doc(filepath);
+
+ const ss::sheet* sheet1 = doc->get_sheet("ColoredText");
+ assert(sheet1);
+
+ const ss::shared_strings& ss = doc->get_shared_strings();
+
+ const ss::styles& styles = doc->get_styles();
+
+ // Column A contains colored cells.
+
+ struct check
+ {
+ ss::row_t row;
+ ss::color_elem_t red;
+ ss::color_elem_t green;
+ ss::color_elem_t blue;
+ std::string text;
+ };
+
+ std::vector<check> checks = {
+ { 1, 0xC0, 0x00, 0x00, "Dark Red" },
+ { 2, 0xFF, 0x00, 0x00, "Red" },
+ { 3, 0xFF, 0xC0, 0x00, "Orange" },
+ { 4, 0xFF, 0xFF, 0x00, "Yellow" },
+ { 5, 0x92, 0xD0, 0x50, "Light Green" },
+ { 6, 0x00, 0xB0, 0x50, "Green" },
+ { 7, 0x00, 0xB0, 0xF0, "Light Blue" },
+ { 8, 0x00, 0x70, 0xC0, "Blue" },
+ { 9, 0x00, 0x20, 0x60, "Dark Blue" },
+ { 10, 0x70, 0x30, 0xA0, "Purple" },
+ };
+
+ for (const check& c : checks)
+ {
+ size_t xfi = sheet1->get_cell_format(c.row, 0);
+ const ss::cell_format_t* xf = styles.get_cell_format(xfi);
+ assert(xf);
+
+ const ss::font_t* font = styles.get_font(xf->font);
+ assert(font);
+ assert(font->color);
+ assert(font->color.value().red == c.red);
+ assert(font->color.value().green == c.green);
+ assert(font->color.value().blue == c.blue);
+
+ size_t si = sheet1->get_string_identifier(c.row, 0);
+ const std::string* s = ss.get_string(si);
+ assert(s);
+ assert(*s == c.text);
+ }
+
+ {
+ // Cell B2 contains mix-colored text.
+ size_t si = sheet1->get_string_identifier(1, 1);
+ const std::string* s = ss.get_string(si);
+ assert(s);
+ assert(*s == "Red and Blue");
+ const spreadsheet::format_runs_t* fmt_runs = ss.get_format_runs(si);
+ assert(fmt_runs);
+
+ // There should be 2 segments that are color-formatted.
+ assert(fmt_runs->size() == 2);
+
+ // The 'Red' segment should be in red color.
+ const spreadsheet::format_run* fmt = &fmt_runs->at(0);
+ assert(fmt->color.alpha == 0xFF);
+ assert(fmt->color.red == 0xFF);
+ assert(fmt->color.green == 0);
+ assert(fmt->color.blue == 0);
+ assert(fmt->pos == 0);
+ assert(fmt->size == 3);
+
+ // The 'Blue' segment should be in blue color.
+ fmt = &fmt_runs->at(1);
+ assert(fmt->color.alpha == 0xFF);
+ assert(fmt->color.red == 0);
+ assert(fmt->color.green == 0x00);
+ assert(fmt->color.blue == 0xFF);
+ assert(fmt->pos == 8);
+ assert(fmt->size == 4);
+ }
+
+ {
+ // Cell B3 too
+ size_t si = sheet1->get_string_identifier(2, 1);
+ const std::string* s = ss.get_string(si);
+ assert(s);
+ assert(*s == "Green and Orange");
+ const spreadsheet::format_runs_t* fmt_runs = ss.get_format_runs(si);
+ assert(fmt_runs);
+
+ assert(fmt_runs->size() == 2);
+
+ // 'Green' segment
+ const spreadsheet::format_run* fmt = &fmt_runs->at(0);
+ assert(fmt->color.alpha == 0xFF);
+ assert(fmt->color.red == 0);
+ assert(fmt->color.green == 0xFF);
+ assert(fmt->color.blue == 0);
+ assert(fmt->pos == 0);
+ assert(fmt->size == 5);
+
+ // 'Orange' segment
+ fmt = &fmt_runs->at(1);
+ assert(fmt->color.alpha == 0xFF);
+ assert(fmt->color.red == 0xFF);
+ assert(fmt->color.green == 0x99);
+ assert(fmt->color.blue == 0);
+ assert(fmt->pos == 10);
+ assert(fmt->size == 6);
+ }
+}
+
+void test_gnumeric_text_formats()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ fs::path filepath = SRCDIR"/test/gnumeric/text-formats/input.gnumeric";
+ auto doc = load_doc(filepath);
+ assert(doc);
+
+ const auto& styles_pool = doc->get_styles();
+
+ auto get_font = [&styles_pool](const ss::sheet& sh, ss::row_t row, ss::col_t col)
+ {
+ std::size_t xf = sh.get_cell_format(row, col);
+
+ const ss::cell_format_t* cell_format = styles_pool.get_cell_format(xf);
+ assert(cell_format);
+
+ const ss::font_t* font = styles_pool.get_font(cell_format->font);
+ assert(font);
+
+ return font;
+ };
+
+ auto check_cell_bold = [&get_font](const ss::sheet& sh, ss::row_t row, ss::col_t col, bool expected)
+ {
+ const ss::font_t* font = get_font(sh, row, col);
+
+ if (expected)
+ {
+ if (font->bold && *font->bold)
+ return true;
+
+ std::cerr << "expected to be bold but it is not "
+ << "(sheet=" << sh.get_index() << "; row=" << row << "; column=" << col << ")"
+ << std::endl;
+
+ return false;
+ }
+ else
+ {
+ if (!font->bold || !*font->bold)
+ return true;
+
+ std::cerr << "expected to be non-bold but it is bold "
+ << "(sheet=" << sh.get_index() << "; row=" << row << "; column=" << col << ")"
+ << std::endl;
+
+ return false;
+ }
+ };
+
+ auto check_cell_italic = [&get_font](const ss::sheet& sh, ss::row_t row, ss::col_t col, bool expected)
+ {
+ const ss::font_t* font = get_font(sh, row, col);
+
+ if (expected)
+ {
+ if (font->italic && *font->italic)
+ return true;
+
+ std::cerr << "expected to be italic but it is not "
+ << "(sheet=" << sh.get_index() << "; row=" << row << "; column=" << col << ")"
+ << std::endl;
+
+ return false;
+ }
+ else
+ {
+ if (!font->italic || !*font->italic)
+ return true;
+
+ std::cerr << "expected to be non-italic but it is italic "
+ << "(sheet=" << sh.get_index() << "; row=" << row << "; column=" << col << ")"
+ << std::endl;
+
+ return false;
+ }
+ };
+
+ auto check_cell_text = [&doc](const ss::sheet& sh, ss::row_t row, ss::col_t col, std::string_view expected)
+ {
+ const auto& sstrings = doc->get_shared_strings();
+
+ std::size_t si = sh.get_string_identifier(row, col);
+ const std::string* s = sstrings.get_string(si);
+ if (!s)
+ {
+ std::cerr << "expected='" << expected << "'; actual=<none> "
+ << "(sheet=" << sh.get_index() << "; row=" << row << "; column=" << col << ")"
+ << std::endl;
+
+ return false;
+ }
+
+ if (*s == expected)
+ return true;
+
+ std::cerr << "expected='" << expected << "'; actual='" << *s << "' "
+ << "(sheet=" << sh.get_index() << "; row=" << row << "; column=" << col << ")"
+ << std::endl;
+
+ return false;
+ };
+
+ const ss::sheet* sheet1 = doc->get_sheet("Text Properties");
+ assert(sheet1);
+
+ ss::row_t row = 0;
+ ss::col_t col = 0;
+
+ // A1 - unformatted
+ assert(check_cell_text(*sheet1, row, col, "Normal Text"));
+ assert(check_cell_bold(*sheet1, row, col, false));
+ assert(check_cell_italic(*sheet1, row, col, false));
+
+ // A2 - bold
+ row = 1;
+ assert(check_cell_text(*sheet1, row, col, "Bold Text"));
+ assert(check_cell_bold(*sheet1, row, col, true));
+ assert(check_cell_italic(*sheet1, row, col, false));
+
+ // A3 - italic
+ row = 2;
+ assert(check_cell_text(*sheet1, row, col, "Italic Text"));
+ assert(check_cell_bold(*sheet1, row, col, false));
+ assert(check_cell_italic(*sheet1, row, col, true));
+
+ // A4 - bold and italic
+ row = 3;
+ assert(check_cell_text(*sheet1, row, col, "Bold and Italic Text"));
+ assert(check_cell_bold(*sheet1, row, col, true));
+ assert(check_cell_italic(*sheet1, row, col, true));
+
+ // A5 - bold and italic mixed - base cell is unformatted and text contains
+ // format runs.
+ row = 4;
+ assert(check_cell_text(*sheet1, row, col, "Bold and Italic mixed"));
+ assert(check_cell_bold(*sheet1, row, col, false));
+ assert(check_cell_italic(*sheet1, row, col, false));
+
+ std::size_t si = sheet1->get_string_identifier(row, col);
+ const ss::format_runs_t* runs = doc->get_shared_strings().get_format_runs(si);
+ assert(runs);
+ assert(runs->size() == 2u);
+
+ // Bold and ...
+ // ^^^^
+ assert(runs->at(0).pos == 0);
+ assert(runs->at(0).size == 4);
+ assert(runs->at(0).bold);
+ assert(!runs->at(0).italic);
+
+ // Bold and Italic
+ // ^^^^^^
+ assert(runs->at(1).pos == 9);
+ assert(runs->at(1).size == 6);
+ assert(!runs->at(1).bold);
+ assert(runs->at(1).italic);
+
+ // A6
+ row = 5;
+ assert(check_cell_text(*sheet1, row, col, "Bold base with non-bold part"));
+ assert(check_cell_bold(*sheet1, row, col, true));
+ assert(check_cell_italic(*sheet1, row, col, false));
+#if 0 // FIXME: see #183
+ si = sheet1->get_string_identifier(row, col);
+ runs = doc->get_shared_strings().get_format_runs(si);
+ assert(runs);
+ assert(runs->size() == 1u);
+#endif
+
+ // Rest of the cells are imported as unformatted for now, until we support
+ // more format properties. See #182.
+ row = 6;
+ assert(check_cell_text(*sheet1, row, col, "Only partially underlined"));
+
+ {
+ row = 7;
+ assert(check_cell_text(*sheet1, row, col, "All Underlined"));
+ const ss::font_t* font = get_font(*sheet1, row, col);
+ assert(font->underline_style);
+ assert(*font->underline_style == ss::underline_t::single_line);
+ }
+
+ {
+ row = 8;
+ assert(check_cell_text(*sheet1, row, col, "Bold and Underlined"));
+ const ss::font_t* font = get_font(*sheet1, row, col);
+ assert(font->underline_style);
+ assert(*font->underline_style == ss::underline_t::single_line);
+ assert(font->bold);
+ assert(*font->bold);
+ }
+
+ {
+ row = 9;
+ assert(check_cell_text(*sheet1, row, col, "All Strikethrough"));
+ const ss::font_t* font = get_font(*sheet1, row, col);
+ assert(font->strikethrough_style);
+ assert(*font->strikethrough_style == ss::strikethrough_style_t::solid);
+
+ assert(font->strikethrough_type);
+ assert(*font->strikethrough_type == ss::strikethrough_type_t::single_type);
+
+ assert(font->strikethrough_width);
+ assert(*font->strikethrough_width == ss::strikethrough_width_t::width_auto);
+ }
+
+ row = 10;
+ assert(check_cell_text(*sheet1, row, col, "Partial strikethrough"));
+ row = 11;
+ assert(check_cell_text(*sheet1, row, col, "Superscript"));
+ row = 12;
+ assert(check_cell_text(*sheet1, row, col, "Subscript"));
+ row = 13;
+ assert(check_cell_text(*sheet1, row, col, "x2 + y2 = 102"));
+ row = 14;
+ assert(check_cell_text(*sheet1, row, col, "xi = yi + zi"));
+
+ {
+ const ss::sheet* sheet2 = doc->get_sheet("Fonts");
+ assert(sheet2);
+
+ struct check
+ {
+ ss::row_t row;
+ std::string_view font_name;
+ double font_unit;
+ };
+
+ check checks[] = {
+ { 0, "Sans", 12.0 },
+ { 1, "FreeSans", 18.0 },
+ { 2, "Serif", 14.0 },
+ { 3, "Monospace", 9.0 },
+ { 4, "DejaVu Sans Mono", 11.0 },
+ };
+
+ for (const auto& c : checks)
+ {
+ std::size_t xf = sheet2->get_cell_format(c.row, 0);
+ const ss::cell_format_t* cell_format = styles_pool.get_cell_format(xf);
+ assert(cell_format);
+ const ss::font_t* font = styles_pool.get_font(cell_format->font);
+ assert(font);
+ assert(font->name == c.font_name);
+ assert(font->size == c.font_unit);
+
+ // Columns A and B should have the same font.
+ xf = sheet2->get_cell_format(c.row, 1);
+ cell_format = styles_pool.get_cell_format(xf);
+ assert(cell_format);
+ font = styles_pool.get_font(cell_format->font);
+ assert(font);
+ assert(font->name == c.font_name);
+ assert(font->size == c.font_unit);
+ }
+ }
+
+ {
+ const ss::sheet* sheet3 = doc->get_sheet("Mixed Fonts");
+ assert(sheet3);
+
+ // A1
+ row = 0;
+ col = 0;
+ assert(check_cell_text(*sheet3, row, col, "C++ has class and struct as keywords."));
+
+ // Base cell has Serif 12-pt font applied
+ auto xf = sheet3->get_cell_format(row, col);
+ const ss::cell_format_t* fmt = styles_pool.get_cell_format(xf);
+ assert(fmt);
+ const ss::font_t* font = styles_pool.get_font(fmt->font);
+ assert(font);
+ assert(font->name == "Serif");
+ assert(font->size == 12.0f);
+
+ // two segments where Monospace font is applied
+ si = sheet3->get_string_identifier(row, col);
+ runs = doc->get_shared_strings().get_format_runs(si);
+ assert(runs);
+ assert(runs->size() == 2u);
+
+ // C++ has class ...
+ // ^^^^^
+ assert(runs->at(0).pos == 8);
+ assert(runs->at(0).size == 5);
+ assert(runs->at(0).font == "Monospace");
+
+ // ... and struct as ...
+ // ^^^^^^
+ assert(runs->at(1).pos == 18);
+ assert(runs->at(1).size == 6);
+ assert(runs->at(1).font == "Monospace");
+
+ // A2
+ row = 1;
+ assert(check_cell_text(*sheet3, row, col, "Text with 12-point font, 24-point font, and 36-point font mixed."));
+ si = sheet3->get_string_identifier(row, col);
+ runs = doc->get_shared_strings().get_format_runs(si);
+ assert(runs);
+ assert(runs->size() == 6u);
+
+ // with 12-point font, ...
+ // ^^
+ assert(runs->at(0).pos == 10);
+ assert(runs->at(0).size == 2);
+ assert(runs->at(0).font_size == 12.0f);
+ assert(runs->at(0).color == ss::color_t(0xFF, 0xFF, 0, 0)); // red
+
+ // with 12-point font, ...
+ // ^^^^^^
+ assert(runs->at(1).pos == 12);
+ assert(runs->at(1).size == 6);
+ assert(runs->at(1).font_size == 12.0f);
+
+ // 24-point font,
+ // ^^
+ assert(runs->at(2).pos == 25);
+ assert(runs->at(2).size == 2);
+ assert(runs->at(2).font_size == 24.0f);
+ assert(runs->at(2).color == ss::color_t(0xFF, 0xFF, 0, 0)); // red
+
+ // 24-point font,
+ // ^^^^^^
+ assert(runs->at(3).pos == 27);
+ assert(runs->at(3).size == 6);
+ assert(runs->at(3).font_size == 24.0f);
+
+ // and 36-point font
+ // ^^
+ assert(runs->at(4).pos == 44);
+ assert(runs->at(4).size == 2);
+ assert(runs->at(4).font_size == 36.0f);
+ assert(runs->at(4).color == ss::color_t(0xFF, 0xFF, 0, 0)); // red
+
+ // and 36-point font
+ // ^^^^^^
+ assert(runs->at(5).pos == 46);
+ assert(runs->at(5).size == 6);
+ assert(runs->at(5).font_size == 36.0f);
+ }
+}
+
+void test_gnumeric_cell_borders_single_cells()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ fs::path filepath = SRCDIR"/test/gnumeric/borders/single-cells.gnumeric";
+ auto doc = load_doc(filepath);
+ assert(doc);
+
+ ss::styles& styles = doc->get_styles();
+
+ ss::sheet* sh = doc->get_sheet(0);
+ assert(sh);
+
+ struct check
+ {
+ ss::row_t row;
+ ss::col_t col;
+ ss::border_style_t style;
+ };
+
+ std::vector<check> checks =
+ {
+ { 3, 1, ss::border_style_t::hair },
+ { 5, 1, ss::border_style_t::dotted },
+ { 7, 1, ss::border_style_t::dash_dot_dot },
+ { 9, 1, ss::border_style_t::dash_dot },
+ { 11, 1, ss::border_style_t::dashed },
+ { 13, 1, ss::border_style_t::thin },
+ { 1, 3, ss::border_style_t::medium_dash_dot_dot },
+ { 3, 3, ss::border_style_t::slant_dash_dot },
+ { 5, 3, ss::border_style_t::medium_dash_dot },
+ { 7, 3, ss::border_style_t::medium_dashed },
+ { 9, 3, ss::border_style_t::medium },
+ { 11, 3, ss::border_style_t::thick },
+ { 13, 3, ss::border_style_t::double_border },
+ };
+
+ for (const check& c : checks)
+ {
+ std::cout << "(row: " << c.row << "; col: " << c.col << "; expected: " << int(c.style) << ")" << std::endl;
+ size_t xf = sh->get_cell_format(c.row, c.col);
+ const ss::cell_format_t* cf = styles.get_cell_format(xf);
+ assert(cf);
+ assert(cf->apply_border);
+
+ const ss::border_t* border = styles.get_border(cf->border);
+ assert(border);
+ assert(border->top.style == c.style);
+ assert(border->bottom.style == c.style);
+ assert(border->left.style == c.style);
+ assert(border->right.style == c.style);
+ }
+}
+
+void test_gnumeric_cell_borders_directions()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ fs::path filepath = SRCDIR"/test/gnumeric/borders/directions.gnumeric";
+ auto doc = load_doc(filepath);
+ assert(doc);
+
+ ss::styles& styles = doc->get_styles();
+
+ ss::sheet* sh = doc->get_sheet(0);
+ assert(sh);
+
+ struct check
+ {
+ ss::row_t row;
+ ss::col_t col;
+ ss::border_direction_t dir;
+ };
+
+ std::vector<check> checks =
+ {
+ { 1, 1, ss::border_direction_t::top },
+ { 3, 1, ss::border_direction_t::left },
+ { 5, 1, ss::border_direction_t::right },
+ { 7, 1, ss::border_direction_t::bottom },
+ { 9, 1, ss::border_direction_t::diagonal_tl_br },
+ { 11, 1, ss::border_direction_t::diagonal_bl_tr },
+ { 13, 1, ss::border_direction_t::diagonal },
+ };
+
+ const ss::color_t black{255, 0, 0, 0};
+
+ for (const check& c : checks)
+ {
+ size_t xf = sh->get_cell_format(c.row, c.col);
+ const ss::cell_format_t* cf = styles.get_cell_format(xf);
+ assert(cf);
+ assert(cf->apply_border);
+
+ const ss::border_t* border = styles.get_border(cf->border);
+ assert(border);
+
+ switch (c.dir)
+ {
+ case ss::border_direction_t::top:
+ assert(border->top.style);
+ assert(*border->top.style == ss::border_style_t::thin);
+ assert(border->top.border_color);
+ assert(*border->top.border_color == black);
+ assert(!border->top.border_width);
+ assert(!border->bottom.style);
+ assert(!border->bottom.border_color);
+ assert(!border->bottom.border_width);
+ assert(!border->left.style);
+ assert(!border->left.border_color);
+ assert(!border->left.border_width);
+ assert(!border->right.style);
+ assert(!border->right.border_color);
+ assert(!border->right.border_width);
+ assert(!border->diagonal.style);
+ assert(!border->diagonal.border_color);
+ assert(!border->diagonal.border_width);
+ assert(!border->diagonal_bl_tr.style);
+ assert(!border->diagonal_bl_tr.border_color);
+ assert(!border->diagonal_bl_tr.border_width);
+ assert(!border->diagonal_tl_br.style);
+ assert(!border->diagonal_tl_br.border_color);
+ assert(!border->diagonal_tl_br.border_width);
+ break;
+ case ss::border_direction_t::left:
+ assert(!border->top.style);
+ assert(!border->top.border_color);
+ assert(!border->top.border_width);
+ assert(!border->bottom.style);
+ assert(!border->bottom.border_color);
+ assert(!border->bottom.border_width);
+ assert(border->left.style);
+ assert(*border->left.style == ss::border_style_t::thin);
+ assert(border->left.border_color);
+ assert(*border->left.border_color == black);
+ assert(!border->left.border_width);
+ assert(!border->right.style);
+ assert(!border->right.border_color);
+ assert(!border->right.border_width);
+ assert(!border->diagonal.style);
+ assert(!border->diagonal.border_color);
+ assert(!border->diagonal.border_width);
+ assert(!border->diagonal_bl_tr.style);
+ assert(!border->diagonal_bl_tr.border_color);
+ assert(!border->diagonal_bl_tr.border_width);
+ assert(!border->diagonal_tl_br.style);
+ assert(!border->diagonal_tl_br.border_color);
+ assert(!border->diagonal_tl_br.border_width);
+ break;
+ case ss::border_direction_t::right:
+ assert(!border->top.style);
+ assert(!border->top.border_color);
+ assert(!border->top.border_width);
+ assert(!border->bottom.style);
+ assert(!border->bottom.border_color);
+ assert(!border->bottom.border_width);
+ assert(!border->left.style);
+ assert(!border->left.border_color);
+ assert(!border->left.border_width);
+ assert(border->right.style);
+ assert(*border->right.style == ss::border_style_t::thin);
+ assert(border->right.border_color);
+ assert(*border->right.border_color == black);
+ assert(!border->right.border_width);
+ assert(!border->diagonal.style);
+ assert(!border->diagonal.border_color);
+ assert(!border->diagonal.border_width);
+ assert(!border->diagonal_bl_tr.style);
+ assert(!border->diagonal_bl_tr.border_color);
+ assert(!border->diagonal_bl_tr.border_width);
+ assert(!border->diagonal_tl_br.style);
+ assert(!border->diagonal_tl_br.border_color);
+ assert(!border->diagonal_tl_br.border_width);
+ break;
+ case ss::border_direction_t::bottom:
+ assert(!border->top.style);
+ assert(!border->top.border_color);
+ assert(!border->top.border_width);
+ assert(border->bottom.style);
+ assert(*border->bottom.style == ss::border_style_t::thin);
+ assert(border->bottom.border_color);
+ assert(*border->bottom.border_color == black);
+ assert(!border->bottom.border_width);
+ assert(!border->left.style);
+ assert(!border->left.border_color);
+ assert(!border->left.border_width);
+ assert(!border->right.style);
+ assert(!border->right.border_color);
+ assert(!border->right.border_width);
+ assert(!border->diagonal.style);
+ assert(!border->diagonal.border_color);
+ assert(!border->diagonal.border_width);
+ assert(!border->diagonal_bl_tr.style);
+ assert(!border->diagonal_bl_tr.border_color);
+ assert(!border->diagonal_bl_tr.border_width);
+ assert(!border->diagonal_tl_br.style);
+ assert(!border->diagonal_tl_br.border_color);
+ assert(!border->diagonal_tl_br.border_width);
+ break;
+ case ss::border_direction_t::diagonal:
+ assert(!border->top.style);
+ assert(!border->top.border_color);
+ assert(!border->top.border_width);
+ assert(!border->bottom.style);
+ assert(!border->bottom.border_color);
+ assert(!border->bottom.border_width);
+ assert(!border->left.style);
+ assert(!border->left.border_color);
+ assert(!border->left.border_width);
+ assert(!border->right.style);
+ assert(!border->right.border_color);
+ assert(!border->right.border_width);
+ assert(!border->diagonal.style);
+ assert(!border->diagonal.border_color);
+ assert(!border->diagonal.border_width);
+ assert(border->diagonal_bl_tr.style);
+ assert(*border->diagonal_bl_tr.style == ss::border_style_t::thin);
+ assert(border->diagonal_bl_tr.border_color);
+ assert(*border->diagonal_bl_tr.border_color == black);
+ assert(!border->diagonal_bl_tr.border_width);
+ assert(border->diagonal_tl_br.style);
+ assert(*border->diagonal_tl_br.style == ss::border_style_t::thin);
+ assert(border->diagonal_tl_br.border_color);
+ assert(*border->diagonal_tl_br.border_color == black);
+ assert(!border->diagonal_tl_br.border_width);
+ break;
+ case ss::border_direction_t::diagonal_tl_br:
+ assert(!border->top.style);
+ assert(!border->top.border_color);
+ assert(!border->top.border_width);
+ assert(!border->bottom.style);
+ assert(!border->bottom.border_color);
+ assert(!border->bottom.border_width);
+ assert(!border->left.style);
+ assert(!border->left.border_color);
+ assert(!border->left.border_width);
+ assert(!border->right.style);
+ assert(!border->right.border_color);
+ assert(!border->right.border_width);
+ assert(!border->diagonal.style);
+ assert(!border->diagonal.border_color);
+ assert(!border->diagonal.border_width);
+ assert(!border->diagonal_bl_tr.style);
+ assert(!border->diagonal_bl_tr.border_color);
+ assert(!border->diagonal_bl_tr.border_width);
+ assert(border->diagonal_tl_br.style);
+ assert(*border->diagonal_tl_br.style == ss::border_style_t::thin);
+ assert(border->diagonal_tl_br.border_color);
+ assert(*border->diagonal_tl_br.border_color == black);
+ assert(!border->diagonal_tl_br.border_width);
+ break;
+ case ss::border_direction_t::diagonal_bl_tr:
+ assert(!border->top.style);
+ assert(!border->top.border_color);
+ assert(!border->top.border_width);
+ assert(!border->bottom.style);
+ assert(!border->bottom.border_color);
+ assert(!border->bottom.border_width);
+ assert(!border->left.style);
+ assert(!border->left.border_color);
+ assert(!border->left.border_width);
+ assert(!border->right.style);
+ assert(!border->right.border_color);
+ assert(!border->right.border_width);
+ assert(!border->diagonal.style);
+ assert(!border->diagonal.border_color);
+ assert(!border->diagonal.border_width);
+ assert(border->diagonal_bl_tr.style);
+ assert(*border->diagonal_bl_tr.style == ss::border_style_t::thin);
+ assert(border->diagonal_bl_tr.border_color);
+ assert(*border->diagonal_bl_tr.border_color == black);
+ assert(!border->diagonal_bl_tr.border_width);
+ assert(!border->diagonal_tl_br.style);
+ assert(!border->diagonal_tl_br.border_color);
+ assert(!border->diagonal_tl_br.border_width);
+ break;
+ default:
+ assert(!"unhandled direction!");
+ }
+ }
+}
+
+void test_gnumeric_cell_borders_colors()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ using ss::color_t;
+ using ss::border_style_t;
+
+ fs::path filepath = SRCDIR"/test/gnumeric/borders/colors.gnumeric";
+ auto doc = load_doc(filepath);
+ assert(doc);
+
+ ss::styles& styles = doc->get_styles();
+
+ ss::sheet* sh = doc->get_sheet(0);
+ assert(sh);
+
+ struct check
+ {
+ ss::row_t row;
+ ss::col_t col;
+ color_t color;
+ };
+
+ std::vector<check> checks =
+ {
+ { 2, 1, color_t(0xFF, 0xFF, 0, 0) }, // B3 - red
+ { 3, 1, color_t(0xFF, 0, 0x70, 0xC0) }, // B4 - blue
+ { 4, 1, color_t(0xFF, 0, 0xB0, 0x50) }, // B5 - green
+ };
+
+ for (const check& c : checks)
+ {
+ size_t xf = sh->get_cell_format(c.row, c.col); // B3
+
+ const ss::cell_format_t* cf = styles.get_cell_format(xf);
+ assert(cf);
+ assert(cf->apply_border);
+
+ const ss::border_t* border = styles.get_border(cf->border);
+ assert(border);
+
+ assert(!border->left.style);
+ assert(border->right.style);
+ assert(*border->right.style == border_style_t::thick);
+ assert(!border->top.style);
+ assert(!border->bottom.style);
+
+ assert(border->right.border_color == c.color);
+ }
+
+ // B7 contains yellow left border, purple right border, and light blue
+ // diagonal borders.
+
+ size_t xf = sh->get_cell_format(6, 1); // B7
+
+ const ss::cell_format_t* cf = styles.get_cell_format(xf);
+ assert(cf);
+ assert(cf->apply_border);
+
+ const ss::border_t* border = styles.get_border(cf->border);
+ assert(border);
+
+ assert(border->left.style == border_style_t::thick);
+ assert(border->left.border_color == color_t(0xFF, 0xFF, 0xFF, 0)); // yellow
+
+ assert(border->right.style == border_style_t::thick);
+ assert(border->right.border_color == color_t(0xFF, 0x70, 0x30, 0xA0)); // purple
+
+ assert(border->diagonal_bl_tr.style == border_style_t::thick);
+ assert(border->diagonal_bl_tr.border_color == color_t(0xFF, 0x00, 0xB0, 0xF0)); // light blue
+
+ assert(border->diagonal_tl_br.style == border_style_t::thick);
+ assert(border->diagonal_tl_br.border_color == color_t(0xFF, 0x00, 0xB0, 0xF0)); // light blue
+
+ // B7 also contains multi-line string. Test that as well.
+ ixion::model_context& model = doc->get_model_context();
+ ixion::string_id_t sid = model.get_string_identifier(ixion::abs_address_t(0,6,1));
+ const std::string* s = model.get_string(sid);
+ assert(s);
+ assert(*s == "<- Yellow\nPurple ->\nLight Blue \\");
+}
+
+void test_gnumeric_number_format()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ fs::path filepath = SRCDIR"/test/gnumeric/number-formats/input.gnumeric";
+ auto doc = load_doc(filepath);
+ assert(doc);
+
+ const spreadsheet::styles& styles = doc->get_styles();
+
+ const spreadsheet::sheet* sh = doc->get_sheet(0);
+ assert(sh);
+
+ struct check
+ {
+ ss::row_t row;
+ ss::col_t col;
+ std::string_view expected;
+ };
+
+ std::vector<check> checks =
+ {
+ { 1, 1, "[$-F800]dddd\\,\\ mmmm\\ dd\\,\\ yyyy" },
+ { 2, 1, "[$-409]mmmm\\ d\\,\\ yyyy;@" },
+ { 3, 1, "m/d/yy;@" },
+ { 4, 1, "m/d/yy h:mm" }, // General Date
+ };
+
+ for (const check& c : checks)
+ {
+ size_t xf = sh->get_cell_format(c.row, c.col);
+ const spreadsheet::cell_format_t* cf = styles.get_cell_format(xf);
+ assert(cf);
+
+ const spreadsheet::number_format_t* nf = styles.get_number_format(cf->number_format);
+ assert(nf);
+ std::cout << "row=" << c.row << "; col=" << c.col << "; expected='"
+ << c.expected << "'; actual='" << (nf->format_string ? *nf->format_string : "") << "'" << std::endl;
+ assert(nf->format_string == c.expected);
+ }
+}
+
+} // anonymous namespace
+
+int main()
+{
+ test_gnumeric_detection();
+ test_gnumeric_create_filter();
+ test_gnumeric_import();
+ test_gnumeric_column_widths_row_heights();
+ test_gnumeric_auto_filter();
+ test_gnumeric_hidden_rows_columns();
+ test_gnumeric_merged_cells();
+ test_gnumeric_text_alignment();
+ test_gnumeric_cell_properties_wrap_and_shrink();
+ test_gnumeric_background_fill();
+ test_gnumeric_colored_text();
+ test_gnumeric_text_formats();
+ test_gnumeric_cell_borders_single_cells();
+ test_gnumeric_cell_borders_directions();
+ test_gnumeric_cell_borders_colors();
+ test_gnumeric_number_format();
+
+ return EXIT_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/orcus_test_import_ods.cpp b/src/orcus_test_import_ods.cpp
new file mode 100644
index 0000000..05ae657
--- /dev/null
+++ b/src/orcus_test_import_ods.cpp
@@ -0,0 +1,1065 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "test_global.hpp"
+#include <orcus/orcus_import_ods.hpp>
+
+#include <orcus/measurement.hpp>
+#include <orcus/spreadsheet/factory.hpp>
+#include <orcus/spreadsheet/styles.hpp>
+#include <orcus/spreadsheet/types.hpp>
+#include <orcus/stream.hpp>
+#include <orcus/string_pool.hpp>
+
+#include <cassert>
+#include <iostream>
+#include <sstream>
+
+#include "filesystem_env.hpp"
+
+namespace ss = orcus::spreadsheet;
+
+using orcus::test::stack_printer;
+
+namespace {
+
+struct test_model
+{
+ orcus::string_pool pool;
+ orcus::file_content content;
+ ss::styles styles;
+ ss::import_styles istyles;
+
+ test_model() : styles(), istyles(styles, pool) {}
+
+ void load(const fs::path& input_path)
+ {
+ if (!fs::is_regular_file(input_path))
+ {
+ std::ostringstream os;
+ os << input_path << " is not a regular file.";
+ throw std::runtime_error(os.str());
+ }
+
+ styles.clear();
+ content.load(input_path.string());
+ orcus::import_ods::read_styles(content.str(), &istyles);
+ }
+};
+
+bool verify_font_attrs(const ss::font_t& expected, const ss::font_t& actual)
+{
+ if (expected.name != actual.name)
+ {
+ std::cerr << "font name states differ!" << std::endl;
+ return false;
+ }
+
+ if (expected.name && *expected.name != *actual.name)
+ {
+ std::cerr << "font names differ!" << std::endl;
+ return false;
+ }
+
+ if (expected.size != actual.size)
+ {
+ std::cerr << "font size states differ!" << std::endl;
+ return false;
+ }
+
+ if (expected.size && *expected.size != *actual.size)
+ {
+ std::cerr << "font sizes differ!" << std::endl;
+ return false;
+ }
+
+ if (expected.bold != actual.bold)
+ {
+ std::cerr << "font bold states differ!" << std::endl;
+ return false;
+ }
+
+ if (expected.bold && *expected.bold != *actual.bold)
+ {
+ std::cerr << "font bold values differ!" << std::endl;
+ return false;
+ }
+
+ if (expected.italic != actual.italic)
+ {
+ std::cerr << "font italic states differ!" << std::endl;
+ return false;
+ }
+
+ if (expected.italic && *expected.italic != *actual.italic)
+ {
+ std::cerr << "font italic values differ!" << std::endl;
+ return false;
+ }
+
+ if (expected.underline_style != actual.underline_style)
+ {
+ std::cerr << "underline_style states differ!" << std::endl;
+ return false;
+ }
+
+ if (expected.underline_style && *expected.underline_style != *actual.underline_style)
+ {
+ std::cerr << "underline_style values differ!" << std::endl;
+ return false;
+ }
+
+ if (expected.underline_width != actual.underline_width)
+ {
+ std::cerr << "underline_width states differ!" << std::endl;
+ return false;
+ }
+
+ if (expected.underline_width && *expected.underline_width != *actual.underline_width)
+ {
+ std::cerr << "underline_width values differ!" << std::endl;
+ return false;
+ }
+
+ if (expected.underline_mode != actual.underline_mode)
+ {
+ std::cerr << "underline_mode states differ!" << std::endl;
+ return false;
+ }
+
+ if (expected.underline_mode && *expected.underline_mode != *actual.underline_mode)
+ {
+ std::cerr << "underline_mode values differ!" << std::endl;
+ return false;
+ }
+
+ if (expected.underline_type != actual.underline_type)
+ {
+ std::cerr << "underline_type states differ!" << std::endl;
+ return false;
+ }
+
+ if (expected.underline_type && *expected.underline_type != *actual.underline_type)
+ {
+ std::cerr << "underline_type values differ!" << std::endl;
+ return false;
+ }
+
+ if (expected.underline_color != actual.underline_color)
+ {
+ std::cerr << "underline_color states differ!" << std::endl;
+ return false;
+ }
+
+ if (expected.underline_color && *expected.underline_color != *actual.underline_color)
+ {
+ std::cerr << "underline_color values differ!" << std::endl;
+ return false;
+ }
+
+ if (expected.color != actual.color)
+ {
+ std::cerr << "font color states differ!" << std::endl;
+ return false;
+ }
+
+ if (expected.color && *expected.color != *actual.color)
+ {
+ std::cerr << "font color values differ!" << std::endl;
+ return false;
+ }
+
+ if (expected.strikethrough_style != actual.strikethrough_style)
+ {
+ std::cerr << "strikethrough_style states differ!" << std::endl;
+ return false;
+ }
+
+ if (expected.strikethrough_style && *expected.strikethrough_style != *actual.strikethrough_style)
+ {
+ std::cerr << "strikethrough_style values differ!" << std::endl;
+ return false;
+ }
+
+ if (expected.strikethrough_width != actual.strikethrough_width)
+ {
+ std::cerr << "strikethrough_width states differ!" << std::endl;
+ return false;
+ }
+
+ if (expected.strikethrough_width && *expected.strikethrough_width != *actual.strikethrough_width)
+ {
+ std::cerr << "strikethrough_width values differ!" << std::endl;
+ return false;
+ }
+
+ if (expected.strikethrough_type != actual.strikethrough_type)
+ {
+ std::cerr << "strikethrough_type states differ!" << std::endl;
+ return false;
+ }
+
+ if (expected.strikethrough_type && *expected.strikethrough_type != *actual.strikethrough_type)
+ {
+ std::cerr << "strikethrough_type values differ!" << std::endl;
+ return false;
+ }
+
+ if (expected.strikethrough_text != actual.strikethrough_text)
+ {
+ std::cerr << "strikethrough_text states differ!" << std::endl;
+ return false;
+ }
+
+ if (expected.strikethrough_text && *expected.strikethrough_text != *actual.strikethrough_text)
+ {
+ std::cerr << "strikethrough_text values differ!" << std::endl;
+ return false;
+ }
+
+ return true;
+}
+
+bool verify_fill_attrs(const ss::fill_t& expected, const ss::fill_t& actual)
+{
+ if (expected.pattern_type != actual.pattern_type)
+ {
+ std::cerr << "pattern_type states differ!" << std::endl;
+ return false;
+ }
+
+ if (expected.pattern_type && *expected.pattern_type != *actual.pattern_type)
+ {
+ std::cerr << "pattern types differ!" << std::endl;
+ return false;
+ }
+
+ if (expected.fg_color != actual.fg_color)
+ {
+ std::cerr << "fg_color states differ!" << std::endl;
+ return false;
+ }
+
+ if (expected.fg_color && *expected.fg_color != *actual.fg_color)
+ {
+ std::cerr << "foreground colors differ!" << std::endl;
+ return false;
+ }
+
+ if (expected.bg_color != actual.bg_color)
+ {
+ std::cerr << "bg_color states differ!" << std::endl;
+ return false;
+ }
+
+ if (expected.bg_color && *expected.bg_color != *actual.bg_color)
+ {
+ std::cerr << "background colors differ!" << std::endl;
+ return false;
+ }
+
+ return true;
+}
+
+bool verify_protection_attrs(const ss::protection_t& expected, const ss::protection_t& actual)
+{
+ if (expected.locked != actual.locked)
+ {
+ std::cerr << "locked states differ!" << std::endl;
+ return false;
+ }
+
+ if (expected.hidden != actual.hidden)
+ {
+ std::cerr << "hidden states differ!" << std::endl;
+ return false;
+ }
+
+ if (expected.print_content != actual.print_content)
+ {
+ std::cerr << "'print content' states differ!" << std::endl;
+ return false;
+ }
+
+ if (expected.formula_hidden != actual.formula_hidden)
+ {
+ std::cerr << "'formula hidden' states differ!" << std::endl;
+ return false;
+ }
+
+ return true;
+}
+
+bool verify_border_attrs(const ss::border_t& expected, const ss::border_t& actual)
+{
+ auto verify_single = [](std::string_view name, const ss::border_attrs_t& _expected, const ss::border_attrs_t& _actual)
+ {
+ if (_expected.style != _actual.style)
+ {
+ std::cerr << name << " border style states differ!" << std::endl;
+ return false;
+ }
+
+ if (_expected.style && *_expected.style != *_actual.style)
+ {
+ std::cerr << name << " border styles differ!" << std::endl;
+ return false;
+ }
+
+ if (_expected.border_color != _actual.border_color)
+ {
+ std::cerr << name << " border color states differ!" << std::endl;
+ return false;
+ }
+
+ if (_expected.border_color && *_expected.border_color != *_actual.border_color)
+ {
+ std::cerr << name << " border colors differ!" << std::endl;
+ return false;
+ }
+
+ if (_expected.border_width != _actual.border_width)
+ {
+ std::cerr << name << " border width states differ!" << std::endl;
+ return false;
+ }
+
+ if (_expected.border_width && *_expected.border_width != *_actual.border_width)
+ {
+ std::cerr << name << " border widths differ!" << std::endl;
+ return false;
+ }
+
+ return true;
+ };
+
+ if (!verify_single("top", expected.top, actual.top))
+ return false;
+
+ if (!verify_single("bottom", expected.bottom, actual.bottom))
+ return false;
+
+ if (!verify_single("left", expected.left, actual.left))
+ return false;
+
+ if (!verify_single("right", expected.right, actual.right))
+ return false;
+
+ if (!verify_single("diagonal", expected.diagonal, actual.diagonal))
+ return false;
+
+ if (!verify_single("diagonal_bl_tr", expected.diagonal_bl_tr, actual.diagonal_bl_tr))
+ return false;
+
+ if (!verify_single("diagonal_tl_br", expected.diagonal_tl_br, actual.diagonal_tl_br))
+ return false;
+
+ return true;
+}
+
+const ss::cell_style_t* find_cell_style_by_name(
+ std::string_view name, const ss::styles& styles)
+{
+ size_t n = styles.get_cell_styles_count();
+ for (size_t i = 0; i < n; ++i)
+ {
+ const ss::cell_style_t* cur_style = styles.get_cell_style(i);
+ if (cur_style->name == name)
+ return cur_style;
+ }
+
+ std::cerr << "No styles named '" << name << "' found!" << std::endl;
+ return nullptr;
+}
+
+const ss::cell_format_t* find_cell_format(const ss::styles& styles, std::string_view name, std::string_view parent_name)
+{
+ const ss::cell_style_t* style = find_cell_style_by_name(name, styles);
+ if (!style)
+ return nullptr;
+
+ if (style->parent_name != parent_name)
+ {
+ std::cerr << "Parent name is not as expected: expected='" << parent_name << "'; actual='" << style->parent_name << "'" << std::endl;
+ return nullptr;
+ }
+
+ return styles.get_cell_style_format(style->xf);
+}
+
+void test_odf_fill(const ss::styles& styles)
+{
+ const ss::cell_style_t* style = find_cell_style_by_name("Name1", styles);
+ assert(style);
+ assert(style->parent_name == "Text");
+ size_t xf = style->xf;
+ const ss::cell_format_t* cell_format = styles.get_cell_style_format(xf);
+ assert(cell_format);
+
+ size_t fill = cell_format->fill;
+ const ss::fill_t* cell_fill = styles.get_fill(fill);
+ assert(cell_fill);
+ assert(cell_fill->fg_color);
+ assert(*cell_fill->fg_color == ss::color_t(0xFF, 0xFE, 0xFF, 0xCC));
+ assert(cell_fill->pattern_type);
+ assert(*cell_fill->pattern_type == ss::fill_pattern_t::solid);
+}
+
+void test_odf_border(const ss::styles &styles)
+{
+ /* Test that border style applies to all the sides when not specified */
+ const ss::cell_style_t* style = find_cell_style_by_name("Name1", styles);
+ assert(style);
+ const ss::cell_format_t* cell_format = styles.get_cell_style_format(style->xf);
+ assert(cell_format);
+
+ const ss::border_t* cell_border = styles.get_border(cell_format->border);
+ assert(cell_border->top.style);
+ assert(*cell_border->top.style == ss::border_style_t::dotted);
+ assert(cell_border->bottom.style);
+ assert(*cell_border->bottom.style == ss::border_style_t::dotted);
+ assert(cell_border->left.style);
+ assert(*cell_border->left.style == ss::border_style_t::dotted);
+ assert(cell_border->right.style);
+ assert(*cell_border->right.style == ss::border_style_t::dotted);
+
+ ss::color_t expected_color{0xFF, 0xFF, 0xCC, 0x12};
+ assert(cell_border->top.border_color);
+ assert(*cell_border->top.border_color == expected_color);
+ assert(cell_border->bottom.border_color);
+ assert(*cell_border->bottom.border_color == expected_color);
+ assert(cell_border->left.border_color);
+ assert(*cell_border->left.border_color == expected_color);
+ assert(cell_border->right.border_color);
+ assert(*cell_border->right.border_color == expected_color);
+
+ orcus::length_t expected_width{orcus::length_unit_t::point, 0.06};
+ assert(cell_border->top.border_width);
+ assert(*cell_border->top.border_width == expected_width);
+ assert(cell_border->bottom.border_width);
+ assert(*cell_border->bottom.border_width == expected_width);
+ assert(cell_border->left.border_width);
+ assert(*cell_border->left.border_width == expected_width);
+ assert(cell_border->right.border_width);
+ assert(*cell_border->right.border_width == expected_width);
+
+ style = find_cell_style_by_name("Name2", styles);
+ assert(style);
+ cell_format = styles.get_cell_style_format(style->xf);
+ assert(cell_format);
+
+ cell_border = styles.get_border(cell_format->border);
+ assert(cell_border);
+ assert(cell_border->top.style);
+ assert(*cell_border->top.style == ss::border_style_t::fine_dashed);
+ assert(cell_border->bottom.style);
+ assert(*cell_border->bottom.style == ss::border_style_t::double_thin);
+ assert(cell_border->left.style);
+ assert(*cell_border->left.style == ss::border_style_t::none);
+ assert(cell_border->right.style);
+ assert(*cell_border->right.style == ss::border_style_t::dash_dot_dot);
+
+ assert(cell_border->top.border_color);
+ assert(*cell_border->top.border_color == ss::color_t(0xFF, 0xFF, 0xEE, 0x11));
+ assert(cell_border->bottom.border_color);
+ assert(*cell_border->bottom.border_color == ss::color_t(0xFF, 0xAE, 0xEE, 0x11));
+ assert(cell_border->left.border_color);
+ assert(*cell_border->left.border_color == ss::color_t(0xFF, 0x11, 0xEE, 0x11));
+ assert(cell_border->right.border_color);
+ assert(*cell_border->right.border_color == ss::color_t(0xFF, 0x05, 0xEE, 0x11));
+
+ expected_width.value = 0.74; // point
+ assert(cell_border->top.border_width);
+ assert(*cell_border->top.border_width == expected_width);
+ expected_width.value = 1.74;
+ assert(cell_border->bottom.border_width);
+ assert(*cell_border->bottom.border_width == expected_width);
+ expected_width.value = 0.74;
+ assert(cell_border->left.border_width);
+ assert(*cell_border->left.border_width == expected_width);
+ expected_width.value = 0.22;
+ assert(cell_border->right.border_width);
+ assert(*cell_border->right.border_width == expected_width);
+
+ /*Test that border applies to the diagonal*/
+ style = find_cell_style_by_name("Name3", styles);
+ assert(style);
+ cell_format = styles.get_cell_style_format(style->xf);
+ assert(cell_format);
+
+ cell_border = styles.get_border(cell_format->border);
+ assert(cell_border);
+
+ // 1.74pt dashed #ffccee
+ assert(cell_border->diagonal_bl_tr.style);
+ assert(*cell_border->diagonal_bl_tr.style == ss::border_style_t::dashed);
+ assert(cell_border->diagonal_bl_tr.border_color);
+ assert(*cell_border->diagonal_bl_tr.border_color == ss::color_t(0xFF, 0xFF, 0xCC, 0xEE));
+ expected_width.value = 1.74;
+ assert(cell_border->diagonal_bl_tr.border_width);
+ assert(*cell_border->diagonal_bl_tr.border_width == expected_width);
+
+ // 0.74pt dash-dot #120000
+ assert(cell_border->diagonal_tl_br.style);
+ assert(*cell_border->diagonal_tl_br.style == ss::border_style_t::dash_dot);
+ assert(cell_border->diagonal_tl_br.border_color);
+ assert(*cell_border->diagonal_tl_br.border_color == ss::color_t(0xFF, 0x12, 0x00, 0x00));
+ expected_width.value = 0.74;
+ assert(cell_border->diagonal_tl_br.border_width);
+ assert(*cell_border->diagonal_tl_br.border_width == expected_width);
+}
+
+void test_odf_cell_protection(const ss::styles& styles)
+{
+ /* Test that Cell is only protected and not hidden , Print Content is true */
+ const ss::cell_style_t* style = find_cell_style_by_name("Name5", styles);
+ assert(style);
+ size_t xf = style->xf;
+ const ss::cell_format_t* cell_format = styles.get_cell_style_format(xf);
+ size_t protection = cell_format->protection;
+ assert(cell_format);
+
+ const ss::protection_t* cell_protection = styles.get_protection(protection);
+ assert(*cell_protection->locked == true);
+ assert(*cell_protection->hidden == true);
+ assert(*cell_protection->print_content == true);
+ assert(!cell_protection->formula_hidden);
+
+ /* Test that Cell is protected and formula is hidden , Print Content is false */
+ style = find_cell_style_by_name("Name6", styles);
+ assert(style);
+ xf = style->xf;
+ cell_format = styles.get_cell_style_format(xf);
+ protection = cell_format->protection;
+ assert(cell_format);
+
+ cell_protection = styles.get_protection(protection);
+ assert(*cell_protection->locked == true);
+ assert(!cell_protection->hidden); // not set
+ assert(*cell_protection->print_content == false);
+ assert(*cell_protection->formula_hidden == true);
+
+ /* Test that Cell is not protected by any way, Print Content is false */
+ style = find_cell_style_by_name("Name7", styles);
+ assert(style);
+ xf = style->xf;
+ cell_format = styles.get_cell_style_format(xf);
+ protection = cell_format->protection;
+ assert(cell_format);
+
+ cell_protection = styles.get_protection(protection);
+ assert(*cell_protection->locked == false);
+ assert(*cell_protection->hidden == false);
+ assert(*cell_protection->print_content == true);
+ assert(*cell_protection->formula_hidden == false);
+}
+
+void test_odf_font(const ss::styles& styles)
+{
+ const ss::cell_style_t* style = find_cell_style_by_name("Name8", styles);
+ assert(style);
+ size_t xf = style->xf;
+ const ss::cell_format_t* cell_format = styles.get_cell_style_format(xf);
+ size_t font = cell_format->font;
+ assert(cell_format);
+
+ const ss::font_t* cell_font = styles.get_font(font);
+ assert(*cell_font->name == "Liberation Sans");
+ assert(*cell_font->size == 24);
+ assert(*cell_font->bold == true);
+ assert(*cell_font->italic == true);
+ assert(*cell_font->underline_style == ss::underline_t::single_line);
+ assert(*cell_font->underline_width == ss::underline_width_t::thick);
+ assert(!cell_font->underline_mode); // not set
+ assert(!cell_font->underline_type); // not set
+ assert(cell_font->color->red == (int)0x80);
+ assert(cell_font->color->green == (int)0x80);
+ assert(cell_font->color->blue == (int)0x80);
+
+ style = find_cell_style_by_name("Name9", styles);
+ assert(style);
+ xf = style->xf;
+ cell_format = styles.get_cell_style_format(xf);
+ font = cell_format->font;
+ assert(cell_format);
+
+ cell_font = styles.get_font(font);
+ assert(*cell_font->name == "Tahoma");
+ assert(*cell_font->size == 00);
+ assert(*cell_font->bold == true);
+ assert(!cell_font->italic);
+ assert(*cell_font->underline_style == ss::underline_t::dash);
+ assert(*cell_font->underline_width == ss::underline_width_t::bold);
+ assert(!cell_font->underline_mode); // not set
+ assert(!cell_font->underline_type); // not set
+ assert(cell_font->underline_color->red == (int)0x18);
+ assert(cell_font->underline_color->green == (int)0x56);
+ assert(cell_font->underline_color->blue == (int)0xff);
+}
+
+void test_odf_text_strikethrough(const ss::styles& styles)
+{
+ const ss::cell_style_t* style = find_cell_style_by_name("Name20", styles);
+ assert(style);
+ size_t xf = style->xf;
+ const ss::cell_format_t* cell_format = styles.get_cell_style_format(xf);
+ size_t font = cell_format->font;
+ assert(cell_format);
+
+ const ss::font_t* cell_font = styles.get_font(font);
+ assert(*cell_font->strikethrough_style == ss::strikethrough_style_t::solid);
+ assert(!cell_font->strikethrough_width); // not set
+ assert(*cell_font->strikethrough_type == ss::strikethrough_type_t::single_type);
+ assert(!cell_font->strikethrough_text); // not set
+
+ style = find_cell_style_by_name("Name21", styles);
+ assert(style);
+ xf = style->xf;
+ cell_format = styles.get_cell_style_format(xf);
+ font = cell_format->font;
+ assert(cell_format);
+
+ cell_font = styles.get_font(font);
+ assert(*cell_font->strikethrough_style == ss::strikethrough_style_t::solid);
+ assert(*cell_font->strikethrough_width == ss::strikethrough_width_t::bold);
+ assert(*cell_font->strikethrough_type == ss::strikethrough_type_t::single_type);
+ assert(!cell_font->strikethrough_text); // not set
+
+ style = find_cell_style_by_name("Name22", styles);
+ assert(style);
+ xf = style->xf;
+ cell_format = styles.get_cell_style_format(xf);
+ font = cell_format->font;
+ assert(cell_format);
+
+ cell_font = styles.get_font(font);
+ assert(*cell_font->strikethrough_style == ss::strikethrough_style_t::solid);
+ assert(!cell_font->strikethrough_width); // not set
+ assert(*cell_font->strikethrough_type == ss::strikethrough_type_t::single_type);
+ assert(*cell_font->strikethrough_text == ss::strikethrough_text_t::slash);
+}
+
+void test_odf_text_alignment(const ss::styles& styles)
+{
+ const ss::cell_style_t* style = find_cell_style_by_name("Name23", styles);
+ assert(style);
+ size_t xf = style->xf;
+ const ss::cell_format_t* cell_format = styles.get_cell_style_format(xf);
+ assert(cell_format);
+
+ assert(cell_format->hor_align == ss::hor_alignment_t::right);
+ assert(cell_format->ver_align == ss::ver_alignment_t::middle);
+}
+
+void test_cell_styles()
+{
+ stack_printer __sp__(__func__);
+
+ test_model model;
+
+ model.load(SRCDIR"/test/ods/import-styles/cell-styles.xml");
+ test_odf_fill(model.styles);
+ test_odf_border(model.styles);
+ test_odf_cell_protection(model.styles);
+ test_odf_font(model.styles);
+ test_odf_text_strikethrough(model.styles);
+ test_odf_text_alignment(model.styles);
+}
+
+void test_standard_styles()
+{
+ stack_printer __sp__(__func__);
+
+ test_model model;
+ model.load(SRCDIR"/test/ods/import-styles/standard-styles.xml");
+
+ {
+ // Heading only specifies color, font size, font style and font weight.
+ const ss::cell_format_t* cell_format = find_cell_format(model.styles, "Heading", "Default");
+ assert(cell_format);
+
+ ss::font_t expected;
+ expected.size = 24;
+ expected.bold = true;
+ expected.italic = false;
+ expected.color = ss::color_t(0, 0, 0);
+
+ const ss::font_t* actual = model.styles.get_font(cell_format->font);
+ assert(actual);
+ assert(verify_font_attrs(expected, *actual));
+ }
+
+ {
+ // Heading 1 only overwrites font size.
+ const ss::cell_format_t* cell_format = find_cell_format(model.styles, "Heading 1", "Heading");
+ assert(cell_format);
+
+ ss::font_t expected;
+ expected.size = 18;
+
+ const ss::font_t* actual = model.styles.get_font(cell_format->font);
+ assert(actual);
+ assert(verify_font_attrs(expected, *actual));
+ }
+
+ {
+ // Heading 2 also only overwrites font size but with a different size.
+ const ss::cell_format_t* cell_format = find_cell_format(model.styles, "Heading 2", "Heading");
+ assert(cell_format);
+
+ ss::font_t expected;
+ expected.size = 12;
+
+ const ss::font_t* actual = model.styles.get_font(cell_format->font);
+ assert(actual);
+ assert(verify_font_attrs(expected, *actual));
+ }
+
+ {
+ // Text simply inherits from Default.
+ const ss::cell_format_t* cell_format = find_cell_format(model.styles, "Text", "Default");
+ assert(cell_format);
+
+ ss::font_t expected; // nothing is active
+
+ const ss::font_t* actual = model.styles.get_font(cell_format->font);
+ assert(actual);
+ assert(verify_font_attrs(expected, *actual));
+ }
+
+ {
+ const ss::cell_format_t* cell_format = find_cell_format(model.styles, "Note", "Text");
+ assert(cell_format);
+
+ ss::font_t expected;
+ expected.color = ss::color_t(0x33, 0x33, 0x33);
+
+ const ss::font_t* actual = model.styles.get_font(cell_format->font);
+ assert(actual);
+ assert(verify_font_attrs(expected, *actual));
+
+ ss::fill_t expected_fill;
+ expected_fill.pattern_type = ss::fill_pattern_t::solid;
+ expected_fill.fg_color = ss::color_t(0xff, 0xff, 0xcc);
+
+ const ss::fill_t* actual_fill = model.styles.get_fill(cell_format->fill);
+ assert(actual_fill);
+ assert(verify_fill_attrs(expected_fill, *actual_fill));
+
+ // fo:border="0.75pt solid #808080" -> same border attributes applied to top, bottom, left and right borders.
+ ss::border_t expected_border;
+ expected_border.top.style = ss::border_style_t::solid;
+ expected_border.top.border_width = orcus::length_t{orcus::length_unit_t::point, 0.75};
+ expected_border.top.border_color = ss::color_t(0xFF, 0x80, 0x80, 0x80);
+
+ expected_border.bottom = expected_border.top;
+ expected_border.left = expected_border.top;
+ expected_border.right = expected_border.top;
+
+ const auto* actual_border = model.styles.get_border(cell_format->border);
+ assert(actual_border);
+ assert(verify_border_attrs(expected_border, *actual_border));
+ }
+
+ {
+ const ss::cell_format_t* cell_format = find_cell_format(model.styles, "Footnote", "Text");
+ assert(cell_format);
+
+ ss::font_t expected;
+ expected.color = ss::color_t(0x80, 0x80, 0x80);
+ expected.italic = true;
+
+ const ss::font_t* actual = model.styles.get_font(cell_format->font);
+ assert(actual);
+ assert(verify_font_attrs(expected, *actual));
+ }
+
+ {
+ const ss::cell_format_t* cell_format = find_cell_format(model.styles, "Hyperlink", "Text");
+ assert(cell_format);
+
+ // TODO: Since we currently handle text-underline-width and
+ // text-underline-color incorrectly, we cannot perform exhaustive check.
+ // We can only check the attributes individually.
+
+ const ss::font_t* actual = model.styles.get_font(cell_format->font);
+ assert(actual);
+
+ // fo:color="#0000ee"
+ assert(actual->color);
+ assert(*actual->color == ss::color_t(0x00, 0x00, 0xee));
+
+ // style:text-underline-style="solid"
+ assert(actual->underline_style);
+ assert(*actual->underline_style == ss::underline_t::single_line); // solid
+
+ // style:text-underline-width="auto"
+ assert(actual->underline_width);
+ assert(*actual->underline_width == ss::underline_width_t::automatic);
+
+ // style:text-underline-color="font-color" (use the same color as the font)
+ assert(!actual->underline_color); // this implies the same color as the font
+ }
+
+ {
+ const ss::cell_format_t* cell_format = find_cell_format(model.styles, "Status", "Default");
+ assert(cell_format);
+ }
+
+ {
+ const ss::cell_format_t* cell_format = find_cell_format(model.styles, "Good", "Status");
+ assert(cell_format);
+
+ ss::font_t expected;
+ expected.color = ss::color_t(0x00, 0x66, 0x00);
+
+ const ss::font_t* actual = model.styles.get_font(cell_format->font);
+ assert(actual);
+ assert(verify_font_attrs(expected, *actual));
+
+ ss::fill_t expected_fill;
+ expected_fill.pattern_type = ss::fill_pattern_t::solid;
+ expected_fill.fg_color = ss::color_t(0xcc, 0xff, 0xcc);
+
+ const ss::fill_t* actual_fill = model.styles.get_fill(cell_format->fill);
+ assert(actual_fill);
+ assert(verify_fill_attrs(expected_fill, *actual_fill));
+ }
+
+ {
+ const ss::cell_format_t* cell_format = find_cell_format(model.styles, "Neutral", "Status");
+ assert(cell_format);
+
+ ss::font_t expected;
+ expected.color = ss::color_t(0x99, 0x66, 0x00);
+
+ const ss::font_t* actual = model.styles.get_font(cell_format->font);
+ assert(actual);
+ assert(verify_font_attrs(expected, *actual));
+
+ ss::fill_t expected_fill;
+ expected_fill.pattern_type = ss::fill_pattern_t::solid;
+ expected_fill.fg_color = ss::color_t(0xff, 0xff, 0xcc);
+
+ const ss::fill_t* actual_fill = model.styles.get_fill(cell_format->fill);
+ assert(actual_fill);
+ assert(verify_fill_attrs(expected_fill, *actual_fill));
+ }
+
+ {
+ const ss::cell_format_t* cell_format = find_cell_format(model.styles, "Bad", "Status");
+ assert(cell_format);
+
+ ss::font_t expected;
+ expected.color = ss::color_t(0xcc, 0x00, 0x00);
+
+ const ss::font_t* actual = model.styles.get_font(cell_format->font);
+ assert(actual);
+ assert(verify_font_attrs(expected, *actual));
+
+ ss::fill_t expected_fill;
+ expected_fill.pattern_type = ss::fill_pattern_t::solid;
+ expected_fill.fg_color = ss::color_t(0xff, 0xcc, 0xcc);
+
+ const ss::fill_t* actual_fill = model.styles.get_fill(cell_format->fill);
+ assert(actual_fill);
+ assert(verify_fill_attrs(expected_fill, *actual_fill));
+ }
+
+ {
+ const ss::cell_format_t* cell_format = find_cell_format(model.styles, "Warning", "Status");
+ assert(cell_format);
+
+ ss::font_t expected;
+ expected.color = ss::color_t(0xcc, 0x00, 0x00);
+
+ const ss::font_t* actual = model.styles.get_font(cell_format->font);
+ assert(actual);
+ assert(verify_font_attrs(expected, *actual));
+ }
+
+ {
+ const ss::cell_format_t* cell_format = find_cell_format(model.styles, "Error", "Status");
+ assert(cell_format);
+
+ ss::font_t expected;
+ expected.color = ss::color_t(0xff, 0xff, 0xff);
+ expected.bold = true;
+
+ const ss::font_t* actual = model.styles.get_font(cell_format->font);
+ assert(actual);
+ assert(verify_font_attrs(expected, *actual));
+
+ ss::fill_t expected_fill;
+ expected_fill.pattern_type = ss::fill_pattern_t::solid;
+ expected_fill.fg_color = ss::color_t(0xcc, 0x00, 0x00);
+
+ const ss::fill_t* actual_fill = model.styles.get_fill(cell_format->fill);
+ assert(actual_fill);
+ assert(verify_fill_attrs(expected_fill, *actual_fill));
+ }
+
+ {
+ const ss::cell_format_t* cell_format = find_cell_format(model.styles, "Accent", "Default");
+ assert(cell_format);
+
+ ss::font_t expected;
+ expected.bold = true;
+
+ const ss::font_t* actual = model.styles.get_font(cell_format->font);
+ assert(actual);
+ assert(verify_font_attrs(expected, *actual));
+ }
+
+ {
+ const ss::cell_format_t* cell_format = find_cell_format(model.styles, "Accent 1", "Accent");
+ assert(cell_format);
+
+ ss::font_t expected;
+ expected.color = ss::color_t(0xff, 0xff, 0xff);
+
+ const ss::font_t* actual = model.styles.get_font(cell_format->font);
+ assert(actual);
+ assert(verify_font_attrs(expected, *actual));
+
+ ss::fill_t expected_fill;
+ expected_fill.pattern_type = ss::fill_pattern_t::solid;
+ expected_fill.fg_color = ss::color_t(0x00, 0x00, 0x00);
+
+ const ss::fill_t* actual_fill = model.styles.get_fill(cell_format->fill);
+ assert(actual_fill);
+ assert(verify_fill_attrs(expected_fill, *actual_fill));
+ }
+
+ {
+ const ss::cell_format_t* cell_format = find_cell_format(model.styles, "Accent 2", "Accent");
+ assert(cell_format);
+
+ ss::font_t expected;
+ expected.color = ss::color_t(0xff, 0xff, 0xff);
+
+ const ss::font_t* actual = model.styles.get_font(cell_format->font);
+ assert(actual);
+ assert(verify_font_attrs(expected, *actual));
+
+ ss::fill_t expected_fill;
+ expected_fill.pattern_type = ss::fill_pattern_t::solid;
+ expected_fill.fg_color = ss::color_t(0x80, 0x80, 0x80);
+
+ const ss::fill_t* actual_fill = model.styles.get_fill(cell_format->fill);
+ assert(actual_fill);
+ assert(verify_fill_attrs(expected_fill, *actual_fill));
+ }
+
+ {
+ const ss::cell_format_t* cell_format = find_cell_format(model.styles, "Accent 3", "Accent");
+ assert(cell_format);
+
+ ss::fill_t expected_fill;
+ expected_fill.pattern_type = ss::fill_pattern_t::solid;
+ expected_fill.fg_color = ss::color_t(0xdd, 0xdd, 0xdd);
+
+ const ss::fill_t* actual_fill = model.styles.get_fill(cell_format->fill);
+ assert(actual_fill);
+ assert(verify_fill_attrs(expected_fill, *actual_fill));
+ }
+
+ {
+ const ss::cell_format_t* cell_format = find_cell_format(model.styles, "Result", "Default");
+ assert(cell_format);
+
+ ss::font_t expected;
+ expected.bold = true;
+ expected.italic = true;
+ expected.underline_style = ss::underline_t::single_line;
+
+ const ss::font_t* actual = model.styles.get_font(cell_format->font);
+ assert(actual);
+ assert(verify_font_attrs(expected, *actual));
+ }
+}
+
+void test_cell_protection_styles()
+{
+ stack_printer __sp__(__func__);
+
+ test_model model;
+ model.load(SRCDIR"/test/ods/import-styles/cell-protection.xml");
+
+ {
+ const ss::cell_format_t* cell_format = find_cell_format(model.styles, "Hide_20_Formula", "Protected");
+ assert(cell_format);
+
+ const auto* protection = model.styles.get_protection(cell_format->protection);
+ assert(protection);
+
+ ss::protection_t expected;
+ expected.locked = true;
+ expected.formula_hidden = true;
+ expected.print_content = true;
+
+ assert(verify_protection_attrs(expected, *protection));
+ }
+
+ {
+ const ss::cell_format_t* cell_format = find_cell_format(model.styles, "Hide_20_When_20_Printing", "Protected");
+ assert(cell_format);
+
+ const auto* protection = model.styles.get_protection(cell_format->protection);
+ assert(protection);
+
+ ss::protection_t expected;
+ expected.locked = true;
+ expected.print_content = false;
+
+ assert(verify_protection_attrs(expected, *protection));
+ }
+
+ {
+ const ss::cell_format_t* cell_format = find_cell_format(model.styles, "Hide_20_All", "Protected");
+ assert(cell_format);
+
+ const auto* protection = model.styles.get_protection(cell_format->protection);
+ assert(protection);
+
+ ss::protection_t expected;
+ expected.locked = true;
+ expected.hidden = true;
+ expected.print_content = true;
+
+ assert(verify_protection_attrs(expected, *protection));
+ }
+
+ {
+ const ss::cell_format_t* cell_format = find_cell_format(model.styles, "Not_20_Protected", "Default");
+ assert(cell_format);
+
+ const auto* protection = model.styles.get_protection(cell_format->protection);
+ assert(protection);
+
+ ss::protection_t expected;
+ expected.locked = false;
+ expected.hidden = false;
+ expected.print_content = true;
+ expected.formula_hidden = false;
+
+ assert(verify_protection_attrs(expected, *protection));
+ }
+}
+
+} // anonymous namespace
+
+int main()
+{
+ test_cell_styles();
+ test_standard_styles();
+ test_cell_protection_styles();
+
+ return 0;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/orcus_test_json_mapped.cpp b/src/orcus_test_json_mapped.cpp
new file mode 100644
index 0000000..dbe3561
--- /dev/null
+++ b/src/orcus_test_json_mapped.cpp
@@ -0,0 +1,99 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/orcus_json.hpp>
+#include <orcus/stream.hpp>
+#include <orcus/spreadsheet/document.hpp>
+#include <orcus/spreadsheet/factory.hpp>
+#include <orcus/exception.hpp>
+#include <orcus/parser_global.hpp>
+
+#include <iostream>
+#include <vector>
+#include <cassert>
+#include <sstream>
+
+#include "filesystem_env.hpp"
+
+using namespace std;
+using namespace orcus;
+
+namespace {
+
+const std::vector<const char*> tests =
+{
+ SRCDIR"/test/json-mapped/array-of-arrays-basic",
+ SRCDIR"/test/json-mapped/array-of-arrays-header",
+ SRCDIR"/test/json-mapped/array-of-objects-basic",
+ SRCDIR"/test/json-mapped/array-of-objects-header",
+ SRCDIR"/test/json-mapped/nested-repeats",
+ SRCDIR"/test/json-mapped/nested-repeats-2",
+};
+
+} // anonymous namespace
+
+void test_mapped_json_import()
+{
+ for (fs::path base_dir : tests)
+ {
+ fs::path data_file = base_dir / "input.json";
+ fs::path map_file = base_dir / "map.json";
+ fs::path check_file = base_dir / "check.txt";
+
+ cout << "reading " << data_file.string() << endl;
+ file_content content(data_file.string().data());
+ file_content map_content(map_file.string().data());
+ file_content check_content(check_file.string().data());
+
+ spreadsheet::range_size_t ss{1048576, 16384};
+ spreadsheet::document doc{ss};
+ spreadsheet::import_factory import_fact(doc);
+
+ orcus_json app(&import_fact);
+ app.read_map_definition(map_content.str());
+ app.read_stream(content.str());
+
+ std::ostringstream os;
+ doc.dump_check(os);
+
+ std::string actual_strm = os.str();
+ std::string_view actual(actual_strm);
+ std::string_view expected = check_content.str();
+ actual = trim(actual);
+ expected = trim(expected);
+ assert(actual == expected);
+ }
+}
+
+void test_invalid_map_definition()
+{
+ spreadsheet::range_size_t ss{1048576, 16384};
+ spreadsheet::document doc{ss};
+ spreadsheet::import_factory import_fact(doc);
+
+ orcus_json app(&import_fact);
+ try
+ {
+ app.read_map_definition("asdfdasf");
+ assert(false); // We were expecting an exception, but didn't get one.
+ }
+ catch (const invalid_map_error&)
+ {
+ // Success!
+ }
+}
+
+int main()
+{
+ test_mapped_json_import();
+ test_invalid_map_definition();
+
+ return EXIT_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+
diff --git a/src/orcus_test_ods.cpp b/src/orcus_test_ods.cpp
new file mode 100644
index 0000000..377c35b
--- /dev/null
+++ b/src/orcus_test_ods.cpp
@@ -0,0 +1,958 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "test_global.hpp"
+#include <orcus/orcus_ods.hpp>
+#include <orcus/format_detection.hpp>
+#include <orcus/stream.hpp>
+#include <orcus/parser_global.hpp>
+#include <orcus/spreadsheet/factory.hpp>
+#include <orcus/spreadsheet/document.hpp>
+#include <orcus/spreadsheet/sheet.hpp>
+#include <orcus/spreadsheet/shared_strings.hpp>
+#include <orcus/spreadsheet/styles.hpp>
+
+#include <cstdlib>
+#include <cassert>
+#include <string>
+#include <iostream>
+#include <sstream>
+#include <vector>
+
+#include "filesystem_env.hpp"
+
+#include <mdds/flat_segment_tree.hpp>
+
+using namespace orcus;
+using namespace orcus::spreadsheet;
+
+namespace ss = orcus::spreadsheet;
+
+
+typedef mdds::flat_segment_tree<std::size_t, bool> bool_segment_type;
+
+namespace {
+
+std::unique_ptr<ss::document> load_doc(const fs::path& filepath)
+{
+ spreadsheet::range_size_t ss{1048576, 16384};
+ std::unique_ptr<ss::document> doc = std::make_unique<ss::document>(ss);
+ import_factory factory(*doc);
+ orcus_ods app(&factory);
+ app.read_file(filepath.string());
+
+ return doc;
+}
+
+std::vector<fs::path> dirs = {
+ SRCDIR"/test/ods/raw-values-1/",
+ SRCDIR"/test/ods/formula-1/",
+ SRCDIR"/test/ods/formula-2/",
+ SRCDIR"/test/ods/named-range/",
+ SRCDIR"/test/ods/named-expression/",
+ SRCDIR"/test/ods/named-expression-sheet-local/",
+};
+
+void test_ods_detection()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ for (const auto& dir : dirs)
+ {
+ fs::path filepath = dir / "input.ods";
+ file_content fc(filepath.string());
+ assert(!fc.empty());
+
+ format_t detected = detect(fc.str());
+ assert(detected == format_t::ods);
+ }
+}
+
+void test_ods_create_filter()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ ss::range_size_t ssize{1048576, 16384};
+ std::unique_ptr<ss::document> doc = std::make_unique<ss::document>(ssize);
+ ss::import_factory factory(*doc);
+
+ auto f = create_filter(format_t::ods, &factory);
+ assert(f);
+ assert(f->get_name() == "ods");
+}
+
+void test_ods_import_cell_values()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ for (const auto& dir : dirs)
+ {
+ fs::path filepath{dir};
+ filepath /= "input.ods";
+ std::cout << filepath << std::endl;
+
+ auto doc = load_doc(filepath);
+ assert(doc);
+ doc->recalc_formula_cells();
+
+ // Dump the content of the model.
+ std::ostringstream os;
+ doc->dump_check(os);
+ std::string check = os.str();
+
+ // Check that against known control.
+ filepath = dir;
+ filepath /= "check.txt";
+ file_content control{filepath.string()};
+
+ assert(!check.empty());
+ assert(!control.empty());
+
+ assert(trim(check) == trim(control.str()));
+ }
+}
+
+void test_ods_import_column_widths_row_heights()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ fs::path filepath{SRCDIR"/test/ods/column-width-row-height/input.ods"};
+ auto doc = load_doc(filepath);
+ assert(doc);
+
+ assert(doc->get_sheet_count() > 0);
+ spreadsheet::sheet* sh = doc->get_sheet(0);
+ assert(sh);
+
+ // Column widths are in twips.
+ col_width_t cw = sh->get_col_width(1, nullptr, nullptr);
+ assert(cw == 1440); // 1 in
+ cw = sh->get_col_width(2, nullptr, nullptr);
+ assert(cw == 2160); // 1.5 in
+ cw = sh->get_col_width(3, nullptr, nullptr);
+ assert(cw == 2592); // 1.8 in
+
+ // Row heights are in twips too.
+ row_height_t rh = sh->get_row_height(3, nullptr, nullptr);
+ assert(rh == 720); // 0.5 in
+ rh = sh->get_row_height(4, nullptr, nullptr);
+ assert(rh == 1440); // 1 in
+ rh = sh->get_row_height(5, nullptr, nullptr);
+ assert(rh == 2160); // 1.5 in
+ rh = sh->get_row_height(6, nullptr, nullptr);
+ assert(rh == 2592); // 1.8 in
+}
+
+void test_ods_import_formatted_text()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ fs::path filepath{SRCDIR"/test/ods/formatted-text/bold-and-italic.ods"};
+ auto doc = load_doc(filepath);
+ assert(doc);
+
+ assert(doc->get_sheet_count() > 0);
+ spreadsheet::sheet* sh = doc->get_sheet(0);
+ assert(sh);
+
+ const shared_strings& ss = doc->get_shared_strings();
+
+ const styles& styles = doc->get_styles();
+
+ // A1 is unformatted
+ size_t str_id = sh->get_string_identifier(0,0);
+ const std::string* str = ss.get_string(str_id);
+ assert(str && *str == "Normal Text");
+ std::size_t xfid = sh->get_cell_format(0, 0);
+ const ss::cell_format_t* xf = styles.get_cell_format(xfid);
+ assert(xf);
+ const ss::cell_style_t* xstyle = styles.get_cell_style_by_xf(xf->style_xf);
+ assert(xstyle);
+ assert(xstyle->name == "Default");
+ const format_runs_t* fmt = ss.get_format_runs(str_id);
+ assert(!fmt); // The string should be unformatted.
+
+ // A2 is all bold via cell format.
+ str_id = sh->get_string_identifier(1,0);
+ str = ss.get_string(str_id);
+ assert(str && *str == "Bold Text");
+ xfid = sh->get_cell_format(1,0);
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+ const font_t* font_data = styles.get_font(xf->font);
+ assert(font_data);
+ assert(font_data->bold);
+ assert(*font_data->bold);
+ assert(font_data->italic);
+ assert(!*font_data->italic);
+ fmt = ss.get_format_runs(str_id);
+ assert(!fmt); // This string should be unformatted.
+
+ // A3 is all italic.
+ str_id = sh->get_string_identifier(2,0);
+ str = ss.get_string(str_id);
+ assert(str && *str == "Italic Text");
+ xfid = sh->get_cell_format(2,0);
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+ font_data = styles.get_font(xf->font);
+ assert(font_data);
+ assert(font_data->bold);
+ assert(!*font_data->bold);
+ assert(font_data->italic);
+ assert(*font_data->italic);
+ fmt = ss.get_format_runs(str_id);
+ assert(!fmt); // This string should be unformatted.
+
+ // A4 is all bold and italic.
+ str_id = sh->get_string_identifier(3,0);
+ str = ss.get_string(str_id);
+ assert(str && *str == "Bold and Italic Text");
+ xfid = sh->get_cell_format(3,0);
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+ font_data = styles.get_font(xf->font);
+ assert(font_data);
+ assert(font_data->bold);
+ assert(*font_data->bold);
+ assert(font_data->italic);
+ assert(*font_data->italic);
+ fmt = ss.get_format_runs(str_id);
+ assert(!fmt); // This string should be unformatted.
+
+ // A5 has mixed format runs.
+ str_id = sh->get_string_identifier(4,0);
+ str = ss.get_string(str_id);
+ assert(str && *str == "Bold and Italic mixed");
+ xfid = sh->get_cell_format(4,0);
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+ font_data = styles.get_font(xf->font);
+ fmt = ss.get_format_runs(str_id);
+ assert(fmt); // This string should be formatted.
+
+ {
+ // Check the bold format segment.
+ bool_segment_type bold_runs(0, str->size(), font_data->bold ? *font_data->bold : false);
+
+ for (size_t i = 0, n = fmt->size(); i < n; ++i)
+ {
+ format_run run = fmt->at(i);
+ bold_runs.insert_back(run.pos, run.pos+run.size, run.bold);
+ }
+
+ bold_runs.build_tree();
+ bool is_bold = false;
+ size_t start_pos, end_pos;
+
+ // The first four letters 'Bold' should be bold.
+ bool good = bold_runs.search_tree(0, is_bold, &start_pos, &end_pos).second;
+ assert(good);
+ assert(is_bold);
+ assert(start_pos == 0);
+ assert(end_pos == 4);
+
+ // The rest should be non-bold.
+ good = bold_runs.search_tree(4, is_bold, &start_pos, &end_pos).second;
+ assert(good);
+ assert(!is_bold);
+ assert(start_pos == 4);
+ assert(end_pos == str->size());
+ }
+
+ {
+ // Check the italic format segment.
+ bool_segment_type italic_runs(0, str->size(), font_data->italic ? *font_data->italic : false);
+
+ for (size_t i = 0, n = fmt->size(); i < n; ++i)
+ {
+ format_run run = fmt->at(i);
+ italic_runs.insert_back(run.pos, run.pos+run.size, run.italic);
+ }
+
+ italic_runs.build_tree();
+ bool it_italic = false;
+ size_t start_pos, end_pos;
+
+ // The first 9 letters 'Bold and ' should not be italic.
+ bool good = italic_runs.search_tree(0, it_italic, &start_pos, &end_pos).second;
+ assert(good);
+ assert(!it_italic);
+ assert(start_pos == 0);
+ assert(end_pos == 9);
+
+ // The next 6 letters 'Italic' should be italic.
+ good = italic_runs.search_tree(9, it_italic, &start_pos, &end_pos).second;
+ assert(good);
+ assert(it_italic);
+ assert(start_pos == 9);
+ assert(end_pos == 15);
+
+ // The rest should be non-italic.
+ good = italic_runs.search_tree(15, it_italic, &start_pos, &end_pos).second;
+ assert(good);
+ assert(!it_italic);
+ assert(start_pos == 15);
+ assert(end_pos == str->size());
+ }
+}
+
+void test_ods_import_number_formats()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ fs::path filepath{SRCDIR"/test/ods/number-format/basic-set.ods"};
+
+ auto doc = load_doc(filepath);
+ assert(doc);
+
+ assert(doc->get_sheet_count() > 0);
+ spreadsheet::sheet* sh = doc->get_sheet(0);
+ assert(sh);
+
+ const styles& styles = doc->get_styles();
+
+ struct check
+ {
+ row_t row;
+ col_t col;
+ std::string_view format;
+ };
+
+ const check checks[] = {
+ { 1, 1, "#.000000" }, // B2
+ { 2, 1, "[>=0][$₹]#,##0.00;[RED]-[$₹]#,##0.00" }, // B3
+ { 3, 1, "0.00%" }, // B4
+ { 4, 1, "#.00E+00" }, // B5
+ { 5, 1, "BOOLEAN" }, // B6
+ { 6, 1, "?/11" }, // B7
+ { 7, 1, "MM/DD/YY" }, // B8
+ { 8, 1, "HH:MM:SS AM/PM" }, // B9
+ { 9, 1, "[>=0]0.00;[RED]-0.00" }, // B9
+ { 10, 1, "#,##0.00" }, // B10
+ { 11, 1, "Head @ Tail" }, // B11
+ };
+
+ for (const auto& c : checks)
+ {
+ std::size_t xfid = sh->get_cell_format(c.row, c.col);
+ const cell_format_t* xf = styles.get_cell_format(xfid);
+ if (!xf)
+ {
+ std::cerr << "No cell format entry for (row=" << c.row << "; col=" << c.col << ")" << std::endl;
+ assert(false);
+ }
+
+ const number_format_t* numfmt = styles.get_number_format(xf->number_format);
+ if (!numfmt)
+ {
+ std::cerr << "No number-format entry for (row=" << c.row << "; col=" << c.col << ")" << std::endl;
+ assert(false);
+ }
+
+ if (numfmt->format_string && *numfmt->format_string != c.format)
+ {
+ std::cerr << "Number format strings differ: (expected='" << c.format << "'; actual='"
+ << *numfmt->format_string << "')" << std::endl;
+
+ assert(false);
+ }
+ }
+}
+
+void test_ods_import_cell_properties()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ fs::path filepath{SRCDIR"/test/ods/cell-properties/wrap-and-shrink.ods"};
+
+ auto doc = load_doc(filepath);
+ assert(doc);
+
+ const ss::styles& styles = doc->get_styles();
+ const ss::sheet* sh = doc->get_sheet(0);
+ assert(sh);
+
+ std::size_t xfid = sh->get_cell_format(0, 1); // B1
+ const ss::cell_format_t* xf = styles.get_cell_format(xfid);
+ assert(xf);
+ assert(!xf->wrap_text);
+ assert(!xf->shrink_to_fit);
+
+ xfid = sh->get_cell_format(1, 1); // B2
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+ assert(xf->wrap_text);
+ assert(*xf->wrap_text);
+ assert(!xf->shrink_to_fit);
+
+ xfid = sh->get_cell_format(2, 1); // B3
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+ assert(!xf->wrap_text);
+ assert(xf->shrink_to_fit);
+ assert(*xf->shrink_to_fit);
+}
+
+void test_ods_import_styles_direct_format()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ fs::path filepath{SRCDIR"/test/ods/styles/direct-format.ods"};
+
+ auto doc = load_doc(filepath);
+ assert(doc);
+
+ const ss::styles& styles = doc->get_styles();
+ const ss::sheet* sh = doc->get_sheet(0);
+ assert(sh);
+
+ // B2 - horizontally center, bold and underlined
+ std::size_t xfid = sh->get_cell_format(1, 1);
+ const ss::cell_format_t* xf = styles.get_cell_format(xfid);
+ assert(xf);
+ assert(xf->hor_align == ss::hor_alignment_t::center);
+
+ const ss::font_t* font = styles.get_font(xf->font);
+ assert(font);
+ assert(font->bold);
+ assert(*font->bold);
+ assert(font->underline_style);
+ assert(*font->underline_style == ss::underline_t::single_line);
+
+ // B4 - yellow background and right-aligned
+ xfid = sh->get_cell_format(3, 1);
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+ assert(xf->hor_align == ss::hor_alignment_t::right);
+
+ const ss::fill_t* fill = styles.get_fill(xf->fill);
+ assert(fill);
+ assert(fill->pattern_type);
+ assert(*fill->pattern_type == ss::fill_pattern_t::solid);
+ assert(fill->fg_color);
+ assert(*fill->fg_color == ss::color_t(0xFF, 0xFF, 0xFF, 0x00));
+
+ // D4 - named style "Good" applied with no direct formatting on top
+ xfid = sh->get_cell_format(3, 3);
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+
+ const ss::cell_style_t* xstyle = styles.get_cell_style_by_xf(xf->style_xf);
+ assert(xstyle);
+ assert(xstyle->name == "Good");
+
+ // D6 - named style "Good" plus wrap-text, center and middle aligned and bold text
+ xfid = sh->get_cell_format(5, 3);
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+ assert(xf->hor_align == ss::hor_alignment_t::center);
+ assert(xf->ver_align == ss::ver_alignment_t::middle);
+ assert(xf->wrap_text);
+ assert(*xf->wrap_text);
+
+ font = styles.get_font(xf->font);
+ assert(font);
+ assert(font->bold);
+ assert(*font->bold);
+
+ xstyle = styles.get_cell_style_by_xf(xf->style_xf);
+ assert(xstyle);
+ assert(xstyle->name == "Good");
+}
+
+void test_ods_import_styles_column_styles()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ fs::path filepath{SRCDIR"/test/ods/styles/column-styles.ods"};
+
+ auto doc = load_doc(filepath);
+ assert(doc);
+
+ const ss::styles& styles = doc->get_styles();
+ const ss::sheet* sh = doc->get_sheet(0);
+ assert(sh);
+
+ // A1 should have the Default style applied.
+ std::size_t xfid = sh->get_cell_format(0, 0);
+ const ss::cell_format_t* xf = styles.get_cell_format(xfid);
+ assert(xf);
+
+ const ss::cell_style_t* xstyle = styles.get_cell_style_by_xf(xf->style_xf);
+ assert(xstyle);
+ assert(xstyle->name == "Default");
+
+ // This Default style has some custom properties.
+ xf = styles.get_cell_style_format(xf->style_xf);
+ assert(xf);
+
+ // Default style has a solid fill with light green color.
+ const ss::fill_t* fill = styles.get_fill(xf->fill);
+ assert(fill);
+ assert(fill->pattern_type);
+ assert(*fill->pattern_type == ss::fill_pattern_t::solid);
+ assert(fill->fg_color);
+ assert(*fill->fg_color == ss::color_t(0xFF, 0xF6, 0xF9, 0xD4));
+ assert(!fill->bg_color);
+
+ // Default style has a 14pt DejaVu Sans font with normal weight
+ const ss::font_t* font = styles.get_font(xf->font);
+ assert(font);
+ assert(font->name);
+ assert(*font->name == "DejaVu Sans");
+ assert(font->size);
+ assert(*font->size == 14.0);
+ assert(font->bold);
+ assert(!*font->bold);
+
+ assert(xf->hor_align == ss::hor_alignment_t::center);
+
+ // Columns B, E, G and rest all should have the "Default" style applied.
+ std::size_t xfid_default = xfid;
+ for (ss::col_t col : {1, 4, 6, 7, 8})
+ {
+ std::cout << "column " << col << std::endl;
+ xfid = sh->get_cell_format(0, col); // top cell
+ assert(xfid == xfid_default);
+ xfid = sh->get_cell_format(doc->get_sheet_size().rows-1, col); // bottom cell
+ assert(xfid == xfid_default);
+ }
+
+ // Column C should have "Gray With Lime" style applied
+ xfid = sh->get_cell_format(0, 2);
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+ xstyle = styles.get_cell_style_by_xf(xf->style_xf);
+ assert(xstyle);
+ assert(xstyle->name == "Gray With Lime" || xstyle->display_name == "Gray With Lime");
+
+ // Its parent style should be "Default".
+ xf = styles.get_cell_style_format(xf->style_xf);
+ assert(xf);
+ xstyle = styles.get_cell_style_by_xf(xf->style_xf);
+ assert(xstyle);
+ assert(xstyle->name == "Default");
+
+ // solid gray background
+ fill = styles.get_fill(xf->fill);
+ assert(fill);
+ assert(fill->pattern_type);
+ assert(*fill->pattern_type == ss::fill_pattern_t::solid);
+ assert(fill->fg_color);
+ assert(fill->fg_color == ss::color_t(0xFF, 0xCC, 0xCC, 0xCC));
+ assert(!fill->bg_color);
+
+ // bold, 16pt font, name not set
+ font = styles.get_font(xf->font);
+ assert(font);
+ assert(!font->name);
+ assert(font->size);
+ assert(*font->size == 16.0);
+ assert(font->bold);
+ assert(*font->bold);
+
+ // left and right borders are solid light green
+ const ss::border_t* border = styles.get_border(xf->border);
+ assert(border);
+
+ assert(border->left.style);
+ assert(*border->left.style == ss::border_style_t::solid);
+ assert(border->left.border_width);
+ assert(*border->left.border_width == length_t(length_unit_t::point, 2.01));
+ assert(border->left.border_color);
+ assert(*border->left.border_color == ss::color_t(0xFF, 0x81, 0xD4, 0x1A));
+
+ assert(border->right.style);
+ assert(*border->right.style == ss::border_style_t::solid);
+ assert(border->right.border_width);
+ assert(*border->right.border_width == length_t(length_unit_t::point, 2.01));
+ assert(border->right.border_color);
+ assert(*border->right.border_color == ss::color_t(0xFF, 0x81, 0xD4, 0x1A));
+
+ // Column D should have "Emphasis" style applied
+ xfid = sh->get_cell_format(0, 3);
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+ xstyle = styles.get_cell_style_by_xf(xf->style_xf);
+ assert(xstyle);
+ assert(xstyle->name == "Emphasis" || xstyle->display_name == "Emphasis");
+
+ // Its parent style should be "Default".
+ xf = styles.get_cell_style_format(xf->style_xf);
+ assert(xf);
+ xstyle = styles.get_cell_style_by_xf(xf->style_xf);
+ assert(xstyle);
+ assert(xstyle->name == "Default");
+
+ // solid pink background
+ fill = styles.get_fill(xf->fill);
+ assert(fill);
+ assert(fill->pattern_type);
+ assert(*fill->pattern_type == ss::fill_pattern_t::solid);
+ assert(fill->fg_color);
+ assert(*fill->fg_color == ss::color_t(0xFF, 0xFF, 0xd7, 0xd7));
+ assert(!fill->bg_color);
+
+ // font name 'Rasa Light', 18pt, underlined (solid double), red, not bold
+ font = styles.get_font(xf->font);
+ assert(font);
+ assert(font->name);
+ assert(*font->name == "Rasa Light");
+ assert(font->size);
+ assert(*font->size == 18.0);
+ assert(font->bold);
+ assert(!*font->bold); // in the file, it is given as a font weight of 250
+ assert(font->color);
+ assert(*font->color == ss::color_t(0xFF, 0xFF, 0x00, 0x00));
+ // double underline is stored as single-line double-type?
+ assert(font->underline_style);
+ assert(*font->underline_style == ss::underline_t::single_line);
+ assert(font->underline_type);
+ assert(*font->underline_type == ss::underline_type_t::double_type);
+ assert(!font->underline_color); // implies the same as font color
+
+ // Column F has "Default" style plus solid light purple background and bold font on top
+ xfid = sh->get_cell_format(0, 5);
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+ xstyle = styles.get_cell_style_by_xf(xf->style_xf);
+ assert(xstyle);
+ assert(xstyle->name == "Default");
+
+ // light purple solid background
+ fill = styles.get_fill(xf->fill);
+ assert(fill);
+ assert(fill->pattern_type);
+ assert(*fill->pattern_type == ss::fill_pattern_t::solid);
+ assert(fill->fg_color);
+ assert(*fill->fg_color == ss::color_t(0xFF, 0xE0, 0xC2, 0xCD));
+
+ // bold font
+ font = styles.get_font(xf->font);
+ assert(font);
+ assert(font->bold);
+ assert(*font->bold);
+
+ // Check on row 10 cell format from column A to column G
+ for (ss::col_t col = 0; col <= 100; ++col)
+ {
+ std::cout << "(row=9; column=" << col << ")" << std::endl;
+ xfid = sh->get_cell_format(9, col);
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+ assert(xf->ver_align == ss::ver_alignment_t::top);
+
+ fill = styles.get_fill(xf->fill);
+ assert(fill);
+
+ assert(fill->pattern_type);
+ assert(*fill->pattern_type == ss::fill_pattern_t::solid);
+ assert(fill->fg_color);
+ assert(*fill->fg_color == ss::color_t(0xFF, 0x00, 0xA9, 0x33));
+ }
+
+ // Move on to the next sheet...
+ sh = doc->get_sheet(1);
+ assert(sh);
+
+ // Column A uses "Default"
+ xfid = sh->get_cell_format(0, 0);
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+ xstyle = styles.get_cell_style_by_xf(xf->style_xf);
+ assert(xstyle);
+ assert(xstyle->name == "Default");
+
+ // Columns B:D use "Gray With Lime" with direct background color
+ for (ss::col_t col : {1, 2, 3})
+ {
+ std::cout << "column " << col << std::endl;
+ xfid = sh->get_cell_format(0, col);
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+
+ xstyle = styles.get_cell_style_by_xf(xf->style_xf);
+ assert(xstyle);
+ assert(xstyle->name == "Gray With Lime" || xstyle->display_name == "Gray With Lime");
+
+ fill = styles.get_fill(xf->fill);
+ assert(fill);
+ assert(fill->pattern_type);
+ assert(*fill->pattern_type == ss::fill_pattern_t::solid);
+ assert(fill->fg_color);
+ assert(*fill->fg_color == ss::color_t(0xFF, 0xFF, 0xDE, 0x59));
+ }
+
+ // Column E and the rest all use "Default"
+ xfid = sh->get_cell_format(0, 4);
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+ xstyle = styles.get_cell_style_by_xf(xf->style_xf);
+ assert(xstyle);
+ assert(xstyle->name == "Default");
+
+ // Columns F:I have narrower width of 0.5 inch.
+ {
+ ss::col_t col_start = -1, col_end = -1;
+ // column widths are stored in twips
+ ss::col_width_t cw = sh->get_col_width(5, &col_start, &col_end);
+ assert(col_start == 5);
+ assert(col_end == 9); // column I has an id = 8, plus 1 for the end position
+ length_t v{length_unit_t::inch, 0.5};
+ ss::col_width_t cw_expected = convert(0.5, length_unit_t::inch, length_unit_t::twip);
+ assert(cw == cw_expected);
+ }
+}
+
+void test_ods_import_styles_asian_complex()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ fs::path filepath{SRCDIR"/test/ods/styles/asian-complex.ods"};
+
+ auto doc = load_doc(filepath);
+ assert(doc);
+
+ const ss::styles& styles = doc->get_styles();
+ const ss::sheet* sh = doc->get_sheet(0);
+ assert(sh);
+
+ std::size_t xfid = sh->get_cell_format(0, 0); // A1
+ const ss::cell_format_t* xf = styles.get_cell_format(xfid);
+ assert(xf);
+
+ const ss::font_t* font = styles.get_font(xf->font);
+ assert(font);
+
+ assert(font->name);
+ assert(*font->name == "FreeMono");
+ assert(font->size);
+ assert(*font->size == 12.0);
+ assert(!font->bold); // bold not set
+ assert(font->italic);
+ assert(*font->italic);
+
+ xfid = sh->get_cell_format(1, 0); // A2
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+
+ font = styles.get_font(xf->font);
+ assert(font);
+
+ assert(font->name_asian);
+ assert(*font->name_asian == "Noto Sans CJK SC");
+ assert(font->size_asian);
+ assert(*font->size_asian == 16.0);
+ assert(font->bold_asian);
+ assert(*font->bold_asian);
+ assert(font->italic_asian);
+ assert(*font->italic_asian);
+
+ xfid = sh->get_cell_format(2, 0); // A3
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+
+ font = styles.get_font(xf->font);
+ assert(font);
+
+ assert(font->name_complex);
+ assert(*font->name_complex == "Gubbi");
+ assert(font->size_complex);
+ assert(*font->size_complex == 24.0);
+ assert(font->bold_complex);
+ assert(*font->bold_complex);
+ assert(font->italic_complex);
+ assert(*font->italic_complex);
+}
+
+void test_ods_import_styles_text_underlines()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ fs::path filepath{SRCDIR"/test/ods/styles/text-underlines.ods"};
+
+ auto doc = load_doc(filepath);
+ assert(doc);
+
+ const ss::styles& styles = doc->get_styles();
+ const ss::sheet* sh = doc->get_sheet(0);
+ assert(sh);
+
+ std::size_t xfid = sh->get_cell_format(1, 0); // A2
+ const ss::cell_format_t* xf = styles.get_cell_format(xfid);
+ assert(xf);
+
+ const ss::font_t* font = styles.get_font(xf->font);
+ assert(font);
+ assert(font->underline_style);
+ assert(*font->underline_style == ss::underline_t::single_line); // solid
+ assert(font->underline_width);
+ assert(*font->underline_width == ss::underline_width_t::automatic);
+ assert(!font->underline_color); // same as the font color
+
+ xfid = sh->get_cell_format(2, 0); // A3
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+
+ font = styles.get_font(xf->font);
+ assert(font);
+ assert(font->underline_style);
+ assert(*font->underline_style == ss::underline_t::single_line); // solid
+ assert(font->underline_type);
+ assert(*font->underline_type == ss::underline_type_t::double_type);
+ assert(font->underline_width);
+ assert(*font->underline_width == ss::underline_width_t::automatic);
+ assert(!font->underline_color); // same as the font color
+
+ xfid = sh->get_cell_format(3, 0); // A4
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+
+ font = styles.get_font(xf->font);
+ assert(font);
+ assert(font->underline_style);
+ assert(*font->underline_style == ss::underline_t::single_line); // solid
+ assert(font->underline_width);
+ assert(*font->underline_width == ss::underline_width_t::bold);
+ assert(!font->underline_color); // same as the font color
+
+ xfid = sh->get_cell_format(4, 0); // A5
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+
+ font = styles.get_font(xf->font);
+ assert(font);
+ assert(font->underline_style);
+ assert(*font->underline_style == ss::underline_t::dotted);
+ assert(font->underline_width);
+ assert(*font->underline_width == ss::underline_width_t::automatic);
+ assert(!font->underline_color); // same as the font color
+
+ xfid = sh->get_cell_format(5, 0); // A6
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+
+ font = styles.get_font(xf->font);
+ assert(font);
+ assert(font->underline_style);
+ assert(*font->underline_style == ss::underline_t::dotted);
+ assert(font->underline_width);
+ assert(*font->underline_width == ss::underline_width_t::bold);
+ assert(!font->underline_color); // same as the font color
+
+ xfid = sh->get_cell_format(6, 0); // A7
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+
+ font = styles.get_font(xf->font);
+ assert(font);
+ assert(font->underline_style);
+ assert(*font->underline_style == ss::underline_t::dash);
+ assert(font->underline_width);
+ assert(*font->underline_width == ss::underline_width_t::automatic);
+ assert(font->underline_color);
+ assert(*font->underline_color == ss::color_t(0x5E, 0xB9, 0x1E));
+
+ xfid = sh->get_cell_format(7, 0); // A8
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+
+ font = styles.get_font(xf->font);
+ assert(font);
+ assert(font->underline_style);
+ assert(*font->underline_style == ss::underline_t::long_dash);
+ assert(font->underline_width);
+ assert(*font->underline_width == ss::underline_width_t::automatic);
+ assert(!font->underline_color); // same as the font color
+
+ xfid = sh->get_cell_format(8, 0); // A9
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+
+ font = styles.get_font(xf->font);
+ assert(font);
+ assert(font->underline_style);
+ assert(*font->underline_style == ss::underline_t::dot_dash);
+ assert(font->underline_width);
+ assert(*font->underline_width == ss::underline_width_t::automatic);
+ assert(!font->underline_color); // same as the font color
+
+ xfid = sh->get_cell_format(9, 0); // A10
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+
+ font = styles.get_font(xf->font);
+ assert(font);
+ assert(font->underline_style);
+ assert(*font->underline_style == ss::underline_t::dot_dot_dash);
+ assert(font->underline_width);
+ assert(*font->underline_width == ss::underline_width_t::automatic);
+ assert(!font->underline_color); // same as the font color
+
+ xfid = sh->get_cell_format(10, 0); // A11
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+
+ font = styles.get_font(xf->font);
+ assert(font);
+ assert(font->underline_style);
+ assert(*font->underline_style == ss::underline_t::wave);
+ assert(font->underline_width);
+ assert(*font->underline_width == ss::underline_width_t::automatic);
+ assert(!font->underline_color); // same as the font color
+
+ xfid = sh->get_cell_format(11, 0); // A12
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+
+ font = styles.get_font(xf->font);
+ assert(font);
+ assert(font->underline_style);
+ assert(*font->underline_style == ss::underline_t::wave);
+ assert(font->underline_width);
+ assert(*font->underline_width == ss::underline_width_t::automatic);
+ assert(font->underline_color);
+ assert(*font->underline_color == ss::color_t(0xFF, 0x00, 0x00));
+
+ xfid = sh->get_cell_format(12, 0); // A13
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+
+ font = styles.get_font(xf->font);
+ assert(font);
+ assert(font->underline_style);
+ assert(*font->underline_style == ss::underline_t::wave);
+ assert(font->underline_type);
+ assert(*font->underline_type == ss::underline_type_t::double_type);
+ assert(font->underline_width);
+ assert(*font->underline_width == ss::underline_width_t::automatic);
+ assert(!font->underline_color); // same as the font color
+ assert(font->underline_mode);
+ assert(*font->underline_mode == ss::underline_mode_t::skip_white_space);
+}
+
+} // anonymous namespace
+
+int main()
+{
+ test_ods_detection();
+ test_ods_create_filter();
+ test_ods_import_cell_values();
+ test_ods_import_column_widths_row_heights();
+ test_ods_import_formatted_text();
+ test_ods_import_number_formats();
+ test_ods_import_cell_properties();
+ test_ods_import_styles_direct_format();
+ test_ods_import_styles_column_styles();
+ test_ods_import_styles_asian_complex();
+ test_ods_import_styles_text_underlines();
+
+ return EXIT_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/orcus_test_parquet.cpp b/src/orcus_test_parquet.cpp
new file mode 100644
index 0000000..d8a0699
--- /dev/null
+++ b/src/orcus_test_parquet.cpp
@@ -0,0 +1,134 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus_test_global.hpp"
+
+#include <orcus/stream.hpp>
+#include <orcus/orcus_parquet.hpp>
+#include <orcus/format_detection.hpp>
+#include <orcus/spreadsheet/document.hpp>
+#include <orcus/spreadsheet/factory.hpp>
+
+#include <iostream>
+#include <sstream>
+
+#include "filesystem_env.hpp"
+
+using namespace orcus;
+namespace ss = orcus::spreadsheet;
+
+const fs::path BASIC_TEST_DOC_DIR = SRCDIR"/test/parquet/basic";
+
+constexpr std::string_view BASIC_TEST_DOCS[] = {
+ "basic-gzip.parquet",
+ "basic-nocomp.parquet",
+ "basic-snappy.parquet",
+ "basic-zstd.parquet",
+ "float-with-nan.parquet",
+};
+
+struct doc_context
+{
+ ss::document doc;
+ ss::import_factory factory;
+ orcus_parquet app;
+
+ doc_context() :
+ doc{ss::range_size_t{1048576, 16384}}, factory{doc}, app{&factory}
+ {
+ }
+
+ std::string get_check_string() const
+ {
+ std::ostringstream os;
+ doc.dump_check(os);
+ return os.str();
+ }
+};
+
+void test_parquet_create_filter()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ ss::range_size_t ssize{1048576, 16384};
+ std::unique_ptr<ss::document> doc = std::make_unique<ss::document>(ssize);
+ ss::import_factory factory(*doc);
+
+ auto f = create_filter(format_t::parquet, &factory);
+ assert(f);
+ assert(f->get_name() == "parquet");
+}
+
+void test_parquet_basic()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ for (auto test_doc : BASIC_TEST_DOCS)
+ {
+ const auto docpath = BASIC_TEST_DOC_DIR / std::string{test_doc};
+ std::cout << docpath << std::endl;
+ assert(fs::is_regular_file(docpath));
+
+ // Test the file import.
+ auto cxt = std::make_unique<doc_context>();
+ cxt->app.read_file(docpath.string());
+ assert(cxt->doc.get_sheet_count() == 1);
+
+ // Check the content vs control
+ const fs::path check_path = BASIC_TEST_DOC_DIR / (docpath.filename().string() + ".check");
+ file_content control{check_path.string()};
+
+ test::verify_content(__FILE__, __LINE__, control.str(), cxt->get_check_string());
+
+ // Test the stream import. Manually change the sheet name to the stem
+ // of the input file since the sheet name is set to 'Data' for stream
+ // imports.
+ cxt = std::make_unique<doc_context>();
+ file_content fc(docpath.string());
+ cxt->app.read_stream(fc.str());
+ cxt->doc.set_sheet_name(0, docpath.stem().string());
+
+ // Check the content vs control
+ test::verify_content(__FILE__, __LINE__, control.str(), cxt->get_check_string());
+ }
+}
+
+void test_parquet_detection()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ for (auto test_doc : BASIC_TEST_DOCS)
+ {
+ const auto docpath = BASIC_TEST_DOC_DIR / std::string{test_doc};
+ assert(fs::is_regular_file(docpath));
+
+ file_content content{docpath.string()};
+ auto strm = content.str();
+ bool res = orcus_parquet::detect(reinterpret_cast<const unsigned char*>(strm.data()), strm.size());
+ assert(res);
+ }
+}
+
+int main()
+{
+ try
+ {
+ test_parquet_create_filter();
+ test_parquet_basic();
+ test_parquet_detection();
+ }
+ catch (const std::exception& e)
+ {
+ std::cout << e.what() << std::endl;
+ return EXIT_FAILURE;
+ }
+
+ return EXIT_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+
diff --git a/src/orcus_test_xls_xml.cpp b/src/orcus_test_xls_xml.cpp
new file mode 100644
index 0000000..71bbb17
--- /dev/null
+++ b/src/orcus_test_xls_xml.cpp
@@ -0,0 +1,2455 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus_test_global.hpp"
+#include "filesystem_env.hpp"
+
+#include "orcus/orcus_xls_xml.hpp"
+#include <orcus/format_detection.hpp>
+#include "orcus/stream.hpp"
+#include "orcus/config.hpp"
+#include <orcus/parser_global.hpp>
+#include "orcus/yaml_document_tree.hpp"
+#include "orcus/spreadsheet/factory.hpp"
+#include "orcus/spreadsheet/document.hpp"
+#include "orcus/spreadsheet/view.hpp"
+#include "orcus/spreadsheet/sheet.hpp"
+#include "orcus/spreadsheet/shared_strings.hpp"
+#include "orcus/spreadsheet/styles.hpp"
+#include "orcus/spreadsheet/config.hpp"
+
+#include <ixion/model_context.hpp>
+#include <ixion/address.hpp>
+#include <ixion/cell.hpp>
+
+#include <string>
+#include <sstream>
+#include <vector>
+#include <cmath>
+#include <iostream>
+#include <fstream>
+
+using namespace orcus;
+namespace ss = orcus::spreadsheet;
+
+namespace {
+
+config test_config(format_t::xls_xml);
+
+const std::vector<fs::path> dirs = {
+ SRCDIR"/test/xls-xml/basic/",
+ SRCDIR"/test/xls-xml/basic-utf-16-be/",
+ SRCDIR"/test/xls-xml/basic-utf-16-le/",
+ SRCDIR"/test/xls-xml/bold-and-italic/",
+ SRCDIR"/test/xls-xml/colored-text/",
+ SRCDIR"/test/xls-xml/empty-rows/",
+ SRCDIR"/test/xls-xml/formula-array-1/",
+ SRCDIR"/test/xls-xml/formula-cells-1/",
+ SRCDIR"/test/xls-xml/formula-cells-2/",
+ SRCDIR"/test/xls-xml/formula-cells-3/",
+ SRCDIR"/test/xls-xml/invalid-sub-structure/",
+ SRCDIR"/test/xls-xml/leading-whitespace/",
+ SRCDIR"/test/xls-xml/merged-cells/",
+ SRCDIR"/test/xls-xml/named-colors/",
+ SRCDIR"/test/xls-xml/named-expression/",
+ SRCDIR"/test/xls-xml/named-expression-sheet-local/",
+ SRCDIR"/test/xls-xml/raw-values-1/",
+ SRCDIR"/test/xls-xml/table-offset/",
+ SRCDIR"/test/xls-xml/unnamed-parent-styles/",
+};
+
+std::unique_ptr<spreadsheet::document> load_doc_from_filepath(
+ const std::string& path,
+ bool recalc=true,
+ ss::formula_error_policy_t error_policy=ss::formula_error_policy_t::fail)
+{
+ std::cout << path << std::endl;
+
+ spreadsheet::range_size_t ss{1048576, 16384};
+ std::unique_ptr<spreadsheet::document> doc = std::make_unique<spreadsheet::document>(ss);
+ spreadsheet::import_factory factory(*doc);
+ factory.set_recalc_formula_cells(recalc);
+ factory.set_formula_error_policy(error_policy);
+ orcus_xls_xml app(&factory);
+ app.set_config(test_config);
+ app.read_file(path.c_str());
+
+ return doc;
+}
+
+std::unique_ptr<spreadsheet::document> load_doc_from_stream(const std::string& path)
+{
+ spreadsheet::range_size_t ss{1048576, 16384};
+ std::unique_ptr<spreadsheet::document> doc = std::make_unique<spreadsheet::document>(ss);
+ spreadsheet::import_factory factory(*doc);
+ orcus_xls_xml app(&factory);
+
+ std::ifstream ifs(path, std::ios::binary | std::ios::ate);
+ std::streamsize n = ifs.tellg();
+ ifs.seekg(0);
+ std::string content(n, '\0');
+ if (ifs.read(content.data(), n))
+ {
+ app.read_stream(content);
+ doc->recalc_formula_cells();
+ }
+
+ return doc;
+}
+
+class doc_loader
+{
+ spreadsheet::document m_doc;
+ spreadsheet::import_factory m_factory;
+
+public:
+ doc_loader(std::string_view path) :
+ m_doc({1048576, 16384}), m_factory(m_doc)
+ {
+ std::cout << path << std::endl;
+ orcus_xls_xml app(&m_factory);
+ app.read_file(path.data());
+ }
+
+ spreadsheet::document& get_doc()
+ {
+ return m_doc;
+ }
+
+ spreadsheet::import_factory& get_factory()
+ {
+ return m_factory;
+ }
+};
+
+void update_config(spreadsheet::document& doc, const std::string& path)
+{
+ try
+ {
+ spreadsheet::document_config cfg = doc.get_config();
+
+ yaml::document_tree config;
+ file_content content(path.data());
+ config.load(content.str());
+ yaml::const_node root = config.get_document_root(0);
+ std::vector<yaml::const_node> keys = root.keys();
+ for (size_t i = 0; i < keys.size(); ++i)
+ {
+ const yaml::const_node& key = keys[i];
+ if (key.type() == yaml::node_t::string && key.string_value() == "output-precision")
+ {
+ yaml::const_node child = root.child(i);
+ if (child.type() == yaml::node_t::number)
+ cfg.output_precision = child.numeric_value();
+ }
+ }
+
+ doc.set_config(cfg);
+ }
+ catch (const std::exception&)
+ {
+ // Do nothing.
+ }
+}
+
+void test_xls_xml_detection()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ for (const auto& dir : dirs)
+ {
+ fs::path filepath = dir / "input.xml";
+ file_content fc(filepath.string());
+ assert(!fc.empty());
+
+ format_t detected = detect(fc.str());
+ assert(detected == format_t::xls_xml);
+ }
+}
+
+void test_xls_xml_create_filter()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ ss::range_size_t ssize{1048576, 16384};
+ std::unique_ptr<ss::document> doc = std::make_unique<ss::document>(ssize);
+ ss::import_factory factory(*doc);
+
+ auto f = create_filter(format_t::xls_xml, &factory);
+ assert(f);
+ assert(f->get_name() == "xls-xml");
+}
+
+void test_xls_xml_import()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ auto verify = [](spreadsheet::document& doc, const fs::path& dir)
+ {
+ auto path = dir / "config.yaml";
+ update_config(doc, path.string());
+
+ // Dump the content of the model.
+ std::ostringstream os;
+ doc.dump_check(os);
+ std::string check = os.str();
+
+ // Check that against known control.
+ path = dir / "check.txt";
+ file_content control(path.string());
+
+ assert(!check.empty());
+ assert(!control.empty());
+
+ std::string_view s1(check.data(), check.size());
+ std::string_view s2 = control.str();
+ s1 = orcus::trim(s1);
+ s2 = orcus::trim(s2);
+
+ if (s1 != s2)
+ {
+ size_t offset = locate_first_different_char(s1, s2);
+ auto line1 = locate_line_with_offset(s1, offset);
+ auto line2 = locate_line_with_offset(s2, offset);
+ std::cout << "expected: " << line2.line << std::endl;
+ std::cout << "observed: " << line1.line << std::endl;
+ assert(!"content verification failed");
+ }
+ };
+
+ for (const auto& dir : dirs)
+ {
+ std::cout << dir << std::endl;
+
+ // Read the input.xml document.
+ fs::path filepath = dir / "input.xml";
+ std::unique_ptr<spreadsheet::document> doc = load_doc_from_filepath(filepath.string());
+ verify(*doc, dir);
+
+ doc = load_doc_from_stream(filepath.string());
+ verify(*doc, dir);
+ }
+}
+
+void test_xls_xml_merged_cells()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ auto doc = load_doc_from_filepath(SRCDIR"/test/xls-xml/merged-cells/input.xml");
+
+ const spreadsheet::sheet* sheet1 = doc->get_sheet("Sheet1");
+ assert(sheet1);
+
+ spreadsheet::range_t merge_range = sheet1->get_merge_cell_range(0, 1);
+ assert(merge_range.first.column == 1);
+ assert(merge_range.last.column == 2);
+ assert(merge_range.first.row == 0);
+ assert(merge_range.last.row == 0);
+
+ merge_range = sheet1->get_merge_cell_range(0, 3);
+ assert(merge_range.first.column == 3);
+ assert(merge_range.last.column == 5);
+ assert(merge_range.first.row == 0);
+ assert(merge_range.last.row == 0);
+
+ merge_range = sheet1->get_merge_cell_range(1, 0);
+ assert(merge_range.first.column == 0);
+ assert(merge_range.last.column == 0);
+ assert(merge_range.first.row == 1);
+ assert(merge_range.last.row == 2);
+
+ merge_range = sheet1->get_merge_cell_range(3, 0);
+ assert(merge_range.first.column == 0);
+ assert(merge_range.last.column == 0);
+ assert(merge_range.first.row == 3);
+ assert(merge_range.last.row == 5);
+
+ merge_range = sheet1->get_merge_cell_range(2, 2);
+ assert(merge_range.first.column == 2);
+ assert(merge_range.last.column == 5);
+ assert(merge_range.first.row == 2);
+ assert(merge_range.last.row == 5);
+}
+
+void test_xls_xml_date_time()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ auto doc = load_doc_from_filepath(SRCDIR"/test/xls-xml/date-time/input.xml");
+
+ const spreadsheet::sheet* sheet1 = doc->get_sheet("Sheet1");
+ assert(sheet1);
+
+ // B1 contains date-only value.
+ date_time_t dt = sheet1->get_date_time(0, 1);
+ assert(dt == date_time_t(2016, 12, 14));
+
+ // B2 contains date-time value with no fraction seconds.
+ dt = sheet1->get_date_time(1, 1);
+ assert(dt == date_time_t(2002, 2, 3, 12, 34, 45));
+
+ // B3 contains date-time value with fraction second (1992-03-04 08:34:33.555)
+ dt = sheet1->get_date_time(2, 1);
+ assert(dt.year == 1992);
+ assert(dt.month == 3);
+ assert(dt.day == 4);
+ assert(dt.hour == 8);
+ assert(dt.minute == 34);
+ assert(std::floor(dt.second) == 33.0);
+
+ // Evalutate the fraction second as milliseconds.
+ double ms = dt.second * 1000.0;
+ ms -= std::floor(dt.second) * 1000.0;
+ ms = std::round(ms);
+ assert(ms == 555.0);
+}
+
+void test_xls_xml_bold_and_italic()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ auto doc = load_doc_from_filepath(SRCDIR"/test/xls-xml/bold-and-italic/input.xml");
+
+ const spreadsheet::sheet* sheet1 = doc->get_sheet("Sheet1");
+ assert(sheet1);
+
+ const spreadsheet::shared_strings& ss = doc->get_shared_strings();
+
+ const spreadsheet::styles& styles = doc->get_styles();
+
+ // A1 contains unformatted text.
+ size_t si = sheet1->get_string_identifier(0, 0);
+ const std::string* sp = ss.get_string(si);
+ assert(sp);
+ assert(*sp == "Normal Text");
+
+ // A2 contains bold text.
+ si = sheet1->get_string_identifier(1, 0);
+ sp = ss.get_string(si);
+ assert(sp);
+ assert(*sp == "Bold Text");
+
+ size_t xfi = sheet1->get_cell_format(1, 0);
+ const spreadsheet::cell_format_t* cf = styles.get_cell_format(xfi);
+ assert(cf);
+ const spreadsheet::font_t* font = styles.get_font(cf->font);
+ assert(font);
+ assert(*font->bold);
+ assert(!*font->italic);
+
+ // A3 contains italic text.
+ si = sheet1->get_string_identifier(2, 0);
+ sp = ss.get_string(si);
+ assert(sp);
+ assert(*sp == "Italic Text");
+
+ xfi = sheet1->get_cell_format(2, 0);
+ cf = styles.get_cell_format(xfi);
+ assert(cf);
+ font = styles.get_font(cf->font);
+ assert(font);
+ assert(!*font->bold);
+ assert(*font->italic);
+
+ // A4 contains bold and italic text.
+ si = sheet1->get_string_identifier(3, 0);
+ sp = ss.get_string(si);
+ assert(sp);
+ assert(*sp == "Bold and Italic Text");
+
+ xfi = sheet1->get_cell_format(3, 0);
+ cf = styles.get_cell_format(xfi);
+ assert(cf);
+ font = styles.get_font(cf->font);
+ assert(font);
+ assert(font->bold);
+ assert(font->italic);
+
+ // A5 contains a mixed format text.
+ si = sheet1->get_string_identifier(4, 0);
+ sp = ss.get_string(si);
+ assert(sp);
+ assert(*sp == "Bold and Italic mixed");
+
+ // The string contains 4 formatted segments.
+ const spreadsheet::format_runs_t* fmt_runs = ss.get_format_runs(si);
+ assert(fmt_runs);
+ assert(fmt_runs->size() == 4);
+
+ // First formatted segment is bold.
+ const spreadsheet::format_run* fmt_run = &fmt_runs->at(0);
+ assert(fmt_run->pos == 0);
+ assert(fmt_run->size == 4);
+ assert(fmt_run->bold);
+ assert(!fmt_run->italic);
+
+ // Third formatted segment is italic.
+ fmt_run = &fmt_runs->at(2);
+ assert(fmt_run->pos == 9);
+ assert(fmt_run->size == 6);
+ assert(!fmt_run->bold);
+ assert(fmt_run->italic);
+}
+
+void test_xls_xml_colored_text()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ auto doc = load_doc_from_filepath(SRCDIR"/test/xls-xml/colored-text/input.xml");
+
+ const spreadsheet::sheet* sheet1 = doc->get_sheet("ColoredText");
+ assert(sheet1);
+
+ const spreadsheet::shared_strings& ss = doc->get_shared_strings();
+
+ const spreadsheet::styles& styles = doc->get_styles();
+
+ // Column A contains colored cells.
+
+ struct check
+ {
+ spreadsheet::row_t row;
+ spreadsheet::color_elem_t red;
+ spreadsheet::color_elem_t green;
+ spreadsheet::color_elem_t blue;
+ std::string text;
+ };
+
+ std::vector<check> checks = {
+ { 1, 0xC0, 0x00, 0x00, "Dark Red" },
+ { 2, 0xFF, 0x00, 0x00, "Red" },
+ { 3, 0xFF, 0xC0, 0x00, "Orange" },
+ { 4, 0xFF, 0xFF, 0x00, "Yellow" },
+ { 5, 0x92, 0xD0, 0x50, "Light Green" },
+ { 6, 0x00, 0xB0, 0x50, "Green" },
+ { 7, 0x00, 0xB0, 0xF0, "Light Blue" },
+ { 8, 0x00, 0x70, 0xC0, "Blue" },
+ { 9, 0x00, 0x20, 0x60, "Dark Blue" },
+ { 10, 0x70, 0x30, 0xA0, "Purple" },
+ };
+
+ for (const check& c : checks)
+ {
+ size_t xfi = sheet1->get_cell_format(c.row, 0);
+ const spreadsheet::cell_format_t* xf = styles.get_cell_format(xfi);
+ assert(xf);
+
+ const spreadsheet::font_t* font = styles.get_font(xf->font);
+ assert(font);
+ assert(font->color);
+ assert(font->color.value().red == c.red);
+ assert(font->color.value().green == c.green);
+ assert(font->color.value().blue == c.blue);
+
+ size_t si = sheet1->get_string_identifier(c.row, 0);
+ const std::string* s = ss.get_string(si);
+ assert(s);
+ assert(*s == c.text);
+ }
+
+ // Cell B2 contains mix-colored text.
+ size_t si = sheet1->get_string_identifier(1, 1);
+ const std::string* s = ss.get_string(si);
+ assert(s);
+ assert(*s == "Red and Blue");
+ const spreadsheet::format_runs_t* fmt_runs = ss.get_format_runs(si);
+ assert(fmt_runs);
+
+ // There should be 2 segments that are color-formatted and one that is not.
+ assert(fmt_runs->size() == 3);
+
+ // The 'Red' segment should be in red color.
+ const spreadsheet::format_run* fmt = &fmt_runs->at(0);
+ assert(fmt->color.alpha == 0xFF);
+ assert(fmt->color.red == 0xFF);
+ assert(fmt->color.green == 0);
+ assert(fmt->color.blue == 0);
+ assert(fmt->pos == 0);
+ assert(fmt->size == 3);
+
+ // The 'Blue' segment should be in blue color.
+ fmt = &fmt_runs->at(2);
+ assert(fmt->color.alpha == 0xFF);
+ assert(fmt->color.red == 0);
+ assert(fmt->color.green == 0x70);
+ assert(fmt->color.blue == 0xC0);
+ assert(fmt->pos == 8);
+ assert(fmt->size == 4);
+}
+
+void test_xls_xml_formatted_text_basic()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ auto doc = load_doc_from_filepath(SRCDIR"/test/xls-xml/formatted-text/basic.xml");
+ const auto& styles_pool = doc->get_styles();
+
+ auto get_font = [&styles_pool](const ss::sheet& sh, ss::row_t row, ss::col_t col)
+ {
+ std::size_t xf = sh.get_cell_format(row, col);
+
+ const ss::cell_format_t* cell_format = styles_pool.get_cell_format(xf);
+ assert(cell_format);
+
+ const ss::font_t* font = styles_pool.get_font(cell_format->font);
+ assert(font);
+
+ return font;
+ };
+
+ auto check_cell_bold = [&get_font](const ss::sheet& sh, ss::row_t row, ss::col_t col, bool expected)
+ {
+ const ss::font_t* font = get_font(sh, row, col);
+
+ if (expected)
+ {
+ if (font->bold && *font->bold)
+ return true;
+
+ std::cerr << "expected to be bold but it is not "
+ << "(sheet=" << sh.get_index() << "; row=" << row << "; column=" << col << ")"
+ << std::endl;
+
+ return false;
+ }
+ else
+ {
+ if (!font->bold || !*font->bold)
+ return true;
+
+ std::cerr << "expected to be non-bold but it is bold "
+ << "(sheet=" << sh.get_index() << "; row=" << row << "; column=" << col << ")"
+ << std::endl;
+
+ return false;
+ }
+ };
+
+ auto check_cell_italic = [&get_font](const ss::sheet& sh, ss::row_t row, ss::col_t col, bool expected)
+ {
+ const ss::font_t* font = get_font(sh, row, col);
+
+ if (expected)
+ {
+ if (font->italic && *font->italic)
+ return true;
+
+ std::cerr << "expected to be italic but it is not "
+ << "(sheet=" << sh.get_index() << "; row=" << row << "; column=" << col << ")"
+ << std::endl;
+
+ return false;
+ }
+ else
+ {
+ if (!font->italic || !*font->italic)
+ return true;
+
+ std::cerr << "expected to be non-italic but it is italic "
+ << "(sheet=" << sh.get_index() << "; row=" << row << "; column=" << col << ")"
+ << std::endl;
+
+ return false;
+ }
+ };
+
+ auto check_cell_text = [&doc](const ss::sheet& sh, ss::row_t row, ss::col_t col, std::string_view expected)
+ {
+ const auto& sstrings = doc->get_shared_strings();
+
+ std::size_t si = sh.get_string_identifier(row, col);
+ const std::string* s = sstrings.get_string(si);
+ if (!s)
+ {
+ std::cerr << "expected='" << expected << "'; actual=<none> "
+ << "(sheet=" << sh.get_index() << "; row=" << row << "; column=" << col << ")"
+ << std::endl;
+
+ return false;
+ }
+
+ if (*s == expected)
+ return true;
+
+ std::cerr << "expected='" << expected << "'; actual='" << *s << "' "
+ << "(sheet=" << sh.get_index() << "; row=" << row << "; column=" << col << ")"
+ << std::endl;
+
+ return false;
+ };
+
+ {
+ const spreadsheet::sheet* sheet = doc->get_sheet("Text Properties");
+ assert(sheet);
+
+ ss::row_t row = 0;
+ ss::col_t col = 0;
+
+ // A1 - unformatted
+ assert(check_cell_text(*sheet, row, col, "Normal Text"));
+ assert(check_cell_bold(*sheet, row, col, false));
+ assert(check_cell_italic(*sheet, row, col, false));
+
+ // A2 - bold
+ row = 1;
+ assert(check_cell_text(*sheet, row, col, "Bold Text"));
+ assert(check_cell_bold(*sheet, row, col, true));
+ assert(check_cell_italic(*sheet, row, col, false));
+
+ // A3 - italic
+ row = 2;
+ assert(check_cell_text(*sheet, row, col, "Italic Text"));
+ assert(check_cell_bold(*sheet, row, col, false));
+ assert(check_cell_italic(*sheet, row, col, true));
+
+ // A4 - bold and italic
+ row = 3;
+ assert(check_cell_text(*sheet, row, col, "Bold and Italic Text"));
+ assert(check_cell_bold(*sheet, row, col, true));
+ assert(check_cell_italic(*sheet, row, col, true));
+
+ // A5 - bold and italic mixed. Excel creates format runs even for
+ // non-formatted segments.
+ row = 4;
+ assert(check_cell_text(*sheet, row, col, "Bold and Italic mixed"));
+
+ std::size_t si = sheet->get_string_identifier(row, col);
+ const ss::format_runs_t* runs = doc->get_shared_strings().get_format_runs(si);
+ assert(runs);
+ assert(runs->size() == 4u); // only 0 and 2 are formatted
+
+ // Bold and ...
+ // ^^^^
+ assert(runs->at(0).pos == 0);
+ assert(runs->at(0).size == 4);
+ assert(runs->at(0).bold);
+ assert(!runs->at(0).italic);
+
+ // Bold and Italic
+ // ^^^^^^
+ assert(runs->at(2).pos == 9);
+ assert(runs->at(2).size == 6);
+ assert(!runs->at(2).bold);
+ assert(runs->at(2).italic);
+
+ // A6
+ row = 5;
+ assert(check_cell_text(*sheet, row, col, "Bold base with non-bold part"));
+ assert(check_cell_bold(*sheet, row, col, true));
+ assert(check_cell_italic(*sheet, row, col, false));
+
+ si = sheet->get_string_identifier(row, col);
+ runs = doc->get_shared_strings().get_format_runs(si);
+ assert(runs);
+ assert(runs->size() == 3u);
+
+ assert(runs->at(0).pos == 0);
+ assert(runs->at(0).size == 15);
+ assert(runs->at(0).bold);
+
+ assert(runs->at(1).pos == 15);
+ assert(runs->at(1).size == 8);
+ assert(!runs->at(1).bold);
+
+ assert(runs->at(2).pos == 23);
+ assert(runs->at(2).size == 5);
+ assert(runs->at(2).bold);
+
+ // A7 - TODO: check format
+ row = 6;
+ assert(check_cell_text(*sheet, row, col, "Only partially underlined"));
+
+ // A8
+ row = 7;
+ assert(check_cell_text(*sheet, row, col, "All Underlined"));
+ const ss::font_t* font = get_font(*sheet, row, col);
+ assert(font->underline_style);
+ assert(*font->underline_style == ss::underline_t::single_line);
+
+ // A9
+ row = 8;
+ assert(check_cell_text(*sheet, row, col, "Bold and underlined"));
+ assert(check_cell_bold(*sheet, row, col, true));
+ font = get_font(*sheet, row, col);
+ assert(font->underline_style);
+ assert(*font->underline_style == ss::underline_t::single_line);
+
+ row = 9;
+ assert(check_cell_text(*sheet, row, col, "All Strikethrough"));
+ // TODO: check for strikethrough in cell
+
+ // A11:A15 - TODO: check format
+ row = 10;
+ assert(check_cell_text(*sheet, row, col, "Partial strikethrough"));
+ row = 11;
+ assert(check_cell_text(*sheet, row, col, "Superscript"));
+ row = 12;
+ assert(check_cell_text(*sheet, row, col, "Subscript"));
+ row = 13;
+ assert(check_cell_text(*sheet, row, col, "x2 + y2 = 102"));
+ row = 14;
+ assert(check_cell_text(*sheet, row, col, "xi = yi + zi"));
+ }
+
+ {
+ const spreadsheet::sheet* sheet = doc->get_sheet("Fonts");
+ assert(sheet);
+
+ struct check
+ {
+ ss::row_t row;
+ std::string_view font_name;
+ double font_unit;
+ };
+
+ check checks[] = {
+ { 0, "Calibri Light", 12.0 },
+ { 1, "Arial", 18.0 },
+ { 2, "Times New Roman", 14.0 },
+ { 3, "Consolas", 9.0 },
+ { 4, "Bookman Old Style", 20.0 },
+ };
+
+ for (const auto& c : checks)
+ {
+ std::size_t xf = sheet->get_cell_format(c.row, 0);
+ const ss::cell_format_t* cell_format = styles_pool.get_cell_format(xf);
+ assert(cell_format);
+ const ss::font_t* font = styles_pool.get_font(cell_format->font);
+ assert(font);
+ assert(font->name == c.font_name);
+ assert(font->size == c.font_unit);
+
+ // Columns A and B should have the same font.
+ xf = sheet->get_cell_format(c.row, 1);
+ cell_format = styles_pool.get_cell_format(xf);
+ assert(cell_format);
+ font = styles_pool.get_font(cell_format->font);
+ assert(font);
+ assert(font->name == c.font_name);
+ assert(font->size == c.font_unit);
+ }
+ }
+
+ {
+ const spreadsheet::sheet* sheet = doc->get_sheet("Mixed Fonts");
+ assert(sheet);
+
+ // A1
+ ss::row_t row = 0;
+ ss::col_t col = 0;
+ assert(check_cell_text(*sheet, row, col, "C++ has class and struct as keywords."));
+
+ // Base cell has Serif 12-pt font applied
+ auto xf = sheet->get_cell_format(row, col);
+ const ss::cell_format_t* fmt = styles_pool.get_cell_format(xf);
+ assert(fmt);
+ const ss::font_t* font = styles_pool.get_font(fmt->font);
+ assert(font);
+ assert(font->name == "Calibri");
+ assert(font->size == 11.0);
+
+ // Two segments has Liberation Mono font applied (runs 1 and 3) whereas
+ // runs 0, 2 and 4 are unformatted.
+ std::size_t si = sheet->get_string_identifier(row, col);
+ const ss::format_runs_t* runs = doc->get_shared_strings().get_format_runs(si);
+ assert(runs);
+ assert(runs->size() == 5u);
+
+ // C++ has class ...
+ // ^^^^^
+ assert(runs->at(1).pos == 8);
+ assert(runs->at(1).size == 5);
+ assert(runs->at(1).font == "Liberation Mono");
+
+ // ... and struct as ...
+ // ^^^^^^
+ assert(runs->at(3).pos == 18);
+ assert(runs->at(3).size == 6);
+ assert(runs->at(3).font == "Liberation Mono");
+
+ // A2
+ row = 1;
+ assert(check_cell_text(*sheet, row, col, "Text with 12-point font, 24-point font, and 36-point font mixed."));
+ si = sheet->get_string_identifier(row, col);
+ runs = doc->get_shared_strings().get_format_runs(si);
+ assert(runs);
+ assert(runs->size() == 10u);
+
+ // with 12-point font, ...
+ // ^^
+ assert(runs->at(1).pos == 10);
+ assert(runs->at(1).size == 2);
+ assert(runs->at(1).font_size == 12.0f);
+ assert(runs->at(1).color == ss::color_t(0xFF, 0xFF, 0, 0)); // red
+
+ // with 12-point font, ...
+ // ^^^^^^
+ assert(runs->at(2).pos == 12);
+ assert(runs->at(2).size == 6);
+ assert(runs->at(2).font_size == 12.0f);
+
+ // 24-point font,
+ // ^^
+ assert(runs->at(4).pos == 25);
+ assert(runs->at(4).size == 2);
+ assert(runs->at(4).font_size == 24.0f);
+ assert(runs->at(4).color == ss::color_t(0xFF, 0xFF, 0, 0)); // red
+
+ // 24-point font,
+ // ^^^^^^
+ assert(runs->at(5).pos == 27);
+ assert(runs->at(5).size == 6);
+ assert(runs->at(5).font_size == 24.0f);
+
+ // and 36-point font
+ // ^^
+ assert(runs->at(7).pos == 44);
+ assert(runs->at(7).size == 2);
+ assert(runs->at(7).font_size == 36.0f);
+ assert(runs->at(7).color == ss::color_t(0xFF, 0xFF, 0, 0)); // red
+
+ // and 36-point font
+ // ^^^^^^
+ assert(runs->at(8).pos == 46);
+ assert(runs->at(8).size == 6);
+ assert(runs->at(8).font_size == 36.0f);
+ }
+}
+
+void test_xls_xml_column_width_row_height()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ struct cw_check
+ {
+ spreadsheet::col_t col;
+ double width;
+ int decimals;
+ };
+
+ struct rh_check
+ {
+ spreadsheet::row_t row;
+ double height;
+ int decimals;
+ };
+
+ auto doc = load_doc_from_filepath(SRCDIR"/test/xls-xml/column-width-row-height/input.xml");
+
+ // Column widths and row heights are stored in twips. Convert them to
+ // points so that we can compare them with the values stored in the source
+ // file.
+
+ {
+ // Sheet1
+ const spreadsheet::sheet* sheet = doc->get_sheet(0);
+ assert(sheet);
+
+ std::vector<cw_check> cw_checks =
+ {
+ { 1, 56.25, 2 },
+ { 2, 82.50, 2 },
+ { 3, 108.75, 2 },
+ { 5, 66.75, 2 },
+ { 6, 66.75, 2 },
+ { 7, 66.75, 2 },
+ { 10, 119.25, 2 },
+ { 11, 119.25, 2 },
+ };
+
+ for (const cw_check& check : cw_checks)
+ {
+ spreadsheet::col_width_t cw = sheet->get_col_width(check.col, nullptr, nullptr);
+ double pt = convert(cw, length_unit_t::twip, length_unit_t::point);
+ test::verify_value_to_decimals(__FILE__, __LINE__, check.width, pt, check.decimals);
+ }
+
+ std::vector<rh_check> rh_checks =
+ {
+ { 2, 20.0, 0 },
+ { 3, 30.0, 0 },
+ { 4, 40.0, 0 },
+ { 5, 50.0, 0 },
+ { 7, 25.0, 0 },
+ { 8, 25.0, 0 },
+ { 9, 25.0, 0 },
+ { 12, 35.0, 0 },
+ { 13, 35.0, 0 },
+ };
+
+ for (const rh_check& check : rh_checks)
+ {
+ spreadsheet::row_height_t rh = sheet->get_row_height(check.row, nullptr, nullptr);
+ double pt = convert(rh, length_unit_t::twip, length_unit_t::point);
+ test::verify_value_to_decimals(__FILE__, __LINE__, check.height, pt, check.decimals);
+ }
+ }
+
+ {
+ // Sheet2
+ const spreadsheet::sheet* sheet = doc->get_sheet(1);
+ assert(sheet);
+
+ std::vector<cw_check> cw_checks =
+ {
+ { 1, 119.25, 2 },
+ { 3, 234.75, 2 },
+ };
+
+ for (const cw_check& check : cw_checks)
+ {
+ spreadsheet::col_width_t cw = sheet->get_col_width(check.col, nullptr, nullptr);
+ double pt = convert(cw, length_unit_t::twip, length_unit_t::point);
+ test::verify_value_to_decimals(__FILE__, __LINE__, check.width, pt, check.decimals);
+ }
+
+ std::vector<rh_check> rh_checks =
+ {
+ { 2, 40.0, 0 },
+ { 4, 60.0, 0 },
+ };
+
+ for (const rh_check& check : rh_checks)
+ {
+ spreadsheet::row_height_t rh = sheet->get_row_height(check.row, nullptr, nullptr);
+ double pt = convert(rh, length_unit_t::twip, length_unit_t::point);
+ test::verify_value_to_decimals(__FILE__, __LINE__, check.height, pt, check.decimals);
+ }
+ }
+}
+
+void test_xls_xml_background_fill()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ auto doc = load_doc_from_filepath(SRCDIR"/test/xls-xml/background-color/standard.xml");
+
+ spreadsheet::styles& styles = doc->get_styles();
+
+ spreadsheet::sheet* sh = doc->get_sheet(0);
+ assert(sh);
+
+ struct check
+ {
+ spreadsheet::row_t row;
+ spreadsheet::col_t col;
+ spreadsheet::fill_pattern_t pattern_type;
+ spreadsheet::color_t fg_color;
+ };
+
+ std::vector<check> checks =
+ {
+ { 1, 0, spreadsheet::fill_pattern_t::solid, { 255, 192, 0, 0 } }, // A2 - dark red
+ { 2, 0, spreadsheet::fill_pattern_t::solid, { 255, 255, 0, 0 } }, // A3 - red
+ { 3, 0, spreadsheet::fill_pattern_t::solid, { 255, 255, 192, 0 } }, // A4 - orange
+ { 4, 0, spreadsheet::fill_pattern_t::solid, { 255, 255, 255, 0 } }, // A5 - yellow
+ { 5, 0, spreadsheet::fill_pattern_t::solid, { 255, 146, 208, 80 } }, // A6 - light green
+ { 6, 0, spreadsheet::fill_pattern_t::solid, { 255, 0, 176, 80 } }, // A7 - green
+ { 7, 0, spreadsheet::fill_pattern_t::solid, { 255, 0, 176, 240 } }, // A8 - light blue
+ { 8, 0, spreadsheet::fill_pattern_t::solid, { 255, 0, 112, 192 } }, // A9 - blue
+ { 9, 0, spreadsheet::fill_pattern_t::solid, { 255, 0, 32, 96 } }, // A10 - dark blue
+ { 10, 0, spreadsheet::fill_pattern_t::solid, { 255, 112, 48, 160 } }, // A11 - purple
+ };
+
+ spreadsheet::color_t color_white(255, 255, 255, 255);
+
+ for (const check& c : checks)
+ {
+ size_t xf = sh->get_cell_format(c.row, c.col);
+
+ const spreadsheet::cell_format_t* cf = styles.get_cell_format(xf);
+ assert(cf);
+
+ const spreadsheet::fill_t* fill_data = styles.get_fill(cf->fill);
+ assert(fill_data);
+ assert(fill_data->pattern_type == c.pattern_type);
+ assert(fill_data->fg_color == c.fg_color);
+
+ // The font colors are all white in the colored cells.
+ const spreadsheet::font_t* font_data = styles.get_font(cf->font);
+ assert(font_data);
+
+ assert(font_data->color == color_white);
+ }
+}
+
+void test_xls_xml_named_colors()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ constexpr std::string_view paths[] = {
+ SRCDIR"/test/xls-xml/named-colors/input.xml",
+ SRCDIR"/test/xls-xml/named-colors/input-upper.xml"
+ };
+
+ for (auto path : paths)
+ {
+ std::cout << path << std::endl;
+ std::unique_ptr<spreadsheet::document> doc = load_doc_from_filepath(std::string{path});
+
+ spreadsheet::styles& styles = doc->get_styles();
+ const ixion::model_context& model = doc->get_model_context();
+
+ spreadsheet::sheet* sh = doc->get_sheet(0);
+ assert(sh);
+
+ for (ss::row_t row = 1; row < 141; ++row)
+ {
+ // Column B stores the expected RGB value in hex.
+ size_t sid = model.get_string_identifier(ixion::abs_address_t(sh->get_index(), row, 1));
+ const std::string* s = model.get_string(sid);
+ assert(s);
+ spreadsheet::color_rgb_t expected = spreadsheet::to_color_rgb(*s);
+
+ size_t xf = sh->get_cell_format(row, 0);
+ const ss::fill_t* fill_data = styles.get_fill(xf);
+ assert(fill_data->fg_color);
+ const ss::color_t& actual = *fill_data->fg_color;
+ assert(expected.red == actual.red);
+ assert(expected.green == actual.green);
+ assert(expected.blue == actual.blue);
+ }
+ }
+}
+
+void test_xls_xml_text_alignment()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ auto doc = load_doc_from_filepath(SRCDIR"/test/xls-xml/text-alignment/input.xml");
+
+ spreadsheet::styles& styles = doc->get_styles();
+
+ spreadsheet::sheet* sh = doc->get_sheet(0);
+ assert(sh);
+
+ struct check
+ {
+ spreadsheet::row_t row;
+ spreadsheet::col_t col;
+ bool apply_align;
+ spreadsheet::hor_alignment_t hor_align;
+ spreadsheet::ver_alignment_t ver_align;
+ };
+
+ std::vector<check> checks =
+ {
+ { 1, 2, true, spreadsheet::hor_alignment_t::unknown, spreadsheet::ver_alignment_t::bottom }, // C2
+ { 2, 2, true, spreadsheet::hor_alignment_t::left, spreadsheet::ver_alignment_t::bottom }, // C3
+ { 3, 2, true, spreadsheet::hor_alignment_t::center, spreadsheet::ver_alignment_t::bottom }, // C4
+ { 4, 2, true, spreadsheet::hor_alignment_t::right, spreadsheet::ver_alignment_t::bottom }, // C5
+ { 5, 2, true, spreadsheet::hor_alignment_t::left, spreadsheet::ver_alignment_t::bottom }, // C6
+ { 6, 2, true, spreadsheet::hor_alignment_t::left, spreadsheet::ver_alignment_t::bottom }, // C7
+ { 7, 2, true, spreadsheet::hor_alignment_t::right, spreadsheet::ver_alignment_t::bottom }, // C8
+ { 8, 2, true, spreadsheet::hor_alignment_t::right, spreadsheet::ver_alignment_t::bottom }, // C9
+ { 9, 2, true, spreadsheet::hor_alignment_t::unknown, spreadsheet::ver_alignment_t::middle }, // C10
+ { 10, 2, true, spreadsheet::hor_alignment_t::left, spreadsheet::ver_alignment_t::middle }, // C11
+ { 11, 2, true, spreadsheet::hor_alignment_t::center, spreadsheet::ver_alignment_t::middle }, // C12
+ { 12, 2, true, spreadsheet::hor_alignment_t::right, spreadsheet::ver_alignment_t::middle }, // C13
+ { 13, 2, true, spreadsheet::hor_alignment_t::left, spreadsheet::ver_alignment_t::middle }, // C14
+ { 14, 2, true, spreadsheet::hor_alignment_t::left, spreadsheet::ver_alignment_t::middle }, // C15
+ { 15, 2, true, spreadsheet::hor_alignment_t::right, spreadsheet::ver_alignment_t::middle }, // C16
+ { 16, 2, true, spreadsheet::hor_alignment_t::right, spreadsheet::ver_alignment_t::middle }, // C17
+ { 17, 2, true, spreadsheet::hor_alignment_t::unknown, spreadsheet::ver_alignment_t::top }, // C18
+ { 18, 2, true, spreadsheet::hor_alignment_t::left, spreadsheet::ver_alignment_t::top }, // C19
+ { 19, 2, true, spreadsheet::hor_alignment_t::center, spreadsheet::ver_alignment_t::top }, // C20
+ { 20, 2, true, spreadsheet::hor_alignment_t::right, spreadsheet::ver_alignment_t::top }, // C21
+ { 21, 2, true, spreadsheet::hor_alignment_t::left, spreadsheet::ver_alignment_t::top }, // C22
+ { 22, 2, true, spreadsheet::hor_alignment_t::left, spreadsheet::ver_alignment_t::top }, // C23
+ { 23, 2, true, spreadsheet::hor_alignment_t::right, spreadsheet::ver_alignment_t::top }, // C24
+ { 24, 2, true, spreadsheet::hor_alignment_t::right, spreadsheet::ver_alignment_t::top }, // C25
+ { 25, 2, true, spreadsheet::hor_alignment_t::unknown, spreadsheet::ver_alignment_t::justified }, // C26
+ { 26, 2, true, spreadsheet::hor_alignment_t::justified, spreadsheet::ver_alignment_t::bottom }, // C27
+ { 27, 2, true, spreadsheet::hor_alignment_t::distributed, spreadsheet::ver_alignment_t::distributed }, // C28
+ };
+
+ for (const check& c : checks)
+ {
+ std::cout << "row=" << c.row << "; col=" << c.col << std::endl;
+ size_t xf = sh->get_cell_format(c.row, c.col);
+
+ const spreadsheet::cell_format_t* cf = styles.get_cell_format(xf);
+ assert(cf);
+ assert(c.apply_align == cf->apply_alignment);
+
+ if (!cf->apply_alignment)
+ continue;
+
+ assert(c.hor_align == cf->hor_align);
+ assert(c.ver_align == cf->ver_align);
+ }
+}
+
+void test_xls_xml_cell_borders_single_cells()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ auto doc = load_doc_from_filepath(SRCDIR"/test/xls-xml/borders/single-cells.xml");
+
+ spreadsheet::styles& styles = doc->get_styles();
+
+ spreadsheet::sheet* sh = doc->get_sheet(0);
+ assert(sh);
+
+ struct check
+ {
+ spreadsheet::row_t row;
+ spreadsheet::col_t col;
+ spreadsheet::border_style_t style;
+ };
+
+ std::vector<check> checks =
+ {
+ { 3, 1, spreadsheet::border_style_t::hair },
+ { 5, 1, spreadsheet::border_style_t::dotted },
+ { 7, 1, spreadsheet::border_style_t::dash_dot_dot },
+ { 9, 1, spreadsheet::border_style_t::dash_dot },
+ { 11, 1, spreadsheet::border_style_t::dashed },
+ { 13, 1, spreadsheet::border_style_t::thin },
+ { 1, 3, spreadsheet::border_style_t::medium_dash_dot_dot },
+ { 3, 3, spreadsheet::border_style_t::slant_dash_dot },
+ { 5, 3, spreadsheet::border_style_t::medium_dash_dot },
+ { 7, 3, spreadsheet::border_style_t::medium_dashed },
+ { 9, 3, spreadsheet::border_style_t::medium },
+ { 11, 3, spreadsheet::border_style_t::thick },
+ { 13, 3, spreadsheet::border_style_t::double_border },
+ };
+
+ for (const check& c : checks)
+ {
+ std::cout << "(row: " << c.row << "; col: " << c.col << "; expected: " << int(c.style) << ")" << std::endl;
+ size_t xf = sh->get_cell_format(c.row, c.col);
+ const spreadsheet::cell_format_t* cf = styles.get_cell_format(xf);
+ assert(cf);
+ assert(cf->apply_border);
+
+ const spreadsheet::border_t* border = styles.get_border(cf->border);
+ assert(border);
+ assert(border->top.style == c.style);
+ assert(border->bottom.style == c.style);
+ assert(border->left.style == c.style);
+ assert(border->right.style == c.style);
+ }
+}
+
+void test_xls_xml_cell_borders_directions()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ auto doc = load_doc_from_filepath(SRCDIR"/test/xls-xml/borders/directions.xml");
+
+ spreadsheet::styles& styles = doc->get_styles();
+
+ spreadsheet::sheet* sh = doc->get_sheet(0);
+ assert(sh);
+
+ struct check
+ {
+ spreadsheet::row_t row;
+ spreadsheet::col_t col;
+ spreadsheet::border_direction_t dir;
+ };
+
+ std::vector<check> checks =
+ {
+ { 1, 1, ss::border_direction_t::top },
+ { 3, 1, ss::border_direction_t::left },
+ { 5, 1, ss::border_direction_t::right },
+ { 7, 1, ss::border_direction_t::bottom },
+ { 9, 1, ss::border_direction_t::diagonal_tl_br },
+ { 11, 1, ss::border_direction_t::diagonal_bl_tr },
+ { 13, 1, ss::border_direction_t::diagonal },
+ };
+
+ for (const check& c : checks)
+ {
+ size_t xf = sh->get_cell_format(c.row, c.col);
+ const ss::cell_format_t* cf = styles.get_cell_format(xf);
+ assert(cf);
+ assert(cf->apply_border);
+
+ const ss::border_t* border = styles.get_border(cf->border);
+ assert(border);
+
+ switch (c.dir)
+ {
+ case ss::border_direction_t::top:
+ assert(border->top.style);
+ assert(*border->top.style == ss::border_style_t::thin);
+ assert(!border->top.border_color);
+ assert(!border->top.border_width);
+ assert(!border->bottom.style);
+ assert(!border->bottom.border_color);
+ assert(!border->bottom.border_width);
+ assert(!border->left.style);
+ assert(!border->left.border_color);
+ assert(!border->left.border_width);
+ assert(!border->right.style);
+ assert(!border->right.border_color);
+ assert(!border->right.border_width);
+ assert(!border->diagonal.style);
+ assert(!border->diagonal.border_color);
+ assert(!border->diagonal.border_width);
+ assert(!border->diagonal_bl_tr.style);
+ assert(!border->diagonal_bl_tr.border_color);
+ assert(!border->diagonal_bl_tr.border_width);
+ assert(!border->diagonal_tl_br.style);
+ assert(!border->diagonal_tl_br.border_color);
+ assert(!border->diagonal_tl_br.border_width);
+ break;
+ case ss::border_direction_t::left:
+ assert(!border->top.style);
+ assert(!border->top.border_color);
+ assert(!border->top.border_width);
+ assert(!border->bottom.style);
+ assert(!border->bottom.border_color);
+ assert(!border->bottom.border_width);
+ assert(border->left.style);
+ assert(*border->left.style == ss::border_style_t::thin);
+ assert(!border->left.border_color);
+ assert(!border->left.border_width);
+ assert(!border->right.style);
+ assert(!border->right.border_color);
+ assert(!border->right.border_width);
+ assert(!border->diagonal.style);
+ assert(!border->diagonal.border_color);
+ assert(!border->diagonal.border_width);
+ assert(!border->diagonal_bl_tr.style);
+ assert(!border->diagonal_bl_tr.border_color);
+ assert(!border->diagonal_bl_tr.border_width);
+ assert(!border->diagonal_tl_br.style);
+ assert(!border->diagonal_tl_br.border_color);
+ assert(!border->diagonal_tl_br.border_width);
+ break;
+ case ss::border_direction_t::right:
+ assert(!border->top.style);
+ assert(!border->top.border_color);
+ assert(!border->top.border_width);
+ assert(!border->bottom.style);
+ assert(!border->bottom.border_color);
+ assert(!border->bottom.border_width);
+ assert(!border->left.style);
+ assert(!border->left.border_color);
+ assert(!border->left.border_width);
+ assert(border->right.style);
+ assert(*border->right.style == ss::border_style_t::thin);
+ assert(!border->right.border_color);
+ assert(!border->right.border_width);
+ assert(!border->diagonal.style);
+ assert(!border->diagonal.border_color);
+ assert(!border->diagonal.border_width);
+ assert(!border->diagonal_bl_tr.style);
+ assert(!border->diagonal_bl_tr.border_color);
+ assert(!border->diagonal_bl_tr.border_width);
+ assert(!border->diagonal_tl_br.style);
+ assert(!border->diagonal_tl_br.border_color);
+ assert(!border->diagonal_tl_br.border_width);
+ break;
+ case ss::border_direction_t::bottom:
+ assert(!border->top.style);
+ assert(!border->top.border_color);
+ assert(!border->top.border_width);
+ assert(border->bottom.style);
+ assert(*border->bottom.style == ss::border_style_t::thin);
+ assert(!border->bottom.border_color);
+ assert(!border->bottom.border_width);
+ assert(!border->left.style);
+ assert(!border->left.border_color);
+ assert(!border->left.border_width);
+ assert(!border->right.style);
+ assert(!border->right.border_color);
+ assert(!border->right.border_width);
+ assert(!border->diagonal.style);
+ assert(!border->diagonal.border_color);
+ assert(!border->diagonal.border_width);
+ assert(!border->diagonal_bl_tr.style);
+ assert(!border->diagonal_bl_tr.border_color);
+ assert(!border->diagonal_bl_tr.border_width);
+ assert(!border->diagonal_tl_br.style);
+ assert(!border->diagonal_tl_br.border_color);
+ assert(!border->diagonal_tl_br.border_width);
+ break;
+ case spreadsheet::border_direction_t::diagonal:
+ assert(!border->top.style);
+ assert(!border->top.border_color);
+ assert(!border->top.border_width);
+ assert(!border->bottom.style);
+ assert(!border->bottom.border_color);
+ assert(!border->bottom.border_width);
+ assert(!border->left.style);
+ assert(!border->left.border_color);
+ assert(!border->left.border_width);
+ assert(!border->right.style);
+ assert(!border->right.border_color);
+ assert(!border->right.border_width);
+ assert(!border->diagonal.style);
+ assert(!border->diagonal.border_color);
+ assert(!border->diagonal.border_width);
+ assert(border->diagonal_bl_tr.style);
+ assert(*border->diagonal_bl_tr.style == ss::border_style_t::thin);
+ assert(!border->diagonal_bl_tr.border_color);
+ assert(!border->diagonal_bl_tr.border_width);
+ assert(border->diagonal_tl_br.style);
+ assert(*border->diagonal_tl_br.style == ss::border_style_t::thin);
+ assert(!border->diagonal_tl_br.border_color);
+ assert(!border->diagonal_tl_br.border_width);
+ break;
+ case spreadsheet::border_direction_t::diagonal_tl_br:
+ assert(!border->top.style);
+ assert(!border->top.border_color);
+ assert(!border->top.border_width);
+ assert(!border->bottom.style);
+ assert(!border->bottom.border_color);
+ assert(!border->bottom.border_width);
+ assert(!border->left.style);
+ assert(!border->left.border_color);
+ assert(!border->left.border_width);
+ assert(!border->right.style);
+ assert(!border->right.border_color);
+ assert(!border->right.border_width);
+ assert(!border->diagonal.style);
+ assert(!border->diagonal.border_color);
+ assert(!border->diagonal.border_width);
+ assert(!border->diagonal_bl_tr.style);
+ assert(!border->diagonal_bl_tr.border_color);
+ assert(!border->diagonal_bl_tr.border_width);
+ assert(border->diagonal_tl_br.style);
+ assert(*border->diagonal_tl_br.style == ss::border_style_t::thin);
+ assert(!border->diagonal_tl_br.border_color);
+ assert(!border->diagonal_tl_br.border_width);
+ break;
+ case spreadsheet::border_direction_t::diagonal_bl_tr:
+ assert(!border->top.style);
+ assert(!border->top.border_color);
+ assert(!border->top.border_width);
+ assert(!border->bottom.style);
+ assert(!border->bottom.border_color);
+ assert(!border->bottom.border_width);
+ assert(!border->left.style);
+ assert(!border->left.border_color);
+ assert(!border->left.border_width);
+ assert(!border->right.style);
+ assert(!border->right.border_color);
+ assert(!border->right.border_width);
+ assert(!border->diagonal.style);
+ assert(!border->diagonal.border_color);
+ assert(!border->diagonal.border_width);
+ assert(border->diagonal_bl_tr.style);
+ assert(*border->diagonal_bl_tr.style == ss::border_style_t::thin);
+ assert(!border->diagonal_bl_tr.border_color);
+ assert(!border->diagonal_bl_tr.border_width);
+ assert(!border->diagonal_tl_br.style);
+ assert(!border->diagonal_tl_br.border_color);
+ assert(!border->diagonal_tl_br.border_width);
+ break;
+ default:
+ assert(!"unhandled direction!");
+ }
+ }
+}
+
+void test_xls_xml_cell_borders_colors()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ using spreadsheet::color_t;
+ using spreadsheet::border_style_t;
+
+ auto doc = load_doc_from_filepath(SRCDIR"/test/xls-xml/borders/colors.xml");
+
+ spreadsheet::styles& styles = doc->get_styles();
+
+ spreadsheet::sheet* sh = doc->get_sheet(0);
+ assert(sh);
+
+ struct check
+ {
+ spreadsheet::row_t row;
+ spreadsheet::col_t col;
+ color_t color;
+ };
+
+ std::vector<check> checks =
+ {
+ { 2, 1, color_t(0xFF, 0xFF, 0, 0) }, // B3 - red
+ { 3, 1, color_t(0xFF, 0, 0x70, 0xC0) }, // B4 - blue
+ { 4, 1, color_t(0xFF, 0, 0xB0, 0x50) }, // B5 - green
+ };
+
+ for (const check& c : checks)
+ {
+ size_t xf = sh->get_cell_format(c.row, c.col); // B3
+
+ const spreadsheet::cell_format_t* cf = styles.get_cell_format(xf);
+ assert(cf);
+ assert(cf->apply_border);
+
+ const spreadsheet::border_t* border = styles.get_border(cf->border);
+ assert(border);
+
+ assert(!border->left.style);
+ assert(border->right.style);
+ assert(*border->right.style == border_style_t::thick);
+ assert(!border->top.style);
+ assert(!border->bottom.style);
+
+ assert(border->right.border_color == c.color);
+ }
+
+ // B7 contains yellow left border, purple right border, and light blue
+ // diagonal borders.
+
+ size_t xf = sh->get_cell_format(6, 1); // B7
+
+ const spreadsheet::cell_format_t* cf = styles.get_cell_format(xf);
+ assert(cf);
+ assert(cf->apply_border);
+
+ const spreadsheet::border_t* border = styles.get_border(cf->border);
+ assert(border);
+
+ assert(border->left.style == border_style_t::thick);
+ assert(border->left.border_color == color_t(0xFF, 0xFF, 0xFF, 0)); // yellow
+
+ assert(border->right.style == border_style_t::thick);
+ assert(border->right.border_color == color_t(0xFF, 0x70, 0x30, 0xA0)); // purple
+
+ assert(border->diagonal_bl_tr.style == border_style_t::thick);
+ assert(border->diagonal_bl_tr.border_color == color_t(0xFF, 0x00, 0xB0, 0xF0)); // light blue
+
+ assert(border->diagonal_tl_br.style == border_style_t::thick);
+ assert(border->diagonal_tl_br.border_color == color_t(0xFF, 0x00, 0xB0, 0xF0)); // light blue
+
+ // B7 also contains multi-line string. Test that as well.
+ ixion::model_context& model = doc->get_model_context();
+ ixion::string_id_t sid = model.get_string_identifier(ixion::abs_address_t(0,6,1));
+ const std::string* s = model.get_string(sid);
+ assert(s);
+ assert(*s == "<- Yellow\nPurple ->\nLight Blue \\");
+}
+
+void test_xls_xml_hidden_rows_columns()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ auto doc = load_doc_from_filepath(SRCDIR"/test/xls-xml/hidden-rows-columns/input.xml");
+
+ spreadsheet::sheet* sh = doc->get_sheet("Hidden Rows");
+ assert(sh);
+
+ spreadsheet::row_t row_start = -1, row_end = -1;
+
+ // Row 1 is visible.
+ assert(!sh->is_row_hidden(0, &row_start, &row_end));
+ assert(row_start == 0);
+ assert(row_end == 1); // the end position is non-inclusive.
+
+ // Rows 2-3 are hidden.
+ assert(sh->is_row_hidden(1, &row_start, &row_end));
+ assert(row_start == 1);
+ assert(row_end == 3); // the end position is non-inclusive.
+
+ // Row 4 is visible.
+ assert(!sh->is_row_hidden(3, &row_start, &row_end));
+ assert(row_start == 3);
+ assert(row_end == 4); // the end position is non-inclusive.
+
+ // Row 5 is hidden.
+ assert(sh->is_row_hidden(4, &row_start, &row_end));
+ assert(row_start == 4);
+ assert(row_end == 5); // the end position is non-inclusive.
+
+ // Rows 6-8 are visible.
+ assert(!sh->is_row_hidden(5, &row_start, &row_end));
+ assert(row_start == 5);
+ assert(row_end == 8); // the end position is non-inclusive.
+
+ // Row 9 is hidden.
+ assert(sh->is_row_hidden(8, &row_start, &row_end));
+ assert(row_start == 8);
+ assert(row_end == 9); // the end position is non-inclusive.
+
+ // The rest of the rows are visible.
+ assert(!sh->is_row_hidden(9, &row_start, &row_end));
+ assert(row_start == 9);
+ assert(row_end == doc->get_sheet_size().rows); // the end position is non-inclusive.
+
+ sh = doc->get_sheet("Hidden Columns");
+ assert(sh);
+
+ spreadsheet::col_t col_start = -1, col_end = -1;
+
+ // Columns A-B are visible.
+ assert(!sh->is_col_hidden(0, &col_start, &col_end));
+ assert(col_start == 0);
+ assert(col_end == 2); // non-inclusive
+
+ // Columns C-E are hidden.
+ assert(sh->is_col_hidden(2, &col_start, &col_end));
+ assert(col_start == 2);
+ assert(col_end == 6); // non-inclusive
+
+ // Columns G-J are visible.
+ assert(!sh->is_col_hidden(6, &col_start, &col_end));
+ assert(col_start == 6);
+ assert(col_end == 10); // non-inclusive
+
+ // Column K is hidden.
+ assert(sh->is_col_hidden(10, &col_start, &col_end));
+ assert(col_start == 10);
+ assert(col_end == 11); // non-inclusive
+
+ // The rest of the columns are all visible.
+ assert(!sh->is_col_hidden(11, &col_start, &col_end));
+ assert(col_start == 11);
+ assert(col_end == doc->get_sheet_size().columns); // non-inclusive
+}
+
+void test_xls_xml_character_set()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ doc_loader loader(SRCDIR"/test/xls-xml/character-set/input.xml");
+ assert(loader.get_factory().get_character_set() == character_set_t::windows_1252);
+}
+
+void test_xls_xml_number_format()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ doc_loader loader(SRCDIR"/test/xls-xml/number-format/date-time.xml");
+
+ const spreadsheet::document& doc = loader.get_doc();
+ const spreadsheet::styles& styles = doc.get_styles();
+
+ const spreadsheet::sheet* sh = doc.get_sheet(0);
+ assert(sh);
+
+ struct check
+ {
+ ss::row_t row;
+ ss::col_t col;
+ std::string_view expected;
+ };
+
+ std::vector<check> checks =
+ {
+ { 1, 1, "[$-F800]dddd\\,\\ mmmm\\ dd\\,\\ yyyy" },
+ { 2, 1, "[ENG][$-409]mmmm\\ d\\,\\ yyyy;@" },
+ { 3, 1, "m/d/yy;@" },
+ { 4, 1, "m/d/yyyy h:mm" }, // General Date
+ { 5, 1, "d-mmm-yy" }, // Medium Date
+ { 6, 1, "m/d/yyyy" }, // Short Date
+ { 7, 1, "h:mm:ss AM/PM" }, // Long Time
+ { 8, 1, "h:mm AM/PM" }, // Medium Time
+ { 9, 1, "h:mm" }, // Short Time
+ { 10, 1, "0.00" }, // Fixed
+ { 11, 1, "#,##0.00" }, // Standard
+ { 12, 1, "0.00%" }, // Percent
+ { 13, 1, "0.00E+00" }, // Scientific
+ { 14, 1, "\"Yes\";\"Yes\";\"No\"" }, // Yes/No
+ { 15, 1, "\"True\";\"True\";\"False\"" }, // True/False
+ { 16, 1, "\"On\";\"On\";\"Off\"" }, // On/Off
+ { 17, 1, "$#,##0.00_);[Red]($#,##0.00)" }, // Currency
+ { 18, 1, "[$\xe2\x82\xac-x-euro2] #,##0.00_);[Red]([$\xe2\x82\xac-x-euro2] #,##0.00)" }, // Euro Currency
+ };
+
+ for (const check& c : checks)
+ {
+ size_t xf = sh->get_cell_format(c.row, c.col);
+ const spreadsheet::cell_format_t* cf = styles.get_cell_format(xf);
+ assert(cf);
+
+ const spreadsheet::number_format_t* nf = styles.get_number_format(cf->number_format);
+ assert(nf);
+ assert(nf->format_string == c.expected);
+ }
+}
+
+void test_xls_xml_cell_properties_wrap_and_shrink()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ auto doc = load_doc_from_filepath(SRCDIR"/test/xls-xml/cell-properties/wrap-and-shrink.xml");
+
+ const ss::styles& styles = doc->get_styles();
+ const ss::sheet* sh = doc->get_sheet(0);
+ assert(sh);
+
+ std::size_t xfid = sh->get_cell_format(0, 1); // B1
+ const ss::cell_format_t* xf = styles.get_cell_format(xfid);
+ assert(xf);
+ assert(xf->wrap_text);
+ assert(!*xf->wrap_text);
+ assert(xf->shrink_to_fit);
+ assert(!*xf->shrink_to_fit);
+
+ xfid = sh->get_cell_format(1, 1); // B2
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+ assert(xf->wrap_text);
+ assert(*xf->wrap_text);
+ assert(xf->shrink_to_fit);
+ assert(!*xf->shrink_to_fit);
+
+ xfid = sh->get_cell_format(2, 1); // B3
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+ assert(xf->wrap_text);
+ assert(!*xf->wrap_text);
+ assert(xf->shrink_to_fit);
+ assert(*xf->shrink_to_fit);
+}
+
+void test_xls_xml_cell_properties_default_style()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ auto doc = load_doc_from_filepath(SRCDIR"/test/xls-xml/cell-properties/default-style.xml");
+
+ const ss::color_t black{255, 0, 0, 0};
+
+ const ss::styles& styles = doc->get_styles();
+ const ss::sheet* sh = doc->get_sheet(0);
+ assert(sh);
+
+ std::size_t xfid_default = sh->get_cell_format(0, 0); // A1
+ const ss::cell_format_t* xf = styles.get_cell_format(xfid_default);
+ assert(xf);
+
+ // alignments
+ assert(xf->hor_align == ss::hor_alignment_t::center);
+ assert(xf->ver_align == ss::ver_alignment_t::bottom);
+
+ // font
+ const ss::font_t* font_style = styles.get_font(xf->font);
+ assert(font_style);
+ assert(font_style->name == "DejaVu Sans");
+ assert(font_style->size == 12.0);
+ assert(font_style->color == black);
+
+ // fill
+ const ss::fill_t* fill_style = styles.get_fill(xf->fill);
+ assert(fill_style);
+ assert(fill_style->pattern_type == ss::fill_pattern_t::solid);
+ const ss::color_t fill_color_fg{255, 0xE2, 0xEF, 0xDA};
+ assert(fill_style->fg_color == fill_color_fg);
+
+ // border
+ const ss::border_t* border_style = styles.get_border(xf->border);
+ assert(border_style);
+
+ assert(border_style->bottom.style == ss::border_style_t::dotted);
+
+ // number format
+ const ss::number_format_t* numfmt = styles.get_number_format(xf->number_format);
+ assert(numfmt);
+ assert(numfmt->format_string == "0.0000");
+
+ // protection
+ const ss::protection_t* prot = styles.get_protection(xf->protection);
+ assert(prot);
+ assert(prot->formula_hidden);
+
+ // A1:G6 should all use the default cell style.
+ for (ss::row_t row = 0; row <= 5; ++row)
+ {
+ for (ss::col_t col = 0; col <= 6; ++col)
+ {
+ assert(sh->get_cell_format(row, col) == xfid_default);
+ }
+ }
+}
+
+void test_xls_xml_cell_properties_locked_and_hidden()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ auto doc = load_doc_from_filepath(SRCDIR"/test/xls-xml/cell-properties/locked-and-hidden.xml");
+ const ixion::model_context& model = doc->get_model_context();
+
+ const ss::sheet* sh = doc->get_sheet(0);
+ assert(sh);
+
+ {
+ // Check cell string values first.
+
+ struct check_type
+ {
+ ixion::abs_address_t address;
+ std::string_view str;
+ };
+
+ const check_type checks[] = {
+ // sheet, row, column, expected cell string value
+ { { 0, 0, 0 }, "Default (Should be locked but not hidden)" },
+ { { 0, 0, 1 }, "Not Locked and not hidden" },
+ { { 0, 1, 0 }, "Locked and hidden" },
+ { { 0, 1, 1 }, "Not locked and hidden" },
+ };
+
+ for (const auto& c : checks)
+ {
+ ixion::string_id_t sid = model.get_string_identifier(c.address);
+ const std::string* s = model.get_string(sid);
+ assert(s);
+ assert(*s == c.str);
+ }
+ }
+
+ {
+ // Check the cell protection attributes.
+
+ struct check_type
+ {
+ ss::row_t row;
+ ss::col_t col;
+ bool locked;
+ bool formula_hidden;
+ };
+
+ const check_type checks[] = {
+ // row, column, locked, formula-hidden
+ { 0, 0, true, false },
+ { 0, 1, false, false },
+ { 1, 0, true, true },
+ { 1, 1, false, true },
+ };
+
+ const ss::styles& styles = doc->get_styles();
+
+ for (const auto& c : checks)
+ {
+ std::cout << "row=" << c.row << "; col=" << c.col << std::endl;
+
+ std::size_t xfid = sh->get_cell_format(c.row, c.col);
+ const ss::cell_format_t* xf = styles.get_cell_format(xfid);
+ assert(xf);
+
+ const ss::protection_t* prot = styles.get_protection(xf->protection);
+ assert(prot);
+ assert(prot->locked);
+ assert(prot->formula_hidden);
+ std::cout << " * locked: expected=" << c.locked << "; actual=" << *prot->locked << std::endl;
+ assert(*prot->locked == c.locked);
+ std::cout << " * formula-hidden: expected=" << c.formula_hidden << "; actual=" << *prot->formula_hidden << std::endl;
+ assert(*prot->formula_hidden == c.formula_hidden);
+ }
+ }
+}
+
+void test_xls_xml_styles_direct_format()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ std::string path{SRCDIR"/test/xls-xml/styles/direct-format.xml"};
+ auto doc = load_doc_from_filepath(path, false, ss::formula_error_policy_t::fail);
+ assert(doc);
+
+ const auto& model = doc->get_model_context();
+
+ {
+ // Check cell string values first.
+
+ struct check_type
+ {
+ ixion::abs_address_t address;
+ std::string_view str;
+ };
+
+ const check_type checks[] = {
+ // sheet, row, column, expected cell string value
+ { { 0, 1, 1 }, "Bold and underlined" },
+ { { 0, 3, 1 }, "Yellow background\nand\nright aligned" },
+ { { 0, 5, 3 }, "Named Format (Good)" },
+ { { 0, 7, 3 }, "Named Format (Good) plus direct format on top" },
+ };
+
+ for (const auto& c : checks)
+ {
+ ixion::string_id_t sid = model.get_string_identifier(c.address);
+ const std::string* s = model.get_string(sid);
+ assert(s);
+ assert(*s == c.str);
+ }
+ }
+
+ const ss::sheet* sh = doc->get_sheet(0);
+ assert(sh);
+
+ const ss::styles& styles = doc->get_styles();
+
+ // Text in B2 is bold, underlined, and horizontally and vertically centered.
+ auto xfid = sh->get_cell_format(1, 1);
+ const ss::cell_format_t* xf = styles.get_cell_format(xfid);
+ assert(xf);
+
+ const ss::font_t* font = styles.get_font(xf->font);
+ assert(font);
+ assert(font->bold);
+ assert(*font->bold);
+
+ const auto* border = styles.get_border(xf->border);
+ assert(border);
+
+ // "Continuous" with a weight of 1 is mapped to 'thin' border style.
+ assert(border->bottom.style);
+ assert(*border->bottom.style == ss::border_style_t::thin);
+
+ assert(xf->hor_align == ss::hor_alignment_t::center);
+ assert(xf->ver_align == ss::ver_alignment_t::middle);
+
+ // B4 has yellow background, has "Calibri" font at 14 pt etc
+ xfid = sh->get_cell_format(3, 1);
+
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+
+ font = styles.get_font(xf->font);
+ assert(font);
+ assert(font->name);
+ assert(*font->name == "Calibri");
+ assert(font->size);
+ assert(*font->size == 14.0);
+ assert(font->color);
+ assert(*font->color == ss::color_t(0xFF, 0x37, 0x56, 0x23));
+
+ // B4 has yellow background
+ const ss::fill_t* fill = styles.get_fill(xf->fill);
+ assert(fill);
+ assert(fill->pattern_type);
+ assert(*fill->pattern_type == ss::fill_pattern_t::solid);
+ assert(fill->fg_color);
+ assert(*fill->fg_color == ss::color_t(0xFF, 0xFF, 0xFF, 0x00));
+
+ // B4 is horizontally right-aligned and vertically bottom-aligned
+ assert(xf->hor_align == ss::hor_alignment_t::right);
+ assert(xf->ver_align == ss::ver_alignment_t::bottom);
+
+ // B4 has wrap text on
+ assert(xf->wrap_text && *xf->wrap_text);
+
+ // D6 only uses "Good" named cell style with no direct formatting
+ xfid = sh->get_cell_format(5, 3);
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+
+ const auto xfid_style_good = xf->style_xf;
+ const ss::cell_style_t* xstyle = styles.get_cell_style_by_xf(xf->style_xf);
+ assert(xstyle);
+ assert(xstyle->name == "Good");
+
+ // Check the format detail of the "Good" style
+ xf = styles.get_cell_style_format(xstyle->xf);
+ assert(xf);
+
+ font = styles.get_font(xf->font);
+ assert(font);
+ assert(font->name);
+ assert(*font->name == "Calibri");
+ assert(font->size);
+ assert(*font->size == 11.0);
+ assert(font->color);
+ assert(*font->color == ss::color_t(0xFF, 0x00, 0x61, 0x00));
+
+ fill = styles.get_fill(xf->fill);
+ assert(fill);
+ assert(fill->pattern_type);
+ assert(*fill->pattern_type == ss::fill_pattern_t::solid);
+ assert(fill->fg_color);
+ assert(*fill->fg_color == ss::color_t(0xFF, 0xC6, 0xEF, 0xCE));
+
+ // D8 has some direct formats applied on top of "Good" named style
+ xfid = sh->get_cell_format(7, 3);
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+
+ // Make sure it has the "Good" style as its basis
+ assert(xf->style_xf == xfid_style_good);
+ xstyle = styles.get_cell_style_by_xf(xf->style_xf);
+ assert(xstyle);
+ assert(xstyle->name == "Good");
+
+ // Format directly applied to D8 on top of "Good" style
+ assert(xf->hor_align == ss::hor_alignment_t::center);
+ assert(xf->ver_align == ss::ver_alignment_t::bottom);
+ assert(xf->wrap_text);
+ assert(*xf->wrap_text);
+ font = styles.get_font(xf->font);
+ assert(font);
+ assert(font->bold);
+ assert(*font->bold);
+}
+
+void test_xls_xml_styles_column_styles()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ std::string path{SRCDIR"/test/xls-xml/styles/column-styles.xml"};
+ auto doc = load_doc_from_filepath(path, false, ss::formula_error_policy_t::fail);
+ assert(doc);
+ auto doc_size = doc->get_sheet_size();
+
+ const ss::styles& styles = doc->get_styles();
+
+ const ss::sheet* sh = doc->get_sheet(0);
+ assert(sh);
+
+ {
+ // On Sheet1, check the named styles applied on columns B:D and F.
+ // Columns A and E should have Normal style applied.
+ const std::tuple<ss::row_t, ss::col_t, std::string> checks[] = {
+ { 0, 0, "Normal" },
+ { 0, 1, "Bad" },
+ { 0, 2, "Good" },
+ { 0, 3, "Neutral" },
+ { 0, 4, "Normal" },
+ { 0, 5, "Note" },
+ { doc_size.rows - 1, 0, "Normal" },
+ { doc_size.rows - 1, 1, "Bad" },
+ { doc_size.rows - 1, 2, "Good" },
+ { doc_size.rows - 1, 3, "Neutral" },
+ { doc_size.rows - 1, 4, "Normal" },
+ { doc_size.rows - 1, 5, "Note" },
+ };
+
+ for (const auto& check : checks)
+ {
+ ss::row_t r = std::get<0>(check);
+ ss::col_t c = std::get<1>(check);
+ std::string_view name = std::get<2>(check);
+
+ std::size_t xfid = sh->get_cell_format(r, c);
+ std::cout << "row=" << r << "; column=" << c << "; xfid=" << xfid << std::endl;
+ const ss::cell_format_t* xf = styles.get_cell_format(xfid);
+ assert(xf);
+ std::cout << "style xfid=" << xf->style_xf << std::endl;
+
+ const ss::cell_style_t* xstyle = styles.get_cell_style_by_xf(xf->style_xf);
+ assert(xstyle);
+ if (xstyle->name != name)
+ std::cout << "names differ! (expected=" << name << "; actual=" << xstyle->name << ")" << std::endl;
+
+ assert(xstyle->name == name);
+ }
+ }
+
+ {
+ // Row 10 has green background, and row 11 has orange background.
+ const std::tuple<ss::row_t, ss::color_t> checks[] = {
+ { 9, {0xFF, 0x92, 0xD0, 0x50} },
+ { 10, {0xFF, 0xFF, 0xC0, 0x00} },
+ };
+
+ for (const auto& check : checks)
+ {
+ const ss::row_t row = std::get<0>(check);
+ const ss::color_t color = std::get<1>(check);
+
+ for (ss::col_t col = 0; col <= 6; ++col)
+ {
+ std::size_t xfid = sh->get_cell_format(row, col);
+ std::cout << "row=" << row << "; column=" << col << "; xfid=" << xfid << std::endl;
+ const ss::cell_format_t* xf = styles.get_cell_format(xfid);
+ assert(xf);
+
+ const ss::fill_t* fill = styles.get_fill(xf->fill);
+ assert(fill);
+
+ assert(fill->pattern_type);
+ assert(*fill->pattern_type == ss::fill_pattern_t::solid);
+
+ assert(fill->fg_color);
+ assert(*fill->fg_color == color);
+ }
+ }
+ }
+
+ sh = doc->get_sheet(1);
+ assert(sh);
+
+ // Columns B:D should have "Good" named style applied.
+ {
+ const std::pair<ss::row_t, ss::col_t> cells[] = {
+ { 0, 1 },
+ { 0, 3 },
+ { doc_size.rows - 1, 1 },
+ { doc_size.rows - 1, 3 },
+ };
+
+ for (const auto& cell : cells)
+ {
+ std::size_t xfid = sh->get_cell_format(cell.first, cell.second);
+ const ss::cell_format_t* xf = styles.get_cell_format(xfid);
+ assert(xf);
+
+ const ss::cell_style_t* xstyle = styles.get_cell_style_by_xf(xf->style_xf);
+ assert(xstyle);
+ assert(xstyle->name == "Good");
+ }
+ }
+}
+
+void test_xls_xml_styles_data_offset()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ std::string path{SRCDIR"/test/xls-xml/styles/data-offset.xml"};
+ auto doc = load_doc_from_filepath(path, false, ss::formula_error_policy_t::fail);
+ assert(doc);
+
+ const ss::styles& styles = doc->get_styles();
+
+ const ss::sheet* sh = doc->get_sheet(0);
+ assert(sh);
+
+ auto check_font_style1 = [sh, &styles](ss::row_t row, ss::col_t col)
+ {
+ std::size_t xfid = sh->get_cell_format(row, col);
+ const ss::cell_format_t* xf = styles.get_cell_format(xfid);
+ assert(xf);
+
+ const ss::font_t* font = styles.get_font(xf->font);
+ assert(font);
+ assert(font->bold);
+ assert(font->color);
+ assert(*font->color == ss::color_t(0xFF, 0x00, 0x80, 0x00));
+ const ss::number_format_t* numfmt = styles.get_number_format(xf->number_format);
+ assert(numfmt);
+ assert(numfmt->format_string);
+ assert(*numfmt->format_string == "0.00_ ;[Red]\\-0.00\\ ");
+ };
+
+ auto check_font_style2 = [sh, &styles](ss::row_t row, ss::col_t col)
+ {
+ const ss::color_t red{0xFF, 0xFF, 0x00, 0x00};
+
+ std::size_t xfid = sh->get_cell_format(row, col);
+ const ss::cell_format_t* xf = styles.get_cell_format(xfid);
+ assert(xf);
+
+ const ss::font_t* font = styles.get_font(xf->font);
+ assert(font);
+ assert(font->color);
+ assert(*font->color == red);
+ };
+
+ auto check_font_style3 = [sh, &styles](ss::row_t row, ss::col_t col)
+ {
+ const ss::color_t blue{0xFF, 0x00, 0x00, 0xFF};
+
+ std::size_t xfid = sh->get_cell_format(row, col);
+ const ss::cell_format_t* xf = styles.get_cell_format(xfid);
+ assert(xf);
+
+ const ss::font_t* font = styles.get_font(xf->font);
+ assert(font);
+ assert(font->color);
+ assert(*font->color == blue);
+
+ const ss::number_format_t* numfmt = styles.get_number_format(xf->number_format);
+ assert(numfmt);
+ assert(numfmt->format_string);
+ assert(*numfmt->format_string == "yyyy/mm\\-dd;@");
+ };
+
+ // Column B and row 2 should have font with bold, green-ish with number format applied
+ check_font_style1(0, 1);
+ check_font_style1(1, 1);
+ check_font_style1(2, 1);
+ check_font_style1(3, 1);
+
+ // row 2
+ check_font_style1(1, 0);
+ check_font_style1(1, 1);
+ check_font_style1(1, 2);
+ check_font_style1(1, 3);
+
+ // Column C should have red font (except for row 2)
+ check_font_style2(0, 2);
+ check_font_style2(2, 2);
+ check_font_style2(3, 2);
+
+ // Column D should have blue font with custom number format applied (except for row 2)
+ check_font_style3(0, 3);
+ check_font_style3(2, 3);
+ check_font_style3(3, 3);
+}
+
+void test_xls_xml_view_cursor_per_sheet()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ std::string path(SRCDIR"/test/xls-xml/view/cursor-per-sheet.xml");
+
+ spreadsheet::range_size_t ss{1048576, 16384};
+ spreadsheet::document doc{ss};
+ spreadsheet::view view(doc);
+ spreadsheet::import_factory factory(doc, view);
+ orcus_xls_xml app(&factory);
+ app.set_config(test_config);
+
+ app.read_file(path.c_str());
+
+ // Sheet3 should be active.
+ assert(view.get_active_sheet() == 2);
+
+ const spreadsheet::sheet_view* sv = view.get_sheet_view(0);
+ assert(sv);
+
+ // NB : the resolver type is set to R1C1 for Excel XML 2003.
+ spreadsheet::iface::import_reference_resolver* resolver =
+ factory.get_reference_resolver(spreadsheet::formula_ref_context_t::global);
+ assert(resolver);
+
+ // On Sheet1, the cursor should be set to C4.
+ spreadsheet::range_t expected = to_rc_range(resolver->resolve_range("R4C3"));
+ spreadsheet::range_t actual = sv->get_selection(spreadsheet::sheet_pane_t::top_left);
+ assert(expected == actual);
+
+ sv = view.get_sheet_view(1);
+ assert(sv);
+
+ // On Sheet2, the cursor should be set to D8.
+ expected = to_rc_range(resolver->resolve_range("R8C4"));
+ actual = sv->get_selection(spreadsheet::sheet_pane_t::top_left);
+ assert(expected == actual);
+
+ sv = view.get_sheet_view(2);
+ assert(sv);
+
+ // On Sheet3, the cursor should be set to D2.
+ expected = to_rc_range(resolver->resolve_range("R2C4"));
+ actual = sv->get_selection(spreadsheet::sheet_pane_t::top_left);
+ assert(expected == actual);
+
+ sv = view.get_sheet_view(3);
+ assert(sv);
+
+ // On Sheet4, the cursor should be set to C5:E8.
+ expected = to_rc_range(resolver->resolve_range("R5C3:R8C5"));
+ actual = sv->get_selection(spreadsheet::sheet_pane_t::top_left);
+ assert(expected == actual);
+}
+
+struct expected_selection
+{
+ spreadsheet::sheet_pane_t pane;
+ std::string_view sel;
+};
+
+void test_xls_xml_view_cursor_split_pane()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ std::string path(SRCDIR"/test/xls-xml/view/cursor-split-pane.xml");
+
+ spreadsheet::range_size_t ss{1048576, 16384};
+ spreadsheet::document doc{ss};
+ spreadsheet::view view(doc);
+ spreadsheet::import_factory factory(doc, view);
+ orcus_xls_xml app(&factory);
+ app.set_config(test_config);
+
+ app.read_file(path.c_str());
+
+ // NB : the resolver type is set to R1C1 for Excel XML 2003.
+ spreadsheet::iface::import_reference_resolver* resolver =
+ factory.get_reference_resolver(spreadsheet::formula_ref_context_t::global);
+ assert(resolver);
+
+ // Sheet4 should be active.
+ assert(view.get_active_sheet() == 3);
+
+ const spreadsheet::sheet_view* sv = view.get_sheet_view(0);
+ assert(sv);
+
+ // On Sheet1, the view is split into 4.
+ assert(sv->get_active_pane() == spreadsheet::sheet_pane_t::bottom_left);
+ assert(sv->get_split_pane().hor_split == 5190.0);
+ assert(sv->get_split_pane().ver_split == 1800.0);
+
+ {
+ spreadsheet::address_t expected = to_rc_address(resolver->resolve_address("R6C6"));
+ spreadsheet::address_t actual = sv->get_split_pane().top_left_cell;
+ assert(expected == actual);
+ }
+
+ std::vector<expected_selection> expected_selections =
+ {
+ { spreadsheet::sheet_pane_t::top_left, "R4C5" },
+ { spreadsheet::sheet_pane_t::top_right, "R2C10" },
+ { spreadsheet::sheet_pane_t::bottom_left, "R8C1" },
+ { spreadsheet::sheet_pane_t::bottom_right, "R17C10" },
+ };
+
+ for (const expected_selection& es : expected_selections)
+ {
+ // cursor in the top-left pane.
+ spreadsheet::range_t expected = to_rc_range(resolver->resolve_range(es.sel));
+ spreadsheet::range_t actual = sv->get_selection(es.pane);
+ assert(expected == actual);
+ }
+
+ sv = view.get_sheet_view(1);
+ assert(sv);
+
+ // Sheet2 is also split into 4 views.
+ assert(sv->get_active_pane() == spreadsheet::sheet_pane_t::top_right);
+ assert(sv->get_split_pane().hor_split == 5190.0);
+ assert(sv->get_split_pane().ver_split == 2400.0);
+
+ {
+ spreadsheet::address_t expected = to_rc_address(resolver->resolve_address("R8C6"));
+ spreadsheet::address_t actual = sv->get_split_pane().top_left_cell;
+ assert(expected == actual);
+ }
+
+ expected_selections =
+ {
+ { spreadsheet::sheet_pane_t::top_left, "R2C3:R6C3" },
+ { spreadsheet::sheet_pane_t::top_right, "R2C8:R2C12" },
+ { spreadsheet::sheet_pane_t::bottom_left, "R18C2:R23C3" },
+ { spreadsheet::sheet_pane_t::bottom_right, "R11C8:R13C10" },
+ };
+
+ for (const expected_selection& es : expected_selections)
+ {
+ // cursor in the top-left pane.
+ spreadsheet::range_t expected = to_rc_range(resolver->resolve_range(es.sel));
+ spreadsheet::range_t actual = sv->get_selection(es.pane);
+ assert(expected == actual);
+ }
+
+ sv = view.get_sheet_view(2);
+ assert(sv);
+
+ // Sheet3 is horizontally split into top and bottom views (top-left and bottom-left).
+ assert(sv->get_active_pane() == spreadsheet::sheet_pane_t::bottom_left);
+ assert(sv->get_split_pane().hor_split == 0.0);
+ assert(sv->get_split_pane().ver_split == 1500.0);
+
+ {
+ spreadsheet::address_t expected = to_rc_address(resolver->resolve_address("R5C1"));
+ spreadsheet::address_t actual = sv->get_split_pane().top_left_cell;
+ assert(expected == actual);
+ }
+
+ expected_selections =
+ {
+ { spreadsheet::sheet_pane_t::top_left, "R2C4" },
+ { spreadsheet::sheet_pane_t::bottom_left, "R9C3" },
+ };
+
+ for (const expected_selection& es : expected_selections)
+ {
+ // cursor in the top-left pane.
+ spreadsheet::range_t expected = to_rc_range(resolver->resolve_range(es.sel));
+ spreadsheet::range_t actual = sv->get_selection(es.pane);
+ assert(expected == actual);
+ }
+
+ sv = view.get_sheet_view(3);
+ assert(sv);
+
+ // Sheet4 is vertically split into left and right views (top-left and top-right).
+ assert(sv->get_active_pane() == spreadsheet::sheet_pane_t::top_left);
+ assert(sv->get_split_pane().hor_split == 4230.0);
+ assert(sv->get_split_pane().ver_split == 0.0);
+
+ {
+ spreadsheet::address_t expected = to_rc_address(resolver->resolve_address("R1C5"));
+ spreadsheet::address_t actual = sv->get_split_pane().top_left_cell;
+ assert(expected == actual);
+ }
+
+ expected_selections =
+ {
+ { spreadsheet::sheet_pane_t::top_left, "R18C2" },
+ { spreadsheet::sheet_pane_t::top_right, "R11C9" },
+ };
+
+ for (const expected_selection& es : expected_selections)
+ {
+ // cursor in the top-left pane.
+ spreadsheet::range_t expected = to_rc_range(resolver->resolve_range(es.sel));
+ spreadsheet::range_t actual = sv->get_selection(es.pane);
+ assert(expected == actual);
+ }
+}
+
+void test_xls_xml_view_frozen_pane()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ std::string path(SRCDIR"/test/xls-xml/view/frozen-pane.xml");
+
+ spreadsheet::range_size_t ss{1048576, 16384};
+ spreadsheet::document doc{ss};
+ spreadsheet::view view(doc);
+ spreadsheet::import_factory factory(doc, view);
+ orcus_xls_xml app(&factory);
+ app.set_config(test_config);
+
+ app.read_file(path.c_str());
+
+ // NB : the resolver type is set to R1C1 for Excel XML 2003.
+ spreadsheet::iface::import_reference_resolver* resolver =
+ factory.get_reference_resolver(spreadsheet::formula_ref_context_t::global);
+ assert(resolver);
+
+ // Sheet3 should be active.
+ assert(view.get_active_sheet() == 2);
+
+ const spreadsheet::sheet_view* sv = view.get_sheet_view(0);
+ assert(sv);
+
+ {
+ // Sheet1 is vertically frozen between columns A and B.
+ const spreadsheet::frozen_pane_t& fp = sv->get_frozen_pane();
+ assert(fp.top_left_cell == to_rc_address(resolver->resolve_address("R1C2")));
+ assert(fp.visible_columns == 1);
+ assert(fp.visible_rows == 0);
+ assert(sv->get_active_pane() == spreadsheet::sheet_pane_t::top_right);
+ }
+
+ sv = view.get_sheet_view(1);
+ assert(sv);
+
+ {
+ // Sheet2 is horizontally frozen between rows 1 and 2.
+ const spreadsheet::frozen_pane_t& fp = sv->get_frozen_pane();
+ assert(fp.top_left_cell == to_rc_address(resolver->resolve_address("R2C1")));
+ assert(fp.visible_columns == 0);
+ assert(fp.visible_rows == 1);
+ assert(sv->get_active_pane() == spreadsheet::sheet_pane_t::bottom_left);
+ }
+
+ sv = view.get_sheet_view(2);
+ assert(sv);
+
+ {
+ // Sheet3 is frozen both horizontally and vertically.
+ const spreadsheet::frozen_pane_t& fp = sv->get_frozen_pane();
+ assert(fp.top_left_cell == to_rc_address(resolver->resolve_address("R9C5")));
+ assert(fp.visible_columns == 4);
+ assert(fp.visible_rows == 8);
+ assert(sv->get_active_pane() == spreadsheet::sheet_pane_t::bottom_right);
+ }
+}
+
+void test_xls_xml_skip_error_cells()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ std::string path(SRCDIR"/test/xls-xml/formula-cells-parse-error/input.xml");
+
+ try
+ {
+ auto doc = load_doc_from_filepath(path, false, ss::formula_error_policy_t::fail);
+ (void)doc;
+ assert(!"exception was expected, but was not thrown.");
+ }
+ catch (const std::exception&)
+ {
+ // works as expected
+ }
+
+ auto doc = load_doc_from_filepath(path, false, ss::formula_error_policy_t::skip);
+ const ixion::model_context& cxt = doc->get_model_context();
+
+ auto is_formula_cell_with_error = [&cxt](const ixion::abs_address_t& pos) -> bool
+ {
+ const ixion::formula_cell* fc = cxt.get_formula_cell(pos);
+ if (!fc)
+ return false;
+
+ const ixion::formula_tokens_t& tokens = fc->get_tokens()->get();
+ if (tokens.empty())
+ return false;
+
+ return tokens[0].opcode == ixion::fop_error;
+ };
+
+ // Make sure these two cells have been imported as formula cells with error.
+ assert(is_formula_cell_with_error(ixion::abs_address_t(0, 1, 1)));
+ assert(is_formula_cell_with_error(ixion::abs_address_t(0, 4, 0)));
+}
+
+/**
+ * The test input file starts with double BOM's.
+ */
+void test_xls_xml_double_bom()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ std::string path(SRCDIR"/test/xls-xml/double-bom/input.xml");
+
+ // Make sure the test file does contain double BOM's.
+ orcus::file_content content{path};
+ auto content_s = content.str();
+
+ constexpr std::string_view BOM = "\xef\xbb\xbf";
+ assert(content_s.substr(0, 3) == BOM);
+ assert(content_s.substr(3, 3) == BOM);
+
+ auto doc = load_doc_from_filepath(path, false, ss::formula_error_policy_t::fail);
+
+ assert(doc->get_sheet_count() == 5u);
+ assert(doc->get_sheet_name(0) == "Holdings");
+ assert(doc->get_sheet_name(1) == "Overview");
+ assert(doc->get_sheet_name(2) == "Historical");
+ assert(doc->get_sheet_name(3) == "Performance");
+ assert(doc->get_sheet_name(4) == "Distributions");
+}
+
+} // anonymous namespace
+
+int main()
+{
+ test_config.debug = false;
+ test_config.structure_check = true;
+
+ test_xls_xml_detection();
+ test_xls_xml_create_filter();
+ test_xls_xml_import();
+ test_xls_xml_merged_cells();
+ test_xls_xml_date_time();
+ test_xls_xml_bold_and_italic();
+ test_xls_xml_colored_text();
+ test_xls_xml_formatted_text_basic();
+ test_xls_xml_column_width_row_height();
+ test_xls_xml_background_fill();
+ test_xls_xml_named_colors();
+ test_xls_xml_text_alignment();
+ test_xls_xml_cell_borders_single_cells();
+ test_xls_xml_cell_borders_directions();
+ test_xls_xml_cell_borders_colors();
+ test_xls_xml_hidden_rows_columns();
+ test_xls_xml_character_set();
+ test_xls_xml_number_format();
+ test_xls_xml_cell_properties_wrap_and_shrink();
+ test_xls_xml_cell_properties_default_style();
+ test_xls_xml_cell_properties_locked_and_hidden();
+ test_xls_xml_styles_direct_format();
+ test_xls_xml_styles_column_styles();
+ test_xls_xml_styles_data_offset();
+
+ // view import
+ test_xls_xml_view_cursor_per_sheet();
+ test_xls_xml_view_cursor_split_pane();
+ test_xls_xml_view_frozen_pane();
+
+ test_xls_xml_skip_error_cells();
+ test_xls_xml_double_bom();
+
+ return EXIT_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+
diff --git a/src/orcus_test_xlsx.cpp b/src/orcus_test_xlsx.cpp
new file mode 100644
index 0000000..c3c1600
--- /dev/null
+++ b/src/orcus_test_xlsx.cpp
@@ -0,0 +1,2401 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "test_global.hpp"
+#include <orcus/orcus_xlsx.hpp>
+#include <orcus/format_detection.hpp>
+#include <orcus/stream.hpp>
+#include <orcus/config.hpp>
+#include <orcus/spreadsheet/factory.hpp>
+#include <orcus/spreadsheet/document.hpp>
+#include <orcus/spreadsheet/view.hpp>
+#include <orcus/spreadsheet/sheet.hpp>
+#include <orcus/spreadsheet/auto_filter.hpp>
+#include <orcus/spreadsheet/pivot.hpp>
+#include <orcus/spreadsheet/styles.hpp>
+#include <orcus/spreadsheet/shared_strings.hpp>
+#include <orcus/parser_global.hpp>
+
+#include <cstdlib>
+#include <cassert>
+#include <string>
+#include <sstream>
+#include <set>
+#include <cmath>
+#include <vector>
+#include <iostream>
+
+#include <ixion/model_context.hpp>
+#include <ixion/address.hpp>
+#include <ixion/formula_name_resolver.hpp>
+
+#include "filesystem_env.hpp"
+
+using namespace orcus;
+namespace ss = orcus::spreadsheet;
+
+namespace {
+
+config test_config(format_t::xlsx);
+
+std::unique_ptr<ss::document> load_doc(const std::string_view& path, bool recalc = true)
+{
+ ss::range_size_t sheet_size{1048576, 16384};
+ std::unique_ptr<ss::document> doc = std::make_unique<ss::document>(sheet_size);
+ ss::import_factory factory(*doc);
+
+ orcus_xlsx app(&factory);
+ app.read_file(std::string{path});
+ app.set_config(test_config);
+ if (recalc)
+ doc->recalc_formula_cells();
+
+ return doc;
+}
+
+/**
+ * Convenience function to retrieve a pivot cache instance from textural
+ * sheet name and range name.
+ */
+const ss::pivot_cache* get_pivot_cache(
+ const ss::pivot_collection& pc, const std::string_view& sheet_name, std::string_view range_name)
+{
+ std::unique_ptr<ixion::formula_name_resolver> resolver =
+ ixion::formula_name_resolver::get(
+ ixion::formula_name_resolver_t::excel_a1, nullptr);
+
+ if (!resolver)
+ return nullptr;
+
+ ixion::abs_address_t origin(0,0,0);
+
+ ixion::formula_name_t fn =
+ resolver->resolve(range_name, origin);
+
+ if (fn.type != ixion::formula_name_t::range_reference)
+ return nullptr;
+
+ ixion::abs_range_t range = std::get<ixion::range_t>(fn.value).to_abs(origin);
+ return pc.get_cache(sheet_name, range);
+}
+
+std::vector<fs::path> dirs_recalc = {
+ SRCDIR"/test/xlsx/raw-values-1",
+ SRCDIR"/test/xlsx/boolean-values",
+ SRCDIR"/test/xlsx/empty-shared-strings",
+ SRCDIR"/test/xlsx/formula-array-1",
+ SRCDIR"/test/xlsx/formula-cells",
+ SRCDIR"/test/xlsx/formula-shared",
+ SRCDIR"/test/xlsx/formula-with-string-results",
+ SRCDIR"/test/xlsx/named-expression",
+ SRCDIR"/test/xlsx/named-expression-sheet-local",
+};
+
+std::vector<fs::path> dirs_non_recalc = {
+ SRCDIR"/test/xlsx/formula-array-1",
+ SRCDIR"/test/xlsx/formula-cells",
+ SRCDIR"/test/xlsx/formula-shared",
+ SRCDIR"/test/xlsx/formula-with-string-results",
+};
+
+void test_xlsx_detection()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ for (const auto& dir : dirs_recalc)
+ {
+ fs::path filepath = dir / "input.xlsx";
+ file_content fc(filepath.string());
+ assert(!fc.empty());
+
+ format_t detected = detect(fc.str());
+ assert(detected == format_t::xlsx);
+ }
+}
+
+void test_xlsx_create_filter()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ ss::range_size_t ss{1048576, 16384};
+ std::unique_ptr<ss::document> doc = std::make_unique<ss::document>(ss);
+ ss::import_factory factory(*doc);
+
+ auto f = create_filter(format_t::xlsx, &factory);
+ assert(f);
+ assert(f->get_name() == "xlsx");
+}
+
+/**
+ * Semi-automated import test that goes through all specified directories,
+ * and in each directory, reads the input.xlsx file, dumps its output and
+ * checks it against the check.txt content.
+ */
+void test_xlsx_import()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ auto run_check = [](const fs::path& dir, bool recalc)
+ {
+ // Read the input.xlsx document.
+ fs::path filepath = dir / "input.xlsx";
+ auto doc = load_doc(filepath.string(), recalc);
+
+ // Dump the content of the model.
+ std::ostringstream os;
+ doc->dump_check(os);
+ std::string check = os.str();
+
+ // Check that against known control.
+ filepath = dir / "check.txt";
+ file_content control(filepath.string().data());
+
+ assert(!check.empty());
+ assert(!control.empty());
+
+ std::string_view s1(&check[0], check.size());
+ std::string_view s2 = control.str();
+ assert(orcus::trim(s1) == orcus::trim(s2));
+ };
+
+ for (const fs::path& dir : dirs_recalc)
+ {
+ run_check(dir, true);
+ }
+
+ for (const fs::path& dir : dirs_non_recalc)
+ {
+ run_check(dir, false);
+ }
+}
+
+void test_xlsx_table_autofilter()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ std::string path(SRCDIR"/test/xlsx/table/autofilter.xlsx");
+ spreadsheet::range_size_t ss{1048576, 16384};
+ ss::document doc{ss};
+ ss::import_factory factory(doc);
+ orcus_xlsx app(&factory);
+ app.read_file(path.c_str());
+
+ const ss::sheet* sh = doc.get_sheet(0);
+ assert(sh);
+ const ss::auto_filter_t* af = sh->get_auto_filter_data();
+ assert(af);
+
+ // Autofilter is over B2:C11.
+ assert(af->range.first.column == 1);
+ assert(af->range.first.row == 1);
+ assert(af->range.last.column == 2);
+ assert(af->range.last.row == 10);
+
+ // Check the match values of the 1st column filter criterion.
+ auto it = af->columns.find(0);
+ assert(it != af->columns.end());
+
+ const ss::auto_filter_column_t* afc = &it->second;
+ assert(afc->match_values.count("A") > 0);
+ assert(afc->match_values.count("C") > 0);
+
+ // And the 2nd column.
+ it = af->columns.find(1);
+ assert(it != af->columns.end());
+ afc = &it->second;
+ assert(afc->match_values.count("1") > 0);
+}
+
+void test_xlsx_table()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ std::string path(SRCDIR"/test/xlsx/table/table-1.xlsx");
+ ss::document doc{{1048576, 16384}};
+ ss::import_factory factory(doc);
+ orcus_xlsx app(&factory);
+ app.read_file(path.c_str());
+
+ std::string_view name("Table1");
+ const ss::table_t* p = doc.get_table(name);
+ assert(p);
+ assert(p->identifier == 1);
+ assert(p->name == name);
+ assert(p->display_name == name);
+ assert(p->totals_row_count == 1);
+
+ // Table range is C3:D9.
+ ixion::abs_range_t range;
+ range.first.column = 2;
+ range.first.row = 2;
+ range.first.sheet = 0;
+ range.last.column = 3;
+ range.last.row = 8;
+ range.last.sheet = 0;
+ assert(p->range == range);
+
+ // Table1 has 2 table columns.
+ assert(p->columns.size() == 2);
+
+ const ss::table_column_t* tcol = &p->columns[0];
+ assert(tcol);
+ assert(tcol->identifier == 1);
+ assert(tcol->name == "Category");
+ assert(tcol->totals_row_label == "Total");
+ assert(tcol->totals_row_function == ss::totals_row_function_t::none);
+
+ tcol = &p->columns[1];
+ assert(tcol);
+ assert(tcol->identifier == 2);
+ assert(tcol->name == "Value");
+ assert(tcol->totals_row_label.empty());
+ assert(tcol->totals_row_function == ss::totals_row_function_t::sum);
+
+ const auto& filter = p->filter;
+
+ // Auto filter range is C3:D8.
+ range.last.row = 7;
+ assert(filter.range == range);
+
+ assert(filter.columns.size() == 1);
+ const ss::auto_filter_column_t& afc = filter.columns.begin()->second;
+ assert(afc.match_values.size() == 4);
+ assert(afc.match_values.count("A") > 0);
+ assert(afc.match_values.count("C") > 0);
+ assert(afc.match_values.count("D") > 0);
+ assert(afc.match_values.count("E") > 0);
+
+ // Check table style.
+ const ss::table_style_t& style = p->style;
+ assert(style.name == "TableStyleLight9");
+ assert(style.show_first_column == false);
+ assert(style.show_last_column == false);
+ assert(style.show_row_stripes == true);
+ assert(style.show_column_stripes == false);
+}
+
+void test_xlsx_merged_cells()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ std::string path(SRCDIR"/test/xlsx/merged-cells/simple.xlsx");
+
+ spreadsheet::range_size_t ss{1048576, 16384};
+ ss::document doc{ss};
+ ss::import_factory factory(doc);
+ orcus_xlsx app(&factory);
+ app.set_config(test_config);
+
+ app.read_file(path.c_str());
+
+ const ss::sheet* sheet1 = doc.get_sheet("Sheet1");
+ assert(sheet1);
+
+ spreadsheet::range_t merge_range = sheet1->get_merge_cell_range(0, 1);
+ assert(merge_range.first.column == 1);
+ assert(merge_range.last.column == 2);
+ assert(merge_range.first.row == 0);
+ assert(merge_range.last.row == 0);
+
+ merge_range = sheet1->get_merge_cell_range(0, 3);
+ assert(merge_range.first.column == 3);
+ assert(merge_range.last.column == 5);
+ assert(merge_range.first.row == 0);
+ assert(merge_range.last.row == 0);
+
+ merge_range = sheet1->get_merge_cell_range(1, 0);
+ assert(merge_range.first.column == 0);
+ assert(merge_range.last.column == 0);
+ assert(merge_range.first.row == 1);
+ assert(merge_range.last.row == 2);
+
+ merge_range = sheet1->get_merge_cell_range(3, 0);
+ assert(merge_range.first.column == 0);
+ assert(merge_range.last.column == 0);
+ assert(merge_range.first.row == 3);
+ assert(merge_range.last.row == 5);
+
+ merge_range = sheet1->get_merge_cell_range(2, 2);
+ assert(merge_range.first.column == 2);
+ assert(merge_range.last.column == 5);
+ assert(merge_range.first.row == 2);
+ assert(merge_range.last.row == 5);
+}
+
+void test_xlsx_date_time()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ std::string path(SRCDIR"/test/xlsx/date-time/input.xlsx");
+
+ ss::document doc{{1048576, 16384}};
+ ss::import_factory factory(doc);
+ orcus_xlsx app(&factory);
+ app.set_config(test_config);
+
+ app.read_file(path.c_str());
+
+ const ss::sheet* sheet1 = doc.get_sheet("Sheet1");
+ assert(sheet1);
+
+ // B1 contains date-only value.
+ date_time_t dt = sheet1->get_date_time(0, 1);
+ assert(dt == date_time_t(2016, 12, 14));
+
+ // B2 contains date-time value with no fraction seconds.
+ dt = sheet1->get_date_time(1, 1);
+ assert(dt == date_time_t(2002, 2, 3, 12, 34, 45));
+
+ // B3 contains date-time value with fraction second (1992-03-04 08:34:33.555)
+ dt = sheet1->get_date_time(2, 1);
+ assert(dt.year == 1992);
+ assert(dt.month == 3);
+ assert(dt.day == 4);
+ assert(dt.hour == 8);
+ assert(dt.minute == 34);
+ assert(std::floor(dt.second) == 33.0);
+
+ // Evalutate the fraction second as milliseconds.
+ double ms = dt.second * 1000.0;
+ ms -= std::floor(dt.second) * 1000.0;
+ ms = std::round(ms);
+ assert(ms == 555.0);
+}
+
+void test_xlsx_background_fill()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ std::string_view path(SRCDIR"/test/xlsx/background-color/standard.xlsx");
+ std::unique_ptr<spreadsheet::document> doc = load_doc(path);
+
+ spreadsheet::styles& styles = doc->get_styles();
+
+ spreadsheet::sheet* sh = doc->get_sheet(0);
+ assert(sh);
+
+ struct check
+ {
+ spreadsheet::row_t row;
+ spreadsheet::col_t col;
+ spreadsheet::fill_pattern_t pattern_type;
+ spreadsheet::color_t fg_color;
+ };
+
+ std::vector<check> checks =
+ {
+ { 1, 0, spreadsheet::fill_pattern_t::solid, { 255, 192, 0, 0 } }, // A2 - dark red
+ { 2, 0, spreadsheet::fill_pattern_t::solid, { 255, 255, 0, 0 } }, // A3 - red
+ { 3, 0, spreadsheet::fill_pattern_t::solid, { 255, 255, 192, 0 } }, // A4 - orange
+ { 4, 0, spreadsheet::fill_pattern_t::solid, { 255, 255, 255, 0 } }, // A5 - yellow
+ { 5, 0, spreadsheet::fill_pattern_t::solid, { 255, 146, 208, 80 } }, // A6 - light green
+ { 6, 0, spreadsheet::fill_pattern_t::solid, { 255, 0, 176, 80 } }, // A7 - green
+ { 7, 0, spreadsheet::fill_pattern_t::solid, { 255, 0, 176, 240 } }, // A8 - light blue
+ { 8, 0, spreadsheet::fill_pattern_t::solid, { 255, 0, 112, 192 } }, // A9 - blue
+ { 9, 0, spreadsheet::fill_pattern_t::solid, { 255, 0, 32, 96 } }, // A10 - dark blue
+ { 10, 0, spreadsheet::fill_pattern_t::solid, { 255, 112, 48, 160 } }, // A11 - purple
+ };
+
+ for (const check& c : checks)
+ {
+ size_t xf = sh->get_cell_format(c.row, c.col);
+
+ const spreadsheet::cell_format_t* cf = styles.get_cell_format(xf);
+ assert(cf);
+
+ const spreadsheet::fill_t* fill_data = styles.get_fill(cf->fill);
+ assert(fill_data);
+ assert(fill_data->pattern_type == c.pattern_type);
+ assert(fill_data->fg_color == c.fg_color);
+ }
+}
+
+void test_xlsx_number_format()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ std::string_view path(SRCDIR"/test/xlsx/number-format/date-time.xlsx");
+ std::unique_ptr<spreadsheet::document> doc = load_doc(path);
+
+ spreadsheet::sheet* sh = doc->get_sheet(0);
+ assert(sh);
+
+ struct check
+ {
+ ss::row_t row;
+ ss::col_t col;
+ std::string_view expected;
+ };
+
+ std::vector<check> checks =
+ {
+ { 1, 1, "[$-F800]dddd\\,\\ mmmm\\ dd\\,\\ yyyy" },
+ { 2, 1, "[ENG][$-409]mmmm\\ d\\,\\ yyyy;@" },
+ { 3, 1, "m/d/yy;@" },
+ };
+
+// TODO : We need to build our own internal number format code table for
+// xlsx. Firstly, xlsx uses numFmtId explicitly to link between the xf and
+// the format string and the ID's are not sequential. Secondly, there is a
+// set of built-in format strings for ID < 164, and that information is not
+// stored in the file.
+#if 0
+ spreadsheet::styles& styles = doc->get_styles();
+
+ for (const check& c : checks)
+ {
+ size_t xf = sh->get_cell_format(c.row, c.col);
+ const spreadsheet::cell_format_t* cf = styles.get_cell_format(xf);
+ assert(cf);
+
+ const spreadsheet::number_format_t* nf = styles.start_number_format(cf->number_format);
+ assert(nf);
+ assert(nf->format_string == c.expected);
+ }
+#endif
+}
+
+void test_xlsx_text_alignment()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ std::string_view path(SRCDIR"/test/xlsx/text-alignment/input.xlsx");
+ std::unique_ptr<spreadsheet::document> doc = load_doc(path);
+
+ spreadsheet::styles& styles = doc->get_styles();
+
+ spreadsheet::sheet* sh = doc->get_sheet(0);
+ assert(sh);
+
+ struct check
+ {
+ spreadsheet::row_t row;
+ spreadsheet::col_t col;
+ bool apply_align;
+ spreadsheet::hor_alignment_t hor_align;
+ spreadsheet::ver_alignment_t ver_align;
+ };
+
+ std::vector<check> checks =
+ {
+ { 1, 2, false, spreadsheet::hor_alignment_t::unknown, spreadsheet::ver_alignment_t::unknown }, // C2
+ { 2, 2, true, spreadsheet::hor_alignment_t::left, spreadsheet::ver_alignment_t::bottom }, // C3
+ { 3, 2, true, spreadsheet::hor_alignment_t::center, spreadsheet::ver_alignment_t::bottom }, // C4
+ { 4, 2, true, spreadsheet::hor_alignment_t::right, spreadsheet::ver_alignment_t::bottom }, // C5
+ { 5, 2, true, spreadsheet::hor_alignment_t::left, spreadsheet::ver_alignment_t::bottom }, // C6
+ { 6, 2, true, spreadsheet::hor_alignment_t::left, spreadsheet::ver_alignment_t::bottom }, // C7
+ { 7, 2, true, spreadsheet::hor_alignment_t::right, spreadsheet::ver_alignment_t::bottom }, // C8
+ { 8, 2, true, spreadsheet::hor_alignment_t::right, spreadsheet::ver_alignment_t::bottom }, // C9
+ { 9, 2, true, spreadsheet::hor_alignment_t::unknown, spreadsheet::ver_alignment_t::middle }, // C10
+ { 10, 2, true, spreadsheet::hor_alignment_t::left, spreadsheet::ver_alignment_t::middle }, // C11
+ { 11, 2, true, spreadsheet::hor_alignment_t::center, spreadsheet::ver_alignment_t::middle }, // C12
+ { 12, 2, true, spreadsheet::hor_alignment_t::right, spreadsheet::ver_alignment_t::middle }, // C13
+ { 13, 2, true, spreadsheet::hor_alignment_t::left, spreadsheet::ver_alignment_t::middle }, // C14
+ { 14, 2, true, spreadsheet::hor_alignment_t::left, spreadsheet::ver_alignment_t::middle }, // C15
+ { 15, 2, true, spreadsheet::hor_alignment_t::right, spreadsheet::ver_alignment_t::middle }, // C16
+ { 16, 2, true, spreadsheet::hor_alignment_t::right, spreadsheet::ver_alignment_t::middle }, // C17
+ { 17, 2, true, spreadsheet::hor_alignment_t::unknown, spreadsheet::ver_alignment_t::top }, // C18
+ { 18, 2, true, spreadsheet::hor_alignment_t::left, spreadsheet::ver_alignment_t::top }, // C19
+ { 19, 2, true, spreadsheet::hor_alignment_t::center, spreadsheet::ver_alignment_t::top }, // C20
+ { 20, 2, true, spreadsheet::hor_alignment_t::right, spreadsheet::ver_alignment_t::top }, // C21
+ { 21, 2, true, spreadsheet::hor_alignment_t::left, spreadsheet::ver_alignment_t::top }, // C22
+ { 22, 2, true, spreadsheet::hor_alignment_t::left, spreadsheet::ver_alignment_t::top }, // C23
+ { 23, 2, true, spreadsheet::hor_alignment_t::right, spreadsheet::ver_alignment_t::top }, // C24
+ { 24, 2, true, spreadsheet::hor_alignment_t::right, spreadsheet::ver_alignment_t::top }, // C25
+ { 25, 2, true, spreadsheet::hor_alignment_t::unknown, spreadsheet::ver_alignment_t::justified }, // C26
+ { 26, 2, true, spreadsheet::hor_alignment_t::justified, spreadsheet::ver_alignment_t::bottom }, // C27
+ { 27, 2, true, spreadsheet::hor_alignment_t::distributed, spreadsheet::ver_alignment_t::distributed }, // C28
+ };
+
+ for (const check& c : checks)
+ {
+ size_t xf = sh->get_cell_format(c.row, c.col);
+
+ const spreadsheet::cell_format_t* cf = styles.get_cell_format(xf);
+ assert(cf);
+ assert(c.apply_align == cf->apply_alignment);
+
+ if (!cf->apply_alignment)
+ continue;
+
+ assert(c.hor_align == cf->hor_align);
+ assert(c.ver_align == cf->ver_align);
+ }
+}
+
+void test_xlsx_cell_borders_single_cells()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ std::string_view path(SRCDIR"/test/xlsx/borders/single-cells.xlsx");
+ std::unique_ptr<spreadsheet::document> doc = load_doc(path);
+
+ spreadsheet::styles& styles = doc->get_styles();
+
+ spreadsheet::sheet* sh = doc->get_sheet(0);
+ assert(sh);
+
+ struct check
+ {
+ spreadsheet::row_t row;
+ spreadsheet::col_t col;
+ spreadsheet::border_style_t style;
+ };
+
+ std::vector<check> checks =
+ {
+ { 3, 1, ss::border_style_t::hair },
+ { 5, 1, ss::border_style_t::dotted },
+ { 7, 1, ss::border_style_t::dash_dot_dot },
+ { 9, 1, ss::border_style_t::dash_dot },
+ { 11, 1, ss::border_style_t::dashed },
+ { 13, 1, ss::border_style_t::thin },
+ { 1, 3, ss::border_style_t::medium_dash_dot_dot },
+ { 3, 3, ss::border_style_t::slant_dash_dot },
+ { 5, 3, ss::border_style_t::medium_dash_dot },
+ { 7, 3, ss::border_style_t::medium_dashed },
+ { 9, 3, ss::border_style_t::medium },
+ { 11, 3, ss::border_style_t::thick },
+ { 13, 3, ss::border_style_t::double_border },
+ };
+
+ for (const check& c : checks)
+ {
+ size_t xf = sh->get_cell_format(c.row, c.col);
+ const spreadsheet::cell_format_t* cf = styles.get_cell_format(xf);
+ assert(cf);
+ assert(cf->apply_border);
+
+ const spreadsheet::border_t* border = styles.get_border(cf->border);
+ assert(border);
+ assert(border->top.style == c.style);
+ assert(border->bottom.style == c.style);
+ assert(border->left.style == c.style);
+ assert(border->right.style == c.style);
+ }
+}
+
+void test_xlsx_cell_borders_directions()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ std::string_view path(SRCDIR"/test/xlsx/borders/directions.xlsx");
+ std::unique_ptr<ss::document> doc = load_doc(path);
+
+ ss::styles& styles = doc->get_styles();
+
+ ss::sheet* sh = doc->get_sheet(0);
+ assert(sh);
+
+ struct check
+ {
+ ss::row_t row;
+ ss::col_t col;
+ ss::border_direction_t dir;
+ };
+
+ std::vector<check> checks =
+ {
+ { 1, 1, ss::border_direction_t::top },
+ { 3, 1, ss::border_direction_t::left },
+ { 5, 1, ss::border_direction_t::right },
+ { 7, 1, ss::border_direction_t::bottom },
+ { 9, 1, ss::border_direction_t::diagonal_tl_br },
+ { 11, 1, ss::border_direction_t::diagonal_bl_tr },
+ { 13, 1, ss::border_direction_t::diagonal },
+ };
+
+ for (const check& c : checks)
+ {
+ size_t xf = sh->get_cell_format(c.row, c.col);
+ const ss::cell_format_t* cf = styles.get_cell_format(xf);
+ assert(cf);
+ assert(cf->apply_border);
+
+ const ss::border_t* border = styles.get_border(cf->border);
+ assert(border);
+
+ switch (c.dir)
+ {
+ case ss::border_direction_t::top:
+ assert(border->top.style);
+ assert(border->top.style == ss::border_style_t::thin);
+ assert(!border->bottom.style);
+ assert(!border->left.style);
+ assert(!border->right.style);
+ assert(!border->diagonal.style);
+ assert(!border->diagonal_bl_tr.style);
+ assert(!border->diagonal_tl_br.style);
+ break;
+ case ss::border_direction_t::left:
+ assert(!border->top.style);
+ assert(!border->bottom.style);
+ assert(border->left.style);
+ assert(*border->left.style == ss::border_style_t::thin);
+ assert(!border->right.style);
+ assert(!border->diagonal.style);
+ assert(!border->diagonal_bl_tr.style);
+ assert(!border->diagonal_tl_br.style);
+ break;
+ case ss::border_direction_t::right:
+ assert(!border->top.style);
+ assert(!border->bottom.style);
+ assert(!border->left.style);
+ assert(border->right.style);
+ assert(*border->right.style == ss::border_style_t::thin);
+ assert(!border->diagonal.style);
+ assert(!border->diagonal_bl_tr.style);
+ assert(!border->diagonal_tl_br.style);
+ break;
+ case ss::border_direction_t::bottom:
+ assert(!border->top.style);
+ assert(border->bottom.style);
+ assert(*border->bottom.style == ss::border_style_t::thin);
+ assert(!border->left.style);
+ assert(!border->right.style);
+ assert(!border->diagonal.style);
+ assert(!border->diagonal_bl_tr.style);
+ assert(!border->diagonal_tl_br.style);
+ break;
+ case ss::border_direction_t::diagonal:
+ assert(!border->top.style);
+ assert(!border->bottom.style);
+ assert(!border->left.style);
+ assert(!border->right.style);
+ assert(border->diagonal.style);
+ assert(*border->diagonal.style == ss::border_style_t::thin);
+ assert(!border->diagonal_bl_tr.style);
+ assert(!border->diagonal_tl_br.style);
+ break;
+ case ss::border_direction_t::diagonal_tl_br:
+ assert(!border->top.style);
+ assert(!border->bottom.style);
+ assert(!border->left.style);
+ assert(!border->right.style);
+ assert(!border->diagonal.style);
+ assert(!border->diagonal_bl_tr.style);
+ assert(border->diagonal_tl_br.style);
+ assert(border->diagonal_tl_br.style == ss::border_style_t::thin);
+ break;
+ case ss::border_direction_t::diagonal_bl_tr:
+ assert(!border->top.style);
+ assert(!border->bottom.style);
+ assert(!border->left.style);
+ assert(!border->right.style);
+ assert(!border->diagonal.style);
+ assert(border->diagonal_bl_tr.style);
+ assert(*border->diagonal_bl_tr.style == ss::border_style_t::thin);
+ assert(!border->diagonal_tl_br.style);
+ break;
+ default:
+ assert(!"unhandled direction!");
+ }
+ }
+}
+
+void test_xlsx_cell_borders_colors()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ std::string_view path(SRCDIR"/test/xlsx/borders/colors.xlsx");
+ std::unique_ptr<spreadsheet::document> doc = load_doc(path);
+
+ spreadsheet::styles& styles = doc->get_styles();
+
+ spreadsheet::sheet* sh = doc->get_sheet(0);
+ assert(sh);
+
+ struct check
+ {
+ ss::row_t row;
+ ss::col_t col;
+ ss::color_t color;
+ };
+
+ std::vector<check> checks =
+ {
+ { 2, 1, ss::color_t(0xFF, 0xFF, 0, 0) }, // B3 - red
+ { 3, 1, ss::color_t(0xFF, 0, 0x70, 0xC0) }, // B4 - blue
+ { 4, 1, ss::color_t(0xFF, 0, 0xB0, 0x50) }, // B5 - green
+ };
+
+ for (const check& c : checks)
+ {
+ size_t xf = sh->get_cell_format(c.row, c.col); // B3
+
+ const spreadsheet::cell_format_t* cf = styles.get_cell_format(xf);
+ assert(cf);
+ assert(cf->apply_border);
+
+ const spreadsheet::border_t* border = styles.get_border(cf->border);
+ assert(border);
+
+ assert(!border->left.style);
+ assert(border->right.style);
+ assert(*border->right.style == ss::border_style_t::thick);
+ assert(!border->top.style);
+ assert(!border->bottom.style);
+
+ assert(border->right.border_color == c.color);
+ }
+
+ // B7 contains yellow left border, purple right border, and light blue
+ // diagonal borders.
+
+ size_t xf = sh->get_cell_format(6, 1); // B7
+
+ const ss::cell_format_t* cf = styles.get_cell_format(xf);
+ assert(cf);
+ assert(cf->apply_border);
+
+ const ss::border_t* border = styles.get_border(cf->border);
+ assert(border);
+
+ assert(border->left.style == ss::border_style_t::thick);
+ assert(border->left.border_color == ss::color_t(0xFF, 0xFF, 0xFF, 0)); // yellow
+
+ assert(border->right.style == ss::border_style_t::thick);
+ assert(border->right.border_color == ss::color_t(0xFF, 0x70, 0x30, 0xA0)); // purple
+
+ assert(border->diagonal.style == ss::border_style_t::thick);
+ assert(border->diagonal.border_color == ss::color_t(0xFF, 0x00, 0xB0, 0xF0)); // light blue
+
+ // B7 also contains multi-line string. Test that as well.
+ ixion::model_context& model = doc->get_model_context();
+ ixion::string_id_t sid = model.get_string_identifier(ixion::abs_address_t(0,6,1));
+ const std::string* s = model.get_string(sid);
+ assert(s);
+ assert(*s == "<- Yellow\nPurple ->\nLight Blue \\");
+}
+
+void test_xlsx_hidden_rows_columns()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ std::string_view path(SRCDIR"/test/xlsx/hidden-rows-columns/input.xlsx");
+ std::unique_ptr<spreadsheet::document> doc = load_doc(path);
+
+ spreadsheet::sheet* sh = doc->get_sheet("Hidden Rows");
+ assert(sh);
+
+ spreadsheet::row_t row_start = -1, row_end = -1;
+
+ // Row 1 is visible.
+ assert(!sh->is_row_hidden(0, &row_start, &row_end));
+ assert(row_start == 0);
+ assert(row_end == 1); // the end position is non-inclusive.
+
+ // Rows 2-3 are hidden.
+ assert(sh->is_row_hidden(1, &row_start, &row_end));
+ assert(row_start == 1);
+ assert(row_end == 3); // the end position is non-inclusive.
+
+ // Row 4 is visible.
+ assert(!sh->is_row_hidden(3, &row_start, &row_end));
+ assert(row_start == 3);
+ assert(row_end == 4); // the end position is non-inclusive.
+
+ // Row 5 is hidden.
+ assert(sh->is_row_hidden(4, &row_start, &row_end));
+ assert(row_start == 4);
+ assert(row_end == 5); // the end position is non-inclusive.
+
+ // Rows 6-8 are visible.
+ assert(!sh->is_row_hidden(5, &row_start, &row_end));
+ assert(row_start == 5);
+ assert(row_end == 8); // the end position is non-inclusive.
+
+ // Row 9 is hidden.
+ assert(sh->is_row_hidden(8, &row_start, &row_end));
+ assert(row_start == 8);
+ assert(row_end == 9); // the end position is non-inclusive.
+
+ // The rest of the rows are visible.
+ assert(!sh->is_row_hidden(9, &row_start, &row_end));
+ assert(row_start == 9);
+ assert(row_end == doc->get_sheet_size().rows); // the end position is non-inclusive.
+
+ sh = doc->get_sheet("Hidden Columns");
+ assert(sh);
+
+ spreadsheet::col_t col_start = -1, col_end = -1;
+
+ // Columns A-B are visible.
+ assert(!sh->is_col_hidden(0, &col_start, &col_end));
+ assert(col_start == 0);
+ assert(col_end == 2); // non-inclusive
+
+ // Columns C-E are hidden.
+ assert(sh->is_col_hidden(2, &col_start, &col_end));
+ assert(col_start == 2);
+ assert(col_end == 6); // non-inclusive
+
+ // Columns G-J are visible.
+ assert(!sh->is_col_hidden(6, &col_start, &col_end));
+ assert(col_start == 6);
+ assert(col_end == 10); // non-inclusive
+
+ // Column K is hidden.
+ assert(sh->is_col_hidden(10, &col_start, &col_end));
+ assert(col_start == 10);
+ assert(col_end == 11); // non-inclusive
+
+ // The rest of the columns are all visible.
+ assert(!sh->is_col_hidden(11, &col_start, &col_end));
+ assert(col_start == 11);
+ assert(col_end == doc->get_sheet_size().columns); // non-inclusive
+}
+
+void test_xlsx_cell_properties()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ fs::path path{SRCDIR"/test/xlsx/cell-properties/wrap-and-shrink.xlsx"};
+ std::unique_ptr<spreadsheet::document> doc = load_doc(path.string());
+
+ const ss::styles& styles = doc->get_styles();
+ const ss::sheet* sh = doc->get_sheet(0);
+ assert(sh);
+
+ auto xfid = sh->get_cell_format(0, 1); // B1
+ const auto* xf = styles.get_cell_format(xfid);
+ assert(xf);
+ assert(!xf->wrap_text);
+ assert(!xf->shrink_to_fit);
+
+ xfid = sh->get_cell_format(1, 1); // B2
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+ assert(xf->wrap_text);
+ assert(*xf->wrap_text);
+ assert(xf->shrink_to_fit);
+ assert(!*xf->shrink_to_fit);
+
+ xfid = sh->get_cell_format(2, 1); // B3
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+ assert(xf->wrap_text);
+ assert(!*xf->wrap_text);
+ assert(xf->shrink_to_fit);
+ assert(*xf->shrink_to_fit);
+}
+
+void test_xlsx_styles_direct_format()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ fs::path path{SRCDIR"/test/xlsx/styles/direct-format.xlsx"};
+ std::unique_ptr<spreadsheet::document> doc = load_doc(path.string());
+ assert(doc);
+
+ const auto& model = doc->get_model_context();
+
+ {
+ // Check cell string values first.
+
+ struct check_type
+ {
+ ixion::abs_address_t address;
+ std::string_view str;
+ };
+
+ const check_type checks[] = {
+ // sheet, row, column, expected cell string value
+ { { 0, 1, 1 }, "Bold and underlined" },
+ { { 0, 3, 1 }, "Yellow background\nand\nright aligned" },
+ { { 0, 5, 3 }, "Named Format (Good)" },
+ { { 0, 7, 3 }, "Named Format (Good) plus direct format on top" },
+ };
+
+ for (const auto& c : checks)
+ {
+ ixion::string_id_t sid = model.get_string_identifier(c.address);
+ const std::string* s = model.get_string(sid);
+ assert(s);
+ assert(*s == c.str);
+ }
+ }
+
+ const ss::sheet* sh = doc->get_sheet(0);
+ assert(sh);
+
+ const ss::styles& styles = doc->get_styles();
+
+ // Text in B2 is bold, underlined, and horizontally and vertically centered.
+ auto xfid = sh->get_cell_format(1, 1);
+ const ss::cell_format_t* xf = styles.get_cell_format(xfid);
+ assert(xf);
+
+ const ss::font_t* font = styles.get_font(xf->font);
+ assert(font);
+ assert(font->bold);
+ assert(*font->bold);
+
+ const ss::border_t* border = styles.get_border(xf->border);
+ assert(border);
+
+ // "Continuous" with a weight of 1 is mapped to 'thin' border style.
+ assert(border->bottom.style);
+ assert(*border->bottom.style == ss::border_style_t::thin);
+
+ assert(xf->hor_align == ss::hor_alignment_t::center);
+ assert(xf->ver_align == ss::ver_alignment_t::middle);
+
+ // B4 has yellow background, has "Calibri" font at 14 pt etc
+ xfid = sh->get_cell_format(3, 1);
+
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+
+ font = styles.get_font(xf->font);
+ assert(font);
+ assert(font->name);
+ assert(*font->name == "Calibri");
+ assert(font->size);
+ assert(*font->size == 14.0);
+#if 0
+ // TODO: xlsx stores this color as a theme index which we don't yet support
+ assert(font->first.color == ss::color_t(0xFF, 0x37, 0x56, 0x23));
+ assert(font->second.color);
+#endif
+
+ // B4 has yellow background
+ const ss::fill_t* fill = styles.get_fill(xf->fill);
+ assert(fill);
+ assert(fill->pattern_type);
+ assert(*fill->pattern_type == ss::fill_pattern_t::solid);
+ assert(fill->fg_color);
+ assert(*fill->fg_color == ss::color_t(0xFF, 0xFF, 0xFF, 0x00));
+
+ // B4 is horizontally right-aligned and vertically bottom-aligned
+ assert(xf->hor_align == ss::hor_alignment_t::right);
+ assert(xf->ver_align == ss::ver_alignment_t::bottom);
+
+ // B4 has wrap text on
+ assert(xf->wrap_text && *xf->wrap_text);
+
+ // D6 only uses "Good" named cell style with no direct formatting
+ xfid = sh->get_cell_format(5, 3);
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+
+ const auto xfid_style_good = xf->style_xf;
+ const ss::cell_style_t* xstyle = styles.get_cell_style_by_xf(xf->style_xf);
+ assert(xstyle);
+ assert(xstyle->name == "Good");
+
+ // Check the format detail of the "Good" style
+ xf = styles.get_cell_style_format(xstyle->xf);
+ assert(xf);
+
+ font = styles.get_font(xf->font);
+ assert(font);
+ assert(font->name);
+ assert(*font->name == "Calibri");
+ assert(font->size);
+ assert(*font->size == 11.0);
+ assert(font->color);
+ assert(*font->color == ss::color_t(0xFF, 0x00, 0x61, 0x00));
+
+ fill = styles.get_fill(xf->fill);
+ assert(fill);
+ assert(fill->pattern_type);
+ assert(*fill->pattern_type == ss::fill_pattern_t::solid);
+ assert(fill->fg_color);
+ assert(*fill->fg_color == ss::color_t(0xFF, 0xC6, 0xEF, 0xCE));
+
+ // D8 has some direct formats applied on top of "Good" named style
+ xfid = sh->get_cell_format(7, 3);
+ xf = styles.get_cell_format(xfid);
+ assert(xf);
+
+ // Make sure it has the "Good" style as its basis
+ assert(xf->style_xf == xfid_style_good);
+ xstyle = styles.get_cell_style_by_xf(xf->style_xf);
+ assert(xstyle);
+ assert(xstyle->name == "Good");
+
+ // Format directly applied to D8 on top of "Good" style
+ assert(xf->hor_align == ss::hor_alignment_t::center);
+ assert(xf->ver_align == ss::ver_alignment_t::bottom);
+ assert(xf->wrap_text);
+ assert(*xf->wrap_text);
+ font = styles.get_font(xf->font);
+ assert(font);
+ assert(font->bold);
+ assert(*font->bold);
+}
+
+void test_xlsx_styles_column_styles()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ fs::path path{SRCDIR"/test/xlsx/styles/column-styles.xlsx"};
+ std::unique_ptr<spreadsheet::document> doc = load_doc(path.string());
+ assert(doc);
+
+ auto doc_size = doc->get_sheet_size();
+
+ const ss::styles& styles = doc->get_styles();
+
+ const ss::sheet* sh = doc->get_sheet(0);
+ assert(sh);
+
+ {
+ // On Sheet1, check the named styles applied on columns B:D and F.
+ // Columns A and E should have Normal style applied.
+ const std::tuple<ss::row_t, ss::col_t, std::string> checks[] = {
+ { 0, 0, "Normal" },
+ { 0, 1, "Bad" },
+ { 0, 2, "Good" },
+ { 0, 3, "Neutral" },
+ { 0, 4, "Normal" },
+ { 0, 5, "Note" },
+ { doc_size.rows - 1, 0, "Normal" },
+ { doc_size.rows - 1, 1, "Bad" },
+ { doc_size.rows - 1, 2, "Good" },
+ { doc_size.rows - 1, 3, "Neutral" },
+ { doc_size.rows - 1, 4, "Normal" },
+ { doc_size.rows - 1, 5, "Note" },
+ };
+
+ for (const auto& check : checks)
+ {
+ ss::row_t r = std::get<0>(check);
+ ss::col_t c = std::get<1>(check);
+ std::string_view name = std::get<2>(check);
+
+ std::size_t xfid = sh->get_cell_format(r, c);
+ std::cout << "row=" << r << "; column=" << c << "; xfid=" << xfid << std::endl;
+ const ss::cell_format_t* xf = styles.get_cell_format(xfid);
+ assert(xf);
+ std::cout << "style xfid=" << xf->style_xf << std::endl;
+
+ const ss::cell_style_t* xstyle = styles.get_cell_style_by_xf(xf->style_xf);
+ assert(xstyle);
+ if (xstyle->name != name)
+ std::cout << "names differ! (expected=" << name << "; actual=" << xstyle->name << ")" << std::endl;
+
+ assert(xstyle->name == name);
+ }
+ }
+
+ {
+ // Row 10 has green background, and row 11 has orange background.
+ const std::tuple<ss::row_t, ss::color_t> checks[] = {
+ { 9, {0xFF, 0x92, 0xD0, 0x50} },
+ { 10, {0xFF, 0xFF, 0xC0, 0x00} },
+ };
+
+ for (const auto& check : checks)
+ {
+ const ss::row_t row = std::get<0>(check);
+ const ss::color_t color = std::get<1>(check);
+
+ for (ss::col_t col = 0; col <= 6; ++col)
+ {
+ std::size_t xfid = sh->get_cell_format(row, col);
+ std::cout << "row=" << row << "; column=" << col << "; xfid=" << xfid << std::endl;
+ const ss::cell_format_t* xf = styles.get_cell_format(xfid);
+ assert(xf);
+
+ const ss::fill_t* fill = styles.get_fill(xf->fill);
+ assert(fill);
+
+ assert(fill->pattern_type);
+ assert(*fill->pattern_type == ss::fill_pattern_t::solid);
+
+ assert(fill->fg_color);
+ assert(*fill->fg_color == color);
+ }
+ }
+ }
+
+ sh = doc->get_sheet(1);
+ assert(sh);
+
+ // Columns B:D should have "Good" named style applied.
+ {
+ const std::pair<ss::row_t, ss::col_t> cells[] = {
+ { 0, 1 },
+ { 0, 3 },
+ { doc_size.rows - 1, 1 },
+ { doc_size.rows - 1, 3 },
+ };
+
+ for (const auto& cell : cells)
+ {
+ std::size_t xfid = sh->get_cell_format(cell.first, cell.second);
+ const ss::cell_format_t* xf = styles.get_cell_format(xfid);
+ assert(xf);
+
+ const ss::cell_style_t* xstyle = styles.get_cell_style_by_xf(xf->style_xf);
+ assert(xstyle);
+ assert(xstyle->name == "Good");
+ }
+ }
+}
+
+void test_xlsx_formatted_text_basic()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ fs::path path{SRCDIR"/test/xlsx/formatted-text/basic.xlsx"};
+ std::unique_ptr<spreadsheet::document> doc = load_doc(path.string());
+ assert(doc);
+
+ const auto& styles_pool = doc->get_styles();
+
+ auto get_font = [&styles_pool](const ss::sheet& sh, ss::row_t row, ss::col_t col)
+ {
+ std::size_t xf = sh.get_cell_format(row, col);
+
+ const ss::cell_format_t* cell_format = styles_pool.get_cell_format(xf);
+ assert(cell_format);
+
+ const ss::font_t* font = styles_pool.get_font(cell_format->font);
+ assert(font);
+
+ return font;
+ };
+
+ auto check_cell_bold = [&get_font](const ss::sheet& sh, ss::row_t row, ss::col_t col, bool expected)
+ {
+ const ss::font_t* font = get_font(sh, row, col);
+
+ if (expected)
+ {
+ if (font->bold && *font->bold)
+ return true;
+
+ std::cerr << "expected to be bold but it is not "
+ << "(sheet=" << sh.get_index() << "; row=" << row << "; column=" << col << ")"
+ << std::endl;
+
+ return false;
+ }
+ else
+ {
+ if (!font->bold || !*font->bold)
+ return true;
+
+ std::cerr << "expected to be non-bold but it is bold "
+ << "(sheet=" << sh.get_index() << "; row=" << row << "; column=" << col << ")"
+ << std::endl;
+
+ return false;
+ }
+ };
+
+ auto check_cell_italic = [&get_font](const ss::sheet& sh, ss::row_t row, ss::col_t col, bool expected)
+ {
+ const ss::font_t* font = get_font(sh, row, col);
+
+ if (expected)
+ {
+ if (font->italic && *font->italic)
+ return true;
+
+ std::cerr << "expected to be italic but it is not "
+ << "(sheet=" << sh.get_index() << "; row=" << row << "; column=" << col << ")"
+ << std::endl;
+
+ return false;
+ }
+ else
+ {
+ if (!font->italic || !*font->italic)
+ return true;
+
+ std::cerr << "expected to be non-italic but it is italic "
+ << "(sheet=" << sh.get_index() << "; row=" << row << "; column=" << col << ")"
+ << std::endl;
+
+ return false;
+ }
+ };
+
+ auto check_cell_text = [&doc](const ss::sheet& sh, ss::row_t row, ss::col_t col, std::string_view expected)
+ {
+ const auto& sstrings = doc->get_shared_strings();
+
+ std::size_t si = sh.get_string_identifier(row, col);
+ const std::string* s = sstrings.get_string(si);
+ if (!s)
+ {
+ std::cerr << "expected='" << expected << "'; actual=<none> "
+ << "(sheet=" << sh.get_index() << "; row=" << row << "; column=" << col << ")"
+ << std::endl;
+
+ return false;
+ }
+
+ if (*s == expected)
+ return true;
+
+ std::cerr << "expected='" << expected << "'; actual='" << *s << "' "
+ << "(sheet=" << sh.get_index() << "; row=" << row << "; column=" << col << ")"
+ << std::endl;
+
+ return false;
+ };
+
+ {
+ const spreadsheet::sheet* sheet = doc->get_sheet("Text Properties");
+ assert(sheet);
+
+ ss::row_t row = 0;
+ ss::col_t col = 0;
+
+ // A1 - unformatted
+ assert(check_cell_text(*sheet, row, col, "Normal Text"));
+ assert(check_cell_bold(*sheet, row, col, false));
+ assert(check_cell_italic(*sheet, row, col, false));
+
+ // A2 - bold
+ row = 1;
+ assert(check_cell_text(*sheet, row, col, "Bold Text"));
+ assert(check_cell_bold(*sheet, row, col, true));
+ assert(check_cell_italic(*sheet, row, col, false));
+
+ // A3 - italic
+ row = 2;
+ assert(check_cell_text(*sheet, row, col, "Italic Text"));
+ assert(check_cell_bold(*sheet, row, col, false));
+ assert(check_cell_italic(*sheet, row, col, true));
+
+ // A4 - bold and italic
+ row = 3;
+ assert(check_cell_text(*sheet, row, col, "Bold and Italic Text"));
+ assert(check_cell_bold(*sheet, row, col, true));
+ assert(check_cell_italic(*sheet, row, col, true));
+
+ // A5 - bold and italic mixed. Excel creates format runs even for
+ // non-formatted segments.
+ row = 4;
+ assert(check_cell_text(*sheet, row, col, "Bold and Italic mixed"));
+
+ std::size_t si = sheet->get_string_identifier(row, col);
+ const ss::format_runs_t* runs = doc->get_shared_strings().get_format_runs(si);
+ assert(runs);
+ assert(runs->size() == 4u); // only 0 and 2 are formatted
+
+ // Bold and ...
+ // ^^^^
+ assert(runs->at(0).pos == 0);
+ assert(runs->at(0).size == 4);
+ assert(runs->at(0).bold);
+ assert(!runs->at(0).italic);
+
+ // Bold and Italic
+ // ^^^^^^
+ assert(runs->at(2).pos == 9);
+ assert(runs->at(2).size == 6);
+ assert(!runs->at(2).bold);
+ assert(runs->at(2).italic);
+
+ // A6 - xlsx stores 2 format runs; one for "non-bold" and one for " part"
+ row = 5;
+ assert(check_cell_text(*sheet, row, col, "Bold base with non-bold part"));
+ assert(check_cell_bold(*sheet, row, col, true));
+ assert(check_cell_italic(*sheet, row, col, false));
+
+ si = sheet->get_string_identifier(row, col);
+ runs = doc->get_shared_strings().get_format_runs(si);
+ assert(runs);
+ assert(runs->size() == 2u);
+
+ assert(runs->at(0).pos == 15);
+ assert(runs->at(0).size == 8);
+ assert(!runs->at(0).bold);
+
+ assert(runs->at(1).pos == 23);
+ assert(runs->at(1).size == 5);
+ assert(runs->at(1).bold);
+
+ // A7 - TODO: check format
+ row = 6;
+ assert(check_cell_text(*sheet, row, col, "Only partially underlined"));
+
+ // A8
+ row = 7;
+ assert(check_cell_text(*sheet, row, col, "All Underlined"));
+ const ss::font_t* font = get_font(*sheet, row, col);
+ assert(font->underline_style);
+ assert(*font->underline_style == ss::underline_t::single_line);
+
+ // A9
+ row = 8;
+ assert(check_cell_text(*sheet, row, col, "Bold and underlined"));
+ assert(check_cell_bold(*sheet, row, col, true));
+ font = get_font(*sheet, row, col);
+ assert(font->underline_style);
+ assert(*font->underline_style == ss::underline_t::single_line);
+
+ row = 9;
+ assert(check_cell_text(*sheet, row, col, "All Strikethrough"));
+ // TODO: check for strikethrough in cell
+
+ // A11:A15 - TODO: check format
+ row = 10;
+ assert(check_cell_text(*sheet, row, col, "Partial strikethrough"));
+ row = 11;
+ assert(check_cell_text(*sheet, row, col, "Superscript"));
+ row = 12;
+ assert(check_cell_text(*sheet, row, col, "Subscript"));
+ row = 13;
+ assert(check_cell_text(*sheet, row, col, "x2 + y2 = 102"));
+ row = 14;
+ assert(check_cell_text(*sheet, row, col, "xi = yi + zi"));
+ }
+
+ {
+ const spreadsheet::sheet* sheet = doc->get_sheet("Fonts");
+ assert(sheet);
+
+ struct check
+ {
+ ss::row_t row;
+ std::string_view font_name;
+ double font_unit;
+ };
+
+ check checks[] = {
+ { 0, "Calibri Light", 12.0 },
+ { 1, "Arial", 18.0 },
+ { 2, "Times New Roman", 14.0 },
+ { 3, "Consolas", 9.0 },
+ { 4, "Bookman Old Style", 20.0 },
+ };
+
+ for (const auto& c : checks)
+ {
+ std::size_t xf = sheet->get_cell_format(c.row, 0);
+ const ss::cell_format_t* cell_format = styles_pool.get_cell_format(xf);
+ assert(cell_format);
+ const ss::font_t* font = styles_pool.get_font(cell_format->font);
+ assert(font);
+ std::cout << "row: " << c.row << std::endl;
+ std::cout << " font-name: expected='" << c.font_name << "' vs actual='" << (font->name ? *font->name : "(not set)") << "'" << std::endl;
+ assert(font->name == c.font_name);
+ std:: cout << " font-size: expected=" << c.font_unit << " vs actual=" << (font->size ? *font->size : -1) << std::endl;
+ assert(font->size == c.font_unit);
+
+ // Columns A and B should have the same font.
+ xf = sheet->get_cell_format(c.row, 1);
+ cell_format = styles_pool.get_cell_format(xf);
+ assert(cell_format);
+ font = styles_pool.get_font(cell_format->font);
+ assert(font);
+ assert(font->name == c.font_name);
+ assert(font->size == c.font_unit);
+ }
+ }
+
+ {
+ const spreadsheet::sheet* sheet = doc->get_sheet("Mixed Fonts");
+ assert(sheet);
+
+ // A1
+ ss::row_t row = 0;
+ ss::col_t col = 0;
+ assert(check_cell_text(*sheet, row, col, "C++ has class and struct as keywords."));
+
+ // Base cell has Serif 12-pt font applied
+ auto xf = sheet->get_cell_format(row, col);
+ const ss::cell_format_t* fmt = styles_pool.get_cell_format(xf);
+ assert(fmt);
+ const ss::font_t* font = styles_pool.get_font(fmt->font);
+ assert(font);
+ assert(font->name == "Calibri");
+ assert(font->size == 11.0);
+
+ // Two segments has Liberation Mono font applied (runs 0 and 2).
+ std::size_t si = sheet->get_string_identifier(row, col);
+ const ss::format_runs_t* runs = doc->get_shared_strings().get_format_runs(si);
+ assert(runs);
+ assert(runs->size() == 4u);
+
+ // C++ has class ...
+ // ^^^^^
+ assert(runs->at(0).pos == 8);
+ assert(runs->at(0).size == 5);
+ assert(runs->at(0).font == "Liberation Mono");
+
+ // class and struct
+ // ^^^^^
+ assert(runs->at(1).pos == 13);
+ assert(runs->at(1).size == 5);
+ assert(runs->at(1).font == "Calibri");
+
+ // ... and struct as ...
+ // ^^^^^^
+ assert(runs->at(2).pos == 18);
+ assert(runs->at(2).size == 6);
+ assert(runs->at(2).font == "Liberation Mono");
+
+ // ... struct as keywords.
+ // ^^^^^^^^^^^^^
+ assert(runs->at(3).pos == 24);
+ assert(runs->at(3).size == 13);
+ assert(runs->at(3).font == "Calibri");
+
+ // A2
+ row = 1;
+ assert(check_cell_text(*sheet, row, col, "Text with 12-point font, 24-point font, and 36-point font mixed."));
+ si = sheet->get_string_identifier(row, col);
+ runs = doc->get_shared_strings().get_format_runs(si);
+ assert(runs);
+ assert(runs->size() == 9u);
+
+ // with 12-point font, ...
+ // ^^
+ assert(runs->at(0).pos == 10);
+ assert(runs->at(0).size == 2);
+ assert(runs->at(0).font_size == 12.0f);
+ assert(runs->at(0).color == ss::color_t(0xFF, 0xFF, 0, 0)); // red
+
+ // with 12-point font, ...
+ // ^^^^^^
+ assert(runs->at(1).pos == 12);
+ assert(runs->at(1).size == 6);
+ assert(runs->at(1).font_size == 12.0f);
+
+ // 24-point font,
+ // ^^
+ assert(runs->at(3).pos == 25);
+ assert(runs->at(3).size == 2);
+ assert(runs->at(3).font_size == 24.0f);
+ assert(runs->at(3).color == ss::color_t(0xFF, 0xFF, 0, 0)); // red
+
+ // 24-point font,
+ // ^^^^^^
+ assert(runs->at(4).pos == 27);
+ assert(runs->at(4).size == 6);
+ assert(runs->at(4).font_size == 24.0f);
+
+ // and 36-point font
+ // ^^
+ assert(runs->at(6).pos == 44);
+ assert(runs->at(6).size == 2);
+ assert(runs->at(6).font_size == 36.0f);
+ assert(runs->at(6).color == ss::color_t(0xFF, 0xFF, 0, 0)); // red
+
+ // and 36-point font
+ // ^^^^^^
+ assert(runs->at(7).pos == 46);
+ assert(runs->at(7).size == 6);
+ assert(runs->at(7).font_size == 36.0f);
+ }
+}
+
+void test_xlsx_pivot_two_pivot_caches()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ std::string path(SRCDIR"/test/xlsx/pivot-table/two-pivot-caches.xlsx");
+
+ ss::document doc{{1048576, 16384}};
+ ss::import_factory factory(doc);
+ orcus_xlsx app(&factory);
+ app.set_config(test_config);
+
+ app.read_file(path.c_str());
+
+ const ss::pivot_collection& pc = doc.get_pivot_collection();
+ assert(pc.get_cache_count() == 2);
+
+ // B2:C6 on sheet 'Data'.
+ const ss::pivot_cache* cache = get_pivot_cache(pc, "Data", "B2:C6");
+ assert(cache);
+ assert(cache->get_field_count() == 2);
+
+ // Test the content of this cache.
+ const ss::pivot_cache_field_t* fld = cache->get_field(0);
+ assert(fld);
+ assert(fld->name == "F1");
+
+ {
+ // This field should contain 4 string items 'A', 'B', 'C' and 'D'.
+ std::set<ss::pivot_cache_item_t> expected =
+ {
+ std::string_view{"A"},
+ std::string_view{"B"},
+ std::string_view{"C"},
+ std::string_view{"D"},
+ };
+
+ std::set<ss::pivot_cache_item_t> actual(fld->items.begin(), fld->items.end());
+ assert(actual == expected);
+ }
+
+ fld = cache->get_field(1);
+ assert(fld);
+ assert(fld->name == "D1");
+
+ // This is a pure numeric field with min and max values specified.
+ assert(fld->min_value && *fld->min_value == 1.0);
+ assert(fld->max_value && *fld->max_value == 4.0);
+ assert(fld->items.empty());
+
+ {
+ // Check the records.
+ ss::pivot_cache::records_type expected =
+ {
+ { std::size_t(0), 1.0 },
+ { std::size_t(1), 2.0 },
+ { std::size_t(2), 3.0 },
+ { std::size_t(3), 4.0 },
+ };
+
+ assert(expected == cache->get_all_records());
+ }
+
+ // F10:G14 on the same sheet.
+ cache = get_pivot_cache(pc, "Data", "F10:G14");
+ assert(cache);
+ assert(cache->get_field_count() == 2);
+
+ // This field should contain 4 string items 'W', 'X', 'Y' and 'Z' but not
+ // necessarily in this order.
+ fld = cache->get_field(0);
+ assert(fld);
+ assert(fld->name == "F2");
+
+ {
+ std::set<ss::pivot_cache_item_t> expected =
+ {
+ std::string_view{"W"},
+ std::string_view{"X"},
+ std::string_view{"Y"},
+ std::string_view{"Z"},
+ };
+
+ std::set<ss::pivot_cache_item_t> actual;
+ actual.insert(fld->items.begin(), fld->items.end());
+ assert(actual == expected);
+ }
+
+ fld = cache->get_field(1);
+ assert(fld);
+ assert(fld->name == "D2");
+
+ // This is a pure numeric field with min and max values specified.
+ assert(fld->min_value && *fld->min_value == 1.0);
+ assert(fld->max_value && *fld->max_value == 4.0);
+ assert(fld->items.empty());
+
+ {
+ // Check the records.
+ ss::pivot_cache::records_type expected =
+ {
+ { std::size_t(0), 4.0 },
+ { std::size_t(1), 3.0 },
+ { std::size_t(2), 2.0 },
+ { std::size_t(3), 1.0 },
+ };
+
+ assert(expected == cache->get_all_records());
+ }
+}
+
+void test_xlsx_pivot_mixed_type_field()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ std::string path(SRCDIR"/test/xlsx/pivot-table/mixed-type-field.xlsx");
+
+ ss::document doc{{1048576, 16384}};
+ ss::import_factory factory(doc);
+ orcus_xlsx app(&factory);
+ app.set_config(test_config);
+
+ app.read_file(path.c_str());
+
+ const ss::pivot_collection& pc = doc.get_pivot_collection();
+ assert(pc.get_cache_count() == 2);
+
+ // B2:C7 on sheet 'Data'.
+ const ss::pivot_cache* cache = get_pivot_cache(pc, "Data", "B2:C7");
+ assert(cache);
+ assert(cache->get_field_count() == 2);
+
+ // 1st field
+ const ss::pivot_cache_field_t* fld = cache->get_field(0);
+ assert(fld);
+ assert(fld->name == "F1");
+ assert(fld->min_value && fld->min_value == 1.0);
+ assert(fld->max_value && fld->max_value == 2.0);
+
+ {
+ // This field should contain 3 string items 'A', 'B', 'C' and 2 numeric
+ // items 1 and 2.
+ std::set<ss::pivot_cache_item_t> expected =
+ {
+ std::string_view{"A"},
+ std::string_view{"B"},
+ std::string_view{"C"},
+ 1.0,
+ 2.0,
+ };
+
+ std::set<ss::pivot_cache_item_t> actual(fld->items.begin(), fld->items.end());
+ assert(actual == expected);
+ }
+
+ // 2nd field should be a nuemric field between 1.1 and 1.5.
+ fld = cache->get_field(1);
+ assert(fld);
+ assert(fld->name == "V1");
+ assert(fld->items.empty());
+
+ assert(fld->min_value);
+ assert(std::round(*fld->min_value * 100.0) == 110.0); // min = 1.1
+ assert(fld->max_value);
+ assert(std::round(*fld->max_value * 100.0) == 150.0); // max = 1.5
+
+ {
+ // Check the records.
+ ss::pivot_cache::records_type expected =
+ {
+ { size_t(0), 1.1 },
+ { size_t(1), 1.2 },
+ { size_t(2), 1.3 },
+ { size_t(3), 1.4 },
+ { size_t(4), 1.5 },
+ };
+
+ assert(expected == cache->get_all_records());
+ }
+
+ // B10:C17 on sheet 'Data'.
+ cache = get_pivot_cache(pc, "Data", "B10:C17");
+ assert(cache);
+ assert(cache->get_field_count() == 2);
+
+ // 1st field
+ fld = cache->get_field(0);
+ assert(fld);
+ assert(fld->name == "F2");
+ assert(fld->min_value && fld->min_value == 1.0);
+ assert(fld->max_value && fld->max_value == 5.0);
+
+ {
+ // This field should contain 3 string items 'A', 'B', 'C' and 4 numeric
+ // items 1, 2, 3.5 and 5.
+ std::set<ss::pivot_cache_item_t> expected =
+ {
+ std::string_view{"A"},
+ std::string_view{"B"},
+ std::string_view{"C"},
+ 1.0,
+ 2.0,
+ 3.5,
+ 5.0,
+ };
+
+ std::set<ss::pivot_cache_item_t> actual;
+ actual.insert(fld->items.begin(), fld->items.end());
+ assert(actual == expected);
+ }
+
+ // 2nd field
+ fld = cache->get_field(1);
+ assert(fld);
+ assert(fld->name == "V2");
+ assert(fld->items.empty());
+
+ assert(fld->min_value);
+ assert(std::round(*fld->min_value * 100.0) == 110.0); // min = 1.1
+ assert(fld->max_value);
+ assert(std::round(*fld->max_value * 100.0) == 220.0); // max = 2.2
+
+ {
+ // Check the records.
+ ss::pivot_cache::records_type expected =
+ {
+ { std::size_t(0), 1.1 },
+ { std::size_t(1), 1.2 },
+ { std::size_t(2), 1.3 },
+ { std::size_t(3), 1.4 },
+ { std::size_t(4), 1.5 },
+ { std::size_t(5), 1.8 },
+ { std::size_t(6), 2.2 },
+ };
+
+ assert(expected == cache->get_all_records());
+ }
+}
+
+void test_xlsx_pivot_group_field()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ std::string path(SRCDIR"/test/xlsx/pivot-table/group-field.xlsx");
+
+ ss::document doc{{1048576, 16384}};
+ ss::import_factory factory(doc);
+ orcus_xlsx app(&factory);
+ app.set_config(test_config);
+
+ app.read_file(path.c_str());
+
+ const ss::pivot_collection& pc = doc.get_pivot_collection();
+ assert(pc.get_cache_count() == 1);
+
+ // B2:C6 on sheet 'Sheet1'.
+ const ss::pivot_cache* cache = get_pivot_cache(pc, "Sheet1", "B2:C6");
+ assert(cache);
+ assert(cache->get_field_count() == 3);
+
+ // First field is labeled 'Key'.
+ const ss::pivot_cache_field_t* fld = cache->get_field(0);
+ assert(fld);
+ assert(fld->name == "Key");
+
+ {
+ // This field should contain 4 string items 'A', 'B', 'C' and 'D'.
+ std::set<ss::pivot_cache_item_t> expected =
+ {
+ std::string_view{"A"},
+ std::string_view{"B"},
+ std::string_view{"C"},
+ std::string_view{"D"},
+ };
+
+ std::set<ss::pivot_cache_item_t> actual(fld->items.begin(), fld->items.end());
+ assert(actual == expected);
+ }
+
+ // 2nd field is 'Value' and is a numeric field.
+ fld = cache->get_field(1);
+ assert(fld);
+ assert(fld->name == "Value");
+ assert(fld->items.empty());
+
+ assert(fld->min_value);
+ assert(*fld->min_value == 1.0);
+ assert(fld->max_value);
+ assert(*fld->max_value == 4.0);
+
+ // 3rd field is a group field labeled 'Key2'.
+ fld = cache->get_field(2);
+ assert(fld);
+ assert(fld->name == "Key2");
+ assert(fld->items.empty());
+
+ const ss::pivot_cache_group_data_t* gd = fld->group_data.get();
+ assert(gd);
+ assert(gd->base_field == 0);
+ assert(gd->items.size() == 2);
+
+ {
+ // It should have two items - Group1 and Group2.
+ std::set<ss::pivot_cache_item_t> expected =
+ {
+ std::string_view{"Group1"},
+ std::string_view{"Group2"},
+ };
+
+ std::set<ss::pivot_cache_item_t> actual;
+ actual.insert(gd->items.begin(), gd->items.end());
+ assert(actual == expected);
+ }
+
+ // Group1 should group 'A' and 'B' from the 1st field, and Group2 should
+ // group 'C' and 'D'.
+
+ ss::pivot_cache_indices_t expected_group = { 0, 0, 1, 1 };
+ assert(gd->base_to_group_indices == expected_group);
+
+ {
+ // Check the records.
+ ss::pivot_cache::records_type expected =
+ {
+ { std::size_t(0), 1.0 },
+ { std::size_t(1), 2.0 },
+ { std::size_t(2), 3.0 },
+ { std::size_t(3), 4.0 },
+ };
+
+ assert(expected == cache->get_all_records());
+ }
+}
+
+void test_xlsx_pivot_group_by_numbers()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ std::string path(SRCDIR"/test/xlsx/pivot-table/group-by-numbers.xlsx");
+
+ ss::document doc{{1048576, 16384}};
+ ss::import_factory factory(doc);
+ orcus_xlsx app(&factory);
+ app.set_config(test_config);
+
+ app.read_file(path.c_str());
+
+ const ss::pivot_collection& pc = doc.get_pivot_collection();
+ assert(pc.get_cache_count() == 1);
+
+ // B2:C13 on sheet 'Sheet1'.
+ const ss::pivot_cache* cache = get_pivot_cache(pc, "Sheet1", "B2:C13");
+ assert(cache);
+ assert(cache->get_field_count() == 2);
+
+ // First field is a field with numeric grouping with intervals.
+ const ss::pivot_cache_field_t* fld = cache->get_field(0);
+ assert(fld);
+ assert(fld->name == "V1");
+
+ // There should be 11 raw values ranging from 9.78E-2 to 9.82.
+ assert(fld->items.size() == 11);
+ assert(fld->min_value);
+ assert(fld->max_value);
+ assert(std::round(*fld->min_value*10000.0) == 978.00); // 9.78E-2
+ assert(std::round(*fld->max_value*100.0) == 982.00); // 9.82
+
+ // We'll just make sure that all 11 items are of numeric type.
+
+ for (const auto& item : fld->items)
+ {
+ assert(item.type == ss::pivot_cache_item_t::item_type::numeric);
+ assert(*fld->min_value <= std::get<double>(item.value));
+ assert(std::get<double>(item.value) <= *fld->max_value);
+ }
+
+ // This field is also gruop field with 7 numeric intervals of width 2.
+ assert(fld->group_data);
+ const ss::pivot_cache_group_data_t& grp = *fld->group_data;
+ assert(grp.items.size() == 7);
+
+ ss::pivot_cache_items_t expected =
+ {
+ std::string_view{"<0"},
+ std::string_view{"0-2"},
+ std::string_view{"2-4"},
+ std::string_view{"4-6"},
+ std::string_view{"6-8"},
+ std::string_view{"8-10"},
+ std::string_view{">10"},
+ };
+
+ assert(grp.items == expected);
+
+ // Check the numeric range properties.
+ assert(grp.range_grouping);
+ assert(grp.range_grouping->group_by == ss::pivot_cache_group_by_t::range);
+ assert(!grp.range_grouping->auto_start);
+ assert(!grp.range_grouping->auto_end);
+ assert(grp.range_grouping->start == 0.0);
+ assert(grp.range_grouping->end == 10.0);
+ assert(grp.range_grouping->interval == 2.0);
+
+ // Test the 2nd field. This field is purely a numeric field with no
+ // discrete items.
+
+ fld = cache->get_field(1);
+ assert(fld);
+ assert(fld->name == "V2");
+ assert(!fld->group_data);
+ assert(fld->items.empty());
+ assert(fld->min_value);
+ assert(fld->min_value == 1.0);
+ assert(fld->max_value);
+ assert(fld->max_value == 11.0);
+}
+
+void test_xlsx_pivot_group_by_dates()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ std::string path(SRCDIR"/test/xlsx/pivot-table/group-by-dates.xlsx");
+
+ ss::document doc{{1048576, 16384}};
+ ss::import_factory factory(doc);
+ orcus_xlsx app(&factory);
+ app.set_config(test_config);
+
+ app.read_file(path.c_str());
+
+ const ss::pivot_collection& pc = doc.get_pivot_collection();
+ assert(pc.get_cache_count() == 1);
+
+ const ss::pivot_cache* cache = get_pivot_cache(pc, "Sheet1", "B2:C14");
+ assert(cache);
+
+ // First field is a date field.
+ const ss::pivot_cache_field_t* fld = cache->get_field(0);
+ assert(fld);
+ assert(fld->name == "Date");
+
+ // Minimum and maximum date values.
+ assert(fld->min_date);
+ assert(*fld->min_date == date_time_t(2014, 1, 1));
+ assert(fld->max_date);
+ assert(*fld->max_date == date_time_t(2014, 12, 2));
+
+ ss::pivot_cache_items_t expected =
+ {
+ date_time_t(2014, 1, 1),
+ date_time_t(2014, 2, 1),
+ date_time_t(2014, 3, 1),
+ date_time_t(2014, 4, 1),
+ date_time_t(2014, 5, 1),
+ date_time_t(2014, 6, 1),
+ date_time_t(2014, 7, 1),
+ date_time_t(2014, 8, 1),
+ date_time_t(2014, 9, 1),
+ date_time_t(2014, 10, 1),
+ date_time_t(2014, 11, 1),
+ date_time_t(2014, 12, 1),
+ };
+
+ ss::pivot_cache_items_t actual(fld->items.begin(), fld->items.end());
+ assert(actual == expected);
+
+ // This field is grouped by month.
+
+ assert(fld->group_data);
+ const ss::pivot_cache_group_data_t& gd = *fld->group_data;
+
+ expected =
+ {
+ std::string_view{"<1/1/2014"},
+ std::string_view{"Jan"},
+ std::string_view{"Feb"},
+ std::string_view{"Mar"},
+ std::string_view{"Apr"},
+ std::string_view{"May"},
+ std::string_view{"Jun"},
+ std::string_view{"Jul"},
+ std::string_view{"Aug"},
+ std::string_view{"Sep"},
+ std::string_view{"Oct"},
+ std::string_view{"Nov"},
+ std::string_view{"Dec"},
+ std::string_view{">12/2/2014"},
+ };
+
+ assert(gd.items == expected);
+
+ assert(gd.range_grouping);
+ assert(gd.range_grouping->group_by == ss::pivot_cache_group_by_t::months);
+
+ assert(gd.range_grouping->start_date == date_time_t(2014,1,1));
+ assert(gd.range_grouping->end_date == date_time_t(2014,12,2));
+
+ // The 2nd field is a simple numeric field.
+ fld = cache->get_field(1);
+ assert(fld);
+ assert(fld->name == "Value");
+ assert(fld->min_value == 1.0);
+ assert(fld->max_value == 12.0);
+
+ // The 3rd field is an extra group field.
+ fld = cache->get_field(2);
+ assert(fld);
+ assert(fld->name == "Quarters");
+ assert(fld->group_data);
+ const ss::pivot_cache_group_data_t& gd_qtrs = *fld->group_data;
+ assert(gd_qtrs.base_field == 0);
+
+ assert(gd_qtrs.range_grouping);
+ assert(gd_qtrs.range_grouping->group_by == ss::pivot_cache_group_by_t::quarters);
+ assert(gd_qtrs.range_grouping->start_date == date_time_t(2014,1,1));
+ assert(gd_qtrs.range_grouping->end_date == date_time_t(2014,12,2));
+
+ expected =
+ {
+ std::string_view{"<1/1/2014"},
+ std::string_view{"Qtr1"},
+ std::string_view{"Qtr2"},
+ std::string_view{"Qtr3"},
+ std::string_view{"Qtr4"},
+ std::string_view{">12/2/2014"},
+ };
+
+ assert(gd_qtrs.items == expected);
+}
+
+void test_xlsx_pivot_error_values()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ std::string path(SRCDIR"/test/xlsx/pivot-table/error-values.xlsx");
+
+ ss::document doc{{1048576, 16384}};
+ ss::import_factory factory(doc);
+ orcus_xlsx app(&factory);
+ app.set_config(test_config);
+
+ app.read_file(path.c_str());
+
+ const ss::pivot_collection& pc = doc.get_pivot_collection();
+ assert(pc.get_cache_count() == 1);
+
+ const ss::pivot_cache* cache = get_pivot_cache(pc, "Sheet1", "B2:C6");
+ assert(cache);
+
+ const ss::pivot_cache_field_t* fld = cache->get_field(0);
+
+ assert(fld);
+ assert(fld->name == "F1");
+
+ // This field should contain 4 string items 'A', 'B', 'C' and 'D'.
+ std::set<ss::pivot_cache_item_t> expected =
+ {
+ std::string_view{"A"},
+ std::string_view{"B"},
+ std::string_view{"C"},
+ std::string_view{"D"},
+ };
+
+ std::set<ss::pivot_cache_item_t> actual(fld->items.begin(), fld->items.end());
+ assert(actual == expected);
+
+ fld = cache->get_field(1);
+
+ assert(fld);
+ assert(fld->name == "F2");
+
+ expected =
+ {
+ spreadsheet::error_value_t::div0,
+ spreadsheet::error_value_t::name,
+ };
+
+ actual.clear();
+ actual.insert(fld->items.begin(), fld->items.end());
+
+ assert(actual == expected);
+}
+
+void test_xlsx_view_cursor_per_sheet()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ std::string path(SRCDIR"/test/xlsx/view/cursor-per-sheet.xlsx");
+
+ ss::document doc{{1048576, 16384}};
+ ss::view view(doc);
+ ss::import_factory factory(doc, view);
+ orcus_xlsx app(&factory);
+ app.set_config(test_config);
+
+ app.read_file(path.c_str());
+
+ // Sheet3 should be active.
+ assert(view.get_active_sheet() == 2);
+
+ const ss::sheet_view* sv = view.get_sheet_view(0);
+ assert(sv);
+
+ ss::iface::import_reference_resolver* resolver =
+ factory.get_reference_resolver(ss::formula_ref_context_t::global);
+ assert(resolver);
+
+ // On Sheet1, the cursor should be set to C4.
+ ss::range_t expected = to_rc_range(resolver->resolve_range("C4"));
+ ss::range_t actual = sv->get_selection(ss::sheet_pane_t::top_left);
+ assert(expected == actual);
+
+ sv = view.get_sheet_view(1);
+ assert(sv);
+
+ // On Sheet2, the cursor should be set to D8.
+ expected = to_rc_range(resolver->resolve_range("D8"));
+ actual = sv->get_selection(ss::sheet_pane_t::top_left);
+ assert(expected == actual);
+
+ sv = view.get_sheet_view(2);
+ assert(sv);
+
+ // On Sheet3, the cursor should be set to D2.
+ expected = to_rc_range(resolver->resolve_range("D2"));
+ actual = sv->get_selection(ss::sheet_pane_t::top_left);
+ assert(expected == actual);
+
+ sv = view.get_sheet_view(3);
+ assert(sv);
+
+ // On Sheet4, the cursor should be set to C5:E8.
+ expected = to_rc_range(resolver->resolve_range("C5:E8"));
+ actual = sv->get_selection(ss::sheet_pane_t::top_left);
+ assert(expected == actual);
+}
+
+struct expected_selection
+{
+ ss::sheet_pane_t pane;
+ std::string_view sel;
+};
+
+void test_xlsx_view_cursor_split_pane()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ std::string path(SRCDIR"/test/xlsx/view/cursor-split-pane.xlsx");
+
+ ss::document doc{{1048576, 16384}};
+ ss::view view(doc);
+ ss::import_factory factory(doc, view);
+ orcus_xlsx app(&factory);
+ app.set_config(test_config);
+
+ app.read_file(path.c_str());
+
+ ss::iface::import_reference_resolver* resolver =
+ factory.get_reference_resolver(ss::formula_ref_context_t::global);
+ assert(resolver);
+
+ // Sheet4 should be active.
+ assert(view.get_active_sheet() == 3);
+
+ const ss::sheet_view* sv = view.get_sheet_view(0);
+ assert(sv);
+
+ // On Sheet1, the view is split into 4.
+ assert(sv->get_active_pane() == ss::sheet_pane_t::bottom_left);
+ assert(sv->get_split_pane().hor_split == 5190.0);
+ assert(sv->get_split_pane().ver_split == 1800.0);
+
+ {
+ ss::address_t expected = to_rc_address(resolver->resolve_address("F6"));
+ ss::address_t actual = sv->get_split_pane().top_left_cell;
+ assert(expected == actual);
+ }
+
+ std::vector<expected_selection> expected_selections =
+ {
+ { ss::sheet_pane_t::top_left, "E4" },
+ { ss::sheet_pane_t::top_right, "J2" },
+ { ss::sheet_pane_t::bottom_left, "A8" },
+ { ss::sheet_pane_t::bottom_right, "J17" },
+ };
+
+ for (const expected_selection& es : expected_selections)
+ {
+ // cursor in the top-left pane.
+ ss::range_t expected = to_rc_range(resolver->resolve_range(es.sel));
+ ss::range_t actual = sv->get_selection(es.pane);
+ assert(expected == actual);
+ }
+
+ sv = view.get_sheet_view(1);
+ assert(sv);
+
+ // Sheet2 is also split into 4 views.
+ assert(sv->get_active_pane() == ss::sheet_pane_t::top_right);
+ assert(sv->get_split_pane().hor_split == 5190.0);
+ assert(sv->get_split_pane().ver_split == 2400.0);
+
+ {
+ ss::address_t expected = to_rc_address(resolver->resolve_address("F8"));
+ ss::address_t actual = sv->get_split_pane().top_left_cell;
+ assert(expected == actual);
+ }
+
+ expected_selections =
+ {
+ { ss::sheet_pane_t::top_left, "C2:C6" },
+ { ss::sheet_pane_t::top_right, "H2:L2" },
+ { ss::sheet_pane_t::bottom_left, "B18:C23" },
+ { ss::sheet_pane_t::bottom_right, "H11:J13" },
+ };
+
+ for (const expected_selection& es : expected_selections)
+ {
+ // cursor in the top-left pane.
+ ss::range_t expected = to_rc_range(resolver->resolve_range(es.sel));
+ ss::range_t actual = sv->get_selection(es.pane);
+ assert(expected == actual);
+ }
+
+ sv = view.get_sheet_view(2);
+ assert(sv);
+
+ // Sheet3 is horizontally split into top and bottom views (top-left and bottom-left).
+ assert(sv->get_active_pane() == ss::sheet_pane_t::bottom_left);
+ assert(sv->get_split_pane().hor_split == 0.0);
+ assert(sv->get_split_pane().ver_split == 1500.0);
+
+ {
+ ss::address_t expected = to_rc_address(resolver->resolve_address("A5"));
+ ss::address_t actual = sv->get_split_pane().top_left_cell;
+ assert(expected == actual);
+ }
+
+ expected_selections =
+ {
+ { ss::sheet_pane_t::top_left, "D2" },
+ { ss::sheet_pane_t::bottom_left, "C9" },
+ };
+
+ for (const expected_selection& es : expected_selections)
+ {
+ // cursor in the top-left pane.
+ ss::range_t expected = to_rc_range(resolver->resolve_range(es.sel));
+ ss::range_t actual = sv->get_selection(es.pane);
+ assert(expected == actual);
+ }
+
+ sv = view.get_sheet_view(3);
+ assert(sv);
+
+ // Sheet4 is vertically split into left and right views (top-left and top-right).
+ assert(sv->get_active_pane() == ss::sheet_pane_t::top_left);
+ assert(sv->get_split_pane().hor_split == 4230.0);
+ assert(sv->get_split_pane().ver_split == 0.0);
+
+ {
+ ss::address_t expected = to_rc_address(resolver->resolve_address("E1"));
+ ss::address_t actual = sv->get_split_pane().top_left_cell;
+ assert(expected == actual);
+ }
+
+ expected_selections =
+ {
+ { ss::sheet_pane_t::top_left, "B18" },
+ { ss::sheet_pane_t::top_right, "I11" },
+ };
+
+ for (const expected_selection& es : expected_selections)
+ {
+ // cursor in the top-left pane.
+ ss::range_t expected = to_rc_range(resolver->resolve_range(es.sel));
+ ss::range_t actual = sv->get_selection(es.pane);
+ assert(expected == actual);
+ }
+}
+
+void test_xlsx_view_frozen_pane()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ std::string path(SRCDIR"/test/xlsx/view/frozen-pane.xlsx");
+
+ ss::document doc{{1048576, 16384}};
+ ss::view view(doc);
+ ss::import_factory factory(doc, view);
+ orcus_xlsx app(&factory);
+ app.set_config(test_config);
+
+ app.read_file(path.c_str());
+
+ ss::iface::import_reference_resolver* resolver =
+ factory.get_reference_resolver(ss::formula_ref_context_t::global);
+ assert(resolver);
+
+ // Sheet3 should be active.
+ assert(view.get_active_sheet() == 2);
+
+ const ss::sheet_view* sv = view.get_sheet_view(0);
+ assert(sv);
+
+ {
+ // Sheet1 is vertically frozen between columns A and B.
+ const ss::frozen_pane_t& fp = sv->get_frozen_pane();
+ assert(fp.top_left_cell == to_rc_address(resolver->resolve_address("B1")));
+ assert(fp.visible_columns == 1);
+ assert(fp.visible_rows == 0);
+ assert(sv->get_active_pane() == ss::sheet_pane_t::top_right);
+ }
+
+ sv = view.get_sheet_view(1);
+ assert(sv);
+
+ {
+ // Sheet2 is horizontally frozen between rows 1 and 2.
+ const ss::frozen_pane_t& fp = sv->get_frozen_pane();
+ assert(fp.top_left_cell == to_rc_address(resolver->resolve_address("A2")));
+ assert(fp.visible_columns == 0);
+ assert(fp.visible_rows == 1);
+ assert(sv->get_active_pane() == ss::sheet_pane_t::bottom_left);
+ }
+
+ sv = view.get_sheet_view(2);
+ assert(sv);
+
+ {
+ // Sheet3 is frozen both horizontally and vertically.
+ const ss::frozen_pane_t& fp = sv->get_frozen_pane();
+ assert(fp.top_left_cell == to_rc_address(resolver->resolve_address("E9")));
+ assert(fp.visible_columns == 4);
+ assert(fp.visible_rows == 8);
+ assert(sv->get_active_pane() == ss::sheet_pane_t::bottom_right);
+ }
+}
+
+void test_xlsx_doc_structure_unordered_sheet_positions()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ std::string_view path(SRCDIR"/test/xlsx/doc-structure/unordered-sheet-positions.xlsx");
+ std::unique_ptr<ss::document> doc = load_doc(path);
+
+ // There should be 9 sheets named S1, S2, ..., S9.
+ std::vector<std::string_view> expected_sheet_names = {
+ "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9"
+ };
+
+ assert(doc->get_sheet_count() == expected_sheet_names.size());
+
+ ss::sheet_t n = expected_sheet_names.size();
+ for (ss::sheet_t i = 0; i < n; ++i)
+ {
+ std::string_view sheet_name = doc->get_sheet_name(i);
+ assert(sheet_name == expected_sheet_names[i]);
+ }
+}
+
+}
+
+int main()
+{
+ test_config.debug = false;
+ test_config.structure_check = true;
+
+ test_xlsx_detection();
+ test_xlsx_create_filter();
+ test_xlsx_import();
+ test_xlsx_table_autofilter();
+ test_xlsx_table();
+ test_xlsx_merged_cells();
+ test_xlsx_date_time();
+ test_xlsx_background_fill();
+ test_xlsx_number_format();
+ test_xlsx_text_alignment();
+ test_xlsx_cell_borders_single_cells();
+ test_xlsx_cell_borders_directions();
+ test_xlsx_cell_borders_colors();
+ test_xlsx_hidden_rows_columns();
+ test_xlsx_cell_properties();
+ test_xlsx_styles_direct_format();
+ test_xlsx_styles_column_styles();
+ test_xlsx_formatted_text_basic();
+
+ // pivot table
+ test_xlsx_pivot_two_pivot_caches();
+ test_xlsx_pivot_mixed_type_field();
+ test_xlsx_pivot_group_field();
+ test_xlsx_pivot_group_by_numbers();
+ test_xlsx_pivot_group_by_dates();
+ test_xlsx_pivot_error_values();
+
+ // view import
+ test_xlsx_view_cursor_per_sheet();
+ test_xlsx_view_cursor_split_pane();
+ test_xlsx_view_frozen_pane();
+
+ // document structure
+ test_xlsx_doc_structure_unordered_sheet_positions();
+
+ return EXIT_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/orcus_test_xml.cpp b/src/orcus_test_xml.cpp
new file mode 100644
index 0000000..eb6bc95
--- /dev/null
+++ b/src/orcus_test_xml.cpp
@@ -0,0 +1,226 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/sax_ns_parser.hpp"
+#include "orcus/dom_tree.hpp"
+#include "orcus/xml_namespace.hpp"
+#include "orcus/stream.hpp"
+
+#include <cstdlib>
+#include <cassert>
+#include <iostream>
+#include <sstream>
+
+using namespace orcus;
+using namespace std;
+
+class sax_handler_encoded_attrs
+{
+ std::vector<sax::parser_attribute> m_attrs;
+
+public:
+ void doctype(const sax::doctype_declaration&) {}
+
+ void start_declaration(std::string_view) {}
+
+ void end_declaration(std::string_view)
+ {
+ m_attrs.clear();
+ }
+
+ void start_element(const sax::parser_element&) {}
+
+ void end_element(const sax::parser_element&) {}
+
+ void characters(std::string_view, bool) {}
+
+ void attribute(const sax::parser_attribute& attr)
+ {
+ m_attrs.push_back(attr);
+ }
+
+ bool check(const vector<string>& expected) const
+ {
+ if (m_attrs.size() != expected.size())
+ {
+ cerr << "unexpected attribute count." << endl;
+ return false;
+ }
+
+ for (size_t i = 0, n = m_attrs.size(); i < n; ++i)
+ {
+ if (m_attrs[i].value != expected[i].c_str())
+ {
+ cerr << "expected attribute value: " << expected[i] << " actual attribute value: " << m_attrs[i].value << endl;
+ return false;
+ }
+ }
+
+ return true;
+ }
+};
+
+const char* sax_parser_test_dirs[] = {
+ SRCDIR"/test/xml/simple/",
+ SRCDIR"/test/xml/encoded-char/",
+ SRCDIR"/test/xml/default-ns/",
+ SRCDIR"/test/xml/ns-alias-1/",
+ SRCDIR"/test/xml/bom/",
+ SRCDIR"/test/xml/custom-decl-1/",
+ SRCDIR"/test/xml/cdata-1/",
+ SRCDIR"/test/xml/single-quote/",
+ SRCDIR"/test/xml/no-decl-1/",
+ SRCDIR"/test/xml/underscore-identifier/",
+ SRCDIR"/test/xml/self-closing-root/",
+ SRCDIR"/test/xml/utf8-1/",
+ SRCDIR"/test/xml/utf8-2/",
+};
+
+const char* sax_parser_parse_only_test_dirs[] = {
+ SRCDIR"/test/xml/parse-only/rss/"
+};
+
+void parse_file(dom::document_tree& tree, const char* filepath, std::string& /*strm*/)
+{
+ cout << "testing " << filepath << endl;
+ file_content content(filepath);
+ assert(!content.empty());
+
+ tree.load(content.str());
+}
+
+void test_xml_sax_parser()
+{
+ string strm;
+ size_t n = sizeof(sax_parser_test_dirs)/sizeof(sax_parser_test_dirs[0]);
+ for (size_t i = 0; i < n; ++i)
+ {
+ const char* dir = sax_parser_test_dirs[i];
+ string dir_path(dir);
+ string file = dir_path;
+ file.append("input.xml");
+
+ xmlns_repository repo;
+ xmlns_context cxt = repo.create_context();
+ dom::document_tree tree(cxt);
+ parse_file(tree, file.c_str(), strm);
+
+ // Get the compact form of the content.
+ ostringstream os;
+ tree.dump_compact(os);
+ string content = os.str();
+
+ // Load the check form.
+ file = dir_path;
+ file.append("check.txt");
+ file_content check(file.data());
+ std::string_view psource(content);
+ std::string_view pcheck = check.str();
+
+ // They must be equal, minus preceding or trailing spaces (if any).
+ assert(trim(psource) == trim(pcheck));
+ }
+}
+
+void test_xml_sax_parser_read_only()
+{
+ string strm;
+ size_t n = sizeof(sax_parser_parse_only_test_dirs)/sizeof(sax_parser_parse_only_test_dirs[0]);
+ for (size_t i = 0; i < n; ++i)
+ {
+ const char* dir = sax_parser_parse_only_test_dirs[i];
+ string dir_path(dir);
+ string file = dir_path;
+ file.append("input.xml");
+
+ xmlns_repository repo;
+ xmlns_context cxt = repo.create_context();
+ dom::document_tree tree(cxt);
+ parse_file(tree, file.c_str(), strm);
+ }
+}
+
+void test_xml_declarations()
+{
+ string strm;
+ const char* file_path = SRCDIR"/test/xml/custom-decl-1/input.xml";
+ xmlns_repository repo;
+ xmlns_context cxt = repo.create_context();
+ dom::document_tree dom(cxt);
+ parse_file(dom, file_path, strm);
+
+ // Make sure we parse the custom declaration correctly.
+ dom::const_node decl = dom.declaration("mso-application");
+ assert(decl.type() == dom::node_t::declaration);
+ assert(decl.attribute("progid") == "Excel.Sheet");
+}
+
+void test_xml_dtd()
+{
+ struct {
+ const char* file_path;
+ sax::doctype_declaration::keyword_type keyword;
+ const char* root_element;
+ const char* fpi;
+ const char* uri;
+ } tests[] = {
+ { SRCDIR"/test/xml/doctype/html.xml", sax::doctype_declaration::keyword_type::dtd_public,
+ "html", "-//W3C//DTD XHTML 1.0 Transitional//EN", "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" }
+ };
+
+ xmlns_repository repo;
+ size_t n = sizeof(tests)/sizeof(tests[0]);
+
+ for (size_t i = 0; i < n; ++i)
+ {
+ const char* file_path = tests[i].file_path;
+ string strm;
+ xmlns_context cxt = repo.create_context();
+ dom::document_tree dom(cxt);
+ parse_file(dom, file_path, strm);
+ const sax::doctype_declaration* dtd = dom.get_doctype();
+ assert(dtd);
+ assert(dtd->keyword == tests[i].keyword);
+ assert(dtd->root_element == tests[i].root_element);
+ assert(dtd->fpi == tests[i].fpi);
+ if (tests[i].uri)
+ {
+ assert(dtd->uri == tests[i].uri);
+ }
+ }
+}
+
+void test_xml_encoded_attrs()
+{
+ const char* filepath = SRCDIR"/test/xml/encoded-attrs/test1.xml";
+
+ cout << "testing " << filepath << endl;
+ file_content content(filepath);
+ assert(!content.empty());
+
+ sax_handler_encoded_attrs hdl;
+ sax_parser<sax_handler_encoded_attrs> parser(content.str(), hdl);
+ parser.parse();
+
+ vector<string> expected;
+ expected.push_back("1 & 2");
+ expected.push_back("3 & 4");
+ expected.push_back("5 & 6");
+ assert(hdl.check(expected));
+}
+
+int main()
+{
+ test_xml_sax_parser();
+ test_xml_sax_parser_read_only();
+ test_xml_declarations();
+ test_xml_dtd();
+ test_xml_encoded_attrs();
+
+ return EXIT_SUCCESS;
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/orcus_test_xml_mapped.cpp b/src/orcus_test_xml_mapped.cpp
new file mode 100644
index 0000000..16d19ec
--- /dev/null
+++ b/src/orcus_test_xml_mapped.cpp
@@ -0,0 +1,321 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/orcus_xml.hpp>
+#include <orcus/sax_ns_parser.hpp>
+#include <orcus/xml_namespace.hpp>
+#include <orcus/stream.hpp>
+#include <orcus/dom_tree.hpp>
+
+#include <orcus/spreadsheet/factory.hpp>
+#include <orcus/spreadsheet/document.hpp>
+
+#include "orcus_test_global.hpp"
+
+#include <cstdlib>
+#include <cassert>
+#include <string>
+#include <iostream>
+#include <sstream>
+#include <fstream>
+#include <vector>
+
+#include "filesystem_env.hpp"
+
+using namespace orcus;
+
+const fs::path test_base_dir(SRCDIR"/test/xml-mapped");
+
+namespace {
+
+void test_mapped_xml_import()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ struct test_case
+ {
+ const char* base_dir;
+ bool output_equals_input;
+ };
+
+ const std::vector<test_case> tests =
+ {
+ { SRCDIR"/test/xml-mapped/attribute-basic", true },
+ { SRCDIR"/test/xml-mapped/attribute-namespace", true },
+ { SRCDIR"/test/xml-mapped/attribute-namespace-2", false },
+ { SRCDIR"/test/xml-mapped/attribute-range-self-close", true },
+ { SRCDIR"/test/xml-mapped/attribute-single-element", true },
+ { SRCDIR"/test/xml-mapped/attribute-single-element-2", true },
+ { SRCDIR"/test/xml-mapped/content-basic", true },
+ { SRCDIR"/test/xml-mapped/content-namespace", false },
+ { SRCDIR"/test/xml-mapped/content-namespace-2", true },
+ { SRCDIR"/test/xml-mapped/content-namespace-3", false },
+ { SRCDIR"/test/xml-mapped/custom-labels", true },
+ { SRCDIR"/test/xml-mapped/custom-labels-2", true },
+ { SRCDIR"/test/xml-mapped/fuel-economy", true },
+ { SRCDIR"/test/xml-mapped/nested-repeats", false },
+ { SRCDIR"/test/xml-mapped/nested-repeats-2", false },
+ { SRCDIR"/test/xml-mapped/nested-repeats-3", false },
+ { SRCDIR"/test/xml-mapped/nested-repeats-4", false },
+ };
+
+ auto dump_xml_structure = [](const file_content& content, xmlns_context& cxt)
+ {
+ dom::document_tree tree(cxt);
+ tree.load(content.str());
+ std::ostringstream os;
+ tree.dump_compact(os);
+ return os.str();
+ };
+
+ const fs::path temp_output_xml = fs::temp_directory_path() / "orcus-output.xml";
+
+ std::string strm;
+
+ for (const test_case& tc : tests)
+ {
+ fs::path base_dir(tc.base_dir);
+ fs::path data_file = base_dir / "input.xml";
+ fs::path map_file = base_dir / "map.xml";
+ fs::path check_file = base_dir / "check.txt";
+
+ // Load the data file content.
+ std::cout << "reading " << data_file.string() << std::endl;
+ file_content content(data_file.string().data());
+ std::string data_strm{content.str()};
+
+ spreadsheet::range_size_t ss{1048576, 16384};
+ spreadsheet::document doc{ss};
+ spreadsheet::import_factory import_fact(doc);
+ spreadsheet::export_factory export_fact(doc);
+
+ xmlns_repository repo;
+ xmlns_context cxt = repo.create_context();
+
+ // Parse the map file to define map rules, and parse the data file.
+ orcus_xml app(repo, &import_fact, &export_fact);
+ file_content map_content(map_file.string().data());
+ app.read_map_definition(map_content.str());
+ app.read_stream(data_strm);
+
+ // Zero the source data stream to make sure it's completely erased off
+ // memory.
+ std::for_each(data_strm.begin(), data_strm.end(), [](char& c) { c = '\0'; });
+ assert(data_strm[0] == '\0');
+ assert(data_strm[data_strm.size()-1] == '\0');
+
+ // Check the content of the document against static check file.
+ std::ostringstream os;
+ doc.dump_check(os);
+ std::string loaded = os.str();
+ content.load(check_file.string().data());
+ strm = content.str();
+
+ assert(!loaded.empty());
+ assert(!strm.empty());
+
+ std::string_view p1(loaded.data(), loaded.size()), p2(strm.data(), strm.size());
+
+ p1 = trim(p1);
+ p2 = trim(p2);
+ assert(p1 == p2);
+
+ if (tc.output_equals_input)
+ {
+ // Output to xml file with the linked values coming from the document.
+ std::cout << "writing to " << temp_output_xml << std::endl;
+ {
+ // Create a duplicate source XML stream.
+ content.load(data_file.string());
+ std::string data_strm_dup{content.str()};
+ std::ofstream file(temp_output_xml.string(), std::ios::out | std::ios::trunc);
+ assert(file);
+ app.write(data_strm_dup, file);
+ }
+
+ // Compare the logical xml content of the output xml with the
+ // input one. They should be identical.
+
+ // Hold the stream content in memory while the namespace context is being used.
+ file_content strm_data_file(data_file.string());
+ file_content strm_out_file(temp_output_xml.string());
+ std::string dump_input = dump_xml_structure(strm_data_file, cxt);
+ std::string dump_output = dump_xml_structure(strm_out_file, cxt);
+ assert(!dump_input.empty() && !dump_output.empty());
+
+ std::cout << dump_input << std::endl;
+ std::cout << "--" << std::endl;
+ std::cout << dump_output << std::endl;
+ assert(dump_input == dump_output);
+ }
+ }
+
+ // Delete the temporary xml output.
+ fs::remove(temp_output_xml);
+}
+
+void test_mapped_xml_import_no_map_definition()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ const std::vector<fs::path> tests = {
+ test_base_dir / "attribute-basic",
+ test_base_dir / "attribute-namespace",
+ test_base_dir / "attribute-namespace-2",
+ test_base_dir / "attribute-range-self-close",
+ test_base_dir / "content-basic",
+ test_base_dir / "content-one-column",
+ test_base_dir / "content-namespace",
+ test_base_dir / "content-namespace-2",
+ test_base_dir / "content-namespace-3",
+ test_base_dir / "fuel-economy",
+ test_base_dir / "nested-repeats",
+ test_base_dir / "nested-repeats-2",
+ test_base_dir / "nested-repeats-3",
+ test_base_dir / "nested-repeats-4",
+ };
+
+ for (const fs::path& base_dir : tests)
+ {
+ fs::path input_file = base_dir / "input.xml";
+ fs::path check_file = base_dir / "check-nomap.txt";
+
+ std::cout << "reading " << input_file.string() << std::endl;
+
+ file_content content(input_file.string().data());
+ file_content expected(check_file.string().data());
+
+ xmlns_repository repo;
+
+ {
+ // Automatically detect map definition without a map file.
+ spreadsheet::range_size_t ss{1048576, 16384};
+ spreadsheet::document doc{ss};
+ spreadsheet::import_factory import_fact(doc);
+
+ orcus_xml app(repo, &import_fact, nullptr);
+
+ app.detect_map_definition(content.str());
+ app.read_stream(content.str());
+
+ test::verify_content(__FILE__, __LINE__, doc, expected.str());
+ }
+
+ {
+ // Generate a map file and use it to import the XML document.
+ spreadsheet::range_size_t ss{1048576, 16384};
+ spreadsheet::document doc{ss};
+ spreadsheet::import_factory import_fact(doc);
+
+ orcus_xml app(repo, &import_fact, nullptr);
+
+ std::ostringstream os;
+ app.write_map_definition(content.str(), os);
+ std::string map_def = os.str();
+ app.read_map_definition(map_def);
+ app.read_stream(content.str());
+
+ test::verify_content(__FILE__, __LINE__, doc, expected.str());
+ }
+ }
+}
+
+void test_invalid_map_definition()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ fs::path invalids_dir = test_base_dir / "invalids" / "map-defs";
+
+ const std::vector<fs::path> tests = {
+ invalids_dir / "not-xml.xml",
+ invalids_dir / "non-leaf-element-linked.xml",
+ };
+
+ xmlns_repository repo;
+
+ spreadsheet::range_size_t ss{1048576, 16384};
+ spreadsheet::document doc{ss};
+ spreadsheet::import_factory import_fact(doc);
+ orcus_xml app(repo, &import_fact, nullptr);
+
+ for (const fs::path& test : tests)
+ {
+ std::cout << test.string() << std::endl;
+ file_content content(test.string().data());
+ doc.clear();
+
+ try
+ {
+ app.read_map_definition(content.str());
+ assert(!"We were expecting an exception, but didn't get one.");
+ }
+ catch (const invalid_map_error& e)
+ {
+ // Success!
+ std::cout << std::endl
+ << "Exception received as expected, with the following message:" << std::endl
+ << std::endl
+ << test::prefix_multiline_string(e.what(), " ") << std::endl
+ << std::endl;
+ }
+ catch (const std::exception& e)
+ {
+ std::cerr << e.what() << std::endl;
+ assert(!"Wrong exception thrown.");
+ }
+ }
+}
+
+void test_encoding()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ const fs::path test_dir = test_base_dir / "encoding";
+
+ struct test_case
+ {
+ const fs::path path;
+ character_set_t charset;
+ };
+
+ const test_case tests[] = {
+ { test_dir / "utf-8.xml", character_set_t::utf_8 },
+ { test_dir / "gbk.xml", character_set_t::gbk },
+ { test_dir / "euc-jp.xml", character_set_t::euc_jp },
+ };
+
+ for (const auto& test : tests)
+ {
+ std::cout << "reading " << test.path.string() << std::endl;
+
+ file_content content(test.path.string());
+
+ xmlns_repository repo;
+
+ spreadsheet::range_size_t ss{1048576, 16384};
+ spreadsheet::document doc{ss};
+ spreadsheet::import_factory import_fact(doc);
+ orcus_xml app(repo, &import_fact, nullptr);
+
+ app.read_stream(content.str());
+
+ assert(import_fact.get_character_set() == test.charset);
+ }
+}
+
+} // anonymous namespace
+
+int main()
+{
+ test_mapped_xml_import();
+ test_mapped_xml_import_no_map_definition();
+ test_invalid_map_definition();
+ test_encoding();
+
+ return EXIT_SUCCESS;
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/orcus_xls_xml_main.cpp b/src/orcus_xls_xml_main.cpp
new file mode 100644
index 0000000..b54e1b7
--- /dev/null
+++ b/src/orcus_xls_xml_main.cpp
@@ -0,0 +1,38 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/orcus_xls_xml.hpp"
+#include "orcus/spreadsheet/factory.hpp"
+#include "orcus/spreadsheet/document.hpp"
+#include "orcus/spreadsheet/view.hpp"
+
+#include "orcus_filter_global.hpp"
+
+#include <iostream>
+
+using namespace orcus;
+
+int main(int argc, char** argv) try
+{
+ spreadsheet::range_size_t ss{1048576, 16384};
+ spreadsheet::document doc{ss};
+ spreadsheet::view view(doc);
+ spreadsheet::import_factory fact(doc, view);
+ orcus_xls_xml app(&fact);
+
+ if (!parse_import_filter_args(argc, argv, fact, app, doc))
+ return EXIT_FAILURE;
+
+ return EXIT_SUCCESS;
+}
+catch (const std::exception& e)
+{
+ std::cerr << e.what() << std::endl;
+ return EXIT_FAILURE;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/orcus_xlsx_main.cpp b/src/orcus_xlsx_main.cpp
new file mode 100644
index 0000000..7c09bec
--- /dev/null
+++ b/src/orcus_xlsx_main.cpp
@@ -0,0 +1,42 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/orcus_xlsx.hpp"
+#include "orcus/spreadsheet/factory.hpp"
+#include "orcus/spreadsheet/document.hpp"
+#include "orcus/spreadsheet/view.hpp"
+
+#include "orcus_filter_global.hpp"
+
+#include <iostream>
+
+using namespace orcus;
+
+int main(int argc, char** argv)
+{
+ try
+ {
+ spreadsheet::range_size_t ss{1048576, 16384};
+ spreadsheet::document doc{ss};
+ spreadsheet::view view(doc);
+ spreadsheet::import_factory fact(doc, view);
+
+ orcus_xlsx app(&fact);
+
+ if (!parse_import_filter_args(argc, argv, fact, app, doc))
+ return EXIT_FAILURE;
+ }
+ catch (const std::exception& e)
+ {
+ std::cerr << e.what() << std::endl;
+ return EXIT_FAILURE;
+ }
+
+ return EXIT_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/orcus_xml_main.cpp b/src/orcus_xml_main.cpp
new file mode 100644
index 0000000..a1f38c5
--- /dev/null
+++ b/src/orcus_xml_main.cpp
@@ -0,0 +1,350 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/orcus_xml.hpp"
+#include "orcus/xml_namespace.hpp"
+#include "orcus/xml_structure_tree.hpp"
+#include "orcus/dom_tree.hpp"
+#include "orcus/spreadsheet/factory.hpp"
+#include "orcus/spreadsheet/document.hpp"
+#include "orcus/stream.hpp"
+#include "orcus/sax_parser_base.hpp"
+
+#include "orcus_filter_global.hpp"
+#include "cli_global.hpp"
+
+#include <cstdlib>
+#include <cstring>
+#include <iostream>
+#include <fstream>
+#include <boost/program_options.hpp>
+#include <mdds/sorted_string_map.hpp>
+
+#include "filesystem_env.hpp"
+
+using namespace orcus;
+using namespace std;
+namespace po = boost::program_options;
+
+namespace {
+
+namespace output_mode {
+
+enum class type {
+ unknown,
+ dump,
+ map,
+ map_gen,
+ transform_xml,
+ structure,
+};
+
+using map_type = mdds::sorted_string_map<type, mdds::string_view_map_entry>;
+
+// Keys must be sorted.
+constexpr map_type::entry entries[] = {
+ { "dump", type::dump },
+ { "map", type::map },
+ { "map-gen", type::map_gen },
+ { "structure", type::structure },
+ { "transform", type::transform_xml },
+};
+
+const map_type& get()
+{
+ static const map_type mt(entries, std::size(entries), type::unknown);
+ return mt;
+}
+
+} // namespace output_mode
+
+std::string to_string(output_mode::type t)
+{
+ for (const output_mode::map_type::entry& e : output_mode::entries)
+ if (t == e.value)
+ return std::string(e.key);
+
+ return std::string();
+}
+
+void print_usage(ostream& os, const po::options_description& desc)
+{
+ os << "Usage: orcus-xml [OPTIONS] FILE" << endl << endl;
+ os << desc;
+}
+
+std::string build_output_help_text()
+{
+ std::ostringstream os;
+ os << "Path to either an output directory, or an output file.";
+ return os.str();
+}
+
+std::string build_mode_help_text()
+{
+ std::ostringstream os;
+ os << "Mode of operation. Select one of the following options: ";
+ auto it = output_mode::entries, ite = output_mode::entries + std::size(output_mode::entries);
+ --ite;
+
+ for (; it != ite; ++it)
+ os << std::string(it->key) << ", ";
+
+ os << "or " << std::string(it->key) << ".";
+ return os.str();
+}
+
+std::string build_map_help_text()
+{
+ std::ostringstream os;
+ os << "Path to the map file. A map file is required for all modes except for the "
+ << to_string(output_mode::type::structure) << " mode.";
+ return os.str();
+}
+
+bool parse_and_dump_structure(const file_content& content, const std::string& output)
+{
+ xmlns_repository repo;
+ xmlns_context cxt = repo.create_context();
+ xml_structure_tree tree(cxt);
+ tree.parse(content.str());
+
+ if (output.empty())
+ {
+ tree.dump_compact(cout);
+ return true;
+ }
+
+ ofstream file(output);
+ if (!file)
+ {
+ cerr << "failed to create output file: " << output << endl;
+ return false;
+ }
+
+ tree.dump_compact(file);
+
+ return true;
+}
+
+void dump_document_structure(const file_content& content, output_stream& os)
+{
+ xmlns_repository repo;
+ xmlns_context cxt = repo.create_context();
+ dom::document_tree tree(cxt);
+ tree.load(content.str());
+
+ tree.dump_compact(os.get());
+}
+
+} // anonymous namespace
+
+int main(int argc, char** argv) try
+{
+ po::options_description desc("Options");
+ desc.add_options()
+ ("help,h", "Print this help.")
+ ("mode", po::value<std::string>(), build_mode_help_text().data())
+ ("map,m", po::value<std::string>(), build_map_help_text().data())
+ ("output,o", po::value<std::string>(), build_output_help_text().data())
+ ("output-format,f", po::value<string>(), gen_help_output_format().data())
+ ;
+
+ po::options_description hidden("");
+ hidden.add_options()
+ ("input", po::value<string>(), "input file");
+
+ po::positional_options_description po_desc;
+ po_desc.add("input", 1);
+
+ po::options_description cmd_opt;
+ cmd_opt.add(desc).add(hidden);
+
+ po::variables_map vm;
+ try
+ {
+ po::store(
+ po::command_line_parser(argc, argv).options(cmd_opt).positional(po_desc).run(), vm);
+ po::notify(vm);
+ }
+ catch (const exception& e)
+ {
+ // Unknown options.
+ cerr << e.what() << endl;
+ print_usage(cout, desc);
+ return EXIT_FAILURE;
+ }
+
+ if (vm.count("help"))
+ {
+ print_usage(cout, desc);
+ return EXIT_FAILURE;
+ }
+
+ if (!vm.count("input"))
+ {
+ cerr << "No input file." << endl;
+ print_usage(cout, desc);
+ return EXIT_FAILURE;
+ }
+
+ if (!vm.count("mode"))
+ {
+ cerr << "Mode not specified." << endl;
+ print_usage(cout, desc);
+ return EXIT_FAILURE;
+ }
+
+ std::string s = vm["mode"].as<std::string>();
+ output_mode::type mode = output_mode::get().find(s);
+
+ if (mode == output_mode::type::unknown)
+ {
+ cerr << "Unknown output mode: " << s << endl;
+ print_usage(cout, desc);
+ return EXIT_FAILURE;
+ }
+
+ fs::path input_path = vm["input"].as<std::string>();
+
+ if (!fs::is_regular_file(input_path))
+ {
+ cerr << input_path << " is not a valid file." << endl;
+ return EXIT_FAILURE;
+ }
+
+ fs::path map_path;
+ if (vm.count("map"))
+ {
+ map_path = vm["map"].as<std::string>();
+
+ if (!fs::is_regular_file(map_path))
+ {
+ cerr << map_path << " is not a valid map file." << endl;
+ return EXIT_FAILURE;
+ }
+ }
+
+ std::string output;
+ if (vm.count("output"))
+ output = vm["output"].as<std::string>();
+
+ file_content content(input_path.string().data());
+
+ try
+ {
+ switch (mode)
+ {
+ case output_mode::type::structure:
+ {
+ bool success = parse_and_dump_structure(content, output);
+ return success ? EXIT_SUCCESS : EXIT_FAILURE;
+ }
+ case output_mode::type::dump:
+ {
+ output_stream os(vm);
+ dump_document_structure(content, os);
+ return EXIT_SUCCESS;
+ }
+ case output_mode::type::map_gen:
+ {
+ output_stream os(vm);
+ xmlns_repository repo;
+ orcus_xml app(repo, nullptr, nullptr);
+ app.write_map_definition(content.str(), os.get());
+ return EXIT_SUCCESS;
+ }
+ default:
+ ;
+ }
+
+ spreadsheet::range_size_t ss{1048576, 16384};
+ spreadsheet::document doc{ss};
+ spreadsheet::import_factory import_fact(doc);
+ spreadsheet::export_factory export_fact(doc);
+
+ xmlns_repository repo;
+ orcus_xml app(repo, &import_fact, &export_fact);
+
+ if (map_path.empty())
+ app.detect_map_definition(content.str());
+ else
+ {
+ file_content map_content(map_path.string().data());
+ app.read_map_definition(map_content.str());
+ }
+
+ app.read_stream(content.str());
+
+ switch (mode)
+ {
+ case output_mode::type::map:
+ {
+ dump_format_t format = dump_format_t::unknown;
+ s.clear();
+
+ if (vm.count("output-format"))
+ {
+ s = vm["output-format"].as<std::string>();
+ format = to_dump_format_enum(s);
+ }
+ else
+ {
+ cerr << "Output format is not specified." << endl;
+ print_usage(cout, desc);
+ return EXIT_FAILURE;
+ }
+
+ if (format == dump_format_t::unknown)
+ {
+ std::cerr << "Unsupported output format: '" << s << "'" << endl;
+ return EXIT_FAILURE;
+ }
+
+ doc.dump(format, output);
+ break;
+ }
+ case output_mode::type::transform_xml:
+ {
+ if (output.empty())
+ {
+ cout << "output xml file name not provided" << endl;
+ print_usage(cout, desc);
+ return EXIT_FAILURE;
+ }
+
+ ofstream file(output);
+ if (!file)
+ {
+ cerr << "failed to create output file: " << output << endl;
+ return EXIT_FAILURE;
+ }
+
+ // Write transformed xml content to file.
+ app.write(content.str(), file);
+ break;
+ }
+ default:
+ ;
+ }
+ }
+ catch (const malformed_xml_error& e)
+ {
+ cerr << create_parse_error_output(content.str(), e.offset()) << endl;
+ cerr << e.what() << endl;
+ return EXIT_FAILURE;
+ }
+
+ return EXIT_SUCCESS;
+}
+catch (const std::exception& e)
+{
+ cerr << e.what() << endl;
+ return EXIT_FAILURE;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/orcus_yaml_main.cpp b/src/orcus_yaml_main.cpp
new file mode 100644
index 0000000..bb1d43c
--- /dev/null
+++ b/src/orcus_yaml_main.cpp
@@ -0,0 +1,195 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/yaml_document_tree.hpp"
+#include "orcus/yaml_parser_base.hpp"
+#include "orcus/config.hpp"
+#include "orcus/stream.hpp"
+
+#include <iostream>
+#include <fstream>
+#include <string>
+
+#include <boost/program_options.hpp>
+
+#include "filesystem_env.hpp"
+
+using namespace std;
+using namespace orcus;
+
+namespace po = boost::program_options;
+
+const char* help_program = "The FILE must specify a path to an existing file.";
+const char* err_no_input_file = "No input file.";
+const char* help_yaml_output = "Output file path.";
+const char* help_yaml_output_format =
+"Specify the format of output file. Supported format types are:\n"
+" 1) yaml\n"
+" 2) json";
+
+void print_yaml_usage(std::ostream& os, const po::options_description& desc)
+{
+ os << "Usage: orcus-yaml [options] FILE" << endl << endl;
+ os << help_program << endl << endl << desc;
+}
+
+std::unique_ptr<yaml_config> parse_yaml_args(int argc, char** argv)
+{
+ po::options_description desc("Options");
+ desc.add_options()
+ ("help,h", "Print this help.")
+ ("output,o", po::value<string>(), help_yaml_output)
+ ("output-format,f", po::value<string>(), help_yaml_output_format);
+
+ po::options_description hidden("Hidden options");
+ hidden.add_options()
+ ("input", po::value<string>(), "input file");
+
+ po::options_description cmd_opt;
+ cmd_opt.add(desc).add(hidden);
+
+ po::positional_options_description po_desc;
+ po_desc.add("input", -1);
+
+ po::variables_map vm;
+ try
+ {
+ po::store(
+ po::command_line_parser(argc, argv).options(cmd_opt).positional(po_desc).run(), vm);
+ po::notify(vm);
+ }
+ catch (const exception& e)
+ {
+ // Unknown options.
+ cerr << e.what() << endl;
+ print_yaml_usage(cerr, desc);
+ return nullptr;
+ }
+
+ if (vm.count("help"))
+ {
+ print_yaml_usage(cout, desc);
+ return nullptr;
+ }
+
+ std::unique_ptr<yaml_config> config = std::make_unique<yaml_config>();
+
+ if (vm.count("input"))
+ config->input_path = vm["input"].as<string>();
+
+ if (vm.count("output"))
+ config->output_path = vm["output"].as<string>();
+
+ if (vm.count("output-format"))
+ {
+ std::string outformat = vm["output-format"].as<string>();
+ if (outformat == "none")
+ config->output_format = yaml_config::output_format_type::none;
+ else if (outformat == "yaml")
+ config->output_format = yaml_config::output_format_type::yaml;
+ else if (outformat == "json")
+ config->output_format = yaml_config::output_format_type::json;
+ else
+ {
+ cerr << "Unknown output format type '" << outformat << "'." << endl;
+ return nullptr;
+ }
+ }
+ else
+ {
+ cerr << "Output format is not specified." << endl;
+ print_yaml_usage(cerr, desc);
+ return nullptr;
+ }
+
+ if (config->input_path.empty())
+ {
+ cerr << err_no_input_file << endl;
+ print_yaml_usage(cerr, desc);
+ return nullptr;
+ }
+
+ if (!fs::exists(config->input_path))
+ {
+ cerr << "Input file does not exist: " << config->input_path << endl;
+ return nullptr;
+ }
+
+ if (config->output_format != yaml_config::output_format_type::none)
+ {
+ if (config->output_path.empty())
+ {
+ cerr << "Output file not given." << endl;
+ return nullptr;
+ }
+
+ // Check to make sure the output path doesn't point to an existing
+ // directory.
+ if (fs::is_directory(config->output_path))
+ {
+ cerr << "Output file path points to an existing directory. Aborting." << endl;
+ return nullptr;
+ }
+ }
+
+ return config;
+}
+
+std::unique_ptr<yaml::document_tree> load_doc(const char* p, size_t n)
+{
+ std::unique_ptr<yaml::document_tree> doc(std::make_unique<yaml::document_tree>());
+ try
+ {
+ doc->load({p, n});
+ }
+ catch (const parse_error& e)
+ {
+ cerr << create_parse_error_output(std::string_view(p, n), e.offset()) << endl;
+ throw;
+ }
+ return doc;
+}
+
+int main(int argc, char** argv)
+{
+ try
+ {
+ std::unique_ptr<yaml_config> config = parse_yaml_args(argc, argv);
+ if (!config)
+ return EXIT_FAILURE;
+
+ file_content content(config->input_path.data());
+ std::unique_ptr<yaml::document_tree> doc = load_doc(content.data(), content.size());
+
+ switch (config->output_format)
+ {
+ case yaml_config::output_format_type::yaml:
+ {
+ ofstream fs(config->output_path.c_str());
+ fs << doc->dump_yaml();
+ }
+ break;
+ case yaml_config::output_format_type::json:
+ {
+ ofstream fs(config->output_path.c_str());
+ fs << doc->dump_json();
+ }
+ break;
+ default:
+ ;
+ }
+ }
+ catch (const std::exception& e)
+ {
+ cerr << e.what() << endl;
+ return EXIT_FAILURE;
+ }
+
+ return EXIT_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/orcus_zip_dump.cpp b/src/orcus_zip_dump.cpp
new file mode 100644
index 0000000..1cf81e7
--- /dev/null
+++ b/src/orcus_zip_dump.cpp
@@ -0,0 +1,52 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/zip_archive.hpp"
+#include "orcus/zip_archive_stream.hpp"
+
+#include <cstdlib>
+#include <vector>
+#include <iostream>
+
+using namespace std;
+
+int main(int argc, char** argv)
+{
+ if (argc < 2)
+ return EXIT_FAILURE;
+
+ try
+ {
+ orcus::zip_archive_stream_fd stream(argv[1]);
+ orcus::zip_archive archive(&stream);
+ archive.load();
+ size_t n = archive.get_file_entry_count();
+
+ if (argc < 3)
+ {
+ for (size_t i = 0; i < n; ++i)
+ {
+ auto header = archive.get_file_entry_header(i);
+ std::cout << "--" << std::endl;
+ std::cout << header << std::endl;
+ }
+ return EXIT_SUCCESS;
+ }
+
+ auto header = archive.get_file_entry_header(argv[2]);
+ std::cout << header << std::endl;
+ }
+ catch (const std::exception& e)
+ {
+ cerr << e.what() << endl;
+ return EXIT_FAILURE;
+ }
+
+ return EXIT_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/Makefile.am b/src/parser/Makefile.am
new file mode 100644
index 0000000..c5c534c
--- /dev/null
+++ b/src/parser/Makefile.am
@@ -0,0 +1,338 @@
+
+AM_CPPFLAGS = \
+ -I$(top_srcdir)/include \
+ -I$(top_srcdir)/src/include \
+ -DSRCDIR=\""$(top_srcdir)"\" \
+ $(BOOST_CPPFLAGS) \
+ -D__ORCUS_PSR_BUILDING_DLL
+
+if HAVE_FILESYSTEM
+AM_CPPFLAGS += "-DHAVE_FILESYSTEM=1"
+endif
+
+if HAVE_EXPERIMENTAL_FILESYSTEM
+AM_CPPFLAGS += "-DHAVE_EXPERIMENTAL_FILESYSTEM=1"
+endif
+
+lib_LTLIBRARIES = liborcus-parser-@ORCUS_API_VERSION@.la
+liborcus_parser_@ORCUS_API_VERSION@_la_SOURCES = \
+ win_stdint.h \
+ base64.cpp \
+ cell_buffer.cpp \
+ css_parser_base.cpp \
+ css_types.cpp \
+ csv_parser_base.cpp \
+ exception.cpp \
+ json_global.cpp \
+ json_parser_base.cpp \
+ json_parser_thread.cpp \
+ parser_base.cpp \
+ parser_global.cpp \
+ sax_parser_base.cpp \
+ sax_token_parser.cpp \
+ sax_token_parser_thread.cpp \
+ stream.cpp \
+ string_pool.cpp \
+ tokens.cpp \
+ types.cpp \
+ utf8.hpp \
+ utf8.cpp \
+ xml_namespace.cpp \
+ xml_writer.cpp \
+ yaml_parser_base.cpp \
+ zip_archive.cpp \
+ zip_archive_stream.cpp
+
+
+liborcus_parser_@ORCUS_API_VERSION@_la_LDFLAGS = \
+ -no-undefined \
+ $(BOOST_SYSTEM_LDFLAGS)
+
+liborcus_parser_@ORCUS_API_VERSION@_la_LIBADD = \
+ $(BOOST_SYSTEM_LIBS) \
+ $(ZLIB_LIBS)
+
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+liborcus_parser_@ORCUS_API_VERSION@_la_LDFLAGS += -lstdc++fs
+else
+liborcus_parser_@ORCUS_API_VERSION@_la_LDFLAGS += $(BOOST_FILESYSTEM_LDFLAGS)
+liborcus_parser_@ORCUS_API_VERSION@_la_LIBADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
+EXTRA_PROGRAMS = \
+ css-parser-test \
+ csv-parser-test \
+ json-parser-test \
+ parser-global-test \
+ parser-test-base \
+ parser-test-base64 \
+ parser-test-json-validation \
+ parser-test-numeric \
+ parser-test-stream \
+ parser-test-string-pool \
+ parser-test-threaded-json-parser \
+ parser-test-threaded-sax-token-parser \
+ parser-test-xml-namespace \
+ parser-test-xml-validation \
+ parser-test-zip-archive \
+ sax-ns-parser-test \
+ sax-parser-test \
+ sax-token-parser-test \
+ types-test \
+ utf8-test \
+ yaml-parser-test \
+ xml-writer-test
+
+# parser-test-string-pool
+
+parser_test_string_pool_SOURCES = \
+ string_pool.cpp \
+ string_pool_test.cpp
+
+parser_test_string_pool_LDADD = \
+ liborcus-parser-@ORCUS_API_VERSION@.la \
+ $(BOOST_SYSTEM_LIBS)
+
+parser_test_string_pool_CPPFLAGS = $(AM_CPPFLAGS)
+
+# parser-test-xml-namespace
+
+parser_test_xml_namespace_SOURCES = \
+ xml_namespace.cpp \
+ xml_namespace_test.cpp
+
+parser_test_xml_namespace_LDADD = \
+ liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../test/liborcus-test.a \
+ $(BOOST_SYSTEM_LIBS)
+
+parser_test_xml_namespace_CPPFLAGS = $(AM_CPPFLAGS)
+
+# parser-test-xml-validation
+
+parser_test_xml_validation_SOURCES = \
+ parser_test_xml_validation.cpp
+
+parser_test_xml_validation_CPPFLAGS = $(AM_CPPFLAGS)
+parser_test_xml_validation_LDFLAGS = \
+ $(BOOST_SYSTEM_LDFLAGS)
+parser_test_xml_validation_LDADD = \
+ liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../test/liborcus-test.a \
+ $(BOOST_SYSTEM_LIBS)
+
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+parser_test_xml_validation_LDFLAGS += -lstdc++fs
+else
+parser_test_xml_validation_LDFLAGS += $(BOOST_FILESYSTEM_LDFLAGS)
+parser_test_xml_validation_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
+# parser-test-base64
+
+parser_test_base64_SOURCES = \
+ base64.cpp \
+ base64_test.cpp
+
+parser_test_base64_LDADD = liborcus-parser-@ORCUS_API_VERSION@.la
+parser_test_base64_CPPFLAGS = $(AM_CPPFLAGS)
+
+# css-parser-test
+
+css_parser_test_SOURCES = \
+ css_parser_test.cpp
+
+css_parser_test_LDADD = liborcus-parser-@ORCUS_API_VERSION@.la
+css_parser_test_CPPFLAGS = $(AM_CPPFLAGS)
+
+# csv-parser-test
+
+csv_parser_test_SOURCES = \
+ csv_parser_test.cpp
+
+csv_parser_test_LDADD = liborcus-parser-@ORCUS_API_VERSION@.la
+csv_parser_test_CPPFLAGS = $(AM_CPPFLAGS)
+
+# json-parser-test
+
+json_parser_test_SOURCES = \
+ json_parser_test.cpp
+
+json_parser_test_LDADD = liborcus-parser-@ORCUS_API_VERSION@.la
+json_parser_test_CPPFLAGS = $(AM_CPPFLAGS)
+
+# yaml-parser-test
+
+yaml_parser_test_SOURCES = \
+ yaml_parser_test.cpp
+
+yaml_parser_test_LDADD = liborcus-parser-@ORCUS_API_VERSION@.la
+yaml_parser_test_CPPFLAGS = $(AM_CPPFLAGS)
+
+# sax-parser-test
+
+sax_parser_test_SOURCES = \
+ sax_parser_test.cpp
+
+sax_parser_test_LDADD = liborcus-parser-@ORCUS_API_VERSION@.la
+sax_parser_test_CPPFLAGS = $(AM_CPPFLAGS)
+
+# sax-ns-parser-test
+
+sax_ns_parser_test_SOURCES = \
+ sax_ns_parser_test.cpp
+
+sax_ns_parser_test_LDADD = liborcus-parser-@ORCUS_API_VERSION@.la
+sax_ns_parser_test_CPPFLAGS = $(AM_CPPFLAGS)
+
+# sax-token-parser-test
+
+sax_token_parser_test_SOURCES = \
+ sax_token_parser_test.cpp
+
+sax_token_parser_test_LDADD = liborcus-parser-@ORCUS_API_VERSION@.la
+sax_token_parser_test_CPPFLAGS = $(AM_CPPFLAGS)
+
+# parser-test-threaded-sax-token-parser
+
+parser_test_threaded_sax_token_parser_SOURCES = \
+ threaded_sax_token_parser_test.cpp
+
+parser_test_threaded_sax_token_parser_LDADD = liborcus-parser-@ORCUS_API_VERSION@.la
+parser_test_threaded_sax_token_parser_CPPFLAGS = $(AM_CPPFLAGS)
+
+# parser-test-threaded-json-parser
+
+parser_test_threaded_json_parser_SOURCES = \
+ threaded_json_parser_test.cpp
+
+parser_test_threaded_json_parser_LDADD = liborcus-parser-@ORCUS_API_VERSION@.la
+parser_test_threaded_json_parser_LDFLAGS = -pthread
+parser_test_threaded_json_parser_CPPFLAGS = $(AM_CPPFLAGS)
+
+# parser-test-stream
+
+parser_test_stream_SOURCES = \
+ stream_test.cpp
+
+parser_test_stream_LDADD = \
+ liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../test/liborcus-test.a
+parser_test_stream_CPPFLAGS = $(AM_CPPFLAGS)
+
+# parser-test-zip-archive
+
+parser_test_zip_archive_SOURCES = \
+ zip_archive_test.cpp
+
+parser_test_zip_archive_CPPFLAGS = $(AM_CPPFLAGS)
+parser_test_zip_archive_LDADD = \
+ liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../test/liborcus-test.a \
+ $(BOOST_SYSTEM_LIBS)
+parser_test_zip_archive_LDFLAGS = \
+ $(BOOST_SYSTEM_LDFLAGS)
+
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+parser_test_zip_archive_LDFLAGS += -lstdc++fs
+else
+parser_test_zip_archive_LDFLAGS += $(BOOST_FILESYSTEM_LDFLAGS)
+parser_test_zip_archive_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
+
+
+# parser-test-base
+
+parser_test_base_SOURCES = \
+ parser_base_test.cpp
+
+parser_test_base_LDADD = liborcus-parser-@ORCUS_API_VERSION@.la
+parser_test_base_CPPFLAGS = $(AM_CPPFLAGS)
+
+# parser-global-test
+
+parser_global_test_SOURCES = \
+ parser_global_test.cpp
+
+parser_global_test_LDADD = \
+ liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../test/liborcus-test.a
+parser_global_test_CPPFLAGS = $(AM_CPPFLAGS)
+
+# parser-test-json-validation
+
+parser_test_json_validation_SOURCES = \
+ parser_test_json_validation.cpp
+
+parser_test_json_validation_LDADD = liborcus-parser-@ORCUS_API_VERSION@.la
+parser_test_json_validation_CPPFLAGS = $(AM_CPPFLAGS)
+
+# types-test
+
+types_test_SOURCES = types_test.cpp
+
+types_test_LDADD = \
+ liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../test/liborcus-test.a
+types_test_CPPFLAGS = $(AM_CPPFLAGS)
+
+# utf8-test
+
+utf8_test_SOURCES = \
+ utf8.cpp \
+ utf8_test.cpp
+
+utf8_test_LDADD = liborcus-parser-@ORCUS_API_VERSION@.la
+utf8_test_CPPFLAGS = $(AM_CPPFLAGS)
+
+# xml-writer-test
+
+xml_writer_test_SOURCES = xml_writer_test.cpp
+
+xml_writer_test_LDADD = liborcus-parser-@ORCUS_API_VERSION@.la
+xml_writer_test_CPPFLAGS = $(AM_CPPFLAGS)
+
+# parser-test-numeric
+
+parser_test_numeric_SOURCES = \
+ parser_test_numeric.cpp
+
+parser_test_numeric = liborcus-parser-@ORCUS_API_VERSION@.la
+parser_test_numeric_LDADD = liborcus-parser-@ORCUS_API_VERSION@.la
+parser_test_numeric_CPPFLAGS = $(AM_CPPFLAGS)
+
+TESTS = \
+ css-parser-test \
+ csv-parser-test \
+ json-parser-test \
+ parser-global-test \
+ parser-test-base \
+ parser-test-base64 \
+ parser-test-json-validation \
+ parser-test-numeric \
+ parser-test-stream \
+ parser-test-string-pool \
+ parser-test-threaded-json-parser \
+ parser-test-threaded-sax-token-parser \
+ parser-test-xml-namespace \
+ parser-test-xml-validation \
+ parser-test-zip-archive \
+ sax-ns-parser-test \
+ sax-parser-test \
+ sax-token-parser-test \
+ types-test \
+ utf8-test \
+ yaml-parser-test \
+ xml-writer-test
+
+distclean-local:
+ rm -rf $(TESTS)
+
+@VALGRIND_CHECK_RULES@
diff --git a/src/parser/Makefile.in b/src/parser/Makefile.in
new file mode 100644
index 0000000..8ac6054
--- /dev/null
+++ b/src/parser/Makefile.in
@@ -0,0 +1,2328 @@
+# Makefile.in generated by automake 1.16.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2021 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.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+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@
+@HAVE_FILESYSTEM_TRUE@am__append_1 = "-DHAVE_FILESYSTEM=1"
+@HAVE_EXPERIMENTAL_FILESYSTEM_TRUE@am__append_2 = "-DHAVE_EXPERIMENTAL_FILESYSTEM=1"
+@HAVE_EXPERIMENTAL_FILESYSTEM_TRUE@@HAVE_FILESYSTEM_FALSE@am__append_3 = -lstdc++fs
+@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@am__append_4 = $(BOOST_FILESYSTEM_LDFLAGS)
+@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@am__append_5 = $(BOOST_FILESYSTEM_LIBS)
+EXTRA_PROGRAMS = css-parser-test$(EXEEXT) csv-parser-test$(EXEEXT) \
+ json-parser-test$(EXEEXT) parser-global-test$(EXEEXT) \
+ parser-test-base$(EXEEXT) parser-test-base64$(EXEEXT) \
+ parser-test-json-validation$(EXEEXT) \
+ parser-test-numeric$(EXEEXT) parser-test-stream$(EXEEXT) \
+ parser-test-string-pool$(EXEEXT) \
+ parser-test-threaded-json-parser$(EXEEXT) \
+ parser-test-threaded-sax-token-parser$(EXEEXT) \
+ parser-test-xml-namespace$(EXEEXT) \
+ parser-test-xml-validation$(EXEEXT) \
+ parser-test-zip-archive$(EXEEXT) sax-ns-parser-test$(EXEEXT) \
+ sax-parser-test$(EXEEXT) sax-token-parser-test$(EXEEXT) \
+ types-test$(EXEEXT) utf8-test$(EXEEXT) \
+ yaml-parser-test$(EXEEXT) xml-writer-test$(EXEEXT)
+@HAVE_EXPERIMENTAL_FILESYSTEM_TRUE@@HAVE_FILESYSTEM_FALSE@am__append_6 = -lstdc++fs
+@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@am__append_7 = $(BOOST_FILESYSTEM_LDFLAGS)
+@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@am__append_8 = $(BOOST_FILESYSTEM_LIBS)
+@HAVE_EXPERIMENTAL_FILESYSTEM_TRUE@@HAVE_FILESYSTEM_FALSE@am__append_9 = -lstdc++fs
+@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@am__append_10 = $(BOOST_FILESYSTEM_LDFLAGS)
+@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@am__append_11 = $(BOOST_FILESYSTEM_LIBS)
+TESTS = css-parser-test$(EXEEXT) csv-parser-test$(EXEEXT) \
+ json-parser-test$(EXEEXT) parser-global-test$(EXEEXT) \
+ parser-test-base$(EXEEXT) parser-test-base64$(EXEEXT) \
+ parser-test-json-validation$(EXEEXT) \
+ parser-test-numeric$(EXEEXT) parser-test-stream$(EXEEXT) \
+ parser-test-string-pool$(EXEEXT) \
+ parser-test-threaded-json-parser$(EXEEXT) \
+ parser-test-threaded-sax-token-parser$(EXEEXT) \
+ parser-test-xml-namespace$(EXEEXT) \
+ parser-test-xml-validation$(EXEEXT) \
+ parser-test-zip-archive$(EXEEXT) sax-ns-parser-test$(EXEEXT) \
+ sax-parser-test$(EXEEXT) sax-token-parser-test$(EXEEXT) \
+ types-test$(EXEEXT) utf8-test$(EXEEXT) \
+ yaml-parser-test$(EXEEXT) xml-writer-test$(EXEEXT)
+subdir = src/parser
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
+ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_17.m4 \
+ $(top_srcdir)/m4/boost.m4 $(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)/m4/m4_ax_valgrind_check.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+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)"
+LTLIBRARIES = $(lib_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1)
+liborcus_parser_@ORCUS_API_VERSION@_la_DEPENDENCIES = \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_2)
+am_liborcus_parser_@ORCUS_API_VERSION@_la_OBJECTS = base64.lo \
+ cell_buffer.lo css_parser_base.lo css_types.lo \
+ csv_parser_base.lo exception.lo json_global.lo \
+ json_parser_base.lo json_parser_thread.lo parser_base.lo \
+ parser_global.lo sax_parser_base.lo sax_token_parser.lo \
+ sax_token_parser_thread.lo stream.lo string_pool.lo tokens.lo \
+ types.lo utf8.lo xml_namespace.lo xml_writer.lo \
+ yaml_parser_base.lo zip_archive.lo zip_archive_stream.lo
+liborcus_parser_@ORCUS_API_VERSION@_la_OBJECTS = \
+ $(am_liborcus_parser_@ORCUS_API_VERSION@_la_OBJECTS)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+liborcus_parser_@ORCUS_API_VERSION@_la_LINK = $(LIBTOOL) $(AM_V_lt) \
+ --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+ $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \
+ $(liborcus_parser_@ORCUS_API_VERSION@_la_LDFLAGS) $(LDFLAGS) \
+ -o $@
+am_css_parser_test_OBJECTS = \
+ css_parser_test-css_parser_test.$(OBJEXT)
+css_parser_test_OBJECTS = $(am_css_parser_test_OBJECTS)
+css_parser_test_DEPENDENCIES = liborcus-parser-@ORCUS_API_VERSION@.la
+am_csv_parser_test_OBJECTS = \
+ csv_parser_test-csv_parser_test.$(OBJEXT)
+csv_parser_test_OBJECTS = $(am_csv_parser_test_OBJECTS)
+csv_parser_test_DEPENDENCIES = liborcus-parser-@ORCUS_API_VERSION@.la
+am_json_parser_test_OBJECTS = \
+ json_parser_test-json_parser_test.$(OBJEXT)
+json_parser_test_OBJECTS = $(am_json_parser_test_OBJECTS)
+json_parser_test_DEPENDENCIES = \
+ liborcus-parser-@ORCUS_API_VERSION@.la
+am_parser_global_test_OBJECTS = \
+ parser_global_test-parser_global_test.$(OBJEXT)
+parser_global_test_OBJECTS = $(am_parser_global_test_OBJECTS)
+parser_global_test_DEPENDENCIES = \
+ liborcus-parser-@ORCUS_API_VERSION@.la ../test/liborcus-test.a
+am_parser_test_base_OBJECTS = \
+ parser_test_base-parser_base_test.$(OBJEXT)
+parser_test_base_OBJECTS = $(am_parser_test_base_OBJECTS)
+parser_test_base_DEPENDENCIES = \
+ liborcus-parser-@ORCUS_API_VERSION@.la
+am_parser_test_base64_OBJECTS = parser_test_base64-base64.$(OBJEXT) \
+ parser_test_base64-base64_test.$(OBJEXT)
+parser_test_base64_OBJECTS = $(am_parser_test_base64_OBJECTS)
+parser_test_base64_DEPENDENCIES = \
+ liborcus-parser-@ORCUS_API_VERSION@.la
+am_parser_test_json_validation_OBJECTS = parser_test_json_validation-parser_test_json_validation.$(OBJEXT)
+parser_test_json_validation_OBJECTS = \
+ $(am_parser_test_json_validation_OBJECTS)
+parser_test_json_validation_DEPENDENCIES = \
+ liborcus-parser-@ORCUS_API_VERSION@.la
+am_parser_test_numeric_OBJECTS = \
+ parser_test_numeric-parser_test_numeric.$(OBJEXT)
+parser_test_numeric_OBJECTS = $(am_parser_test_numeric_OBJECTS)
+parser_test_numeric_DEPENDENCIES = \
+ liborcus-parser-@ORCUS_API_VERSION@.la
+am_parser_test_stream_OBJECTS = \
+ parser_test_stream-stream_test.$(OBJEXT)
+parser_test_stream_OBJECTS = $(am_parser_test_stream_OBJECTS)
+parser_test_stream_DEPENDENCIES = \
+ liborcus-parser-@ORCUS_API_VERSION@.la ../test/liborcus-test.a
+am_parser_test_string_pool_OBJECTS = \
+ parser_test_string_pool-string_pool.$(OBJEXT) \
+ parser_test_string_pool-string_pool_test.$(OBJEXT)
+parser_test_string_pool_OBJECTS = \
+ $(am_parser_test_string_pool_OBJECTS)
+parser_test_string_pool_DEPENDENCIES = \
+ liborcus-parser-@ORCUS_API_VERSION@.la $(am__DEPENDENCIES_1)
+am_parser_test_threaded_json_parser_OBJECTS = parser_test_threaded_json_parser-threaded_json_parser_test.$(OBJEXT)
+parser_test_threaded_json_parser_OBJECTS = \
+ $(am_parser_test_threaded_json_parser_OBJECTS)
+parser_test_threaded_json_parser_DEPENDENCIES = \
+ liborcus-parser-@ORCUS_API_VERSION@.la
+parser_test_threaded_json_parser_LINK = $(LIBTOOL) $(AM_V_lt) \
+ --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+ $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \
+ $(parser_test_threaded_json_parser_LDFLAGS) $(LDFLAGS) -o $@
+am_parser_test_threaded_sax_token_parser_OBJECTS = parser_test_threaded_sax_token_parser-threaded_sax_token_parser_test.$(OBJEXT)
+parser_test_threaded_sax_token_parser_OBJECTS = \
+ $(am_parser_test_threaded_sax_token_parser_OBJECTS)
+parser_test_threaded_sax_token_parser_DEPENDENCIES = \
+ liborcus-parser-@ORCUS_API_VERSION@.la
+am_parser_test_xml_namespace_OBJECTS = \
+ parser_test_xml_namespace-xml_namespace.$(OBJEXT) \
+ parser_test_xml_namespace-xml_namespace_test.$(OBJEXT)
+parser_test_xml_namespace_OBJECTS = \
+ $(am_parser_test_xml_namespace_OBJECTS)
+parser_test_xml_namespace_DEPENDENCIES = \
+ liborcus-parser-@ORCUS_API_VERSION@.la ../test/liborcus-test.a \
+ $(am__DEPENDENCIES_1)
+am_parser_test_xml_validation_OBJECTS = parser_test_xml_validation-parser_test_xml_validation.$(OBJEXT)
+parser_test_xml_validation_OBJECTS = \
+ $(am_parser_test_xml_validation_OBJECTS)
+parser_test_xml_validation_DEPENDENCIES = \
+ liborcus-parser-@ORCUS_API_VERSION@.la ../test/liborcus-test.a \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+parser_test_xml_validation_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(AM_CXXFLAGS) $(CXXFLAGS) \
+ $(parser_test_xml_validation_LDFLAGS) $(LDFLAGS) -o $@
+am_parser_test_zip_archive_OBJECTS = \
+ parser_test_zip_archive-zip_archive_test.$(OBJEXT)
+parser_test_zip_archive_OBJECTS = \
+ $(am_parser_test_zip_archive_OBJECTS)
+parser_test_zip_archive_DEPENDENCIES = \
+ liborcus-parser-@ORCUS_API_VERSION@.la ../test/liborcus-test.a \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+parser_test_zip_archive_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(AM_CXXFLAGS) $(CXXFLAGS) $(parser_test_zip_archive_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_sax_ns_parser_test_OBJECTS = \
+ sax_ns_parser_test-sax_ns_parser_test.$(OBJEXT)
+sax_ns_parser_test_OBJECTS = $(am_sax_ns_parser_test_OBJECTS)
+sax_ns_parser_test_DEPENDENCIES = \
+ liborcus-parser-@ORCUS_API_VERSION@.la
+am_sax_parser_test_OBJECTS = \
+ sax_parser_test-sax_parser_test.$(OBJEXT)
+sax_parser_test_OBJECTS = $(am_sax_parser_test_OBJECTS)
+sax_parser_test_DEPENDENCIES = liborcus-parser-@ORCUS_API_VERSION@.la
+am_sax_token_parser_test_OBJECTS = \
+ sax_token_parser_test-sax_token_parser_test.$(OBJEXT)
+sax_token_parser_test_OBJECTS = $(am_sax_token_parser_test_OBJECTS)
+sax_token_parser_test_DEPENDENCIES = \
+ liborcus-parser-@ORCUS_API_VERSION@.la
+am_types_test_OBJECTS = types_test-types_test.$(OBJEXT)
+types_test_OBJECTS = $(am_types_test_OBJECTS)
+types_test_DEPENDENCIES = liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../test/liborcus-test.a
+am_utf8_test_OBJECTS = utf8_test-utf8.$(OBJEXT) \
+ utf8_test-utf8_test.$(OBJEXT)
+utf8_test_OBJECTS = $(am_utf8_test_OBJECTS)
+utf8_test_DEPENDENCIES = liborcus-parser-@ORCUS_API_VERSION@.la
+am_xml_writer_test_OBJECTS = \
+ xml_writer_test-xml_writer_test.$(OBJEXT)
+xml_writer_test_OBJECTS = $(am_xml_writer_test_OBJECTS)
+xml_writer_test_DEPENDENCIES = liborcus-parser-@ORCUS_API_VERSION@.la
+am_yaml_parser_test_OBJECTS = \
+ yaml_parser_test-yaml_parser_test.$(OBJEXT)
+yaml_parser_test_OBJECTS = $(am_yaml_parser_test_OBJECTS)
+yaml_parser_test_DEPENDENCIES = \
+ liborcus-parser-@ORCUS_API_VERSION@.la
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/base64.Plo \
+ ./$(DEPDIR)/cell_buffer.Plo ./$(DEPDIR)/css_parser_base.Plo \
+ ./$(DEPDIR)/css_parser_test-css_parser_test.Po \
+ ./$(DEPDIR)/css_types.Plo ./$(DEPDIR)/csv_parser_base.Plo \
+ ./$(DEPDIR)/csv_parser_test-csv_parser_test.Po \
+ ./$(DEPDIR)/exception.Plo ./$(DEPDIR)/json_global.Plo \
+ ./$(DEPDIR)/json_parser_base.Plo \
+ ./$(DEPDIR)/json_parser_test-json_parser_test.Po \
+ ./$(DEPDIR)/json_parser_thread.Plo ./$(DEPDIR)/parser_base.Plo \
+ ./$(DEPDIR)/parser_global.Plo \
+ ./$(DEPDIR)/parser_global_test-parser_global_test.Po \
+ ./$(DEPDIR)/parser_test_base-parser_base_test.Po \
+ ./$(DEPDIR)/parser_test_base64-base64.Po \
+ ./$(DEPDIR)/parser_test_base64-base64_test.Po \
+ ./$(DEPDIR)/parser_test_json_validation-parser_test_json_validation.Po \
+ ./$(DEPDIR)/parser_test_numeric-parser_test_numeric.Po \
+ ./$(DEPDIR)/parser_test_stream-stream_test.Po \
+ ./$(DEPDIR)/parser_test_string_pool-string_pool.Po \
+ ./$(DEPDIR)/parser_test_string_pool-string_pool_test.Po \
+ ./$(DEPDIR)/parser_test_threaded_json_parser-threaded_json_parser_test.Po \
+ ./$(DEPDIR)/parser_test_threaded_sax_token_parser-threaded_sax_token_parser_test.Po \
+ ./$(DEPDIR)/parser_test_xml_namespace-xml_namespace.Po \
+ ./$(DEPDIR)/parser_test_xml_namespace-xml_namespace_test.Po \
+ ./$(DEPDIR)/parser_test_xml_validation-parser_test_xml_validation.Po \
+ ./$(DEPDIR)/parser_test_zip_archive-zip_archive_test.Po \
+ ./$(DEPDIR)/sax_ns_parser_test-sax_ns_parser_test.Po \
+ ./$(DEPDIR)/sax_parser_base.Plo \
+ ./$(DEPDIR)/sax_parser_test-sax_parser_test.Po \
+ ./$(DEPDIR)/sax_token_parser.Plo \
+ ./$(DEPDIR)/sax_token_parser_test-sax_token_parser_test.Po \
+ ./$(DEPDIR)/sax_token_parser_thread.Plo ./$(DEPDIR)/stream.Plo \
+ ./$(DEPDIR)/string_pool.Plo ./$(DEPDIR)/tokens.Plo \
+ ./$(DEPDIR)/types.Plo ./$(DEPDIR)/types_test-types_test.Po \
+ ./$(DEPDIR)/utf8.Plo ./$(DEPDIR)/utf8_test-utf8.Po \
+ ./$(DEPDIR)/utf8_test-utf8_test.Po \
+ ./$(DEPDIR)/xml_namespace.Plo ./$(DEPDIR)/xml_writer.Plo \
+ ./$(DEPDIR)/xml_writer_test-xml_writer_test.Po \
+ ./$(DEPDIR)/yaml_parser_base.Plo \
+ ./$(DEPDIR)/yaml_parser_test-yaml_parser_test.Po \
+ ./$(DEPDIR)/zip_archive.Plo ./$(DEPDIR)/zip_archive_stream.Plo
+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_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+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_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = $(liborcus_parser_@ORCUS_API_VERSION@_la_SOURCES) \
+ $(css_parser_test_SOURCES) $(csv_parser_test_SOURCES) \
+ $(json_parser_test_SOURCES) $(parser_global_test_SOURCES) \
+ $(parser_test_base_SOURCES) $(parser_test_base64_SOURCES) \
+ $(parser_test_json_validation_SOURCES) \
+ $(parser_test_numeric_SOURCES) $(parser_test_stream_SOURCES) \
+ $(parser_test_string_pool_SOURCES) \
+ $(parser_test_threaded_json_parser_SOURCES) \
+ $(parser_test_threaded_sax_token_parser_SOURCES) \
+ $(parser_test_xml_namespace_SOURCES) \
+ $(parser_test_xml_validation_SOURCES) \
+ $(parser_test_zip_archive_SOURCES) \
+ $(sax_ns_parser_test_SOURCES) $(sax_parser_test_SOURCES) \
+ $(sax_token_parser_test_SOURCES) $(types_test_SOURCES) \
+ $(utf8_test_SOURCES) $(xml_writer_test_SOURCES) \
+ $(yaml_parser_test_SOURCES)
+DIST_SOURCES = $(liborcus_parser_@ORCUS_API_VERSION@_la_SOURCES) \
+ $(css_parser_test_SOURCES) $(csv_parser_test_SOURCES) \
+ $(json_parser_test_SOURCES) $(parser_global_test_SOURCES) \
+ $(parser_test_base_SOURCES) $(parser_test_base64_SOURCES) \
+ $(parser_test_json_validation_SOURCES) \
+ $(parser_test_numeric_SOURCES) $(parser_test_stream_SOURCES) \
+ $(parser_test_string_pool_SOURCES) \
+ $(parser_test_threaded_json_parser_SOURCES) \
+ $(parser_test_threaded_sax_token_parser_SOURCES) \
+ $(parser_test_xml_namespace_SOURCES) \
+ $(parser_test_xml_validation_SOURCES) \
+ $(parser_test_zip_archive_SOURCES) \
+ $(sax_ns_parser_test_SOURCES) $(sax_parser_test_SOURCES) \
+ $(sax_token_parser_test_SOURCES) $(types_test_SOURCES) \
+ $(utf8_test_SOURCES) $(xml_writer_test_SOURCES) \
+ $(yaml_parser_test_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__extra_recursive_targets = check-valgrind-recursive \
+ check-valgrind-memcheck-recursive \
+ check-valgrind-helgrind-recursive check-valgrind-drd-recursive \
+ check-valgrind-sgcheck-recursive
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+am__tty_colors_dummy = \
+ mgn= red= grn= lgn= blu= brg= std=; \
+ am__color_tests=no
+am__tty_colors = { \
+ $(am__tty_colors_dummy); \
+ if test "X$(AM_COLOR_TESTS)" = Xno; then \
+ am__color_tests=no; \
+ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+ am__color_tests=yes; \
+ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+ am__color_tests=yes; \
+ fi; \
+ if test $$am__color_tests = yes; then \
+ red=''; \
+ grn=''; \
+ lgn=''; \
+ blu=''; \
+ mgn=''; \
+ brg=''; \
+ std=''; \
+ fi; \
+}
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# 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
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# 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. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(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='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)'
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \
+ $(top_srcdir)/test-driver
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BOOST_CPPFLAGS = @BOOST_CPPFLAGS@
+BOOST_DATE_TIME_LDFLAGS = @BOOST_DATE_TIME_LDFLAGS@
+BOOST_DATE_TIME_LDPATH = @BOOST_DATE_TIME_LDPATH@
+BOOST_DATE_TIME_LIBS = @BOOST_DATE_TIME_LIBS@
+BOOST_FILESYSTEM_LDFLAGS = @BOOST_FILESYSTEM_LDFLAGS@
+BOOST_FILESYSTEM_LDPATH = @BOOST_FILESYSTEM_LDPATH@
+BOOST_FILESYSTEM_LIBS = @BOOST_FILESYSTEM_LIBS@
+BOOST_IOSTREAMS_LDFLAGS = @BOOST_IOSTREAMS_LDFLAGS@
+BOOST_IOSTREAMS_LDPATH = @BOOST_IOSTREAMS_LDPATH@
+BOOST_IOSTREAMS_LIBS = @BOOST_IOSTREAMS_LIBS@
+BOOST_LDPATH = @BOOST_LDPATH@
+BOOST_PROGRAM_OPTIONS_LDFLAGS = @BOOST_PROGRAM_OPTIONS_LDFLAGS@
+BOOST_PROGRAM_OPTIONS_LDPATH = @BOOST_PROGRAM_OPTIONS_LDPATH@
+BOOST_PROGRAM_OPTIONS_LIBS = @BOOST_PROGRAM_OPTIONS_LIBS@
+BOOST_ROOT = @BOOST_ROOT@
+BOOST_SYSTEM_LDFLAGS = @BOOST_SYSTEM_LDFLAGS@
+BOOST_SYSTEM_LDPATH = @BOOST_SYSTEM_LDPATH@
+BOOST_SYSTEM_LIBS = @BOOST_SYSTEM_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CSCOPE = @CSCOPE@
+CTAGS = @CTAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_VALGRIND_drd = @ENABLE_VALGRIND_drd@
+ENABLE_VALGRIND_helgrind = @ENABLE_VALGRIND_helgrind@
+ENABLE_VALGRIND_memcheck = @ENABLE_VALGRIND_memcheck@
+ENABLE_VALGRIND_sgcheck = @ENABLE_VALGRIND_sgcheck@
+ETAGS = @ETAGS@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+HAVE_CXX17 = @HAVE_CXX17@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+IXION_REQUIRED_API_VERSION = @IXION_REQUIRED_API_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBIXION_CFLAGS = @LIBIXION_CFLAGS@
+LIBIXION_LIBS = @LIBIXION_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MDDS_CFLAGS = @MDDS_CFLAGS@
+MDDS_LIBS = @MDDS_LIBS@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+ORCUS_API_VERSION = @ORCUS_API_VERSION@
+ORCUS_MAJOR_VERSION = @ORCUS_MAJOR_VERSION@
+ORCUS_MICRO_VERSION = @ORCUS_MICRO_VERSION@
+ORCUS_MINOR_VERSION = @ORCUS_MINOR_VERSION@
+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@
+PARQUET_CFLAGS = @PARQUET_CFLAGS@
+PARQUET_LIBS = @PARQUET_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POW_LIB = @POW_LIB@
+PYTHON = @PYTHON@
+PYTHON_CFLAGS = @PYTHON_CFLAGS@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VALGRIND = @VALGRIND@
+VALGRIND_ENABLED = @VALGRIND_ENABLED@
+VERSION = @VERSION@
+ZLIB_CFLAGS = @ZLIB_CFLAGS@
+ZLIB_LIBS = @ZLIB_LIBS@
+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@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+runstatedir = @runstatedir@
+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@
+valgrind_enabled_tools = @valgrind_enabled_tools@
+valgrind_tools = @valgrind_tools@
+AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/src/include \
+ -DSRCDIR=\""$(top_srcdir)"\" $(BOOST_CPPFLAGS) \
+ -D__ORCUS_PSR_BUILDING_DLL $(am__append_1) $(am__append_2)
+lib_LTLIBRARIES = liborcus-parser-@ORCUS_API_VERSION@.la
+liborcus_parser_@ORCUS_API_VERSION@_la_SOURCES = \
+ win_stdint.h \
+ base64.cpp \
+ cell_buffer.cpp \
+ css_parser_base.cpp \
+ css_types.cpp \
+ csv_parser_base.cpp \
+ exception.cpp \
+ json_global.cpp \
+ json_parser_base.cpp \
+ json_parser_thread.cpp \
+ parser_base.cpp \
+ parser_global.cpp \
+ sax_parser_base.cpp \
+ sax_token_parser.cpp \
+ sax_token_parser_thread.cpp \
+ stream.cpp \
+ string_pool.cpp \
+ tokens.cpp \
+ types.cpp \
+ utf8.hpp \
+ utf8.cpp \
+ xml_namespace.cpp \
+ xml_writer.cpp \
+ yaml_parser_base.cpp \
+ zip_archive.cpp \
+ zip_archive_stream.cpp
+
+liborcus_parser_@ORCUS_API_VERSION@_la_LDFLAGS = -no-undefined \
+ $(BOOST_SYSTEM_LDFLAGS) $(am__append_3) $(am__append_4)
+liborcus_parser_@ORCUS_API_VERSION@_la_LIBADD = $(BOOST_SYSTEM_LIBS) \
+ $(ZLIB_LIBS) $(am__append_5)
+
+# parser-test-string-pool
+parser_test_string_pool_SOURCES = \
+ string_pool.cpp \
+ string_pool_test.cpp
+
+parser_test_string_pool_LDADD = \
+ liborcus-parser-@ORCUS_API_VERSION@.la \
+ $(BOOST_SYSTEM_LIBS)
+
+parser_test_string_pool_CPPFLAGS = $(AM_CPPFLAGS)
+
+# parser-test-xml-namespace
+parser_test_xml_namespace_SOURCES = \
+ xml_namespace.cpp \
+ xml_namespace_test.cpp
+
+parser_test_xml_namespace_LDADD = \
+ liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../test/liborcus-test.a \
+ $(BOOST_SYSTEM_LIBS)
+
+parser_test_xml_namespace_CPPFLAGS = $(AM_CPPFLAGS)
+
+# parser-test-xml-validation
+parser_test_xml_validation_SOURCES = \
+ parser_test_xml_validation.cpp
+
+parser_test_xml_validation_CPPFLAGS = $(AM_CPPFLAGS)
+parser_test_xml_validation_LDFLAGS = $(BOOST_SYSTEM_LDFLAGS) \
+ $(am__append_6) $(am__append_7)
+parser_test_xml_validation_LDADD = \
+ liborcus-parser-@ORCUS_API_VERSION@.la ../test/liborcus-test.a \
+ $(BOOST_SYSTEM_LIBS) $(am__append_8)
+
+# parser-test-base64
+parser_test_base64_SOURCES = \
+ base64.cpp \
+ base64_test.cpp
+
+parser_test_base64_LDADD = liborcus-parser-@ORCUS_API_VERSION@.la
+parser_test_base64_CPPFLAGS = $(AM_CPPFLAGS)
+
+# css-parser-test
+css_parser_test_SOURCES = \
+ css_parser_test.cpp
+
+css_parser_test_LDADD = liborcus-parser-@ORCUS_API_VERSION@.la
+css_parser_test_CPPFLAGS = $(AM_CPPFLAGS)
+
+# csv-parser-test
+csv_parser_test_SOURCES = \
+ csv_parser_test.cpp
+
+csv_parser_test_LDADD = liborcus-parser-@ORCUS_API_VERSION@.la
+csv_parser_test_CPPFLAGS = $(AM_CPPFLAGS)
+
+# json-parser-test
+json_parser_test_SOURCES = \
+ json_parser_test.cpp
+
+json_parser_test_LDADD = liborcus-parser-@ORCUS_API_VERSION@.la
+json_parser_test_CPPFLAGS = $(AM_CPPFLAGS)
+
+# yaml-parser-test
+yaml_parser_test_SOURCES = \
+ yaml_parser_test.cpp
+
+yaml_parser_test_LDADD = liborcus-parser-@ORCUS_API_VERSION@.la
+yaml_parser_test_CPPFLAGS = $(AM_CPPFLAGS)
+
+# sax-parser-test
+sax_parser_test_SOURCES = \
+ sax_parser_test.cpp
+
+sax_parser_test_LDADD = liborcus-parser-@ORCUS_API_VERSION@.la
+sax_parser_test_CPPFLAGS = $(AM_CPPFLAGS)
+
+# sax-ns-parser-test
+sax_ns_parser_test_SOURCES = \
+ sax_ns_parser_test.cpp
+
+sax_ns_parser_test_LDADD = liborcus-parser-@ORCUS_API_VERSION@.la
+sax_ns_parser_test_CPPFLAGS = $(AM_CPPFLAGS)
+
+# sax-token-parser-test
+sax_token_parser_test_SOURCES = \
+ sax_token_parser_test.cpp
+
+sax_token_parser_test_LDADD = liborcus-parser-@ORCUS_API_VERSION@.la
+sax_token_parser_test_CPPFLAGS = $(AM_CPPFLAGS)
+
+# parser-test-threaded-sax-token-parser
+parser_test_threaded_sax_token_parser_SOURCES = \
+ threaded_sax_token_parser_test.cpp
+
+parser_test_threaded_sax_token_parser_LDADD = liborcus-parser-@ORCUS_API_VERSION@.la
+parser_test_threaded_sax_token_parser_CPPFLAGS = $(AM_CPPFLAGS)
+
+# parser-test-threaded-json-parser
+parser_test_threaded_json_parser_SOURCES = \
+ threaded_json_parser_test.cpp
+
+parser_test_threaded_json_parser_LDADD = liborcus-parser-@ORCUS_API_VERSION@.la
+parser_test_threaded_json_parser_LDFLAGS = -pthread
+parser_test_threaded_json_parser_CPPFLAGS = $(AM_CPPFLAGS)
+
+# parser-test-stream
+parser_test_stream_SOURCES = \
+ stream_test.cpp
+
+parser_test_stream_LDADD = \
+ liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../test/liborcus-test.a
+
+parser_test_stream_CPPFLAGS = $(AM_CPPFLAGS)
+
+# parser-test-zip-archive
+parser_test_zip_archive_SOURCES = \
+ zip_archive_test.cpp
+
+parser_test_zip_archive_CPPFLAGS = $(AM_CPPFLAGS)
+parser_test_zip_archive_LDADD = \
+ liborcus-parser-@ORCUS_API_VERSION@.la ../test/liborcus-test.a \
+ $(BOOST_SYSTEM_LIBS) $(am__append_11)
+parser_test_zip_archive_LDFLAGS = $(BOOST_SYSTEM_LDFLAGS) \
+ $(am__append_9) $(am__append_10)
+
+# parser-test-base
+parser_test_base_SOURCES = \
+ parser_base_test.cpp
+
+parser_test_base_LDADD = liborcus-parser-@ORCUS_API_VERSION@.la
+parser_test_base_CPPFLAGS = $(AM_CPPFLAGS)
+
+# parser-global-test
+parser_global_test_SOURCES = \
+ parser_global_test.cpp
+
+parser_global_test_LDADD = \
+ liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../test/liborcus-test.a
+
+parser_global_test_CPPFLAGS = $(AM_CPPFLAGS)
+
+# parser-test-json-validation
+parser_test_json_validation_SOURCES = \
+ parser_test_json_validation.cpp
+
+parser_test_json_validation_LDADD = liborcus-parser-@ORCUS_API_VERSION@.la
+parser_test_json_validation_CPPFLAGS = $(AM_CPPFLAGS)
+
+# types-test
+types_test_SOURCES = types_test.cpp
+types_test_LDADD = \
+ liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../test/liborcus-test.a
+
+types_test_CPPFLAGS = $(AM_CPPFLAGS)
+
+# utf8-test
+utf8_test_SOURCES = \
+ utf8.cpp \
+ utf8_test.cpp
+
+utf8_test_LDADD = liborcus-parser-@ORCUS_API_VERSION@.la
+utf8_test_CPPFLAGS = $(AM_CPPFLAGS)
+
+# xml-writer-test
+xml_writer_test_SOURCES = xml_writer_test.cpp
+xml_writer_test_LDADD = liborcus-parser-@ORCUS_API_VERSION@.la
+xml_writer_test_CPPFLAGS = $(AM_CPPFLAGS)
+
+# parser-test-numeric
+parser_test_numeric_SOURCES = \
+ parser_test_numeric.cpp
+
+parser_test_numeric = liborcus-parser-@ORCUS_API_VERSION@.la
+parser_test_numeric_LDADD = liborcus-parser-@ORCUS_API_VERSION@.la
+parser_test_numeric_CPPFLAGS = $(AM_CPPFLAGS)
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cpp .lo .log .o .obj .test .test$(EXEEXT) .trs
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/parser/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign src/parser/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+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)'; \
+ locs=`for p in $$list; do echo $$p; done | \
+ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+ sort -u`; \
+ test -z "$$locs" || { \
+ echo rm -f $${locs}; \
+ rm -f $${locs}; \
+ }
+
+liborcus-parser-@ORCUS_API_VERSION@.la: $(liborcus_parser_@ORCUS_API_VERSION@_la_OBJECTS) $(liborcus_parser_@ORCUS_API_VERSION@_la_DEPENDENCIES) $(EXTRA_liborcus_parser_@ORCUS_API_VERSION@_la_DEPENDENCIES)
+ $(AM_V_CXXLD)$(liborcus_parser_@ORCUS_API_VERSION@_la_LINK) -rpath $(libdir) $(liborcus_parser_@ORCUS_API_VERSION@_la_OBJECTS) $(liborcus_parser_@ORCUS_API_VERSION@_la_LIBADD) $(LIBS)
+
+css-parser-test$(EXEEXT): $(css_parser_test_OBJECTS) $(css_parser_test_DEPENDENCIES) $(EXTRA_css_parser_test_DEPENDENCIES)
+ @rm -f css-parser-test$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(css_parser_test_OBJECTS) $(css_parser_test_LDADD) $(LIBS)
+
+csv-parser-test$(EXEEXT): $(csv_parser_test_OBJECTS) $(csv_parser_test_DEPENDENCIES) $(EXTRA_csv_parser_test_DEPENDENCIES)
+ @rm -f csv-parser-test$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(csv_parser_test_OBJECTS) $(csv_parser_test_LDADD) $(LIBS)
+
+json-parser-test$(EXEEXT): $(json_parser_test_OBJECTS) $(json_parser_test_DEPENDENCIES) $(EXTRA_json_parser_test_DEPENDENCIES)
+ @rm -f json-parser-test$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(json_parser_test_OBJECTS) $(json_parser_test_LDADD) $(LIBS)
+
+parser-global-test$(EXEEXT): $(parser_global_test_OBJECTS) $(parser_global_test_DEPENDENCIES) $(EXTRA_parser_global_test_DEPENDENCIES)
+ @rm -f parser-global-test$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(parser_global_test_OBJECTS) $(parser_global_test_LDADD) $(LIBS)
+
+parser-test-base$(EXEEXT): $(parser_test_base_OBJECTS) $(parser_test_base_DEPENDENCIES) $(EXTRA_parser_test_base_DEPENDENCIES)
+ @rm -f parser-test-base$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(parser_test_base_OBJECTS) $(parser_test_base_LDADD) $(LIBS)
+
+parser-test-base64$(EXEEXT): $(parser_test_base64_OBJECTS) $(parser_test_base64_DEPENDENCIES) $(EXTRA_parser_test_base64_DEPENDENCIES)
+ @rm -f parser-test-base64$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(parser_test_base64_OBJECTS) $(parser_test_base64_LDADD) $(LIBS)
+
+parser-test-json-validation$(EXEEXT): $(parser_test_json_validation_OBJECTS) $(parser_test_json_validation_DEPENDENCIES) $(EXTRA_parser_test_json_validation_DEPENDENCIES)
+ @rm -f parser-test-json-validation$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(parser_test_json_validation_OBJECTS) $(parser_test_json_validation_LDADD) $(LIBS)
+
+parser-test-numeric$(EXEEXT): $(parser_test_numeric_OBJECTS) $(parser_test_numeric_DEPENDENCIES) $(EXTRA_parser_test_numeric_DEPENDENCIES)
+ @rm -f parser-test-numeric$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(parser_test_numeric_OBJECTS) $(parser_test_numeric_LDADD) $(LIBS)
+
+parser-test-stream$(EXEEXT): $(parser_test_stream_OBJECTS) $(parser_test_stream_DEPENDENCIES) $(EXTRA_parser_test_stream_DEPENDENCIES)
+ @rm -f parser-test-stream$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(parser_test_stream_OBJECTS) $(parser_test_stream_LDADD) $(LIBS)
+
+parser-test-string-pool$(EXEEXT): $(parser_test_string_pool_OBJECTS) $(parser_test_string_pool_DEPENDENCIES) $(EXTRA_parser_test_string_pool_DEPENDENCIES)
+ @rm -f parser-test-string-pool$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(parser_test_string_pool_OBJECTS) $(parser_test_string_pool_LDADD) $(LIBS)
+
+parser-test-threaded-json-parser$(EXEEXT): $(parser_test_threaded_json_parser_OBJECTS) $(parser_test_threaded_json_parser_DEPENDENCIES) $(EXTRA_parser_test_threaded_json_parser_DEPENDENCIES)
+ @rm -f parser-test-threaded-json-parser$(EXEEXT)
+ $(AM_V_CXXLD)$(parser_test_threaded_json_parser_LINK) $(parser_test_threaded_json_parser_OBJECTS) $(parser_test_threaded_json_parser_LDADD) $(LIBS)
+
+parser-test-threaded-sax-token-parser$(EXEEXT): $(parser_test_threaded_sax_token_parser_OBJECTS) $(parser_test_threaded_sax_token_parser_DEPENDENCIES) $(EXTRA_parser_test_threaded_sax_token_parser_DEPENDENCIES)
+ @rm -f parser-test-threaded-sax-token-parser$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(parser_test_threaded_sax_token_parser_OBJECTS) $(parser_test_threaded_sax_token_parser_LDADD) $(LIBS)
+
+parser-test-xml-namespace$(EXEEXT): $(parser_test_xml_namespace_OBJECTS) $(parser_test_xml_namespace_DEPENDENCIES) $(EXTRA_parser_test_xml_namespace_DEPENDENCIES)
+ @rm -f parser-test-xml-namespace$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(parser_test_xml_namespace_OBJECTS) $(parser_test_xml_namespace_LDADD) $(LIBS)
+
+parser-test-xml-validation$(EXEEXT): $(parser_test_xml_validation_OBJECTS) $(parser_test_xml_validation_DEPENDENCIES) $(EXTRA_parser_test_xml_validation_DEPENDENCIES)
+ @rm -f parser-test-xml-validation$(EXEEXT)
+ $(AM_V_CXXLD)$(parser_test_xml_validation_LINK) $(parser_test_xml_validation_OBJECTS) $(parser_test_xml_validation_LDADD) $(LIBS)
+
+parser-test-zip-archive$(EXEEXT): $(parser_test_zip_archive_OBJECTS) $(parser_test_zip_archive_DEPENDENCIES) $(EXTRA_parser_test_zip_archive_DEPENDENCIES)
+ @rm -f parser-test-zip-archive$(EXEEXT)
+ $(AM_V_CXXLD)$(parser_test_zip_archive_LINK) $(parser_test_zip_archive_OBJECTS) $(parser_test_zip_archive_LDADD) $(LIBS)
+
+sax-ns-parser-test$(EXEEXT): $(sax_ns_parser_test_OBJECTS) $(sax_ns_parser_test_DEPENDENCIES) $(EXTRA_sax_ns_parser_test_DEPENDENCIES)
+ @rm -f sax-ns-parser-test$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(sax_ns_parser_test_OBJECTS) $(sax_ns_parser_test_LDADD) $(LIBS)
+
+sax-parser-test$(EXEEXT): $(sax_parser_test_OBJECTS) $(sax_parser_test_DEPENDENCIES) $(EXTRA_sax_parser_test_DEPENDENCIES)
+ @rm -f sax-parser-test$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(sax_parser_test_OBJECTS) $(sax_parser_test_LDADD) $(LIBS)
+
+sax-token-parser-test$(EXEEXT): $(sax_token_parser_test_OBJECTS) $(sax_token_parser_test_DEPENDENCIES) $(EXTRA_sax_token_parser_test_DEPENDENCIES)
+ @rm -f sax-token-parser-test$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(sax_token_parser_test_OBJECTS) $(sax_token_parser_test_LDADD) $(LIBS)
+
+types-test$(EXEEXT): $(types_test_OBJECTS) $(types_test_DEPENDENCIES) $(EXTRA_types_test_DEPENDENCIES)
+ @rm -f types-test$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(types_test_OBJECTS) $(types_test_LDADD) $(LIBS)
+
+utf8-test$(EXEEXT): $(utf8_test_OBJECTS) $(utf8_test_DEPENDENCIES) $(EXTRA_utf8_test_DEPENDENCIES)
+ @rm -f utf8-test$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(utf8_test_OBJECTS) $(utf8_test_LDADD) $(LIBS)
+
+xml-writer-test$(EXEEXT): $(xml_writer_test_OBJECTS) $(xml_writer_test_DEPENDENCIES) $(EXTRA_xml_writer_test_DEPENDENCIES)
+ @rm -f xml-writer-test$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(xml_writer_test_OBJECTS) $(xml_writer_test_LDADD) $(LIBS)
+
+yaml-parser-test$(EXEEXT): $(yaml_parser_test_OBJECTS) $(yaml_parser_test_DEPENDENCIES) $(EXTRA_yaml_parser_test_DEPENDENCIES)
+ @rm -f yaml-parser-test$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(yaml_parser_test_OBJECTS) $(yaml_parser_test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/base64.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cell_buffer.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/css_parser_base.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/css_parser_test-css_parser_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/css_types.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/csv_parser_base.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/csv_parser_test-csv_parser_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exception.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json_global.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json_parser_base.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json_parser_test-json_parser_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json_parser_thread.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parser_base.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parser_global.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parser_global_test-parser_global_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parser_test_base-parser_base_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parser_test_base64-base64.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parser_test_base64-base64_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parser_test_json_validation-parser_test_json_validation.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parser_test_numeric-parser_test_numeric.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parser_test_stream-stream_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parser_test_string_pool-string_pool.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parser_test_string_pool-string_pool_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parser_test_threaded_json_parser-threaded_json_parser_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parser_test_threaded_sax_token_parser-threaded_sax_token_parser_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parser_test_xml_namespace-xml_namespace.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parser_test_xml_namespace-xml_namespace_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parser_test_xml_validation-parser_test_xml_validation.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parser_test_zip_archive-zip_archive_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sax_ns_parser_test-sax_ns_parser_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sax_parser_base.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sax_parser_test-sax_parser_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sax_token_parser.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sax_token_parser_test-sax_token_parser_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sax_token_parser_thread.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/string_pool.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tokens.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/types.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/types_test-types_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utf8.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utf8_test-utf8.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utf8_test-utf8_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xml_namespace.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xml_writer.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xml_writer_test-xml_writer_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/yaml_parser_base.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/yaml_parser_test-yaml_parser_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_archive.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_archive_stream.Plo@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.cpp.o:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cpp.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cpp.lo:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+css_parser_test-css_parser_test.o: css_parser_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(css_parser_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT css_parser_test-css_parser_test.o -MD -MP -MF $(DEPDIR)/css_parser_test-css_parser_test.Tpo -c -o css_parser_test-css_parser_test.o `test -f 'css_parser_test.cpp' || echo '$(srcdir)/'`css_parser_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/css_parser_test-css_parser_test.Tpo $(DEPDIR)/css_parser_test-css_parser_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='css_parser_test.cpp' object='css_parser_test-css_parser_test.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(css_parser_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o css_parser_test-css_parser_test.o `test -f 'css_parser_test.cpp' || echo '$(srcdir)/'`css_parser_test.cpp
+
+css_parser_test-css_parser_test.obj: css_parser_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(css_parser_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT css_parser_test-css_parser_test.obj -MD -MP -MF $(DEPDIR)/css_parser_test-css_parser_test.Tpo -c -o css_parser_test-css_parser_test.obj `if test -f 'css_parser_test.cpp'; then $(CYGPATH_W) 'css_parser_test.cpp'; else $(CYGPATH_W) '$(srcdir)/css_parser_test.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/css_parser_test-css_parser_test.Tpo $(DEPDIR)/css_parser_test-css_parser_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='css_parser_test.cpp' object='css_parser_test-css_parser_test.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(css_parser_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o css_parser_test-css_parser_test.obj `if test -f 'css_parser_test.cpp'; then $(CYGPATH_W) 'css_parser_test.cpp'; else $(CYGPATH_W) '$(srcdir)/css_parser_test.cpp'; fi`
+
+csv_parser_test-csv_parser_test.o: csv_parser_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(csv_parser_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT csv_parser_test-csv_parser_test.o -MD -MP -MF $(DEPDIR)/csv_parser_test-csv_parser_test.Tpo -c -o csv_parser_test-csv_parser_test.o `test -f 'csv_parser_test.cpp' || echo '$(srcdir)/'`csv_parser_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/csv_parser_test-csv_parser_test.Tpo $(DEPDIR)/csv_parser_test-csv_parser_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='csv_parser_test.cpp' object='csv_parser_test-csv_parser_test.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(csv_parser_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o csv_parser_test-csv_parser_test.o `test -f 'csv_parser_test.cpp' || echo '$(srcdir)/'`csv_parser_test.cpp
+
+csv_parser_test-csv_parser_test.obj: csv_parser_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(csv_parser_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT csv_parser_test-csv_parser_test.obj -MD -MP -MF $(DEPDIR)/csv_parser_test-csv_parser_test.Tpo -c -o csv_parser_test-csv_parser_test.obj `if test -f 'csv_parser_test.cpp'; then $(CYGPATH_W) 'csv_parser_test.cpp'; else $(CYGPATH_W) '$(srcdir)/csv_parser_test.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/csv_parser_test-csv_parser_test.Tpo $(DEPDIR)/csv_parser_test-csv_parser_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='csv_parser_test.cpp' object='csv_parser_test-csv_parser_test.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(csv_parser_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o csv_parser_test-csv_parser_test.obj `if test -f 'csv_parser_test.cpp'; then $(CYGPATH_W) 'csv_parser_test.cpp'; else $(CYGPATH_W) '$(srcdir)/csv_parser_test.cpp'; fi`
+
+json_parser_test-json_parser_test.o: json_parser_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_parser_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT json_parser_test-json_parser_test.o -MD -MP -MF $(DEPDIR)/json_parser_test-json_parser_test.Tpo -c -o json_parser_test-json_parser_test.o `test -f 'json_parser_test.cpp' || echo '$(srcdir)/'`json_parser_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/json_parser_test-json_parser_test.Tpo $(DEPDIR)/json_parser_test-json_parser_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='json_parser_test.cpp' object='json_parser_test-json_parser_test.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_parser_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o json_parser_test-json_parser_test.o `test -f 'json_parser_test.cpp' || echo '$(srcdir)/'`json_parser_test.cpp
+
+json_parser_test-json_parser_test.obj: json_parser_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_parser_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT json_parser_test-json_parser_test.obj -MD -MP -MF $(DEPDIR)/json_parser_test-json_parser_test.Tpo -c -o json_parser_test-json_parser_test.obj `if test -f 'json_parser_test.cpp'; then $(CYGPATH_W) 'json_parser_test.cpp'; else $(CYGPATH_W) '$(srcdir)/json_parser_test.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/json_parser_test-json_parser_test.Tpo $(DEPDIR)/json_parser_test-json_parser_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='json_parser_test.cpp' object='json_parser_test-json_parser_test.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_parser_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o json_parser_test-json_parser_test.obj `if test -f 'json_parser_test.cpp'; then $(CYGPATH_W) 'json_parser_test.cpp'; else $(CYGPATH_W) '$(srcdir)/json_parser_test.cpp'; fi`
+
+parser_global_test-parser_global_test.o: parser_global_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_global_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT parser_global_test-parser_global_test.o -MD -MP -MF $(DEPDIR)/parser_global_test-parser_global_test.Tpo -c -o parser_global_test-parser_global_test.o `test -f 'parser_global_test.cpp' || echo '$(srcdir)/'`parser_global_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parser_global_test-parser_global_test.Tpo $(DEPDIR)/parser_global_test-parser_global_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='parser_global_test.cpp' object='parser_global_test-parser_global_test.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_global_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o parser_global_test-parser_global_test.o `test -f 'parser_global_test.cpp' || echo '$(srcdir)/'`parser_global_test.cpp
+
+parser_global_test-parser_global_test.obj: parser_global_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_global_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT parser_global_test-parser_global_test.obj -MD -MP -MF $(DEPDIR)/parser_global_test-parser_global_test.Tpo -c -o parser_global_test-parser_global_test.obj `if test -f 'parser_global_test.cpp'; then $(CYGPATH_W) 'parser_global_test.cpp'; else $(CYGPATH_W) '$(srcdir)/parser_global_test.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parser_global_test-parser_global_test.Tpo $(DEPDIR)/parser_global_test-parser_global_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='parser_global_test.cpp' object='parser_global_test-parser_global_test.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_global_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o parser_global_test-parser_global_test.obj `if test -f 'parser_global_test.cpp'; then $(CYGPATH_W) 'parser_global_test.cpp'; else $(CYGPATH_W) '$(srcdir)/parser_global_test.cpp'; fi`
+
+parser_test_base-parser_base_test.o: parser_base_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_base_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT parser_test_base-parser_base_test.o -MD -MP -MF $(DEPDIR)/parser_test_base-parser_base_test.Tpo -c -o parser_test_base-parser_base_test.o `test -f 'parser_base_test.cpp' || echo '$(srcdir)/'`parser_base_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parser_test_base-parser_base_test.Tpo $(DEPDIR)/parser_test_base-parser_base_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='parser_base_test.cpp' object='parser_test_base-parser_base_test.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_base_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o parser_test_base-parser_base_test.o `test -f 'parser_base_test.cpp' || echo '$(srcdir)/'`parser_base_test.cpp
+
+parser_test_base-parser_base_test.obj: parser_base_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_base_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT parser_test_base-parser_base_test.obj -MD -MP -MF $(DEPDIR)/parser_test_base-parser_base_test.Tpo -c -o parser_test_base-parser_base_test.obj `if test -f 'parser_base_test.cpp'; then $(CYGPATH_W) 'parser_base_test.cpp'; else $(CYGPATH_W) '$(srcdir)/parser_base_test.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parser_test_base-parser_base_test.Tpo $(DEPDIR)/parser_test_base-parser_base_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='parser_base_test.cpp' object='parser_test_base-parser_base_test.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_base_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o parser_test_base-parser_base_test.obj `if test -f 'parser_base_test.cpp'; then $(CYGPATH_W) 'parser_base_test.cpp'; else $(CYGPATH_W) '$(srcdir)/parser_base_test.cpp'; fi`
+
+parser_test_base64-base64.o: base64.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_base64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT parser_test_base64-base64.o -MD -MP -MF $(DEPDIR)/parser_test_base64-base64.Tpo -c -o parser_test_base64-base64.o `test -f 'base64.cpp' || echo '$(srcdir)/'`base64.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parser_test_base64-base64.Tpo $(DEPDIR)/parser_test_base64-base64.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='base64.cpp' object='parser_test_base64-base64.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_base64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o parser_test_base64-base64.o `test -f 'base64.cpp' || echo '$(srcdir)/'`base64.cpp
+
+parser_test_base64-base64.obj: base64.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_base64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT parser_test_base64-base64.obj -MD -MP -MF $(DEPDIR)/parser_test_base64-base64.Tpo -c -o parser_test_base64-base64.obj `if test -f 'base64.cpp'; then $(CYGPATH_W) 'base64.cpp'; else $(CYGPATH_W) '$(srcdir)/base64.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parser_test_base64-base64.Tpo $(DEPDIR)/parser_test_base64-base64.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='base64.cpp' object='parser_test_base64-base64.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_base64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o parser_test_base64-base64.obj `if test -f 'base64.cpp'; then $(CYGPATH_W) 'base64.cpp'; else $(CYGPATH_W) '$(srcdir)/base64.cpp'; fi`
+
+parser_test_base64-base64_test.o: base64_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_base64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT parser_test_base64-base64_test.o -MD -MP -MF $(DEPDIR)/parser_test_base64-base64_test.Tpo -c -o parser_test_base64-base64_test.o `test -f 'base64_test.cpp' || echo '$(srcdir)/'`base64_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parser_test_base64-base64_test.Tpo $(DEPDIR)/parser_test_base64-base64_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='base64_test.cpp' object='parser_test_base64-base64_test.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_base64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o parser_test_base64-base64_test.o `test -f 'base64_test.cpp' || echo '$(srcdir)/'`base64_test.cpp
+
+parser_test_base64-base64_test.obj: base64_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_base64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT parser_test_base64-base64_test.obj -MD -MP -MF $(DEPDIR)/parser_test_base64-base64_test.Tpo -c -o parser_test_base64-base64_test.obj `if test -f 'base64_test.cpp'; then $(CYGPATH_W) 'base64_test.cpp'; else $(CYGPATH_W) '$(srcdir)/base64_test.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parser_test_base64-base64_test.Tpo $(DEPDIR)/parser_test_base64-base64_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='base64_test.cpp' object='parser_test_base64-base64_test.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_base64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o parser_test_base64-base64_test.obj `if test -f 'base64_test.cpp'; then $(CYGPATH_W) 'base64_test.cpp'; else $(CYGPATH_W) '$(srcdir)/base64_test.cpp'; fi`
+
+parser_test_json_validation-parser_test_json_validation.o: parser_test_json_validation.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_json_validation_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT parser_test_json_validation-parser_test_json_validation.o -MD -MP -MF $(DEPDIR)/parser_test_json_validation-parser_test_json_validation.Tpo -c -o parser_test_json_validation-parser_test_json_validation.o `test -f 'parser_test_json_validation.cpp' || echo '$(srcdir)/'`parser_test_json_validation.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parser_test_json_validation-parser_test_json_validation.Tpo $(DEPDIR)/parser_test_json_validation-parser_test_json_validation.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='parser_test_json_validation.cpp' object='parser_test_json_validation-parser_test_json_validation.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_json_validation_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o parser_test_json_validation-parser_test_json_validation.o `test -f 'parser_test_json_validation.cpp' || echo '$(srcdir)/'`parser_test_json_validation.cpp
+
+parser_test_json_validation-parser_test_json_validation.obj: parser_test_json_validation.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_json_validation_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT parser_test_json_validation-parser_test_json_validation.obj -MD -MP -MF $(DEPDIR)/parser_test_json_validation-parser_test_json_validation.Tpo -c -o parser_test_json_validation-parser_test_json_validation.obj `if test -f 'parser_test_json_validation.cpp'; then $(CYGPATH_W) 'parser_test_json_validation.cpp'; else $(CYGPATH_W) '$(srcdir)/parser_test_json_validation.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parser_test_json_validation-parser_test_json_validation.Tpo $(DEPDIR)/parser_test_json_validation-parser_test_json_validation.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='parser_test_json_validation.cpp' object='parser_test_json_validation-parser_test_json_validation.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_json_validation_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o parser_test_json_validation-parser_test_json_validation.obj `if test -f 'parser_test_json_validation.cpp'; then $(CYGPATH_W) 'parser_test_json_validation.cpp'; else $(CYGPATH_W) '$(srcdir)/parser_test_json_validation.cpp'; fi`
+
+parser_test_numeric-parser_test_numeric.o: parser_test_numeric.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_numeric_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT parser_test_numeric-parser_test_numeric.o -MD -MP -MF $(DEPDIR)/parser_test_numeric-parser_test_numeric.Tpo -c -o parser_test_numeric-parser_test_numeric.o `test -f 'parser_test_numeric.cpp' || echo '$(srcdir)/'`parser_test_numeric.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parser_test_numeric-parser_test_numeric.Tpo $(DEPDIR)/parser_test_numeric-parser_test_numeric.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='parser_test_numeric.cpp' object='parser_test_numeric-parser_test_numeric.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_numeric_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o parser_test_numeric-parser_test_numeric.o `test -f 'parser_test_numeric.cpp' || echo '$(srcdir)/'`parser_test_numeric.cpp
+
+parser_test_numeric-parser_test_numeric.obj: parser_test_numeric.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_numeric_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT parser_test_numeric-parser_test_numeric.obj -MD -MP -MF $(DEPDIR)/parser_test_numeric-parser_test_numeric.Tpo -c -o parser_test_numeric-parser_test_numeric.obj `if test -f 'parser_test_numeric.cpp'; then $(CYGPATH_W) 'parser_test_numeric.cpp'; else $(CYGPATH_W) '$(srcdir)/parser_test_numeric.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parser_test_numeric-parser_test_numeric.Tpo $(DEPDIR)/parser_test_numeric-parser_test_numeric.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='parser_test_numeric.cpp' object='parser_test_numeric-parser_test_numeric.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_numeric_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o parser_test_numeric-parser_test_numeric.obj `if test -f 'parser_test_numeric.cpp'; then $(CYGPATH_W) 'parser_test_numeric.cpp'; else $(CYGPATH_W) '$(srcdir)/parser_test_numeric.cpp'; fi`
+
+parser_test_stream-stream_test.o: stream_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_stream_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT parser_test_stream-stream_test.o -MD -MP -MF $(DEPDIR)/parser_test_stream-stream_test.Tpo -c -o parser_test_stream-stream_test.o `test -f 'stream_test.cpp' || echo '$(srcdir)/'`stream_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parser_test_stream-stream_test.Tpo $(DEPDIR)/parser_test_stream-stream_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='stream_test.cpp' object='parser_test_stream-stream_test.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_stream_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o parser_test_stream-stream_test.o `test -f 'stream_test.cpp' || echo '$(srcdir)/'`stream_test.cpp
+
+parser_test_stream-stream_test.obj: stream_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_stream_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT parser_test_stream-stream_test.obj -MD -MP -MF $(DEPDIR)/parser_test_stream-stream_test.Tpo -c -o parser_test_stream-stream_test.obj `if test -f 'stream_test.cpp'; then $(CYGPATH_W) 'stream_test.cpp'; else $(CYGPATH_W) '$(srcdir)/stream_test.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parser_test_stream-stream_test.Tpo $(DEPDIR)/parser_test_stream-stream_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='stream_test.cpp' object='parser_test_stream-stream_test.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_stream_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o parser_test_stream-stream_test.obj `if test -f 'stream_test.cpp'; then $(CYGPATH_W) 'stream_test.cpp'; else $(CYGPATH_W) '$(srcdir)/stream_test.cpp'; fi`
+
+parser_test_string_pool-string_pool.o: string_pool.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_string_pool_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT parser_test_string_pool-string_pool.o -MD -MP -MF $(DEPDIR)/parser_test_string_pool-string_pool.Tpo -c -o parser_test_string_pool-string_pool.o `test -f 'string_pool.cpp' || echo '$(srcdir)/'`string_pool.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parser_test_string_pool-string_pool.Tpo $(DEPDIR)/parser_test_string_pool-string_pool.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='string_pool.cpp' object='parser_test_string_pool-string_pool.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_string_pool_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o parser_test_string_pool-string_pool.o `test -f 'string_pool.cpp' || echo '$(srcdir)/'`string_pool.cpp
+
+parser_test_string_pool-string_pool.obj: string_pool.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_string_pool_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT parser_test_string_pool-string_pool.obj -MD -MP -MF $(DEPDIR)/parser_test_string_pool-string_pool.Tpo -c -o parser_test_string_pool-string_pool.obj `if test -f 'string_pool.cpp'; then $(CYGPATH_W) 'string_pool.cpp'; else $(CYGPATH_W) '$(srcdir)/string_pool.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parser_test_string_pool-string_pool.Tpo $(DEPDIR)/parser_test_string_pool-string_pool.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='string_pool.cpp' object='parser_test_string_pool-string_pool.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_string_pool_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o parser_test_string_pool-string_pool.obj `if test -f 'string_pool.cpp'; then $(CYGPATH_W) 'string_pool.cpp'; else $(CYGPATH_W) '$(srcdir)/string_pool.cpp'; fi`
+
+parser_test_string_pool-string_pool_test.o: string_pool_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_string_pool_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT parser_test_string_pool-string_pool_test.o -MD -MP -MF $(DEPDIR)/parser_test_string_pool-string_pool_test.Tpo -c -o parser_test_string_pool-string_pool_test.o `test -f 'string_pool_test.cpp' || echo '$(srcdir)/'`string_pool_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parser_test_string_pool-string_pool_test.Tpo $(DEPDIR)/parser_test_string_pool-string_pool_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='string_pool_test.cpp' object='parser_test_string_pool-string_pool_test.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_string_pool_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o parser_test_string_pool-string_pool_test.o `test -f 'string_pool_test.cpp' || echo '$(srcdir)/'`string_pool_test.cpp
+
+parser_test_string_pool-string_pool_test.obj: string_pool_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_string_pool_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT parser_test_string_pool-string_pool_test.obj -MD -MP -MF $(DEPDIR)/parser_test_string_pool-string_pool_test.Tpo -c -o parser_test_string_pool-string_pool_test.obj `if test -f 'string_pool_test.cpp'; then $(CYGPATH_W) 'string_pool_test.cpp'; else $(CYGPATH_W) '$(srcdir)/string_pool_test.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parser_test_string_pool-string_pool_test.Tpo $(DEPDIR)/parser_test_string_pool-string_pool_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='string_pool_test.cpp' object='parser_test_string_pool-string_pool_test.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_string_pool_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o parser_test_string_pool-string_pool_test.obj `if test -f 'string_pool_test.cpp'; then $(CYGPATH_W) 'string_pool_test.cpp'; else $(CYGPATH_W) '$(srcdir)/string_pool_test.cpp'; fi`
+
+parser_test_threaded_json_parser-threaded_json_parser_test.o: threaded_json_parser_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_threaded_json_parser_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT parser_test_threaded_json_parser-threaded_json_parser_test.o -MD -MP -MF $(DEPDIR)/parser_test_threaded_json_parser-threaded_json_parser_test.Tpo -c -o parser_test_threaded_json_parser-threaded_json_parser_test.o `test -f 'threaded_json_parser_test.cpp' || echo '$(srcdir)/'`threaded_json_parser_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parser_test_threaded_json_parser-threaded_json_parser_test.Tpo $(DEPDIR)/parser_test_threaded_json_parser-threaded_json_parser_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='threaded_json_parser_test.cpp' object='parser_test_threaded_json_parser-threaded_json_parser_test.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_threaded_json_parser_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o parser_test_threaded_json_parser-threaded_json_parser_test.o `test -f 'threaded_json_parser_test.cpp' || echo '$(srcdir)/'`threaded_json_parser_test.cpp
+
+parser_test_threaded_json_parser-threaded_json_parser_test.obj: threaded_json_parser_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_threaded_json_parser_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT parser_test_threaded_json_parser-threaded_json_parser_test.obj -MD -MP -MF $(DEPDIR)/parser_test_threaded_json_parser-threaded_json_parser_test.Tpo -c -o parser_test_threaded_json_parser-threaded_json_parser_test.obj `if test -f 'threaded_json_parser_test.cpp'; then $(CYGPATH_W) 'threaded_json_parser_test.cpp'; else $(CYGPATH_W) '$(srcdir)/threaded_json_parser_test.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parser_test_threaded_json_parser-threaded_json_parser_test.Tpo $(DEPDIR)/parser_test_threaded_json_parser-threaded_json_parser_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='threaded_json_parser_test.cpp' object='parser_test_threaded_json_parser-threaded_json_parser_test.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_threaded_json_parser_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o parser_test_threaded_json_parser-threaded_json_parser_test.obj `if test -f 'threaded_json_parser_test.cpp'; then $(CYGPATH_W) 'threaded_json_parser_test.cpp'; else $(CYGPATH_W) '$(srcdir)/threaded_json_parser_test.cpp'; fi`
+
+parser_test_threaded_sax_token_parser-threaded_sax_token_parser_test.o: threaded_sax_token_parser_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_threaded_sax_token_parser_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT parser_test_threaded_sax_token_parser-threaded_sax_token_parser_test.o -MD -MP -MF $(DEPDIR)/parser_test_threaded_sax_token_parser-threaded_sax_token_parser_test.Tpo -c -o parser_test_threaded_sax_token_parser-threaded_sax_token_parser_test.o `test -f 'threaded_sax_token_parser_test.cpp' || echo '$(srcdir)/'`threaded_sax_token_parser_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parser_test_threaded_sax_token_parser-threaded_sax_token_parser_test.Tpo $(DEPDIR)/parser_test_threaded_sax_token_parser-threaded_sax_token_parser_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='threaded_sax_token_parser_test.cpp' object='parser_test_threaded_sax_token_parser-threaded_sax_token_parser_test.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_threaded_sax_token_parser_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o parser_test_threaded_sax_token_parser-threaded_sax_token_parser_test.o `test -f 'threaded_sax_token_parser_test.cpp' || echo '$(srcdir)/'`threaded_sax_token_parser_test.cpp
+
+parser_test_threaded_sax_token_parser-threaded_sax_token_parser_test.obj: threaded_sax_token_parser_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_threaded_sax_token_parser_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT parser_test_threaded_sax_token_parser-threaded_sax_token_parser_test.obj -MD -MP -MF $(DEPDIR)/parser_test_threaded_sax_token_parser-threaded_sax_token_parser_test.Tpo -c -o parser_test_threaded_sax_token_parser-threaded_sax_token_parser_test.obj `if test -f 'threaded_sax_token_parser_test.cpp'; then $(CYGPATH_W) 'threaded_sax_token_parser_test.cpp'; else $(CYGPATH_W) '$(srcdir)/threaded_sax_token_parser_test.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parser_test_threaded_sax_token_parser-threaded_sax_token_parser_test.Tpo $(DEPDIR)/parser_test_threaded_sax_token_parser-threaded_sax_token_parser_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='threaded_sax_token_parser_test.cpp' object='parser_test_threaded_sax_token_parser-threaded_sax_token_parser_test.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_threaded_sax_token_parser_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o parser_test_threaded_sax_token_parser-threaded_sax_token_parser_test.obj `if test -f 'threaded_sax_token_parser_test.cpp'; then $(CYGPATH_W) 'threaded_sax_token_parser_test.cpp'; else $(CYGPATH_W) '$(srcdir)/threaded_sax_token_parser_test.cpp'; fi`
+
+parser_test_xml_namespace-xml_namespace.o: xml_namespace.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_xml_namespace_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT parser_test_xml_namespace-xml_namespace.o -MD -MP -MF $(DEPDIR)/parser_test_xml_namespace-xml_namespace.Tpo -c -o parser_test_xml_namespace-xml_namespace.o `test -f 'xml_namespace.cpp' || echo '$(srcdir)/'`xml_namespace.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parser_test_xml_namespace-xml_namespace.Tpo $(DEPDIR)/parser_test_xml_namespace-xml_namespace.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_namespace.cpp' object='parser_test_xml_namespace-xml_namespace.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_xml_namespace_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o parser_test_xml_namespace-xml_namespace.o `test -f 'xml_namespace.cpp' || echo '$(srcdir)/'`xml_namespace.cpp
+
+parser_test_xml_namespace-xml_namespace.obj: xml_namespace.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_xml_namespace_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT parser_test_xml_namespace-xml_namespace.obj -MD -MP -MF $(DEPDIR)/parser_test_xml_namespace-xml_namespace.Tpo -c -o parser_test_xml_namespace-xml_namespace.obj `if test -f 'xml_namespace.cpp'; then $(CYGPATH_W) 'xml_namespace.cpp'; else $(CYGPATH_W) '$(srcdir)/xml_namespace.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parser_test_xml_namespace-xml_namespace.Tpo $(DEPDIR)/parser_test_xml_namespace-xml_namespace.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_namespace.cpp' object='parser_test_xml_namespace-xml_namespace.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_xml_namespace_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o parser_test_xml_namespace-xml_namespace.obj `if test -f 'xml_namespace.cpp'; then $(CYGPATH_W) 'xml_namespace.cpp'; else $(CYGPATH_W) '$(srcdir)/xml_namespace.cpp'; fi`
+
+parser_test_xml_namespace-xml_namespace_test.o: xml_namespace_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_xml_namespace_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT parser_test_xml_namespace-xml_namespace_test.o -MD -MP -MF $(DEPDIR)/parser_test_xml_namespace-xml_namespace_test.Tpo -c -o parser_test_xml_namespace-xml_namespace_test.o `test -f 'xml_namespace_test.cpp' || echo '$(srcdir)/'`xml_namespace_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parser_test_xml_namespace-xml_namespace_test.Tpo $(DEPDIR)/parser_test_xml_namespace-xml_namespace_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_namespace_test.cpp' object='parser_test_xml_namespace-xml_namespace_test.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_xml_namespace_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o parser_test_xml_namespace-xml_namespace_test.o `test -f 'xml_namespace_test.cpp' || echo '$(srcdir)/'`xml_namespace_test.cpp
+
+parser_test_xml_namespace-xml_namespace_test.obj: xml_namespace_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_xml_namespace_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT parser_test_xml_namespace-xml_namespace_test.obj -MD -MP -MF $(DEPDIR)/parser_test_xml_namespace-xml_namespace_test.Tpo -c -o parser_test_xml_namespace-xml_namespace_test.obj `if test -f 'xml_namespace_test.cpp'; then $(CYGPATH_W) 'xml_namespace_test.cpp'; else $(CYGPATH_W) '$(srcdir)/xml_namespace_test.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parser_test_xml_namespace-xml_namespace_test.Tpo $(DEPDIR)/parser_test_xml_namespace-xml_namespace_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_namespace_test.cpp' object='parser_test_xml_namespace-xml_namespace_test.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_xml_namespace_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o parser_test_xml_namespace-xml_namespace_test.obj `if test -f 'xml_namespace_test.cpp'; then $(CYGPATH_W) 'xml_namespace_test.cpp'; else $(CYGPATH_W) '$(srcdir)/xml_namespace_test.cpp'; fi`
+
+parser_test_xml_validation-parser_test_xml_validation.o: parser_test_xml_validation.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_xml_validation_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT parser_test_xml_validation-parser_test_xml_validation.o -MD -MP -MF $(DEPDIR)/parser_test_xml_validation-parser_test_xml_validation.Tpo -c -o parser_test_xml_validation-parser_test_xml_validation.o `test -f 'parser_test_xml_validation.cpp' || echo '$(srcdir)/'`parser_test_xml_validation.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parser_test_xml_validation-parser_test_xml_validation.Tpo $(DEPDIR)/parser_test_xml_validation-parser_test_xml_validation.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='parser_test_xml_validation.cpp' object='parser_test_xml_validation-parser_test_xml_validation.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_xml_validation_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o parser_test_xml_validation-parser_test_xml_validation.o `test -f 'parser_test_xml_validation.cpp' || echo '$(srcdir)/'`parser_test_xml_validation.cpp
+
+parser_test_xml_validation-parser_test_xml_validation.obj: parser_test_xml_validation.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_xml_validation_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT parser_test_xml_validation-parser_test_xml_validation.obj -MD -MP -MF $(DEPDIR)/parser_test_xml_validation-parser_test_xml_validation.Tpo -c -o parser_test_xml_validation-parser_test_xml_validation.obj `if test -f 'parser_test_xml_validation.cpp'; then $(CYGPATH_W) 'parser_test_xml_validation.cpp'; else $(CYGPATH_W) '$(srcdir)/parser_test_xml_validation.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parser_test_xml_validation-parser_test_xml_validation.Tpo $(DEPDIR)/parser_test_xml_validation-parser_test_xml_validation.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='parser_test_xml_validation.cpp' object='parser_test_xml_validation-parser_test_xml_validation.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_xml_validation_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o parser_test_xml_validation-parser_test_xml_validation.obj `if test -f 'parser_test_xml_validation.cpp'; then $(CYGPATH_W) 'parser_test_xml_validation.cpp'; else $(CYGPATH_W) '$(srcdir)/parser_test_xml_validation.cpp'; fi`
+
+parser_test_zip_archive-zip_archive_test.o: zip_archive_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_zip_archive_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT parser_test_zip_archive-zip_archive_test.o -MD -MP -MF $(DEPDIR)/parser_test_zip_archive-zip_archive_test.Tpo -c -o parser_test_zip_archive-zip_archive_test.o `test -f 'zip_archive_test.cpp' || echo '$(srcdir)/'`zip_archive_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parser_test_zip_archive-zip_archive_test.Tpo $(DEPDIR)/parser_test_zip_archive-zip_archive_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='zip_archive_test.cpp' object='parser_test_zip_archive-zip_archive_test.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_zip_archive_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o parser_test_zip_archive-zip_archive_test.o `test -f 'zip_archive_test.cpp' || echo '$(srcdir)/'`zip_archive_test.cpp
+
+parser_test_zip_archive-zip_archive_test.obj: zip_archive_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_zip_archive_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT parser_test_zip_archive-zip_archive_test.obj -MD -MP -MF $(DEPDIR)/parser_test_zip_archive-zip_archive_test.Tpo -c -o parser_test_zip_archive-zip_archive_test.obj `if test -f 'zip_archive_test.cpp'; then $(CYGPATH_W) 'zip_archive_test.cpp'; else $(CYGPATH_W) '$(srcdir)/zip_archive_test.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parser_test_zip_archive-zip_archive_test.Tpo $(DEPDIR)/parser_test_zip_archive-zip_archive_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='zip_archive_test.cpp' object='parser_test_zip_archive-zip_archive_test.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(parser_test_zip_archive_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o parser_test_zip_archive-zip_archive_test.obj `if test -f 'zip_archive_test.cpp'; then $(CYGPATH_W) 'zip_archive_test.cpp'; else $(CYGPATH_W) '$(srcdir)/zip_archive_test.cpp'; fi`
+
+sax_ns_parser_test-sax_ns_parser_test.o: sax_ns_parser_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sax_ns_parser_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT sax_ns_parser_test-sax_ns_parser_test.o -MD -MP -MF $(DEPDIR)/sax_ns_parser_test-sax_ns_parser_test.Tpo -c -o sax_ns_parser_test-sax_ns_parser_test.o `test -f 'sax_ns_parser_test.cpp' || echo '$(srcdir)/'`sax_ns_parser_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sax_ns_parser_test-sax_ns_parser_test.Tpo $(DEPDIR)/sax_ns_parser_test-sax_ns_parser_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='sax_ns_parser_test.cpp' object='sax_ns_parser_test-sax_ns_parser_test.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sax_ns_parser_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o sax_ns_parser_test-sax_ns_parser_test.o `test -f 'sax_ns_parser_test.cpp' || echo '$(srcdir)/'`sax_ns_parser_test.cpp
+
+sax_ns_parser_test-sax_ns_parser_test.obj: sax_ns_parser_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sax_ns_parser_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT sax_ns_parser_test-sax_ns_parser_test.obj -MD -MP -MF $(DEPDIR)/sax_ns_parser_test-sax_ns_parser_test.Tpo -c -o sax_ns_parser_test-sax_ns_parser_test.obj `if test -f 'sax_ns_parser_test.cpp'; then $(CYGPATH_W) 'sax_ns_parser_test.cpp'; else $(CYGPATH_W) '$(srcdir)/sax_ns_parser_test.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sax_ns_parser_test-sax_ns_parser_test.Tpo $(DEPDIR)/sax_ns_parser_test-sax_ns_parser_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='sax_ns_parser_test.cpp' object='sax_ns_parser_test-sax_ns_parser_test.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sax_ns_parser_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o sax_ns_parser_test-sax_ns_parser_test.obj `if test -f 'sax_ns_parser_test.cpp'; then $(CYGPATH_W) 'sax_ns_parser_test.cpp'; else $(CYGPATH_W) '$(srcdir)/sax_ns_parser_test.cpp'; fi`
+
+sax_parser_test-sax_parser_test.o: sax_parser_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sax_parser_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT sax_parser_test-sax_parser_test.o -MD -MP -MF $(DEPDIR)/sax_parser_test-sax_parser_test.Tpo -c -o sax_parser_test-sax_parser_test.o `test -f 'sax_parser_test.cpp' || echo '$(srcdir)/'`sax_parser_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sax_parser_test-sax_parser_test.Tpo $(DEPDIR)/sax_parser_test-sax_parser_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='sax_parser_test.cpp' object='sax_parser_test-sax_parser_test.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sax_parser_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o sax_parser_test-sax_parser_test.o `test -f 'sax_parser_test.cpp' || echo '$(srcdir)/'`sax_parser_test.cpp
+
+sax_parser_test-sax_parser_test.obj: sax_parser_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sax_parser_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT sax_parser_test-sax_parser_test.obj -MD -MP -MF $(DEPDIR)/sax_parser_test-sax_parser_test.Tpo -c -o sax_parser_test-sax_parser_test.obj `if test -f 'sax_parser_test.cpp'; then $(CYGPATH_W) 'sax_parser_test.cpp'; else $(CYGPATH_W) '$(srcdir)/sax_parser_test.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sax_parser_test-sax_parser_test.Tpo $(DEPDIR)/sax_parser_test-sax_parser_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='sax_parser_test.cpp' object='sax_parser_test-sax_parser_test.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sax_parser_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o sax_parser_test-sax_parser_test.obj `if test -f 'sax_parser_test.cpp'; then $(CYGPATH_W) 'sax_parser_test.cpp'; else $(CYGPATH_W) '$(srcdir)/sax_parser_test.cpp'; fi`
+
+sax_token_parser_test-sax_token_parser_test.o: sax_token_parser_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sax_token_parser_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT sax_token_parser_test-sax_token_parser_test.o -MD -MP -MF $(DEPDIR)/sax_token_parser_test-sax_token_parser_test.Tpo -c -o sax_token_parser_test-sax_token_parser_test.o `test -f 'sax_token_parser_test.cpp' || echo '$(srcdir)/'`sax_token_parser_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sax_token_parser_test-sax_token_parser_test.Tpo $(DEPDIR)/sax_token_parser_test-sax_token_parser_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='sax_token_parser_test.cpp' object='sax_token_parser_test-sax_token_parser_test.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sax_token_parser_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o sax_token_parser_test-sax_token_parser_test.o `test -f 'sax_token_parser_test.cpp' || echo '$(srcdir)/'`sax_token_parser_test.cpp
+
+sax_token_parser_test-sax_token_parser_test.obj: sax_token_parser_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sax_token_parser_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT sax_token_parser_test-sax_token_parser_test.obj -MD -MP -MF $(DEPDIR)/sax_token_parser_test-sax_token_parser_test.Tpo -c -o sax_token_parser_test-sax_token_parser_test.obj `if test -f 'sax_token_parser_test.cpp'; then $(CYGPATH_W) 'sax_token_parser_test.cpp'; else $(CYGPATH_W) '$(srcdir)/sax_token_parser_test.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sax_token_parser_test-sax_token_parser_test.Tpo $(DEPDIR)/sax_token_parser_test-sax_token_parser_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='sax_token_parser_test.cpp' object='sax_token_parser_test-sax_token_parser_test.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sax_token_parser_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o sax_token_parser_test-sax_token_parser_test.obj `if test -f 'sax_token_parser_test.cpp'; then $(CYGPATH_W) 'sax_token_parser_test.cpp'; else $(CYGPATH_W) '$(srcdir)/sax_token_parser_test.cpp'; fi`
+
+types_test-types_test.o: types_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(types_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT types_test-types_test.o -MD -MP -MF $(DEPDIR)/types_test-types_test.Tpo -c -o types_test-types_test.o `test -f 'types_test.cpp' || echo '$(srcdir)/'`types_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/types_test-types_test.Tpo $(DEPDIR)/types_test-types_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='types_test.cpp' object='types_test-types_test.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(types_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o types_test-types_test.o `test -f 'types_test.cpp' || echo '$(srcdir)/'`types_test.cpp
+
+types_test-types_test.obj: types_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(types_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT types_test-types_test.obj -MD -MP -MF $(DEPDIR)/types_test-types_test.Tpo -c -o types_test-types_test.obj `if test -f 'types_test.cpp'; then $(CYGPATH_W) 'types_test.cpp'; else $(CYGPATH_W) '$(srcdir)/types_test.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/types_test-types_test.Tpo $(DEPDIR)/types_test-types_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='types_test.cpp' object='types_test-types_test.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(types_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o types_test-types_test.obj `if test -f 'types_test.cpp'; then $(CYGPATH_W) 'types_test.cpp'; else $(CYGPATH_W) '$(srcdir)/types_test.cpp'; fi`
+
+utf8_test-utf8.o: utf8.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(utf8_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT utf8_test-utf8.o -MD -MP -MF $(DEPDIR)/utf8_test-utf8.Tpo -c -o utf8_test-utf8.o `test -f 'utf8.cpp' || echo '$(srcdir)/'`utf8.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/utf8_test-utf8.Tpo $(DEPDIR)/utf8_test-utf8.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='utf8.cpp' object='utf8_test-utf8.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(utf8_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o utf8_test-utf8.o `test -f 'utf8.cpp' || echo '$(srcdir)/'`utf8.cpp
+
+utf8_test-utf8.obj: utf8.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(utf8_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT utf8_test-utf8.obj -MD -MP -MF $(DEPDIR)/utf8_test-utf8.Tpo -c -o utf8_test-utf8.obj `if test -f 'utf8.cpp'; then $(CYGPATH_W) 'utf8.cpp'; else $(CYGPATH_W) '$(srcdir)/utf8.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/utf8_test-utf8.Tpo $(DEPDIR)/utf8_test-utf8.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='utf8.cpp' object='utf8_test-utf8.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(utf8_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o utf8_test-utf8.obj `if test -f 'utf8.cpp'; then $(CYGPATH_W) 'utf8.cpp'; else $(CYGPATH_W) '$(srcdir)/utf8.cpp'; fi`
+
+utf8_test-utf8_test.o: utf8_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(utf8_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT utf8_test-utf8_test.o -MD -MP -MF $(DEPDIR)/utf8_test-utf8_test.Tpo -c -o utf8_test-utf8_test.o `test -f 'utf8_test.cpp' || echo '$(srcdir)/'`utf8_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/utf8_test-utf8_test.Tpo $(DEPDIR)/utf8_test-utf8_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='utf8_test.cpp' object='utf8_test-utf8_test.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(utf8_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o utf8_test-utf8_test.o `test -f 'utf8_test.cpp' || echo '$(srcdir)/'`utf8_test.cpp
+
+utf8_test-utf8_test.obj: utf8_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(utf8_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT utf8_test-utf8_test.obj -MD -MP -MF $(DEPDIR)/utf8_test-utf8_test.Tpo -c -o utf8_test-utf8_test.obj `if test -f 'utf8_test.cpp'; then $(CYGPATH_W) 'utf8_test.cpp'; else $(CYGPATH_W) '$(srcdir)/utf8_test.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/utf8_test-utf8_test.Tpo $(DEPDIR)/utf8_test-utf8_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='utf8_test.cpp' object='utf8_test-utf8_test.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(utf8_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o utf8_test-utf8_test.obj `if test -f 'utf8_test.cpp'; then $(CYGPATH_W) 'utf8_test.cpp'; else $(CYGPATH_W) '$(srcdir)/utf8_test.cpp'; fi`
+
+xml_writer_test-xml_writer_test.o: xml_writer_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xml_writer_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xml_writer_test-xml_writer_test.o -MD -MP -MF $(DEPDIR)/xml_writer_test-xml_writer_test.Tpo -c -o xml_writer_test-xml_writer_test.o `test -f 'xml_writer_test.cpp' || echo '$(srcdir)/'`xml_writer_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xml_writer_test-xml_writer_test.Tpo $(DEPDIR)/xml_writer_test-xml_writer_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_writer_test.cpp' object='xml_writer_test-xml_writer_test.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xml_writer_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xml_writer_test-xml_writer_test.o `test -f 'xml_writer_test.cpp' || echo '$(srcdir)/'`xml_writer_test.cpp
+
+xml_writer_test-xml_writer_test.obj: xml_writer_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xml_writer_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xml_writer_test-xml_writer_test.obj -MD -MP -MF $(DEPDIR)/xml_writer_test-xml_writer_test.Tpo -c -o xml_writer_test-xml_writer_test.obj `if test -f 'xml_writer_test.cpp'; then $(CYGPATH_W) 'xml_writer_test.cpp'; else $(CYGPATH_W) '$(srcdir)/xml_writer_test.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xml_writer_test-xml_writer_test.Tpo $(DEPDIR)/xml_writer_test-xml_writer_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml_writer_test.cpp' object='xml_writer_test-xml_writer_test.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xml_writer_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xml_writer_test-xml_writer_test.obj `if test -f 'xml_writer_test.cpp'; then $(CYGPATH_W) 'xml_writer_test.cpp'; else $(CYGPATH_W) '$(srcdir)/xml_writer_test.cpp'; fi`
+
+yaml_parser_test-yaml_parser_test.o: yaml_parser_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(yaml_parser_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT yaml_parser_test-yaml_parser_test.o -MD -MP -MF $(DEPDIR)/yaml_parser_test-yaml_parser_test.Tpo -c -o yaml_parser_test-yaml_parser_test.o `test -f 'yaml_parser_test.cpp' || echo '$(srcdir)/'`yaml_parser_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/yaml_parser_test-yaml_parser_test.Tpo $(DEPDIR)/yaml_parser_test-yaml_parser_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='yaml_parser_test.cpp' object='yaml_parser_test-yaml_parser_test.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(yaml_parser_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o yaml_parser_test-yaml_parser_test.o `test -f 'yaml_parser_test.cpp' || echo '$(srcdir)/'`yaml_parser_test.cpp
+
+yaml_parser_test-yaml_parser_test.obj: yaml_parser_test.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(yaml_parser_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT yaml_parser_test-yaml_parser_test.obj -MD -MP -MF $(DEPDIR)/yaml_parser_test-yaml_parser_test.Tpo -c -o yaml_parser_test-yaml_parser_test.obj `if test -f 'yaml_parser_test.cpp'; then $(CYGPATH_W) 'yaml_parser_test.cpp'; else $(CYGPATH_W) '$(srcdir)/yaml_parser_test.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/yaml_parser_test-yaml_parser_test.Tpo $(DEPDIR)/yaml_parser_test-yaml_parser_test.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='yaml_parser_test.cpp' object='yaml_parser_test-yaml_parser_test.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(yaml_parser_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o yaml_parser_test-yaml_parser_test.obj `if test -f 'yaml_parser_test.cpp'; then $(CYGPATH_W) 'yaml_parser_test.cpp'; else $(CYGPATH_W) '$(srcdir)/yaml_parser_test.cpp'; fi`
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+check-valgrind-local:
+check-valgrind-memcheck-local:
+check-valgrind-helgrind-local:
+check-valgrind-drd-local:
+check-valgrind-sgcheck-local:
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ 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-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ 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"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+ fi; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ elif test -n "$$redo_logs"; then \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
+ else \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+ fi; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
+ else \
+ color_start= color_end=; \
+ fi; \
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS:
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+css-parser-test.log: css-parser-test$(EXEEXT)
+ @p='css-parser-test$(EXEEXT)'; \
+ b='css-parser-test'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+csv-parser-test.log: csv-parser-test$(EXEEXT)
+ @p='csv-parser-test$(EXEEXT)'; \
+ b='csv-parser-test'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+json-parser-test.log: json-parser-test$(EXEEXT)
+ @p='json-parser-test$(EXEEXT)'; \
+ b='json-parser-test'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+parser-global-test.log: parser-global-test$(EXEEXT)
+ @p='parser-global-test$(EXEEXT)'; \
+ b='parser-global-test'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+parser-test-base.log: parser-test-base$(EXEEXT)
+ @p='parser-test-base$(EXEEXT)'; \
+ b='parser-test-base'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+parser-test-base64.log: parser-test-base64$(EXEEXT)
+ @p='parser-test-base64$(EXEEXT)'; \
+ b='parser-test-base64'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+parser-test-json-validation.log: parser-test-json-validation$(EXEEXT)
+ @p='parser-test-json-validation$(EXEEXT)'; \
+ b='parser-test-json-validation'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+parser-test-numeric.log: parser-test-numeric$(EXEEXT)
+ @p='parser-test-numeric$(EXEEXT)'; \
+ b='parser-test-numeric'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+parser-test-stream.log: parser-test-stream$(EXEEXT)
+ @p='parser-test-stream$(EXEEXT)'; \
+ b='parser-test-stream'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+parser-test-string-pool.log: parser-test-string-pool$(EXEEXT)
+ @p='parser-test-string-pool$(EXEEXT)'; \
+ b='parser-test-string-pool'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+parser-test-threaded-json-parser.log: parser-test-threaded-json-parser$(EXEEXT)
+ @p='parser-test-threaded-json-parser$(EXEEXT)'; \
+ b='parser-test-threaded-json-parser'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+parser-test-threaded-sax-token-parser.log: parser-test-threaded-sax-token-parser$(EXEEXT)
+ @p='parser-test-threaded-sax-token-parser$(EXEEXT)'; \
+ b='parser-test-threaded-sax-token-parser'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+parser-test-xml-namespace.log: parser-test-xml-namespace$(EXEEXT)
+ @p='parser-test-xml-namespace$(EXEEXT)'; \
+ b='parser-test-xml-namespace'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+parser-test-xml-validation.log: parser-test-xml-validation$(EXEEXT)
+ @p='parser-test-xml-validation$(EXEEXT)'; \
+ b='parser-test-xml-validation'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+parser-test-zip-archive.log: parser-test-zip-archive$(EXEEXT)
+ @p='parser-test-zip-archive$(EXEEXT)'; \
+ b='parser-test-zip-archive'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+sax-ns-parser-test.log: sax-ns-parser-test$(EXEEXT)
+ @p='sax-ns-parser-test$(EXEEXT)'; \
+ b='sax-ns-parser-test'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+sax-parser-test.log: sax-parser-test$(EXEEXT)
+ @p='sax-parser-test$(EXEEXT)'; \
+ b='sax-parser-test'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+sax-token-parser-test.log: sax-token-parser-test$(EXEEXT)
+ @p='sax-token-parser-test$(EXEEXT)'; \
+ b='sax-token-parser-test'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+types-test.log: types-test$(EXEEXT)
+ @p='types-test$(EXEEXT)'; \
+ b='types-test'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+utf8-test.log: utf8-test$(EXEEXT)
+ @p='utf8-test$(EXEEXT)'; \
+ b='utf8-test'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+yaml-parser-test.log: yaml-parser-test$(EXEEXT)
+ @p='yaml-parser-test$(EXEEXT)'; \
+ b='yaml-parser-test'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+xml-writer-test.log: xml-writer-test$(EXEEXT)
+ @p='xml-writer-test$(EXEEXT)'; \
+ b='xml-writer-test'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.test$(EXEEXT).log:
+@am__EXEEXT_TRUE@ @p='$<'; \
+@am__EXEEXT_TRUE@ $(am__set_b); \
+@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @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
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES)
+install-EXTRAPROGRAMS: install-libLTLIBRARIES
+
+installdirs:
+ for dir in "$(DESTDIR)$(libdir)"; 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:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -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)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+check-valgrind: check-valgrind-am
+
+check-valgrind-am: check-valgrind-local
+
+check-valgrind-drd: check-valgrind-drd-am
+
+check-valgrind-drd-am: check-valgrind-drd-local
+
+check-valgrind-helgrind: check-valgrind-helgrind-am
+
+check-valgrind-helgrind-am: check-valgrind-helgrind-local
+
+check-valgrind-memcheck: check-valgrind-memcheck-am
+
+check-valgrind-memcheck-am: check-valgrind-memcheck-local
+
+check-valgrind-sgcheck: check-valgrind-sgcheck-am
+
+check-valgrind-sgcheck-am: check-valgrind-sgcheck-local
+
+clean: clean-am
+
+clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -f ./$(DEPDIR)/base64.Plo
+ -rm -f ./$(DEPDIR)/cell_buffer.Plo
+ -rm -f ./$(DEPDIR)/css_parser_base.Plo
+ -rm -f ./$(DEPDIR)/css_parser_test-css_parser_test.Po
+ -rm -f ./$(DEPDIR)/css_types.Plo
+ -rm -f ./$(DEPDIR)/csv_parser_base.Plo
+ -rm -f ./$(DEPDIR)/csv_parser_test-csv_parser_test.Po
+ -rm -f ./$(DEPDIR)/exception.Plo
+ -rm -f ./$(DEPDIR)/json_global.Plo
+ -rm -f ./$(DEPDIR)/json_parser_base.Plo
+ -rm -f ./$(DEPDIR)/json_parser_test-json_parser_test.Po
+ -rm -f ./$(DEPDIR)/json_parser_thread.Plo
+ -rm -f ./$(DEPDIR)/parser_base.Plo
+ -rm -f ./$(DEPDIR)/parser_global.Plo
+ -rm -f ./$(DEPDIR)/parser_global_test-parser_global_test.Po
+ -rm -f ./$(DEPDIR)/parser_test_base-parser_base_test.Po
+ -rm -f ./$(DEPDIR)/parser_test_base64-base64.Po
+ -rm -f ./$(DEPDIR)/parser_test_base64-base64_test.Po
+ -rm -f ./$(DEPDIR)/parser_test_json_validation-parser_test_json_validation.Po
+ -rm -f ./$(DEPDIR)/parser_test_numeric-parser_test_numeric.Po
+ -rm -f ./$(DEPDIR)/parser_test_stream-stream_test.Po
+ -rm -f ./$(DEPDIR)/parser_test_string_pool-string_pool.Po
+ -rm -f ./$(DEPDIR)/parser_test_string_pool-string_pool_test.Po
+ -rm -f ./$(DEPDIR)/parser_test_threaded_json_parser-threaded_json_parser_test.Po
+ -rm -f ./$(DEPDIR)/parser_test_threaded_sax_token_parser-threaded_sax_token_parser_test.Po
+ -rm -f ./$(DEPDIR)/parser_test_xml_namespace-xml_namespace.Po
+ -rm -f ./$(DEPDIR)/parser_test_xml_namespace-xml_namespace_test.Po
+ -rm -f ./$(DEPDIR)/parser_test_xml_validation-parser_test_xml_validation.Po
+ -rm -f ./$(DEPDIR)/parser_test_zip_archive-zip_archive_test.Po
+ -rm -f ./$(DEPDIR)/sax_ns_parser_test-sax_ns_parser_test.Po
+ -rm -f ./$(DEPDIR)/sax_parser_base.Plo
+ -rm -f ./$(DEPDIR)/sax_parser_test-sax_parser_test.Po
+ -rm -f ./$(DEPDIR)/sax_token_parser.Plo
+ -rm -f ./$(DEPDIR)/sax_token_parser_test-sax_token_parser_test.Po
+ -rm -f ./$(DEPDIR)/sax_token_parser_thread.Plo
+ -rm -f ./$(DEPDIR)/stream.Plo
+ -rm -f ./$(DEPDIR)/string_pool.Plo
+ -rm -f ./$(DEPDIR)/tokens.Plo
+ -rm -f ./$(DEPDIR)/types.Plo
+ -rm -f ./$(DEPDIR)/types_test-types_test.Po
+ -rm -f ./$(DEPDIR)/utf8.Plo
+ -rm -f ./$(DEPDIR)/utf8_test-utf8.Po
+ -rm -f ./$(DEPDIR)/utf8_test-utf8_test.Po
+ -rm -f ./$(DEPDIR)/xml_namespace.Plo
+ -rm -f ./$(DEPDIR)/xml_writer.Plo
+ -rm -f ./$(DEPDIR)/xml_writer_test-xml_writer_test.Po
+ -rm -f ./$(DEPDIR)/yaml_parser_base.Plo
+ -rm -f ./$(DEPDIR)/yaml_parser_test-yaml_parser_test.Po
+ -rm -f ./$(DEPDIR)/zip_archive.Plo
+ -rm -f ./$(DEPDIR)/zip_archive_stream.Plo
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-local distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-libLTLIBRARIES
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+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 ./$(DEPDIR)/base64.Plo
+ -rm -f ./$(DEPDIR)/cell_buffer.Plo
+ -rm -f ./$(DEPDIR)/css_parser_base.Plo
+ -rm -f ./$(DEPDIR)/css_parser_test-css_parser_test.Po
+ -rm -f ./$(DEPDIR)/css_types.Plo
+ -rm -f ./$(DEPDIR)/csv_parser_base.Plo
+ -rm -f ./$(DEPDIR)/csv_parser_test-csv_parser_test.Po
+ -rm -f ./$(DEPDIR)/exception.Plo
+ -rm -f ./$(DEPDIR)/json_global.Plo
+ -rm -f ./$(DEPDIR)/json_parser_base.Plo
+ -rm -f ./$(DEPDIR)/json_parser_test-json_parser_test.Po
+ -rm -f ./$(DEPDIR)/json_parser_thread.Plo
+ -rm -f ./$(DEPDIR)/parser_base.Plo
+ -rm -f ./$(DEPDIR)/parser_global.Plo
+ -rm -f ./$(DEPDIR)/parser_global_test-parser_global_test.Po
+ -rm -f ./$(DEPDIR)/parser_test_base-parser_base_test.Po
+ -rm -f ./$(DEPDIR)/parser_test_base64-base64.Po
+ -rm -f ./$(DEPDIR)/parser_test_base64-base64_test.Po
+ -rm -f ./$(DEPDIR)/parser_test_json_validation-parser_test_json_validation.Po
+ -rm -f ./$(DEPDIR)/parser_test_numeric-parser_test_numeric.Po
+ -rm -f ./$(DEPDIR)/parser_test_stream-stream_test.Po
+ -rm -f ./$(DEPDIR)/parser_test_string_pool-string_pool.Po
+ -rm -f ./$(DEPDIR)/parser_test_string_pool-string_pool_test.Po
+ -rm -f ./$(DEPDIR)/parser_test_threaded_json_parser-threaded_json_parser_test.Po
+ -rm -f ./$(DEPDIR)/parser_test_threaded_sax_token_parser-threaded_sax_token_parser_test.Po
+ -rm -f ./$(DEPDIR)/parser_test_xml_namespace-xml_namespace.Po
+ -rm -f ./$(DEPDIR)/parser_test_xml_namespace-xml_namespace_test.Po
+ -rm -f ./$(DEPDIR)/parser_test_xml_validation-parser_test_xml_validation.Po
+ -rm -f ./$(DEPDIR)/parser_test_zip_archive-zip_archive_test.Po
+ -rm -f ./$(DEPDIR)/sax_ns_parser_test-sax_ns_parser_test.Po
+ -rm -f ./$(DEPDIR)/sax_parser_base.Plo
+ -rm -f ./$(DEPDIR)/sax_parser_test-sax_parser_test.Po
+ -rm -f ./$(DEPDIR)/sax_token_parser.Plo
+ -rm -f ./$(DEPDIR)/sax_token_parser_test-sax_token_parser_test.Po
+ -rm -f ./$(DEPDIR)/sax_token_parser_thread.Plo
+ -rm -f ./$(DEPDIR)/stream.Plo
+ -rm -f ./$(DEPDIR)/string_pool.Plo
+ -rm -f ./$(DEPDIR)/tokens.Plo
+ -rm -f ./$(DEPDIR)/types.Plo
+ -rm -f ./$(DEPDIR)/types_test-types_test.Po
+ -rm -f ./$(DEPDIR)/utf8.Plo
+ -rm -f ./$(DEPDIR)/utf8_test-utf8.Po
+ -rm -f ./$(DEPDIR)/utf8_test-utf8_test.Po
+ -rm -f ./$(DEPDIR)/xml_namespace.Plo
+ -rm -f ./$(DEPDIR)/xml_writer.Plo
+ -rm -f ./$(DEPDIR)/xml_writer_test-xml_writer_test.Po
+ -rm -f ./$(DEPDIR)/yaml_parser_base.Plo
+ -rm -f ./$(DEPDIR)/yaml_parser_test-yaml_parser_test.Po
+ -rm -f ./$(DEPDIR)/zip_archive.Plo
+ -rm -f ./$(DEPDIR)/zip_archive_stream.Plo
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-libLTLIBRARIES
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-TESTS \
+ check-am check-valgrind-am check-valgrind-drd-am \
+ check-valgrind-drd-local check-valgrind-helgrind-am \
+ check-valgrind-helgrind-local check-valgrind-local \
+ check-valgrind-memcheck-am check-valgrind-memcheck-local \
+ check-valgrind-sgcheck-am check-valgrind-sgcheck-local clean \
+ clean-generic clean-libLTLIBRARIES clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-local distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ 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-man install-pdf install-pdf-am 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 tags tags-am \
+ uninstall uninstall-am uninstall-libLTLIBRARIES
+
+.PRECIOUS: Makefile
+
+
+distclean-local:
+ rm -rf $(TESTS)
+
+@VALGRIND_CHECK_RULES@
+
+# 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/src/parser/base64.cpp b/src/parser/base64.cpp
new file mode 100644
index 0000000..31b8267
--- /dev/null
+++ b/src/parser/base64.cpp
@@ -0,0 +1,70 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/base64.hpp>
+
+#include <boost/archive/iterators/base64_from_binary.hpp>
+#include <boost/archive/iterators/binary_from_base64.hpp>
+#include <boost/archive/iterators/transform_width.hpp>
+
+using namespace boost::archive::iterators;
+
+namespace orcus {
+
+typedef transform_width<binary_from_base64<std::vector<char>::const_iterator>, 8, 6> to_binary;
+typedef base64_from_binary<transform_width<std::vector<uint8_t>::const_iterator, 6, 8> > to_base64;
+
+std::vector<uint8_t> decode_from_base64(std::string_view base64)
+{
+ if (base64.size() < 4)
+ // Minimum of 4 characters required.
+ return std::vector<uint8_t>{};
+
+ std::vector<char> base64_seq{base64.data(), base64.data() + base64.size()};
+
+ // Check the number of trailing '='s (up to 2).
+ std::size_t pad_size = 0;
+ auto it = base64_seq.rbegin();
+ for (; pad_size < 2; ++pad_size, ++it)
+ {
+ if (*it != '=')
+ break;
+
+ *it = 'A'; // replace it with 'A' which is a base64 encoding of '\0'.
+ }
+
+ std::vector<uint8_t> decoded{to_binary(base64_seq.begin()), to_binary(base64_seq.end())};
+ decoded.erase(decoded.end() - pad_size, decoded.end());
+
+ return decoded;
+}
+
+std::string encode_to_base64(const std::vector<uint8_t>& input)
+{
+ if (input.empty())
+ return std::string{};
+
+ std::vector<uint8_t> inp = input;
+ size_t pad_size = (3 - inp.size() % 3) % 3;
+ inp.resize(inp.size() + pad_size);
+
+ std::string encoded{to_base64(inp.begin()), to_base64(inp.end())};
+
+ auto it = encoded.rbegin();
+ for (size_t i = 0; i < pad_size; ++i, ++it)
+ {
+ // 'A' is a base64 encoding of '\0'
+ // replace them with padding charachters '='
+ if (*it == 'A')
+ *it = '=';
+ }
+
+ return encoded;
+}
+
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/base64_test.cpp b/src/parser/base64_test.cpp
new file mode 100644
index 0000000..9608aef
--- /dev/null
+++ b/src/parser/base64_test.cpp
@@ -0,0 +1,44 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "test_global.hpp"
+#include "orcus/base64.hpp"
+
+#include <cstdlib>
+#include <cstring>
+#include <vector>
+#include <string>
+#include <iterator>
+
+using namespace orcus;
+using namespace std;
+
+void test_base64_text_input(const char* p)
+{
+ cout << "input: '" << p << "'" << endl;
+ size_t n = strlen(p);
+ std::vector<uint8_t> input(p, p+n);
+ std::string encoded = encode_to_base64(input);
+ cout << "encoded: '" << encoded << "'" << endl;
+
+ std::vector<uint8_t> decoded = decode_from_base64(encoded);
+ cout << "decoded: '";
+ std::copy(decoded.begin(), decoded.end(), std::ostream_iterator<char>(cout, ""));
+ cout << "'" << endl;
+
+ assert(input == decoded);
+}
+
+int main()
+{
+ test_base64_text_input("Hello there");
+ test_base64_text_input("World domination!!!");
+ test_base64_text_input("World domination!!");
+ test_base64_text_input("World domination!");
+ return EXIT_SUCCESS;
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/cell_buffer.cpp b/src/parser/cell_buffer.cpp
new file mode 100644
index 0000000..6815d71
--- /dev/null
+++ b/src/parser/cell_buffer.cpp
@@ -0,0 +1,61 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/cell_buffer.hpp"
+
+#include <cstring>
+
+#define ORCUS_DEBUG_CELL_BUFFER 0
+
+#if ORCUS_DEBUG_CELL_BUFFER
+#include <iostream>
+using std::cout;
+using std::endl;
+#endif
+
+namespace orcus {
+
+cell_buffer::cell_buffer() : m_buf_size(0) {}
+
+cell_buffer::~cell_buffer() = default;
+
+void cell_buffer::append(const char* p, size_t len)
+{
+ if (!len)
+ return;
+
+#if ORCUS_DEBUG_CELL_BUFFER
+ cout << "cell_buffer::append: '" << std::string(p, len) << "'" << endl;
+#endif
+
+ size_t size_needed = m_buf_size + len;
+ if (m_buffer.size() < size_needed)
+ m_buffer.resize(size_needed);
+
+ char* p_dest = &m_buffer[m_buf_size];
+ std::strncpy(p_dest, p, len);
+ m_buf_size += len;
+}
+
+void cell_buffer::reset()
+{
+ m_buf_size = 0;
+}
+
+std::string_view cell_buffer::str() const
+{
+ return std::string_view{m_buffer.data(), m_buf_size};
+}
+
+bool cell_buffer::empty() const
+{
+ return m_buf_size == 0;
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/css_parser_base.cpp b/src/parser/css_parser_base.cpp
new file mode 100644
index 0000000..128e5d4
--- /dev/null
+++ b/src/parser/css_parser_base.cpp
@@ -0,0 +1,337 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/css_parser_base.hpp>
+#include <orcus/parser_global.hpp>
+
+#include "utf8.hpp"
+
+#include <cstring>
+#include <cassert>
+#include <cmath>
+#include <limits>
+
+namespace orcus { namespace css {
+
+parser_base::parser_base(std::string_view content) :
+ orcus::parser_base(content.data(), content.size()),
+ m_simple_selector_count(0),
+ m_combinator(combinator_t::descendant) {}
+
+void parser_base::identifier(const char*& p, size_t& len, std::string_view extra)
+{
+ p = mp_char;
+ len = 1;
+ for (next(); has_char(); next(), ++len)
+ {
+ char c = cur_char();
+ if (is_alpha(c) || is_numeric(c) || is_in(c, "-_"))
+ continue;
+
+ if (!extra.empty())
+ {
+ // See if the character is one of the extra allowed characters.
+ if (is_in(c, extra))
+ continue;
+ }
+ return;
+ }
+}
+
+uint8_t parser_base::parse_uint8()
+{
+ // 0 - 255
+ int val = 0;
+ size_t len = 0;
+ for (; has_char() && len <= 3; next())
+ {
+ char c = cur_char();
+ if (!is_numeric(c))
+ break;
+
+ ++len;
+ val *= 10;
+ val += c - '0';
+ }
+
+ if (!len)
+ throw parse_error("parse_uint8: no digit encountered.", offset());
+
+ int maxval = std::numeric_limits<uint8_t>::max();
+ if (val > maxval)
+ val = maxval;
+
+ return static_cast<uint8_t>(val);
+}
+
+std::string_view parser_base::parse_value()
+{
+ auto throw_invalid = [this](uint8_t n_bytes)
+ {
+ std::ostringstream os;
+ os << "parse_value: invalid utf-8 byte length (" << int(n_bytes) << ")";
+ throw parse_error(os.str(), offset());
+ };
+
+ auto check_byte_length_or_throw = [this](uint8_t n_bytes, std::size_t max_size)
+ {
+ if (std::size_t(n_bytes) > max_size)
+ {
+ std::ostringstream os;
+ os << "parse_value: utf-8 byte length is " << int(n_bytes) << " but only " << max_size << " bytes remaining.";
+ throw parse_error(os.str(), offset());
+ }
+ };
+
+ std::size_t max_size = available_size();
+ if (!max_size)
+ return {};
+
+ const char* p0 = mp_char;
+ std::size_t len = 0;
+
+ char c = cur_char();
+ uint8_t n_bytes = calc_utf8_byte_length(c);
+
+ // any of '-+.#' is allowed as first character, while any of '-_.%' is
+ // allowed as second characters.
+
+ switch (n_bytes)
+ {
+ case 1:
+ {
+ if (!is_alpha(c) && !is_numeric(c) && !is_in(c, "-+.#"))
+ parse_error::throw_with("parse_value: illegal first character of a value '", c, "'", offset());
+ break;
+ }
+ case 2:
+ case 3:
+ case 4:
+ {
+ check_byte_length_or_throw(n_bytes, max_size);
+ break;
+ }
+ default:
+ throw_invalid(n_bytes);
+ }
+
+ len += n_bytes;
+ next(n_bytes);
+
+ while (has_char())
+ {
+ c = cur_char();
+ max_size = available_size();
+ n_bytes = calc_utf8_byte_length(c);
+
+ switch (n_bytes)
+ {
+ case 1:
+ {
+ if (!is_alpha(c) && !is_numeric(c) && !is_in(c, "-_.%"))
+ return {p0, len};
+ break;
+ }
+ case 2:
+ case 3:
+ case 4:
+ {
+ check_byte_length_or_throw(n_bytes, max_size);
+ break;
+ }
+ default:
+ throw_invalid(n_bytes);
+ }
+
+ len += n_bytes;
+ next(n_bytes);
+ }
+
+ return {p0, len};
+}
+
+double parser_base::parse_percent()
+{
+ double v = parse_double_or_throw();
+
+ if (*mp_char != '%')
+ parse_error::throw_with(
+ "parse_percent: '%' expected after the numeric value, but '", *mp_char, "' found.", offset());
+
+ next(); // skip the '%'.
+ return v;
+}
+
+double parser_base::parse_double_or_throw()
+{
+ double v = parse_double();
+ if (std::isnan(v))
+ throw parse_error("parse_double: failed to parse double precision value.", offset());
+ return v;
+}
+
+void parser_base::literal(const char*& p, size_t& len, char quote)
+{
+ assert(cur_char() == quote);
+ next();
+ skip_to(p, len, quote);
+
+ if (cur_char() != quote)
+ throw parse_error("literal: end quote has never been reached.", offset());
+}
+
+void parser_base::skip_to(const char*&p, size_t& len, char c)
+{
+ p = mp_char;
+ len = 0;
+ for (; has_char(); next(), ++len)
+ {
+ if (cur_char() == c)
+ return;
+ }
+}
+
+void parser_base::skip_to_or_blank(const char*&p, size_t& len, std::string_view chars)
+{
+ p = mp_char;
+ len = 0;
+ for (; has_char(); next(), ++len)
+ {
+ if (is_blank(*mp_char) || is_in(*mp_char, chars))
+ return;
+ }
+}
+
+void parser_base::skip_blanks()
+{
+ skip(" \t\r\n");
+}
+
+void parser_base::skip_blanks_reverse()
+{
+ const char* p = mp_char + remaining_size();
+ for (; p != mp_char; --p, --mp_end)
+ {
+ if (!is_blank(*p))
+ break;
+ }
+}
+
+void parser_base::shrink_stream()
+{
+ // Skip any leading blanks.
+ skip_blanks();
+
+ if (!remaining_size())
+ return;
+
+ // Skip any trailing blanks.
+ skip_blanks_reverse();
+
+ // Skip leading <!-- if present.
+
+ const char* com_open = "<!--";
+ size_t com_open_len = std::strlen(com_open);
+ if (remaining_size() < com_open_len)
+ // Not enough stream left. Bail out.
+ return;
+
+ const char* p = mp_char;
+ for (size_t i = 0; i < com_open_len; ++i, ++p)
+ {
+ if (*p != com_open[i])
+ return;
+ next();
+ }
+ mp_char = p;
+
+ // Skip leading blanks once again.
+ skip_blanks();
+
+ // Skip trailing --> if present.
+ const char* com_close = "-->";
+ size_t com_close_len = std::strlen(com_close);
+ size_t n = remaining_size();
+ if (n < com_close_len)
+ // Not enough stream left. Bail out.
+ return;
+
+ p = mp_char + n; // move to the last char.
+ for (size_t i = com_close_len; i > 0; --i, --p)
+ {
+ if (*p != com_close[i-1])
+ return;
+ }
+ mp_end -= com_close_len;
+
+ skip_blanks_reverse();
+}
+
+bool parser_base::skip_comment()
+{
+ char c = cur_char();
+ if (c != '/')
+ return false;
+
+ if (remaining_size() > 2 && peek_char() == '*')
+ {
+ next();
+ comment();
+ skip_blanks();
+ return true;
+ }
+
+ return false;
+}
+
+void parser_base::comment()
+{
+ assert(cur_char() == '*');
+
+ // Parse until we reach either EOF or '*/'.
+ bool has_star = false;
+ for (next(); has_char(); next())
+ {
+ char c = cur_char();
+ if (has_star && c == '/')
+ {
+ next();
+ return;
+ }
+ has_star = (c == '*');
+ }
+
+ // EOF reached.
+}
+
+void parser_base::skip_comments_and_blanks()
+{
+ skip_blanks();
+ while (skip_comment())
+ ;
+}
+
+void parser_base::set_combinator(char c, css::combinator_t combinator)
+{
+ if (!m_simple_selector_count)
+ parse_error::throw_with(
+ "set_combinator: combinator '", c, "' encountered without parent element.", offset());
+
+ m_combinator = combinator;
+ next();
+ skip_comments_and_blanks();
+}
+
+void parser_base::reset_before_block()
+{
+ m_simple_selector_count = 0;
+ m_combinator = css::combinator_t::descendant;
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/css_parser_test.cpp b/src/parser/css_parser_test.cpp
new file mode 100644
index 0000000..95f4b1c
--- /dev/null
+++ b/src/parser/css_parser_test.cpp
@@ -0,0 +1,28 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/css_parser.hpp>
+
+#include <cstring>
+
+void test_handler()
+{
+ const char* test_code = "p { background-color: white; }";
+
+ orcus::css_handler hdl;
+ orcus::css_parser<orcus::css_handler> parser(test_code, hdl);
+ parser.parse();
+}
+
+int main()
+{
+ test_handler();
+
+ return EXIT_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/css_types.cpp b/src/parser/css_types.cpp
new file mode 100644
index 0000000..9079159
--- /dev/null
+++ b/src/parser/css_types.cpp
@@ -0,0 +1,198 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/css_types.hpp>
+#include <mdds/sorted_string_map.hpp>
+#include <mdds/global.hpp>
+
+#include <sstream>
+
+namespace orcus { namespace css {
+
+const pseudo_element_t pseudo_element_after = 0x0001;
+const pseudo_element_t pseudo_element_before = 0x0002;
+const pseudo_element_t pseudo_element_first_letter = 0x0004;
+const pseudo_element_t pseudo_element_first_line = 0x0008;
+const pseudo_element_t pseudo_element_selection = 0x0010;
+const pseudo_element_t pseudo_element_backdrop = 0x0020;
+
+namespace {
+
+namespace pseudo_elem {
+
+using map_type = mdds::sorted_string_map<pseudo_element_t, mdds::string_view_map_entry>;
+
+// Keys must be sorted.
+constexpr map_type::entry entries[] = {
+ { "after", pseudo_element_after },
+ { "backdrop", pseudo_element_backdrop },
+ { "before", pseudo_element_before },
+ { "first-letter", pseudo_element_first_letter },
+ { "first-line", pseudo_element_first_line },
+ { "selection", pseudo_element_selection },
+};
+
+const map_type& get()
+{
+ static map_type map(entries, std::size(entries), 0);
+ return map;
+}
+
+} // namespace pseudo_elem
+
+}
+
+pseudo_element_t to_pseudo_element(std::string_view s)
+{
+ return pseudo_elem::get().find(s);
+}
+
+const pseudo_class_t pseudo_class_active = 0x0000000000000001;
+const pseudo_class_t pseudo_class_checked = 0x0000000000000002;
+const pseudo_class_t pseudo_class_default = 0x0000000000000004;
+const pseudo_class_t pseudo_class_dir = 0x0000000000000008;
+const pseudo_class_t pseudo_class_disabled = 0x0000000000000010;
+const pseudo_class_t pseudo_class_empty = 0x0000000000000020;
+const pseudo_class_t pseudo_class_enabled = 0x0000000000000040;
+const pseudo_class_t pseudo_class_first = 0x0000000000000080;
+const pseudo_class_t pseudo_class_first_child = 0x0000000000000100;
+const pseudo_class_t pseudo_class_first_of_type = 0x0000000000000200;
+const pseudo_class_t pseudo_class_fullscreen = 0x0000000000000400;
+const pseudo_class_t pseudo_class_focus = 0x0000000000000800;
+const pseudo_class_t pseudo_class_hover = 0x0000000000001000;
+const pseudo_class_t pseudo_class_indeterminate = 0x0000000000002000;
+const pseudo_class_t pseudo_class_in_range = 0x0000000000004000;
+const pseudo_class_t pseudo_class_invalid = 0x0000000000008000;
+const pseudo_class_t pseudo_class_lang = 0x0000000000010000;
+const pseudo_class_t pseudo_class_last_child = 0x0000000000020000;
+const pseudo_class_t pseudo_class_last_of_type = 0x0000000000040000;
+const pseudo_class_t pseudo_class_left = 0x0000000000080000;
+const pseudo_class_t pseudo_class_link = 0x0000000000100000;
+const pseudo_class_t pseudo_class_not = 0x0000000000200000;
+const pseudo_class_t pseudo_class_nth_child = 0x0000000000400000;
+const pseudo_class_t pseudo_class_nth_last_child = 0x0000000000800000;
+const pseudo_class_t pseudo_class_nth_last_of_type = 0x0000000001000000;
+const pseudo_class_t pseudo_class_nth_of_type = 0x0000000002000000;
+const pseudo_class_t pseudo_class_only_child = 0x0000000004000000;
+const pseudo_class_t pseudo_class_only_of_type = 0x0000000008000000;
+const pseudo_class_t pseudo_class_optional = 0x0000000010000000;
+const pseudo_class_t pseudo_class_out_of_range = 0x0000000020000000;
+const pseudo_class_t pseudo_class_read_only = 0x0000000040000000;
+const pseudo_class_t pseudo_class_read_write = 0x0000000080000000;
+const pseudo_class_t pseudo_class_required = 0x0000000100000000;
+const pseudo_class_t pseudo_class_right = 0x0000000200000000;
+const pseudo_class_t pseudo_class_root = 0x0000000400000000;
+const pseudo_class_t pseudo_class_scope = 0x0000000800000000;
+const pseudo_class_t pseudo_class_target = 0x0000001000000000;
+const pseudo_class_t pseudo_class_valid = 0x0000002000000000;
+const pseudo_class_t pseudo_class_visited = 0x0000004000000000;
+
+namespace {
+
+namespace pseudo_class {
+
+using map_type = mdds::sorted_string_map<pseudo_class_t, mdds::string_view_map_entry>;
+
+// Keys must be sorted.
+constexpr map_type::entry entries[] = {
+ { "active", pseudo_class_active },
+ { "checked", pseudo_class_checked },
+ { "default", pseudo_class_default },
+ { "dir", pseudo_class_dir },
+ { "disabled", pseudo_class_disabled },
+ { "empty", pseudo_class_empty },
+ { "enabled", pseudo_class_enabled },
+ { "first", pseudo_class_first },
+ { "first-child", pseudo_class_first_child },
+ { "first-of-type", pseudo_class_first_of_type },
+ { "focus", pseudo_class_focus },
+ { "fullscreen", pseudo_class_fullscreen },
+ { "hover", pseudo_class_hover },
+ { "in-range", pseudo_class_in_range },
+ { "indeterminate", pseudo_class_indeterminate },
+ { "invalid", pseudo_class_invalid },
+ { "lang", pseudo_class_lang },
+ { "last-child", pseudo_class_last_child },
+ { "last-of-type", pseudo_class_last_of_type },
+ { "left", pseudo_class_left },
+ { "link", pseudo_class_link },
+ { "not", pseudo_class_not },
+ { "nth-child", pseudo_class_nth_child },
+ { "nth-last-child", pseudo_class_nth_last_child },
+ { "nth-last-of-type", pseudo_class_nth_last_of_type },
+ { "nth-of-type", pseudo_class_nth_of_type },
+ { "only-child", pseudo_class_only_child },
+ { "only-of-type", pseudo_class_only_of_type },
+ { "optional", pseudo_class_optional },
+ { "out-of-range", pseudo_class_out_of_range },
+ { "read-only", pseudo_class_read_only },
+ { "read-write", pseudo_class_read_write },
+ { "required", pseudo_class_required },
+ { "right", pseudo_class_right },
+ { "root", pseudo_class_root },
+ { "scope", pseudo_class_scope },
+ { "target", pseudo_class_target },
+ { "valid", pseudo_class_valid },
+ { "visited", pseudo_class_visited },
+};
+
+const map_type& get()
+{
+ static map_type map(entries, std::size(entries), 0);
+ return map;
+}
+
+} // namespace pseudo_class
+
+}
+
+pseudo_class_t to_pseudo_class(std::string_view s)
+{
+ return pseudo_class::get().find(s);
+}
+
+std::string pseudo_class_to_string(pseudo_class_t val)
+{
+ std::ostringstream os;
+ std::size_t n = std::size(pseudo_class::entries);
+ const pseudo_class::map_type::entry* p = pseudo_class::entries;
+ const pseudo_class::map_type::entry* p_end = p + n;
+ for (; p != p_end; ++p)
+ {
+ if (val & p->value)
+ os << ":" << p->key;
+ }
+
+ return os.str();
+}
+
+namespace {
+
+typedef mdds::sorted_string_map<property_function_t> propfunc_map_type;
+
+// Keys must be sorted.
+propfunc_map_type::entry propfunc_type_entries[] = {
+ { MDDS_ASCII("hsl"), property_function_t::hsl },
+ { MDDS_ASCII("hsla"), property_function_t::hsla },
+ { MDDS_ASCII("rgb"), property_function_t::rgb },
+ { MDDS_ASCII("rgba"), property_function_t::rgba },
+ { MDDS_ASCII("url"), property_function_t::url }
+};
+
+}
+
+property_function_t to_property_function(std::string_view s)
+{
+ static propfunc_map_type propfunc_map(
+ propfunc_type_entries, std::size(propfunc_type_entries), property_function_t::unknown);
+
+ return propfunc_map.find(s.data(), s.size());
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/csv_parser_base.cpp b/src/parser/csv_parser_base.cpp
new file mode 100644
index 0000000..1bf914c
--- /dev/null
+++ b/src/parser/csv_parser_base.cpp
@@ -0,0 +1,47 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/csv_parser_base.hpp"
+
+#include <cstring>
+
+namespace orcus { namespace csv {
+
+parser_config::parser_config() :
+ text_qualifier('\0'),
+ trim_cell_value(false) {}
+
+parser_base::parser_base(
+ std::string_view content, const csv::parser_config& config) :
+ ::orcus::parser_base(content.data(), content.size()), m_config(config)
+{
+ skip_bom();
+}
+
+bool parser_base::is_blank(char c) const
+{
+ return is_in(c, " \t");
+}
+
+bool parser_base::is_delim(char c) const
+{
+ return m_config.delimiters.find(c) != std::string::npos;
+}
+
+bool parser_base::is_text_qualifier(char c) const
+{
+ return m_config.text_qualifier == c;
+}
+
+void parser_base::skip_blanks()
+{
+ skip(" \t");
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/csv_parser_test.cpp b/src/parser/csv_parser_test.cpp
new file mode 100644
index 0000000..18470f0
--- /dev/null
+++ b/src/parser/csv_parser_test.cpp
@@ -0,0 +1,29 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/csv_parser.hpp>
+
+#include <cstring>
+
+void test_handler()
+{
+ const char* test_code = "1,2,3,4,5\n6,7,8,9,10\n";
+
+ orcus::csv_handler hdl;
+ orcus::csv::parser_config config;
+ orcus::csv_parser<orcus::csv_handler> parser(test_code, hdl, config);
+ parser.parse();
+}
+
+int main()
+{
+ test_handler();
+
+ return EXIT_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/exception.cpp b/src/parser/exception.cpp
new file mode 100644
index 0000000..1d958fd
--- /dev/null
+++ b/src/parser/exception.cpp
@@ -0,0 +1,141 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/exception.hpp"
+
+#include <sstream>
+
+using namespace std;
+
+namespace orcus {
+
+general_error::general_error(std::string msg) :
+ m_msg(std::move(msg))
+{
+}
+
+general_error::general_error(std::string_view cls, std::string_view msg)
+{
+ std::ostringstream os;
+ os << cls << ": " << msg;
+ m_msg = os.str();
+}
+
+general_error::~general_error() noexcept = default;
+
+const char* general_error::what() const noexcept
+{
+ return m_msg.c_str();
+}
+
+void general_error::append_msg(const std::string& s)
+{
+ m_msg += s;
+}
+
+invalid_arg_error::invalid_arg_error(const std::string& msg) :
+ std::invalid_argument(msg) {}
+
+invalid_arg_error::~invalid_arg_error() noexcept {}
+
+xml_structure_error::xml_structure_error(std::string msg) :
+ general_error(std::move(msg)) {}
+
+xml_structure_error::~xml_structure_error() noexcept = default;
+
+json_structure_error::json_structure_error(std::string msg) :
+ general_error(std::move(msg)) {}
+
+json_structure_error::~json_structure_error() noexcept = default;
+
+invalid_map_error::invalid_map_error(std::string msg) :
+ general_error(std::move(msg)) {}
+
+invalid_map_error::~invalid_map_error() noexcept = default;
+
+value_error::value_error(std::string msg) :
+ general_error(std::move(msg)) {}
+
+value_error::~value_error() noexcept = default;
+
+xpath_error::xpath_error(std::string msg) : general_error(std::move(msg)) {}
+
+xpath_error::~xpath_error() noexcept = default;
+
+interface_error::interface_error(std::string msg) : general_error(std::move(msg)) {}
+
+interface_error::~interface_error() noexcept = default;
+
+namespace {
+
+std::string build_offset_msg(std::ptrdiff_t offset)
+{
+ std::ostringstream os;
+ os << " (offset=" << offset << ')';
+ return os.str();
+}
+
+std::string build_message(std::string_view msg_before, char c, std::string_view msg_after)
+{
+ std::ostringstream os;
+ os << msg_before << c << msg_after;
+ return os.str();
+}
+
+std::string build_message(
+ std::string_view msg_before, std::string_view msg, std::string_view msg_after)
+{
+ std::ostringstream os;
+ os << msg_before << msg << msg_after;
+ return os.str();
+}
+
+}
+
+parse_error::parse_error(std::string_view cls, std::string_view msg, std::ptrdiff_t offset) :
+ general_error(cls, msg), m_offset(offset)
+{
+ append_msg(build_offset_msg(offset));
+}
+
+parse_error::parse_error(std::string msg, std::ptrdiff_t offset) :
+ general_error(std::move(msg)), m_offset(offset)
+{
+ append_msg(build_offset_msg(offset));
+}
+
+std::ptrdiff_t parse_error::offset() const
+{
+ return m_offset;
+}
+
+void parse_error::throw_with(
+ std::string_view msg_before, char c, std::string_view msg_after, std::ptrdiff_t offset)
+{
+ throw parse_error(build_message(msg_before, c, msg_after), offset);
+}
+
+void parse_error::throw_with(
+ std::string_view msg_before, std::string_view msg, std::string_view msg_after, std::ptrdiff_t offset)
+{
+ throw parse_error(build_message(msg_before, msg, msg_after), offset);
+}
+
+malformed_xml_error::malformed_xml_error(std::string_view msg, std::ptrdiff_t offset) :
+ orcus::parse_error("malformed_xml_error", msg, offset) {}
+
+malformed_xml_error::~malformed_xml_error() = default;
+
+zip_error::zip_error(std::string_view msg) : general_error("zip_error", msg)
+{
+}
+
+zip_error::~zip_error() = default;
+
+} // namespace orcus
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/json_global.cpp b/src/parser/json_global.cpp
new file mode 100644
index 0000000..f01f778
--- /dev/null
+++ b/src/parser/json_global.cpp
@@ -0,0 +1,46 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/json_global.hpp"
+#include "orcus/parser_global.hpp"
+
+#include <sstream>
+
+namespace orcus { namespace json {
+
+namespace {
+
+const char backslash = '\\';
+
+}
+
+std::string escape_string(const std::string& input)
+{
+ std::ostringstream os;
+
+ for (auto it = input.begin(), ite = input.end(); it != ite; ++it)
+ {
+ char c = *it;
+ if (c == '"')
+ // Escape double quote, but not forward slash.
+ os << backslash;
+ else if (c == backslash)
+ {
+ // Escape a '\' if and only if the next character is not one of control characters.
+ auto itnext = it + 1;
+ if (itnext == ite || get_string_escape_char_type(*itnext) != string_escape_char_t::control_char)
+ os << backslash;
+ }
+ os << c;
+ }
+
+ return os.str();
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/json_parser_base.cpp b/src/parser/json_parser_base.cpp
new file mode 100644
index 0000000..0dcdc3b
--- /dev/null
+++ b/src/parser/json_parser_base.cpp
@@ -0,0 +1,104 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/json_parser_base.hpp"
+#include "orcus/cell_buffer.hpp"
+#include "numeric_parser.hpp"
+
+#include <cassert>
+#include <cmath>
+
+namespace orcus { namespace json {
+
+namespace {
+
+const char* parse_numeric_json(const char* p, const char* p_end, double& value)
+{
+ using numeric_parser_type = detail::numeric_parser<detail::json_parser_trait>;
+
+ numeric_parser_type parser(p, p_end);
+ double v = parser.parse();
+ if (!std::isnan(v))
+ p = parser.get_char_position();
+
+ value = v;
+ return p;
+};
+
+} // anonymous namespace
+
+struct parser_base::impl
+{
+ cell_buffer m_buffer;
+};
+
+parser_base::parser_base(std::string_view content) :
+ orcus::parser_base(content.data(), content.size()), mp_impl(std::make_unique<impl>())
+{
+
+ set_numeric_parser(parse_numeric_json);
+}
+
+parser_base::~parser_base() {}
+
+void parser_base::skip_ws()
+{
+ skip(" \n\r\t");
+}
+
+void parser_base::parse_true()
+{
+ if (!parse_expected("true"))
+ throw parse_error("parse_true: boolean 'true' expected.", offset());
+
+ skip_ws();
+}
+
+void parser_base::parse_false()
+{
+ if (!parse_expected("false"))
+ throw parse_error("parse_false: boolean 'false' expected.", offset());
+
+ skip_ws();
+}
+
+void parser_base::parse_null()
+{
+ if (!parse_expected("null"))
+ throw parse_error("parse_null: null expected.", offset());
+
+ skip_ws();
+}
+
+double parser_base::parse_double_or_throw()
+{
+ double v = parse_double();
+ if (std::isnan(v))
+ throw parse_error("parse_double_or_throw: failed to parse double precision value.", offset());
+ return v;
+}
+
+parse_quoted_string_state parser_base::parse_string()
+{
+ assert(cur_char() == '"');
+ size_t max_length = remaining_size();
+ const char* p = mp_char;
+ parse_quoted_string_state ret = parse_double_quoted_string(p, max_length, mp_impl->m_buffer);
+ if (ret.has_control_character)
+ throw parse_error("parse_string: string contains a control character.", offset());
+
+ mp_char = p;
+
+ if (ret.str)
+ skip_ws();
+
+ return ret;
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/json_parser_test.cpp b/src/parser/json_parser_test.cpp
new file mode 100644
index 0000000..db64861
--- /dev/null
+++ b/src/parser/json_parser_test.cpp
@@ -0,0 +1,28 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/json_parser.hpp>
+
+#include <cstring>
+
+void test_handler()
+{
+ const char* test_code = "{\"key1\": [1,2,3,4,5], \"key2\": 12.3}";
+
+ orcus::json_handler hdl;
+ orcus::json_parser<orcus::json_handler> parser(test_code, hdl);
+ parser.parse();
+}
+
+int main()
+{
+ test_handler();
+
+ return EXIT_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/json_parser_thread.cpp b/src/parser/json_parser_thread.cpp
new file mode 100644
index 0000000..a07bb61
--- /dev/null
+++ b/src/parser/json_parser_thread.cpp
@@ -0,0 +1,294 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/json_parser_thread.hpp>
+#include <orcus/json_parser.hpp>
+#include <orcus/string_pool.hpp>
+#include <orcus/detail/parser_token_buffer.hpp>
+
+#include <sstream>
+#include <string_view>
+#include <algorithm>
+#include <limits>
+
+namespace orcus { namespace json {
+
+parse_token::parse_token() : type(parse_token_t::unknown), value(0.0) {}
+
+parse_token::parse_token(parse_token_t _type) : type(_type), value(0.0) {}
+
+parse_token::parse_token(parse_token_t _type, std::string_view s) :
+ type(_type), value(s)
+{
+}
+
+parse_token::parse_token(std::string_view s, std::ptrdiff_t offset) :
+ type(parse_token_t::parse_error), value(parse_error_value_t{s, offset})
+{
+ assert(type == parse_token_t::parse_error);
+}
+
+parse_token::parse_token(double v) :
+ type(parse_token_t::number), value(v)
+{
+}
+
+parse_token::parse_token(const parse_token& other) :
+ type(other.type), value(other.value)
+{
+}
+
+bool parse_token::operator== (const parse_token& other) const
+{
+ return type == other.type && value == other.value;
+}
+
+bool parse_token::operator!= (const parse_token& other) const
+{
+ return !operator== (other);
+}
+
+/**
+ * This impl class also acts as a handler for the parser.
+ *
+ */
+struct parser_thread::impl
+{
+ detail::thread::parser_token_buffer<parse_tokens_t> m_token_buffer;
+ string_pool m_pool;
+ parse_tokens_t m_parser_tokens; // token buffer for the parser thread.
+
+ const char* mp_char;
+ size_t m_size;
+
+ impl(const char* p, size_t n, size_t min_token_size, size_t max_token_size) :
+ m_token_buffer(min_token_size, max_token_size),
+ mp_char(p), m_size(n)
+ {
+ m_parser_tokens.reserve(min_token_size);
+ }
+
+ void start()
+ {
+ try
+ {
+ json_parser<parser_thread::impl> parser({mp_char, m_size}, *this);
+ parser.parse();
+ }
+ catch (const parse_error& e)
+ {
+ std::string_view s = m_pool.intern(e.what()).first;
+ m_parser_tokens.emplace_back(s, e.offset());
+ }
+
+ notify_and_finish();
+ }
+
+ void begin_parse()
+ {
+ m_parser_tokens.emplace_back(parse_token_t::begin_parse);
+ check_and_notify();
+ }
+
+ void end_parse()
+ {
+ m_parser_tokens.emplace_back(parse_token_t::end_parse);
+ check_and_notify();
+ }
+
+ void begin_array()
+ {
+ m_parser_tokens.emplace_back(parse_token_t::begin_array);
+ check_and_notify();
+ }
+
+ void end_array()
+ {
+ m_parser_tokens.emplace_back(parse_token_t::end_array);
+ check_and_notify();
+ }
+
+ void begin_object()
+ {
+ m_parser_tokens.emplace_back(parse_token_t::begin_object);
+ check_and_notify();
+ }
+
+ void object_key(std::string_view s, bool transient)
+ {
+ if (transient)
+ s = m_pool.intern(s).first;
+
+ m_parser_tokens.emplace_back(parse_token_t::object_key, s);
+ check_and_notify();
+ }
+
+ void end_object()
+ {
+ m_parser_tokens.emplace_back(parse_token_t::end_object);
+ check_and_notify();
+ }
+
+ void boolean_true()
+ {
+ m_parser_tokens.emplace_back(parse_token_t::boolean_true);
+ check_and_notify();
+ }
+
+ void boolean_false()
+ {
+ m_parser_tokens.emplace_back(parse_token_t::boolean_false);
+ check_and_notify();
+ }
+
+ void null()
+ {
+ m_parser_tokens.emplace_back(parse_token_t::null);
+ check_and_notify();
+ }
+
+ void string(std::string_view s, bool transient)
+ {
+ if (transient)
+ s = m_pool.intern(s).first;
+
+ m_parser_tokens.emplace_back(parse_token_t::string, s);
+ check_and_notify();
+ }
+
+ void number(double val)
+ {
+ m_parser_tokens.emplace_back(val);
+ check_and_notify();
+ }
+
+ void check_and_notify()
+ {
+ m_token_buffer.check_and_notify(m_parser_tokens);
+ }
+
+ void notify_and_finish()
+ {
+ m_token_buffer.notify_and_finish(m_parser_tokens);
+ }
+
+ bool next_tokens(parse_tokens_t& tokens)
+ {
+ return m_token_buffer.next_tokens(tokens);
+ }
+
+ parser_stats get_stats() const
+ {
+ parser_stats stats;
+ stats.token_buffer_size_threshold = m_token_buffer.token_size_threshold();
+ return stats;
+ }
+
+ void swap_string_pool(string_pool& pool)
+ {
+ m_pool.swap(pool);
+ }
+};
+
+std::ostream& operator<< (std::ostream& os, const parse_tokens_t& tokens)
+{
+ using std::endl;
+
+ os << "token size: " << tokens.size() << endl;
+
+ std::for_each(tokens.begin(), tokens.end(),
+ [&](const parse_token& t)
+ {
+ switch (t.type)
+ {
+ case parse_token_t::begin_array:
+ os << "- begin_array" << endl;
+ break;
+ case parse_token_t::begin_object:
+ os << "- begin_object" << endl;
+ break;
+ case parse_token_t::begin_parse:
+ os << "- begin_parse" << endl;
+ break;
+ case parse_token_t::boolean_false:
+ os << "- boolean_false" << endl;
+ break;
+ case parse_token_t::boolean_true:
+ os << "- boolean_true" << endl;
+ break;
+ case parse_token_t::end_array:
+ os << "- end_array" << endl;
+ break;
+ case parse_token_t::end_object:
+ os << "- end_object" << endl;
+ break;
+ case parse_token_t::end_parse:
+ os << "- end_parse" << endl;
+ break;
+ case parse_token_t::null:
+ os << "- null" << endl;
+ break;
+ case parse_token_t::number:
+ os << "- number (v=" << std::get<double>(t.value) << ")" << endl;
+ break;
+ case parse_token_t::object_key:
+ os << "- object_key (v=" << std::get<std::string_view>(t.value) << ")" << endl;
+ break;
+ case parse_token_t::parse_error:
+ {
+ auto v = std::get<parse_error_value_t>(t.value);
+ os << "- parse_error (v=" << v.str << ", offset=" << v.offset << ")" << endl;
+ break;
+ }
+ case parse_token_t::string:
+ os << "- string (" << std::get<std::string_view>(t.value) << ")" << endl;
+ break;
+ case parse_token_t::unknown:
+ os << "- unknown" << endl;
+ break;
+ default:
+ ;
+ }
+ }
+ );
+
+ return os;
+}
+
+parser_thread::parser_thread(const char* p, size_t n, size_t min_token_size) :
+ mp_impl(std::make_unique<parser_thread::impl>(
+ p, n, min_token_size, std::numeric_limits<size_t>::max()/2)) {}
+
+parser_thread::parser_thread(const char* p, size_t n, size_t min_token_size, size_t max_token_size) :
+ mp_impl(std::make_unique<parser_thread::impl>(
+ p, n, min_token_size, max_token_size)) {}
+
+parser_thread::~parser_thread() {}
+
+void parser_thread::start()
+{
+ mp_impl->start();
+}
+
+bool parser_thread::next_tokens(parse_tokens_t& tokens)
+{
+ return mp_impl->next_tokens(tokens);
+}
+
+parser_stats parser_thread::get_stats() const
+{
+ return mp_impl->get_stats();
+}
+
+void parser_thread::swap_string_pool(string_pool& pool)
+{
+ mp_impl->swap_string_pool(pool);
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/parser_base.cpp b/src/parser/parser_base.cpp
new file mode 100644
index 0000000..e49af71
--- /dev/null
+++ b/src/parser/parser_base.cpp
@@ -0,0 +1,222 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/parser_base.hpp"
+#include "orcus/parser_global.hpp"
+#include "cpu_features.hpp"
+
+#include <sstream>
+#include <cstring>
+#include <limits>
+#include <cassert>
+#include <algorithm>
+
+#ifdef __ORCUS_CPU_FEATURES
+#include <immintrin.h>
+#endif
+
+namespace orcus {
+
+parser_base::parser_base(const char* p, size_t n) :
+ mp_begin(p), mp_char(p), mp_end(p+n),
+ m_func_parse_numeric(parse_numeric)
+{
+}
+
+void parser_base::prev(size_t dec)
+{
+ mp_char -= dec;
+}
+
+char parser_base::peek_char(std::size_t offset) const
+{
+ return *(mp_char + offset);
+}
+
+std::string_view parser_base::peek_chars(std::size_t length) const
+{
+ return {mp_char, length};
+}
+
+void parser_base::skip_bom()
+{
+ // Skip one or more UTF-8 BOM's.
+ constexpr std::string_view BOM = "\xEF\xBB\xBF";
+
+ while (true)
+ {
+ if (available_size() < 3)
+ return;
+
+ if (peek_chars(3) != BOM)
+ return;
+
+ next(3);
+ }
+}
+
+void parser_base::skip(std::string_view chars_to_skip)
+{
+#if defined(__ORCUS_CPU_FEATURES) && defined(__SSE4_2__)
+ __m128i match = _mm_loadu_si128((const __m128i*)chars_to_skip.data());
+ const int mode = _SIDD_LEAST_SIGNIFICANT | _SIDD_CMP_EQUAL_ANY | _SIDD_UBYTE_OPS | _SIDD_NEGATIVE_POLARITY;
+
+ int n_total = available_size();
+
+ while (n_total)
+ {
+ __m128i char_block = _mm_loadu_si128((const __m128i*)mp_char);
+
+ // Find position of the first character that is NOT any of the
+ // characters to skip.
+ int n = std::min<int>(16, n_total);
+ int r = _mm_cmpestri(match, chars_to_skip.size(), char_block, n, mode);
+
+ if (!r)
+ // No characters to skip. Bail out.
+ break;
+
+ mp_char += r; // Move the current char position.
+
+ if (r < 16)
+ // No need to move to the next segment. Stop here.
+ break;
+
+ // Skip 16 chars to the next segment.
+ n_total -= 16;
+ }
+#else
+ for (; has_char(); next())
+ {
+ if (!is_in(*mp_char, chars_to_skip))
+ break;
+ }
+#endif
+}
+
+void parser_base::skip_space_and_control()
+{
+#if defined(__ORCUS_CPU_FEATURES) && defined(__AVX2__)
+ size_t n_total = available_size();
+ const __m256i ws = _mm256_set1_epi8(' '); // whitespaces
+ const __m256i sb = _mm256_set1_epi8(0x80); // signed bit on.
+
+ while (n_total)
+ {
+ // The 'results' stores (for each 8-bit int) 0x00 if the char is less
+ // than or equal to whitespace, or the char is "negative" i.e. the
+ // signed bit is on IOW greater than 127.
+ __m256i char_block = _mm256_loadu_si256(reinterpret_cast<const __m256i*>(mp_char));
+ __m256i results = _mm256_cmpgt_epi8(char_block, ws); // NB: this is a signed comparison.
+ results = _mm256_or_si256(results, _mm256_and_si256(char_block, sb));
+ int r = _mm256_movemask_epi8(results);
+ r = _tzcnt_u32(r);
+ r = std::min<size_t>(r, n_total);
+
+ if (!r)
+ // No characters to skip. Bail out.
+ break;
+
+ mp_char += r; // Move the current char position.
+
+ if (r < 32)
+ // No need to move to the next segment. Stop here.
+ break;
+
+ n_total -= 32;
+ }
+
+#elif defined(__ORCUS_CPU_FEATURES) && defined(__SSE4_2__)
+ __m128i match = _mm_loadu_si128((const __m128i*)"\0 ");
+ const int mode = _SIDD_LEAST_SIGNIFICANT | _SIDD_CMP_RANGES | _SIDD_UBYTE_OPS | _SIDD_NEGATIVE_POLARITY;
+
+ size_t n_total = available_size();
+
+ while (n_total)
+ {
+ __m128i char_block = _mm_loadu_si128((const __m128i*)mp_char);
+
+ // Find position of the first character that is NOT any of the
+ // characters to skip.
+ int n = std::min<size_t>(16u, n_total);
+ int r = _mm_cmpestri(match, 2, char_block, n, mode);
+
+ if (!r)
+ // No characters to skip. Bail out.
+ break;
+
+ mp_char += r; // Move the current char position.
+
+ if (r < 16)
+ // No need to move to the next segment. Stop here.
+ break;
+
+ // Skip 16 chars to the next segment.
+ n_total -= 16;
+ }
+#else
+ for (; mp_char != mp_end && ((unsigned char)*mp_char) <= (unsigned char)' '; ++mp_char)
+ ;
+#endif
+}
+
+bool parser_base::parse_expected(std::string_view expected)
+{
+ if (expected.size() > available_size())
+ return false;
+
+#if defined(__ORCUS_CPU_FEATURES) && defined(__SSE4_2__)
+ __m128i v_expected = _mm_loadu_si128((const __m128i*)expected.data());
+ __m128i v_char_block = _mm_loadu_si128((const __m128i*)mp_char);
+
+ const int mode = _SIDD_CMP_EQUAL_ORDERED | _SIDD_UBYTE_OPS | _SIDD_BIT_MASK;
+ __m128i res = _mm_cmpestrm(v_expected, expected.size(), v_char_block, expected.size(), mode);
+ int mask = _mm_cvtsi128_si32(res);
+
+ if (mask)
+ mp_char += expected.size();
+
+ return mask;
+#else
+ const char* p = expected.data();
+ for (size_t i = 0; i < expected.size(); ++i, ++p, next())
+ {
+ if (cur_char() != *p)
+ return false;
+ }
+
+ return true;
+#endif
+}
+
+double parser_base::parse_double()
+{
+ size_t max_length = available_size();
+ const char* p = mp_char;
+ double val;
+ p = m_func_parse_numeric(p, p + max_length, val);
+ if (p == mp_char)
+ return std::numeric_limits<double>::quiet_NaN();
+
+ mp_char = p;
+ return val;
+}
+
+size_t parser_base::remaining_size() const
+{
+ size_t n = available_size();
+ return n ? (n - 1) : 0;
+}
+
+std::ptrdiff_t parser_base::offset() const
+{
+ return std::distance(mp_begin, mp_char);
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/parser_base_test.cpp b/src/parser/parser_base_test.cpp
new file mode 100644
index 0000000..74994da
--- /dev/null
+++ b/src/parser/parser_base_test.cpp
@@ -0,0 +1,74 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "test_global.hpp"
+#include "orcus/parser_base.hpp"
+
+using namespace std;
+using namespace orcus;
+
+void test_skip_space_and_control()
+{
+ class _test_type : public orcus::parser_base
+ {
+ public:
+ _test_type(const char* p, size_t n) : orcus::parser_base(p, n) {}
+
+ void run()
+ {
+ skip_space_and_control();
+ }
+
+ bool has_char() const
+ {
+ return orcus::parser_base::has_char();
+ }
+
+ size_t available_size() const
+ {
+ return orcus::parser_base::available_size();
+ }
+
+ char get_char() const
+ {
+ return *mp_char;
+ }
+ };
+
+ // Create a series of variable-legnth blank strings and make sure the
+ // function correctly skips all the empty characters.
+
+ for (size_t i = 0; i < 32; ++i)
+ {
+ std::string s(i, ' ');
+ assert(s.size() == i);
+
+ _test_type test(s.data(), s.size());
+ assert(test.available_size() == s.size());
+
+ test.run();
+ assert(!test.has_char()); // There should be no more characters to parse.
+
+ s.push_back('a');
+
+ _test_type test2(s.data(), s.size());
+ assert(test2.available_size() == s.size());
+
+ test2.run();
+ assert(test2.has_char()); // The current position should be on the 'a'.
+ assert(test2.get_char() == 'a');
+ }
+}
+
+int main()
+{
+ test_skip_space_and_control();
+
+ return EXIT_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/parser_global.cpp b/src/parser/parser_global.cpp
new file mode 100644
index 0000000..5489e21
--- /dev/null
+++ b/src/parser/parser_global.cpp
@@ -0,0 +1,515 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/parser_global.hpp>
+#include <orcus/cell_buffer.hpp>
+#include <orcus/exception.hpp>
+
+#include "numeric_parser.hpp"
+
+#include <cassert>
+#include <cmath>
+#include <iostream>
+#include <limits>
+#include <algorithm>
+#include <cctype>
+
+namespace orcus {
+
+const size_t parse_quoted_string_state::error_no_closing_quote = 1;
+const size_t parse_quoted_string_state::error_illegal_escape_char = 2;
+
+bool is_blank(char c)
+{
+ return is_in(c, " \t\n\r");
+}
+
+bool is_alpha(char c)
+{
+ return std::isalpha(static_cast<unsigned char>(c));
+}
+
+bool is_numeric(char c)
+{
+ return std::isdigit(static_cast<unsigned char>(c));
+}
+
+bool is_in(char c, std::string_view allowed)
+{
+#ifdef __ORCUS_DEBUG_UTILS
+ if (allowed.empty())
+ throw std::invalid_argument("'allowed' string should not be empty.");
+#endif
+ auto f = [c](char c_allowed) { return c == c_allowed; };
+ return std::any_of(allowed.begin(), allowed.end(), f);
+}
+
+const char* parse_numeric(const char* p, const char* p_end, double& value)
+{
+ using numeric_parser_type = detail::numeric_parser<detail::generic_parser_trait>;
+
+ numeric_parser_type parser(p, p_end);
+ double v = parser.parse();
+ if (!std::isnan(v))
+ p = parser.get_char_position();
+
+ value = v;
+ return p;
+}
+
+const char* parse_integer(const char* p, const char* p_end, long& value)
+{
+ if (p >= p_end)
+ return p;
+
+ long result = 0.0;
+ bool negative_sign = false;
+
+ // Check for presence of a sign.
+ if (p != p_end)
+ {
+ switch (*p)
+ {
+ case '+':
+ ++p;
+ break;
+ case '-':
+ negative_sign = true;
+ ++p;
+ break;
+ default:
+ ;
+ }
+ }
+
+ for (; p != p_end; ++p)
+ {
+ if (*p < '0' || '9' < *p)
+ {
+ value = negative_sign ? -result : result;
+ return p;
+ }
+
+ result *= 10;
+ result += *p - '0';
+ }
+
+ value = negative_sign ? -result : result;
+ return p;
+}
+
+string_escape_char_t get_string_escape_char_type(char c)
+{
+ switch (c)
+ {
+ case '"':
+ case '\\':
+ case '/':
+ return string_escape_char_t::valid;
+ case 'b': // backspace
+ case 'f': // formfeed
+ case 'n': // newline
+ case 'r': // carriage return
+ case 't': // horizontal tab
+ return string_escape_char_t::control_char;
+ default:
+ ;
+ }
+
+ return string_escape_char_t::invalid;
+}
+
+namespace {
+
+parse_quoted_string_state parse_string_with_escaped_char(
+ const char*& p, size_t max_length, const char* p_parsed, size_t n_parsed, char c,
+ cell_buffer& buffer)
+{
+ const char* p_end = p + max_length;
+
+ parse_quoted_string_state ret;
+ ret.str = nullptr;
+ ret.length = 0;
+ ret.transient = true;
+ ret.has_control_character = false;
+
+ // Start the buffer with the string we've parsed so far.
+ buffer.reset();
+ if (p_parsed && n_parsed)
+ buffer.append(p_parsed, n_parsed);
+ buffer.append(&c, 1);
+
+ ++p;
+ if (p == p_end)
+ {
+ ret.length = parse_quoted_string_state::error_no_closing_quote;
+ return ret;
+ }
+
+ size_t len = 0;
+ const char* p_head = p;
+ bool escape = false;
+
+ for (; p != p_end; ++p, ++len)
+ {
+ c = *p;
+
+ if (escape)
+ {
+ escape = false;
+
+ switch (get_string_escape_char_type(c))
+ {
+ case string_escape_char_t::valid:
+ buffer.append(p_head, len-1);
+ buffer.append(&c, 1);
+ ++p;
+ len = 0;
+ p_head = p;
+ break;
+ case string_escape_char_t::control_char:
+ // do nothing on control characters.
+ break;
+ case string_escape_char_t::invalid:
+ default:
+ ret.length = parse_quoted_string_state::error_illegal_escape_char;
+ return ret;
+ }
+ }
+
+ switch (*p)
+ {
+ case '"':
+ {
+ // closing quote.
+ buffer.append(p_head, len);
+ ++p; // skip the quote.
+ std::string_view s = buffer.str();
+ ret.str = s.data();
+ ret.length = s.size();
+ return ret;
+ }
+ case '\\':
+ {
+ escape = true;
+ continue;
+ }
+ default:
+ ;
+ }
+ }
+
+ ret.length = parse_quoted_string_state::error_no_closing_quote;
+ return ret;
+}
+
+parse_quoted_string_state parse_single_quoted_string_buffered(
+ const char*& p, const char* p_end, cell_buffer& buffer)
+{
+ const char* p0 = p;
+ size_t len = 0;
+ char last = 0;
+
+ parse_quoted_string_state ret;
+ ret.transient = true;
+ ret.has_control_character = false;
+
+ for (; p != p_end; ++p)
+ {
+ if (!p0)
+ p0 = p;
+
+ char c = *p;
+ switch (c)
+ {
+ case '\'':
+ {
+ if (last == c)
+ {
+ // Second "'" in series. This is an encoded single quote.
+ buffer.append(p0, len);
+ p0 = nullptr;
+ last = 0;
+ len = 0;
+ continue;
+ }
+ }
+ break;
+ default:
+ {
+ if (last == '\'')
+ {
+ buffer.append(p0, len-1);
+ auto s = buffer.str();
+ ret.str = s.data();
+ ret.length = s.size();
+ return ret;
+ }
+ }
+ }
+
+ last = c;
+ ++len;
+ }
+
+ if (last == '\'')
+ {
+ buffer.append(p0, len-1);
+ auto s = buffer.str();
+ ret.str = s.data();
+ ret.length = s.size();
+ return ret;
+ }
+
+ ret.str = nullptr;
+ ret.length = parse_quoted_string_state::error_no_closing_quote;
+ return ret;
+}
+
+}
+
+parse_quoted_string_state parse_single_quoted_string(
+ const char*& p, size_t max_length, cell_buffer& buffer)
+{
+ assert(*p == '\'');
+ const char* p_end = p + max_length;
+ ++p;
+
+ parse_quoted_string_state ret;
+ ret.str = p;
+ ret.length = 0;
+ ret.transient = false;
+ ret.has_control_character = false;
+
+ if (p == p_end)
+ {
+ ret.str = nullptr;
+ ret.length = parse_quoted_string_state::error_no_closing_quote;
+ return ret;
+ }
+
+ char last = 0;
+ char c = 0;
+ for (; p != p_end; last = c, ++p, ++ret.length)
+ {
+ c = *p;
+ switch (c)
+ {
+ case '\'':
+ {
+ if (last == c)
+ {
+ // Encoded single quote.
+ buffer.reset();
+ buffer.append(ret.str, ret.length);
+ ++p;
+ return parse_single_quoted_string_buffered(p, p_end, buffer);
+ }
+ }
+ break;
+ default:
+ {
+ if (last == '\'')
+ {
+ --ret.length;
+ return ret;
+ }
+ }
+
+ }
+ }
+
+ if (last == '\'')
+ {
+ --ret.length;
+ return ret;
+ }
+
+ ret.str = nullptr;
+ ret.length = parse_quoted_string_state::error_no_closing_quote;
+ return ret;
+}
+
+const char* parse_to_closing_single_quote(const char* p, size_t max_length)
+{
+ assert(*p == '\'');
+ const char* p_end = p + max_length;
+ ++p;
+
+ if (p == p_end)
+ return nullptr;
+
+ char last = 0;
+ for (; p != p_end; ++p)
+ {
+ char c = *p;
+ switch (c)
+ {
+ case '\'':
+ if (last == '\'')
+ {
+ last = 0;
+ continue;
+ }
+ break;
+ default:
+ {
+ if (last == '\'')
+ return p;
+ }
+ }
+
+ last = c;
+ }
+
+ if (last == '\'')
+ return p;
+
+ return nullptr;
+}
+
+parse_quoted_string_state parse_double_quoted_string(
+ const char*& p, size_t max_length, cell_buffer& buffer)
+{
+ if (max_length == 0 || !p || *p != '"')
+ throw invalid_arg_error("parse_double_quoted_string: invalid input string");
+
+ parse_quoted_string_state ret;
+ ret.str = nullptr;
+ ret.length = 0;
+ ret.transient = false;
+ ret.has_control_character = false;
+
+ const char* p_end = p + max_length;
+ ++p; // skip the opening quote.
+
+ ret.str = p;
+
+ if (p == p_end)
+ {
+ // The string contains only the opening quote.
+ ret.str = nullptr;
+ ret.length = parse_quoted_string_state::error_no_closing_quote;
+ return ret;
+ }
+
+ bool escape = false;
+
+ for (; p != p_end; ++p, ++ret.length)
+ {
+ char c = *p;
+
+ if (escape)
+ {
+ escape = false;
+
+ switch (get_string_escape_char_type(c))
+ {
+ case string_escape_char_t::valid:
+ return parse_string_with_escaped_char(p, max_length, ret.str, ret.length-1, c, buffer);
+ case string_escape_char_t::control_char:
+ // do nothing on control characters.
+ break;
+ case string_escape_char_t::invalid:
+ default:
+ ret.str = nullptr;
+ ret.length = parse_quoted_string_state::error_illegal_escape_char;
+ return ret;
+ }
+ }
+
+ switch (*p)
+ {
+ case '"':
+ {
+ // closing quote.
+ ++p; // skip the quote.
+ return ret;
+ }
+ case '\\':
+ {
+ escape = true;
+ continue;
+ }
+ default:
+ ;
+ }
+
+ if (0x00 <= c && c <= 0x1F)
+ {
+ // This is an unescaped control character.
+ ret.has_control_character = true;
+ }
+ }
+
+ ret.str = nullptr;
+ ret.length = parse_quoted_string_state::error_no_closing_quote;
+ return ret;
+}
+
+const char* parse_to_closing_double_quote(const char* p, size_t max_length)
+{
+ assert(*p == '"');
+ const char* p_end = p + max_length;
+ ++p;
+
+ if (p == p_end)
+ return nullptr;
+
+ bool escape = false;
+
+ for (; p != p_end; ++p)
+ {
+ if (escape)
+ {
+ char c = *p;
+ escape = false;
+
+ if (get_string_escape_char_type(c) == string_escape_char_t::invalid)
+ return nullptr;
+ }
+
+ switch (*p)
+ {
+ case '"':
+ // closing quote.
+ ++p; // skip the quote.
+ return p;
+ case '\\':
+ escape = true;
+ break;
+ default:
+ ;
+ }
+ }
+
+ return nullptr;
+}
+
+std::string_view trim(std::string_view str)
+{
+ const char* p = str.data();
+ const char* p_end = p + str.size();
+
+ // Find the first non-space character.
+ p = std::find_if_not(p, p_end, is_blank);
+
+ if (p == p_end)
+ {
+ // This string is empty.
+ return std::string_view{};
+ }
+
+ // Find the last non-space character.
+ auto last = std::find_if_not(std::reverse_iterator(p_end), std::reverse_iterator(p), is_blank);
+ std::size_t n = std::distance(p, last.base());
+
+ return std::string_view{p, n};
+}
+
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/parser_global_test.cpp b/src/parser/parser_global_test.cpp
new file mode 100644
index 0000000..680a221
--- /dev/null
+++ b/src/parser/parser_global_test.cpp
@@ -0,0 +1,175 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "test_global.hpp"
+#include <orcus/parser_global.hpp>
+#include <orcus/cell_buffer.hpp>
+
+#include <vector>
+#include <cmath>
+#include <cstring>
+#include <limits>
+
+namespace {
+
+void test_parse_numbers()
+{
+ orcus::test::stack_printer __sp__(__func__);
+
+ struct test_case
+ {
+ const char* str;
+ double val;
+ };
+
+ std::vector<test_case> test_cases = {
+ {"1", 1.0},
+ {"1.0", 1.0},
+ {"-1.0", -1.0},
+ {"2e2", 200.0},
+ {"1.2", 1.2},
+ {"-0.0001", -0.0001},
+ {"-0.0", 0.0},
+ {"+.", std::numeric_limits<double>::signaling_NaN()},
+ {"+e", std::numeric_limits<double>::signaling_NaN()},
+ {"+e1", std::numeric_limits<double>::signaling_NaN()},
+ {"+ ", std::numeric_limits<double>::signaling_NaN()},
+ {"- ", std::numeric_limits<double>::signaling_NaN()}
+ };
+
+ for (const test_case& test_data : test_cases)
+ {
+ const char* str = test_data.str;
+ double val;
+ orcus::parse_numeric(str, str + std::strlen(test_data.str), val);
+ if (std::isnan(test_data.val))
+ {
+ assert(std::isnan(val));
+ }
+ else
+ {
+ assert(val == test_data.val);
+ }
+ }
+}
+
+void test_parse_integers()
+{
+ orcus::test::stack_printer __sp__(__func__);
+
+ std::string_view test_str = "-100";
+
+ long value;
+ const char* p = test_str.data();
+ const char* p_end = p + test_str.size();
+ const char* p_last = orcus::parse_integer(p, p_end, value);
+
+ assert(value == -100);
+ assert(p_last == p_end);
+
+ --p_end;
+ p_last = orcus::parse_integer(p, p_end, value);
+ assert(value == -10);
+ assert(p_last == p_end);
+
+ --p_end;
+ p_last = orcus::parse_integer(p, p_end, value);
+ assert(value == -1);
+ assert(p_last == p_end);
+
+ test_str = "13.4"; // the parsing should end on the '.'
+ p = test_str.data();
+ p_end = p + test_str.size();
+ p_last = orcus::parse_integer(p, p_end, value);
+ assert(value == 13);
+ assert(p_last == p + 2);
+
+ // What if the p_end points to an earlier address than the p ...
+ std::swap(p, p_end);
+ assert(p > p_end);
+ p_last = orcus::parse_integer(p, p_end, value);
+ assert(p == p_last);
+
+ // Empty char range
+ p = test_str.data();
+ p_end = p;
+ p_last = orcus::parse_integer(p, p_end, value);
+ assert(p_last == p);
+}
+
+void test_parse_double_quoted_strings()
+{
+ orcus::test::stack_printer __sp__(__func__);
+
+ struct test_case
+ {
+ std::string input;
+ const char* expected_p;
+ size_t expected_n;
+ };
+
+ std::vector<test_case> test_cases = {
+ { "\"", nullptr, orcus::parse_quoted_string_state::error_no_closing_quote },
+ { "\"\"", "", 0 },
+ { "\"a\"", "a", 1 },
+
+ };
+
+ for (const test_case& tc : test_cases)
+ {
+ orcus::cell_buffer buf;
+ const char* p = tc.input.data();
+ size_t n = tc.input.size();
+ orcus::parse_quoted_string_state ret = orcus::parse_double_quoted_string(p, n, buf);
+
+ if (tc.expected_p)
+ {
+ std::string expected(tc.expected_p, tc.expected_n);
+ std::string actual(ret.str, ret.length);
+ assert(expected == actual);
+ }
+ else
+ {
+ assert(ret.str == nullptr);
+ assert(ret.length == tc.expected_n);
+ }
+ }
+
+}
+
+void test_trim()
+{
+ // test for trimming.
+ std::string s1("test"), s2(" test"), s3(" test "), s4("test ");
+ std::string_view sv1(s1), sv2(s2), sv3(s3), sv4(s4);
+ assert(sv1 != sv2);
+ assert(sv1 != sv3);
+ assert(sv2 != sv3);
+ assert(sv1 != sv4);
+
+ std::string_view trimmed = orcus::trim(sv1);
+ assert(sv1 == trimmed); // nothing to trim.
+ assert(sv1 == orcus::trim(sv2));
+ assert(sv1 == orcus::trim(sv3));
+ assert(sv1 == orcus::trim(sv4));
+ assert(sv1.size() == orcus::trim(sv2).size());
+ assert(sv1.size() == orcus::trim(sv3).size());
+}
+
+}
+
+int main()
+{
+ test_parse_numbers();
+ test_parse_integers();
+ test_parse_double_quoted_strings();
+ test_trim();
+
+ return 0;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/parser_test_json_validation.cpp b/src/parser/parser_test_json_validation.cpp
new file mode 100644
index 0000000..a001226
--- /dev/null
+++ b/src/parser/parser_test_json_validation.cpp
@@ -0,0 +1,439 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/json_parser.hpp"
+#include "orcus/stream.hpp"
+
+#include <vector>
+#include <iostream>
+#include <fstream>
+
+namespace {
+
+// These test cases originate from https://github.com/nst/JSONTestSuite
+//
+// The name of these files tell if their contents should be accepted or
+// rejected.
+//
+// * y_ content must be accepted by parsers
+// * n_ content must be rejected by parsers
+// * i_ parsers are free to accept or reject content
+
+std::vector<const char*> test_files_indeterminate = {
+ "i_number_double_huge_neg_exp.json",
+ "i_number_huge_exp.json",
+ "i_number_neg_int_huge_exp.json",
+ "i_number_pos_double_huge_exp.json",
+ "i_number_real_neg_overflow.json",
+ "i_number_real_pos_overflow.json",
+ "i_number_real_underflow.json",
+ "i_number_too_big_neg_int.json",
+ "i_number_too_big_pos_int.json",
+ "i_number_very_big_negative_int.json",
+ "i_object_key_lone_2nd_surrogate.json",
+ "i_string_1st_surrogate_but_2nd_missing.json",
+ "i_string_1st_valid_surrogate_2nd_invalid.json",
+ "i_string_incomplete_surrogate_and_escape_valid.json",
+ "i_string_incomplete_surrogate_pair.json",
+ "i_string_incomplete_surrogates_escape_valid.json",
+ "i_string_invalid_lonely_surrogate.json",
+ "i_string_invalid_surrogate.json",
+ "i_string_invalid_utf-8.json",
+ "i_string_inverted_surrogates_U+1D11E.json",
+ "i_string_iso_latin_1.json",
+ "i_string_lone_second_surrogate.json",
+ "i_string_lone_utf8_continuation_byte.json",
+ "i_string_not_in_unicode_range.json",
+ "i_string_overlong_sequence_2_bytes.json",
+ "i_string_overlong_sequence_6_bytes.json",
+ "i_string_overlong_sequence_6_bytes_null.json",
+ "i_string_truncated-utf-8.json",
+ "i_string_utf16BE_no_BOM.json",
+ "i_string_utf16LE_no_BOM.json",
+ "i_string_UTF-16LE_with_BOM.json",
+ "i_string_UTF-8_invalid_sequence.json",
+ "i_string_UTF8_surrogate_U+D800.json",
+ "i_structure_500_nested_arrays.json",
+ "i_structure_UTF-8_BOM_empty_object.json"
+};
+
+std::vector<const char*> test_files_failed = {
+ "n_array_1_true_without_comma.json",
+ "n_array_a_invalid_utf8.json",
+ "n_array_colon_instead_of_comma.json",
+ "n_array_comma_after_close.json",
+ "n_array_comma_and_number.json",
+ "n_array_double_comma.json",
+ "n_array_double_extra_comma.json",
+ "n_array_extra_close.json",
+ "n_array_extra_comma.json",
+ "n_array_incomplete_invalid_value.json",
+ "n_array_incomplete.json",
+ "n_array_inner_array_no_comma.json",
+ "n_array_invalid_utf8.json",
+ "n_array_items_separated_by_semicolon.json",
+ "n_array_just_comma.json",
+ "n_array_just_minus.json",
+ "n_array_missing_value.json",
+ "n_array_newlines_unclosed.json",
+ "n_array_number_and_comma.json",
+ "n_array_number_and_several_commas.json",
+ "n_array_spaces_vertical_tab_formfeed.json",
+ "n_array_star_inside.json",
+ "n_array_unclosed.json",
+ "n_array_unclosed_trailing_comma.json",
+ "n_array_unclosed_with_new_lines.json",
+ "n_array_unclosed_with_object_inside.json",
+ "n_incomplete_false.json",
+ "n_incomplete_null.json",
+ "n_incomplete_true.json",
+ "n_multidigit_number_then_00.json",
+ "n_number_0.1.2.json",
+ "n_number_-01.json",
+ "n_number_0.3e.json",
+ "n_number_0.3e+.json",
+ "n_number_0_capital_E.json",
+ "n_number_0_capital_E+.json",
+ "n_number_0.e1.json",
+ "n_number_0e.json",
+ "n_number_0e+.json",
+ "n_number_1_000.json",
+ "n_number_1.0e-.json",
+ "n_number_1.0e.json",
+ "n_number_1.0e+.json",
+ "n_number_-1.0..json",
+ "n_number_1eE2.json",
+ "n_number_.-1.json",
+ "n_number_+1.json",
+ "n_number_.2e-3.json",
+ "n_number_2.e-3.json",
+ "n_number_2.e+3.json",
+ "n_number_2.e3.json",
+ "n_number_-2..json",
+ "n_number_9.e+.json",
+ "n_number_expression.json",
+ "n_number_hex_1_digit.json",
+ "n_number_hex_2_digits.json",
+ "n_number_infinity.json",
+ "n_number_+Inf.json",
+ "n_number_Inf.json",
+ "n_number_invalid+-.json",
+ "n_number_invalid-negative-real.json",
+ "n_number_invalid-utf-8-in-bigger-int.json",
+ "n_number_invalid-utf-8-in-exponent.json",
+ "n_number_invalid-utf-8-in-int.json",
+ "n_number_++.json",
+ "n_number_minus_infinity.json",
+ "n_number_minus_sign_with_trailing_garbage.json",
+ "n_number_minus_space_1.json",
+ "n_number_-NaN.json",
+ "n_number_NaN.json",
+ "n_number_neg_int_starting_with_zero.json",
+ "n_number_neg_real_without_int_part.json",
+ "n_number_neg_with_garbage_at_end.json",
+ "n_number_real_garbage_after_e.json",
+ "n_number_real_with_invalid_utf8_after_e.json",
+ "n_number_real_without_fractional_part.json",
+ "n_number_starting_with_dot.json",
+ "n_number_U+FF11_fullwidth_digit_one.json",
+ "n_number_with_alpha_char.json",
+ "n_number_with_alpha.json",
+ "n_number_with_leading_zero.json",
+ "n_object_bad_value.json",
+ "n_object_bracket_key.json",
+ "n_object_comma_instead_of_colon.json",
+ "n_object_double_colon.json",
+ "n_object_emoji.json",
+ "n_object_garbage_at_end.json",
+ "n_object_key_with_single_quotes.json",
+ "n_object_lone_continuation_byte_in_key_and_trailing_comma.json",
+ "n_object_missing_colon.json",
+ "n_object_missing_key.json",
+ "n_object_missing_semicolon.json",
+ "n_object_missing_value.json",
+ "n_object_no-colon.json",
+ "n_object_non_string_key_but_huge_number_instead.json",
+ "n_object_non_string_key.json",
+ "n_object_repeated_null_null.json",
+ "n_object_several_trailing_commas.json",
+ "n_object_single_quote.json",
+ "n_object_trailing_comma.json",
+ "n_object_trailing_comment.json",
+ "n_object_trailing_comment_open.json",
+ "n_object_trailing_comment_slash_open_incomplete.json",
+ "n_object_trailing_comment_slash_open.json",
+ "n_object_two_commas_in_a_row.json",
+ "n_object_unquoted_key.json",
+ "n_object_unterminated-value.json",
+ "n_object_with_single_string.json",
+ "n_object_with_trailing_garbage.json",
+ "n_single_space.json",
+ "n_string_1_surrogate_then_escape.json",
+ "n_string_1_surrogate_then_escape_u1.json",
+ "n_string_1_surrogate_then_escape_u1x.json",
+ "n_string_1_surrogate_then_escape_u.json",
+ "n_string_accentuated_char_no_quotes.json",
+ "n_string_backslash_00.json",
+ "n_string_escaped_backslash_bad.json",
+ "n_string_escaped_ctrl_char_tab.json",
+ "n_string_escaped_emoji.json",
+ "n_string_escape_x.json",
+ "n_string_incomplete_escaped_character.json",
+ "n_string_incomplete_escape.json",
+ "n_string_incomplete_surrogate_escape_invalid.json",
+ "n_string_incomplete_surrogate.json",
+ "n_string_invalid_backslash_esc.json",
+ "n_string_invalid_unicode_escape.json",
+ "n_string_invalid_utf8_after_escape.json",
+ "n_string_invalid-utf-8-in-escape.json",
+ "n_string_leading_uescaped_thinspace.json",
+ "n_string_no_quotes_with_bad_escape.json",
+ "n_string_single_doublequote.json",
+ "n_string_single_quote.json",
+ "n_string_single_string_no_double_quotes.json",
+ "n_string_start_escape_unclosed.json",
+ "n_string_unescaped_crtl_char.json",
+ "n_string_unescaped_newline.json",
+ "n_string_unescaped_tab.json",
+ "n_string_unicode_CapitalU.json",
+ "n_string_with_trailing_garbage.json",
+ // "n_structure_100000_opening_arrays.json",
+ "n_structure_angle_bracket_..json",
+ "n_structure_angle_bracket_null.json",
+ "n_structure_array_trailing_garbage.json",
+ "n_structure_array_with_extra_array_close.json",
+ "n_structure_array_with_unclosed_string.json",
+ "n_structure_ascii-unicode-identifier.json",
+ "n_structure_capitalized_True.json",
+ "n_structure_close_unopened_array.json",
+ "n_structure_comma_instead_of_closing_brace.json",
+ "n_structure_double_array.json",
+ "n_structure_end_array.json",
+ "n_structure_incomplete_UTF8_BOM.json",
+ "n_structure_lone-invalid-utf-8.json",
+ "n_structure_lone-open-bracket.json",
+ "n_structure_no_data.json",
+ "n_structure_null-byte-outside-string.json",
+ "n_structure_number_with_trailing_garbage.json",
+ "n_structure_object_followed_by_closing_object.json",
+ "n_structure_object_unclosed_no_value.json",
+ "n_structure_object_with_comment.json",
+ "n_structure_object_with_trailing_garbage.json",
+ "n_structure_open_array_apostrophe.json",
+ "n_structure_open_array_comma.json",
+ // "n_structure_open_array_object.json",
+ "n_structure_open_array_open_object.json",
+ "n_structure_open_array_open_string.json",
+ "n_structure_open_array_string.json",
+ "n_structure_open_object_close_array.json",
+ "n_structure_open_object_comma.json",
+ "n_structure_open_object.json",
+ "n_structure_open_object_open_array.json",
+ "n_structure_open_object_open_string.json",
+ "n_structure_open_object_string_with_apostrophes.json",
+ "n_structure_open_open.json",
+ "n_structure_single_eacute.json",
+ "n_structure_single_star.json",
+ "n_structure_trailing_#.json",
+ "n_structure_U+2060_word_joined.json",
+ "n_structure_uescaped_LF_before_string.json",
+ "n_structure_unclosed_array.json",
+ "n_structure_unclosed_array_partial_null.json",
+ "n_structure_unclosed_array_unfinished_false.json",
+ "n_structure_unclosed_array_unfinished_true.json",
+ "n_structure_unclosed_object.json",
+ "n_structure_unicode-identifier.json",
+ "n_structure_UTF8_BOM_no_data.json",
+ "n_structure_whitespace_formfeed.json",
+ "n_structure_whitespace_U+2060_word_joiner.json"
+};
+
+std::vector<const char*> test_files_pass = {
+ "y_array_arraysWithSpaces.json",
+ "y_array_empty.json",
+ "y_array_empty-string.json",
+ "y_array_ending_with_newline.json",
+ "y_array_false.json",
+ "y_array_heterogeneous.json",
+ "y_array_null.json",
+ "y_array_with_1_and_newline.json",
+ "y_array_with_leading_space.json",
+ "y_array_with_several_null.json",
+ "y_array_with_trailing_space.json",
+ "y_number_0e+1.json",
+ "y_number_0e1.json",
+ "y_number_after_space.json",
+ "y_number_double_close_to_zero.json",
+ "y_number_int_with_exp.json",
+ "y_number.json",
+ "y_number_minus_zero.json",
+ "y_number_negative_int.json",
+ "y_number_negative_one.json",
+ "y_number_negative_zero.json",
+ "y_number_real_capital_e.json",
+ "y_number_real_capital_e_neg_exp.json",
+ "y_number_real_capital_e_pos_exp.json",
+ "y_number_real_exponent.json",
+ "y_number_real_fraction_exponent.json",
+ "y_number_real_neg_exp.json",
+ "y_number_real_pos_exponent.json",
+ "y_number_simple_int.json",
+ "y_number_simple_real.json",
+ "y_object_basic.json",
+ "y_object_duplicated_key_and_value.json",
+ "y_object_duplicated_key.json",
+ "y_object_empty.json",
+ "y_object_empty_key.json",
+ // "y_object_escaped_null_in_key.json",
+ "y_object_extreme_numbers.json",
+ "y_object.json",
+ "y_object_long_strings.json",
+ "y_object_simple.json",
+ // "y_object_string_unicode.json",
+ "y_object_with_newlines.json",
+ // "y_string_1_2_3_bytes_UTF-8_sequences.json",
+ // "y_string_accepted_surrogate_pair.json",
+ // "y_string_accepted_surrogate_pairs.json",
+ "y_string_allowed_escapes.json",
+ "y_string_backslash_and_u_escaped_zero.json",
+ "y_string_backslash_doublequotes.json",
+ "y_string_comments.json",
+ "y_string_double_escape_a.json",
+ "y_string_double_escape_n.json",
+ // "y_string_escaped_control_character.json",
+ // "y_string_escaped_noncharacter.json",
+ "y_string_in_array.json",
+ "y_string_in_array_with_leading_space.json",
+ // "y_string_last_surrogates_1_and_2.json",
+ // "y_string_nbsp_uescaped.json",
+ "y_string_nonCharacterInUTF-8_U+10FFFF.json",
+ "y_string_nonCharacterInUTF-8_U+FFFF.json",
+ // "y_string_null_escape.json",
+ // "y_string_one-byte-utf-8.json",
+ "y_string_pi.json",
+ "y_string_reservedCharacterInUTF-8_U+1BFFF.json",
+ "y_string_simple_ascii.json",
+ // "y_string_space.json",
+ // "y_string_surrogates_U+1D11E_MUSICAL_SYMBOL_G_CLEF.json",
+ // "y_string_three-byte-utf-8.json",
+ // "y_string_two-byte-utf-8.json",
+ "y_string_u+2028_line_sep.json",
+ "y_string_u+2029_par_sep.json",
+ // "y_string_uescaped_newline.json",
+ // "y_string_uEscape.json",
+ "y_string_unescaped_char_delete.json",
+ "y_string_unicode_2.json",
+ // "y_string_unicodeEscapedBackslash.json",
+ // "y_string_unicode_escaped_double_quote.json",
+ // "y_string_unicode.json",
+ // "y_string_unicode_U+10FFFE_nonchar.json",
+ // "y_string_unicode_U+1FFFE_nonchar.json",
+ // "y_string_unicode_U+200B_ZERO_WIDTH_SPACE.json",
+ // "y_string_unicode_U+2064_invisible_plus.json",
+ // "y_string_unicode_U+FDD0_nonchar.json",
+ // "y_string_unicode_U+FFFE_nonchar.json",
+ "y_string_utf8.json",
+ "y_string_with_del_character.json",
+ // "y_structure_lonely_false.json",
+ // "y_structure_lonely_int.json",
+ // "y_structure_lonely_negative_real.json",
+ // "y_structure_lonely_null.json",
+ // "y_structure_lonely_string.json",
+ // "y_structure_lonely_true.json",
+ // "y_structure_string_empty.json",
+ "y_structure_trailing_newline.json",
+ "y_structure_true_in_array.json",
+ "y_structure_whitespace_array.json",
+};
+
+std::string load_file(const std::string& file_name)
+{
+ std::string file_path = std::string(SRCDIR) + "/test/json/validation/" + file_name;
+ std::ifstream f(file_path);
+ std::stringstream buffer;
+ buffer << f.rdbuf();
+ return buffer.str();
+}
+
+void test_pass()
+{
+ orcus::json_handler hdl;
+
+ for (const char* test_file_name : test_files_pass)
+ {
+ std::string content = load_file(test_file_name);
+ std::cout << test_file_name << std::endl;
+ try
+ {
+ orcus::json_parser<orcus::json_handler> parser(content, hdl);
+ parser.parse();
+ }
+ catch (const orcus::parse_error& e)
+ {
+ std::cout << e.what() << std::endl;
+ std::cout << orcus::create_parse_error_output(content, e.offset()) << std::endl;
+ assert(false);
+ }
+ }
+}
+
+void test_fail()
+{
+ orcus::json_handler hdl;
+
+ for (const char* test_file_name : test_files_failed)
+ {
+ std::string content = load_file(test_file_name);
+ std::cout << test_file_name << std::endl;
+ bool failed = false;
+ try {
+ orcus::json_parser<orcus::json_handler> parser(content, hdl);
+ parser.parse();
+ }
+ catch (const orcus::parse_error&)
+ {
+ failed = true;
+ }
+
+ if (!failed)
+ {
+ std::cout << "invalid json string has been parsed as valid: content='" << content << "'" << std::endl;
+ assert(false);
+ }
+ }
+}
+
+void test_indeterminate()
+{
+ orcus::json_handler hdl;
+
+ for (const char* test_file_name : test_files_indeterminate)
+ {
+ std::string content = load_file(test_file_name);
+ std::cout << test_file_name << std::endl;
+ try {
+ orcus::json_parser<orcus::json_handler> parser(content, hdl);
+ parser.parse();
+ }
+ catch (const orcus::parse_error&)
+ {
+ }
+
+ }
+}
+
+}
+
+int main()
+{
+ test_pass();
+ test_fail();
+ test_indeterminate();
+ return 0;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/parser_test_numeric.cpp b/src/parser/parser_test_numeric.cpp
new file mode 100644
index 0000000..b16ed9a
--- /dev/null
+++ b/src/parser/parser_test_numeric.cpp
@@ -0,0 +1,105 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "test_global.hpp"
+#include "numeric_parser.hpp"
+
+#include <cassert>
+#include <iostream>
+#include <vector>
+#include <limits>
+
+using namespace orcus;
+using std::cout;
+using std::endl;
+
+namespace {
+
+struct check
+{
+ std::string_view str;
+ double expected;
+};
+
+const double invalid = std::numeric_limits<double>::quiet_NaN();
+
+template<typename ParserT>
+bool run_checks(const std::vector<check>& checks)
+{
+ for (const check& c : checks)
+ {
+ ParserT parser(c.str.data(), c.str.data() + c.str.size());
+ double v = parser.parse();
+
+ if (std::isnan(c.expected))
+ {
+ if (!std::isnan(v))
+ {
+ cout << "'" << c.str << "' was expected to be invalid, but parser parsed as if it was valid." << endl;
+ return false;
+ }
+ }
+ else
+ {
+ if (v != c.expected)
+ {
+ cout << "'" << c.str << "' was expected to be parsed as (" << c.expected << "), but the parser parsed it as (" << v << ")" << endl;
+ return false;
+ }
+ }
+ }
+
+ return true;
+}
+
+}
+
+void test_generic_number_parsing()
+{
+ using parser_type = detail::numeric_parser<detail::generic_parser_trait>;
+
+ std::vector<check> checks = {
+ { "-6.e3", -6e3 },
+ { "true", invalid },
+ { "1", 1.0 },
+ { "1.0", 1.0 },
+ { "-1.0", -1.0 },
+ { "-01", -1.0 },
+ { "2e2", 200.0 },
+ { "1.2", 1.2 },
+ { "-0.0001", -0.0001 },
+ { "-0.0", 0.0 },
+ { "+.", invalid },
+ { "+e", invalid },
+ { "+e1", invalid },
+ { "+ ", invalid },
+ { "- ", invalid }
+ };
+
+ assert(run_checks<parser_type>(checks));
+}
+
+void test_json_number_parsing()
+{
+ using parser_type = detail::numeric_parser<detail::json_parser_trait>;
+
+ std::vector<check> checks = {
+ { "-01", invalid }, // Leading zeros are invalid.
+ };
+
+ assert(run_checks<parser_type>(checks));
+}
+
+int main()
+{
+ test_generic_number_parsing();
+ test_json_number_parsing();
+
+ return EXIT_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/parser_test_xml_validation.cpp b/src/parser/parser_test_xml_validation.cpp
new file mode 100644
index 0000000..3be1804
--- /dev/null
+++ b/src/parser/parser_test_xml_validation.cpp
@@ -0,0 +1,95 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "test_global.hpp"
+#include <orcus/sax_parser.hpp>
+#include <orcus/stream.hpp>
+
+#include <iostream>
+#include <boost/range/iterator_range.hpp>
+
+#include "filesystem_env.hpp"
+
+void test_valid()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ struct _handler : public orcus::sax_handler {};
+
+ fs::path root_dir = fs::path{SRCDIR} / "test" / "xml" / "valids";
+
+ if (!fs::is_directory(root_dir))
+ return;
+
+ for (const fs::path& entry : boost::make_iterator_range(fs::directory_iterator{root_dir}, {}))
+ {
+ std::cout << "input file: " << entry << std::endl;
+
+ orcus::file_content content(entry.string());
+
+ _handler hdl;
+ orcus::sax_parser<_handler> parser(content.str(), hdl);
+
+ try
+ {
+ parser.parse();
+ }
+ catch (const orcus::malformed_xml_error& e)
+ {
+ std::cerr << orcus::create_parse_error_output(content.str(), e.offset()) << std::endl;
+ std::cerr << e.what() << std::endl;
+ assert(!"This was supposed to be a valid XML!");
+
+ }
+ }
+}
+
+void test_invalid()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ struct _handler : public orcus::sax_handler {};
+
+ fs::path root_dir = fs::path{SRCDIR} / "test" / "xml" / "invalids";
+
+ if (!fs::is_directory(root_dir))
+ return;
+
+ for (const fs::path& entry : boost::make_iterator_range(fs::directory_iterator{root_dir}, {}))
+ {
+ std::cout << "input file: " << entry << std::endl;
+
+ orcus::file_content content(entry.string());
+
+ _handler hdl;
+ orcus::sax_parser<_handler> parser(content.str(), hdl);
+
+ try
+ {
+ parser.parse();
+ assert(!"exception was expected, but one was not thrown.");
+ }
+ catch (const orcus::malformed_xml_error& e)
+ {
+ std::cerr << orcus::create_parse_error_output(content.str(), e.offset()) << std::endl;
+ std::cerr << e.what() << std::endl;
+ }
+ catch (...)
+ {
+ assert(!"wrong exception was thrown.");
+ }
+ }
+}
+
+int main()
+{
+ test_valid();
+ test_invalid();
+
+ return EXIT_SUCCESS;
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/sax_ns_parser_test.cpp b/src/parser/sax_ns_parser_test.cpp
new file mode 100644
index 0000000..eb7443f
--- /dev/null
+++ b/src/parser/sax_ns_parser_test.cpp
@@ -0,0 +1,78 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/sax_ns_parser.hpp>
+#include <orcus/xml_namespace.hpp>
+
+#include <cstring>
+
+void test_handler()
+{
+ const char* test_code = "<?xml version=\"1.0\"?><root/>";
+ orcus::sax_ns_handler hdl;
+ orcus::xmlns_repository repo;
+ orcus::xmlns_context cxt = repo.create_context();
+
+ orcus::sax_ns_parser<orcus::sax_ns_handler> parser(test_code, cxt, hdl);
+ parser.parse();
+}
+
+/**
+ * Test for unqualified attribute NOT belonging to the default namespace,
+ * according to
+ * https://stackoverflow.com/questions/3312390/xml-default-namespaces-for-unqualified-attribute-names
+ */
+void test_default_attr_ns()
+{
+ const orcus::xmlns_id_t default_ns = "test:foo";
+
+ struct _handler : public orcus::sax_ns_handler
+ {
+ orcus::xmlns_id_t default_ns_expected;
+
+ void start_element(const orcus::sax_ns_parser_element& elem)
+ {
+ // All elements should belong to the default namespace.
+ assert(elem.ns == default_ns_expected);
+ }
+
+ void attribute(std::string_view /*name*/, std::string_view /*val*/) {}
+
+ void attribute(const orcus::sax_ns_parser_attribute& attr)
+ {
+ // Attribute's namespace should be empty.
+ assert(attr.ns == orcus::XMLNS_UNKNOWN_ID);
+ assert(attr.name == "attr");
+ assert(attr.value == "1");
+ }
+ };
+
+ const char* test_code = "<?xml version=\"1.0\"?><root xmlns='test:foo'><elem attr='1'/></root>";
+
+ const orcus::xmlns_id_t predefined[] = { default_ns, nullptr };
+
+ orcus::xmlns_repository repo;
+ repo.add_predefined_values(predefined);
+
+ orcus::xmlns_context cxt = repo.create_context();
+
+ _handler hdl;
+ hdl.default_ns_expected = default_ns;
+
+ orcus::sax_ns_parser<_handler> parser(test_code, cxt, hdl);
+ parser.parse();
+}
+
+int main()
+{
+ test_handler();
+ test_default_attr_ns();
+
+ return EXIT_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/sax_parser_base.cpp b/src/parser/sax_parser_base.cpp
new file mode 100644
index 0000000..58f750e
--- /dev/null
+++ b/src/parser/sax_parser_base.cpp
@@ -0,0 +1,421 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/sax_parser_base.hpp"
+
+#include "utf8.hpp"
+
+#include <cstring>
+#include <vector>
+#include <memory>
+
+#ifdef __ORCUS_CPU_FEATURES
+#include <immintrin.h>
+#endif
+
+namespace orcus { namespace sax {
+
+char decode_xml_encoded_char(const char* p, size_t n)
+{
+ if (n == 2)
+ {
+ if (!std::strncmp(p, "lt", n))
+ return '<';
+ else if (!std::strncmp(p, "gt", n))
+ return '>';
+ else
+ return '\0';
+ }
+ else if (n == 3)
+ {
+ if (!std::strncmp(p, "amp", n))
+ return '&';
+ else
+ return '\0';
+ }
+ else if (n == 4)
+ {
+ if (!std::strncmp(p, "apos", n))
+ return '\'';
+ else if (!std::strncmp(p, "quot", 4))
+ return '"';
+ else
+ return '\0';
+ }
+
+ return '\0';
+}
+
+std::string decode_xml_unicode_char(const char* p, size_t n)
+{
+ if (*p == '#' && n >= 2)
+ {
+ uint32_t point = 0;
+ if (p[1] == 'x')
+ {
+ if (n == 2)
+ throw orcus::xml_structure_error(
+ "invalid number of characters for hexadecimal unicode reference");
+
+ point = std::stoi(std::string(p + 2, n - 2), nullptr, 16);
+ }
+ else
+ point = std::stoi(std::string(p + 1, n - 1), nullptr, 10);
+
+ if (point < 0x80)
+ {
+ // is it really necessary to do the bit manipulation here?
+ std::string s(1, static_cast<char>(point & 0x7F));
+ return s;
+ }
+ else if (point < 0x0800)
+ {
+ std::string s(1, static_cast<char>((point >> 6 & 0x1F) | 0xC0));
+ s += static_cast<char>((point & 0x3F) | 0x80);
+ return s;
+ }
+ else if (point < 0x010000)
+ {
+ std::string s(1, static_cast<char>((point >> 12 & 0x0F) | 0xE0));
+ s += static_cast<char>((point >> 6 & 0x3F) | 0x80);
+ s += static_cast<char>((point & 0x3F) | 0x80);
+ return s;
+ }
+ else if (point < 0x110000)
+ {
+ std::string s(1, static_cast<char>((point >> 18 & 0x07) | 0xF0));
+ s += static_cast<char>((point >> 12 & 0x3F) | 0x80);
+ s += static_cast<char>((point >> 6 & 0x3F) | 0x80);
+ s += static_cast<char>((point & 0x3F) | 0x80);
+ return s;
+ }
+ else
+ {
+ // should not happen as that is not represented by utf-8
+ assert(false);
+ }
+ }
+
+ return std::string();
+}
+
+struct parser_base::impl
+{
+ std::vector<std::unique_ptr<cell_buffer>> m_cell_buffers;
+};
+
+parser_base::parser_base(const char* content, size_t size) :
+ ::orcus::parser_base(content, size),
+ mp_impl(std::make_unique<impl>()),
+ m_nest_level(0),
+ m_buffer_pos(0),
+ m_root_elem_open(true)
+{
+ mp_impl->m_cell_buffers.push_back(std::make_unique<cell_buffer>());
+}
+
+parser_base::~parser_base() {}
+
+void parser_base::inc_buffer_pos()
+{
+ ++m_buffer_pos;
+ if (m_buffer_pos == mp_impl->m_cell_buffers.size())
+ mp_impl->m_cell_buffers.push_back(std::make_unique<cell_buffer>());
+}
+
+cell_buffer& parser_base::get_cell_buffer()
+{
+ return *mp_impl->m_cell_buffers[m_buffer_pos];
+}
+
+void parser_base::comment()
+{
+ // Parse until we reach '-->'.
+ size_t len = available_size();
+ assert(len > 3);
+ char c = cur_char();
+ size_t i = 0;
+ bool hyphen = false;
+ for (; i < len; ++i, c = next_and_char())
+ {
+ if (c == '-')
+ {
+ if (!hyphen)
+ // first hyphen.
+ hyphen = true;
+ else
+ // second hyphen.
+ break;
+ }
+ else
+ hyphen = false;
+ }
+
+ if (len - i < 2 || next_and_char() != '>')
+ throw malformed_xml_error(
+ "'--' should not occur in comment other than in the closing tag.", offset());
+
+ next();
+}
+
+void parser_base::expects_next(const char* p, size_t n)
+{
+ if (available_size() < n+1)
+ throw malformed_xml_error(
+ "not enough stream left to check for an expected string segment.", offset());
+
+ const char* p0 = p;
+ const char* p_end = p + n;
+ char c = next_and_char();
+ for (; p != p_end; ++p, c = next_and_char())
+ {
+ if (c == *p)
+ continue;
+
+ std::ostringstream os;
+ os << "'" << std::string(p0, n) << "' was expected, but not found.";
+ throw malformed_xml_error(os.str(), offset());
+ }
+}
+
+void parser_base::parse_encoded_char(cell_buffer& buf)
+{
+ assert(cur_char() == '&');
+ next();
+ const char* p0 = mp_char;
+ for (; has_char(); next())
+ {
+ if (cur_char() != ';')
+ continue;
+
+ size_t n = mp_char - p0;
+ if (!n)
+ throw malformed_xml_error("empty encoded character.", offset());
+
+#if ORCUS_DEBUG_SAX_PARSER
+ cout << "sax_parser::parse_encoded_char: raw='" << std::string(p0, n) << "'" << endl;
+#endif
+
+ char c = decode_xml_encoded_char(p0, n);
+ if (c)
+ buf.append(&c, 1);
+ else
+ {
+ std::string utf8 = decode_xml_unicode_char(p0, n);
+
+ if (!utf8.empty())
+ {
+ buf.append(utf8.data(), utf8.size());
+ c = '1'; // just to avoid hitting the !c case below
+ }
+ }
+
+ // Move to the character past ';' before returning to the parent call.
+ next();
+
+ if (!c)
+ {
+#if ORCUS_DEBUG_SAX_PARSER
+ cout << "sax_parser::parse_encoded_char: not a known encoding name. Use the original." << endl;
+#endif
+ // Unexpected encoding name. Use the original text.
+ buf.append(p0, mp_char-p0);
+ }
+
+ return;
+ }
+
+ throw malformed_xml_error(
+ "error parsing encoded character: terminating character is not found.", offset());
+}
+
+void parser_base::value_with_encoded_char(cell_buffer& buf, std::string_view& str, char quote_char)
+{
+ assert(cur_char() == '&');
+ parse_encoded_char(buf);
+
+ const char* p0 = mp_char;
+
+ while (has_char())
+ {
+ if (cur_char() == '&')
+ {
+ if (mp_char > p0)
+ buf.append(p0, mp_char-p0);
+
+ parse_encoded_char(buf);
+ p0 = mp_char;
+ }
+
+ if (cur_char() == quote_char)
+ break;
+
+ if (cur_char() != '&')
+ next();
+ }
+
+ if (mp_char > p0)
+ buf.append(p0, mp_char-p0);
+
+ if (!buf.empty())
+ str = buf.str();
+
+ // Skip the closing quote.
+ assert(!has_char() || cur_char() == quote_char);
+ if (has_char())
+ next();
+}
+
+bool parser_base::value(std::string_view& str, bool decode)
+{
+ char c = cur_char_checked();
+ if (c != '"' && c != '\'')
+ throw malformed_xml_error("value must be quoted", offset());
+
+ char quote_char = c;
+
+ c = next_char_checked();
+
+ const char* p0 = mp_char;
+ for (; c != quote_char; c = next_char_checked())
+ {
+ if (decode && c == '&')
+ {
+ // This value contains one or more encoded characters.
+ cell_buffer& buf = get_cell_buffer();
+ buf.reset();
+ buf.append(p0, mp_char-p0);
+ value_with_encoded_char(buf, str, quote_char);
+ return true;
+ }
+ }
+
+ str = std::string_view(p0, mp_char-p0);
+
+ // Skip the closing quote.
+ next();
+
+ return false;
+}
+
+void parser_base::name(std::string_view& str)
+{
+ const char* p0 = mp_char;
+ mp_char = parse_utf8_xml_name_start_char(mp_char, mp_end);
+ if (mp_char == p0)
+ {
+ ::std::ostringstream os;
+ os << "name must begin with an alphabet, but got this instead '" << cur_char() << "'";
+ throw malformed_xml_error(os.str(), offset());
+ }
+
+#if defined(__ORCUS_CPU_FEATURES) && defined(__SSE4_2__)
+
+ const __m128i match = _mm_loadu_si128((const __m128i*)"azAZ09--__..");
+ const int mode = _SIDD_LEAST_SIGNIFICANT | _SIDD_CMP_RANGES | _SIDD_UBYTE_OPS | _SIDD_NEGATIVE_POLARITY;
+
+ size_t n_total = available_size();
+
+ while (n_total)
+ {
+ __m128i char_block = _mm_loadu_si128((const __m128i*)mp_char);
+
+ int n = std::min<size_t>(16u, n_total);
+ int r = _mm_cmpestri(match, 12, char_block, n, mode);
+ mp_char += r; // Move the current char position.
+ n_total -= r;
+
+ if (r < 16 && n_total)
+ {
+ // There is a character that does not match the SSE-based ASCII-only check.
+ // It may either by an ascii character that is not allowed, in which case stop,
+ // or it may possibly be an allowed utf-8 character, in which case move over it
+ // using the slow function.
+
+ const char* p = parse_utf8_xml_name_char(mp_char, mp_end);
+ if (p == mp_char)
+ break;
+
+ n_total -= p - mp_char;
+ mp_char = p;
+ }
+
+ }
+ cur_char_checked(); // check end of xml stream
+
+#else
+ for(;;)
+ {
+ cur_char_checked(); // check end of xml stream
+ const char* p = parse_utf8_xml_name_char(mp_char, mp_end);
+
+ if (p == mp_char)
+ break;
+
+ mp_char = p;
+ }
+#endif
+
+ str = std::string_view(p0, mp_char-p0);
+}
+
+void parser_base::element_name(parser_element& elem, std::ptrdiff_t begin_pos)
+{
+ elem.begin_pos = begin_pos;
+ name(elem.name);
+ if (cur_char() == ':')
+ {
+ elem.ns = elem.name;
+ next_check();
+ name(elem.name);
+ }
+}
+
+void parser_base::attribute_name(std::string_view& attr_ns, std::string_view& attr_name)
+{
+ name(attr_name);
+ if (cur_char() == ':')
+ {
+ // Attribute name is namespaced.
+ attr_ns = attr_name;
+ next_check();
+ name(attr_name);
+ }
+}
+
+void parser_base::characters_with_encoded_char(cell_buffer& buf)
+{
+ assert(cur_char() == '&');
+ parse_encoded_char(buf);
+
+ const char* p0 = mp_char;
+
+ while (has_char())
+ {
+ if (cur_char() == '&')
+ {
+ if (mp_char > p0)
+ buf.append(p0, mp_char-p0);
+
+ parse_encoded_char(buf);
+ p0 = mp_char;
+ }
+
+ if (cur_char() == '<')
+ break;
+
+ if (cur_char() != '&')
+ next();
+ }
+
+ if (mp_char > p0)
+ buf.append(p0, mp_char-p0);
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/sax_parser_test.cpp b/src/parser/sax_parser_test.cpp
new file mode 100644
index 0000000..ec8b1f1
--- /dev/null
+++ b/src/parser/sax_parser_test.cpp
@@ -0,0 +1,67 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "test_global.hpp"
+#include <orcus/sax_parser.hpp>
+#include <cstring>
+
+using namespace std;
+
+void test_handler()
+{
+ const char* test_code = "<?xml version=\"1.0\"?><root/>";
+
+ orcus::sax_handler hdl;
+ orcus::sax_parser<orcus::sax_handler> parser(test_code, hdl);
+ parser.parse();
+}
+
+void test_attr_equal_with_whitespace()
+{
+ struct _handler : public orcus::sax_handler {};
+
+ const char* content =
+ "<?xml version=\"1.0\"?>"
+ "<root attr1='some value' attr2 = \"some value\"/>"
+ ;
+
+ _handler hdl;
+ orcus::sax_parser<_handler> parser(content, hdl);
+ parser.parse();
+}
+
+void test_attr_with_encoded_chars_single_quotes()
+{
+ struct _handler : public orcus::sax_handler
+ {
+ void attribute(const orcus::sax::parser_attribute& attr)
+ {
+ if (attr.name == "attr1")
+ assert(attr.value == "'some value'");
+ }
+ };
+
+ const char* content =
+ "<?xml version=\"1.0\"?>"
+ "<root attr1='&apos;some value&apos;'/>"
+ ;
+
+ _handler hdl;
+ orcus::sax_parser<_handler> parser(content, hdl);
+ parser.parse();
+}
+
+int main()
+{
+ test_handler();
+ test_attr_equal_with_whitespace();
+ test_attr_with_encoded_chars_single_quotes();
+
+ return EXIT_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/sax_token_parser.cpp b/src/parser/sax_token_parser.cpp
new file mode 100644
index 0000000..fdf80c6
--- /dev/null
+++ b/src/parser/sax_token_parser.cpp
@@ -0,0 +1,110 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/sax_token_parser.hpp"
+#include "orcus/tokens.hpp"
+
+#include <mdds/sorted_string_map.hpp>
+#include <cctype>
+
+namespace orcus {
+
+namespace {
+
+enum class decl_attr_type { unknown, version, encoding, standalone };
+
+namespace decl_attr {
+
+using map_type = mdds::sorted_string_map<decl_attr_type, mdds::string_view_map_entry>;
+
+// Keys must be sorted.
+constexpr map_type::entry entries[] = {
+ { "encoding", decl_attr_type::encoding },
+ { "standalone", decl_attr_type::standalone },
+ { "version", decl_attr_type::version },
+};
+
+const map_type& get()
+{
+ static map_type mt(entries, std::size(entries), decl_attr_type::unknown);
+ return mt;
+}
+
+} // namespace decl_attr
+
+}
+
+sax_token_handler_wrapper_base::sax_token_handler_wrapper_base(const tokens& _tokens) :
+ m_tokens(_tokens) {}
+
+xml_token_t sax_token_handler_wrapper_base::tokenize(std::string_view name) const
+{
+ xml_token_t token = XML_UNKNOWN_TOKEN;
+ if (!name.empty())
+ token = m_tokens.get_token(name);
+ return token;
+}
+
+void sax_token_handler_wrapper_base::set_element(const sax_ns_parser_element& elem)
+{
+ m_elem.ns = elem.ns;
+ m_elem.name = tokenize(elem.name);
+ m_elem.raw_name = elem.name;
+}
+
+void sax_token_handler_wrapper_base::attribute(std::string_view name, std::string_view val)
+{
+ decl_attr_type dat = decl_attr::get().find(name);
+
+ switch (dat)
+ {
+ case decl_attr_type::version:
+ {
+ const char* p = val.data();
+ const char* p_end = p + val.size();
+
+ long v;
+ const char* endptr = parse_integer(p, p_end, v);
+
+ if (!endptr || endptr >= p_end || *endptr != '.')
+ break;
+
+ m_declaration.version_major = v;
+ p = endptr + 1;
+
+ endptr = parse_integer(p, p_end, v);
+
+ if (!endptr || endptr > p_end)
+ break;
+
+ m_declaration.version_minor = v;
+ break;
+ }
+ case decl_attr_type::encoding:
+ {
+ m_declaration.encoding = to_character_set(val);
+ break;
+ }
+ case decl_attr_type::standalone:
+ m_declaration.standalone = (val == "yes") ? true : false;
+ break;
+ default:
+ ;
+ }
+}
+
+void sax_token_handler_wrapper_base::attribute(const sax_ns_parser_attribute& attr)
+{
+ m_elem.attrs.push_back(
+ xml_token_attr_t(
+ attr.ns, tokenize(attr.name), attr.name,
+ attr.value, attr.transient));
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/sax_token_parser_test.cpp b/src/parser/sax_token_parser_test.cpp
new file mode 100644
index 0000000..d473196
--- /dev/null
+++ b/src/parser/sax_token_parser_test.cpp
@@ -0,0 +1,239 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "test_global.hpp"
+#include "orcus/sax_token_parser.hpp"
+#include "orcus/tokens.hpp"
+#include "orcus/xml_namespace.hpp"
+
+#include <cstring>
+
+using namespace std;
+using namespace orcus;
+
+void test_handler()
+{
+ const char* test_code = "<?xml version=\"1.0\"?><root/>";
+
+ orcus::sax_token_handler hdl;
+ orcus::tokens token_map(nullptr, 0);
+ orcus::xmlns_repository repo;
+ orcus::xmlns_context cxt = repo.create_context();
+ orcus::sax_token_parser<orcus::sax_token_handler> parser(test_code, token_map, cxt, hdl);
+ parser.parse();
+}
+
+void test_sax_token_parser_1()
+{
+ // Test XML content.
+ const char* content = "<?xml version=\"1.0\"?><root><andy/><bruce/><charlie/><david/><edward/><frank/></root>";
+
+ // Array of tokens to define for this test.
+ const char* token_names[] = {
+ "??", // 0
+ "andy", // 1
+ "bruce", // 2
+ "charlie", // 3
+ "david", // 4
+ "edward" // 5
+ };
+
+ size_t token_count = std::size(token_names);
+
+ // Token constants.
+ const xml_token_t op_andy = 1;
+ const xml_token_t op_bruce = 2;
+ const xml_token_t op_charlie = 3;
+ const xml_token_t op_david = 4;
+ const xml_token_t op_edward = 5;
+
+ struct check
+ {
+ const char* raw_name;
+ xml_token_t token;
+ bool start_element;
+ };
+
+ // Expected outcome.
+ const check checks[] = {
+ { "root", XML_UNKNOWN_TOKEN, true }, // name not on the master token list.
+ { "andy", op_andy, true },
+ { "andy", op_andy, false },
+ { "bruce", op_bruce, true },
+ { "bruce", op_bruce, false },
+ { "charlie", op_charlie, true },
+ { "charlie", op_charlie, false },
+ { "david", op_david, true },
+ { "david", op_david, false },
+ { "edward", op_edward, true },
+ { "edward", op_edward, false },
+ { "frank", XML_UNKNOWN_TOKEN, true }, // name not on the master token list.
+ { "frank", XML_UNKNOWN_TOKEN, false }, // name not on the master token list.
+ { "root", XML_UNKNOWN_TOKEN, false }, // name not on the master token list.
+ };
+
+ class handler
+ {
+ const check* mp_head;
+ const check* mp_check;
+ public:
+ handler(const check* p) : mp_head(p), mp_check(p) {}
+
+ void declaration(const orcus::xml_declaration_t&) {}
+
+ void start_element(const orcus::xml_token_element_t& elem)
+ {
+ assert(std::string_view(mp_check->raw_name) == elem.raw_name);
+ assert(mp_check->token == elem.name);
+ assert(mp_check->start_element);
+ ++mp_check;
+ }
+
+ void end_element(const orcus::xml_token_element_t& elem)
+ {
+ assert(std::string_view(mp_check->raw_name) == elem.raw_name);
+ assert(mp_check->token == elem.name);
+ assert(!mp_check->start_element);
+ ++mp_check;
+ }
+
+ void characters(std::string_view /*val*/, bool /*transient*/) {}
+
+ size_t get_token_count() const
+ {
+ return std::distance(mp_head, mp_check);
+ }
+ };
+
+ handler hdl(checks);
+ tokens token_map(token_names, token_count);
+ xmlns_repository ns_repo;
+ xmlns_context ns_cxt = ns_repo.create_context();
+ sax_token_parser<handler> parser(content, token_map, ns_cxt, hdl);
+ parser.parse();
+
+ assert(hdl.get_token_count() == std::size(checks));
+}
+
+void test_unicode_string()
+{
+ const char* content1 = "<?xml version=\"1.0\"?><root>&#x0021;</root>";
+ const char* content2 = "<?xml version=\"1.0\"?><root>&#x00B6;</root>";
+ const char* content3 = "<?xml version=\"1.0\"?><root>&#x20B9;</root>";
+
+ class handler
+ {
+ std::string_view str;
+ public:
+ handler(std::string_view _str):
+ str(_str)
+ {}
+
+ void declaration(const orcus::xml_declaration_t&) {}
+
+ void start_element(const orcus::xml_token_element_t& /*elem*/)
+ {
+ }
+
+ void end_element(const orcus::xml_token_element_t& /*elem*/)
+ {
+ }
+
+ void characters(std::string_view val, bool /*transient*/)
+ {
+ std::cout << "charachters:" << std::endl;
+ std::cout << val << std::endl;
+ assert(val == str);
+ }
+ };
+
+ const char* token_names[] = {
+ "???",
+ };
+ size_t token_count = std::size(token_names);
+
+ tokens token_map(token_names, token_count);
+ xmlns_repository ns_repo;
+ xmlns_context ns_cxt = ns_repo.create_context();
+ handler hdl(u8"\u0021");
+ sax_token_parser<handler> parser1(content1, token_map, ns_cxt, hdl);
+ parser1.parse();
+ hdl = handler(u8"\u00B6");
+ sax_token_parser<handler> parser2(content2, token_map, ns_cxt, hdl);
+ parser2.parse();
+ hdl = handler(u8"\u20B9");
+ sax_token_parser<handler> parser3(content3, token_map, ns_cxt, hdl);
+ parser3.parse();
+}
+
+void test_declaration()
+{
+ class handler
+ {
+ xml_declaration_t& m_decl;
+ public:
+ handler(xml_declaration_t& decl) : m_decl(decl) {}
+
+ void declaration(const xml_declaration_t& decl)
+ {
+ m_decl = decl;
+ }
+
+ void start_element(const xml_token_element_t&) {}
+ void end_element(const xml_token_element_t&) {}
+ void characters(std::string_view, bool) {}
+ };
+
+ std::vector<const char*> token_names = {};
+ tokens token_map(token_names.data(), token_names.size());
+ xmlns_repository ns_repo;
+ xmlns_context ns_cxt = ns_repo.create_context();
+
+ struct check
+ {
+ std::string content;
+ xml_declaration_t decl;
+ };
+
+ std::vector<check> checks =
+ {
+ {
+ "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?><root/>",
+ { 1, 0, character_set_t::utf_8, false }
+ },
+ {
+ "<?xml version=\"1.1\" encoding=\"windows-1253\" standalone=\"yes\"?><root/>",
+ { 1, 1, character_set_t::windows_1253, true }
+ },
+ {
+ "<?xml version=\"2.0\" encoding=\"US-ASCII\" standalone=\"yes\"?><root/>",
+ { 2, 0, character_set_t::us_ascii, true }
+ },
+ };
+
+ for (const check& c : checks)
+ {
+ xml_declaration_t decl;
+ handler hdl(decl);
+ sax_token_parser<handler> parser(c.content, token_map, ns_cxt, hdl);
+ parser.parse();
+
+ assert(decl == c.decl);
+ }
+}
+
+int main()
+{
+ test_handler();
+ test_sax_token_parser_1();
+ test_unicode_string();
+ test_declaration();
+
+ return EXIT_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/sax_token_parser_thread.cpp b/src/parser/sax_token_parser_thread.cpp
new file mode 100644
index 0000000..3d7b16b
--- /dev/null
+++ b/src/parser/sax_token_parser_thread.cpp
@@ -0,0 +1,204 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/sax_token_parser_thread.hpp"
+#include "orcus/sax_token_parser.hpp"
+#include "orcus/string_pool.hpp"
+#include "orcus/detail/parser_token_buffer.hpp"
+#include "orcus/tokens.hpp"
+#include "orcus/xml_namespace.hpp"
+
+#include <limits>
+#include <iostream>
+
+namespace orcus { namespace sax {
+
+parse_token::parse_token() : type(parse_token_t::unknown) {}
+
+parse_token::parse_token(std::string_view _characters) :
+ type(parse_token_t::characters),
+ value(_characters)
+{
+}
+
+parse_token::parse_token(parse_token_t _type, const xml_token_element_t* _element) :
+ type(_type), value(_element)
+{
+}
+
+parse_token::parse_token(std::string_view msg, std::ptrdiff_t offset) :
+ type(parse_token_t::parse_error),
+ value(parse_error_value_t{msg, offset})
+{
+}
+
+parse_token::parse_token(const parse_token& other) :
+ type(other.type), value(other.value)
+{
+}
+
+bool parse_token::operator== (const parse_token& other) const
+{
+ return type == other.type && value == other.value;
+}
+
+bool parse_token::operator!= (const parse_token& other) const
+{
+ return !operator==(other);
+}
+
+struct parser_thread::impl
+{
+ orcus::detail::thread::parser_token_buffer<parse_tokens_t> m_token_buffer;
+ string_pool m_pool;
+ std::vector<std::unique_ptr<xml_token_element_t>> m_element_store;
+
+ parse_tokens_t m_parser_tokens; // token buffer for the parser thread.
+
+ const char* mp_char;
+ size_t m_size;
+ const tokens& m_tokens;
+ xmlns_context& m_ns_cxt;
+
+ impl(const char* p, size_t n, const tokens& tks, xmlns_context& ns_cxt, size_t min_token_size, size_t max_token_size) :
+ m_token_buffer(min_token_size, max_token_size),
+ mp_char(p), m_size(n), m_tokens(tks), m_ns_cxt(ns_cxt)
+ {
+ }
+
+ void check_and_notify()
+ {
+ m_token_buffer.check_and_notify(m_parser_tokens);
+ }
+
+ void notify_and_finish()
+ {
+ m_token_buffer.notify_and_finish(m_parser_tokens);
+ }
+
+ void abort()
+ {
+ m_token_buffer.abort();
+ }
+
+ void declaration(const orcus::xml_declaration_t& /*decl*/)
+ {
+ }
+
+ void start_element(const orcus::xml_token_element_t& elem)
+ {
+ m_element_store.emplace_back(std::make_unique<orcus::xml_token_element_t>(elem));
+ orcus::xml_token_element_t& this_elem = *m_element_store.back();
+
+ // Go through all attributes and intern transient strings.
+ std::for_each(this_elem.attrs.begin(), this_elem.attrs.end(),
+ [&](xml_token_attr_t& attr)
+ {
+ if (attr.transient)
+ {
+ attr.value = m_pool.intern(attr.value).first;
+ attr.transient = false;
+ }
+ }
+ );
+
+ m_parser_tokens.emplace_back(parse_token_t::start_element, m_element_store.back().get());
+ check_and_notify();
+ }
+
+ void end_element(const orcus::xml_token_element_t& elem)
+ {
+ assert(elem.attrs.empty());
+
+ m_element_store.emplace_back(std::make_unique<orcus::xml_token_element_t>(elem));
+ m_parser_tokens.emplace_back(parse_token_t::end_element, m_element_store.back().get());
+ check_and_notify();
+ }
+
+ void characters(std::string_view val, bool transient)
+ {
+ if (transient)
+ m_parser_tokens.emplace_back(m_pool.intern(val).first);
+ else
+ m_parser_tokens.emplace_back(val);
+
+ check_and_notify();
+ }
+
+ void start()
+ {
+ try
+ {
+ try
+ {
+ orcus::sax_token_parser<impl> parser({mp_char, m_size}, m_tokens, m_ns_cxt, *this);
+ parser.parse();
+ }
+ catch (const malformed_xml_error& e)
+ {
+ std::string_view s = m_pool.intern(e.what()).first;
+ m_parser_tokens.emplace_back(s, e.offset());
+ }
+
+ // TODO : add more exceptions that need to be tokenized and processed by the client thread.
+
+ notify_and_finish();
+ }
+ catch (const orcus::detail::parsing_aborted_error&)
+ {
+ // This is used only to abort the parsing thread prematurely.
+ }
+ }
+
+ bool next_tokens(parse_tokens_t& tokens)
+ {
+ return m_token_buffer.next_tokens(tokens);
+ }
+
+ void swap_string_pool(string_pool& pool)
+ {
+ m_pool.swap(pool);
+ }
+};
+
+parser_thread::parser_thread(
+ const char* p, size_t n, const orcus::tokens& tks, xmlns_context& ns_cxt, size_t min_token_size) :
+ mp_impl(std::make_unique<parser_thread::impl>(
+ p, n, tks, ns_cxt, min_token_size, std::numeric_limits<size_t>::max()/2)) {}
+
+parser_thread::parser_thread(
+ const char* p, size_t n, const orcus::tokens& tks, xmlns_context& ns_cxt, size_t min_token_size, size_t max_token_size) :
+ mp_impl(std::make_unique<parser_thread::impl>(
+ p, n, tks, ns_cxt, min_token_size, max_token_size)) {}
+
+parser_thread::~parser_thread()
+{
+}
+
+void parser_thread::start()
+{
+ mp_impl->start();
+}
+
+bool parser_thread::next_tokens(parse_tokens_t& tokens)
+{
+ return mp_impl->next_tokens(tokens);
+}
+
+void parser_thread::swap_string_pool(string_pool& pool)
+{
+ mp_impl->swap_string_pool(pool);
+}
+
+void parser_thread::abort()
+{
+ mp_impl->abort();
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/stream.cpp b/src/parser/stream.cpp
new file mode 100644
index 0000000..c0bbb28
--- /dev/null
+++ b/src/parser/stream.cpp
@@ -0,0 +1,447 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/stream.hpp>
+#include <orcus/exception.hpp>
+
+#include "utf8.hpp"
+
+#include <sstream>
+#include <fstream>
+#include <tuple>
+#include <cassert>
+#include <algorithm>
+#include <locale>
+#include <codecvt>
+#include <iostream>
+
+#include "filesystem_env.hpp"
+
+#include <boost/interprocess/file_mapping.hpp>
+#include <boost/interprocess/mapped_region.hpp>
+
+namespace bip = boost::interprocess;
+
+namespace orcus {
+
+namespace {
+
+enum class unicode_t
+{
+ unknown,
+ utf16_be,
+ utf16_le
+};
+
+unicode_t check_unicode_type(const char* p, size_t n)
+{
+ if (n > 2)
+ {
+ if (p[0] == '\xFE' && p[1] == '\xFF')
+ return unicode_t::utf16_be;
+
+ if (p[0] == '\xFF' && p[1] == '\xFE')
+ return unicode_t::utf16_le;
+ }
+
+ return unicode_t::unknown;
+}
+
+std::string convert_utf16_to_utf8(const char* p, size_t n, unicode_t ut)
+{
+ assert(ut == unicode_t::utf16_be || ut == unicode_t::utf16_le);
+
+ if (n & 0x01)
+ throw std::invalid_argument("size of a UTF-16 string must be divisible by 2.");
+
+ p += 2; // skip the BOM.
+
+ size_t n_buf = n / 2u - 1;
+ std::u16string buf(n_buf, 0);
+
+ switch (ut)
+ {
+ case unicode_t::utf16_be:
+ {
+ for (size_t i = 0; i < n_buf; ++i)
+ {
+ size_t offset = i * 2;
+ buf[i] = static_cast<char16_t>(p[offset+1] | p[offset] << 8);
+ }
+ break;
+ }
+ case unicode_t::utf16_le:
+ {
+ for (size_t i = 0; i < n_buf; ++i)
+ {
+ size_t offset = i * 2;
+ buf[i] = static_cast<char16_t>(p[offset] | p[offset+1]);
+ }
+ break;
+ }
+ default:
+ ;
+ }
+
+#if defined(_MSC_VER)
+ // char16_t does not work with MSVC just yet. This is a workaround. c.f.
+ // https://stackoverflow.com/questions/32055357/visual-studio-c-2015-stdcodecvt-with-char16-t-or-char32-t
+ const int16_t* pi16 = reinterpret_cast<const int16_t*>(buf.data());
+ const int16_t* pi16_end = pi16 + buf.size();
+ std::wstring_convert<std::codecvt_utf8_utf16<int16_t>, int16_t> conversion;
+ return conversion.to_bytes(pi16, pi16_end);
+#else
+ std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> conversion;
+ return conversion.to_bytes(buf);
+#endif
+}
+
+std::tuple<std::string_view, size_t, size_t> find_line_with_offset(std::string_view strm, std::ptrdiff_t offset)
+{
+ const char* p0 = strm.data();
+ const char* p_end = p0 + strm.size();
+ const char* p_offset = p0 + offset;
+
+ if (p_offset >= p_end)
+ {
+ std::ostringstream os;
+ os << "offset value of " << offset << " is out-of-bound for a stream of length " << strm.size();
+ throw std::invalid_argument(os.str());
+ }
+
+ // Determine the line number.
+ std::size_t line_num = 0;
+ for (const char* p = p0; p != p_offset; ++p)
+ {
+ if (*p == '\n')
+ ++line_num;
+ }
+
+ // Determine the beginning of the line.
+ const char* p_line_start = p_offset;
+
+ // if the error points at the new line character
+ // we have most likely an unterminated quote.
+ // Report the line with the actual error.
+ if (*p_offset == '\n' && offset > 0)
+ --p_line_start;
+
+ for (; p0 <= p_line_start; --p_line_start)
+ {
+ if (*p_line_start == '\n')
+ break;
+ }
+
+ ++p_line_start;
+ assert(p0 <= p_line_start);
+
+ // Determine the end of the line.
+ const char* p_line_end = p_offset;
+ for (; p_line_end < p_end; ++p_line_end)
+ {
+ if (*p_line_end == '\n')
+ // one character after the last character of the line.
+ break;
+ }
+
+ assert(p_line_start <= p_offset);
+ std::size_t offset_on_line = std::distance(p_line_start, p_offset);
+ std::string_view line(p_line_start, p_line_end - p_line_start);
+
+ return std::make_tuple(line, line_num, offset_on_line);
+}
+
+} // anonymous namespace
+
+struct file_content::impl
+{
+ boost::uintmax_t content_size;
+ bip::file_mapping mapped_file;
+ bip::mapped_region mapped_region;
+
+ std::string buffer; // its own buffer in case of stream conversion.
+
+ const char* content;
+
+ impl() : content_size(0), content(nullptr) {}
+
+ impl(std::string_view filepath) :
+ content_size(fs::file_size(std::string{filepath}.c_str())),
+ mapped_file(std::string{filepath}.c_str(), bip::read_only),
+ mapped_region(mapped_file, bip::read_only, 0, content_size),
+ content(nullptr)
+ {
+ content = static_cast<const char*>(mapped_region.get_address());
+ }
+};
+
+file_content::file_content() :
+ mp_impl(std::make_unique<impl>()) {}
+
+file_content::file_content(file_content&& other) = default;
+
+file_content::file_content(std::string_view filepath) :
+ mp_impl(std::make_unique<impl>(filepath)) {}
+
+file_content::~file_content() = default;
+
+const char* file_content::data() const
+{
+ return mp_impl->content;
+}
+
+size_t file_content::size() const
+{
+ return mp_impl->content_size;
+}
+
+bool file_content::empty() const
+{
+ return mp_impl->content_size == 0;
+}
+
+void file_content::swap(file_content& other)
+{
+ std::swap(mp_impl, other.mp_impl);
+}
+
+void file_content::load(std::string_view filepath)
+{
+ file_content tmp(filepath);
+ swap(tmp);
+}
+
+void file_content::convert_to_utf8()
+{
+ unicode_t ut = check_unicode_type(mp_impl->content, mp_impl->content_size);
+
+ switch (ut)
+ {
+ case unicode_t::utf16_be:
+ case unicode_t::utf16_le:
+ {
+ // Convert to utf-8 stream, and reset the content pointer and size.
+ mp_impl->buffer = convert_utf16_to_utf8(mp_impl->content, mp_impl->content_size, ut);
+ mp_impl->content = mp_impl->buffer.data();
+ mp_impl->content_size = mp_impl->buffer.size();
+ break;
+ }
+ default:
+ ;
+ }
+}
+
+std::string_view file_content::str() const
+{
+ return std::string_view(mp_impl->content, mp_impl->content_size);
+}
+
+struct memory_content::impl
+{
+ std::string_view content;
+ std::string buffer; // its own buffer in case of stream conversion.
+
+ impl() {}
+ impl(std::string_view s) : content(s) {}
+};
+
+memory_content::memory_content() : mp_impl(std::make_unique<impl>()) {}
+
+memory_content::memory_content(std::string_view s) :
+ mp_impl(std::make_unique<impl>(s)) {}
+
+memory_content::memory_content(memory_content&& other) = default;
+memory_content::~memory_content() = default;
+
+const char* memory_content::data() const
+{
+ return mp_impl->content.data();
+}
+
+size_t memory_content::size() const
+{
+ return mp_impl->content.size();
+}
+
+bool memory_content::empty() const
+{
+ return mp_impl->content.empty();
+}
+
+void memory_content::swap(memory_content& other)
+{
+ std::swap(mp_impl, other.mp_impl);
+}
+
+void memory_content::convert_to_utf8()
+{
+ unicode_t ut = check_unicode_type(mp_impl->content.data(), mp_impl->content.size());
+
+ switch (ut)
+ {
+ case unicode_t::utf16_be:
+ case unicode_t::utf16_le:
+ {
+ // Convert to utf-8 stream, and reset the content pointer and size.
+ mp_impl->buffer = convert_utf16_to_utf8(mp_impl->content.data(), mp_impl->content.size(), ut);
+ mp_impl->content = mp_impl->buffer;
+ break;
+ }
+ default:
+ ;
+ }
+}
+
+std::string_view memory_content::str() const
+{
+ return mp_impl->content;
+}
+
+line_with_offset::line_with_offset(std::string _line, std::size_t _line_number, std::size_t _offset_on_line) :
+ line(std::move(_line)),
+ line_number(_line_number),
+ offset_on_line(_offset_on_line)
+{}
+
+line_with_offset::line_with_offset(const line_with_offset& other) = default;
+line_with_offset::line_with_offset(line_with_offset&& other) = default;
+line_with_offset::~line_with_offset() = default;
+
+bool line_with_offset::operator== (const line_with_offset& other) const
+{
+ return line == other.line && line_number == other.line_number && offset_on_line == other.offset_on_line;
+}
+
+bool line_with_offset::operator!= (const line_with_offset& other) const
+{
+ return !operator==(other);
+}
+
+std::string create_parse_error_output(std::string_view strm, std::ptrdiff_t offset)
+{
+ if (strm.empty() || offset < 0)
+ return std::string();
+
+ const size_t max_line_length = 60;
+ offset = std::min<std::ptrdiff_t>(strm.size() - 1, offset);
+
+ auto line_info = find_line_with_offset(strm, offset);
+ std::string_view line = std::get<0>(line_info);
+ size_t line_num = std::get<1>(line_info);
+ size_t offset_on_line = std::get<2>(line_info);
+
+ if (offset_on_line < 30)
+ {
+ std::ostringstream os;
+ os << (line_num+1) << ":" << (offset_on_line+1) << ": ";
+ size_t line_num_width = os.str().size();
+
+ // Truncate line if it's too long.
+ if (line.size() > max_line_length)
+ line = std::string_view(line.data(), max_line_length);
+
+ os << line << std::endl;
+
+ for (size_t i = 0; i < (offset_on_line+line_num_width); ++i)
+ os << ' ';
+ os << '^';
+ return os.str();
+ }
+
+ // The error line is too long. Only show a segment of the line where the
+ // error occurred.
+
+ const size_t fixed_offset = 20;
+
+ size_t line_start = offset_on_line - fixed_offset;
+ size_t line_end = line_start + max_line_length;
+ if (line_end > line.size())
+ line_end = line.size();
+
+ size_t line_length = line_end - line_start;
+
+ line = std::string_view(line.data()+line_start, line_length);
+
+ std::ostringstream os;
+ os << line_num << ":" << (line_start+1) << ": ";
+ size_t line_num_width = os.str().size();
+
+ os << line << std::endl;
+
+ for (size_t i = 0; i < (fixed_offset+line_num_width); ++i)
+ os << ' ';
+ os << '^';
+
+ return os.str();
+}
+
+line_with_offset locate_line_with_offset(std::string_view strm, std::ptrdiff_t offset)
+{
+ auto line_info = find_line_with_offset(strm, offset);
+ std::string_view line = std::get<0>(line_info);
+ size_t line_num = std::get<1>(line_info);
+ size_t offset_on_line = std::get<2>(line_info);
+
+ return line_with_offset(std::string{line}, line_num, offset_on_line);
+}
+
+size_t locate_first_different_char(std::string_view left, std::string_view right)
+{
+ if (left.empty() || right.empty())
+ // If one of them is empty, then the first characters are considered
+ // different.
+ return 0;
+
+ size_t n = std::min(left.size(), right.size());
+ const char* p1 = left.data();
+ const char* p2 = right.data();
+ const char* p1_end = p1 + n;
+
+ for (; p1 != p1_end; ++p1, ++p2)
+ {
+ if (*p1 != *p2)
+ return std::distance(left.data(), p1);
+ }
+
+ return n;
+}
+
+std::size_t calc_logical_string_length(std::string_view s)
+{
+ std::size_t length = 0;
+
+ const char* p = s.data();
+ const char* p_end = p + s.size();
+
+ while (p < p_end)
+ {
+ ++length;
+
+ auto n_bytes = calc_utf8_byte_length(*p);
+ if (!n_bytes || n_bytes > 4)
+ {
+ std::ostringstream os;
+ os << "'" << s << "' contains invalid character at position " << std::distance(s.data(), p);
+ throw std::invalid_argument(os.str());
+ }
+
+ p += n_bytes;
+ }
+
+ if (p != p_end)
+ {
+ std::ostringstream os;
+ os << "last character of '" << s << "' ended prematurely";
+ throw std::invalid_argument(os.str());
+ }
+
+ return length;
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/stream_test.cpp b/src/parser/stream_test.cpp
new file mode 100644
index 0000000..1a6e9fb
--- /dev/null
+++ b/src/parser/stream_test.cpp
@@ -0,0 +1,144 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "test_global.hpp"
+#include "orcus/stream.hpp"
+
+#include <cstdlib>
+#include <string>
+#include <vector>
+
+using namespace std;
+using namespace orcus;
+
+void test_stream_create_error_output()
+{
+ test::stack_printer __sp__(__func__);
+
+ string output = create_parse_error_output("{}", 1);
+ cout << output << endl;
+ const char* expected = "1:2: {}\n ^";
+ assert(output == expected);
+}
+
+void test_stream_locate_first_different_char()
+{
+ test::stack_printer __sp__(__func__);
+
+ struct test_case
+ {
+ const char* left;
+ const char* right;
+ size_t expected;
+ };
+
+ std::vector<test_case> test_cases = {
+ { "", "a", 0 },
+ { "a", "", 0 },
+ { "", "", 0 },
+ { " ", "b", 0 },
+ { "abc", "abc", 3 },
+ { "abcd", "abce", 3 },
+ { "abc", "bbc", 0 },
+ { "abc", "acc", 1 },
+ };
+
+ for (const test_case& tc : test_cases)
+ {
+ size_t actual = locate_first_different_char(tc.left, tc.right);
+ assert(actual == tc.expected);
+ }
+}
+
+void test_stream_logical_string_length()
+{
+ test::stack_printer __sp__(__func__);
+
+ struct check
+ {
+ std::string_view value;
+ std::size_t length;
+ };
+
+ constexpr check checks[] = {
+ { "東京", 2 },
+ { "大阪は暑い", 5 },
+ { "New York", 8 },
+ { "日本は英語で言うとJapan", 14 },
+ { "fabriqué", 8 },
+ { "garçon", 6 },
+ { "вход", 4 },
+ { "выход", 5 },
+ { "помогите", 8 },
+ { "Nähe", 4 },
+ };
+
+ for (auto [value, expected_len] : checks)
+ {
+ std::size_t len = calc_logical_string_length(value);
+ std::cout << "'" << value << "' (length=" << len << ")" << std::endl;
+ assert(len == expected_len);
+ }
+}
+
+void test_stream_locate_line_with_offset()
+{
+ test::stack_printer __sp__(__func__);
+
+ std::string strm = "one\ntwo\nthree";
+
+ struct check
+ {
+ std::ptrdiff_t offset;
+ line_with_offset expected;
+ };
+
+ const std::vector<check> checks = {
+ { 0, { "one", 0, 0 } },
+ { 1, { "one", 0, 1 } },
+ { 2, { "one", 0, 2 } },
+ { 3, { "one", 0, 3 } }, // on line break
+ { 4, { "two", 1, 0 } },
+ { 5, { "two", 1, 1 } },
+ { 6, { "two", 1, 2 } },
+ { 7, { "two", 1, 3 } }, // on line break
+ { 8, { "three", 2, 0 } },
+ { 9, { "three", 2, 1 } },
+ { 10, { "three", 2, 2 } },
+ { 11, { "three", 2, 3 } },
+ { 12, { "three", 2, 4 } },
+ };
+
+ for (const auto& c : checks)
+ {
+ auto res = locate_line_with_offset(strm, c.offset);
+ assert(res == c.expected);
+ }
+
+ try
+ {
+ auto res = locate_line_with_offset(strm, strm.size());
+ assert(!"exception should have been thrown for out-of-bound offset!");
+ }
+ catch (const std::invalid_argument& e)
+ {
+ // expected
+ cout << "exception thrown as expected: '" << e.what() << "'" << endl;
+ }
+}
+
+int main()
+{
+ test_stream_create_error_output();
+ test_stream_locate_first_different_char();
+ test_stream_logical_string_length();
+ test_stream_locate_line_with_offset();
+
+ return EXIT_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/string_pool.cpp b/src/parser/string_pool.cpp
new file mode 100644
index 0000000..e438da5
--- /dev/null
+++ b/src/parser/string_pool.cpp
@@ -0,0 +1,137 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/string_pool.hpp>
+#include <orcus/exception.hpp>
+
+#include <iostream>
+#include <unordered_set>
+#include <vector>
+#include <memory>
+#include <cassert>
+#include <algorithm>
+#include <string_view>
+
+#include <boost/pool/object_pool.hpp>
+
+namespace orcus {
+
+using std::cout;
+using std::endl;
+
+using string_set_type = std::unordered_set<std::string_view>;
+using string_store_type = boost::object_pool<std::string>;
+using string_stores_type = std::vector<std::unique_ptr<string_store_type>>;
+
+struct string_pool::impl
+{
+ string_stores_type m_stores;
+ string_set_type m_set;
+
+ impl()
+ {
+ // first element is the active store used for the current instance.
+ m_stores.push_back(std::make_unique<string_store_type>(256, 0));
+ }
+};
+
+string_pool::string_pool() : mp_impl(std::make_unique<impl>()) {}
+
+string_pool::string_pool(string_pool&& other) : mp_impl(std::move(other.mp_impl)) {}
+
+string_pool::~string_pool() = default;
+
+std::pair<std::string_view, bool> string_pool::intern(std::string_view str)
+{
+ if (str.empty())
+ return std::pair<std::string_view, bool>(std::string_view(), false);
+
+ string_set_type::const_iterator itr = mp_impl->m_set.find(str);
+ if (itr == mp_impl->m_set.end())
+ {
+ // This string has not been interned. Intern it.
+ string_store_type& store = *mp_impl->m_stores[0];
+ std::string* p = store.construct(str);
+ if (!p)
+ throw general_error("failed to intern a new string instance.");
+
+ std::pair<string_set_type::iterator,bool> r =
+ mp_impl->m_set.emplace(p->data(), p->size());
+ if (!r.second)
+ throw general_error("failed to intern a new string instance.");
+
+ std::string_view ps = *r.first;
+ assert(ps == str);
+
+ return std::pair<std::string_view, bool>(ps, true);
+ }
+
+ // This string has already been interned.
+
+ std::string_view stored_str = *itr;
+ assert(stored_str == str);
+ return std::pair<std::string_view, bool>(stored_str, false);
+}
+
+std::vector<std::string_view> string_pool::get_interned_strings() const
+{
+ std::vector<std::string_view> sorted;
+ sorted.reserve(mp_impl->m_set.size());
+
+ for (std::string_view ps : mp_impl->m_set)
+ sorted.push_back(ps);
+
+ std::sort(sorted.begin(), sorted.end());
+
+ return sorted;
+}
+
+void string_pool::dump() const
+{
+ auto sorted = get_interned_strings();
+
+ cout << "interned string count: " << sorted.size() << endl;
+
+ // Dump them all to stdout.
+ size_t counter = 0;
+ for (std::string_view s : sorted)
+ cout << counter++ << ": '" << s << "'" << endl;
+}
+
+void string_pool::clear()
+{
+ mp_impl = std::make_unique<impl>();
+}
+
+size_t string_pool::size() const
+{
+ return mp_impl->m_set.size();
+}
+
+void string_pool::swap(string_pool& other)
+{
+ std::swap(mp_impl, other.mp_impl);
+}
+
+void string_pool::merge(string_pool& other)
+{
+ while (!other.mp_impl->m_stores.empty())
+ {
+ mp_impl->m_stores.push_back(
+ std::move(other.mp_impl->m_stores.back()));
+ other.mp_impl->m_stores.pop_back();
+ }
+
+ for (std::string_view p : other.mp_impl->m_set)
+ mp_impl->m_set.insert(p);
+
+ other.mp_impl->m_set.clear();
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/string_pool_test.cpp b/src/parser/string_pool_test.cpp
new file mode 100644
index 0000000..7d3f864
--- /dev/null
+++ b/src/parser/string_pool_test.cpp
@@ -0,0 +1,134 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "test_global.hpp"
+#include <orcus/string_pool.hpp>
+
+#include <type_traits>
+
+using namespace orcus;
+
+void test_basic()
+{
+ const char* static_text = "test";
+
+ string_pool pool;
+ assert(pool.size() == 0);
+
+ std::pair<std::string_view, bool> ret = pool.intern("foo");
+ assert(ret.first == "foo");
+ assert(ret.second); // new instance
+
+ ret = pool.intern("foo");
+ assert(ret.first == "foo");
+ assert(!ret.second); // existing instance.
+
+ // Empty strings should not be interned.
+ ret = pool.intern("");
+ assert(ret.first.empty());
+ assert(!ret.second);
+
+ ret = pool.intern("A");
+ std::cout << "interned string: " << ret.first << std::endl;
+ assert(ret.second);
+ assert(pool.size() == 2);
+
+ // Duplicate string.
+ ret = pool.intern("A");
+ std::cout << "interned string: " << ret.first << std::endl;
+ assert(!ret.second);
+
+ ret = pool.intern("B");
+ std::cout << "interned string: " << ret.first << std::endl;
+ assert(pool.size() == 3);
+
+ // Interning an already-intern string should return a string_view with
+ // identical memory address.
+ std::string_view str = ret.first;
+ std::string_view str2 = pool.intern(str).first;
+ assert(str == str2);
+ assert(pool.size() == 3);
+ assert(str.data() == str2.data()); // their memory address should be identical.
+
+ std::string_view static_str(static_text);
+ ret = pool.intern(static_str);
+ str = ret.first;
+ std::cout << "interned string: " << str << std::endl;
+ assert(pool.size() == 4);
+ assert(str == static_str);
+ assert(str.data() != static_str.data());
+
+ // Make sure that the pool remains usable after calling clear().
+ pool.clear();
+ assert(pool.size() == 0);
+ ret = pool.intern(static_str);
+ assert(ret.second); // it should be a new string
+ assert(ret.first == static_str);
+}
+
+void test_merge()
+{
+ string_pool pool1;
+ std::unique_ptr<string_pool> pool2(std::make_unique<string_pool>());
+
+ pool1.intern("A");
+ pool1.intern("B");
+ pool1.intern("C");
+ std::string_view v1 = pool1.intern("same value").first;
+
+ pool2->intern("D");
+ pool2->intern("E");
+ pool2->intern("F");
+ std::string_view v2 = pool2->intern("same value").first;
+
+ assert(pool1.size() == 4);
+ assert(pool2->size() == 4);
+
+ pool1.merge(*pool2);
+
+ assert(pool1.size() == 7);
+ assert(pool2->size() == 0);
+
+ pool2.reset(); // Delete the pool2 instance altogether.
+
+ // This should not create a new entry.
+ auto r = pool1.intern("F");
+ assert(!r.second);
+
+ // v2 still points to the original string in pool2, which should now be in
+ // the merged store in pool1 (thus valid).
+ assert(v1 == v2);
+
+ std::vector<std::string_view> entries = pool1.get_interned_strings();
+ assert(entries.size() == pool1.size());
+}
+
+void test_move()
+{
+ static_assert(!std::is_copy_constructible_v<orcus::string_pool>);
+ static_assert(std::is_move_constructible_v<orcus::string_pool>);
+
+ string_pool pool1;
+ pool1.intern("A");
+ pool1.intern("B");
+ pool1.intern("C");
+ pool1.intern("D");
+ pool1.intern("E");
+
+ string_pool pool2 = std::move(pool1);
+ assert(pool2.size() == 5);
+}
+
+int main()
+{
+ test_basic();
+ test_merge();
+ test_move();
+
+ return EXIT_SUCCESS;
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/threaded_json_parser_test.cpp b/src/parser/threaded_json_parser_test.cpp
new file mode 100644
index 0000000..5ac8053
--- /dev/null
+++ b/src/parser/threaded_json_parser_test.cpp
@@ -0,0 +1,187 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "test_global.hpp"
+#include <orcus/threaded_json_parser.hpp>
+
+#include <cstring>
+
+using namespace orcus;
+using namespace std;
+
+class handler
+{
+ json::parse_tokens_t m_tokens;
+
+public:
+ void begin_parse()
+ {
+ m_tokens.emplace_back(json::parse_token_t::begin_parse);
+ }
+
+ void end_parse()
+ {
+ m_tokens.emplace_back(json::parse_token_t::end_parse);
+ }
+
+ void begin_array()
+ {
+ m_tokens.emplace_back(json::parse_token_t::begin_array);
+ }
+
+ void end_array()
+ {
+ m_tokens.emplace_back(json::parse_token_t::end_array);
+ }
+
+ void begin_object()
+ {
+ m_tokens.emplace_back(json::parse_token_t::begin_object);
+ }
+
+ void object_key(const char* p, size_t len, bool transient)
+ {
+ assert(!transient); // transient is never true with the threaded parser.
+ m_tokens.emplace_back(json::parse_token_t::object_key, std::string_view{p, len});
+ }
+
+ void end_object()
+ {
+ m_tokens.emplace_back(json::parse_token_t::end_object);
+ }
+
+ void boolean_true()
+ {
+ m_tokens.emplace_back(json::parse_token_t::boolean_true);
+ }
+
+ void boolean_false()
+ {
+ m_tokens.emplace_back(json::parse_token_t::boolean_false);
+ }
+
+ void null()
+ {
+ m_tokens.emplace_back(json::parse_token_t::null);
+ }
+
+ void string(const char* p, size_t len, bool transient)
+ {
+ assert(!transient); // transient is never true with the threaded parser.
+ m_tokens.emplace_back(json::parse_token_t::string, std::string_view{p, len});
+ }
+
+ void number(double val)
+ {
+ m_tokens.emplace_back(val);
+ }
+
+ const json::parse_tokens_t& get_tokens() const
+ {
+ return m_tokens;
+ }
+};
+
+void test_parser(const char* src, const json::parse_tokens_t& expected)
+{
+ cout << "source: " << src << endl;
+
+ handler hdl;
+ threaded_json_parser<handler> parser(src, std::strlen(src), hdl, 5, 5);
+ parser.parse();
+
+ if (hdl.get_tokens() != expected)
+ {
+ cout << "Expected tokens:" << endl;
+ cout << expected;
+ cout << "Actual tokens:" << endl;
+ cout << hdl.get_tokens();
+ abort();
+ }
+}
+
+void test_threaded_json_parser_basic()
+{
+ struct test_case
+ {
+ const char* source;
+ json::parse_tokens_t expected;
+ };
+
+ test_case tcs[] =
+ {
+ {
+ "[1,2,3]",
+ {
+ { json::parse_token_t::begin_parse },
+ { json::parse_token_t::begin_array },
+ { 1.0 },
+ { 2.0 },
+ { 3.0 },
+ { json::parse_token_t::end_array },
+ { json::parse_token_t::end_parse },
+ }
+ },
+ {
+ "{\"foo\": [true, false, null]}",
+ {
+ { json::parse_token_t::begin_parse },
+ { json::parse_token_t::begin_object },
+ { json::parse_token_t::object_key, std::string_view{"foo"} },
+ { json::parse_token_t::begin_array },
+ { json::parse_token_t::boolean_true },
+ { json::parse_token_t::boolean_false },
+ { json::parse_token_t::null },
+ { json::parse_token_t::end_array },
+ { json::parse_token_t::end_object },
+ { json::parse_token_t::end_parse },
+ }
+ }
+ };
+
+ for (size_t i = 0, n = std::size(tcs); i < n; ++i)
+ test_parser(tcs[i].source, tcs[i].expected);
+}
+
+void test_threaded_json_parser_invalid()
+{
+ const char* invalids[] = {
+ "[foo]",
+ "[qwerty]",
+ "[1,2] null",
+ "{\"key\" 1: 12}",
+ "[1,,2]",
+ "\"key\": {\"inner\": 12}"
+ };
+
+ for (size_t i = 0; i < std::size(invalids); ++i)
+ {
+ const char* src = invalids[i];
+
+ try
+ {
+ handler hdl;
+ threaded_json_parser<handler> parser(src, std::strlen(src), hdl, 1);
+ parser.parse();
+ assert(false);
+ }
+ catch (const parse_error&)
+ {
+ // works as expected.
+ cout << "invalid source: " << src << endl;
+ }
+ }
+}
+
+int main()
+{
+ test_threaded_json_parser_basic();
+ test_threaded_json_parser_invalid();
+ return EXIT_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/threaded_sax_token_parser_test.cpp b/src/parser/threaded_sax_token_parser_test.cpp
new file mode 100644
index 0000000..1338b2a
--- /dev/null
+++ b/src/parser/threaded_sax_token_parser_test.cpp
@@ -0,0 +1,190 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "test_global.hpp"
+#include "orcus/threaded_sax_token_parser.hpp"
+#include "orcus/tokens.hpp"
+#include "orcus/xml_namespace.hpp"
+#include "orcus/parser_base.hpp"
+#include "orcus/stream.hpp"
+
+#include <cstring>
+
+using namespace std;
+using namespace orcus;
+
+void test_sax_token_parser_1()
+{
+ // Array of tokens to define for this test.
+ const char* token_names[] = {
+ "??", // 0
+ "andy", // 1
+ "bruce", // 2
+ "charlie", // 3
+ "david", // 4
+ "edward" // 5
+ };
+
+ size_t token_count = std::size(token_names);
+
+ // Token constants.
+ const xml_token_t op_andy = 1;
+ const xml_token_t op_bruce = 2;
+ const xml_token_t op_charlie = 3;
+ const xml_token_t op_david = 4;
+ const xml_token_t op_edward = 5;
+
+ struct check
+ {
+ const char* raw_name;
+ xml_token_t token;
+ bool start_element;
+ };
+
+ tokens token_map(token_names, token_count);
+ xmlns_repository ns_repo;
+ xmlns_context ns_cxt = ns_repo.create_context();
+
+ {
+ // Test XML content.
+ const char* content = "<?xml version=\"1.0\"?><root><andy/><bruce/><charlie/><david/><edward/><frank/></root>";
+ size_t content_size = strlen(content);
+
+ // Expected outcome.
+ const check checks[] = {
+ { "root", XML_UNKNOWN_TOKEN, true }, // name not on the master token list.
+ { "andy", op_andy, true },
+ { "andy", op_andy, false },
+ { "bruce", op_bruce, true },
+ { "bruce", op_bruce, false },
+ { "charlie", op_charlie, true },
+ { "charlie", op_charlie, false },
+ { "david", op_david, true },
+ { "david", op_david, false },
+ { "edward", op_edward, true },
+ { "edward", op_edward, false },
+ { "frank", XML_UNKNOWN_TOKEN, true }, // name not on the master token list.
+ { "frank", XML_UNKNOWN_TOKEN, false }, // name not on the master token list.
+ { "root", XML_UNKNOWN_TOKEN, false }, // name not on the master token list.
+ };
+
+ class handler
+ {
+ const check* mp_head;
+ const check* mp_check;
+ public:
+ handler(const check* p) : mp_head(p), mp_check(p) {}
+
+ void start_element(const orcus::xml_token_element_t& elem)
+ {
+ assert(std::string_view(mp_check->raw_name) == elem.raw_name);
+ assert(mp_check->token == elem.name);
+ assert(mp_check->start_element);
+ ++mp_check;
+ }
+
+ void end_element(const orcus::xml_token_element_t& elem)
+ {
+ assert(std::string_view(mp_check->raw_name) == elem.raw_name);
+ assert(mp_check->token == elem.name);
+ assert(!mp_check->start_element);
+ ++mp_check;
+ }
+
+ void characters(std::string_view /*val*/, bool /*transient*/) {}
+
+ size_t get_token_count() const
+ {
+ return std::distance(mp_head, mp_check);
+ }
+ };
+
+ handler hdl(checks);
+ threaded_sax_token_parser<handler> parser(content, content_size, token_map, ns_cxt, hdl, 1, 100);
+ parser.parse();
+
+ assert(hdl.get_token_count() == std::size(checks));
+ }
+
+ {
+ // This content intentially contains invalid XML part at offset 28.
+ const char* content = "<?xml version=\"1.0\"?><root><<andy/><bruce/><charlie/><david/><edward/><frank/></root>";
+ size_t content_size = strlen(content);
+
+ class handler
+ {
+ public:
+ handler() {}
+
+ void start_element(const orcus::xml_token_element_t& /*elem*/) {}
+
+ void end_element(const orcus::xml_token_element_t& /*elem*/) {}
+
+ void characters(std::string_view /*val*/, bool /*transient*/) {}
+ };
+
+ try
+ {
+ handler hdl;
+ threaded_sax_token_parser<handler> parser(content, content_size, token_map, ns_cxt, hdl, 1, 100);
+ parser.parse();
+ assert(!"An exception was expected, but one was not thrown.");
+ }
+ catch (const malformed_xml_error& e)
+ {
+ assert(e.offset() == 28u);
+ }
+ catch (const std::exception&)
+ {
+ assert(!"Wrong exception was thrown!");
+ }
+ }
+
+ {
+ // Test XML content.
+ const char* content = "<?xml version=\"1.0\"?><root><andy/><bruce/><charlie/><david/><edward/><frank/></root>";
+ size_t content_size = strlen(content);
+
+ class mock_exception : public std::exception {};
+
+ class handler
+ {
+ public:
+ handler() {}
+
+ void start_element(const orcus::xml_token_element_t& /*elem*/) {}
+
+ void end_element(const orcus::xml_token_element_t& /*elem*/)
+ {
+ throw mock_exception();
+ }
+
+ void characters(std::string_view /*val*/, bool /*transient*/) {}
+ };
+
+ handler hdl;
+ threaded_sax_token_parser<handler> parser(content, content_size, token_map, ns_cxt, hdl, 1, 100);
+
+ try
+ {
+ parser.parse();
+ assert(!"A mock exception was expected but not thrown.");
+ }
+ catch (const mock_exception&)
+ {
+ // expected.
+ }
+ }
+}
+
+int main()
+{
+ test_sax_token_parser_1();
+ return EXIT_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/tokens.cpp b/src/parser/tokens.cpp
new file mode 100644
index 0000000..5d3c533
--- /dev/null
+++ b/src/parser/tokens.cpp
@@ -0,0 +1,44 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/tokens.hpp>
+
+namespace orcus {
+
+tokens::tokens(const char** token_names, size_t token_name_count) :
+ m_token_names(token_names),
+ m_token_name_count(token_name_count)
+{
+ for (size_t i = 0; i < m_token_name_count; ++i)
+ m_tokens.emplace(m_token_names[i], xml_token_t(i));
+}
+
+tokens::~tokens() = default;
+
+bool tokens::is_valid_token(xml_token_t token) const
+{
+ return token != XML_UNKNOWN_TOKEN;
+}
+
+xml_token_t tokens::get_token(std::string_view name) const
+{
+ token_map_type::const_iterator itr = m_tokens.find(name);
+ if (itr == m_tokens.end())
+ return XML_UNKNOWN_TOKEN;
+ return itr->second;
+}
+
+std::string_view tokens::get_token_name(xml_token_t token) const
+{
+ if (size_t(token) >= m_token_name_count)
+ return "";
+
+ return m_token_names[token];
+}
+
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/types.cpp b/src/parser/types.cpp
new file mode 100644
index 0000000..5d469c5
--- /dev/null
+++ b/src/parser/types.cpp
@@ -0,0 +1,1454 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/types.hpp>
+#include <orcus/parser_global.hpp>
+#include <orcus/xml_namespace.hpp>
+
+#include <limits>
+#include <sstream>
+#include <string_view>
+#include <iomanip>
+#include <mdds/sorted_string_map.hpp>
+
+#include "ostream_utils.hpp"
+
+namespace orcus {
+
+parse_error_value_t::parse_error_value_t() :
+ offset(0)
+{
+}
+
+parse_error_value_t::parse_error_value_t(const parse_error_value_t& other) = default;
+
+parse_error_value_t::parse_error_value_t(std::string_view _str, std::ptrdiff_t _offset) :
+ str(_str), offset(_offset)
+{
+}
+
+parse_error_value_t& parse_error_value_t::operator=(const parse_error_value_t& other) = default;
+
+bool parse_error_value_t::operator==(const parse_error_value_t& other) const
+{
+ return str == other.str && offset == other.offset;
+}
+
+bool parse_error_value_t::operator!=(const parse_error_value_t& other) const
+{
+ return !operator==(other);
+}
+
+xml_name_t::xml_name_t() noexcept : ns(XMLNS_UNKNOWN_ID), name() {}
+xml_name_t::xml_name_t(xmlns_id_t _ns, std::string_view _name) : ns(_ns), name(_name) {}
+xml_name_t::xml_name_t(const xml_name_t& other) = default;
+
+xml_name_t& xml_name_t::operator= (const xml_name_t& other) = default;
+
+bool xml_name_t::operator== (const xml_name_t& other) const noexcept
+{
+ return ns == other.ns && name == other.name;
+}
+
+bool xml_name_t::operator!= (const xml_name_t& other) const noexcept
+{
+ return !operator==(other);
+}
+
+std::string xml_name_t::to_string(const xmlns_context& cxt, to_string_type type) const
+{
+ std::ostringstream os;
+
+ if (ns)
+ {
+ std::string_view ns_str;
+ switch (type)
+ {
+ case use_alias:
+ ns_str = cxt.get_alias(ns);
+ break;
+ case use_short_name:
+ ns_str = cxt.get_short_name(ns);
+ break;
+
+ }
+ if (!ns_str.empty())
+ os << ns_str << ':';
+ }
+ os << name;
+
+ return os.str();
+}
+
+std::string xml_name_t::to_string(const xmlns_repository& repo) const
+{
+ std::ostringstream os;
+
+ if (ns)
+ {
+ std::string ns_str = repo.get_short_name(ns);
+ if (!ns_str.empty())
+ os << ns_str << ':';
+ }
+ os << name;
+
+ return os.str();
+}
+
+xml_token_attr_t::xml_token_attr_t() :
+ ns(XMLNS_UNKNOWN_ID), name(XML_UNKNOWN_TOKEN), transient(false) {}
+
+xml_token_attr_t::xml_token_attr_t(const xml_token_attr_t& other) = default;
+
+xml_token_attr_t::xml_token_attr_t(
+ xmlns_id_t _ns, xml_token_t _name, std::string_view _value, bool _transient) :
+ ns(_ns), name(_name), value(_value), transient(_transient) {}
+
+xml_token_attr_t::xml_token_attr_t(
+ xmlns_id_t _ns, xml_token_t _name, std::string_view _raw_name, std::string_view _value, bool _transient) :
+ ns(_ns), name(_name), raw_name(_raw_name), value(_value), transient(_transient) {}
+
+xml_token_attr_t& xml_token_attr_t::operator=(const xml_token_attr_t& other) = default;
+
+xml_token_element_t::xml_token_element_t() : ns(nullptr), name(XML_UNKNOWN_TOKEN) {}
+
+xml_token_element_t::xml_token_element_t(
+ xmlns_id_t _ns, xml_token_t _name, std::string_view _raw_name, std::vector<xml_token_attr_t>&& _attrs) :
+ ns(_ns), name(_name), raw_name(_raw_name), attrs(std::move(_attrs)) {}
+
+xml_token_element_t::xml_token_element_t(const xml_token_element_t& other) :
+ ns(other.ns), name(other.name), raw_name(other.raw_name), attrs(other.attrs) {}
+
+xml_token_element_t::xml_token_element_t(xml_token_element_t&& other) :
+ ns(other.ns), name(other.name), raw_name(other.raw_name), attrs(std::move(other.attrs)) {}
+
+xml_declaration_t::xml_declaration_t() :
+ version_major(1),
+ version_minor(0),
+ encoding(character_set_t::unspecified),
+ standalone(false) {}
+
+xml_declaration_t::xml_declaration_t(uint8_t _version_major, uint8_t _version_minor, character_set_t _encoding, bool _standalone) :
+ version_major(_version_major), version_minor(_version_minor), encoding(_encoding), standalone(_standalone) {}
+
+xml_declaration_t::xml_declaration_t(const xml_declaration_t& other) :
+ version_major(other.version_major),
+ version_minor(other.version_minor),
+ encoding(other.encoding),
+ standalone(other.standalone) {}
+
+xml_declaration_t::~xml_declaration_t() {}
+
+xml_declaration_t& xml_declaration_t::operator= (const xml_declaration_t& other)
+{
+ version_major = other.version_major;
+ version_minor = other.version_minor;
+ encoding = other.encoding;
+ standalone = other.standalone;
+ return *this;
+}
+
+bool xml_declaration_t::operator== (const xml_declaration_t& other) const
+{
+ return version_major == other.version_major && version_minor == other.version_minor &&
+ encoding == other.encoding && standalone == other.standalone;
+}
+
+bool xml_declaration_t::operator!= (const xml_declaration_t& other) const
+{
+ return !operator== (other);
+}
+
+length_t::length_t() : unit(length_unit_t::unknown), value(0.0) {}
+
+length_t::length_t(length_unit_t _unit, double _value) : unit(_unit), value(_value) {}
+
+length_t::length_t(const length_t& other) = default;
+
+length_t& length_t::operator= (const length_t& other) = default;
+
+std::string length_t::to_string() const
+{
+ std::ostringstream os;
+ os << value;
+
+ switch (unit)
+ {
+ case length_unit_t::centimeter:
+ os << " cm";
+ break;
+ case length_unit_t::inch:
+ os << " in";
+ break;
+ case length_unit_t::point:
+ os << " pt";
+ break;
+ case length_unit_t::twip:
+ os << " twip";
+ break;
+ case length_unit_t::unknown:
+ default:
+ ;
+ }
+
+ return os.str();
+}
+
+bool length_t::operator== (const length_t& other) const noexcept
+{
+ return value == other.value && unit == other.unit;
+}
+
+bool length_t::operator!= (const length_t& other) const noexcept
+{
+ return !operator== (other);
+}
+
+date_time_t::date_time_t() :
+ year(0), month(0), day(0), hour(0), minute(0), second(0.0) {}
+
+date_time_t::date_time_t(int _year, int _month, int _day) :
+ year(_year), month(_month), day(_day), hour(0), minute(0), second(0.0) {}
+
+date_time_t::date_time_t(int _year, int _month, int _day, int _hour, int _minute, double _second) :
+ year(_year), month(_month), day(_day), hour(_hour), minute(_minute), second(_second) {}
+
+date_time_t::date_time_t(const date_time_t& other) = default;
+date_time_t::~date_time_t() = default;
+
+date_time_t& date_time_t::operator= (date_time_t other)
+{
+ swap(other);
+ return *this;
+}
+
+void date_time_t::swap(date_time_t& other)
+{
+ std::swap(year, other.year);
+ std::swap(month, other.month);
+ std::swap(day, other.day);
+ std::swap(hour, other.hour);
+ std::swap(minute, other.minute);
+ std::swap(second, other.second);
+}
+
+date_time_t date_time_t::from_chars(std::string_view str)
+{
+ auto flush_int = [](int& store, const char*& digit, size_t& digit_len)
+ {
+ long v;
+ parse_integer(digit, digit + digit_len, v);
+ store = v;
+
+ digit = nullptr;
+ digit_len = 0;
+ };
+
+ auto process_char = [](const char* p, const char*& digit, size_t& digit_len)
+ {
+ if (!digit)
+ {
+ digit = p;
+ digit_len = 1;
+ return;
+ }
+
+ ++digit_len;
+ };
+
+ date_time_t ret;
+ int dash_count = 0, t_count = 0, colon_count = 0;
+
+ const char* p = str.data();
+ const char* p_end = p + str.size();
+ const char* digit = p;
+ size_t digit_len = 0;
+
+ bool valid = true;
+ for (; p != p_end && valid; ++p)
+ {
+ switch (*p)
+ {
+ case '-':
+ {
+ if (t_count || colon_count || !digit)
+ {
+ // Invalid date-time value. All dashes must occur before
+ // any of 'T' and ':' occur.
+ valid = false;
+ break;
+ }
+
+ switch (dash_count)
+ {
+ case 0:
+ // Flush year.
+ flush_int(ret.year, digit, digit_len);
+ break;
+ case 1:
+ // Flush month.
+ flush_int(ret.month, digit, digit_len);
+ break;
+ default:
+ valid = false;
+ }
+ ++dash_count;
+ }
+ break;
+ case 'T':
+ {
+ if (t_count || dash_count != 2 || !digit)
+ {
+ // Invalid date-time value.
+ valid = false;
+ break;
+ }
+
+ // Flush day.
+ flush_int(ret.day, digit, digit_len);
+ ++t_count;
+ }
+ break;
+ case ':':
+ {
+ if (!t_count || !digit)
+ {
+ // Invalid date-time value.
+ valid = false;
+ break;
+ }
+
+ switch (colon_count)
+ {
+ case 0:
+ // Flush hour.
+ flush_int(ret.hour, digit, digit_len);
+ break;
+ case 1:
+ // Flush minute.
+ flush_int(ret.minute, digit, digit_len);
+ break;
+ default:
+ valid = false;
+ }
+
+ ++colon_count;
+ }
+ break;
+ default:
+ {
+ if (t_count)
+ {
+ // Time element.
+ switch (colon_count)
+ {
+ case 0:
+ // Hour
+ process_char(p, digit, digit_len);
+ break;
+ case 1:
+ // Minute
+ process_char(p, digit, digit_len);
+ break;
+ case 2:
+ // Second
+ process_char(p, digit, digit_len);
+ break;
+ default:
+ valid = false;
+ }
+ }
+ else
+ {
+ // Date element.
+ switch (dash_count)
+ {
+ case 0:
+ // Year
+ process_char(p, digit, digit_len);
+ break;
+ case 1:
+ // Month
+ process_char(p, digit, digit_len);
+ break;
+ case 2:
+ // Day
+ process_char(p, digit, digit_len);
+ break;
+ default:
+ valid = false;
+ }
+ }
+ }
+ }
+
+ }
+
+ if (!valid || !digit)
+ return ret;
+
+ if (t_count)
+ {
+ // Flush second.
+ ret.second = strtod(digit, nullptr);
+ }
+ else
+ {
+ // Flush day.
+ flush_int(ret.day, digit, digit_len);
+ }
+
+ return ret;
+}
+
+bool date_time_t::operator== (const date_time_t& other) const
+{
+ return year == other.year && month == other.month && day == other.day &&
+ hour == other.hour && minute == other.minute && second == other.second;
+}
+
+bool date_time_t::operator!= (const date_time_t& other) const
+{
+ return !operator== (other);
+}
+
+bool date_time_t::operator< (const date_time_t& other) const
+{
+ if (year != other.year)
+ return year < other.year;
+
+ if (month != other.month)
+ return month < other.month;
+
+ if (day != other.day)
+ return day < other.day;
+
+ if (hour != other.hour)
+ return hour < other.hour;
+
+ if (minute != other.minute)
+ return minute < other.minute;
+
+ return second < other.second;
+}
+
+std::string date_time_t::to_string() const
+{
+ std::ostringstream os;
+
+ // NB: setfill is sticky for the entire run whereas setw gets reset for each
+ // value.
+ os << std::setfill('0');
+
+ os << std::setw(4) << year
+ << "-" << std::setw(2) << month
+ << "-" << std::setw(2) << day
+ << "T" << std::setw(2) << hour
+ << ":" << std::setw(2) << minute
+ << ":" << std::setw(2) << second;
+
+ return os.str();
+}
+
+namespace {
+
+namespace dump_format {
+
+using map_type = mdds::sorted_string_map<dump_format_t, mdds::string_view_map_entry>;
+
+// Keys must be sorted.
+constexpr map_type::entry entries[] = {
+ { "check", dump_format_t::check },
+ { "csv", dump_format_t::csv },
+ { "debug-state", dump_format_t::debug_state },
+ { "flat", dump_format_t::flat },
+ { "html", dump_format_t::html },
+ { "json", dump_format_t::json },
+ { "none", dump_format_t::none },
+ { "xml", dump_format_t::xml },
+ { "yaml", dump_format_t::yaml },
+};
+
+const map_type& get()
+{
+ static map_type mt(entries, std::size(entries), dump_format_t::unknown);
+ return mt;
+}
+
+} // namespace dump_format
+
+namespace charset {
+
+using map_type = mdds::sorted_string_map<character_set_t, mdds::string_view_map_entry>;
+
+// Keys must be sorted.
+constexpr map_type::entry entries[] = {
+ { "437", character_set_t::ibm437 },
+ { "850", character_set_t::ibm850 },
+ { "851", character_set_t::ibm851 },
+ { "852", character_set_t::ibm852 },
+ { "855", character_set_t::ibm855 },
+ { "857", character_set_t::ibm857 },
+ { "860", character_set_t::ibm860 },
+ { "861", character_set_t::ibm861 },
+ { "862", character_set_t::ibm862 },
+ { "863", character_set_t::ibm863 },
+ { "865", character_set_t::ibm865 },
+ { "866", character_set_t::ibm866 },
+ { "869", character_set_t::ibm869 },
+ { "904", character_set_t::ibm904 },
+ { "adobe-standard-encoding", character_set_t::adobe_standard_encoding },
+ { "adobe-symbol-encoding", character_set_t::adobe_symbol_encoding },
+ { "ami-1251", character_set_t::amiga_1251 },
+ { "ami1251", character_set_t::amiga_1251 },
+ { "amiga-1251", character_set_t::amiga_1251 },
+ { "amiga1251", character_set_t::amiga_1251 },
+ { "ansi_x3.110-1983", character_set_t::ansi_x3_110_1983 },
+ { "ansi_x3.4-1968", character_set_t::us_ascii },
+ { "ansi_x3.4-1986", character_set_t::us_ascii },
+ { "arabic", character_set_t::iso_8859_6 },
+ { "arabic7", character_set_t::asmo_449 },
+ { "asmo-708", character_set_t::iso_8859_6 },
+ { "asmo_449", character_set_t::asmo_449 },
+ { "big5", character_set_t::big5 },
+ { "big5-hkscs", character_set_t::big5_hkscs },
+ { "bocu-1", character_set_t::bocu_1 },
+ { "brf", character_set_t::brf },
+ { "bs_4730", character_set_t::bs_4730 },
+ { "bs_viewdata", character_set_t::bs_viewdata },
+ { "ca", character_set_t::csa_z243_4_1985_1 },
+ { "ccsid00858", character_set_t::ibm00858 },
+ { "ccsid00924", character_set_t::ibm00924 },
+ { "ccsid01140", character_set_t::ibm01140 },
+ { "ccsid01141", character_set_t::ibm01141 },
+ { "ccsid01142", character_set_t::ibm01142 },
+ { "ccsid01143", character_set_t::ibm01143 },
+ { "ccsid01144", character_set_t::ibm01144 },
+ { "ccsid01145", character_set_t::ibm01145 },
+ { "ccsid01146", character_set_t::ibm01146 },
+ { "ccsid01147", character_set_t::ibm01147 },
+ { "ccsid01148", character_set_t::ibm01148 },
+ { "ccsid01149", character_set_t::ibm01149 },
+ { "cesu-8", character_set_t::cesu_8 },
+ { "chinese", character_set_t::gb_2312_80 },
+ { "cn", character_set_t::gb_1988_80 },
+ { "cp-ar", character_set_t::ibm868 },
+ { "cp-gr", character_set_t::ibm869 },
+ { "cp-is", character_set_t::ibm861 },
+ { "cp00858", character_set_t::ibm00858 },
+ { "cp00924", character_set_t::ibm00924 },
+ { "cp01140", character_set_t::ibm01140 },
+ { "cp01141", character_set_t::ibm01141 },
+ { "cp01142", character_set_t::ibm01142 },
+ { "cp01143", character_set_t::ibm01143 },
+ { "cp01144", character_set_t::ibm01144 },
+ { "cp01145", character_set_t::ibm01145 },
+ { "cp01146", character_set_t::ibm01146 },
+ { "cp01147", character_set_t::ibm01147 },
+ { "cp01148", character_set_t::ibm01148 },
+ { "cp01149", character_set_t::ibm01149 },
+ { "cp037", character_set_t::ibm037 },
+ { "cp038", character_set_t::ibm038 },
+ { "cp1026", character_set_t::ibm1026 },
+ { "cp154", character_set_t::ptcp154 },
+ { "cp273", character_set_t::ibm273 },
+ { "cp274", character_set_t::ibm274 },
+ { "cp275", character_set_t::ibm275 },
+ { "cp278", character_set_t::ibm278 },
+ { "cp280", character_set_t::ibm280 },
+ { "cp281", character_set_t::ibm281 },
+ { "cp284", character_set_t::ibm284 },
+ { "cp285", character_set_t::ibm285 },
+ { "cp290", character_set_t::ibm290 },
+ { "cp297", character_set_t::ibm297 },
+ { "cp367", character_set_t::us_ascii },
+ { "cp420", character_set_t::ibm420 },
+ { "cp423", character_set_t::ibm423 },
+ { "cp424", character_set_t::ibm424 },
+ { "cp437", character_set_t::ibm437 },
+ { "cp500", character_set_t::ibm500 },
+ { "cp50220", character_set_t::cp50220 },
+ { "cp51932", character_set_t::cp51932 },
+ { "cp775", character_set_t::ibm775 },
+ { "cp819", character_set_t::iso_8859_1 },
+ { "cp850", character_set_t::ibm850 },
+ { "cp851", character_set_t::ibm851 },
+ { "cp852", character_set_t::ibm852 },
+ { "cp855", character_set_t::ibm855 },
+ { "cp857", character_set_t::ibm857 },
+ { "cp860", character_set_t::ibm860 },
+ { "cp861", character_set_t::ibm861 },
+ { "cp862", character_set_t::ibm862 },
+ { "cp863", character_set_t::ibm863 },
+ { "cp864", character_set_t::ibm864 },
+ { "cp865", character_set_t::ibm865 },
+ { "cp866", character_set_t::ibm866 },
+ { "cp868", character_set_t::ibm868 },
+ { "cp869", character_set_t::ibm869 },
+ { "cp870", character_set_t::ibm870 },
+ { "cp871", character_set_t::ibm871 },
+ { "cp880", character_set_t::ibm880 },
+ { "cp891", character_set_t::ibm891 },
+ { "cp903", character_set_t::ibm903 },
+ { "cp904", character_set_t::ibm904 },
+ { "cp905", character_set_t::ibm905 },
+ { "cp918", character_set_t::ibm918 },
+ { "cp936", character_set_t::gbk },
+ { "csa7-1", character_set_t::csa_z243_4_1985_1 },
+ { "csa7-2", character_set_t::csa_z243_4_1985_2 },
+ { "csa71", character_set_t::csa_z243_4_1985_1 },
+ { "csa72", character_set_t::csa_z243_4_1985_2 },
+ { "csa_t500-1983", character_set_t::ansi_x3_110_1983 },
+ { "csa_z243.4-1985-1", character_set_t::csa_z243_4_1985_1 },
+ { "csa_z243.4-1985-2", character_set_t::csa_z243_4_1985_2 },
+ { "csa_z243.4-1985-gr", character_set_t::csa_z243_4_1985_gr },
+ { "csadobestandardencoding", character_set_t::adobe_standard_encoding },
+ { "csascii", character_set_t::us_ascii },
+ { "csbig5", character_set_t::big5 },
+ { "csbig5hkscs", character_set_t::big5_hkscs },
+ { "csbocu-1", character_set_t::bocu_1 },
+ { "csbocu1", character_set_t::bocu_1 },
+ { "csbrf", character_set_t::brf },
+ { "cscesu-8", character_set_t::cesu_8 },
+ { "cscesu8", character_set_t::cesu_8 },
+ { "cscp50220", character_set_t::cp50220 },
+ { "cscp51932", character_set_t::cp51932 },
+ { "csdecmcs", character_set_t::dec_mcs },
+ { "csdkus", character_set_t::dk_us },
+ { "csebcdicatdea", character_set_t::ebcdic_at_de_a },
+ { "csebcdiccafr", character_set_t::ebcdic_ca_fr },
+ { "csebcdicdkno", character_set_t::ebcdic_dk_no },
+ { "csebcdicdknoa", character_set_t::ebcdic_dk_no_a },
+ { "csebcdices", character_set_t::ebcdic_es },
+ { "csebcdicesa", character_set_t::ebcdic_es_a },
+ { "csebcdicess", character_set_t::ebcdic_es_s },
+ { "csebcdicfise", character_set_t::ebcdic_fi_se },
+ { "csebcdicfisea", character_set_t::ebcdic_fi_se_a },
+ { "csebcdicfr", character_set_t::ebcdic_fr },
+ { "csebcdicit", character_set_t::ebcdic_it },
+ { "csebcdicpt", character_set_t::ebcdic_pt },
+ { "csebcdicuk", character_set_t::ebcdic_uk },
+ { "csebcdicus", character_set_t::ebcdic_us },
+ { "cseucfixwidjapanese", character_set_t::extended_unix_code_fixed_width_for_japanese },
+ { "cseuckr", character_set_t::euc_kr },
+ { "cseucpkdfmtjapanese", character_set_t::euc_jp },
+ { "csgb18030", character_set_t::gb18030 },
+ { "csgb2312", character_set_t::gb2312 },
+ { "csgbk", character_set_t::gbk },
+ { "cshalfwidthkatakana", character_set_t::jis_x0201 },
+ { "cshpdesktop", character_set_t::hp_desktop },
+ { "cshplegal", character_set_t::hp_legal },
+ { "cshpmath8", character_set_t::hp_math8 },
+ { "cshppifont", character_set_t::hp_pi_font },
+ { "cshppsmath", character_set_t::adobe_symbol_encoding },
+ { "cshproman8", character_set_t::hp_roman8 },
+ { "csibbm904", character_set_t::ibm904 },
+ { "csibm00858", character_set_t::ibm00858 },
+ { "csibm00924", character_set_t::ibm00924 },
+ { "csibm01140", character_set_t::ibm01140 },
+ { "csibm01141", character_set_t::ibm01141 },
+ { "csibm01142", character_set_t::ibm01142 },
+ { "csibm01143", character_set_t::ibm01143 },
+ { "csibm01144", character_set_t::ibm01144 },
+ { "csibm01145", character_set_t::ibm01145 },
+ { "csibm01146", character_set_t::ibm01146 },
+ { "csibm01147", character_set_t::ibm01147 },
+ { "csibm01148", character_set_t::ibm01148 },
+ { "csibm01149", character_set_t::ibm01149 },
+ { "csibm037", character_set_t::ibm037 },
+ { "csibm038", character_set_t::ibm038 },
+ { "csibm1026", character_set_t::ibm1026 },
+ { "csibm1047", character_set_t::ibm1047 },
+ { "csibm273", character_set_t::ibm273 },
+ { "csibm274", character_set_t::ibm274 },
+ { "csibm275", character_set_t::ibm275 },
+ { "csibm277", character_set_t::ibm277 },
+ { "csibm278", character_set_t::ibm278 },
+ { "csibm280", character_set_t::ibm280 },
+ { "csibm281", character_set_t::ibm281 },
+ { "csibm284", character_set_t::ibm284 },
+ { "csibm285", character_set_t::ibm285 },
+ { "csibm290", character_set_t::ibm290 },
+ { "csibm297", character_set_t::ibm297 },
+ { "csibm420", character_set_t::ibm420 },
+ { "csibm423", character_set_t::ibm423 },
+ { "csibm424", character_set_t::ibm424 },
+ { "csibm500", character_set_t::ibm500 },
+ { "csibm851", character_set_t::ibm851 },
+ { "csibm855", character_set_t::ibm855 },
+ { "csibm857", character_set_t::ibm857 },
+ { "csibm860", character_set_t::ibm860 },
+ { "csibm861", character_set_t::ibm861 },
+ { "csibm863", character_set_t::ibm863 },
+ { "csibm864", character_set_t::ibm864 },
+ { "csibm865", character_set_t::ibm865 },
+ { "csibm866", character_set_t::ibm866 },
+ { "csibm868", character_set_t::ibm868 },
+ { "csibm869", character_set_t::ibm869 },
+ { "csibm870", character_set_t::ibm870 },
+ { "csibm871", character_set_t::ibm871 },
+ { "csibm880", character_set_t::ibm880 },
+ { "csibm891", character_set_t::ibm891 },
+ { "csibm903", character_set_t::ibm903 },
+ { "csibm905", character_set_t::ibm905 },
+ { "csibm918", character_set_t::ibm918 },
+ { "csibmebcdicatde", character_set_t::ebcdic_at_de },
+ { "csibmsymbols", character_set_t::ibm_symbols },
+ { "csibmthai", character_set_t::ibm_thai },
+ { "csinvariant", character_set_t::invariant },
+ { "csiso102t617bit", character_set_t::t_61_7bit },
+ { "csiso10367box", character_set_t::iso_10367_box },
+ { "csiso103t618bit", character_set_t::t_61_8bit },
+ { "csiso10646utf1", character_set_t::iso_10646_utf_1 },
+ { "csiso10swedish", character_set_t::sen_850200_b },
+ { "csiso111ecmacyrillic", character_set_t::ecma_cyrillic },
+ { "csiso115481", character_set_t::iso_11548_1 },
+ { "csiso11swedishfornames", character_set_t::sen_850200_c },
+ { "csiso121canadian1", character_set_t::csa_z243_4_1985_1 },
+ { "csiso122canadian2", character_set_t::csa_z243_4_1985_2 },
+ { "csiso123csaz24341985gr", character_set_t::csa_z243_4_1985_gr },
+ { "csiso128t101g2", character_set_t::t_101_g2 },
+ { "csiso139csn369103", character_set_t::csn_369103 },
+ { "csiso13jisc6220jp", character_set_t::jis_c6220_1969_jp },
+ { "csiso141jusib1002", character_set_t::jus_i_b1_002 },
+ { "csiso143iecp271", character_set_t::iec_p27_1 },
+ { "csiso146serbian", character_set_t::jus_i_b1_003_serb },
+ { "csiso147macedonian", character_set_t::jus_i_b1_003_mac },
+ { "csiso14jisc6220ro", character_set_t::jis_c6220_1969_ro },
+ { "csiso150", character_set_t::greek_ccitt },
+ { "csiso150greekccitt", character_set_t::greek_ccitt },
+ { "csiso151cuba", character_set_t::nc_nc00_10_81 },
+ { "csiso153gost1976874", character_set_t::gost_19768_74 },
+ { "csiso158lap", character_set_t::latin_lap },
+ { "csiso159jisx02121990", character_set_t::jis_x0212_1990 },
+ { "csiso15italian", character_set_t::it },
+ { "csiso16portuguese", character_set_t::pt },
+ { "csiso17spanish", character_set_t::es },
+ { "csiso18greek7old", character_set_t::greek7_old },
+ { "csiso19latingreek", character_set_t::latin_greek },
+ { "csiso2022cn", character_set_t::iso_2022_cn },
+ { "csiso2022cnext", character_set_t::iso_2022_cn_ext },
+ { "csiso2022jp", character_set_t::iso_2022_jp },
+ { "csiso2022jp2", character_set_t::iso_2022_jp_2 },
+ { "csiso2022kr", character_set_t::iso_2022_kr },
+ { "csiso2033", character_set_t::iso_2033_1983 },
+ { "csiso21german", character_set_t::din_66003 },
+ { "csiso25french", character_set_t::nf_z_62_010_1973 },
+ { "csiso27latingreek1", character_set_t::latin_greek_1 },
+ { "csiso2intlrefversion", character_set_t::iso_646_irv_1983 },
+ { "csiso42jisc62261978", character_set_t::jis_c6226_1978 },
+ { "csiso47bsviewdata", character_set_t::bs_viewdata },
+ { "csiso49inis", character_set_t::inis },
+ { "csiso4unitedkingdom", character_set_t::bs_4730 },
+ { "csiso50inis8", character_set_t::inis_8 },
+ { "csiso51iniscyrillic", character_set_t::inis_cyrillic },
+ { "csiso54271981", character_set_t::iso_5427_1981 },
+ { "csiso5427cyrillic", character_set_t::iso_5427 },
+ { "csiso5428greek", character_set_t::iso_5428_1980 },
+ { "csiso57gb1988", character_set_t::gb_1988_80 },
+ { "csiso58gb231280", character_set_t::gb_2312_80 },
+ { "csiso60danishnorwegian", character_set_t::ns_4551_1 },
+ { "csiso60norwegian1", character_set_t::ns_4551_1 },
+ { "csiso61norwegian2", character_set_t::ns_4551_2 },
+ { "csiso646basic1983", character_set_t::iso_646_basic_1983 },
+ { "csiso646danish", character_set_t::ds_2089 },
+ { "csiso6937add", character_set_t::iso_6937_2_25 },
+ { "csiso69french", character_set_t::nf_z_62_010 },
+ { "csiso70videotexsupp1", character_set_t::videotex_suppl },
+ { "csiso84portuguese2", character_set_t::pt2 },
+ { "csiso85spanish2", character_set_t::es2 },
+ { "csiso86hungarian", character_set_t::msz_7795_3 },
+ { "csiso87jisx0208", character_set_t::jis_c6226_1983 },
+ { "csiso885913", character_set_t::iso_8859_13 },
+ { "csiso885914", character_set_t::iso_8859_14 },
+ { "csiso885915", character_set_t::iso_8859_15 },
+ { "csiso885916", character_set_t::iso_8859_16 },
+ { "csiso88596e", character_set_t::iso_8859_6_e },
+ { "csiso88596i", character_set_t::iso_8859_6_i },
+ { "csiso88598e", character_set_t::iso_8859_8_e },
+ { "csiso88598i", character_set_t::iso_8859_8_i },
+ { "csiso8859supp", character_set_t::iso_8859_supp },
+ { "csiso88greek7", character_set_t::greek7 },
+ { "csiso89asmo449", character_set_t::asmo_449 },
+ { "csiso90", character_set_t::iso_ir_90 },
+ { "csiso91jisc62291984a", character_set_t::jis_c6229_1984_a },
+ { "csiso92jisc62991984b", character_set_t::jis_c6229_1984_b },
+ { "csiso93jis62291984badd", character_set_t::jis_c6229_1984_b_add },
+ { "csiso94jis62291984hand", character_set_t::jis_c6229_1984_hand },
+ { "csiso95jis62291984handadd", character_set_t::jis_c6229_1984_hand_add },
+ { "csiso96jisc62291984kana", character_set_t::jis_c6229_1984_kana },
+ { "csiso99naplps", character_set_t::ansi_x3_110_1983 },
+ { "csisolatin1", character_set_t::iso_8859_1 },
+ { "csisolatin2", character_set_t::iso_8859_2 },
+ { "csisolatin3", character_set_t::iso_8859_3 },
+ { "csisolatin4", character_set_t::iso_8859_4 },
+ { "csisolatin5", character_set_t::iso_8859_9 },
+ { "csisolatin6", character_set_t::iso_8859_10 },
+ { "csisolatinarabic", character_set_t::iso_8859_6 },
+ { "csisolatincyrillic", character_set_t::iso_8859_5 },
+ { "csisolatingreek", character_set_t::iso_8859_7 },
+ { "csisolatinhebrew", character_set_t::iso_8859_8 },
+ { "csisotextcomm", character_set_t::iso_6937_2_add },
+ { "csjisencoding", character_set_t::jis_encoding },
+ { "cskoi7switched", character_set_t::koi7_switched },
+ { "cskoi8r", character_set_t::koi8_r },
+ { "cskoi8u", character_set_t::koi8_u },
+ { "csksc56011987", character_set_t::ks_c_5601_1987 },
+ { "csksc5636", character_set_t::ksc5636 },
+ { "cskz1048", character_set_t::kz_1048 },
+ { "csmacintosh", character_set_t::macintosh },
+ { "csmicrosoftpublishing", character_set_t::microsoft_publishing },
+ { "csmnem", character_set_t::mnem },
+ { "csmnemonic", character_set_t::mnemonic },
+ { "csn_369103", character_set_t::csn_369103 },
+ { "csnatsdano", character_set_t::nats_dano },
+ { "csnatsdanoadd", character_set_t::nats_dano_add },
+ { "csnatssefi", character_set_t::nats_sefi },
+ { "csnatssefiadd", character_set_t::nats_sefi_add },
+ { "csosdebcdicdf03irv", character_set_t::osd_ebcdic_df03_irv },
+ { "csosdebcdicdf041", character_set_t::osd_ebcdic_df04_1 },
+ { "csosdebcdicdf0415", character_set_t::osd_ebcdic_df04_15 },
+ { "cspc775baltic", character_set_t::ibm775 },
+ { "cspc850multilingual", character_set_t::ibm850 },
+ { "cspc862latinhebrew", character_set_t::ibm862 },
+ { "cspc8codepage437", character_set_t::ibm437 },
+ { "cspc8danishnorwegian", character_set_t::pc8_danish_norwegian },
+ { "cspc8turkish", character_set_t::pc8_turkish },
+ { "cspcp852", character_set_t::ibm852 },
+ { "csptcp154", character_set_t::ptcp154 },
+ { "csscsu", character_set_t::scsu },
+ { "csshiftjis", character_set_t::shift_jis },
+ { "cstis620", character_set_t::tis_620 },
+ { "cstscii", character_set_t::tscii },
+ { "csucs4", character_set_t::iso_10646_ucs_4 },
+ { "csunicode", character_set_t::iso_10646_ucs_2 },
+ { "csunicode11", character_set_t::unicode_1_1 },
+ { "csunicode11utf7", character_set_t::unicode_1_1_utf_7 },
+ { "csunicodeascii", character_set_t::iso_10646_ucs_basic },
+ { "csunicodeibm1261", character_set_t::iso_unicode_ibm_1261 },
+ { "csunicodeibm1264", character_set_t::iso_unicode_ibm_1264 },
+ { "csunicodeibm1265", character_set_t::iso_unicode_ibm_1265 },
+ { "csunicodeibm1268", character_set_t::iso_unicode_ibm_1268 },
+ { "csunicodeibm1276", character_set_t::iso_unicode_ibm_1276 },
+ { "csunicodejapanese", character_set_t::iso_10646_j_1 },
+ { "csunicodelatin1", character_set_t::iso_10646_unicode_latin1 },
+ { "csunknown8bit", character_set_t::unknown_8bit },
+ { "csusdk", character_set_t::us_dk },
+ { "csutf16", character_set_t::utf_16 },
+ { "csutf16be", character_set_t::utf_16be },
+ { "csutf16le", character_set_t::utf_16le },
+ { "csutf32", character_set_t::utf_32 },
+ { "csutf32be", character_set_t::utf_32be },
+ { "csutf32le", character_set_t::utf_32le },
+ { "csutf7", character_set_t::utf_7 },
+ { "csutf7imap", character_set_t::utf_7_imap },
+ { "csutf8", character_set_t::utf_8 },
+ { "csventurainternational", character_set_t::ventura_international },
+ { "csventuramath", character_set_t::ventura_math },
+ { "csventuraus", character_set_t::ventura_us },
+ { "csviqr", character_set_t::viqr },
+ { "csviscii", character_set_t::viscii },
+ { "cswindows1250", character_set_t::windows_1250 },
+ { "cswindows1251", character_set_t::windows_1251 },
+ { "cswindows1252", character_set_t::windows_1252 },
+ { "cswindows1253", character_set_t::windows_1253 },
+ { "cswindows1254", character_set_t::windows_1254 },
+ { "cswindows1255", character_set_t::windows_1255 },
+ { "cswindows1256", character_set_t::windows_1256 },
+ { "cswindows1257", character_set_t::windows_1257 },
+ { "cswindows1258", character_set_t::windows_1258 },
+ { "cswindows30latin1", character_set_t::iso_8859_1_windows_3_0_latin_1 },
+ { "cswindows31j", character_set_t::windows_31j },
+ { "cswindows31latin1", character_set_t::iso_8859_1_windows_3_1_latin_1 },
+ { "cswindows31latin2", character_set_t::iso_8859_2_windows_latin_2 },
+ { "cswindows31latin5", character_set_t::iso_8859_9_windows_latin_5 },
+ { "cswindows874", character_set_t::windows_874 },
+ { "cuba", character_set_t::nc_nc00_10_81 },
+ { "cyrillic", character_set_t::iso_8859_5 },
+ { "cyrillic-asian", character_set_t::ptcp154 },
+ { "de", character_set_t::din_66003 },
+ { "dec", character_set_t::dec_mcs },
+ { "dec-mcs", character_set_t::dec_mcs },
+ { "din_66003", character_set_t::din_66003 },
+ { "dk", character_set_t::ds_2089 },
+ { "dk-us", character_set_t::dk_us },
+ { "ds2089", character_set_t::ds_2089 },
+ { "ds_2089", character_set_t::ds_2089 },
+ { "e13b", character_set_t::iso_2033_1983 },
+ { "ebcdic-at-de", character_set_t::ebcdic_at_de },
+ { "ebcdic-at-de-a", character_set_t::ebcdic_at_de_a },
+ { "ebcdic-be", character_set_t::ibm274 },
+ { "ebcdic-br", character_set_t::ibm275 },
+ { "ebcdic-ca-fr", character_set_t::ebcdic_ca_fr },
+ { "ebcdic-cp-ar1", character_set_t::ibm420 },
+ { "ebcdic-cp-ar2", character_set_t::ibm918 },
+ { "ebcdic-cp-be", character_set_t::ibm500 },
+ { "ebcdic-cp-ca", character_set_t::ibm037 },
+ { "ebcdic-cp-ch", character_set_t::ibm500 },
+ { "ebcdic-cp-dk", character_set_t::ibm277 },
+ { "ebcdic-cp-es", character_set_t::ibm284 },
+ { "ebcdic-cp-fi", character_set_t::ibm278 },
+ { "ebcdic-cp-fr", character_set_t::ibm297 },
+ { "ebcdic-cp-gb", character_set_t::ibm285 },
+ { "ebcdic-cp-gr", character_set_t::ibm423 },
+ { "ebcdic-cp-he", character_set_t::ibm424 },
+ { "ebcdic-cp-is", character_set_t::ibm871 },
+ { "ebcdic-cp-it", character_set_t::ibm280 },
+ { "ebcdic-cp-nl", character_set_t::ibm037 },
+ { "ebcdic-cp-no", character_set_t::ibm277 },
+ { "ebcdic-cp-roece", character_set_t::ibm870 },
+ { "ebcdic-cp-se", character_set_t::ibm278 },
+ { "ebcdic-cp-tr", character_set_t::ibm905 },
+ { "ebcdic-cp-us", character_set_t::ibm037 },
+ { "ebcdic-cp-wt", character_set_t::ibm037 },
+ { "ebcdic-cp-yu", character_set_t::ibm870 },
+ { "ebcdic-cyrillic", character_set_t::ibm880 },
+ { "ebcdic-de-273+euro", character_set_t::ibm01141 },
+ { "ebcdic-dk-277+euro", character_set_t::ibm01142 },
+ { "ebcdic-dk-no", character_set_t::ebcdic_dk_no },
+ { "ebcdic-dk-no-a", character_set_t::ebcdic_dk_no_a },
+ { "ebcdic-es", character_set_t::ebcdic_es },
+ { "ebcdic-es-284+euro", character_set_t::ibm01145 },
+ { "ebcdic-es-a", character_set_t::ebcdic_es_a },
+ { "ebcdic-es-s", character_set_t::ebcdic_es_s },
+ { "ebcdic-fi-278+euro", character_set_t::ibm01143 },
+ { "ebcdic-fi-se", character_set_t::ebcdic_fi_se },
+ { "ebcdic-fi-se-a", character_set_t::ebcdic_fi_se_a },
+ { "ebcdic-fr", character_set_t::ebcdic_fr },
+ { "ebcdic-fr-297+euro", character_set_t::ibm01147 },
+ { "ebcdic-gb-285+euro", character_set_t::ibm01146 },
+ { "ebcdic-int", character_set_t::ibm038 },
+ { "ebcdic-international-500+euro", character_set_t::ibm01148 },
+ { "ebcdic-is-871+euro", character_set_t::ibm01149 },
+ { "ebcdic-it", character_set_t::ebcdic_it },
+ { "ebcdic-it-280+euro", character_set_t::ibm01144 },
+ { "ebcdic-jp-e", character_set_t::ibm281 },
+ { "ebcdic-jp-kana", character_set_t::ibm290 },
+ { "ebcdic-latin9--euro", character_set_t::ibm00924 },
+ { "ebcdic-no-277+euro", character_set_t::ibm01142 },
+ { "ebcdic-pt", character_set_t::ebcdic_pt },
+ { "ebcdic-se-278+euro", character_set_t::ibm01143 },
+ { "ebcdic-uk", character_set_t::ebcdic_uk },
+ { "ebcdic-us", character_set_t::ebcdic_us },
+ { "ebcdic-us-37+euro", character_set_t::ibm01140 },
+ { "ecma-114", character_set_t::iso_8859_6 },
+ { "ecma-118", character_set_t::iso_8859_7 },
+ { "ecma-cyrillic", character_set_t::ecma_cyrillic },
+ { "elot_928", character_set_t::iso_8859_7 },
+ { "es", character_set_t::es },
+ { "es2", character_set_t::es2 },
+ { "euc-jp", character_set_t::euc_jp },
+ { "euc-kr", character_set_t::euc_kr },
+ { "extended_unix_code_fixed_width_for_japanese", character_set_t::extended_unix_code_fixed_width_for_japanese },
+ { "extended_unix_code_packed_format_for_japanese", character_set_t::euc_jp },
+ { "fi", character_set_t::sen_850200_b },
+ { "fr", character_set_t::nf_z_62_010 },
+ { "gb", character_set_t::bs_4730 },
+ { "gb18030", character_set_t::gb18030 },
+ { "gb2312", character_set_t::gb2312 },
+ { "gb_1988-80", character_set_t::gb_1988_80 },
+ { "gb_2312-80", character_set_t::gb_2312_80 },
+ { "gbk", character_set_t::gbk },
+ { "gost_19768-74", character_set_t::gost_19768_74 },
+ { "greek", character_set_t::iso_8859_7 },
+ { "greek-ccitt", character_set_t::greek_ccitt },
+ { "greek7", character_set_t::greek7 },
+ { "greek7-old", character_set_t::greek7_old },
+ { "greek8", character_set_t::iso_8859_7 },
+ { "hebrew", character_set_t::iso_8859_8 },
+ { "hp-desktop", character_set_t::hp_desktop },
+ { "hp-legal", character_set_t::hp_legal },
+ { "hp-math8", character_set_t::hp_math8 },
+ { "hp-pi-font", character_set_t::hp_pi_font },
+ { "hp-roman8", character_set_t::hp_roman8 },
+ { "hu", character_set_t::msz_7795_3 },
+ { "hz-gb-2312", character_set_t::hz_gb_2312 },
+ { "ibm-1047", character_set_t::ibm1047 },
+ { "ibm-symbols", character_set_t::ibm_symbols },
+ { "ibm-thai", character_set_t::ibm_thai },
+ { "ibm00858", character_set_t::ibm00858 },
+ { "ibm00924", character_set_t::ibm00924 },
+ { "ibm01140", character_set_t::ibm01140 },
+ { "ibm01141", character_set_t::ibm01141 },
+ { "ibm01142", character_set_t::ibm01142 },
+ { "ibm01143", character_set_t::ibm01143 },
+ { "ibm01144", character_set_t::ibm01144 },
+ { "ibm01145", character_set_t::ibm01145 },
+ { "ibm01146", character_set_t::ibm01146 },
+ { "ibm01147", character_set_t::ibm01147 },
+ { "ibm01148", character_set_t::ibm01148 },
+ { "ibm01149", character_set_t::ibm01149 },
+ { "ibm037", character_set_t::ibm037 },
+ { "ibm038", character_set_t::ibm038 },
+ { "ibm1026", character_set_t::ibm1026 },
+ { "ibm1047", character_set_t::ibm1047 },
+ { "ibm273", character_set_t::ibm273 },
+ { "ibm274", character_set_t::ibm274 },
+ { "ibm275", character_set_t::ibm275 },
+ { "ibm277", character_set_t::ibm277 },
+ { "ibm278", character_set_t::ibm278 },
+ { "ibm280", character_set_t::ibm280 },
+ { "ibm281", character_set_t::ibm281 },
+ { "ibm284", character_set_t::ibm284 },
+ { "ibm285", character_set_t::ibm285 },
+ { "ibm290", character_set_t::ibm290 },
+ { "ibm297", character_set_t::ibm297 },
+ { "ibm367", character_set_t::us_ascii },
+ { "ibm420", character_set_t::ibm420 },
+ { "ibm423", character_set_t::ibm423 },
+ { "ibm424", character_set_t::ibm424 },
+ { "ibm437", character_set_t::ibm437 },
+ { "ibm500", character_set_t::ibm500 },
+ { "ibm775", character_set_t::ibm775 },
+ { "ibm819", character_set_t::iso_8859_1 },
+ { "ibm850", character_set_t::ibm850 },
+ { "ibm851", character_set_t::ibm851 },
+ { "ibm852", character_set_t::ibm852 },
+ { "ibm855", character_set_t::ibm855 },
+ { "ibm857", character_set_t::ibm857 },
+ { "ibm860", character_set_t::ibm860 },
+ { "ibm861", character_set_t::ibm861 },
+ { "ibm862", character_set_t::ibm862 },
+ { "ibm863", character_set_t::ibm863 },
+ { "ibm864", character_set_t::ibm864 },
+ { "ibm865", character_set_t::ibm865 },
+ { "ibm866", character_set_t::ibm866 },
+ { "ibm868", character_set_t::ibm868 },
+ { "ibm869", character_set_t::ibm869 },
+ { "ibm870", character_set_t::ibm870 },
+ { "ibm871", character_set_t::ibm871 },
+ { "ibm880", character_set_t::ibm880 },
+ { "ibm891", character_set_t::ibm891 },
+ { "ibm903", character_set_t::ibm903 },
+ { "ibm904", character_set_t::ibm904 },
+ { "ibm905", character_set_t::ibm905 },
+ { "ibm918", character_set_t::ibm918 },
+ { "iec_p27-1", character_set_t::iec_p27_1 },
+ { "inis", character_set_t::inis },
+ { "inis-8", character_set_t::inis_8 },
+ { "inis-cyrillic", character_set_t::inis_cyrillic },
+ { "invariant", character_set_t::invariant },
+ { "irv", character_set_t::iso_646_irv_1983 },
+ { "iso-10646", character_set_t::iso_10646_unicode_latin1 },
+ { "iso-10646-j-1", character_set_t::iso_10646_j_1 },
+ { "iso-10646-ucs-2", character_set_t::iso_10646_ucs_2 },
+ { "iso-10646-ucs-4", character_set_t::iso_10646_ucs_4 },
+ { "iso-10646-ucs-basic", character_set_t::iso_10646_ucs_basic },
+ { "iso-10646-unicode-latin1", character_set_t::iso_10646_unicode_latin1 },
+ { "iso-10646-utf-1", character_set_t::iso_10646_utf_1 },
+ { "iso-11548-1", character_set_t::iso_11548_1 },
+ { "iso-2022-cn", character_set_t::iso_2022_cn },
+ { "iso-2022-cn-ext", character_set_t::iso_2022_cn_ext },
+ { "iso-2022-jp", character_set_t::iso_2022_jp },
+ { "iso-2022-jp-2", character_set_t::iso_2022_jp_2 },
+ { "iso-2022-kr", character_set_t::iso_2022_kr },
+ { "iso-8859-1", character_set_t::iso_8859_1 },
+ { "iso-8859-1-windows-3.0-latin-1", character_set_t::iso_8859_1_windows_3_0_latin_1 },
+ { "iso-8859-1-windows-3.1-latin-1", character_set_t::iso_8859_1_windows_3_1_latin_1 },
+ { "iso-8859-10", character_set_t::iso_8859_10 },
+ { "iso-8859-11", character_set_t::tis_620 },
+ { "iso-8859-13", character_set_t::iso_8859_13 },
+ { "iso-8859-14", character_set_t::iso_8859_14 },
+ { "iso-8859-15", character_set_t::iso_8859_15 },
+ { "iso-8859-16", character_set_t::iso_8859_16 },
+ { "iso-8859-2", character_set_t::iso_8859_2 },
+ { "iso-8859-2-windows-latin-2", character_set_t::iso_8859_2_windows_latin_2 },
+ { "iso-8859-3", character_set_t::iso_8859_3 },
+ { "iso-8859-4", character_set_t::iso_8859_4 },
+ { "iso-8859-5", character_set_t::iso_8859_5 },
+ { "iso-8859-6", character_set_t::iso_8859_6 },
+ { "iso-8859-6-e", character_set_t::iso_8859_6_e },
+ { "iso-8859-6-i", character_set_t::iso_8859_6_i },
+ { "iso-8859-7", character_set_t::iso_8859_7 },
+ { "iso-8859-8", character_set_t::iso_8859_8 },
+ { "iso-8859-8-e", character_set_t::iso_8859_8_e },
+ { "iso-8859-8-i", character_set_t::iso_8859_8_i },
+ { "iso-8859-9", character_set_t::iso_8859_9 },
+ { "iso-8859-9-windows-latin-5", character_set_t::iso_8859_9_windows_latin_5 },
+ { "iso-celtic", character_set_t::iso_8859_14 },
+ { "iso-ir-10", character_set_t::sen_850200_b },
+ { "iso-ir-100", character_set_t::iso_8859_1 },
+ { "iso-ir-101", character_set_t::iso_8859_2 },
+ { "iso-ir-102", character_set_t::t_61_7bit },
+ { "iso-ir-103", character_set_t::t_61_8bit },
+ { "iso-ir-109", character_set_t::iso_8859_3 },
+ { "iso-ir-11", character_set_t::sen_850200_c },
+ { "iso-ir-110", character_set_t::iso_8859_4 },
+ { "iso-ir-111", character_set_t::ecma_cyrillic },
+ { "iso-ir-121", character_set_t::csa_z243_4_1985_1 },
+ { "iso-ir-122", character_set_t::csa_z243_4_1985_2 },
+ { "iso-ir-123", character_set_t::csa_z243_4_1985_gr },
+ { "iso-ir-126", character_set_t::iso_8859_7 },
+ { "iso-ir-127", character_set_t::iso_8859_6 },
+ { "iso-ir-128", character_set_t::t_101_g2 },
+ { "iso-ir-13", character_set_t::jis_c6220_1969_jp },
+ { "iso-ir-138", character_set_t::iso_8859_8 },
+ { "iso-ir-139", character_set_t::csn_369103 },
+ { "iso-ir-14", character_set_t::jis_c6220_1969_ro },
+ { "iso-ir-141", character_set_t::jus_i_b1_002 },
+ { "iso-ir-142", character_set_t::iso_6937_2_add },
+ { "iso-ir-143", character_set_t::iec_p27_1 },
+ { "iso-ir-144", character_set_t::iso_8859_5 },
+ { "iso-ir-146", character_set_t::jus_i_b1_003_serb },
+ { "iso-ir-147", character_set_t::jus_i_b1_003_mac },
+ { "iso-ir-148", character_set_t::iso_8859_9 },
+ { "iso-ir-149", character_set_t::ks_c_5601_1987 },
+ { "iso-ir-15", character_set_t::it },
+ { "iso-ir-150", character_set_t::greek_ccitt },
+ { "iso-ir-151", character_set_t::nc_nc00_10_81 },
+ { "iso-ir-152", character_set_t::iso_6937_2_25 },
+ { "iso-ir-153", character_set_t::gost_19768_74 },
+ { "iso-ir-154", character_set_t::iso_8859_supp },
+ { "iso-ir-155", character_set_t::iso_10367_box },
+ { "iso-ir-157", character_set_t::iso_8859_10 },
+ { "iso-ir-158", character_set_t::latin_lap },
+ { "iso-ir-159", character_set_t::jis_x0212_1990 },
+ { "iso-ir-16", character_set_t::pt },
+ { "iso-ir-17", character_set_t::es },
+ { "iso-ir-18", character_set_t::greek7_old },
+ { "iso-ir-19", character_set_t::latin_greek },
+ { "iso-ir-199", character_set_t::iso_8859_14 },
+ { "iso-ir-2", character_set_t::iso_646_irv_1983 },
+ { "iso-ir-21", character_set_t::din_66003 },
+ { "iso-ir-226", character_set_t::iso_8859_16 },
+ { "iso-ir-25", character_set_t::nf_z_62_010_1973 },
+ { "iso-ir-27", character_set_t::latin_greek_1 },
+ { "iso-ir-37", character_set_t::iso_5427 },
+ { "iso-ir-4", character_set_t::bs_4730 },
+ { "iso-ir-42", character_set_t::jis_c6226_1978 },
+ { "iso-ir-47", character_set_t::bs_viewdata },
+ { "iso-ir-49", character_set_t::inis },
+ { "iso-ir-50", character_set_t::inis_8 },
+ { "iso-ir-51", character_set_t::inis_cyrillic },
+ { "iso-ir-54", character_set_t::iso_5427_1981 },
+ { "iso-ir-55", character_set_t::iso_5428_1980 },
+ { "iso-ir-57", character_set_t::gb_1988_80 },
+ { "iso-ir-58", character_set_t::gb_2312_80 },
+ { "iso-ir-6", character_set_t::us_ascii },
+ { "iso-ir-60", character_set_t::ns_4551_1 },
+ { "iso-ir-61", character_set_t::ns_4551_2 },
+ { "iso-ir-69", character_set_t::nf_z_62_010 },
+ { "iso-ir-70", character_set_t::videotex_suppl },
+ { "iso-ir-8-1", character_set_t::nats_sefi },
+ { "iso-ir-8-2", character_set_t::nats_sefi_add },
+ { "iso-ir-84", character_set_t::pt2 },
+ { "iso-ir-85", character_set_t::es2 },
+ { "iso-ir-86", character_set_t::msz_7795_3 },
+ { "iso-ir-87", character_set_t::jis_c6226_1983 },
+ { "iso-ir-88", character_set_t::greek7 },
+ { "iso-ir-89", character_set_t::asmo_449 },
+ { "iso-ir-9-1", character_set_t::nats_dano },
+ { "iso-ir-9-2", character_set_t::nats_dano_add },
+ { "iso-ir-90", character_set_t::iso_ir_90 },
+ { "iso-ir-91", character_set_t::jis_c6229_1984_a },
+ { "iso-ir-92", character_set_t::jis_c6229_1984_b },
+ { "iso-ir-93", character_set_t::jis_c6229_1984_b_add },
+ { "iso-ir-94", character_set_t::jis_c6229_1984_hand },
+ { "iso-ir-95", character_set_t::jis_c6229_1984_hand_add },
+ { "iso-ir-96", character_set_t::jis_c6229_1984_kana },
+ { "iso-ir-98", character_set_t::iso_2033_1983 },
+ { "iso-ir-99", character_set_t::ansi_x3_110_1983 },
+ { "iso-unicode-ibm-1261", character_set_t::iso_unicode_ibm_1261 },
+ { "iso-unicode-ibm-1264", character_set_t::iso_unicode_ibm_1264 },
+ { "iso-unicode-ibm-1265", character_set_t::iso_unicode_ibm_1265 },
+ { "iso-unicode-ibm-1268", character_set_t::iso_unicode_ibm_1268 },
+ { "iso-unicode-ibm-1276", character_set_t::iso_unicode_ibm_1276 },
+ { "iso5427cyrillic1981", character_set_t::iso_5427_1981 },
+ { "iso646-ca", character_set_t::csa_z243_4_1985_1 },
+ { "iso646-ca2", character_set_t::csa_z243_4_1985_2 },
+ { "iso646-cn", character_set_t::gb_1988_80 },
+ { "iso646-cu", character_set_t::nc_nc00_10_81 },
+ { "iso646-de", character_set_t::din_66003 },
+ { "iso646-dk", character_set_t::ds_2089 },
+ { "iso646-es", character_set_t::es },
+ { "iso646-es2", character_set_t::es2 },
+ { "iso646-fi", character_set_t::sen_850200_b },
+ { "iso646-fr", character_set_t::nf_z_62_010 },
+ { "iso646-fr1", character_set_t::nf_z_62_010_1973 },
+ { "iso646-gb", character_set_t::bs_4730 },
+ { "iso646-hu", character_set_t::msz_7795_3 },
+ { "iso646-it", character_set_t::it },
+ { "iso646-jp", character_set_t::jis_c6220_1969_ro },
+ { "iso646-jp-ocr-b", character_set_t::jis_c6229_1984_b },
+ { "iso646-kr", character_set_t::ksc5636 },
+ { "iso646-no", character_set_t::ns_4551_1 },
+ { "iso646-no2", character_set_t::ns_4551_2 },
+ { "iso646-pt", character_set_t::pt },
+ { "iso646-pt2", character_set_t::pt2 },
+ { "iso646-se", character_set_t::sen_850200_b },
+ { "iso646-se2", character_set_t::sen_850200_c },
+ { "iso646-us", character_set_t::us_ascii },
+ { "iso646-yu", character_set_t::jus_i_b1_002 },
+ { "iso_10367-box", character_set_t::iso_10367_box },
+ { "iso_11548-1", character_set_t::iso_11548_1 },
+ { "iso_2033-1983", character_set_t::iso_2033_1983 },
+ { "iso_5427", character_set_t::iso_5427 },
+ { "iso_5427:1981", character_set_t::iso_5427_1981 },
+ { "iso_5428:1980", character_set_t::iso_5428_1980 },
+ { "iso_646.basic:1983", character_set_t::iso_646_basic_1983 },
+ { "iso_646.irv:1983", character_set_t::iso_646_irv_1983 },
+ { "iso_646.irv:1991", character_set_t::us_ascii },
+ { "iso_6937-2-25", character_set_t::iso_6937_2_25 },
+ { "iso_6937-2-add", character_set_t::iso_6937_2_add },
+ { "iso_8859-1", character_set_t::iso_8859_1 },
+ { "iso_8859-10:1992", character_set_t::iso_8859_10 },
+ { "iso_8859-14", character_set_t::iso_8859_14 },
+ { "iso_8859-14:1998", character_set_t::iso_8859_14 },
+ { "iso_8859-15", character_set_t::iso_8859_15 },
+ { "iso_8859-16", character_set_t::iso_8859_16 },
+ { "iso_8859-16:2001", character_set_t::iso_8859_16 },
+ { "iso_8859-1:1987", character_set_t::iso_8859_1 },
+ { "iso_8859-2", character_set_t::iso_8859_2 },
+ { "iso_8859-2:1987", character_set_t::iso_8859_2 },
+ { "iso_8859-3", character_set_t::iso_8859_3 },
+ { "iso_8859-3:1988", character_set_t::iso_8859_3 },
+ { "iso_8859-4", character_set_t::iso_8859_4 },
+ { "iso_8859-4:1988", character_set_t::iso_8859_4 },
+ { "iso_8859-5", character_set_t::iso_8859_5 },
+ { "iso_8859-5:1988", character_set_t::iso_8859_5 },
+ { "iso_8859-6", character_set_t::iso_8859_6 },
+ { "iso_8859-6-e", character_set_t::iso_8859_6_e },
+ { "iso_8859-6-i", character_set_t::iso_8859_6_i },
+ { "iso_8859-6:1987", character_set_t::iso_8859_6 },
+ { "iso_8859-7", character_set_t::iso_8859_7 },
+ { "iso_8859-7:1987", character_set_t::iso_8859_7 },
+ { "iso_8859-8", character_set_t::iso_8859_8 },
+ { "iso_8859-8-e", character_set_t::iso_8859_8_e },
+ { "iso_8859-8-i", character_set_t::iso_8859_8_i },
+ { "iso_8859-8:1988", character_set_t::iso_8859_8 },
+ { "iso_8859-9", character_set_t::iso_8859_9 },
+ { "iso_8859-9:1989", character_set_t::iso_8859_9 },
+ { "iso_8859-supp", character_set_t::iso_8859_supp },
+ { "iso_9036", character_set_t::asmo_449 },
+ { "iso_tr_11548-1", character_set_t::iso_11548_1 },
+ { "it", character_set_t::it },
+ { "jis_c6220-1969", character_set_t::jis_c6220_1969_jp },
+ { "jis_c6220-1969-jp", character_set_t::jis_c6220_1969_jp },
+ { "jis_c6220-1969-ro", character_set_t::jis_c6220_1969_ro },
+ { "jis_c6226-1978", character_set_t::jis_c6226_1978 },
+ { "jis_c6226-1983", character_set_t::jis_c6226_1983 },
+ { "jis_c6229-1984-a", character_set_t::jis_c6229_1984_a },
+ { "jis_c6229-1984-b", character_set_t::jis_c6229_1984_b },
+ { "jis_c6229-1984-b-add", character_set_t::jis_c6229_1984_b_add },
+ { "jis_c6229-1984-hand", character_set_t::jis_c6229_1984_hand },
+ { "jis_c6229-1984-hand-add", character_set_t::jis_c6229_1984_hand_add },
+ { "jis_c6229-1984-kana", character_set_t::jis_c6229_1984_kana },
+ { "jis_encoding", character_set_t::jis_encoding },
+ { "jis_x0201", character_set_t::jis_x0201 },
+ { "jis_x0208-1983", character_set_t::jis_c6226_1983 },
+ { "jis_x0212-1990", character_set_t::jis_x0212_1990 },
+ { "jp", character_set_t::jis_c6220_1969_ro },
+ { "jp-ocr-a", character_set_t::jis_c6229_1984_a },
+ { "jp-ocr-b", character_set_t::jis_c6229_1984_b },
+ { "jp-ocr-b-add", character_set_t::jis_c6229_1984_b_add },
+ { "jp-ocr-hand", character_set_t::jis_c6229_1984_hand },
+ { "jp-ocr-hand-add", character_set_t::jis_c6229_1984_hand_add },
+ { "js", character_set_t::jus_i_b1_002 },
+ { "jus_i.b1.002", character_set_t::jus_i_b1_002 },
+ { "jus_i.b1.003-mac", character_set_t::jus_i_b1_003_mac },
+ { "jus_i.b1.003-serb", character_set_t::jus_i_b1_003_serb },
+ { "katakana", character_set_t::jis_c6220_1969_jp },
+ { "koi7-switched", character_set_t::koi7_switched },
+ { "koi8-e", character_set_t::ecma_cyrillic },
+ { "koi8-r", character_set_t::koi8_r },
+ { "koi8-u", character_set_t::koi8_u },
+ { "korean", character_set_t::ks_c_5601_1987 },
+ { "ks_c_5601-1987", character_set_t::ks_c_5601_1987 },
+ { "ks_c_5601-1989", character_set_t::ks_c_5601_1987 },
+ { "ksc5636", character_set_t::ksc5636 },
+ { "ksc_5601", character_set_t::ks_c_5601_1987 },
+ { "kz-1048", character_set_t::kz_1048 },
+ { "l1", character_set_t::iso_8859_1 },
+ { "l10", character_set_t::iso_8859_16 },
+ { "l2", character_set_t::iso_8859_2 },
+ { "l3", character_set_t::iso_8859_3 },
+ { "l4", character_set_t::iso_8859_4 },
+ { "l5", character_set_t::iso_8859_9 },
+ { "l6", character_set_t::iso_8859_10 },
+ { "l8", character_set_t::iso_8859_14 },
+ { "lap", character_set_t::latin_lap },
+ { "latin-9", character_set_t::iso_8859_15 },
+ { "latin-greek", character_set_t::latin_greek },
+ { "latin-greek-1", character_set_t::latin_greek_1 },
+ { "latin-lap", character_set_t::latin_lap },
+ { "latin1", character_set_t::iso_8859_1 },
+ { "latin1-2-5", character_set_t::iso_8859_supp },
+ { "latin10", character_set_t::iso_8859_16 },
+ { "latin2", character_set_t::iso_8859_2 },
+ { "latin3", character_set_t::iso_8859_3 },
+ { "latin4", character_set_t::iso_8859_4 },
+ { "latin5", character_set_t::iso_8859_9 },
+ { "latin6", character_set_t::iso_8859_10 },
+ { "latin8", character_set_t::iso_8859_14 },
+ { "mac", character_set_t::macintosh },
+ { "macedonian", character_set_t::jus_i_b1_003_mac },
+ { "macintosh", character_set_t::macintosh },
+ { "microsoft-publishing", character_set_t::microsoft_publishing },
+ { "mnem", character_set_t::mnem },
+ { "mnemonic", character_set_t::mnemonic },
+ { "ms936", character_set_t::gbk },
+ { "ms_kanji", character_set_t::shift_jis },
+ { "msz_7795.3", character_set_t::msz_7795_3 },
+ { "naplps", character_set_t::ansi_x3_110_1983 },
+ { "nats-dano", character_set_t::nats_dano },
+ { "nats-dano-add", character_set_t::nats_dano_add },
+ { "nats-sefi", character_set_t::nats_sefi },
+ { "nats-sefi-add", character_set_t::nats_sefi_add },
+ { "nc_nc00-10:81", character_set_t::nc_nc00_10_81 },
+ { "nf_z_62-010", character_set_t::nf_z_62_010 },
+ { "nf_z_62-010_(1973)", character_set_t::nf_z_62_010_1973 },
+ { "no", character_set_t::ns_4551_1 },
+ { "no2", character_set_t::ns_4551_2 },
+ { "ns_4551-1", character_set_t::ns_4551_1 },
+ { "ns_4551-2", character_set_t::ns_4551_2 },
+ { "osd_ebcdic_df03_irv", character_set_t::osd_ebcdic_df03_irv },
+ { "osd_ebcdic_df04_1", character_set_t::osd_ebcdic_df04_1 },
+ { "osd_ebcdic_df04_15", character_set_t::osd_ebcdic_df04_15 },
+ { "pc-multilingual-850+euro", character_set_t::ibm00858 },
+ { "pc8-danish-norwegian", character_set_t::pc8_danish_norwegian },
+ { "pc8-turkish", character_set_t::pc8_turkish },
+ { "pt", character_set_t::pt },
+ { "pt154", character_set_t::ptcp154 },
+ { "pt2", character_set_t::pt2 },
+ { "ptcp154", character_set_t::ptcp154 },
+ { "r8", character_set_t::hp_roman8 },
+ { "ref", character_set_t::iso_646_basic_1983 },
+ { "rk1048", character_set_t::kz_1048 },
+ { "roman8", character_set_t::hp_roman8 },
+ { "scsu", character_set_t::scsu },
+ { "se", character_set_t::sen_850200_b },
+ { "se2", character_set_t::sen_850200_c },
+ { "sen_850200_b", character_set_t::sen_850200_b },
+ { "sen_850200_c", character_set_t::sen_850200_c },
+ { "serbian", character_set_t::jus_i_b1_003_serb },
+ { "shift_jis", character_set_t::shift_jis },
+ { "st_sev_358-88", character_set_t::gost_19768_74 },
+ { "strk1048-2002", character_set_t::kz_1048 },
+ { "t.101-g2", character_set_t::t_101_g2 },
+ { "t.61", character_set_t::t_61_8bit },
+ { "t.61-7bit", character_set_t::t_61_7bit },
+ { "t.61-8bit", character_set_t::t_61_8bit },
+ { "tis-620", character_set_t::tis_620 },
+ { "tscii", character_set_t::tscii },
+ { "uk", character_set_t::bs_4730 },
+ { "unicode-1-1", character_set_t::unicode_1_1 },
+ { "unicode-1-1-utf-7", character_set_t::unicode_1_1_utf_7 },
+ { "unknown-8bit", character_set_t::unknown_8bit },
+ { "us", character_set_t::us_ascii },
+ { "us-ascii", character_set_t::us_ascii },
+ { "us-dk", character_set_t::us_dk },
+ { "utf-16", character_set_t::utf_16 },
+ { "utf-16be", character_set_t::utf_16be },
+ { "utf-16le", character_set_t::utf_16le },
+ { "utf-32", character_set_t::utf_32 },
+ { "utf-32be", character_set_t::utf_32be },
+ { "utf-32le", character_set_t::utf_32le },
+ { "utf-7", character_set_t::utf_7 },
+ { "utf-7-imap", character_set_t::utf_7_imap },
+ { "utf-8", character_set_t::utf_8 },
+ { "ventura-international", character_set_t::ventura_international },
+ { "ventura-math", character_set_t::ventura_math },
+ { "ventura-us", character_set_t::ventura_us },
+ { "videotex-suppl", character_set_t::videotex_suppl },
+ { "viqr", character_set_t::viqr },
+ { "viscii", character_set_t::viscii },
+ { "windows-1250", character_set_t::windows_1250 },
+ { "windows-1251", character_set_t::windows_1251 },
+ { "windows-1252", character_set_t::windows_1252 },
+ { "windows-1253", character_set_t::windows_1253 },
+ { "windows-1254", character_set_t::windows_1254 },
+ { "windows-1255", character_set_t::windows_1255 },
+ { "windows-1256", character_set_t::windows_1256 },
+ { "windows-1257", character_set_t::windows_1257 },
+ { "windows-1258", character_set_t::windows_1258 },
+ { "windows-31j", character_set_t::windows_31j },
+ { "windows-874", character_set_t::windows_874 },
+ { "windows-936", character_set_t::gbk },
+ { "x0201", character_set_t::jis_x0201 },
+ { "x0201-7", character_set_t::jis_c6220_1969_jp },
+ { "x0208", character_set_t::jis_c6226_1983 },
+ { "x0212", character_set_t::jis_x0212_1990 },
+ { "yu", character_set_t::jus_i_b1_002 },
+};const map_type& get()
+{
+ static map_type mt(entries, std::size(entries), character_set_t::unspecified);
+ return mt;
+}
+
+} // namespace charset
+
+} // anonymous namespace
+
+dump_format_t to_dump_format_enum(std::string_view s)
+{
+ return dump_format::get().find(s);
+}
+
+character_set_t to_character_set(std::string_view s)
+{
+ // Convert the source encoding string to all lower-case first.
+ std::string val_lower{s};
+ std::transform(val_lower.begin(), val_lower.end(), val_lower.begin(),
+ [](unsigned char c)
+ {
+ return std::tolower(c);
+ }
+ );
+
+ return charset::get().find(val_lower);
+}
+
+std::vector<std::pair<std::string_view, dump_format_t>> get_dump_format_entries()
+{
+ std::vector<std::pair<std::string_view, dump_format_t>> ret;
+ for (const auto& e : dump_format::entries)
+ ret.emplace_back(e.key, e.value);
+
+ return ret;
+}
+
+std::ostream& operator<< (std::ostream& os, const length_t& v)
+{
+ os << v.to_string();
+ return os;
+}
+
+std::ostream& operator<< (std::ostream& os, const date_time_t& v)
+{
+ os << v.to_string();
+ return os;
+}
+
+std::ostream& operator<< (std::ostream& os, format_t v)
+{
+ static const char* values[] = {
+ "unknown",
+ "ods",
+ "xlsx",
+ "gnumeric",
+ "xls-xml",
+ "csv"
+ };
+
+ size_t vi = static_cast<std::underlying_type_t<format_t>>(v);
+ size_t n = std::size(values);
+
+ if (vi >= n)
+ os << "???";
+ else
+ os << values[vi];
+
+ return os;
+}
+
+const std::size_t INDEX_NOT_FOUND = std::numeric_limits<size_t>::max();
+const xmlns_id_t XMLNS_UNKNOWN_ID = nullptr;
+const xml_token_t XML_UNKNOWN_TOKEN = 0;
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/types_test.cpp b/src/parser/types_test.cpp
new file mode 100644
index 0000000..ae22fdd
--- /dev/null
+++ b/src/parser/types_test.cpp
@@ -0,0 +1,47 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "test_global.hpp"
+#include <orcus/types.hpp>
+
+void test_character_set_t()
+{
+ orcus::test::stack_printer __sp__(__func__);
+
+ using orcus::character_set_t;
+
+ struct test_case
+ {
+ std::string_view input;
+ character_set_t expected;
+ };
+
+ constexpr test_case tests[] = {
+ { "utf-8", character_set_t::utf_8 },
+ { "UTF-8", character_set_t::utf_8 },
+ { "EUC-JP", character_set_t::euc_jp },
+ { "GBK", character_set_t::gbk },
+ { "Shift_JIS", character_set_t::shift_jis },
+ { "MS_Kanji", character_set_t::shift_jis },
+ { "csShiftJIS", character_set_t::shift_jis },
+ { "GB2312", character_set_t::gb2312 },
+ };
+
+ for (const auto& test : tests)
+ {
+ assert(orcus::to_character_set(test.input) == test.expected);
+ }
+}
+
+int main()
+{
+ test_character_set_t();
+
+ return EXIT_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/utf8.cpp b/src/parser/utf8.cpp
new file mode 100644
index 0000000..e02d224
--- /dev/null
+++ b/src/parser/utf8.cpp
@@ -0,0 +1,524 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "utf8.hpp"
+
+#include <cassert>
+#include <stdexcept>
+#include <limits>
+
+// https://en.wikipedia.org/wiki/UTF-8#Encoding
+// https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-NameStartChar
+
+namespace orcus {
+
+namespace {
+
+bool valid_second_byte(uint8_t b)
+{
+ return (b & 0xC0) == 0x80;
+}
+
+bool parse_1b_start_char(uint8_t c1)
+{
+ if (c1 == '_')
+ return true;
+
+ if ('a' <= c1 && c1 <= 'z')
+ return true;
+
+ if ('A' <= c1 && c1 <= 'Z')
+ return true;
+
+ return false;
+}
+
+bool parse_1b_second_char(uint8_t c1)
+{
+ if (c1 == '-' || c1 == '.')
+ return true;
+
+ if ('0' <= c1 && c1 <= '9')
+ return true;
+
+ return false;
+}
+
+// [ #xC0- #xD6]: C3 80 -> C3 96
+// [ #xD8- #xF6]: C3 98 -> C3 B6
+// [ #xF8-#x2FF]: C3 B8 -> CB BF
+// [#x370-#x37D]: CD B0 -> CD BD
+//
+// [#x37F-#x1FFF]: (split)
+// [#x37F-#x07FF]: CD BF -> DF BF
+//
+bool parse_2b_start_char(uint8_t c1, uint8_t c2)
+{
+ if (c1 == 0xC3)
+ {
+ if (0x80 <= c2 && c2 <= 0x96)
+ return true;
+
+ if (0x98 <= c2 && c2 <= 0xB6)
+ return true;
+
+ if (0xB8 <= c2)
+ return true;
+ }
+
+ // C4 80 -> CB BF
+ if (0xC4 <= c1 && c1 <= 0xCB)
+ return 0x80 <= c2 && c2 <= 0xBF;
+
+ // CD B0 -> CD BD
+ // CD BF -> DF BF
+
+ if (c1 == 0xCD)
+ {
+ if (0xB0 <= c2 && c2 <= 0xBD)
+ return true;
+
+ return c2 == 0xBF;
+ }
+
+ // CE xx -> DF xx
+ return 0xCE <= c1 && c1 <= 0xDF;
+}
+
+// #xB7: C2 B7
+// [#x0300-#x036F]: CC 80 -> CD AF
+bool parse_2b_second_char(uint8_t c1, uint8_t c2)
+{
+ // C2 B7
+ if (c1 == 0xC2)
+ return c2 == 0xB7;
+
+ // CC 80 -> CD AF
+ // - CC xx
+ // - CD xx -> CD AF
+
+ if (c1 == 0xCC)
+ return true;
+
+ if (c1 == 0xCD)
+ return c2 <= 0xAF;
+
+ return false;
+}
+
+// [#x800-#x1FFF]: E0 A0 80 -> E1 BF BF
+//
+// [#x200C-#x200D]: E2 80 8C -> E2 80 8D
+// [#x2070-#x218F]: E2 81 B0 -> E2 86 8F
+// [#x2C00-#x2FEF]: E2 B0 80 -> E2 BF AF
+// [#x3001-#xD7FF]: E3 80 81 -> ED 9F BF
+// [#xF900-#xFDCF]: EF A4 80 -> EF B7 8F
+// [#xFDF0-#xFFFD]: EF B7 B0 -> EF BF BD
+bool parse_3b_start_char(uint8_t c1, uint8_t c2, uint8_t c3)
+{
+ // E0 A0 80 -> E1 BF BF
+ // - E0 A0 80 -> E0 BF BF
+ // - E1 xx xx
+
+ if (c1 == 0xE0)
+ {
+ // A0 80 -> BF BF
+ return (0xA0 <= c2 && c2 <= 0xBF && 0x80 <= c3 && c3 <= 0xBF);
+ }
+
+ if (c1 == 0xE1)
+ // entire E1 xx xx range is valid.
+ return true;
+
+ if (c1 == 0xE2)
+ {
+ // E2 80 8C -> E2 80 8D
+ // E2 81 B0 -> E2 86 8F
+ // E2 B0 80 -> E2 BF AF
+
+ if (c2 == 0x80)
+ // 8C -> 8D
+ return c3 == 0x8C || c3 == 0x8D;
+
+ // 81 B0 -> 86 8F
+ if (c2 == 0x81)
+ return c3 >= 0xB0;
+
+ if (0x82 <= c2 && c2 <= 0x85)
+ return true;
+
+ if (c2 == 0x86)
+ return c3 <= 0x8F;
+
+ // B0 80 -> BF AF
+ if (0xB0 <= c2 && c2 <= 0xBE)
+ return true;
+
+ if (c2 == 0xBF)
+ return c3 <= 0xAF;
+ }
+
+ // E3 80 81 -> ED 9F BF
+ // - E3 80 81 -> E3 80 BF
+ // - E3 81 xx
+ // - E4 xx xx -> EC xx xx
+ // - ED xx xx -> ED 9F xx
+ if (c1 == 0xE3)
+ {
+ if (c2 == 0x80)
+ return c3 >= 0x81;
+
+ return 0x81 <= c2;
+ }
+
+ if (0xE4 <= c1 && c1 <= 0xEC)
+ return true;
+
+ if (c1 == 0xED)
+ return c2 <= 0x9F;
+
+ // EF A4 80 -> EF B7 8F
+ // - EF A4 xx
+ // - EF A5 xx -> EF B6 xx
+ // - EF B7 xx -> EF B7 8F
+ // EF B7 B0 -> EF BF BD
+ // - EF B7 B0 -> EF B7 xx
+ // - EF B8 xx -> EF BE xx
+ // - EF BF xx -> EF BF BD
+ if (c1 == 0xEF)
+ {
+ if (c2 == 0xA4)
+ return true;
+
+ if (0xA5 <= c2 && c2 <= 0xB6)
+ return true;
+
+ if (c2 == 0xB7)
+ {
+ if (c3 <= 0x8F)
+ return true;
+
+ return 0xB0 <= c3;
+ }
+
+ if (0xB8 <= c2 && c2 <= 0xBE)
+ return true;
+
+ if (c2 == 0xBF)
+ return c3 <= 0xBD;
+ }
+
+ return false;
+}
+
+// [#x203F-#x2040]: E2 80 BF -> E2 81 80
+bool parse_3b_second_char(uint8_t c1, uint8_t c2, uint8_t c3)
+{
+ if (c1 != 0xE2)
+ return false;
+
+ if (c2 == 0x80)
+ return c3 == 0xBF;
+
+ if (c2 == 0x81)
+ return c3 == 0x80;
+
+ return false;
+}
+
+// [#x10000-#xEFFFF]: F0 90 80 80 -> F3 AF BF BF
+bool parse_4b_char(uint8_t c1, uint8_t c2, uint8_t /*c3*/, uint8_t /*c4*/)
+{
+ // F0 90 80 80 -> F3 AF BF BF
+ // - F0 90 xx xx -> F0 xx xx xx
+ // - F1 xx xx xx -> F2 xx xx xx
+ // - F3 xx xx xx -> F3 AF xx xx
+ if (c1 == 0xF0)
+ return 0x90 <= c2;
+
+ if (0xF1 <= c1 && c1 <= 0xF2)
+ return true;
+
+ if (c1 == 0xF3)
+ return c2 <= 0xAF;
+
+ return false;
+}
+
+uint8_t calc_encoded_length(uint32_t cp)
+{
+ if (cp <= 0x7F)
+ return 1;
+
+ if (0x80 <= cp && cp <= 0x7FF)
+ return 2;
+
+ if (0x800 <= cp && cp <= 0xFFFF)
+ return 3;
+
+ if (0x10000 <= cp && cp <= 0x10FFFF)
+ return 4;
+
+ throw std::runtime_error("invalid utf-8 range.");
+}
+
+// input must be less than or equal to 0x7FF
+//
+// b1: 0b110xxxxx (5)
+// b2: 0b10xxxxxx (6)
+std::vector<char> encode_2b(uint32_t cp)
+{
+ assert(cp <= 0x7FF);
+
+ // Get the lowest 6 bits
+ char low = (cp & 0x3F);
+ low |= 0x80;
+
+ // Get the next 5 bits
+ cp = cp >> 6;
+ char high = (cp & 0x1F);
+ high |= 0xC0;
+
+ std::vector<char> ret = { high, low };
+ return ret;
+}
+
+// input must be less than or equal to 0xFFFF
+//
+// b1: 0b1110xxxx (4)
+// b2: 0b10xxxxxx (6)
+// b3: 0b10xxxxxx (6)
+std::vector<char> encode_3b(uint32_t cp)
+{
+ assert(cp <= 0xFFFF);
+
+ // Get the lowest 6 bits
+ char low = (cp & 0x3F);
+ low |= 0x80;
+ cp = cp >> 6;
+
+ // Get the middle 6 bits
+ char mid = (cp & 0x3F);
+ mid |= 0x80;
+ cp = cp >> 6;
+
+ // Get the next 4 bits
+ char high = (cp & 0x0F);
+ high |= 0xE0;
+
+ std::vector<char> ret = { high, mid, low };
+ return ret;
+}
+
+// input must be less than or equal to 0x10FFFF
+//
+// b1: 0b11110xxx (3)
+// b2: 0b10xxxxxx (6)
+// b3: 0b10xxxxxx (6)
+// b4: 0b10xxxxxx (6)
+std::vector<char> encode_4b(uint32_t cp)
+{
+ assert(cp <= 0x10FFFF);
+
+ // Get the lowest 6 bits
+ char low = (cp & 0x3F);
+ low |= 0x80;
+ cp = cp >> 6;
+
+ // Get the next 6 bits
+ char mid1 = (cp & 0x3F);
+ mid1 |= 0x80;
+ cp = cp >> 6;
+
+ // Get the next 6 bits
+ char mid2 = (cp & 0x3F);
+ mid2 |= 0x80;
+ cp = cp >> 6;
+
+ // Get the next 3 bits
+ char high = (cp & 0x07);
+ high |= 0xF0;
+
+ std::vector<char> ret = { high, mid2, mid1, low };
+ return ret;
+}
+
+} // anonymous namespace
+
+const char* parse_utf8_xml_name_start_char(const char* p, const char* p_end)
+{
+ size_t n_remaining = p_end - p;
+ if (!n_remaining)
+ return p;
+
+ uint8_t n_bytes = calc_utf8_byte_length(*p);
+
+ switch (n_bytes)
+ {
+ case 1:
+ return parse_1b_start_char(*p) ? p + 1 : p;
+ case 2:
+ {
+ if (n_remaining < 2)
+ return p;
+
+ uint8_t c1 = p[0];
+ uint8_t c2 = p[1];
+
+ if (!valid_second_byte(c2))
+ return p;
+
+ return parse_2b_start_char(c1, c2) ? p + 2 : p;
+ }
+ case 3:
+ {
+ if (n_remaining < 3)
+ return p;
+
+ uint8_t c1 = p[0];
+ uint8_t c2 = p[1];
+ uint8_t c3 = p[2];
+
+ if (!valid_second_byte(c2) || !valid_second_byte(c3))
+ return p;
+
+ return parse_3b_start_char(c1, c2, c3) ? p + 3 : p;
+ }
+ case 4:
+ {
+ if (n_remaining < 4)
+ return p;
+
+ uint8_t c1 = p[0];
+ uint8_t c2 = p[1];
+ uint8_t c3 = p[2];
+ uint8_t c4 = p[3];
+
+ if (!valid_second_byte(c2) || !valid_second_byte(c3) || !valid_second_byte(c4))
+ return p;
+
+ return parse_4b_char(c1, c2, c3, c4) ? p + 4 : p;
+ }
+ }
+
+ return p;
+}
+
+const char* parse_utf8_xml_name_char(const char* p, const char* p_end)
+{
+ size_t n_remaining = p_end - p;
+ if (!n_remaining)
+ return p;
+
+ uint8_t n_bytes = calc_utf8_byte_length(*p);
+
+ switch (n_bytes)
+ {
+ case 1:
+ {
+ if (parse_1b_start_char(*p))
+ return p + 1;
+
+ return parse_1b_second_char(*p) ? p + 1 : p;
+ }
+ case 2:
+ {
+ if (n_remaining < 2)
+ return p;
+
+ uint8_t c1 = p[0];
+ uint8_t c2 = p[1];
+
+ if (!valid_second_byte(c2))
+ return p;
+
+ if (parse_2b_start_char(c1, c2))
+ return p + 2;
+
+ return parse_2b_second_char(c1, c2) ? p + 2 : p;
+ }
+ case 3:
+ {
+ if (n_remaining < 3)
+ return p;
+
+ uint8_t c1 = p[0];
+ uint8_t c2 = p[1];
+ uint8_t c3 = p[2];
+
+ if (!valid_second_byte(c2) || !valid_second_byte(c3))
+ return p;
+
+ if (parse_3b_start_char(c1, c2, c3))
+ return p + 3;
+
+ return parse_3b_second_char(c1, c2, c3) ? p + 3 : p;
+ }
+ case 4:
+ {
+ if (n_remaining < 4)
+ return p;
+
+ uint8_t c1 = p[0];
+ uint8_t c2 = p[1];
+ uint8_t c3 = p[2];
+ uint8_t c4 = p[3];
+
+ if (!valid_second_byte(c2) || !valid_second_byte(c3) || !valid_second_byte(c4))
+ return p;
+
+ return parse_4b_char(c1, c2, c3, c4) ? p + 4 : p;
+ }
+ }
+
+ return p;
+}
+
+std::vector<char> encode_utf8(uint32_t cp)
+{
+ uint8_t n_encoded = calc_encoded_length(cp);
+
+ switch (n_encoded)
+ {
+ case 1:
+ // no conversion
+ return std::vector<char>(1, cp);
+ case 2:
+ return encode_2b(cp);
+ case 3:
+ return encode_3b(cp);
+ case 4:
+ return encode_4b(cp);
+ }
+
+ throw std::logic_error("this should never be reached.");
+}
+
+uint8_t calc_utf8_byte_length(uint8_t c1)
+{
+ if ((c1 & 0x80) == 0x00)
+ // highest bit is not set.
+ return 1;
+
+ if ((c1 & 0xE0) == 0xC0)
+ // highest 3 bits are 110.
+ return 2;
+
+ if ((c1 & 0xF0) == 0xE0)
+ // highest 4 bits are 1110.
+ return 3;
+
+ if ((c1 & 0xFC) == 0xF0)
+ // highest 5 bits are 11110.
+ return 4;
+
+ return std::numeric_limits<uint8_t>::max();
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/utf8.hpp b/src/parser/utf8.hpp
new file mode 100644
index 0000000..01457de
--- /dev/null
+++ b/src/parser/utf8.hpp
@@ -0,0 +1,28 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_PARSER_UTF8_HPP
+#define INCLUDED_ORCUS_PARSER_UTF8_HPP
+
+#include <vector>
+#include <cstdint>
+
+namespace orcus {
+
+const char* parse_utf8_xml_name_start_char(const char* p, const char* p_end);
+
+const char* parse_utf8_xml_name_char(const char* p, const char* p_end);
+
+std::vector<char> encode_utf8(uint32_t cp);
+
+uint8_t calc_utf8_byte_length(uint8_t c1);
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/utf8_test.cpp b/src/parser/utf8_test.cpp
new file mode 100644
index 0000000..88dcd3e
--- /dev/null
+++ b/src/parser/utf8_test.cpp
@@ -0,0 +1,170 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "test_global.hpp"
+#include "utf8.hpp"
+
+#include <iostream>
+#include <vector>
+#include <string>
+#include <cassert>
+#include <functional>
+#include <iomanip>
+
+using namespace orcus;
+using std::cout;
+using std::endl;
+
+struct cp_range_t
+{
+ uint32_t lower;
+ uint32_t upper;
+ bool valid;
+};
+
+using parse_func_t = std::function<const char*(const char*, const char*)>;
+
+bool check_cp_ranges(parse_func_t parse, std::vector<cp_range_t> ranges)
+{
+ for (const cp_range_t& range : ranges)
+ {
+ for (uint32_t cp = range.lower; cp <= range.upper; ++cp)
+ {
+ std::vector<char> buf;
+
+ try
+ {
+ buf = encode_utf8(cp);
+ }
+ catch (const std::exception& e)
+ {
+ cout << "failed to encode 0x" << std::hex << std::uppercase << cp
+ << " as utf-8: " << e.what() << endl;
+ return false;
+ }
+
+ const char* p = buf.data();
+ const char* p_end = p + buf.size();
+ const char* ret = parse(p, p_end);
+
+ if ((ret == p_end) != range.valid)
+ {
+ cout << "failed to parse 0x" << std::hex << std::uppercase << cp
+ << " (utf-8:";
+
+ for (char b : buf)
+ cout << ' ' << short(0xFF & b);
+ cout << ")" << endl;
+ cout << "expected to be " << (range.valid ? "valid" : "invalid")
+ << ", but was " << (range.valid ? "invalid" : "valid") << endl;
+ return false;
+ }
+ }
+ }
+
+ return true;
+}
+
+void test_xml_name_start_char()
+{
+ bool res = check_cp_ranges(
+ parse_utf8_xml_name_start_char,
+ {
+ { 0x00, 0x40, false },
+ { 'A', 'Z', true },
+ { '[', '^', false },
+ { '_', '_', true },
+ { '`', '`', false },
+ { 'a', 'z', true },
+ { '{', 0xBF, false },
+ { 0xC0, 0xD6, true },
+ { 0xD7, 0xD7, false },
+ { 0xD8, 0xF6, true },
+ { 0xF7, 0xF7, false },
+ { 0xF8, 0x2FF, true },
+ { 0x300, 0x36F, false },
+ { 0x370, 0x37D, true },
+ { 0x37E, 0x37E, false },
+ { 0x37F, 0x1FFF, true },
+ { 0x2000, 0x200B, false },
+ { 0x200C, 0x200D, true },
+ { 0x200E, 0x206F, false },
+ { 0x2070, 0x218F, true },
+ { 0x2190, 0x2BFF, false },
+ { 0x2C00, 0x2FEF, true },
+ { 0x2FF0, 0x3000, false },
+ { 0x3001, 0xD7FF, true },
+ { 0xD800, 0xF8FF, false },
+ { 0xF900, 0xFDCF, true },
+ { 0xFDD0, 0xFDEF, false },
+ { 0xFDF0, 0xFFFD, true },
+ { 0xFFFE, 0xFFFF, false },
+ { 0x10000, 0xEFFFF, true },
+ { 0xF0000, 0xF0000, false }, // just check one byte past last valid byte.
+ }
+ );
+ assert(res);
+}
+
+void test_xml_name_char()
+{
+ bool res = check_cp_ranges(
+ parse_utf8_xml_name_char,
+ {
+ { 0x00, ',', false },
+ { '-', '.', true }, // 0x2D - 0x2E
+ { '/', '/', false },
+ { '0', '9', true },
+ { ':', '@', false },
+ { 'A', 'Z', true },
+ { '[', '^', false },
+ { '_', '_', true }, // 0x5F
+ { '`', '`', false },
+ { 'a', 'z', true },
+ { '{', 0xB6, false },
+ { 0xB7, 0xB7, true },
+ { 0xB8, 0xBF, false },
+ { 0xC0, 0xD6, true },
+ { 0xD7, 0xD7, false },
+ { 0xD8, 0xF6, true },
+ { 0xF7, 0xF7, false },
+ { 0xF8, 0x2FF, true },
+ { 0x300, 0x36F, true },
+ { 0x370, 0x37D, true },
+ { 0x37E, 0x37E, false },
+ { 0x37F, 0x1FFF, true },
+ { 0x2000, 0x200B, false },
+ { 0x200C, 0x200D, true },
+ { 0x200E, 0x203E, false },
+ { 0x203F, 0x2040, true },
+ { 0x2041, 0x206F, false },
+ { 0x2070, 0x218F, true },
+ { 0x2190, 0x2BFF, false },
+ { 0x2C00, 0x2FEF, true },
+ { 0x2FF0, 0x3000, false },
+ { 0x3001, 0xD7FF, true },
+ { 0xD800, 0xF8FF, false },
+ { 0xF900, 0xFDCF, true },
+ { 0xFDD0, 0xFDEF, false },
+ { 0xFDF0, 0xFFFD, true },
+ { 0xFFFE, 0xFFFF, false },
+ { 0x10000, 0xEFFFF, true },
+ { 0xF0000, 0xF0000, false }, // just check one byte past last valid byte.
+ }
+ );
+ assert(res);
+}
+
+int main()
+{
+ test_xml_name_start_char();
+ test_xml_name_char();
+
+ return EXIT_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/win_stdint.h b/src/parser/win_stdint.h
new file mode 100644
index 0000000..e51d46f
--- /dev/null
+++ b/src/parser/win_stdint.h
@@ -0,0 +1,46 @@
+/*************************************************************************
+ *
+ * Copyright (c) 2013 Markus Mohrhard
+ *
+ * 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 WIN_STDINT
+#define WIN_STDINT
+
+#if _MSC_VER <= 1500
+
+typedef signed __int16 int16_t;
+typedef unsigned __int16 uint16_t;
+typedef __int32 int32_t;
+typedef unsigned __int32 uint32_t;
+typedef __int64 int64_t;
+typedef unsigned __int64 uint64_t;
+
+#else
+
+#include <stdint.h>
+
+#endif // visual studio version
+
+#endif \ No newline at end of file
diff --git a/src/parser/xml_namespace.cpp b/src/parser/xml_namespace.cpp
new file mode 100644
index 0000000..2aafea3
--- /dev/null
+++ b/src/parser/xml_namespace.cpp
@@ -0,0 +1,490 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/xml_namespace.hpp>
+#include <orcus/exception.hpp>
+#include <orcus/string_pool.hpp>
+
+#include <unordered_map>
+#include <vector>
+#include <limits>
+#include <sstream>
+#include <algorithm>
+#include <cassert>
+
+#define ORCUS_DEBUG_XML_NAMESPACE 0
+
+using namespace std;
+
+#if ORCUS_DEBUG_XML_NAMESPACE
+#include <cstdio>
+#include <iostream>
+#endif
+
+namespace orcus {
+
+namespace {
+
+#if ORCUS_DEBUG_XML_NAMESPACE
+template<typename _MapType>
+void print_map_keys(const _MapType& map_store)
+{
+ cout << "keys: (";
+ bool first = true;
+ typename _MapType::const_iterator it = map_store.begin(), it_end = map_store.end();
+ for (; it != it_end; ++it)
+ {
+ if (first)
+ first = false;
+ else
+ cout << " ";
+ cout << "'" << it->first << "'";
+ }
+ cout << ")";
+};
+#endif
+
+}
+
+typedef std::unordered_map<std::string_view, std::size_t> strid_map_type;
+
+struct xmlns_repository::impl
+{
+ size_t m_predefined_ns_size;
+ string_pool m_pool; /// storage of live string instances.
+ std::vector<std::string_view> m_identifiers; /// map strings to numerical identifiers.
+ strid_map_type m_strid_map; /// string-to-numerical identifiers map for quick lookup.
+
+ impl() : m_predefined_ns_size(0) {}
+};
+
+xmlns_repository::xmlns_repository() : mp_impl(std::make_unique<impl>()) {}
+xmlns_repository::xmlns_repository(xmlns_repository&& other) : mp_impl(std::move(other.mp_impl)) {}
+xmlns_repository::~xmlns_repository() = default;
+
+xmlns_repository& xmlns_repository::operator= (xmlns_repository&& other)
+{
+ mp_impl = std::move(other.mp_impl);
+ return *this;
+}
+
+xmlns_id_t xmlns_repository::intern(std::string_view uri)
+{
+ // See if the uri is already registered.
+ strid_map_type::iterator it = mp_impl->m_strid_map.find(uri);
+ if (it != mp_impl->m_strid_map.end())
+ return it->first.data();
+
+ try
+ {
+ auto r = mp_impl->m_pool.intern(uri);
+ std::string_view uri_interned = r.first;
+
+ if (!uri_interned.empty())
+ {
+ // Intern successful.
+ if (r.second)
+ {
+ // This is a new instance. Assign a numerical identifier.
+ mp_impl->m_strid_map.insert(
+ strid_map_type::value_type(r.first, mp_impl->m_identifiers.size()));
+#if ORCUS_DEBUG_XML_NAMESPACE
+ cout << "xmlns_repository::intern: uri='" << uri_interned << "' (" << mp_impl->m_identifiers.size() << ")" << endl;
+#endif
+ mp_impl->m_identifiers.push_back(r.first);
+
+#if ORCUS_DEBUG_XML_NAMESPACE
+ cout << "pool size=" << mp_impl->m_pool.size() << ", predefined ns size=" << mp_impl->m_predefined_ns_size <<
+ ", identifiers size=" << mp_impl->m_identifiers.size() << ", map size=" << mp_impl->m_strid_map.size() << endl;
+#endif
+ assert(mp_impl->m_pool.size()+mp_impl->m_predefined_ns_size == mp_impl->m_identifiers.size());
+ assert(mp_impl->m_pool.size()+mp_impl->m_predefined_ns_size == mp_impl->m_strid_map.size());
+ }
+ return uri_interned.data();
+ }
+ }
+ catch (const general_error&)
+ {
+ }
+
+ return XMLNS_UNKNOWN_ID;
+}
+
+void xmlns_repository::add_predefined_values(const xmlns_id_t* predefined_ns)
+{
+ if (!predefined_ns)
+ return;
+
+ const xmlns_id_t* val = &predefined_ns[0];
+ for (; *val; ++val)
+ {
+ std::string_view s(*val);
+ mp_impl->m_strid_map.insert(
+ strid_map_type::value_type(s, mp_impl->m_identifiers.size()));
+ mp_impl->m_identifiers.push_back(s);
+
+ ++mp_impl->m_predefined_ns_size;
+
+#if ORCUS_DEBUG_XML_NAMESPACE
+ cout << "xlmns_repository: predefined ns='" << s << "'" << endl;
+#endif
+ }
+}
+
+xmlns_context xmlns_repository::create_context()
+{
+ return xmlns_context(*this);
+}
+
+xmlns_id_t xmlns_repository::get_identifier(size_t index) const
+{
+ if (index >= mp_impl->m_identifiers.size())
+ return XMLNS_UNKNOWN_ID;
+
+ // All identifier strings are interned which means they are all null-terminated.
+ return mp_impl->m_identifiers[index].data();
+}
+
+string xmlns_repository::get_short_name(xmlns_id_t ns_id) const
+{
+ size_t index = get_index(ns_id);
+
+ if (index == INDEX_NOT_FOUND)
+ return string("???");
+
+ std::ostringstream os;
+ os << "ns" << index;
+ return os.str();
+}
+
+size_t xmlns_repository::get_index(xmlns_id_t ns_id) const
+{
+ if (!ns_id)
+ return INDEX_NOT_FOUND;
+
+ auto it = mp_impl->m_strid_map.find(std::string_view(ns_id));
+ if (it == mp_impl->m_strid_map.end())
+ return INDEX_NOT_FOUND;
+
+ return it->second;
+}
+
+typedef std::vector<xmlns_id_t> xmlns_list_type;
+typedef std::unordered_map<std::string_view, xmlns_list_type> alias_map_type;
+
+struct xmlns_context::impl
+{
+ xmlns_repository* repo = nullptr;
+ xmlns_list_type m_all_ns; /// all namespaces ever used in this context.
+ xmlns_list_type m_default;
+ alias_map_type m_map;
+
+ bool m_trim_all_ns = true;
+
+ impl() {}
+ impl(xmlns_repository& _repo) : repo(&_repo) {}
+ impl(const impl& r) :
+ repo(r.repo), m_all_ns(r.m_all_ns), m_default(r.m_default), m_map(r.m_map), m_trim_all_ns(r.m_trim_all_ns) {}
+};
+
+xmlns_context::xmlns_context() : mp_impl(std::make_unique<impl>()) {}
+xmlns_context::xmlns_context(xmlns_repository& repo) : mp_impl(std::make_unique<impl>(repo)) {}
+xmlns_context::xmlns_context(const xmlns_context& r) : mp_impl(std::make_unique<impl>(*r.mp_impl)) {}
+xmlns_context::xmlns_context(xmlns_context&& r) : mp_impl(std::move(r.mp_impl))
+{
+ r.mp_impl = std::make_unique<impl>();
+}
+
+xmlns_context::~xmlns_context() = default;
+
+xmlns_context& xmlns_context::operator= (const xmlns_context& r)
+{
+ xmlns_context tmp(r);
+ tmp.swap(*this);
+ return *this;
+}
+
+xmlns_context& xmlns_context::operator= (xmlns_context&& r)
+{
+ xmlns_context tmp(std::move(r));
+ tmp.swap(*this);
+ return *this;
+}
+
+xmlns_id_t xmlns_context::push(std::string_view alias, std::string_view uri)
+{
+ if (!mp_impl->repo)
+ throw general_error("this context is not associated with any repo.");
+
+#if ORCUS_DEBUG_XML_NAMESPACE
+ cout << "xmlns_context::push: key='" << alias << "', uri='" << uri << "'" << endl;
+#endif
+ mp_impl->m_trim_all_ns = true;
+
+ xmlns_id_t id = mp_impl->repo->intern(uri);
+ std::string_view uri_interned = id ? std::string_view(id) : std::string_view();
+
+ if (alias.empty())
+ {
+ // empty alias value is associated with default namespace.
+ mp_impl->m_default.push_back(uri_interned.data());
+ mp_impl->m_all_ns.push_back(uri_interned.data());
+ return mp_impl->m_default.back();
+ }
+
+ // See if this alias already exists.
+ alias_map_type::iterator it = mp_impl->m_map.find(alias);
+ if (it == mp_impl->m_map.end())
+ {
+ // This is the first time this alias is used.
+ xmlns_list_type nslist;
+ nslist.push_back(uri_interned.data());
+ mp_impl->m_all_ns.push_back(uri_interned.data());
+ std::pair<alias_map_type::iterator,bool> r =
+ mp_impl->m_map.insert(alias_map_type::value_type(alias, nslist));
+
+ if (!r.second)
+ // insertion failed.
+ throw general_error("Failed to insert new namespace.");
+
+ return nslist.back();
+ }
+
+ // The alias already exists.
+ xmlns_list_type& nslist = it->second;
+ nslist.push_back(uri_interned.data());
+ mp_impl->m_all_ns.push_back(uri_interned.data());
+ return nslist.back();
+}
+
+void xmlns_context::pop(std::string_view alias)
+{
+#if ORCUS_DEBUG_XML_NAMESPACE
+ cout << "xmlns_context::pop: alias='" << alias << "'" << endl;
+#endif
+ if (alias.empty())
+ {
+ // empty alias value is associated with default namespace.
+ if (mp_impl->m_default.empty())
+ throw general_error("default namespace stack is empty.");
+
+ mp_impl->m_default.pop_back();
+ return;
+ }
+
+ // See if this alias really exists.
+ alias_map_type::iterator it = mp_impl->m_map.find(alias);
+ if (it == mp_impl->m_map.end())
+ {
+ std::ostringstream os;
+ os << "alias named '" << alias << "' was attempted to be popped, but was not found in the stack";
+ throw general_error(os.str());
+ }
+
+ xmlns_list_type& nslist = it->second;
+ if (nslist.empty())
+ throw general_error("namespace stack for this key is empty.");
+
+ nslist.pop_back();
+}
+
+xmlns_id_t xmlns_context::get(std::string_view alias) const
+{
+#if ORCUS_DEBUG_XML_NAMESPACE
+ cout << "xmlns_context::get: alias='" << alias << "', default ns stack size="
+ << mp_impl->m_default.size() << ", non-default alias count=" << mp_impl->m_map.size();
+ cout << ", ";
+ print_map_keys(mp_impl->m_map);
+ cout << endl;
+#endif
+ if (alias.empty())
+ return mp_impl->m_default.empty() ? XMLNS_UNKNOWN_ID : mp_impl->m_default.back();
+
+ alias_map_type::const_iterator it = mp_impl->m_map.find(alias);
+ if (it == mp_impl->m_map.end())
+ {
+#if ORCUS_DEBUG_XML_NAMESPACE
+ cout << "xmlns_context::get: alias not in this context" << endl;
+#endif
+ return XMLNS_UNKNOWN_ID;
+ }
+
+#if ORCUS_DEBUG_XML_NAMESPACE
+ cout << "xmlns_context::get: alias stack size=" << it->second.size() << endl;
+#endif
+ return it->second.empty() ? XMLNS_UNKNOWN_ID : it->second.back();
+}
+
+size_t xmlns_context::get_index(xmlns_id_t ns_id) const
+{
+ if (!mp_impl->repo)
+ throw general_error("this context is not associated with any repo.");
+
+ return mp_impl->repo->get_index(ns_id);
+}
+
+string xmlns_context::get_short_name(xmlns_id_t ns_id) const
+{
+ if (!mp_impl->repo)
+ throw general_error("this context is not associated with any repo.");
+
+ return mp_impl->repo->get_short_name(ns_id);
+}
+
+std::string_view xmlns_context::get_alias(xmlns_id_t ns_id) const
+{
+ alias_map_type::const_iterator it = mp_impl->m_map.begin(), it_end = mp_impl->m_map.end();
+ for (; it != it_end; ++it)
+ {
+ const xmlns_list_type& lst = it->second;
+ if (lst.empty())
+ continue;
+
+ if (lst.back() == ns_id)
+ return it->first;
+ }
+
+ return std::string_view{};
+}
+
+namespace {
+
+#if ORCUS_DEBUG_XML_NAMESPACE
+struct print_ns
+{
+ void operator() (xmlns_id_t ns_id) const
+ {
+ const char* p = ns_id;
+ printf("%p: %s\n", p, p);
+ }
+};
+#endif
+
+struct ns_item
+{
+ size_t index;
+ xmlns_id_t ns;
+
+ ns_item(size_t _index, xmlns_id_t _ns) : index(_index), ns(_ns) {}
+};
+
+struct less_ns_by_index
+{
+ bool operator() (const ns_item& left, const ns_item& right) const
+ {
+ return left.index < right.index;
+ }
+};
+
+class push_back_ns_to_item
+{
+ vector<ns_item>& m_store;
+ const xmlns_context& m_cxt;
+public:
+ push_back_ns_to_item(vector<ns_item>& store, const xmlns_context& cxt) : m_store(store), m_cxt(cxt) {}
+ void operator() (xmlns_id_t ns)
+ {
+ size_t num_id = m_cxt.get_index(ns);
+ if (num_id != INDEX_NOT_FOUND)
+ m_store.push_back(ns_item(num_id, ns));
+ }
+};
+
+class push_back_item_to_ns
+{
+ std::vector<xmlns_id_t>& m_store;
+public:
+ push_back_item_to_ns(std::vector<xmlns_id_t>& store) : m_store(store) {}
+ void operator() (const ns_item& item)
+ {
+ m_store.push_back(item.ns);
+ }
+};
+
+}
+
+std::vector<xmlns_id_t> xmlns_context::get_all_namespaces() const
+{
+#if ORCUS_DEBUG_XML_NAMESPACE
+ cout << "xmlns_context::get_all_namespaces: count=" << mp_impl->m_all_ns.size() << endl;
+ std::for_each(mp_impl->m_all_ns.begin(), mp_impl->m_all_ns.end(), print_ns());
+#endif
+
+ std::vector<xmlns_id_t> nslist;
+
+ if (mp_impl->m_trim_all_ns)
+ {
+ xmlns_list_type& all_ns = mp_impl->m_all_ns;
+
+ nslist.assign(mp_impl->m_all_ns.begin(), mp_impl->m_all_ns.end());
+
+ // Sort it and remove duplicate.
+ std::sort(all_ns.begin(), all_ns.end());
+ xmlns_list_type::iterator it_unique_end =
+ std::unique(all_ns.begin(), all_ns.end());
+ all_ns.erase(it_unique_end, all_ns.end());
+
+ // Now, sort by indices.
+ vector<ns_item> items;
+ std::for_each(all_ns.begin(), all_ns.end(), push_back_ns_to_item(items, *this));
+ std::sort(items.begin(), items.end(), less_ns_by_index());
+
+ all_ns.clear();
+ std::for_each(items.begin(), items.end(), push_back_item_to_ns(all_ns));
+
+ mp_impl->m_trim_all_ns = false;
+ }
+
+ nslist.assign(mp_impl->m_all_ns.begin(), mp_impl->m_all_ns.end());
+ return nslist;
+}
+
+void xmlns_context::dump(std::ostream& os) const
+{
+ vector<xmlns_id_t> nslist = get_all_namespaces();
+ vector<xmlns_id_t>::const_iterator it = nslist.begin(), it_end = nslist.end();
+ for (; it != it_end; ++it)
+ {
+ xmlns_id_t ns_id = *it;
+ size_t num_id = get_index(ns_id);
+ if (num_id == INDEX_NOT_FOUND)
+ continue;
+
+ os << "ns" << num_id << "=\"" << ns_id << '"' << endl;
+ }
+}
+
+void xmlns_context::dump_state(std::ostream& os) const
+{
+ os << "namespaces:" << std::endl;
+ for (xmlns_id_t ns_id : get_all_namespaces())
+ {
+ size_t num_id = get_index(ns_id);
+ if (num_id == INDEX_NOT_FOUND)
+ continue;
+
+ os << " ns" << num_id << ": \"" << ns_id << '"' << std::endl;
+ }
+
+ os << "aliases:" << std::endl;
+ for (const auto& [alias, ns_list] : mp_impl->m_map)
+ {
+ os << " " << alias << ":" << std::endl;
+
+ for (const xmlns_id_t ns : ns_list)
+ os << " - " << ns << std::endl;
+ }
+}
+
+void xmlns_context::swap(xmlns_context& other) noexcept
+{
+ mp_impl.swap(other.mp_impl);
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/xml_namespace_test.cpp b/src/parser/xml_namespace_test.cpp
new file mode 100644
index 0000000..de3891e
--- /dev/null
+++ b/src/parser/xml_namespace_test.cpp
@@ -0,0 +1,239 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "test_global.hpp"
+#include "orcus/xml_namespace.hpp"
+
+#include <cstdlib>
+#include <vector>
+#include <algorithm>
+
+using namespace orcus;
+
+namespace {
+
+void test_basic()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ std::string_view xmlns1("http://some.xmlns/");
+ std::string_view xmlns2("http://other.xmlns/");
+
+ xmlns_repository repo;
+ xmlns_context cxt1 = repo.create_context();
+ xmlns_context cxt2 = repo.create_context();
+
+ std::string_view empty, myns("myns");
+ {
+ // context 1
+ xmlns_id_t test1 = cxt1.push(empty, xmlns1); // register default namespace.
+ assert(cxt1.get(empty) == test1);
+ xmlns_id_t test2 = cxt1.push(myns, xmlns2);
+ assert(cxt1.get(myns) == test2);
+ assert(test1 != test2);
+ }
+
+ {
+ // context 2
+ xmlns_id_t test1 = cxt2.push(empty, xmlns2); // register default namespace.
+ assert(cxt2.get(empty) == test1);
+ xmlns_id_t test2 = cxt2.push(myns, xmlns1);
+ assert(cxt2.get(myns) == test2);
+ assert(test1 != test2);
+ }
+
+ // Now, compare the registered namespaces between the two namespaces.
+ assert(cxt1.get(empty) == cxt2.get(myns));
+ assert(cxt1.get(myns) == cxt2.get(empty));
+}
+
+void test_all_namespaces()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ std::string_view key1("a"), key2("b"), key3("c");
+ std::string_view ns1("foo"), ns2("baa"), ns3("hmm");
+
+ xmlns_repository repo;
+ xmlns_context cxt = repo.create_context();
+ xmlns_id_t ns;
+
+ ns = cxt.push(key1, ns1);
+ assert(ns1 == ns);
+ ns = cxt.push(key2, ns2);
+ assert(ns2 == ns);
+ ns = cxt.push(key3, ns3);
+ assert(ns3 == ns);
+
+ std::vector<xmlns_id_t> all_ns = cxt.get_all_namespaces();
+ assert(all_ns.size() == 3);
+ assert(ns1 == all_ns[0]);
+ assert(ns2 == all_ns[1]);
+ assert(ns3 == all_ns[2]);
+}
+
+const xmlns_id_t NS_test_name1 = "test:name:1";
+const xmlns_id_t NS_test_name2 = "test:name:2";
+const xmlns_id_t NS_test_name3 = "test:name:3";
+
+xmlns_id_t NS_test_all[] = {
+ NS_test_name1,
+ NS_test_name2,
+ NS_test_name3,
+ nullptr
+};
+
+xmlns_id_t NS_test_all_reverse[] = {
+ NS_test_name3,
+ NS_test_name2,
+ NS_test_name1,
+ nullptr
+};
+
+void test_predefined_ns()
+{
+ xmlns_repository ns_repo;
+ ns_repo.add_predefined_values(NS_test_all);
+ xmlns_context cxt = ns_repo.create_context();
+ xmlns_id_t ns_id = cxt.push("tn1", "test:name:1");
+ assert(ns_id == NS_test_name1);
+ ns_id = cxt.push("tn2", "test:name:2");
+ assert(ns_id == NS_test_name2);
+ ns_id = cxt.push("tn3", "test:name:3");
+ assert(ns_id == NS_test_name3);
+ assert(cxt.get("tn1") == NS_test_name1);
+ assert(cxt.get("tn2") == NS_test_name2);
+ assert(cxt.get("tn3") == NS_test_name3);
+}
+
+void test_xml_name_t()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ xml_name_t name1;
+ name1.ns = NS_test_name1;
+ name1.name = "foo";
+
+ xml_name_t name2 = name1;
+ assert(name1 == name2);
+
+ name2.name = "foo2";
+ assert(name1 != name2);
+
+ xml_name_t name3 = name1;
+ name3.ns = NS_test_name2;
+ assert(name1 != name3);
+}
+
+void test_ns_context()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ xmlns_repository repo;
+ repo.add_predefined_values(NS_test_all);
+
+ xmlns_repository repo2;
+ repo2.add_predefined_values(NS_test_all_reverse);
+
+ xmlns_context cxt;
+ cxt = repo.create_context(); // copy assignment
+ size_t id1 = cxt.get_index(NS_test_name3);
+ xmlns_context cxt2 = cxt; // copy ctor
+ size_t id2 = cxt2.get_index(NS_test_name3);
+
+ assert(id1 == id2);
+
+ xmlns_context cxt3 = repo2.create_context();
+ id2 = cxt3.get_index(NS_test_name3);
+
+ assert(id1 != id2);
+
+ cxt3 = std::move(cxt2); // move assignment
+ id2 = cxt3.get_index(NS_test_name3);
+
+ assert(id1 == id2);
+
+ try
+ {
+ id1 = cxt2.get_index(NS_test_name2);
+ assert(!"exception was supposed to be thrown due to no associated repos.");
+ }
+ catch (const std::exception&)
+ {
+ // expected
+ }
+
+ xmlns_context cxt4(std::move(cxt3)); // move ctor
+ id1 = cxt4.get_index(NS_test_name3);
+
+ xmlns_context cxt5 = repo.create_context();
+ id2 = cxt5.get_index(NS_test_name3);
+
+ assert(id1 == id2);
+
+ try
+ {
+ id1 = cxt3.get_index(NS_test_name2);
+ assert(!"exception was supposed to be thrown due to no associated repos.");
+ }
+ catch (const std::exception&)
+ {
+ // expected
+ }
+
+ cxt4 = repo.create_context();
+ cxt5 = repo2.create_context();
+ id1 = cxt4.get_index(NS_test_name1);
+ id2 = cxt5.get_index(NS_test_name1);
+
+ assert(id1 != id2);
+
+ cxt3 = repo.create_context();
+ cxt5.swap(cxt3);
+ id2 = cxt5.get_index(NS_test_name1);
+
+ assert(id1 == id2);
+}
+
+void test_repo_move()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ static_assert(!std::is_copy_constructible_v<xmlns_repository>);
+ static_assert(std::is_move_constructible_v<xmlns_repository>);
+
+ xmlns_repository repo;
+ repo.add_predefined_values(NS_test_all);
+
+ xmlns_repository repo_moved = std::move(repo); // move construction
+ xmlns_repository repo_moved2;
+ repo_moved2 = std::move(repo_moved); // move assignment
+
+ xmlns_id_t ns_id = repo_moved2.get_identifier(0);
+ assert(ns_id != XMLNS_UNKNOWN_ID);
+ ns_id = repo_moved2.get_identifier(1);
+ assert(ns_id != XMLNS_UNKNOWN_ID);
+ ns_id = repo_moved2.get_identifier(2);
+ assert(ns_id != XMLNS_UNKNOWN_ID);
+ ns_id = repo_moved2.get_identifier(3);
+ assert(ns_id == XMLNS_UNKNOWN_ID);
+}
+
+} // anonymous namespace
+
+int main()
+{
+ test_basic();
+ test_all_namespaces();
+ test_predefined_ns();
+ test_xml_name_t();
+ test_ns_context();
+ test_repo_move();
+
+ return EXIT_SUCCESS;
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/xml_writer.cpp b/src/parser/xml_writer.cpp
new file mode 100644
index 0000000..a2f6c2f
--- /dev/null
+++ b/src/parser/xml_writer.cpp
@@ -0,0 +1,326 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/xml_writer.hpp>
+#include <orcus/xml_namespace.hpp>
+#include <orcus/string_pool.hpp>
+
+#include <vector>
+
+/** To markup code that coverity warns might throw exceptions
+ which won't throw in practice, or where std::terminate is
+ an acceptable response if they do
+*/
+#if defined(__COVERITY__)
+#define suppress_fun_call_w_exception(expr) \
+ do \
+ { \
+ try \
+ { \
+ expr; \
+ } \
+ catch (const std::exception& e) \
+ { \
+ std::cerr << "Fatal exception: " << e.what() << std::endl; \
+ std::terminate(); \
+ } \
+ } while (false)
+#else
+#define suppress_fun_call_w_exception(expr) \
+ do \
+ { \
+ expr; \
+ } while (false)
+#endif
+
+namespace orcus {
+
+namespace {
+
+struct _elem
+{
+ xml_name_t name;
+ std::vector<std::string_view> ns_aliases;
+ bool open;
+
+ _elem(const xml_name_t& _name) : name(_name), open(true) {}
+};
+
+struct _attr
+{
+ xml_name_t name;
+ std::string_view value;
+
+ _attr(const xml_name_t& _name, std::string_view _value) :
+ name(_name),
+ value(_value)
+ {}
+};
+
+void write_content_encoded(std::string_view content, std::ostream& os)
+{
+ auto _flush = [&os](const char*& p0, const char* p)
+ {
+ size_t n = std::distance(p0, p);
+ os.write(p0, n);
+ p0 = nullptr;
+ };
+
+ constexpr std::string_view cv_lt = "&lt;";
+ constexpr std::string_view cv_gt = "&gt;";
+ constexpr std::string_view cv_amp = "&amp;";
+ constexpr std::string_view cv_apos = "&apos;";
+ constexpr std::string_view cv_quot = "&quot;";
+
+ const char* p = content.data();
+ const char* p_end = p + content.size();
+ const char* p0 = nullptr;
+
+ for (; p != p_end; ++p)
+ {
+ if (!p0)
+ p0 = p;
+
+ switch (*p)
+ {
+ case '<':
+ _flush(p0, p);
+ os.write(cv_lt.data(), cv_lt.size());
+ break;
+ case '>':
+ _flush(p0, p);
+ os.write(cv_gt.data(), cv_gt.size());
+ break;
+ case '&':
+ _flush(p0, p);
+ os.write(cv_amp.data(), cv_amp.size());
+ break;
+ case '\'':
+ _flush(p0, p);
+ os.write(cv_apos.data(), cv_apos.size());
+ break;
+ case '"':
+ _flush(p0, p);
+ os.write(cv_quot.data(), cv_quot.size());
+ break;
+ }
+ }
+
+ if (p0)
+ _flush(p0, p);
+}
+
+} // anonymous namespace
+
+struct xml_writer::scope::impl
+{
+ xml_writer* parent;
+ xml_name_t elem;
+
+ impl() : parent(nullptr) {}
+
+ impl(xml_writer* _parent, const xml_name_t& _elem) :
+ parent(_parent),
+ elem(_elem)
+ {
+ parent->push_element(elem);
+ }
+
+ ~impl()
+ {
+ suppress_fun_call_w_exception(parent->pop_element());
+ }
+};
+
+xml_writer::scope::scope(xml_writer* parent, const xml_name_t& elem) :
+ mp_impl(std::make_unique<impl>(parent, elem))
+{
+}
+
+xml_writer::scope::scope(scope&& other) :
+ mp_impl(std::move(other.mp_impl))
+{
+ // NB: we shouldn't have to create an impl instance for the other object
+ // since everything happens in the impl, and the envelop class doesn't
+ // access the impl internals.
+}
+
+xml_writer::scope::~scope() {}
+
+xml_writer::scope& xml_writer::scope::operator= (scope&& other)
+{
+ scope tmp(std::move(other));
+ mp_impl.swap(tmp.mp_impl);
+ return *this;
+}
+
+struct xml_writer::impl
+{
+ xmlns_repository& ns_repo;
+ std::ostream& os;
+ std::vector<_elem> elem_stack;
+ std::vector<std::string_view> ns_decls;
+ std::vector<_attr> attrs;
+
+ string_pool str_pool;
+ xmlns_repository repo;
+ xmlns_context cxt;
+
+ impl(xmlns_repository& _ns_repo, std::ostream& _os) :
+ ns_repo(_ns_repo),
+ os(_os),
+ cxt(ns_repo.create_context())
+ {}
+
+ void print(const xml_name_t& name)
+ {
+ std::string_view alias = cxt.get_alias(name.ns);
+ if (!alias.empty())
+ os << alias << ':';
+ os << name.name;
+ }
+
+ xml_name_t intern(const xml_name_t& name)
+ {
+ xml_name_t interned = name;
+ interned.name = str_pool.intern(interned.name).first;
+ return interned;
+ }
+
+ std::string_view intern(std::string_view value)
+ {
+ return str_pool.intern(value).first;
+ }
+};
+
+xml_writer::xml_writer(xmlns_repository& ns_repo, std::ostream& os) :
+ mp_impl(std::make_unique<impl>(ns_repo, os))
+{
+ os << "<?xml version=\"1.0\"?>";
+}
+
+xml_writer::xml_writer(xml_writer&& other) :
+ mp_impl(std::move(other.mp_impl))
+{
+ other.mp_impl = std::make_unique<impl>(mp_impl->ns_repo, mp_impl->os);
+}
+
+xml_writer& xml_writer::operator= (xml_writer&& other)
+{
+ xml_writer tmp(std::move(other));
+ mp_impl.swap(tmp.mp_impl);
+ return *this;
+}
+
+void xml_writer::pop_elements()
+{
+ // Pop all the elements currently on the stack.
+ while (!mp_impl->elem_stack.empty())
+ pop_element();
+}
+
+xml_writer::~xml_writer()
+{
+ suppress_fun_call_w_exception(pop_elements());
+}
+
+void xml_writer::close_current_element()
+{
+ if (!mp_impl->elem_stack.empty() && mp_impl->elem_stack.back().open)
+ {
+ mp_impl->os << '>';
+ mp_impl->elem_stack.back().open = false;
+ }
+}
+
+xml_writer::scope xml_writer::push_element_scope(const xml_name_t& name)
+{
+ return scope(this, name);
+}
+
+void xml_writer::push_element(const xml_name_t& _name)
+{
+ close_current_element();
+
+ auto& os = mp_impl->os;
+ xml_name_t name = mp_impl->intern(_name);
+
+ os << '<';
+ mp_impl->print(name);
+
+ for (std::string_view alias : mp_impl->ns_decls)
+ {
+ os << " xmlns";
+ if (!alias.empty())
+ os << ':' << alias;
+ os << "=\"";
+ xmlns_id_t ns = mp_impl->cxt.get(alias);
+ os << ns << '"';
+ }
+
+ for (const _attr& attr : mp_impl->attrs)
+ {
+ os << ' ';
+ mp_impl->print(attr.name);
+ os << "=\"";
+ os << attr.value << '"';
+ }
+
+ mp_impl->attrs.clear();
+ mp_impl->ns_decls.clear();
+
+ mp_impl->elem_stack.emplace_back(name);
+}
+
+xmlns_id_t xml_writer::add_namespace(std::string_view alias, std::string_view value)
+{
+ std::string_view alias_safe = mp_impl->intern(alias);
+ xmlns_id_t ns = mp_impl->cxt.push(alias_safe, mp_impl->intern(value));
+ mp_impl->ns_decls.push_back(alias_safe);
+ return ns;
+}
+
+void xml_writer::add_attribute(const xml_name_t& name, std::string_view value)
+{
+ mp_impl->attrs.emplace_back(mp_impl->intern(name), mp_impl->intern(value));
+}
+
+void xml_writer::add_content(std::string_view content)
+{
+ close_current_element();
+ write_content_encoded(content, mp_impl->os);
+}
+
+xml_name_t xml_writer::pop_element()
+{
+ auto& os = mp_impl->os;
+
+ const _elem& elem = mp_impl->elem_stack.back();
+ auto name = elem.name;
+
+ if (elem.open)
+ {
+ // self-closing element.
+ os << "/>";
+ }
+ else
+ {
+ os << "</";
+ mp_impl->print(name);
+ os << '>';
+ }
+
+ for (std::string_view alias : mp_impl->elem_stack.back().ns_aliases)
+ mp_impl->cxt.pop(alias);
+
+ mp_impl->elem_stack.pop_back();
+ return name;
+}
+
+} // namespace orcus
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/xml_writer_test.cpp b/src/parser/xml_writer_test.cpp
new file mode 100644
index 0000000..a6e4bed
--- /dev/null
+++ b/src/parser/xml_writer_test.cpp
@@ -0,0 +1,106 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "test_global.hpp"
+#include "orcus/xml_writer.hpp"
+#include "orcus/xml_namespace.hpp"
+#include "orcus/sax_parser.hpp"
+
+#include <iostream>
+#include <sstream>
+
+using namespace orcus;
+
+void test_encoded_content()
+{
+ const std::vector<std::string> test_contents = {
+ "1 < 2 but 3 > 2",
+ "ladies & gentlemen",
+ "'testing single quotes'",
+ "\"testing double quotes\"",
+ };
+
+ struct _handler : public sax_handler
+ {
+ std::ostringstream os_content;
+
+ void characters(std::string_view val, bool /*transient*/)
+ {
+ os_content << val;
+ }
+ };
+
+ for (const std::string& test_content : test_contents)
+ {
+ xmlns_repository repo;
+ std::ostringstream os;
+
+ {
+ xml_writer writer(repo, os);
+ auto scope_root = writer.push_element_scope({nullptr, "root"});
+ writer.add_content(test_content);
+ }
+
+ std::string stream = os.str();
+
+ _handler hdl;
+
+ sax_parser<_handler> parser(stream, hdl);
+ parser.parse();
+
+ std::string content_read = hdl.os_content.str();
+ assert(test_content == content_read);
+ }
+}
+
+void test_move()
+{
+ xmlns_repository repo;
+
+ {
+ std::ostringstream os;
+ xml_writer writer(repo, os);
+
+ writer.push_element({nullptr, "foo"});
+
+ {
+ xml_writer moved(std::move(writer)); // move constructor
+ moved.add_content("stuff");
+ }
+
+ std::string stream = os.str();
+ assert(stream == "<?xml version=\"1.0\"?><foo>stuff</foo>");
+ }
+
+ {
+ std::ostringstream os;
+ xml_writer writer(repo, os);
+
+ writer.push_element({nullptr, "foo2"});
+
+ {
+ std::ostringstream os2;
+ xml_writer moved(repo, os2);
+
+ moved = std::move(writer); // move assignment.
+ moved.add_content("stuff2");
+ }
+
+ std::string stream = os.str();
+ assert(stream == "<?xml version=\"1.0\"?><foo2>stuff2</foo2>");
+ }
+}
+
+int main()
+{
+ test_encoded_content();
+ test_move();
+
+ return EXIT_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/yaml_parser_base.cpp b/src/parser/yaml_parser_base.cpp
new file mode 100644
index 0000000..df4db23
--- /dev/null
+++ b/src/parser/yaml_parser_base.cpp
@@ -0,0 +1,512 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/yaml_parser_base.hpp>
+#include <orcus/cell_buffer.hpp>
+#include <orcus/parser_global.hpp>
+
+#include <mdds/sorted_string_map.hpp>
+
+#include <limits>
+#include <vector>
+#include <deque>
+#include <sstream>
+#include <algorithm>
+
+namespace orcus { namespace yaml {
+
+struct scope
+{
+ size_t width;
+ detail::scope_t type;
+
+ scope(size_t _width) : width(_width), type(detail::scope_t::unset) {}
+};
+
+struct parser_base::impl
+{
+ cell_buffer m_buffer;
+ std::vector<scope> m_scopes;
+ std::deque<std::string_view> m_line_buffer;
+ const char* m_document;
+
+ size_t m_comment_length;
+
+ bool m_in_literal_block;
+ bool m_parsed_to_end_of_line;
+
+ detail::parse_token_t m_last_token;
+
+ impl() :
+ m_document(nullptr),
+ m_comment_length(0),
+ m_in_literal_block(false),
+ m_parsed_to_end_of_line(false),
+ m_last_token(detail::parse_token_t::unknown) {}
+};
+
+const size_t parser_base::parse_indent_blank_line = std::numeric_limits<size_t>::max();
+const size_t parser_base::parse_indent_end_of_stream = std::numeric_limits<size_t>::max() - 1;
+const size_t parser_base::scope_empty = std::numeric_limits<size_t>::max() - 2;
+
+parser_base::parser_base(std::string_view content) :
+ orcus::parser_base(content.data(), content.size()), mp_impl(std::make_unique<impl>()) {}
+
+parser_base::~parser_base() = default;
+
+void parser_base::push_parse_token(detail::parse_token_t t)
+{
+ mp_impl->m_last_token = t;
+}
+
+detail::parse_token_t parser_base::get_last_parse_token() const
+{
+ return mp_impl->m_last_token;
+}
+
+size_t parser_base::offset_last_char_of_line() const
+{
+ // The current parser position should be on the linefeed char after
+ // calling parse_to_end_of_line().
+ assert(mp_impl->m_parsed_to_end_of_line);
+
+ size_t pos = offset(); // character past the '\n'.
+ pos -= 1; // move back to the '\n'.
+
+ if (mp_impl->m_comment_length)
+ {
+ assert(mp_impl->m_comment_length < pos);
+ pos -= mp_impl->m_comment_length; // should be on the '#' character.
+ }
+
+ pos -= 1;
+
+ // Ignore any trailing whitespaces.
+ const char* p = mp_begin + pos;
+ for (; mp_begin < p && *p == ' '; --p, --pos)
+ ;
+
+ return pos;
+}
+
+size_t parser_base::parse_indent()
+{
+ for (size_t indent = 0; has_char(); next(), ++indent)
+ {
+ char c = cur_char();
+ switch (c)
+ {
+ case '#':
+ skip_comment();
+ return parse_indent_blank_line;
+ case '\n':
+ next();
+ return parse_indent_blank_line;
+ case ' ':
+ continue;
+ default:
+ return indent;
+ }
+ }
+
+ return parse_indent_end_of_stream;
+}
+
+std::string_view parser_base::parse_to_end_of_line()
+{
+ const char* p = mp_char;
+ size_t len = 0;
+ for (; has_char(); next(), ++len)
+ {
+ switch (cur_char())
+ {
+ case '#':
+ skip_comment();
+ break;
+ case '\'':
+ {
+ const char* p_open_quote = mp_char;
+
+ // character immediately after the closing quote.
+ const char* p_end =
+ parse_to_closing_single_quote(mp_char, remaining_size());
+
+ if (!p_end)
+ throw parse_error("parse_to_end_of_line: closing single quote was expected but not found.", offset());
+
+ size_t diff = p_end - p_open_quote - 1;
+
+ // Move the cursor to the closing quote.
+ next(diff);
+ len += diff;
+ assert(cur_char() == '\'');
+ continue;
+ }
+ break;
+ case '"':
+ {
+ const char* p_open_quote = mp_char;
+
+ // character immediately after the closing quote.
+ const char* p_end =
+ parse_to_closing_double_quote(mp_char, remaining_size());
+
+ if (!p_end)
+ throw parse_error("parse_to_end_of_line: closing double quote was expected but not found.", offset());
+
+ size_t diff = p_end - p_open_quote - 1;
+
+ // Move the cursor to the closing quote.
+ next(diff);
+ len += diff;
+ assert(cur_char() == '"');
+ continue;
+ }
+ break;
+ case '\n':
+ next();
+ break;
+ default:
+ continue;
+ }
+ break;
+ }
+
+ std::string_view ret(p, len);
+ mp_impl->m_parsed_to_end_of_line = true;
+ return ret;
+}
+
+void parser_base::skip_comment()
+{
+ assert(cur_char() == '#');
+
+ size_t n = 1;
+
+ for (; has_char(); next(), ++n)
+ {
+ if (cur_char() == '\n')
+ {
+ next();
+ break;
+ }
+ }
+
+ mp_impl->m_comment_length = n;
+}
+
+void parser_base::reset_on_new_line()
+{
+ mp_impl->m_comment_length = 0;
+ mp_impl->m_parsed_to_end_of_line = false;
+}
+
+size_t parser_base::get_scope() const
+{
+ return (mp_impl->m_scopes.empty()) ? scope_empty : mp_impl->m_scopes.back().width;
+}
+
+void parser_base::push_scope(size_t scope_width)
+{
+ mp_impl->m_scopes.emplace_back(scope_width);
+}
+
+void parser_base::clear_scopes()
+{
+ mp_impl->m_scopes.clear();
+}
+
+detail::scope_t parser_base::get_scope_type() const
+{
+ assert(!mp_impl->m_scopes.empty());
+ return mp_impl->m_scopes.back().type;
+}
+
+void parser_base::set_scope_type(detail::scope_t type)
+{
+ assert(!mp_impl->m_scopes.empty());
+ mp_impl->m_scopes.back().type = type;
+}
+
+size_t parser_base::pop_scope()
+{
+ assert(!mp_impl->m_scopes.empty());
+ mp_impl->m_scopes.pop_back();
+ return get_scope();
+}
+
+void parser_base::push_line_back(const char* p, size_t n)
+{
+ mp_impl->m_line_buffer.emplace_back(p, n);
+}
+
+std::string_view parser_base::pop_line_front()
+{
+ assert(!mp_impl->m_line_buffer.empty());
+
+ std::string_view ret = mp_impl->m_line_buffer.front();
+ mp_impl->m_line_buffer.pop_front();
+ return ret;
+}
+
+bool parser_base::has_line_buffer() const
+{
+ return !mp_impl->m_line_buffer.empty();
+}
+
+size_t parser_base::get_line_buffer_count() const
+{
+ return mp_impl->m_line_buffer.size();
+}
+
+std::string_view parser_base::merge_line_buffer()
+{
+ assert(!mp_impl->m_line_buffer.empty());
+
+ char sep = mp_impl->m_in_literal_block ? '\n' : ' ';
+
+ cell_buffer& buf = mp_impl->m_buffer;
+ buf.reset();
+
+ auto it = mp_impl->m_line_buffer.begin();
+ buf.append(it->data(), it->size());
+ ++it;
+
+ std::for_each(it, mp_impl->m_line_buffer.end(),
+ [&](std::string_view line)
+ {
+ buf.append(&sep, 1);
+ buf.append(line.data(), line.size());
+ }
+ );
+
+ mp_impl->m_line_buffer.clear();
+ mp_impl->m_in_literal_block = false;
+
+ return buf.str();
+}
+
+const char* parser_base::get_doc_hash() const
+{
+ return mp_impl->m_document;
+}
+
+void parser_base::set_doc_hash(const char* hash)
+{
+ mp_impl->m_document = hash;
+}
+
+namespace {
+
+namespace keyword {
+
+using map_type = mdds::sorted_string_map<detail::keyword_t, mdds::string_view_map_entry>;
+
+constexpr map_type::entry entries[] = {
+ { "FALSE", detail::keyword_t::boolean_false },
+ { "False", detail::keyword_t::boolean_false },
+ { "N", detail::keyword_t::boolean_false },
+ { "NO", detail::keyword_t::boolean_false },
+ { "NULL", detail::keyword_t::null },
+ { "No", detail::keyword_t::boolean_false },
+ { "Null", detail::keyword_t::null },
+ { "OFF", detail::keyword_t::boolean_false },
+ { "ON", detail::keyword_t::boolean_true },
+ { "Off", detail::keyword_t::boolean_false },
+ { "On", detail::keyword_t::boolean_true },
+ { "TRUE", detail::keyword_t::boolean_true },
+ { "True", detail::keyword_t::boolean_true },
+ { "Y", detail::keyword_t::boolean_true },
+ { "YES", detail::keyword_t::boolean_true },
+ { "Yes", detail::keyword_t::boolean_true },
+ { "false", detail::keyword_t::boolean_false },
+ { "n", detail::keyword_t::boolean_false },
+ { "no", detail::keyword_t::boolean_false },
+ { "null", detail::keyword_t::null },
+ { "off", detail::keyword_t::boolean_false },
+ { "on", detail::keyword_t::boolean_true },
+ { "true", detail::keyword_t::boolean_true },
+ { "y", detail::keyword_t::boolean_true },
+ { "yes", detail::keyword_t::boolean_true },
+ { "~", detail::keyword_t::null },
+};
+
+const map_type& get()
+{
+ static const map_type map(entries, std::size(entries), detail::keyword_t::unknown);
+ return map;
+}
+
+} // namespace keyword
+
+void throw_quoted_string_parse_error(
+ const char* func_name, const parse_quoted_string_state& ret, std::ptrdiff_t offset)
+{
+ std::ostringstream os;
+ os << func_name << ": failed to parse ";
+ if (ret.length == parse_quoted_string_state::error_illegal_escape_char)
+ os << "due to the presence of illegal escape character.";
+ else if (ret.length == parse_quoted_string_state::error_no_closing_quote)
+ os << "because the closing quote was not found.";
+ else
+ os << "due to unknown reason.";
+
+ throw parse_error(os.str(), offset);
+}
+
+}
+
+detail::keyword_t parser_base::parse_keyword(const char* p, size_t len)
+{
+ return keyword::get().find({p, len});
+}
+
+parser_base::key_value parser_base::parse_key_value(const char* p, size_t len)
+{
+ size_t scope = get_scope();
+ assert(scope != scope_empty);
+
+ assert(*p != ' ');
+ assert(len);
+
+ const char* p_end = p + len;
+
+ key_value kv;
+
+ char last = 0;
+ bool key_found = false;
+
+ const char* p_head = p;
+
+ for (; p != p_end; ++p)
+ {
+ if (*p == ' ')
+ {
+ if (!key_found)
+ {
+ if (last == ':')
+ {
+ // Key found.
+ std::size_t n = p - p_head - 1;
+ kv.key = trim({p_head, n});
+ key_found = true;
+ p_head = nullptr;
+ }
+ }
+ }
+ else
+ {
+ if (!p_head)
+ p_head = p;
+ }
+
+ last = *p;
+ }
+
+ assert(p_head);
+
+ if (key_found)
+ {
+ // Key has already been found and the value comes after the ':'.
+ kv.value = std::string_view(p_head, p-p_head);
+ }
+ else if (last == ':')
+ {
+ // Line only contains a key and ends with ':'.
+ std::size_t n = p - p_head - 1;
+ kv.key = trim({p_head, n});
+ }
+ else
+ {
+ // Key has not been found.
+ detail::scope_t st = get_scope_type();
+ if (st == detail::scope_t::map)
+ throw parse_error("key was expected, but not found.", offset_last_char_of_line());
+ }
+
+ return kv;
+}
+
+std::string_view parser_base::parse_single_quoted_string_value(const char*& p, size_t max_length)
+{
+ parse_quoted_string_state ret =
+ parse_single_quoted_string(p, max_length, mp_impl->m_buffer);
+
+ if (!ret.str)
+ throw_quoted_string_parse_error("parse_single_quoted_string_value", ret, offset());
+
+ return std::string_view(ret.str, ret.length);
+}
+
+std::string_view parser_base::parse_double_quoted_string_value(const char*& p, size_t max_length)
+{
+ parse_quoted_string_state ret =
+ parse_double_quoted_string(p, max_length, mp_impl->m_buffer);
+
+ if (!ret.str)
+ throw_quoted_string_parse_error("parse_double_quoted_string_value", ret, offset());
+
+ return std::string_view(ret.str, ret.length);
+}
+
+void parser_base::skip_blanks(const char*& p, size_t len)
+{
+ const char* p_end = p + len;
+ for (; p != p_end && *p == ' '; ++p)
+ ;
+}
+
+void parser_base::start_literal_block()
+{
+ mp_impl->m_in_literal_block = true;
+}
+
+bool parser_base::in_literal_block() const
+{
+ return mp_impl->m_in_literal_block;
+}
+
+void parser_base::handle_line_in_literal(size_t indent)
+{
+ size_t cur_scope = get_scope();
+
+ if (!has_line_buffer())
+ {
+ // Start a new multi-line string scope.
+
+ if (indent == cur_scope)
+ throw parse_error("parse: first line of a literal block must be indented.", offset());
+
+ push_scope(indent);
+ set_scope_type(yaml::detail::scope_t::multi_line_string);
+ }
+ else
+ {
+ // The current scope is already a multi-line scope.
+ assert(get_scope_type() == yaml::detail::scope_t::multi_line_string);
+ size_t leading_indent = indent - cur_scope;
+ prev(leading_indent);
+ }
+
+ std::string_view line = parse_to_end_of_line();
+ push_line_back(line.data(), line.size());
+}
+
+void parser_base::handle_line_in_multi_line_string()
+{
+ if (get_scope_type() != yaml::detail::scope_t::multi_line_string)
+ set_scope_type(yaml::detail::scope_t::multi_line_string);
+
+ std::string_view line = parse_to_end_of_line();
+ line = trim(line);
+ assert(!line.empty());
+ push_line_back(line.data(), line.size());
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/yaml_parser_test.cpp b/src/parser/yaml_parser_test.cpp
new file mode 100644
index 0000000..88103db
--- /dev/null
+++ b/src/parser/yaml_parser_test.cpp
@@ -0,0 +1,32 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/yaml_parser.hpp>
+
+#include <string>
+
+void test_handler()
+{
+ constexpr std::string_view test_code =
+ "section-one:\n"
+ " - item 1\n"
+ " - item 2\n"
+ "\n";
+
+ orcus::yaml_handler hdl;
+ orcus::yaml_parser<orcus::yaml_handler> parser(test_code, hdl);
+ parser.parse();
+}
+
+int main()
+{
+ test_handler();
+
+ return EXIT_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/zip_archive.cpp b/src/parser/zip_archive.cpp
new file mode 100644
index 0000000..50d5da5
--- /dev/null
+++ b/src/parser/zip_archive.cpp
@@ -0,0 +1,601 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/zip_archive.hpp>
+#include <orcus/zip_archive_stream.hpp>
+#include <orcus/string_pool.hpp>
+
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
+#include <iostream>
+#include <unordered_map>
+#include <sstream>
+#include <string_view>
+#include <iomanip>
+
+#include <zlib.h>
+#include <zconf.h>
+
+#define ORCUS_DEBUG_ZIP_ARCHIVE 0
+
+namespace orcus {
+
+namespace {
+
+struct zip_file_param
+{
+ enum compress_method_type { stored = 0, deflated = 8 };
+
+ std::string_view filename;
+ compress_method_type compress_method;
+ std::size_t offset_file_header;
+ std::size_t size_compressed;
+ std::size_t size_uncompressed;
+
+ uint16_t version_made_by;
+ uint16_t minimum_version_needed;
+ uint16_t flags;
+ uint16_t last_modified_time;
+ uint16_t last_modified_date;
+
+ uint16_t filename_length;
+ uint16_t extra_field_length;
+ uint16_t comment_length;
+
+ uint16_t disk_id_where_file_starts;
+ uint16_t file_attributes_internal;
+ uint32_t file_attributes_external;
+
+ uint32_t crc32;
+};
+
+class zip_inflater
+{
+ z_stream m_zlib_cxt;
+
+ zip_inflater(); // disabled
+public:
+ zip_inflater(std::vector<unsigned char>& raw_buf, std::vector<unsigned char>& dest_buf, const zip_file_param& param)
+ {
+ memset(&m_zlib_cxt, 0, sizeof(m_zlib_cxt));
+ m_zlib_cxt.next_in = static_cast<Bytef*>(&raw_buf[0]);
+ m_zlib_cxt.avail_in = param.size_compressed;
+
+ m_zlib_cxt.next_out = static_cast<Bytef*>(&dest_buf[0]);
+ m_zlib_cxt.avail_out = param.size_uncompressed;
+ }
+
+ ~zip_inflater()
+ {
+ inflateEnd(&m_zlib_cxt);
+ }
+
+ bool init()
+ {
+ int err = inflateInit2(&m_zlib_cxt, -MAX_WBITS);
+ return err == Z_OK;
+ }
+
+ bool inflate()
+ {
+ int err = ::inflate(&m_zlib_cxt, Z_SYNC_FLUSH);
+ if (err >= 0 && m_zlib_cxt.msg)
+ return false;
+
+ return true;
+ }
+};
+
+/**
+ * Stream doesn't know its size; only its starting offset position within
+ * the file stream.
+ */
+class zip_stream_parser
+{
+ zip_archive_stream* m_stream;
+ size_t m_pos;
+ size_t m_pos_internal;
+
+ void read_string_to_buffer(size_t n, std::vector<unsigned char>& buf)
+ {
+ if (!n)
+ throw zip_error("attempt to read string of zero size.");
+
+ m_stream->seek(m_pos+m_pos_internal);
+ m_stream->read(&buf[0], n);
+ m_pos_internal += n;
+ }
+
+public:
+ zip_stream_parser() : m_stream(nullptr), m_pos(0), m_pos_internal(0) {}
+ zip_stream_parser(zip_archive_stream* stream, size_t pos) : m_stream(stream), m_pos(pos), m_pos_internal(0) {}
+
+ std::string read_string(size_t n)
+ {
+ std::vector<unsigned char> buf(n+1, '\0');
+ read_string_to_buffer(n, buf);
+ return std::string(reinterpret_cast<const char*>(&buf[0]));
+ }
+
+ std::vector<uint8_t> read_bytes(std::size_t n)
+ {
+ if (!n)
+ throw zip_error("attempt to read string of zero size.");
+
+ std::vector<uint8_t> buf;
+ m_stream->seek(m_pos+m_pos_internal);
+ m_stream->read(buf.data(), n);
+ m_pos_internal += n;
+ return buf;
+ }
+
+ std::string_view read_string(size_t n, string_pool& pool)
+ {
+ std::vector<unsigned char> buf(n+1, '\0');
+ read_string_to_buffer(n, buf);
+ return pool.intern({reinterpret_cast<const char*>(buf.data()), n}).first;
+ }
+
+ void skip_bytes(size_t n)
+ {
+ m_pos_internal += n;
+ }
+
+ uint32_t read_4bytes()
+ {
+ m_stream->seek(m_pos+m_pos_internal);
+ unsigned char buf[4];
+ m_stream->read(&buf[0], 4);
+ m_pos_internal += 4;
+
+ uint32_t ret = buf[0];
+ ret |= (buf[1] << 8);
+ ret |= (buf[2] << 16);
+ ret |= (buf[3] << 24);
+
+ return ret;
+ }
+
+ uint16_t read_2bytes()
+ {
+ m_stream->seek(m_pos+m_pos_internal);
+ unsigned char buf[2];
+ m_stream->read(&buf[0], 2);
+ m_pos_internal += 2;
+
+ uint16_t ret = buf[0];
+ ret |= (buf[1] << 8);
+
+ return ret;
+ }
+
+ size_t tell() const
+ {
+ return m_pos + m_pos_internal;
+ }
+};
+
+/**
+ * Content of the end part of the central directory.
+ */
+struct central_dir_end
+{
+ uint32_t magic_number;
+ uint16_t this_disk_id;
+ uint16_t central_dir_disk_id;
+ uint16_t num_central_dir_records_local;
+ uint16_t num_celtral_dir_records_total;
+ uint32_t size_central_dir;
+ size_t central_dir_pos;
+ uint16_t comment_length;
+};
+
+} // anonymous namespace
+
+
+zip_file_entry_header::zip_file_entry_header() = default;
+zip_file_entry_header::zip_file_entry_header(const zip_file_entry_header& other) = default;
+zip_file_entry_header::zip_file_entry_header(zip_file_entry_header&& other) = default;
+zip_file_entry_header::~zip_file_entry_header() = default;
+
+zip_file_entry_header& zip_file_entry_header::operator=(const zip_file_entry_header& other) = default;
+zip_file_entry_header& zip_file_entry_header::operator=(zip_file_entry_header&& other) = default;
+
+std::ostream& operator<<(std::ostream& os, const zip_file_entry_header& header)
+{
+ os << "header signature: 0x" << std::hex << std::setfill('0') << std::setw(8) << header.header_signature << "\n"
+ << "version needed to extract: " << header.required_version << "\n"
+ << "general purpose bit flag: 0x" << std::hex << std::setfill('0') << std::setw(4) << header.flag << "\n"
+ << "compression method: " << header.compression_method << "\n"
+ << "last modified time: " << header.last_modified_time << "\n"
+ << "last modified date: " << header.last_modified_date << "\n"
+ << "crc32: 0x" << std::hex << std::setfill('0') << std::setw(8) << header.crc32 << "\n"
+ << "compressed size: " << header.compressed_size << "\n"
+ << "uncompressed size: " << header.uncompressed_size << "\n"
+ << "filename: " << header.filename << "\n"
+ << "extra field length: " << header.extra_field.size();
+
+ return os;
+}
+
+class zip_archive::impl
+{
+ typedef std::vector<zip_file_param> file_params_type;
+ typedef std::unordered_map<std::string_view, std::size_t> filename_map_type;
+
+ string_pool m_pool;
+ zip_archive_stream* m_stream;
+ off_t m_stream_size;
+ size_t m_central_dir_pos;
+
+ zip_stream_parser m_central_dir_end;
+
+ file_params_type m_file_params;
+ filename_map_type m_filenames;
+
+public:
+ impl(zip_archive_stream* stream);
+
+ void load();
+ zip_file_entry_header get_file_entry_header(std::size_t index) const;
+ zip_file_entry_header get_file_entry_header(std::string_view name) const;
+ std::string_view get_file_entry_name(size_t pos) const;
+
+ size_t get_file_entry_count() const
+ {
+ return m_file_params.size();
+ }
+
+ std::vector<unsigned char> read_file_entry(std::string_view entry_name) const;
+
+private:
+
+ /**
+ * Find the central directory of a zip file, located toward the end before
+ * the global comment, and starts with the byte sequence of 0x504b0506.
+ */
+ size_t seek_central_dir();
+
+ void read_central_dir_end();
+ void read_file_entries();
+};
+
+zip_archive::impl::impl(zip_archive_stream* stream) :
+ m_stream(stream), m_stream_size(0), m_central_dir_pos(0)
+{
+ if (!m_stream)
+ throw zip_error("null stream is not allowed.");
+
+ m_stream_size = m_stream->size();
+}
+
+void zip_archive::impl::load()
+{
+ size_t central_dir_end_pos = seek_central_dir();
+ if (!central_dir_end_pos)
+ throw zip_error("failed to seek the end position of the central directory");
+
+ m_central_dir_end = zip_stream_parser(m_stream, central_dir_end_pos);
+
+ // Read the end part of the central directory.
+ read_central_dir_end();
+
+ // Read file entries that are in the front part of the central directory.
+ read_file_entries();
+}
+
+zip_file_entry_header zip_archive::impl::get_file_entry_header(std::size_t index) const
+{
+ if (index >= m_file_params.size())
+ throw zip_error("invalid file entry index.");
+
+ const zip_file_param& param = m_file_params[index];
+ zip_stream_parser file_header(m_stream, param.offset_file_header);
+
+ zip_file_entry_header header;
+
+ header.header_signature = file_header.read_4bytes();
+ header.required_version = file_header.read_2bytes();
+ header.flag = file_header.read_2bytes();
+ header.compression_method = file_header.read_2bytes();
+ header.last_modified_time = file_header.read_2bytes();
+ header.last_modified_date = file_header.read_2bytes();
+ header.crc32 = file_header.read_4bytes();
+ header.compressed_size = file_header.read_4bytes();
+ header.uncompressed_size = file_header.read_4bytes();
+ uint16_t filename_len = file_header.read_2bytes();
+ uint16_t extra_field_len = file_header.read_2bytes();
+
+ if (filename_len)
+ header.filename = file_header.read_string(filename_len);
+
+ if (extra_field_len)
+ header.extra_field = file_header.read_bytes(extra_field_len);
+
+ return header;
+}
+
+zip_file_entry_header zip_archive::impl::get_file_entry_header(std::string_view name) const
+{
+ auto it = m_filenames.find(name);
+ if (it == m_filenames.end())
+ {
+ std::ostringstream os;
+ os << "file entry named '" << name << "' not found";
+ throw zip_error(os.str());
+ }
+
+ return get_file_entry_header(it->second);
+}
+
+void zip_archive::impl::read_file_entries()
+{
+ m_file_params.clear();
+
+ zip_stream_parser central_dir(m_stream, m_central_dir_pos);
+ uint32_t magic_num = central_dir.read_4bytes();
+
+ while (magic_num == 0x02014b50)
+ {
+ zip_file_param param;
+
+ param.version_made_by = central_dir.read_2bytes();
+ param.minimum_version_needed = central_dir.read_2bytes();
+ param.flags = central_dir.read_2bytes();
+ param.compress_method =
+ static_cast<zip_file_param::compress_method_type>(central_dir.read_2bytes());
+
+ param.last_modified_time = central_dir.read_2bytes();
+ param.last_modified_date = central_dir.read_2bytes();
+ param.crc32 = central_dir.read_4bytes();
+ param.size_compressed = central_dir.read_4bytes();
+ param.size_uncompressed = central_dir.read_4bytes();
+ param.filename_length = central_dir.read_2bytes();
+ param.extra_field_length = central_dir.read_2bytes();
+ param.comment_length = central_dir.read_2bytes();
+ param.disk_id_where_file_starts = central_dir.read_2bytes();
+ param.file_attributes_internal = central_dir.read_2bytes();
+ param.file_attributes_external = central_dir.read_4bytes();
+ param.offset_file_header = central_dir.read_4bytes();
+
+ if (param.filename_length)
+ param.filename = central_dir.read_string(param.filename_length, m_pool);
+
+ if (param.extra_field_length)
+ // Ignore extra field for now.
+ central_dir.skip_bytes(param.extra_field_length);
+
+ if (param.comment_length)
+ // Ignore file comment for now.
+ central_dir.skip_bytes(param.comment_length);
+
+ magic_num = central_dir.read_4bytes(); // magic number for the next entry.
+
+ m_file_params.push_back(param);
+ m_filenames.insert(filename_map_type::value_type(param.filename, m_file_params.size()-1));
+
+#if ORCUS_DEBUG_ZIP_ARCHIVE
+ std::cout << "-- file entries" << std::endl;
+ printf( " magic number: 0x%8.8x\n", magic_num);
+ std::cout << " version made by: " << param.version_made_by << std::endl;
+ std::cout << " minimum version needed to extract: " << param.minimum_version_needed << std::endl;
+ printf( " general purpose bit flag: 0x%4.4x\n", param.flags);
+ std::cout << " compression method: " << param.compress_method << " (0=stored, 8=deflated)" << std::endl;
+ std::cout << " file last modified time: " << param.last_modified_time << std::endl;
+ std::cout << " file last modified date: " << param.last_modified_date << std::endl;
+ printf( " crc32: 0x%8.8x\n", param.crc32);
+ std::cout << " compressed size: " << param.size_compressed << std::endl;
+ std::cout << " uncompressed size: " << param.size_uncompressed << std::endl;
+ std::cout << " file name length: " << param.filename_length << std::endl;
+ std::cout << " extra field length: " << param.extra_field_length << std::endl;
+ std::cout << " file comment length: " << param.comment_length << std::endl;
+ std::cout << " disk number where file starts: " << param.disk_id_where_file_starts << std::endl;
+ printf( " internal file attributes: 0x%4.4x\n", param.file_attributes_internal);
+ printf( " external file attributes: 0x%8.8x\n", param.file_attributes_external);
+ std::cout << " relative offset of local file header: " << param.offset_file_header << std::endl;
+
+ if (param.filename_length)
+ std::cout << " filename: '" << param.filename << "'" << std::endl;
+
+ std::cout << "--" << std::endl;
+#endif
+ }
+}
+
+std::string_view zip_archive::impl::get_file_entry_name(std::size_t pos) const
+{
+ if (pos >= m_file_params.size())
+ return std::string_view{};
+
+ return m_file_params[pos].filename;
+}
+
+std::vector<unsigned char> zip_archive::impl::read_file_entry(std::string_view entry_name) const
+{
+ filename_map_type::const_iterator it = m_filenames.find(entry_name);
+ if (it == m_filenames.end())
+ {
+ std::ostringstream os;
+ os << "entry named '" << entry_name << "' not found";
+ throw zip_error(os.str());
+ }
+
+
+ size_t index = it->second;
+ if (index >= m_file_params.size())
+ throw zip_error("entry index is out-of-bound");
+
+ const zip_file_param& param = m_file_params[index];
+
+ // Skip the file header section.
+ zip_stream_parser file_header(m_stream, param.offset_file_header);
+ file_header.skip_bytes(4);
+ file_header.skip_bytes(2);
+ file_header.skip_bytes(2);
+ file_header.skip_bytes(2);
+ file_header.skip_bytes(2);
+ file_header.skip_bytes(2);
+ file_header.skip_bytes(4);
+ file_header.skip_bytes(4);
+ file_header.skip_bytes(4);
+ uint16_t filename_len = file_header.read_2bytes();
+ uint16_t extra_field_len = file_header.read_2bytes();
+ file_header.skip_bytes(filename_len);
+ file_header.skip_bytes(extra_field_len);
+
+ // Data section is immediately followed by the header section.
+ m_stream->seek(file_header.tell());
+
+ std::vector<unsigned char> raw_buf(param.size_compressed+1, 0);
+ m_stream->read(raw_buf.data(), param.size_compressed);
+
+ switch (param.compress_method)
+ {
+ case zip_file_param::stored:
+ {
+ // Not compressed at all.
+ return raw_buf;
+ }
+ case zip_file_param::deflated:
+ {
+ // deflate compression
+ std::vector<unsigned char> zip_buf(param.size_uncompressed+1, 0); // null-terminated
+ zip_inflater inflater(raw_buf, zip_buf, param);
+ if (!inflater.init())
+ throw zip_error("error during initialization of inflater");
+
+ if (!inflater.inflate())
+ throw zip_error("error during inflate.");
+
+ return zip_buf;
+ }
+ }
+
+ throw std::logic_error("compress method can be either 'stored' or 'deflated', but neither has happened");
+}
+
+size_t zip_archive::impl::seek_central_dir()
+{
+ // Search for the position of 0x06054b50 (read in little endian order - so
+ // it's 0x50, 0x4b, 0x05, 0x06 in this order) somewhere near the end of
+ // the stream.
+
+ unsigned char magic[] = { 0x06, 0x05, 0x4b, 0x50 };
+ size_t n_magic = 4;
+
+ off_t max_comment_size = 0xffff;
+
+ size_t buf_size = 22 + max_comment_size; // central directory size is 22 + n (n maxing at 0xffff).
+ std::vector<unsigned char> buf(buf_size);
+
+ // Read stream backward and try to find the magic number.
+
+ size_t read_end_pos = m_stream_size;
+ while (read_end_pos)
+ {
+ if (read_end_pos < buf.size())
+ // Last segment to read.
+ buf.resize(read_end_pos);
+
+ size_t read_pos = read_end_pos - buf.size();
+ m_stream->seek(read_pos);
+ m_stream->read(&buf[0], buf.size());
+
+ // Search this byte segment for the magic number.
+ std::vector<unsigned char>::reverse_iterator i = buf.rbegin(), ie = buf.rend();
+ size_t magic_pos = 0;
+ for (; i != ie; ++i)
+ {
+ // 06 05 4b 50
+ if (*i == magic[magic_pos])
+ {
+ ++magic_pos;
+ if (magic_pos == n_magic)
+ {
+ // magic number is found.
+ size_t dist = distance(buf.rbegin(), i) + 1;
+ size_t pos = read_end_pos - dist;
+ return pos;
+ }
+ }
+ else
+ magic_pos = 0;
+ }
+
+ read_end_pos -= buf.size();
+ }
+
+ return 0;
+}
+
+void zip_archive::impl::read_central_dir_end()
+{
+ central_dir_end content;
+ content.magic_number = m_central_dir_end.read_4bytes();
+ content.this_disk_id = m_central_dir_end.read_2bytes();
+ content.central_dir_disk_id = m_central_dir_end.read_2bytes();
+ content.num_central_dir_records_local = m_central_dir_end.read_2bytes();
+ content.num_celtral_dir_records_total = m_central_dir_end.read_2bytes();
+ content.size_central_dir = m_central_dir_end.read_4bytes();
+ content.central_dir_pos = m_central_dir_end.read_4bytes();
+ m_central_dir_pos = content.central_dir_pos;
+
+ content.comment_length = m_central_dir_end.read_2bytes();
+
+#if ORCUS_DEBUG_ZIP_ARCHIVE
+ std::cout << "-- central directory content" << std::endl;
+ printf(" magic number: 0x%8.8x\n", content.magic_number);
+ std::cout << " number of this disk: " << content.this_disk_id << std::endl;
+ std::cout << " disk where central directory starts: " << content.central_dir_disk_id << std::endl;
+ std::cout << " number of central directory records on this disk: " << content.num_central_dir_records_local << std::endl;
+ std::cout << " total number of central directory records: " << content.num_celtral_dir_records_total << std::endl;
+ std::cout << " size of central directory: " << content.size_central_dir << std::endl;
+ std::cout << " offset of start of central directory, relative to start of archive: " << content.central_dir_pos << std::endl;
+ std::cout << " comment length: " << content.comment_length << std::endl;
+ std::cout << "--" << std::endl;
+#endif
+}
+
+zip_archive::zip_archive(zip_archive_stream* stream) : mp_impl(std::make_unique<impl>(stream))
+{
+}
+
+zip_archive::~zip_archive() = default;
+
+void zip_archive::load()
+{
+ mp_impl->load();
+}
+
+zip_file_entry_header zip_archive::get_file_entry_header(std::size_t index) const
+{
+ return mp_impl->get_file_entry_header(index);
+}
+
+zip_file_entry_header zip_archive::get_file_entry_header(std::string_view name) const
+{
+ return mp_impl->get_file_entry_header(name);
+}
+
+std::string_view zip_archive::get_file_entry_name(std::size_t index) const
+{
+ return mp_impl->get_file_entry_name(index);
+}
+
+size_t zip_archive::get_file_entry_count() const
+{
+ return mp_impl->get_file_entry_count();
+}
+
+std::vector<unsigned char> zip_archive::read_file_entry(std::string_view entry_name) const
+{
+ return mp_impl->read_file_entry(entry_name);
+}
+
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/zip_archive_stream.cpp b/src/parser/zip_archive_stream.cpp
new file mode 100644
index 0000000..776ac14
--- /dev/null
+++ b/src/parser/zip_archive_stream.cpp
@@ -0,0 +1,113 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/zip_archive_stream.hpp"
+#include "orcus/zip_archive.hpp"
+
+#include <sstream>
+#include <cstring>
+
+#ifdef _MSC_VER
+#define fseeko _fseeki64
+#define ftello _ftelli64
+#endif
+
+using namespace std;
+
+namespace orcus {
+
+zip_archive_stream::~zip_archive_stream() {}
+
+zip_archive_stream_fd::zip_archive_stream_fd(const char* filepath) :
+ m_stream(fopen(filepath, "rb"))
+{
+ if (!m_stream)
+ {
+ // Fail early at instantiation time.
+ ostringstream os;
+ os << "failed to open " << filepath << " for reading";
+ throw zip_error(os.str());
+ }
+}
+
+zip_archive_stream_fd::~zip_archive_stream_fd()
+{
+ if (m_stream)
+ fclose(m_stream);
+}
+
+size_t zip_archive_stream_fd::size() const
+{
+ if (fseeko(m_stream, 0, SEEK_END))
+ throw zip_error("failed to set seek position to the end of stream.");
+
+ return ftello(m_stream);
+}
+
+size_t zip_archive_stream_fd::tell() const
+{
+ return ftello(m_stream);
+}
+
+void zip_archive_stream_fd::read(unsigned char* buffer, size_t length) const
+{
+ size_t size_read = fread(buffer, 1, length, m_stream);
+ if (size_read != length)
+ throw zip_error("actual size read doesn't match what was expected.");
+}
+
+void zip_archive_stream_fd::seek(size_t pos)
+{
+ if (fseeko(m_stream, pos, SEEK_SET))
+ {
+ ostringstream os;
+ os << "failed to set seek position to " << pos << ".";
+ throw zip_error(os.str());
+ }
+}
+
+
+zip_archive_stream_blob::zip_archive_stream_blob(const uint8_t* blob, std::size_t size) :
+ m_blob(blob), m_cur(blob), m_size(size) {}
+
+zip_archive_stream_blob::~zip_archive_stream_blob() {}
+
+size_t zip_archive_stream_blob::size() const
+{
+ return m_size;
+}
+
+size_t zip_archive_stream_blob::tell() const
+{
+ return std::distance(m_blob, m_cur);
+}
+
+void zip_archive_stream_blob::seek(size_t pos)
+{
+ if (pos > m_size)
+ {
+ ostringstream os;
+ os << "failed to seek position to " << pos << ".";
+ throw zip_error(os.str());
+ }
+ m_cur = m_blob + pos;
+}
+
+void zip_archive_stream_blob::read(unsigned char* buffer, size_t length) const
+{
+ if (!length)
+ return;
+ // First, make sure we have enough blob to satisfy the requested stream length.
+ const size_t length_available = m_size - tell();
+ if (length_available < length)
+ throw zip_error("There is not enough stream left to fill requested length.");
+
+ memcpy(buffer, m_cur, length);
+}
+
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/parser/zip_archive_test.cpp b/src/parser/zip_archive_test.cpp
new file mode 100644
index 0000000..bbaa597
--- /dev/null
+++ b/src/parser/zip_archive_test.cpp
@@ -0,0 +1,98 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "test_global.hpp"
+#include <algorithm>
+#include <cstdlib>
+#include <vector>
+
+#include <orcus/zip_archive_stream.hpp>
+#include <orcus/zip_archive.hpp>
+
+#include "filesystem_env.hpp"
+
+#define ASSERT_THROW(expr) \
+try \
+{ \
+ expr; \
+ assert(0); \
+} \
+catch (...) \
+{ \
+}
+
+using namespace orcus;
+
+void test_zip_archive_stream(zip_archive_stream* const strm, const unsigned char* const data, std::size_t const length)
+{
+ assert(strm->size() == length);
+ assert(strm->tell() == 0);
+
+ std::vector<unsigned char> buffer(length, 0);
+ unsigned char* buf = buffer.data();
+
+ strm->read(buf, 2);
+ assert(std::equal(data, data + 2, buf));
+ assert(strm->tell() == 0);
+ strm->read(buf, length);
+ assert(std::equal(data, data + length, buf));
+ ASSERT_THROW(strm->read(buf, length + 1));
+ strm->read(buf, 0);
+
+ strm->seek(2);
+ assert(strm->tell() == 2);
+ strm->read(buf, 2);
+ assert(std::equal(data + 2, data + 4, buf));
+ strm->seek(length);
+ assert(strm->tell() == length);
+ ASSERT_THROW(strm->seek(length + 1));
+ assert(strm->tell() == length);
+}
+
+void test_zip_archive_stream_blob()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ const unsigned char data[] = "My hovercraft is full of eels.";
+ zip_archive_stream_blob strm(data, sizeof(data));
+ test_zip_archive_stream(&strm, data, sizeof(data));
+}
+
+void test_zip_archive_file_entry_header()
+{
+ ORCUS_TEST_FUNC_SCOPE;
+
+ fs::path filepath{SRCDIR"/test/ods/raw-values-1/input.ods"};
+ assert(fs::is_regular_file(filepath));
+
+ zip_archive_stream_fd strm(filepath.string().c_str());
+
+ zip_archive archive(&strm);
+ archive.load();
+ std::size_t n_entries = archive.get_file_entry_count();
+ for (std::size_t i = 0; i < n_entries; ++i)
+ {
+ std::string_view name = archive.get_file_entry_name(i);
+ std::cout << "* entry name: " << name << std::endl;
+ zip_file_entry_header header = archive.get_file_entry_header(i);
+ assert(header.filename == name);
+ assert(header.header_signature == 0x04034b50);
+
+ // 0 = none; 8 = deflate
+ assert(header.compression_method == 0 || header.compression_method == 8);
+ }
+}
+
+int main()
+{
+ test_zip_archive_stream_blob();
+ test_zip_archive_file_entry_header();
+
+ return EXIT_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/python/Makefile.am b/src/python/Makefile.am
new file mode 100644
index 0000000..a1199fd
--- /dev/null
+++ b/src/python/Makefile.am
@@ -0,0 +1,140 @@
+if BUILD_PYTHON
+
+AM_CPPFLAGS = \
+ -I$(top_srcdir)/include \
+ -I$(top_srcdir)/src/include \
+ $(BOOST_CPPFLAGS) \
+ $(PYTHON_CFLAGS) \
+ $(MDDS_CFLAGS) \
+ $(LIBIXION_CFLAGS)
+
+pyexec_LTLIBRARIES = _orcus.la _orcus_json.la
+
+_orcus_la_SOURCES = \
+ python.cpp \
+ global.hpp \
+ global.cpp \
+ memory.hpp \
+ memory.cpp \
+ root.hpp \
+ root.cpp \
+ xlsx.hpp \
+ xlsx.cpp \
+ xls_xml.hpp \
+ xls_xml.cpp \
+ ods.hpp \
+ ods.cpp \
+ csv.hpp \
+ csv.cpp \
+ gnumeric.hpp \
+ gnumeric.cpp
+
+_orcus_la_LDFLAGS = -module -avoid-version -export-symbols-regex PyInit__orcus
+_orcus_la_LIBADD = \
+ ../liborcus/liborcus-@ORCUS_API_VERSION@.la \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ $(PYTHON_LIBS)
+
+if BUILD_SPREADSHEET_MODEL
+
+_orcus_la_SOURCES += \
+ document.hpp \
+ document.cpp \
+ sheet.hpp \
+ sheet.cpp \
+ sheet_rows.hpp \
+ sheet_rows.cpp \
+ cell.hpp \
+ cell.cpp \
+ formula_token.hpp \
+ formula_token.cpp \
+ formula_tokens.hpp \
+ formula_tokens.cpp \
+ named_expressions.hpp \
+ named_expressions.cpp \
+ named_expression.hpp \
+ named_expression.cpp
+
+_orcus_la_LIBADD += \
+ ../spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+ $(LIBIXION_LIBS)
+
+endif # BUILD_SPREADSHEET_MODEL
+
+_orcus_json_la_SOURCES = \
+ json.cpp
+
+_orcus_json_la_LDFLAGS = -module -avoid-version -export-symbols-regex PyInit__orcus_json
+_orcus_json_la_LIBADD = \
+ ../liborcus/liborcus-@ORCUS_API_VERSION@.la \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ $(PYTHON_LIBS)
+
+orcusdir = $(pythondir)/orcus
+orcustoolsdir = $(pythondir)/orcus/tools
+
+orcus_DATA = \
+ ./orcus/__init__.py \
+ ./orcus/csv.py \
+ ./orcus/gnumeric.py \
+ ./orcus/json.py \
+ ./orcus/ods.py \
+ ./orcus/xls_xml.py \
+ ./orcus/xlsx.py
+
+orcustools_DATA = \
+ ./orcus/tools/__init__.py \
+ ./orcus/tools/bugzilla.py \
+ ./orcus/tools/file_processor.py
+
+EXTRA_DIST = \
+ ./orcus/__init__.py \
+ ./orcus/csv.py \
+ ./orcus/gnumeric.py \
+ ./orcus/json.py \
+ ./orcus/ods.py \
+ ./orcus/xls_xml.py \
+ ./orcus/xlsx.py \
+ ./orcus/tools/__init__.py \
+ ./orcus/tools/bugzilla.py \
+ ./orcus/tools/file_processor.py
+
+AM_TESTS_ENVIRONMENT = \
+ PYTHONPATH=$(top_srcdir)/src/python:.libs$${PYTHONPATH:+:$${PYTHONPATH}}; export PYTHONPATH; \
+ BUILDDIR=$(top_builddir); export BUILDDIR;
+
+TESTS = \
+ ../../test/python/test_json.py \
+ ../../test/python/test_module.py \
+ ../../test/python/test_csv.py \
+ ../../test/python/test_csv_export.py
+
+if WITH_PYTHON_XLSX
+
+TESTS += ../../test/python/test_xlsx.py
+AM_TESTS_ENVIRONMENT += export WITH_PYTHON_XLSX=1;
+
+endif # WITH_PYTHON_XLSX
+
+if WITH_PYTHON_ODS
+
+TESTS += ../../test/python/test_ods.py
+AM_TESTS_ENVIRONMENT += export WITH_PYTHON_ODS=1;
+
+endif # WITH_PYTHON_ODS
+
+if WITH_PYTHON_XLS_XML
+
+TESTS += ../../test/python/test_xls_xml.py
+AM_TESTS_ENVIRONMENT += export WITH_PYTHON_XLS_XML=1;
+
+endif # WITH_PYTHON_XLS_XML
+
+if WITH_PYTHON_GNUMERIC
+
+TESTS += ../../test/python/test_gnumeric.py
+AM_TESTS_ENVIRONMENT += export WITH_PYTHON_GNUMERIC=1;
+
+endif # WITH_PYTHON_GNUMERIC
+
+endif # BUILD_PYTHON
diff --git a/src/python/Makefile.in b/src/python/Makefile.in
new file mode 100644
index 0000000..fff782a
--- /dev/null
+++ b/src/python/Makefile.in
@@ -0,0 +1,1405 @@
+# Makefile.in generated by automake 1.16.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2021 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.
+
+@SET_MAKE@
+
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+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@
+@BUILD_PYTHON_TRUE@@BUILD_SPREADSHEET_MODEL_TRUE@am__append_1 = \
+@BUILD_PYTHON_TRUE@@BUILD_SPREADSHEET_MODEL_TRUE@ document.hpp \
+@BUILD_PYTHON_TRUE@@BUILD_SPREADSHEET_MODEL_TRUE@ document.cpp \
+@BUILD_PYTHON_TRUE@@BUILD_SPREADSHEET_MODEL_TRUE@ sheet.hpp \
+@BUILD_PYTHON_TRUE@@BUILD_SPREADSHEET_MODEL_TRUE@ sheet.cpp \
+@BUILD_PYTHON_TRUE@@BUILD_SPREADSHEET_MODEL_TRUE@ sheet_rows.hpp \
+@BUILD_PYTHON_TRUE@@BUILD_SPREADSHEET_MODEL_TRUE@ sheet_rows.cpp \
+@BUILD_PYTHON_TRUE@@BUILD_SPREADSHEET_MODEL_TRUE@ cell.hpp \
+@BUILD_PYTHON_TRUE@@BUILD_SPREADSHEET_MODEL_TRUE@ cell.cpp \
+@BUILD_PYTHON_TRUE@@BUILD_SPREADSHEET_MODEL_TRUE@ formula_token.hpp \
+@BUILD_PYTHON_TRUE@@BUILD_SPREADSHEET_MODEL_TRUE@ formula_token.cpp \
+@BUILD_PYTHON_TRUE@@BUILD_SPREADSHEET_MODEL_TRUE@ formula_tokens.hpp \
+@BUILD_PYTHON_TRUE@@BUILD_SPREADSHEET_MODEL_TRUE@ formula_tokens.cpp \
+@BUILD_PYTHON_TRUE@@BUILD_SPREADSHEET_MODEL_TRUE@ named_expressions.hpp \
+@BUILD_PYTHON_TRUE@@BUILD_SPREADSHEET_MODEL_TRUE@ named_expressions.cpp \
+@BUILD_PYTHON_TRUE@@BUILD_SPREADSHEET_MODEL_TRUE@ named_expression.hpp \
+@BUILD_PYTHON_TRUE@@BUILD_SPREADSHEET_MODEL_TRUE@ named_expression.cpp
+
+@BUILD_PYTHON_TRUE@@BUILD_SPREADSHEET_MODEL_TRUE@am__append_2 = \
+@BUILD_PYTHON_TRUE@@BUILD_SPREADSHEET_MODEL_TRUE@ ../spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+@BUILD_PYTHON_TRUE@@BUILD_SPREADSHEET_MODEL_TRUE@ $(LIBIXION_LIBS)
+
+@BUILD_PYTHON_TRUE@@WITH_PYTHON_XLSX_TRUE@am__append_3 = ../../test/python/test_xlsx.py
+@BUILD_PYTHON_TRUE@@WITH_PYTHON_XLSX_TRUE@am__append_4 = export WITH_PYTHON_XLSX=1;
+@BUILD_PYTHON_TRUE@@WITH_PYTHON_ODS_TRUE@am__append_5 = ../../test/python/test_ods.py
+@BUILD_PYTHON_TRUE@@WITH_PYTHON_ODS_TRUE@am__append_6 = export WITH_PYTHON_ODS=1;
+@BUILD_PYTHON_TRUE@@WITH_PYTHON_XLS_XML_TRUE@am__append_7 = ../../test/python/test_xls_xml.py
+@BUILD_PYTHON_TRUE@@WITH_PYTHON_XLS_XML_TRUE@am__append_8 = export WITH_PYTHON_XLS_XML=1;
+@BUILD_PYTHON_TRUE@@WITH_PYTHON_GNUMERIC_TRUE@am__append_9 = ../../test/python/test_gnumeric.py
+@BUILD_PYTHON_TRUE@@WITH_PYTHON_GNUMERIC_TRUE@am__append_10 = export WITH_PYTHON_GNUMERIC=1;
+subdir = src/python
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
+ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_17.m4 \
+ $(top_srcdir)/m4/boost.m4 $(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)/m4/m4_ax_valgrind_check.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+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)$(pyexecdir)" "$(DESTDIR)$(orcusdir)" \
+ "$(DESTDIR)$(orcustoolsdir)"
+LTLIBRARIES = $(pyexec_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+@BUILD_PYTHON_TRUE@@BUILD_SPREADSHEET_MODEL_TRUE@am__DEPENDENCIES_2 = ../spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
+@BUILD_PYTHON_TRUE@@BUILD_SPREADSHEET_MODEL_TRUE@ $(am__DEPENDENCIES_1)
+@BUILD_PYTHON_TRUE@_orcus_la_DEPENDENCIES = ../liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_PYTHON_TRUE@ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_PYTHON_TRUE@ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+am___orcus_la_SOURCES_DIST = python.cpp global.hpp global.cpp \
+ memory.hpp memory.cpp root.hpp root.cpp xlsx.hpp xlsx.cpp \
+ xls_xml.hpp xls_xml.cpp ods.hpp ods.cpp csv.hpp csv.cpp \
+ gnumeric.hpp gnumeric.cpp document.hpp document.cpp sheet.hpp \
+ sheet.cpp sheet_rows.hpp sheet_rows.cpp cell.hpp cell.cpp \
+ formula_token.hpp formula_token.cpp formula_tokens.hpp \
+ formula_tokens.cpp named_expressions.hpp named_expressions.cpp \
+ named_expression.hpp named_expression.cpp
+@BUILD_PYTHON_TRUE@@BUILD_SPREADSHEET_MODEL_TRUE@am__objects_1 = \
+@BUILD_PYTHON_TRUE@@BUILD_SPREADSHEET_MODEL_TRUE@ document.lo \
+@BUILD_PYTHON_TRUE@@BUILD_SPREADSHEET_MODEL_TRUE@ sheet.lo \
+@BUILD_PYTHON_TRUE@@BUILD_SPREADSHEET_MODEL_TRUE@ sheet_rows.lo \
+@BUILD_PYTHON_TRUE@@BUILD_SPREADSHEET_MODEL_TRUE@ cell.lo \
+@BUILD_PYTHON_TRUE@@BUILD_SPREADSHEET_MODEL_TRUE@ formula_token.lo \
+@BUILD_PYTHON_TRUE@@BUILD_SPREADSHEET_MODEL_TRUE@ formula_tokens.lo \
+@BUILD_PYTHON_TRUE@@BUILD_SPREADSHEET_MODEL_TRUE@ named_expressions.lo \
+@BUILD_PYTHON_TRUE@@BUILD_SPREADSHEET_MODEL_TRUE@ named_expression.lo
+@BUILD_PYTHON_TRUE@am__orcus_la_OBJECTS = python.lo global.lo \
+@BUILD_PYTHON_TRUE@ memory.lo root.lo xlsx.lo xls_xml.lo ods.lo \
+@BUILD_PYTHON_TRUE@ csv.lo gnumeric.lo $(am__objects_1)
+_orcus_la_OBJECTS = $(am__orcus_la_OBJECTS)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+_orcus_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(_orcus_la_LDFLAGS) $(LDFLAGS) -o $@
+@BUILD_PYTHON_TRUE@am__orcus_la_rpath = -rpath $(pyexecdir)
+@BUILD_PYTHON_TRUE@_orcus_json_la_DEPENDENCIES = ../liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_PYTHON_TRUE@ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_PYTHON_TRUE@ $(am__DEPENDENCIES_1)
+am___orcus_json_la_SOURCES_DIST = json.cpp
+@BUILD_PYTHON_TRUE@am__orcus_json_la_OBJECTS = json.lo
+_orcus_json_la_OBJECTS = $(am__orcus_json_la_OBJECTS)
+_orcus_json_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(AM_CXXFLAGS) $(CXXFLAGS) $(_orcus_json_la_LDFLAGS) \
+ $(LDFLAGS) -o $@
+@BUILD_PYTHON_TRUE@am__orcus_json_la_rpath = -rpath $(pyexecdir)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/cell.Plo ./$(DEPDIR)/csv.Plo \
+ ./$(DEPDIR)/document.Plo ./$(DEPDIR)/formula_token.Plo \
+ ./$(DEPDIR)/formula_tokens.Plo ./$(DEPDIR)/global.Plo \
+ ./$(DEPDIR)/gnumeric.Plo ./$(DEPDIR)/json.Plo \
+ ./$(DEPDIR)/memory.Plo ./$(DEPDIR)/named_expression.Plo \
+ ./$(DEPDIR)/named_expressions.Plo ./$(DEPDIR)/ods.Plo \
+ ./$(DEPDIR)/python.Plo ./$(DEPDIR)/root.Plo \
+ ./$(DEPDIR)/sheet.Plo ./$(DEPDIR)/sheet_rows.Plo \
+ ./$(DEPDIR)/xls_xml.Plo ./$(DEPDIR)/xlsx.Plo
+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_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+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_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = $(_orcus_la_SOURCES) $(_orcus_json_la_SOURCES)
+DIST_SOURCES = $(am___orcus_la_SOURCES_DIST) \
+ $(am___orcus_json_la_SOURCES_DIST)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+DATA = $(orcus_DATA) $(orcustools_DATA)
+am__extra_recursive_targets = check-valgrind-recursive \
+ check-valgrind-memcheck-recursive \
+ check-valgrind-helgrind-recursive check-valgrind-drd-recursive \
+ check-valgrind-sgcheck-recursive
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+am__tty_colors_dummy = \
+ mgn= red= grn= lgn= blu= brg= std=; \
+ am__color_tests=no
+am__tty_colors = { \
+ $(am__tty_colors_dummy); \
+ if test "X$(AM_COLOR_TESTS)" = Xno; then \
+ am__color_tests=no; \
+ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+ am__color_tests=yes; \
+ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+ am__color_tests=yes; \
+ fi; \
+ if test $$am__color_tests = yes; then \
+ red=''; \
+ grn=''; \
+ lgn=''; \
+ blu=''; \
+ mgn=''; \
+ brg=''; \
+ std=''; \
+ fi; \
+}
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# 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
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# 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. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(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='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)'
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \
+ $(top_srcdir)/test-driver
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BOOST_CPPFLAGS = @BOOST_CPPFLAGS@
+BOOST_DATE_TIME_LDFLAGS = @BOOST_DATE_TIME_LDFLAGS@
+BOOST_DATE_TIME_LDPATH = @BOOST_DATE_TIME_LDPATH@
+BOOST_DATE_TIME_LIBS = @BOOST_DATE_TIME_LIBS@
+BOOST_FILESYSTEM_LDFLAGS = @BOOST_FILESYSTEM_LDFLAGS@
+BOOST_FILESYSTEM_LDPATH = @BOOST_FILESYSTEM_LDPATH@
+BOOST_FILESYSTEM_LIBS = @BOOST_FILESYSTEM_LIBS@
+BOOST_IOSTREAMS_LDFLAGS = @BOOST_IOSTREAMS_LDFLAGS@
+BOOST_IOSTREAMS_LDPATH = @BOOST_IOSTREAMS_LDPATH@
+BOOST_IOSTREAMS_LIBS = @BOOST_IOSTREAMS_LIBS@
+BOOST_LDPATH = @BOOST_LDPATH@
+BOOST_PROGRAM_OPTIONS_LDFLAGS = @BOOST_PROGRAM_OPTIONS_LDFLAGS@
+BOOST_PROGRAM_OPTIONS_LDPATH = @BOOST_PROGRAM_OPTIONS_LDPATH@
+BOOST_PROGRAM_OPTIONS_LIBS = @BOOST_PROGRAM_OPTIONS_LIBS@
+BOOST_ROOT = @BOOST_ROOT@
+BOOST_SYSTEM_LDFLAGS = @BOOST_SYSTEM_LDFLAGS@
+BOOST_SYSTEM_LDPATH = @BOOST_SYSTEM_LDPATH@
+BOOST_SYSTEM_LIBS = @BOOST_SYSTEM_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CSCOPE = @CSCOPE@
+CTAGS = @CTAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_VALGRIND_drd = @ENABLE_VALGRIND_drd@
+ENABLE_VALGRIND_helgrind = @ENABLE_VALGRIND_helgrind@
+ENABLE_VALGRIND_memcheck = @ENABLE_VALGRIND_memcheck@
+ENABLE_VALGRIND_sgcheck = @ENABLE_VALGRIND_sgcheck@
+ETAGS = @ETAGS@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+HAVE_CXX17 = @HAVE_CXX17@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+IXION_REQUIRED_API_VERSION = @IXION_REQUIRED_API_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBIXION_CFLAGS = @LIBIXION_CFLAGS@
+LIBIXION_LIBS = @LIBIXION_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MDDS_CFLAGS = @MDDS_CFLAGS@
+MDDS_LIBS = @MDDS_LIBS@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+ORCUS_API_VERSION = @ORCUS_API_VERSION@
+ORCUS_MAJOR_VERSION = @ORCUS_MAJOR_VERSION@
+ORCUS_MICRO_VERSION = @ORCUS_MICRO_VERSION@
+ORCUS_MINOR_VERSION = @ORCUS_MINOR_VERSION@
+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@
+PARQUET_CFLAGS = @PARQUET_CFLAGS@
+PARQUET_LIBS = @PARQUET_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POW_LIB = @POW_LIB@
+PYTHON = @PYTHON@
+PYTHON_CFLAGS = @PYTHON_CFLAGS@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VALGRIND = @VALGRIND@
+VALGRIND_ENABLED = @VALGRIND_ENABLED@
+VERSION = @VERSION@
+ZLIB_CFLAGS = @ZLIB_CFLAGS@
+ZLIB_LIBS = @ZLIB_LIBS@
+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@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+runstatedir = @runstatedir@
+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@
+valgrind_enabled_tools = @valgrind_enabled_tools@
+valgrind_tools = @valgrind_tools@
+@BUILD_PYTHON_TRUE@AM_CPPFLAGS = \
+@BUILD_PYTHON_TRUE@ -I$(top_srcdir)/include \
+@BUILD_PYTHON_TRUE@ -I$(top_srcdir)/src/include \
+@BUILD_PYTHON_TRUE@ $(BOOST_CPPFLAGS) \
+@BUILD_PYTHON_TRUE@ $(PYTHON_CFLAGS) \
+@BUILD_PYTHON_TRUE@ $(MDDS_CFLAGS) \
+@BUILD_PYTHON_TRUE@ $(LIBIXION_CFLAGS)
+
+@BUILD_PYTHON_TRUE@pyexec_LTLIBRARIES = _orcus.la _orcus_json.la
+@BUILD_PYTHON_TRUE@_orcus_la_SOURCES = python.cpp global.hpp \
+@BUILD_PYTHON_TRUE@ global.cpp memory.hpp memory.cpp root.hpp \
+@BUILD_PYTHON_TRUE@ root.cpp xlsx.hpp xlsx.cpp xls_xml.hpp \
+@BUILD_PYTHON_TRUE@ xls_xml.cpp ods.hpp ods.cpp csv.hpp csv.cpp \
+@BUILD_PYTHON_TRUE@ gnumeric.hpp gnumeric.cpp $(am__append_1)
+@BUILD_PYTHON_TRUE@_orcus_la_LDFLAGS = -module -avoid-version -export-symbols-regex PyInit__orcus
+@BUILD_PYTHON_TRUE@_orcus_la_LIBADD = ../liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_PYTHON_TRUE@ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_PYTHON_TRUE@ $(PYTHON_LIBS) $(am__append_2)
+@BUILD_PYTHON_TRUE@_orcus_json_la_SOURCES = \
+@BUILD_PYTHON_TRUE@ json.cpp
+
+@BUILD_PYTHON_TRUE@_orcus_json_la_LDFLAGS = -module -avoid-version -export-symbols-regex PyInit__orcus_json
+@BUILD_PYTHON_TRUE@_orcus_json_la_LIBADD = \
+@BUILD_PYTHON_TRUE@ ../liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_PYTHON_TRUE@ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_PYTHON_TRUE@ $(PYTHON_LIBS)
+
+@BUILD_PYTHON_TRUE@orcusdir = $(pythondir)/orcus
+@BUILD_PYTHON_TRUE@orcustoolsdir = $(pythondir)/orcus/tools
+@BUILD_PYTHON_TRUE@orcus_DATA = \
+@BUILD_PYTHON_TRUE@ ./orcus/__init__.py \
+@BUILD_PYTHON_TRUE@ ./orcus/csv.py \
+@BUILD_PYTHON_TRUE@ ./orcus/gnumeric.py \
+@BUILD_PYTHON_TRUE@ ./orcus/json.py \
+@BUILD_PYTHON_TRUE@ ./orcus/ods.py \
+@BUILD_PYTHON_TRUE@ ./orcus/xls_xml.py \
+@BUILD_PYTHON_TRUE@ ./orcus/xlsx.py
+
+@BUILD_PYTHON_TRUE@orcustools_DATA = \
+@BUILD_PYTHON_TRUE@ ./orcus/tools/__init__.py \
+@BUILD_PYTHON_TRUE@ ./orcus/tools/bugzilla.py \
+@BUILD_PYTHON_TRUE@ ./orcus/tools/file_processor.py
+
+@BUILD_PYTHON_TRUE@EXTRA_DIST = \
+@BUILD_PYTHON_TRUE@ ./orcus/__init__.py \
+@BUILD_PYTHON_TRUE@ ./orcus/csv.py \
+@BUILD_PYTHON_TRUE@ ./orcus/gnumeric.py \
+@BUILD_PYTHON_TRUE@ ./orcus/json.py \
+@BUILD_PYTHON_TRUE@ ./orcus/ods.py \
+@BUILD_PYTHON_TRUE@ ./orcus/xls_xml.py \
+@BUILD_PYTHON_TRUE@ ./orcus/xlsx.py \
+@BUILD_PYTHON_TRUE@ ./orcus/tools/__init__.py \
+@BUILD_PYTHON_TRUE@ ./orcus/tools/bugzilla.py \
+@BUILD_PYTHON_TRUE@ ./orcus/tools/file_processor.py
+
+@BUILD_PYTHON_TRUE@AM_TESTS_ENVIRONMENT = PYTHONPATH=$(top_srcdir)/src/python:.libs$${PYTHONPATH:+:$${PYTHONPATH}}; \
+@BUILD_PYTHON_TRUE@ export PYTHONPATH; \
+@BUILD_PYTHON_TRUE@ BUILDDIR=$(top_builddir); export BUILDDIR; \
+@BUILD_PYTHON_TRUE@ $(am__append_4) $(am__append_6) \
+@BUILD_PYTHON_TRUE@ $(am__append_8) $(am__append_10)
+@BUILD_PYTHON_TRUE@TESTS = ../../test/python/test_json.py \
+@BUILD_PYTHON_TRUE@ ../../test/python/test_module.py \
+@BUILD_PYTHON_TRUE@ ../../test/python/test_csv.py \
+@BUILD_PYTHON_TRUE@ ../../test/python/test_csv_export.py \
+@BUILD_PYTHON_TRUE@ $(am__append_3) $(am__append_5) \
+@BUILD_PYTHON_TRUE@ $(am__append_7) $(am__append_9)
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cpp .lo .log .o .obj .test .test$(EXEEXT) .trs
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/python/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign src/python/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+install-pyexecLTLIBRARIES: $(pyexec_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ @list='$(pyexec_LTLIBRARIES)'; test -n "$(pyexecdir)" || 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)$(pyexecdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(pyexecdir)" || exit 1; \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pyexecdir)'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pyexecdir)"; \
+ }
+
+uninstall-pyexecLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pyexec_LTLIBRARIES)'; test -n "$(pyexecdir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pyexecdir)/$$f'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pyexecdir)/$$f"; \
+ done
+
+clean-pyexecLTLIBRARIES:
+ -test -z "$(pyexec_LTLIBRARIES)" || rm -f $(pyexec_LTLIBRARIES)
+ @list='$(pyexec_LTLIBRARIES)'; \
+ locs=`for p in $$list; do echo $$p; done | \
+ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+ sort -u`; \
+ test -z "$$locs" || { \
+ echo rm -f $${locs}; \
+ rm -f $${locs}; \
+ }
+
+_orcus.la: $(_orcus_la_OBJECTS) $(_orcus_la_DEPENDENCIES) $(EXTRA__orcus_la_DEPENDENCIES)
+ $(AM_V_CXXLD)$(_orcus_la_LINK) $(am__orcus_la_rpath) $(_orcus_la_OBJECTS) $(_orcus_la_LIBADD) $(LIBS)
+
+_orcus_json.la: $(_orcus_json_la_OBJECTS) $(_orcus_json_la_DEPENDENCIES) $(EXTRA__orcus_json_la_DEPENDENCIES)
+ $(AM_V_CXXLD)$(_orcus_json_la_LINK) $(am__orcus_json_la_rpath) $(_orcus_json_la_OBJECTS) $(_orcus_json_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cell.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/csv.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/document.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/formula_token.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/formula_tokens.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/global.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnumeric.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memory.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/named_expression.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/named_expressions.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ods.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/python.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/root.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sheet.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sheet_rows.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xls_xml.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xlsx.Plo@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.cpp.o:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cpp.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cpp.lo:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-orcusDATA: $(orcus_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(orcus_DATA)'; test -n "$(orcusdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(orcusdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(orcusdir)" || 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)$(orcusdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(orcusdir)" || exit $$?; \
+ done
+
+uninstall-orcusDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(orcus_DATA)'; test -n "$(orcusdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(orcusdir)'; $(am__uninstall_files_from_dir)
+install-orcustoolsDATA: $(orcustools_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(orcustools_DATA)'; test -n "$(orcustoolsdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(orcustoolsdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(orcustoolsdir)" || 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)$(orcustoolsdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(orcustoolsdir)" || exit $$?; \
+ done
+
+uninstall-orcustoolsDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(orcustools_DATA)'; test -n "$(orcustoolsdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(orcustoolsdir)'; $(am__uninstall_files_from_dir)
+check-valgrind-local:
+check-valgrind-memcheck-local:
+check-valgrind-helgrind-local:
+check-valgrind-drd-local:
+check-valgrind-sgcheck-local:
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ 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-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ 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"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+ fi; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ elif test -n "$$redo_logs"; then \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
+ else \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+ fi; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
+ else \
+ color_start= color_end=; \
+ fi; \
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS:
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+../../test/python/test_json.py.log: ../../test/python/test_json.py
+ @p='../../test/python/test_json.py'; \
+ b='../../test/python/test_json.py'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+../../test/python/test_module.py.log: ../../test/python/test_module.py
+ @p='../../test/python/test_module.py'; \
+ b='../../test/python/test_module.py'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+../../test/python/test_csv.py.log: ../../test/python/test_csv.py
+ @p='../../test/python/test_csv.py'; \
+ b='../../test/python/test_csv.py'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+../../test/python/test_csv_export.py.log: ../../test/python/test_csv_export.py
+ @p='../../test/python/test_csv_export.py'; \
+ b='../../test/python/test_csv_export.py'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+../../test/python/test_xlsx.py.log: ../../test/python/test_xlsx.py
+ @p='../../test/python/test_xlsx.py'; \
+ b='../../test/python/test_xlsx.py'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+../../test/python/test_ods.py.log: ../../test/python/test_ods.py
+ @p='../../test/python/test_ods.py'; \
+ b='../../test/python/test_ods.py'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+../../test/python/test_xls_xml.py.log: ../../test/python/test_xls_xml.py
+ @p='../../test/python/test_xls_xml.py'; \
+ b='../../test/python/test_xls_xml.py'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+../../test/python/test_gnumeric.py.log: ../../test/python/test_gnumeric.py
+ @p='../../test/python/test_gnumeric.py'; \
+ b='../../test/python/test_gnumeric.py'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.test$(EXEEXT).log:
+@am__EXEEXT_TRUE@ @p='$<'; \
+@am__EXEEXT_TRUE@ $(am__set_b); \
+@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @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
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(DATA)
+installdirs:
+ for dir in "$(DESTDIR)$(pyexecdir)" "$(DESTDIR)$(orcusdir)" "$(DESTDIR)$(orcustoolsdir)"; 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:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -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)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+check-valgrind: check-valgrind-am
+
+check-valgrind-am: check-valgrind-local
+
+check-valgrind-drd: check-valgrind-drd-am
+
+check-valgrind-drd-am: check-valgrind-drd-local
+
+check-valgrind-helgrind: check-valgrind-helgrind-am
+
+check-valgrind-helgrind-am: check-valgrind-helgrind-local
+
+check-valgrind-memcheck: check-valgrind-memcheck-am
+
+check-valgrind-memcheck-am: check-valgrind-memcheck-local
+
+check-valgrind-sgcheck: check-valgrind-sgcheck-am
+
+check-valgrind-sgcheck-am: check-valgrind-sgcheck-local
+
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-pyexecLTLIBRARIES \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -f ./$(DEPDIR)/cell.Plo
+ -rm -f ./$(DEPDIR)/csv.Plo
+ -rm -f ./$(DEPDIR)/document.Plo
+ -rm -f ./$(DEPDIR)/formula_token.Plo
+ -rm -f ./$(DEPDIR)/formula_tokens.Plo
+ -rm -f ./$(DEPDIR)/global.Plo
+ -rm -f ./$(DEPDIR)/gnumeric.Plo
+ -rm -f ./$(DEPDIR)/json.Plo
+ -rm -f ./$(DEPDIR)/memory.Plo
+ -rm -f ./$(DEPDIR)/named_expression.Plo
+ -rm -f ./$(DEPDIR)/named_expressions.Plo
+ -rm -f ./$(DEPDIR)/ods.Plo
+ -rm -f ./$(DEPDIR)/python.Plo
+ -rm -f ./$(DEPDIR)/root.Plo
+ -rm -f ./$(DEPDIR)/sheet.Plo
+ -rm -f ./$(DEPDIR)/sheet_rows.Plo
+ -rm -f ./$(DEPDIR)/xls_xml.Plo
+ -rm -f ./$(DEPDIR)/xlsx.Plo
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-orcusDATA install-orcustoolsDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-pyexecLTLIBRARIES
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+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 ./$(DEPDIR)/cell.Plo
+ -rm -f ./$(DEPDIR)/csv.Plo
+ -rm -f ./$(DEPDIR)/document.Plo
+ -rm -f ./$(DEPDIR)/formula_token.Plo
+ -rm -f ./$(DEPDIR)/formula_tokens.Plo
+ -rm -f ./$(DEPDIR)/global.Plo
+ -rm -f ./$(DEPDIR)/gnumeric.Plo
+ -rm -f ./$(DEPDIR)/json.Plo
+ -rm -f ./$(DEPDIR)/memory.Plo
+ -rm -f ./$(DEPDIR)/named_expression.Plo
+ -rm -f ./$(DEPDIR)/named_expressions.Plo
+ -rm -f ./$(DEPDIR)/ods.Plo
+ -rm -f ./$(DEPDIR)/python.Plo
+ -rm -f ./$(DEPDIR)/root.Plo
+ -rm -f ./$(DEPDIR)/sheet.Plo
+ -rm -f ./$(DEPDIR)/sheet_rows.Plo
+ -rm -f ./$(DEPDIR)/xls_xml.Plo
+ -rm -f ./$(DEPDIR)/xlsx.Plo
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-orcusDATA uninstall-orcustoolsDATA \
+ uninstall-pyexecLTLIBRARIES
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-TESTS \
+ check-am check-valgrind-am check-valgrind-drd-am \
+ check-valgrind-drd-local check-valgrind-helgrind-am \
+ check-valgrind-helgrind-local check-valgrind-local \
+ check-valgrind-memcheck-am check-valgrind-memcheck-local \
+ check-valgrind-sgcheck-am check-valgrind-sgcheck-local clean \
+ clean-generic clean-libtool clean-pyexecLTLIBRARIES \
+ cscopelist-am ctags ctags-am distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ 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-man install-orcusDATA \
+ install-orcustoolsDATA install-pdf install-pdf-am install-ps \
+ install-ps-am install-pyexecLTLIBRARIES 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 tags tags-am uninstall uninstall-am \
+ uninstall-orcusDATA uninstall-orcustoolsDATA \
+ uninstall-pyexecLTLIBRARIES
+
+.PRECIOUS: Makefile
+
+
+# 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/src/python/cell.cpp b/src/python/cell.cpp
new file mode 100644
index 0000000..a4a46b0
--- /dev/null
+++ b/src/python/cell.cpp
@@ -0,0 +1,349 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "cell.hpp"
+#include "memory.hpp"
+#include "global.hpp"
+#include "formula_token.hpp"
+#include "formula_tokens.hpp"
+#include "orcus/spreadsheet/document.hpp"
+
+#include <ixion/cell.hpp>
+#include <ixion/formula_result.hpp>
+#include <ixion/formula.hpp>
+#include <ixion/formula_name_resolver.hpp>
+#include <ixion/model_context.hpp>
+
+#include <structmember.h>
+#include <string>
+
+namespace ss = orcus::spreadsheet;
+
+namespace orcus { namespace python {
+
+namespace {
+
+/** non-python part of the object. */
+struct cell_data
+{
+ const ss::document* doc = nullptr;
+ const ixion::formula_cell* formula_cell = nullptr;
+ ixion::abs_address_t origin;
+};
+
+/**
+ * Python object for orcus.Cell.
+ */
+struct pyobj_cell
+{
+ PyObject_HEAD
+
+ PyObject* type;
+ PyObject* value;
+ PyObject* formula;
+
+ cell_data* data = nullptr;
+};
+
+void initialize_cell_members(pyobj_cell* self)
+{
+ Py_INCREF(Py_None);
+ self->value = Py_None;
+
+ Py_INCREF(Py_None);
+ self->formula = Py_None;
+}
+
+PyObject* create_and_init_cell_object(const char* type_name)
+{
+ PyTypeObject* cell_type = get_cell_type();
+ if (!cell_type)
+ {
+ PyErr_SetString(PyExc_RuntimeError, "Failed to get the cell type object.");
+ return nullptr;
+ }
+
+ PyObject* obj = cell_type->tp_new(cell_type, nullptr, nullptr);
+ if (!obj)
+ {
+ PyErr_SetString(PyExc_RuntimeError, "Failed to instantiate a cell object.");
+ return nullptr;
+ }
+
+ pyobj_cell* self = reinterpret_cast<pyobj_cell*>(obj);
+ self->type = get_python_enum_value("CellType", type_name);
+ initialize_cell_members(self);
+
+ return obj;
+}
+
+void tp_dealloc(pyobj_cell* self)
+{
+ delete self->data;
+ self->data = nullptr;
+
+ Py_CLEAR(self->type);
+ Py_CLEAR(self->value);
+ Py_CLEAR(self->formula);
+
+ Py_TYPE(self)->tp_free(reinterpret_cast<PyObject*>(self));
+}
+
+PyObject* tp_new(PyTypeObject* type, PyObject* /*args*/, PyObject* /*kwargs*/)
+{
+ pyobj_cell* self = (pyobj_cell*)type->tp_alloc(type, 0);
+ self->data = new cell_data;
+ return reinterpret_cast<PyObject*>(self);
+}
+
+int tp_init(pyobj_cell* self, PyObject* args, PyObject* kwargs)
+{
+ static const char* kwlist[] = { "type", nullptr };
+
+ self->type = nullptr;
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O", const_cast<char**>(kwlist), &self->type))
+ return -1;
+
+ if (!self->type)
+ self->type = get_python_enum_value("CellType", "UNKNOWN");
+
+ initialize_cell_members(self);
+ return 0;
+}
+
+PyObject* cell_get_formula_tokens(PyObject* self, PyObject* /*args*/, PyObject* /*kwargs*/)
+{
+ pyobj_cell* obj = reinterpret_cast<pyobj_cell*>(self);
+ cell_data& data = *obj->data;
+ if (!data.formula_cell)
+ {
+ // This is not a formula cell.
+ Py_INCREF(Py_None);
+ return Py_None;
+ }
+
+ const ixion::formula_tokens_t& tokens = data.formula_cell->get_tokens()->get();
+ return create_formula_tokens_iterator_object(*data.doc, data.origin, tokens);
+}
+
+PyMethodDef tp_methods[] =
+{
+ { "get_formula_tokens", (PyCFunction)cell_get_formula_tokens, METH_NOARGS, "Get a formula tokens iterator." },
+ { nullptr }
+};
+
+PyMemberDef tp_members[] =
+{
+ { (char*)"type", T_OBJECT_EX, offsetof(pyobj_cell, type), READONLY, (char*)"cell type" },
+ { (char*)"value", T_OBJECT_EX, offsetof(pyobj_cell, value), READONLY, (char*)"cell value" },
+ { (char*)"formula", T_OBJECT_EX, offsetof(pyobj_cell, formula), READONLY, (char*)"formula string" },
+ { nullptr }
+};
+
+PyTypeObject cell_type =
+{
+ PyVarObject_HEAD_INIT(nullptr, 0)
+ "orcus.Cell", // tp_name
+ sizeof(pyobj_cell), // tp_basicsize
+ 0, // tp_itemsize
+ (destructor)tp_dealloc, // tp_dealloc
+ 0, // tp_print
+ 0, // tp_getattr
+ 0, // tp_setattr
+ 0, // tp_compare
+ 0, // tp_repr
+ 0, // tp_as_number
+ 0, // tp_as_sequence
+ 0, // tp_as_mapping
+ 0, // tp_hash
+ 0, // tp_call
+ 0, // tp_str
+ 0, // tp_getattro
+ 0, // tp_setattro
+ 0, // tp_as_buffer
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, // tp_flags
+ "orcus spreadsheet cell", // tp_doc
+ 0, // tp_traverse
+ 0, // tp_clear
+ 0, // tp_richcompare
+ 0, // tp_weaklistoffset
+ 0, // tp_iter
+ 0, // tp_iternext
+ tp_methods, // tp_methods
+ tp_members, // tp_members
+ 0, // tp_getset
+ 0, // tp_base
+ 0, // tp_dict
+ 0, // tp_descr_get
+ 0, // tp_descr_set
+ 0, // tp_dictoffset
+ (initproc)tp_init, // tp_init
+ 0, // tp_alloc
+ tp_new, // tp_new
+};
+
+} // anonymous namespace
+
+PyObject* create_cell_object_empty()
+{
+ PyObject* obj = create_and_init_cell_object("EMPTY");
+ if (!obj)
+ return nullptr;
+
+ return obj;
+}
+
+PyObject* create_cell_object_boolean(bool v)
+{
+ PyObject* obj = create_and_init_cell_object("BOOLEAN");
+ if (!obj)
+ return nullptr;
+
+ pyobj_cell* obj_data = reinterpret_cast<pyobj_cell*>(obj);
+
+ if (v)
+ {
+ Py_INCREF(Py_True);
+ obj_data->value = Py_True;
+ }
+ else
+ {
+ Py_INCREF(Py_False);
+ obj_data->value = Py_False;
+ }
+
+ return obj;
+}
+
+PyObject* create_cell_object_string(const std::string* p)
+{
+ PyObject* obj = create_and_init_cell_object("STRING");
+ if (!obj)
+ return nullptr;
+
+ pyobj_cell* obj_data = reinterpret_cast<pyobj_cell*>(obj);
+
+ if (p)
+ {
+ obj_data->value = PyUnicode_FromStringAndSize(p->data(), p->size());
+ if (!obj_data->value)
+ {
+ // The string contains invalid utf-8 sequence, and the function has
+ // already set a python exception which needs to be cleared.
+ PyErr_Clear();
+ Py_XDECREF(obj);
+ obj = create_and_init_cell_object("STRING_WITH_ERROR");
+ }
+ }
+ else
+ {
+ Py_INCREF(Py_None);
+ obj_data->value = Py_None;
+ }
+
+ return obj;
+}
+
+PyObject* create_cell_object_numeric(double v)
+{
+ PyObject* obj = create_and_init_cell_object("NUMERIC");
+ if (!obj)
+ return nullptr;
+
+ pyobj_cell* obj_data = reinterpret_cast<pyobj_cell*>(obj);
+ obj_data->value = PyFloat_FromDouble(v);
+
+ return obj;
+}
+
+PyObject* create_cell_object_formula(
+ const spreadsheet::document& doc, const ixion::abs_address_t& origin, const ixion::formula_cell* fc)
+{
+ if (!fc)
+ {
+ PyErr_SetString(PyExc_RuntimeError, "failed to find class orcus.CellType.");
+ return nullptr;
+ }
+
+ const ixion::formula_tokens_t& tokens = fc->get_tokens()->get();
+ bool is_error = !tokens.empty() && tokens[0].opcode == ixion::fop_error;
+
+ PyObject* obj = create_and_init_cell_object(is_error ? "FORMULA_WITH_ERROR": "FORMULA");
+ if (!obj)
+ return nullptr;
+
+ pyobj_cell* obj_data = reinterpret_cast<pyobj_cell*>(obj);
+ obj_data->data->doc = &doc;
+ obj_data->data->origin = origin;
+ obj_data->data->formula_cell = fc;
+
+ // Create formula expression string.
+ auto* resolver = doc.get_formula_name_resolver(spreadsheet::formula_ref_context_t::global);
+ const ixion::model_context& cxt = doc.get_model_context();
+ std::string formula_s = ixion::print_formula_tokens(cxt, origin, *resolver, tokens);
+ obj_data->formula = PyUnicode_FromStringAndSize(formula_s.data(), formula_s.size());
+
+ ixion::formula_result res;
+
+ try
+ {
+ res = fc->get_result_cache(
+ ixion::formula_result_wait_policy_t::throw_exception);
+ }
+ catch (const std::exception&)
+ {
+ Py_INCREF(Py_None);
+ obj_data->value = Py_None;
+ return obj;
+ }
+
+ switch (res.get_type())
+ {
+ case ixion::formula_result::result_type::value:
+ {
+ obj_data->value = PyFloat_FromDouble(res.get_value());
+ break;
+ }
+ case ixion::formula_result::result_type::string:
+ {
+ const std::string& s = res.get_string();
+ obj_data->value = PyUnicode_FromStringAndSize(s.data(), s.size());
+ break;
+ }
+ case ixion::formula_result::result_type::error:
+ {
+ ixion::formula_error_t fe = res.get_error();
+ std::string_view fename = ixion::get_formula_error_name(fe);
+ if (!fename.empty())
+ obj_data->value = PyUnicode_FromStringAndSize(fename.data(), fename.size());
+ else
+ {
+ // This should not be hit, but just in case...
+ Py_INCREF(Py_None);
+ obj_data->value = Py_None;
+ }
+ break;
+ }
+ default:
+ {
+ // This should not be hit, but just in case...
+ Py_INCREF(Py_None);
+ obj_data->value = Py_None;
+ }
+ }
+
+ return obj;
+}
+
+PyTypeObject* get_cell_type()
+{
+ return &cell_type;
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/python/cell.hpp b/src/python/cell.hpp
new file mode 100644
index 0000000..45ea46d
--- /dev/null
+++ b/src/python/cell.hpp
@@ -0,0 +1,44 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_PYTHON_CELL_HPP
+#define INCLUDED_ORCUS_PYTHON_CELL_HPP
+
+#include <string>
+#include <Python.h>
+
+namespace ixion {
+
+class formula_cell;
+struct abs_address_t;
+
+}
+
+namespace orcus {
+
+namespace spreadsheet {
+
+class document;
+
+}
+
+namespace python {
+
+PyObject* create_cell_object_empty();
+PyObject* create_cell_object_boolean(bool v);
+PyObject* create_cell_object_string(const std::string* p);
+PyObject* create_cell_object_numeric(double v);
+PyObject* create_cell_object_formula(
+ const spreadsheet::document& doc, const ixion::abs_address_t& origin, const ixion::formula_cell* fc);
+
+PyTypeObject* get_cell_type();
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/python/csv.cpp b/src/python/csv.cpp
new file mode 100644
index 0000000..97c5d29
--- /dev/null
+++ b/src/python/csv.cpp
@@ -0,0 +1,105 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "csv.hpp"
+#include "global.hpp"
+
+#ifdef __ORCUS_PYTHON_CSV
+#include "document.hpp"
+#include "orcus/orcus_csv.hpp"
+#include "orcus/spreadsheet/document.hpp"
+#include "orcus/spreadsheet/factory.hpp"
+#endif
+
+namespace orcus { namespace python {
+
+#ifdef __ORCUS_PYTHON_CSV
+
+namespace {
+
+py_unique_ptr read_stream_object_from_string(PyObject* args, PyObject* kwargs)
+{
+ static const char* kwlist[] = { "stream", nullptr };
+
+ py_unique_ptr ret;
+ PyObject* file = nullptr;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", const_cast<char**>(kwlist), &file))
+ return ret;
+
+ if (!file)
+ {
+ PyErr_SetString(PyExc_RuntimeError, "Invalid file object has been passed.");
+ return ret;
+ }
+
+ PyObject* obj_str = nullptr;
+
+ if (PyObject_HasAttrString(file, "read"))
+ {
+ PyObject* func_read = PyObject_GetAttrString(file, "read"); // new reference
+ obj_str = PyObject_CallFunction(func_read, nullptr);
+ Py_XDECREF(func_read);
+ }
+
+ if (!obj_str)
+ {
+ if (PyObject_TypeCheck(file, &PyUnicode_Type))
+ obj_str = PyUnicode_FromObject(file); // new reference
+ }
+
+ if (!obj_str)
+ {
+ PyErr_SetString(PyExc_RuntimeError, "failed to extract bytes from this object.");
+ return ret;
+ }
+
+ ret.reset(obj_str);
+ return ret;
+}
+
+} // anonymous namespace
+
+PyObject* csv_read(PyObject* /*module*/, PyObject* args, PyObject* kwargs)
+{
+ py_unique_ptr str = read_stream_object_from_string(args, kwargs);
+ if (!str)
+ return nullptr;
+
+ try
+ {
+ spreadsheet::range_size_t ss{1048576, 16384};
+ std::unique_ptr<spreadsheet::document> doc = std::make_unique<spreadsheet::document>(ss);
+ spreadsheet::import_factory fact(*doc);
+ orcus_csv app(&fact);
+
+ Py_ssize_t n = 0;
+ const char* p = PyUnicode_AsUTF8AndSize(str.get(), &n);
+ app.read_stream({p, static_cast<std::string_view::size_type>(n)});
+
+ return create_document(std::move(doc));
+ }
+ catch (const std::exception& e)
+ {
+ set_python_exception(PyExc_RuntimeError, e);
+ return nullptr;
+ }
+}
+
+#else
+
+PyObject* csv_read(PyObject*, PyObject*, PyObject*)
+{
+ PyErr_SetString(PyExc_RuntimeError, "The csv module is not enabled.");
+ return nullptr;
+}
+
+#endif
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/python/csv.hpp b/src/python/csv.hpp
new file mode 100644
index 0000000..e9b7b44
--- /dev/null
+++ b/src/python/csv.hpp
@@ -0,0 +1,21 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_PYTHON_CSV_HPP
+#define INCLUDED_ORCUS_PYTHON_CSV_HPP
+
+#include <Python.h>
+
+namespace orcus { namespace python {
+
+PyObject* csv_read(PyObject* module, PyObject* args, PyObject* kwargs);
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/python/document.cpp b/src/python/document.cpp
new file mode 100644
index 0000000..d908668
--- /dev/null
+++ b/src/python/document.cpp
@@ -0,0 +1,330 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "document.hpp"
+#include "sheet.hpp"
+#include "global.hpp"
+#include "named_expression.hpp"
+#include "named_expressions.hpp"
+
+#include <ixion/model_context.hpp>
+#include <ixion/named_expressions_iterator.hpp>
+#include <structmember.h>
+#include <object.h>
+#include <sstream>
+
+using namespace std;
+namespace ss = orcus::spreadsheet;
+
+namespace orcus { namespace python {
+
+document_data::~document_data()
+{
+}
+
+namespace {
+
+/**
+ * Python object for orcus.Document.
+ */
+struct pyobj_document
+{
+ PyObject_HEAD
+
+ PyObject* sheets; // tuple of sheet objects.
+
+ document_data* data;
+};
+
+inline pyobj_document* t(PyObject* self)
+{
+ return reinterpret_cast<pyobj_document*>(self);
+}
+
+void tp_dealloc(pyobj_document* self)
+{
+ delete self->data;
+
+ // Destroy all sheet objects.
+ Py_ssize_t n = PyTuple_Size(self->sheets);
+ for (Py_ssize_t i = 0; i < n; ++i)
+ {
+ PyObject* o = PyTuple_GetItem(self->sheets, i);
+ Py_CLEAR(o);
+ }
+ Py_CLEAR(self->sheets); // and the tuple containing the sheets.
+
+ Py_TYPE(self)->tp_free(reinterpret_cast<PyObject*>(self));
+}
+
+PyObject* tp_new(PyTypeObject* type, PyObject* /*args*/, PyObject* /*kwargs*/)
+{
+ pyobj_document* self = t(type->tp_alloc(type, 0));
+ self->data = new document_data;
+ return reinterpret_cast<PyObject*>(self);
+}
+
+int tp_init(pyobj_document* /*self*/, PyObject* /*args*/, PyObject* /*kwargs*/)
+{
+ return 0;
+}
+
+PyObject* doc_get_named_expressions(PyObject* self, PyObject* /*args*/, PyObject* /*kwargs*/)
+{
+ const ss::document& doc = *t(self)->data->m_doc;
+ const ixion::model_context& cxt = doc.get_model_context();
+ return create_named_expressions_object(-1, doc, cxt.get_named_expressions_iterator());
+}
+
+PyMethodDef tp_methods[] =
+{
+ { "get_named_expressions", (PyCFunction)doc_get_named_expressions, METH_NOARGS, "Get a named expressions iterator." },
+ { nullptr }
+};
+
+PyMemberDef tp_members[] =
+{
+ { (char*)"sheets", T_OBJECT_EX, offsetof(pyobj_document, sheets), READONLY, (char*)"sheet objects" },
+ { nullptr }
+};
+
+PyTypeObject document_type =
+{
+ PyVarObject_HEAD_INIT(nullptr, 0)
+ "orcus.Document", // tp_name
+ sizeof(pyobj_document), // tp_basicsize
+ 0, // tp_itemsize
+ (destructor)tp_dealloc, // tp_dealloc
+ 0, // tp_print
+ 0, // tp_getattr
+ 0, // tp_setattr
+ 0, // tp_compare
+ 0, // tp_repr
+ 0, // tp_as_number
+ 0, // tp_as_sequence
+ 0, // tp_as_mapping
+ 0, // tp_hash
+ 0, // tp_call
+ 0, // tp_str
+ 0, // tp_getattro
+ 0, // tp_setattro
+ 0, // tp_as_buffer
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, // tp_flags
+ "orcus document object", // tp_doc
+ 0, // tp_traverse
+ 0, // tp_clear
+ 0, // tp_richcompare
+ 0, // tp_weaklistoffset
+ 0, // tp_iter
+ 0, // tp_iternext
+ tp_methods, // tp_methods
+ tp_members, // tp_members
+ 0, // tp_getset
+ 0, // tp_base
+ 0, // tp_dict
+ 0, // tp_descr_get
+ 0, // tp_descr_set
+ 0, // tp_dictoffset
+ (initproc)tp_init, // tp_init
+ 0, // tp_alloc
+ tp_new, // tp_new
+};
+
+bool import_from_stream_object(iface::import_filter& app, PyObject* obj_bytes)
+{
+ const char* p = PyBytes_AsString(obj_bytes);
+ if (!p)
+ return false;
+
+ size_t n = PyBytes_Size(obj_bytes);
+
+ app.read_stream({p, n});
+
+ return true;
+}
+
+PyObject* create_document_object()
+{
+ PyTypeObject* type = get_document_type();
+
+ PyObject* obj_doc = create_object_from_type(type);
+ if (!obj_doc)
+ return nullptr;
+
+ type->tp_init(obj_doc, nullptr, nullptr);
+
+ return obj_doc;
+}
+
+void store_document(PyObject* self, std::unique_ptr<spreadsheet::document>&& doc)
+{
+ if (!self)
+ return;
+
+ pyobj_document* pydoc = reinterpret_cast<pyobj_document*>(self);
+ document_data* pydoc_data = pydoc->data;
+ pydoc_data->m_doc = std::move(doc);
+
+ PyTypeObject* sheet_type = get_sheet_type();
+ if (!sheet_type)
+ return;
+
+ // Create a tuple of sheet objects and store it with the pydoc instance.
+ size_t sheet_size = pydoc_data->m_doc->get_sheet_count();
+
+ pydoc->sheets = PyTuple_New(sheet_size);
+
+ for (size_t i = 0; i < sheet_size; ++i)
+ {
+ spreadsheet::sheet* sheet = pydoc_data->m_doc->get_sheet(i);
+ if (!sheet)
+ continue;
+
+ PyObject* pysheet = sheet_type->tp_new(sheet_type, nullptr, nullptr);
+ if (!pysheet)
+ continue;
+
+ sheet_type->tp_init(pysheet, nullptr, nullptr);
+
+ Py_INCREF(pysheet);
+ PyTuple_SetItem(pydoc->sheets, i, pysheet);
+
+ store_sheet(pysheet, pydoc_data->m_doc.get(), sheet);
+ }
+}
+
+} // anonoymous namespace
+
+PyTypeObject* get_document_type()
+{
+ return &document_type;
+}
+
+document_data* get_document_data(PyObject* self)
+{
+ return reinterpret_cast<pyobj_document*>(self)->data;
+}
+
+stream_with_formulas read_stream_and_formula_params_from_args(PyObject* args, PyObject* kwargs)
+{
+ static const char* kwlist[] = { "stream", "recalc", "error_policy", nullptr };
+
+ stream_with_formulas ret;
+ PyObject* file = nullptr;
+ int recalc_formula_cells = 0;
+ const char* error_policy_s = nullptr;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|ps", const_cast<char**>(kwlist), &file, &recalc_formula_cells, &error_policy_s))
+ return ret;
+
+ if (!file)
+ {
+ PyErr_SetString(PyExc_RuntimeError, "Invalid file object has been passed.");
+ return ret;
+ }
+
+ PyObject* obj_bytes = nullptr;
+
+ if (PyObject_HasAttrString(file, "read"))
+ {
+ PyObject* func_read = PyObject_GetAttrString(file, "read"); // new reference
+ obj_bytes = PyObject_CallFunction(func_read, nullptr);
+ Py_XDECREF(func_read);
+ }
+
+ if (!obj_bytes)
+ {
+ if (PyObject_TypeCheck(file, &PyBytes_Type))
+ obj_bytes = PyBytes_FromObject(file);
+ }
+
+ if (!obj_bytes)
+ {
+ PyErr_SetString(PyExc_RuntimeError, "failed to extract bytes from this object.");
+ return ret;
+ }
+
+ if (error_policy_s)
+ {
+ ss::formula_error_policy_t error_policy = ss::to_formula_error_policy(error_policy_s);
+ if (error_policy == ss::formula_error_policy_t::unknown)
+ {
+ std::ostringstream os;
+ os << "invalid error policy value: '" << error_policy_s << "'. The value must be either 'fail' or 'skip'.";
+ PyErr_SetString(PyExc_RuntimeError, os.str().data());
+ return ret;
+ }
+
+ ret.error_policy = error_policy;
+ }
+
+ ret.stream.reset(obj_bytes);
+ ret.recalc_formula_cells = recalc_formula_cells != 0;
+
+ return ret;
+}
+
+py_unique_ptr read_stream_from_args(PyObject* args, PyObject* kwargs)
+{
+ static const char* kwlist[] = { "stream", nullptr };
+
+ py_unique_ptr obj_bytes;
+ PyObject* file = nullptr;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", const_cast<char**>(kwlist), &file))
+ return obj_bytes;
+
+ if (!file)
+ {
+ PyErr_SetString(PyExc_RuntimeError, "Invalid file object has been passed.");
+ return obj_bytes;
+ }
+
+ if (PyObject_HasAttrString(file, "read"))
+ {
+ PyObject* func_read = PyObject_GetAttrString(file, "read"); // new reference
+ obj_bytes.reset(PyObject_CallFunction(func_read, nullptr));
+ Py_XDECREF(func_read);
+ }
+
+ if (!obj_bytes)
+ {
+ if (PyObject_TypeCheck(file, &PyBytes_Type))
+ obj_bytes.reset(PyBytes_FromObject(file));
+ }
+
+ if (!obj_bytes)
+ {
+ PyErr_SetString(PyExc_RuntimeError, "failed to extract bytes from this object.");
+ return obj_bytes;
+ }
+
+ return obj_bytes;
+}
+
+PyObject* import_from_stream_into_document(
+ PyObject* obj_bytes, iface::import_filter& app, std::unique_ptr<spreadsheet::document>&& doc)
+{
+ if (!import_from_stream_object(app, obj_bytes))
+ return nullptr;
+
+ return create_document(std::move(doc));
+}
+
+PyObject* create_document(std::unique_ptr<spreadsheet::document>&& doc)
+{
+ PyObject* obj_doc = create_document_object();
+ if (!obj_doc)
+ return nullptr;
+
+ store_document(obj_doc, std::move(doc));
+ return obj_doc;
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/python/document.hpp b/src/python/document.hpp
new file mode 100644
index 0000000..b52c9b8
--- /dev/null
+++ b/src/python/document.hpp
@@ -0,0 +1,83 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_PYTHON_DOCUMENT_HPP
+#define INCLUDED_ORCUS_PYTHON_DOCUMENT_HPP
+
+#include "orcus/spreadsheet/document.hpp"
+
+#include "memory.hpp"
+
+namespace orcus { namespace python {
+
+/** non-python part of the document object. */
+struct document_data
+{
+ std::unique_ptr<spreadsheet::document> m_doc;
+
+ ~document_data();
+};
+
+document_data* get_document_data(PyObject* self);
+
+struct stream_with_formulas
+{
+ py_unique_ptr stream;
+ bool recalc_formula_cells = false;
+ spreadsheet::formula_error_policy_t error_policy = spreadsheet::formula_error_policy_t::fail;
+};
+
+/**
+ * Extract a python object representing the byte stream from the arguments
+ * passed to the python orcus.<file format>.read() function, as well as
+ * several parameters related to formula calculation settings.
+ *
+ * This function handles the following python arguments: stream, recalc, and
+ * error_policy.
+ *
+ * @param args positional argument object.
+ * @param kwargs keyword argument object.
+ *
+ * @return object representing the bytes as well as formula calculation
+ * settings.
+ */
+stream_with_formulas read_stream_and_formula_params_from_args(PyObject* args, PyObject* kwargs);
+
+/**
+ * This one is similar to the function above, except that it only handles
+ * one argument called 'stream'.
+ *
+ * @return object representing the bytes.
+ */
+py_unique_ptr read_stream_from_args(PyObject* args, PyObject* kwargs);
+
+/**
+ * Import a document from a python object containing the byte stream, and
+ * create a python object of class orcus.Document.
+ *
+ * @param obj_bytes python object containing the byte stream.
+ * @param app filter instance to use to load the document.
+ * @param doc orcus document instance which will be stored within the python
+ * document object.
+ *
+ * @return python document object.
+ */
+PyObject* import_from_stream_into_document(
+ PyObject* obj_bytes, iface::import_filter& app, std::unique_ptr<spreadsheet::document>&& doc);
+
+PyObject* create_document(std::unique_ptr<spreadsheet::document>&& doc);
+
+/**
+ * Get the definition of the python class Document.
+ */
+PyTypeObject* get_document_type();
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/python/formula_token.cpp b/src/python/formula_token.cpp
new file mode 100644
index 0000000..971d440
--- /dev/null
+++ b/src/python/formula_token.cpp
@@ -0,0 +1,250 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "formula_token.hpp"
+#include "global.hpp"
+#include "orcus/spreadsheet/document.hpp"
+
+#include <ixion/formula.hpp>
+#include <ixion/formula_name_resolver.hpp>
+#include <ixion/model_context.hpp>
+#include <structmember.h>
+
+namespace ss = orcus::spreadsheet;
+
+namespace orcus { namespace python {
+
+namespace {
+
+/** non-python part of the object's internal. */
+struct data_formula_token
+{
+ std::string repr;
+};
+
+/**
+ * Python object for orcus.NamedExpression.
+ */
+struct pyobj_formula_token
+{
+ PyObject_HEAD
+
+ PyObject* type;
+ PyObject* op;
+
+ data_formula_token* data;
+};
+
+const char* to_formula_token_type(ixion::fopcode_t op)
+{
+ switch (op)
+ {
+ case ixion::fop_single_ref:
+ case ixion::fop_range_ref:
+ case ixion::fop_table_ref:
+ return "REFERENCE";
+ case ixion::fop_named_expression:
+ return "NAME";
+ case ixion::fop_function:
+ return "FUNCTION";
+ case ixion::fop_string:
+ case ixion::fop_value:
+ return "VALUE";
+ case ixion::fop_plus:
+ case ixion::fop_minus:
+ case ixion::fop_divide:
+ case ixion::fop_multiply:
+ case ixion::fop_exponent:
+ case ixion::fop_concat:
+ case ixion::fop_equal:
+ case ixion::fop_not_equal:
+ case ixion::fop_less:
+ case ixion::fop_greater:
+ case ixion::fop_less_equal:
+ case ixion::fop_greater_equal:
+ case ixion::fop_open:
+ case ixion::fop_close:
+ case ixion::fop_sep:
+ return "OPERATOR";
+ case ixion::fop_error:
+ return "ERROR";
+ case ixion::fop_unknown:
+ default:
+ ;
+ }
+
+ return "UNKNOWN";
+}
+
+const char* to_formula_token_op(ixion::fopcode_t op)
+{
+ const char* names[] = {
+ "UNKNOWN",
+ "SINGLE_REF",
+ "RANGE_REF",
+ "TABLE_REF",
+ "NAMED_EXPRESSION",
+ "STRING",
+ "VALUE",
+ "FUNCTION",
+ "PLUS",
+ "MINUS",
+ "DIVIDE",
+ "MULTIPLY",
+ "EXPONENT",
+ "CONCAT",
+ "EQUAL",
+ "NOT_EQUAL",
+ "LESS",
+ "GREATER",
+ "LESS_EQUAL",
+ "GREATER_EQUAL",
+ "OPEN",
+ "CLOSE",
+ "SEP",
+ "ERROR",
+ };
+
+ auto n_names = std::size(names);
+ return op < n_names ? names[op] : names[0];
+}
+
+void init_members(pyobj_formula_token* self)
+{
+ Py_INCREF(Py_None);
+ self->type = Py_None;
+ Py_INCREF(Py_None);
+ self->op = Py_None;
+}
+
+PyObject* create_and_init_formula_token_object(ixion::fopcode_t op, std::string repr)
+{
+ PyTypeObject* ft_type = get_formula_token_type();
+ if (!ft_type)
+ {
+ PyErr_SetString(PyExc_RuntimeError, "Failed to get the formula token type object.");
+ return nullptr;
+ }
+
+ PyObject* obj = ft_type->tp_new(ft_type, nullptr, nullptr);
+ if (!obj)
+ {
+ PyErr_SetString(PyExc_RuntimeError, "Failed to instantiate a formula token object.");
+ return nullptr;
+ }
+
+ pyobj_formula_token* self = reinterpret_cast<pyobj_formula_token*>(obj);
+ init_members(self);
+ self->type = get_python_enum_value("FormulaTokenType", to_formula_token_type(op));
+ self->op = get_python_enum_value("FormulaTokenOp", to_formula_token_op(op));
+ self->data->repr = std::move(repr);
+
+ return obj;
+}
+
+void tp_dealloc(pyobj_formula_token* self)
+{
+ delete self->data;
+ self->data = nullptr;
+
+ Py_CLEAR(self->op);
+ Py_CLEAR(self->type);
+
+ Py_TYPE(self)->tp_free(reinterpret_cast<PyObject*>(self));
+}
+
+int tp_init(pyobj_formula_token* self, PyObject* /*args*/, PyObject* /*kwargs*/)
+{
+ init_members(self);
+ return 0;
+}
+
+PyObject* tp_new(PyTypeObject* type, PyObject* /*args*/, PyObject* /*kwargs*/)
+{
+ pyobj_formula_token* self = (pyobj_formula_token*)type->tp_alloc(type, 0);
+ self->data = new data_formula_token;
+ return reinterpret_cast<PyObject*>(self);
+}
+
+PyObject* tp_repr(pyobj_formula_token* self)
+{
+ return PyUnicode_FromStringAndSize(self->data->repr.data(), self->data->repr.size());
+}
+
+PyMemberDef tp_members[] =
+{
+ { (char*)"type", T_OBJECT_EX, offsetof(pyobj_formula_token, type), READONLY, (char*)"formula token type" },
+ { (char*)"op", T_OBJECT_EX, offsetof(pyobj_formula_token, op), READONLY, (char*)"formula token operator" },
+ { nullptr }
+};
+
+PyTypeObject formula_token_type =
+{
+ PyVarObject_HEAD_INIT(nullptr, 0)
+ "orcus.FormulaToken", // tp_name
+ sizeof(pyobj_formula_token), // tp_basicsize
+ 0, // tp_itemsize
+ (destructor)tp_dealloc, // tp_dealloc
+ 0, // tp_print
+ 0, // tp_getattr
+ 0, // tp_setattr
+ 0, // tp_compare
+ (reprfunc)tp_repr, // tp_repr
+ 0, // tp_as_number
+ 0, // tp_as_sequence
+ 0, // tp_as_mapping
+ 0, // tp_hash
+ 0, // tp_call
+ 0, // tp_str
+ 0, // tp_getattro
+ 0, // tp_setattro
+ 0, // tp_as_buffer
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, // tp_flags
+ "orcus spreadsheet formula token", // tp_doc
+ 0, // tp_traverse
+ 0, // tp_clear
+ 0, // tp_richcompare
+ 0, // tp_weaklistoffset
+ 0, // tp_iter
+ 0, // tp_iternext
+ 0, // tp_methods
+ tp_members, // tp_members
+ 0, // tp_getset
+ 0, // tp_base
+ 0, // tp_dict
+ 0, // tp_descr_get
+ 0, // tp_descr_set
+ 0, // tp_dictoffset
+ (initproc)tp_init, // tp_init
+ 0, // tp_alloc
+ tp_new, // tp_new
+};
+
+} // anonymous namespace
+
+PyObject* create_formula_token_object(const ss::document& doc, const ixion::abs_address_t& pos, const ixion::formula_token& token)
+{
+ const ixion::model_context& cxt = doc.get_model_context();
+ auto* resolver = doc.get_formula_name_resolver(ss::formula_ref_context_t::global);
+ assert(resolver);
+ std::string ft_s = ixion::print_formula_token(cxt, pos, *resolver, token);
+
+ PyObject* obj = create_and_init_formula_token_object(token.opcode, std::move(ft_s));
+ if (!obj)
+ return nullptr;
+
+ return obj;
+}
+
+PyTypeObject* get_formula_token_type()
+{
+ return &formula_token_type;
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/python/formula_token.hpp b/src/python/formula_token.hpp
new file mode 100644
index 0000000..90b5b49
--- /dev/null
+++ b/src/python/formula_token.hpp
@@ -0,0 +1,40 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_PYTHON_FORMULA_TOKEN_HPP
+#define INCLUDED_ORCUS_PYTHON_FORMULA_TOKEN_HPP
+
+#include "orcus/spreadsheet/types.hpp"
+
+#include <Python.h>
+
+namespace ixion {
+
+struct abs_address_t;
+class formula_token;
+
+}
+
+namespace orcus {
+
+namespace spreadsheet {
+
+class document;
+
+}
+
+namespace python {
+
+PyObject* create_formula_token_object(const spreadsheet::document& doc, const ixion::abs_address_t& pos, const ixion::formula_token& token);
+
+PyTypeObject* get_formula_token_type();
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/python/formula_tokens.cpp b/src/python/formula_tokens.cpp
new file mode 100644
index 0000000..1c8b77a
--- /dev/null
+++ b/src/python/formula_tokens.cpp
@@ -0,0 +1,200 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "formula_tokens.hpp"
+#include "formula_token.hpp"
+#include "orcus/spreadsheet/document.hpp"
+
+#include <ixion/formula_tokens.hpp>
+#include <structmember.h>
+
+namespace ss = orcus::spreadsheet;
+
+namespace orcus { namespace python {
+
+namespace {
+
+/** non-python part. */
+struct formula_tokens_data
+{
+ const ss::document* doc;
+ ixion::abs_address_t origin;
+ const ixion::formula_tokens_t* tokens = nullptr;
+ ixion::formula_tokens_t::const_iterator pos;
+ ixion::formula_tokens_t::const_iterator end;
+};
+
+/** python object */
+struct pyobj_formula_tokens
+{
+ PyObject_HEAD
+
+ formula_tokens_data* data = nullptr;
+};
+
+inline pyobj_formula_tokens* t(PyObject* self)
+{
+ return reinterpret_cast<pyobj_formula_tokens*>(self);
+}
+
+void init_members(
+ pyobj_formula_tokens* self, const ss::document& doc, const ixion::abs_address_t& origin, const ixion::formula_tokens_t& tokens)
+{
+ assert(self->data);
+ self->data->doc = &doc;
+ self->data->origin = origin;
+ self->data->tokens = &tokens;
+}
+
+void tp_dealloc(pyobj_formula_tokens* self)
+{
+ delete self->data;
+ Py_TYPE(self)->tp_free(reinterpret_cast<PyObject*>(self));
+}
+
+int tp_init(pyobj_formula_tokens* /*self*/, PyObject* /*args*/, PyObject* /*kwargs*/)
+{
+ return 0;
+}
+
+PyObject* tp_new(PyTypeObject* type, PyObject* /*args*/, PyObject* /*kwargs*/)
+{
+ pyobj_formula_tokens* self = t(type->tp_alloc(type, 0));
+ self->data = new formula_tokens_data;
+ return reinterpret_cast<PyObject*>(self);
+}
+
+PyObject* tp_iter(PyObject* self)
+{
+ formula_tokens_data& data = *t(self)->data;
+ data.pos = data.tokens->cbegin();
+ data.end = data.tokens->cend();
+
+ Py_INCREF(self);
+ return self;
+}
+
+PyObject* tp_iternext(PyObject* self)
+{
+ formula_tokens_data& data = *t(self)->data;
+
+ if (data.pos == data.end)
+ {
+ // No more elements. Stop the iteration.
+ PyErr_SetNone(PyExc_StopIteration);
+ return nullptr;
+ }
+
+ PyObject* ft_obj = create_formula_token_object(*data.doc, data.origin, *data.pos);
+ ++data.pos;
+ return ft_obj;
+}
+
+Py_ssize_t sq_length(PyObject* self)
+{
+ formula_tokens_data& data = *t(self)->data;
+ return data.tokens->size();
+}
+
+PySequenceMethods tp_as_sequence =
+{
+ sq_length, // lenfunc sq_length
+ 0, // binaryfunc sq_concat
+ 0, // ssizeargfunc sq_repeat
+ 0, // ssizeargfunc sq_item
+ 0, // void *was_sq_slice
+ 0, // ssizeobjargproc sq_ass_item
+ 0, // void *was_sq_ass_slice
+ 0, // objobjproc sq_contains
+ 0, // binaryfunc sq_inplace_concat
+ 0, // ssizeargfunc sq_inplace_repeat
+};
+
+PyMethodDef tp_methods[] =
+{
+ { nullptr }
+};
+
+PyMemberDef tp_members[] =
+{
+ { nullptr }
+};
+
+PyTypeObject formula_tokens_type =
+{
+ PyVarObject_HEAD_INIT(nullptr, 0)
+ "orcus.FormulaTokens", // tp_name
+ sizeof(pyobj_formula_tokens), // tp_basicsize
+ 0, // tp_itemsize
+ (destructor)tp_dealloc, // tp_dealloc
+ 0, // tp_print
+ 0, // tp_getattr
+ 0, // tp_setattr
+ 0, // tp_compare
+ 0, // tp_repr
+ 0, // tp_as_number
+ &tp_as_sequence, // tp_as_sequence
+ 0, // tp_as_mapping
+ 0, // tp_hash
+ 0, // tp_call
+ 0, // tp_str
+ 0, // tp_getattro
+ 0, // tp_setattro
+ 0, // tp_as_buffer
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, // tp_flags
+ "orcus spreadsheet formula tokens", // tp_doc
+ 0, // tp_traverse
+ 0, // tp_clear
+ 0, // tp_richcompare
+ 0, // tp_weaklistoffset
+ tp_iter, // tp_iter
+ tp_iternext, // tp_iternext
+ tp_methods, // tp_methods
+ tp_members, // tp_members
+ 0, // tp_getset
+ 0, // tp_base
+ 0, // tp_dict
+ 0, // tp_descr_get
+ 0, // tp_descr_set
+ 0, // tp_dictoffset
+ (initproc)tp_init, // tp_init
+ 0, // tp_alloc
+ tp_new, // tp_new
+};
+
+} // anonymous namespace
+
+PyObject* create_formula_tokens_iterator_object(
+ const ss::document& doc, const ixion::abs_address_t& origin, const ixion::formula_tokens_t& tokens)
+{
+ PyTypeObject* ft_type = get_formula_tokens_type();
+ if (!ft_type)
+ {
+ PyErr_SetString(PyExc_RuntimeError, "Failed to get the formula tokens type object.");
+ return nullptr;
+ }
+
+ PyObject* obj = ft_type->tp_new(ft_type, nullptr, nullptr);
+ if (!obj)
+ {
+ PyErr_SetString(PyExc_RuntimeError, "Failed to instantiate a formula tokens object.");
+ return nullptr;
+ }
+
+ init_members(t(obj), doc, origin, tokens);
+
+ return obj;
+}
+
+PyTypeObject* get_formula_tokens_type()
+{
+ return &formula_tokens_type;
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/python/formula_tokens.hpp b/src/python/formula_tokens.hpp
new file mode 100644
index 0000000..4067452
--- /dev/null
+++ b/src/python/formula_tokens.hpp
@@ -0,0 +1,39 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_PYTHON_FORMULA_TOKENS_HPP
+#define INCLUDED_ORCUS_PYTHON_FORMULA_TOKENS_HPP
+
+#include <ixion/formula_tokens_fwd.hpp>
+#include <Python.h>
+
+namespace ixion {
+
+struct abs_address_t;
+
+}
+
+namespace orcus {
+
+namespace spreadsheet {
+
+class document;
+
+}
+
+namespace python {
+
+PyObject* create_formula_tokens_iterator_object(
+ const spreadsheet::document& doc, const ixion::abs_address_t& origin, const ixion::formula_tokens_t& tokens);
+
+PyTypeObject* get_formula_tokens_type();
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/python/global.cpp b/src/python/global.cpp
new file mode 100644
index 0000000..f8623e0
--- /dev/null
+++ b/src/python/global.cpp
@@ -0,0 +1,65 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "global.hpp"
+#include "memory.hpp"
+
+#include <sstream>
+
+namespace orcus { namespace python {
+
+void set_python_exception(PyObject* type, const std::exception& e)
+{
+ std::ostringstream os;
+ os << "C++ exception caught: " << e.what();
+ PyErr_SetString(type, os.str().data());
+}
+
+PyObject* get_python_enum_value(const char* enum_class_name, const char* value_name)
+{
+ py_scoped_ref orcus_mod = PyImport_ImportModule("orcus");
+ if (!orcus_mod)
+ {
+ PyErr_SetString(PyExc_RuntimeError, "failed to import orcus module.");
+ return nullptr;
+ }
+
+ py_scoped_ref cls = PyObject_GetAttrString(orcus_mod.get(), enum_class_name);
+ if (!cls)
+ {
+ std::ostringstream os;
+ os << "failed to find class orcus." << enum_class_name << ".";
+ PyErr_SetString(PyExc_RuntimeError, os.str().data());
+ return nullptr;
+ }
+
+ return PyObject_GetAttrString(cls.get(), value_name);
+}
+
+PyObject* create_object_from_type(PyTypeObject* type)
+{
+ if (!type)
+ {
+ PyErr_SetString(PyExc_RuntimeError, "Type object is null.");
+ return nullptr;
+ }
+
+ PyObject* obj = type->tp_new(type, nullptr, nullptr);
+ if (!obj)
+ {
+ std::ostringstream os;
+ os << "Failed to instantiate an object of type " << type->tp_name << ".";
+ PyErr_SetString(PyExc_RuntimeError, os.str().data());
+ return nullptr;
+ }
+
+ return obj;
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/python/global.hpp b/src/python/global.hpp
new file mode 100644
index 0000000..608a7ed
--- /dev/null
+++ b/src/python/global.hpp
@@ -0,0 +1,26 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_PYTHON_GLOBAL_HPP
+#define INCLUDED_ORCUS_PYTHON_GLOBAL_HPP
+
+#include <exception>
+#include <Python.h>
+
+namespace orcus { namespace python {
+
+void set_python_exception(PyObject* type, const std::exception& e);
+
+PyObject* get_python_enum_value(const char* enum_class_name, const char* value_name);
+
+PyObject* create_object_from_type(PyTypeObject* type);
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/python/gnumeric.cpp b/src/python/gnumeric.cpp
new file mode 100644
index 0000000..162f18f
--- /dev/null
+++ b/src/python/gnumeric.cpp
@@ -0,0 +1,58 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "gnumeric.hpp"
+#include "global.hpp"
+
+#ifdef __ORCUS_PYTHON_GNUMERIC
+#include "document.hpp"
+#include "orcus/orcus_gnumeric.hpp"
+#include "orcus/spreadsheet/document.hpp"
+#include "orcus/spreadsheet/factory.hpp"
+#endif
+
+namespace orcus { namespace python {
+
+#ifdef __ORCUS_PYTHON_GNUMERIC
+
+PyObject* gnumeric_read(PyObject* /*module*/, PyObject* args, PyObject* kwargs)
+{
+ stream_with_formulas data = read_stream_and_formula_params_from_args(args, kwargs);
+ if (!data.stream)
+ return nullptr;
+
+ try
+ {
+ spreadsheet::range_size_t ss{1048576, 16384};
+ std::unique_ptr<spreadsheet::document> doc = std::make_unique<spreadsheet::document>(ss);
+ spreadsheet::import_factory fact(*doc);
+ fact.set_recalc_formula_cells(data.recalc_formula_cells);
+ fact.set_formula_error_policy(data.error_policy);
+ orcus_gnumeric app(&fact);
+
+ return import_from_stream_into_document(data.stream.get(), app, std::move(doc));
+ }
+ catch (const std::exception& e)
+ {
+ set_python_exception(PyExc_RuntimeError, e);
+ return nullptr;
+ }
+}
+
+#else
+
+PyObject* gnumeric_read(PyObject*, PyObject*, PyObject*)
+{
+ PyErr_SetString(PyExc_RuntimeError, "The gnumeric module is not enabled.");
+ return nullptr;
+}
+
+#endif
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/python/gnumeric.hpp b/src/python/gnumeric.hpp
new file mode 100644
index 0000000..23aeec8
--- /dev/null
+++ b/src/python/gnumeric.hpp
@@ -0,0 +1,21 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_PYTHON_GNUMERIC_HPP
+#define INCLUDED_ORCUS_PYTHON_GNUMERIC_HPP
+
+#include <Python.h>
+
+namespace orcus { namespace python {
+
+PyObject* gnumeric_read(PyObject* module, PyObject* args, PyObject* kwargs);
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/python/json.cpp b/src/python/json.cpp
new file mode 100644
index 0000000..873523b
--- /dev/null
+++ b/src/python/json.cpp
@@ -0,0 +1,290 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/env.hpp"
+#include "orcus/json_parser.hpp"
+#include "orcus/json_document_tree.hpp"
+#include "orcus/config.hpp"
+
+#include <algorithm>
+#include <sstream>
+#include <boost/current_function.hpp>
+
+#include <Python.h>
+
+#define GETSTATE(m) ((struct module_state*)PyModule_GetState(m))
+
+using namespace std;
+
+namespace orcus { namespace python {
+
+namespace {
+
+class python_json_error : public general_error
+{
+public:
+ python_json_error(const std::string& msg) : general_error("python_json_error", msg) {}
+};
+
+struct module_state
+{
+ PyObject* error;
+};
+
+int orcus_traverse(PyObject* m, visitproc visit, void* arg)
+{
+ Py_VISIT(GETSTATE(m)->error);
+ return 0;
+}
+
+int orcus_clear(PyObject* m)
+{
+ Py_CLEAR(GETSTATE(m)->error);
+ return 0;
+}
+
+struct parser_stack
+{
+ PyObject* key;
+ PyObject* node;
+ json::node_t type;
+
+ parser_stack(PyObject* _node, json::node_t _type) : key(nullptr), node(_node), type(_type) {}
+};
+
+class json_parser_handler
+{
+ PyObject* m_root;
+ std::vector<parser_stack> m_stack;
+
+ PyObject* push_value(PyObject* value)
+ {
+ if (!value)
+ {
+ std::ostringstream os;
+ os << BOOST_CURRENT_FUNCTION << ": Empty value is passed.";
+ throw python_json_error(os.str());
+ }
+
+ if (m_stack.empty())
+ {
+ std::ostringstream os;
+ os << BOOST_CURRENT_FUNCTION << ": Stack is unexpectedly empty.";
+ throw python_json_error(os.str());
+ }
+
+ parser_stack& cur = m_stack.back();
+
+ switch (cur.type)
+ {
+ case json::node_t::array:
+ {
+ PyList_Append(cur.node, value);
+ return value;
+ }
+ break;
+ case json::node_t::object:
+ {
+ assert(cur.key);
+ PyDict_SetItem(cur.node, cur.key, value);
+ cur.key = nullptr;
+ return value;
+ }
+ break;
+ default:
+ Py_DECREF(value);
+ }
+
+ std::ostringstream os;
+ os << BOOST_CURRENT_FUNCTION << ": unstackable JSON value type.";
+ throw python_json_error(os.str());
+ }
+
+public:
+ json_parser_handler() : m_root(nullptr) {}
+
+ ~json_parser_handler()
+ {
+ if (m_root)
+ Py_XDECREF(m_root);
+
+ std::for_each(m_stack.begin(), m_stack.end(),
+ [](parser_stack& ps)
+ {
+ if (ps.key)
+ {
+ Py_XDECREF(ps.key);
+ ps.key = nullptr;
+ }
+ }
+ );
+ }
+
+ void begin_parse()
+ {
+ if (m_root)
+ {
+ std::ostringstream os;
+ os << BOOST_CURRENT_FUNCTION << ": Root JSON value already exists.";
+ throw python_json_error(os.str());
+ }
+ }
+
+ void end_parse() {}
+
+ void begin_array()
+ {
+ if (m_root)
+ {
+ PyObject* array = push_value(PyList_New(0));
+ m_stack.push_back(parser_stack(array, json::node_t::array));
+ }
+ else
+ {
+ m_root = PyList_New(0);
+ m_stack.push_back(parser_stack(m_root, json::node_t::array));
+ }
+ }
+
+ void end_array()
+ {
+ if (m_stack.empty())
+ {
+ std::ostringstream os;
+ os << BOOST_CURRENT_FUNCTION << ": Stack is unexpectedly empty.";
+ throw python_json_error(os.str());
+ }
+
+ m_stack.pop_back();
+ }
+
+ void begin_object()
+ {
+ if (m_root)
+ {
+ PyObject* dict = push_value(PyDict_New());
+ m_stack.push_back(parser_stack(dict, json::node_t::object));
+ }
+ else
+ {
+ m_root = PyDict_New();
+ m_stack.push_back(parser_stack(m_root, json::node_t::object));
+ }
+ }
+
+ void object_key(std::string_view key, bool /*transient*/)
+ {
+ parser_stack& cur = m_stack.back();
+ cur.key = PyUnicode_FromStringAndSize(key.data(), key.size());
+ }
+
+ void end_object()
+ {
+ if (m_stack.empty())
+ {
+ std::ostringstream os;
+ os << BOOST_CURRENT_FUNCTION << ": Stack is unexpectedly empty.";
+ throw python_json_error(os.str());
+ }
+
+ m_stack.pop_back();
+ }
+
+ void boolean_true()
+ {
+ Py_INCREF(Py_True);
+ push_value(Py_True);
+ }
+
+ void boolean_false()
+ {
+ Py_INCREF(Py_False);
+ push_value(Py_False);
+ }
+
+ void null()
+ {
+ Py_INCREF(Py_None);
+ push_value(Py_None);
+ }
+
+ void string(std::string_view val, bool /*transient*/)
+ {
+ push_value(PyUnicode_FromStringAndSize(val.data(), val.size()));
+ }
+
+ void number(double val)
+ {
+ push_value(PyFloat_FromDouble(val));
+ }
+
+ PyObject* get_root()
+ {
+ PyObject* o = m_root;
+ m_root = nullptr;
+ return o;
+ }
+};
+
+PyObject* json_loads(PyObject* /*module*/, PyObject* args, PyObject* kwargs)
+{
+ char* stream = nullptr;
+ static const char* kwlist[] = { "s", nullptr };
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s", const_cast<char**>(kwlist), &stream))
+ {
+ PyErr_SetString(PyExc_TypeError, "The method must be given a string.");
+ return nullptr;
+ }
+
+ json_parser_handler hdl;
+ orcus::json_parser<json_parser_handler> parser(stream, hdl);
+ try
+ {
+ parser.parse();
+ return hdl.get_root();
+ }
+ catch (const orcus::parse_error& e)
+ {
+ PyErr_SetString(PyExc_TypeError, e.what());
+ }
+ return nullptr;
+}
+
+PyMethodDef orcus_methods[] =
+{
+ { "loads", (PyCFunction)json_loads, METH_VARARGS | METH_KEYWORDS, "Load JSON string into a Python object." },
+ { nullptr, nullptr, 0, nullptr }
+};
+
+struct PyModuleDef moduledef =
+{
+ PyModuleDef_HEAD_INIT,
+ "_orcus_json",
+ nullptr,
+ sizeof(struct module_state),
+ orcus_methods,
+ nullptr,
+ orcus_traverse,
+ orcus_clear,
+ nullptr
+};
+
+}
+
+}}
+
+extern "C" {
+
+ORCUS_DLLPUBLIC PyObject* PyInit__orcus_json()
+{
+ PyObject* m = PyModule_Create(&orcus::python::moduledef);
+ return m;
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/python/memory.cpp b/src/python/memory.cpp
new file mode 100644
index 0000000..d2bbd09
--- /dev/null
+++ b/src/python/memory.cpp
@@ -0,0 +1,46 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "memory.hpp"
+
+namespace orcus { namespace python {
+
+void pyobj_unique_deleter::operator ()(PyObject* p) const
+{
+ Py_XDECREF(p);
+}
+
+py_scoped_ref::py_scoped_ref() : m_pyobj(nullptr) {}
+py_scoped_ref::py_scoped_ref(PyObject* p) : m_pyobj(p) {}
+
+py_scoped_ref::~py_scoped_ref()
+{
+ if (m_pyobj)
+ Py_DECREF(m_pyobj);
+}
+
+py_scoped_ref& py_scoped_ref::operator= (PyObject* p)
+{
+ if (m_pyobj)
+ Py_DECREF(m_pyobj);
+ m_pyobj = p;
+ return *this;
+}
+
+PyObject* py_scoped_ref::get()
+{
+ return m_pyobj;
+}
+
+py_scoped_ref::operator bool() const
+{
+ return m_pyobj != nullptr;
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/python/memory.hpp b/src/python/memory.hpp
new file mode 100644
index 0000000..ecc7d65
--- /dev/null
+++ b/src/python/memory.hpp
@@ -0,0 +1,41 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_PYTHON_MEMORY_HPP
+#define INCLUDED_ORCUS_PYTHON_MEMORY_HPP
+
+#include <memory>
+#include <Python.h>
+
+namespace orcus { namespace python {
+
+struct pyobj_unique_deleter
+{
+ void operator() (PyObject* p) const;
+};
+
+using py_unique_ptr = std::unique_ptr<PyObject, pyobj_unique_deleter>;
+
+class py_scoped_ref
+{
+ PyObject* m_pyobj;
+public:
+ py_scoped_ref();
+ py_scoped_ref(PyObject* p);
+ ~py_scoped_ref();
+
+ py_scoped_ref& operator= (PyObject* p);
+ PyObject* get();
+ operator bool() const;
+};
+
+}}
+
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/python/named_expression.cpp b/src/python/named_expression.cpp
new file mode 100644
index 0000000..1402daa
--- /dev/null
+++ b/src/python/named_expression.cpp
@@ -0,0 +1,215 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "named_expression.hpp"
+#include "formula_token.hpp"
+#include "formula_tokens.hpp"
+#include "orcus/spreadsheet/document.hpp"
+
+#include <ixion/formula.hpp>
+#include <ixion/model_context.hpp>
+#include <ixion/named_expressions_iterator.hpp>
+#include <ixion/formula_name_resolver.hpp>
+#include <structmember.h>
+
+namespace ss = orcus::spreadsheet;
+
+namespace orcus { namespace python {
+
+namespace {
+
+/** non-python part of the object. */
+struct named_exp_data
+{
+ const ss::document* doc = nullptr;
+ const ixion::formula_tokens_t* tokens = nullptr;
+ ixion::abs_address_t origin;
+};
+
+/**
+ * Python object for orcus.NamedExpression.
+ */
+struct pyobj_named_exp
+{
+ PyObject_HEAD
+
+ PyObject* origin;
+ PyObject* formula;
+
+ named_exp_data* data;
+};
+
+inline pyobj_named_exp* t(PyObject* self)
+{
+ return reinterpret_cast<pyobj_named_exp*>(self);
+}
+
+void init_members(pyobj_named_exp* self)
+{
+ Py_INCREF(Py_None);
+ self->origin = Py_None;
+
+ Py_INCREF(Py_None);
+ self->formula = Py_None;
+}
+
+void tp_dealloc(pyobj_named_exp* self)
+{
+ delete self->data;
+ self->data = nullptr;
+
+ Py_CLEAR(self->origin);
+ Py_CLEAR(self->formula);
+
+ Py_TYPE(self)->tp_free(reinterpret_cast<PyObject*>(self));
+}
+
+int tp_init(pyobj_named_exp* self, PyObject* /*args*/, PyObject* /*kwargs*/)
+{
+ init_members(self);
+ return 0;
+}
+
+PyObject* tp_new(PyTypeObject* type, PyObject* /*args*/, PyObject* /*kwargs*/)
+{
+ pyobj_named_exp* self = (pyobj_named_exp*)type->tp_alloc(type, 0);
+ self->data = new named_exp_data;
+ return reinterpret_cast<PyObject*>(self);
+}
+
+PyObject* ne_get_formula_tokens(PyObject* self, PyObject* /*args*/, PyObject* /*kwargs*/)
+{
+ named_exp_data& data = *t(self)->data;
+ if (!data.tokens)
+ {
+ Py_INCREF(Py_None);
+ return Py_None;
+ }
+
+ return create_formula_tokens_iterator_object(*data.doc, data.origin, *data.tokens);
+}
+
+PyMethodDef tp_methods[] =
+{
+ { "get_formula_tokens", (PyCFunction)ne_get_formula_tokens, METH_NOARGS, "Get a formula tokens iterator." },
+ { nullptr }
+};
+
+PyMemberDef tp_members[] =
+{
+ { (char*)"origin", T_OBJECT_EX, offsetof(pyobj_named_exp, origin), READONLY, (char*)"anchoring cell for the named expression" },
+ { (char*)"formula", T_OBJECT_EX, offsetof(pyobj_named_exp, formula), READONLY, (char*)"formula string" },
+ { nullptr }
+};
+
+PyTypeObject named_exp_type =
+{
+ PyVarObject_HEAD_INIT(nullptr, 0)
+ "orcus.NamedExpression", // tp_name
+ sizeof(pyobj_named_exp), // tp_basicsize
+ 0, // tp_itemsize
+ (destructor)tp_dealloc, // tp_dealloc
+ 0, // tp_print
+ 0, // tp_getattr
+ 0, // tp_setattr
+ 0, // tp_compare
+ 0, // tp_repr
+ 0, // tp_as_number
+ 0, // tp_as_sequence
+ 0, // tp_as_mapping
+ 0, // tp_hash
+ 0, // tp_call
+ 0, // tp_str
+ 0, // tp_getattro
+ 0, // tp_setattro
+ 0, // tp_as_buffer
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, // tp_flags
+ "orcus spreadsheet named expression", // tp_doc
+ 0, // tp_traverse
+ 0, // tp_clear
+ 0, // tp_richcompare
+ 0, // tp_weaklistoffset
+ 0, // tp_iter
+ 0, // tp_iternext
+ tp_methods, // tp_methods
+ tp_members, // tp_members
+ 0, // tp_getset
+ 0, // tp_base
+ 0, // tp_dict
+ 0, // tp_descr_get
+ 0, // tp_descr_set
+ 0, // tp_dictoffset
+ (initproc)tp_init, // tp_init
+ 0, // tp_alloc
+ tp_new, // tp_new
+};
+
+} // anonymous namespace
+
+PyObject* create_named_exp_object(const spreadsheet::document& doc, const ixion::named_expression_t* exp)
+{
+ PyTypeObject* named_exp_type = get_named_exp_type();
+ if (!named_exp_type)
+ {
+ PyErr_SetString(PyExc_RuntimeError, "Failed to get the named expression type object.");
+ return nullptr;
+ }
+
+ PyObject* obj = named_exp_type->tp_new(named_exp_type, nullptr, nullptr);
+ if (!obj)
+ {
+ PyErr_SetString(PyExc_RuntimeError, "Failed to instantiate a named expression object.");
+ return nullptr;
+ }
+
+ pyobj_named_exp* self = reinterpret_cast<pyobj_named_exp*>(obj);
+ init_members(self);
+
+ if (exp)
+ {
+ named_exp_data& data = *self->data;
+ data.doc = &doc;
+ data.origin = exp->origin;
+ data.tokens = &exp->tokens;
+
+ const ixion::model_context& cxt = doc.get_model_context();
+ auto* resolver = doc.get_formula_name_resolver(spreadsheet::formula_ref_context_t::global);
+
+ // Create base
+ std::string origin_s = resolver->get_name(exp->origin, ixion::abs_address_t(), true);
+ self->origin = PyUnicode_FromStringAndSize(origin_s.data(), origin_s.size());
+
+ // Create formula expression string.
+ std::string formula_s = ixion::print_formula_tokens(cxt, exp->origin, *resolver, exp->tokens);
+ self->formula = PyUnicode_FromStringAndSize(formula_s.data(), formula_s.size());
+ }
+
+ return obj;
+}
+
+PyObject* create_named_exp_dict(const ss::document& doc, ixion::named_expressions_iterator iter)
+{
+ PyObject* dict = PyDict_New();
+ for (; iter.has(); iter.next())
+ {
+ auto ne = iter.get();
+ PyObject* name = PyUnicode_FromStringAndSize(ne.name->data(), ne.name->size());
+ PyObject* tokens = create_named_exp_object(doc, ne.expression);
+ PyDict_SetItem(dict, name, tokens);
+ }
+
+ return dict;
+}
+
+PyTypeObject* get_named_exp_type()
+{
+ return &named_exp_type;
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/python/named_expression.hpp b/src/python/named_expression.hpp
new file mode 100644
index 0000000..5473d6f
--- /dev/null
+++ b/src/python/named_expression.hpp
@@ -0,0 +1,42 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_PYTHON_NAMED_EXPRESSION_HPP
+#define INCLUDED_ORCUS_PYTHON_NAMED_EXPRESSION_HPP
+
+#include "orcus/spreadsheet/types.hpp"
+
+#include <Python.h>
+#include <ixion/formula_tokens_fwd.hpp>
+
+namespace ixion {
+
+class named_expressions_iterator;
+
+}
+
+namespace orcus {
+
+namespace spreadsheet {
+
+class document;
+
+}
+
+namespace python {
+
+PyObject* create_named_exp_object(const spreadsheet::document& doc, const ixion::named_expression_t* exp);
+
+PyObject* create_named_exp_dict(const spreadsheet::document& doc, ixion::named_expressions_iterator iter);
+
+PyTypeObject* get_named_exp_type();
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/python/named_expressions.cpp b/src/python/named_expressions.cpp
new file mode 100644
index 0000000..6faffee
--- /dev/null
+++ b/src/python/named_expressions.cpp
@@ -0,0 +1,218 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "named_expressions.hpp"
+#include "named_expression.hpp"
+#include "global.hpp"
+#include "orcus/spreadsheet/document.hpp"
+
+#include <ixion/formula.hpp>
+#include <ixion/model_context.hpp>
+#include <ixion/named_expressions_iterator.hpp>
+#include <ixion/formula_name_resolver.hpp>
+#include <structmember.h>
+
+namespace ss = orcus::spreadsheet;
+
+namespace orcus { namespace python {
+
+namespace {
+
+/** non-python part. */
+struct named_exps_data
+{
+ ss::sheet_t origin_sheet = -1; // -1 for global, >=0 for sheet local.
+ const ss::document* doc = nullptr;
+ ixion::named_expressions_iterator src; // original iterator to copy from.
+ ixion::named_expressions_iterator iter;
+};
+
+/** python object. */
+struct pyobj_named_exps
+{
+ PyObject_HEAD
+
+ named_exps_data* data;
+};
+
+inline pyobj_named_exps* t(PyObject* self)
+{
+ return reinterpret_cast<pyobj_named_exps*>(self);
+}
+
+PyObject* named_exps_names(PyObject* self, PyObject* /*args*/, PyObject* /*kwargs*/)
+{
+ named_exps_data& data = *t(self)->data;
+ PyObject* s = PySet_New(nullptr);
+
+ for (auto iter = data.src; iter.has(); iter.next())
+ {
+ const std::string* name = iter.get().name;
+ PySet_Add(s, PyUnicode_FromStringAndSize(name->data(), name->size()));
+ }
+
+ return s;
+}
+
+void tp_dealloc(pyobj_named_exps* self)
+{
+ delete self->data;
+ Py_TYPE(self)->tp_free(reinterpret_cast<PyObject*>(self));
+}
+
+int tp_init(pyobj_named_exps* /*self*/, PyObject* /*args*/, PyObject* /*kwargs*/)
+{
+ return 0;
+}
+
+PyObject* tp_new(PyTypeObject* type, PyObject* /*args*/, PyObject* /*kwargs*/)
+{
+ pyobj_named_exps* self = t(type->tp_alloc(type, 0));
+ self->data = new named_exps_data;
+ return reinterpret_cast<PyObject*>(self);
+}
+
+PyObject* tp_iter(PyObject* self)
+{
+ named_exps_data& data = *t(self)->data;
+ data.iter = data.src;
+
+ Py_INCREF(self);
+ return self;
+}
+
+PyObject* tp_iternext(PyObject* self)
+{
+ named_exps_data& data = *t(self)->data;
+ auto& iter = data.iter;
+
+ if (!iter.has())
+ {
+ PyErr_SetNone(PyExc_StopIteration);
+ return nullptr;
+ }
+
+ ixion::named_expressions_iterator::named_expression item = iter.get();
+ iter.next();
+
+ PyObject* name = PyUnicode_FromStringAndSize(item.name->data(), item.name->size());
+ if (!name)
+ return nullptr;
+
+ PyObject* ne = create_named_exp_object(*data.doc, item.expression);
+ if (!ne)
+ return nullptr;
+
+ PyObject* tup = PyTuple_New(2);
+ PyTuple_SET_ITEM(tup, 0, name);
+ PyTuple_SET_ITEM(tup, 1, ne);
+
+ return tup;
+}
+
+Py_ssize_t sq_length(PyObject* self)
+{
+ named_exps_data& data = *t(self)->data;
+ return data.src.size();
+}
+
+PySequenceMethods tp_as_sequence =
+{
+ sq_length, // lenfunc sq_length
+ 0, // binaryfunc sq_concat
+ 0, // ssizeargfunc sq_repeat
+ 0, // ssizeargfunc sq_item
+ 0, // void *was_sq_slice
+ 0, // ssizeobjargproc sq_ass_item
+ 0, // void *was_sq_ass_slice
+ 0, // objobjproc sq_contains
+ 0, // binaryfunc sq_inplace_concat
+ 0, // ssizeargfunc sq_inplace_repeat
+};
+
+PyMethodDef tp_methods[] =
+{
+ { "names", (PyCFunction)named_exps_names, METH_NOARGS, "Get names for all named expressions stored." },
+ { nullptr }
+};
+
+PyMemberDef tp_members[] =
+{
+ { nullptr }
+};
+
+PyTypeObject named_exps_type =
+{
+ PyVarObject_HEAD_INIT(nullptr, 0)
+ "orcus.NamedExpressions", // tp_name
+ sizeof(pyobj_named_exps), // tp_basicsize
+ 0, // tp_itemsize
+ (destructor)tp_dealloc, // tp_dealloc
+ 0, // tp_print
+ 0, // tp_getattr
+ 0, // tp_setattr
+ 0, // tp_compare
+ 0, // tp_repr
+ 0, // tp_as_number
+ &tp_as_sequence, // tp_as_sequence
+ 0, // tp_as_mapping
+ 0, // tp_hash
+ 0, // tp_call
+ 0, // tp_str
+ 0, // tp_getattro
+ 0, // tp_setattro
+ 0, // tp_as_buffer
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, // tp_flags
+ "orcus spreadsheet formula tokens", // tp_doc
+ 0, // tp_traverse
+ 0, // tp_clear
+ 0, // tp_richcompare
+ 0, // tp_weaklistoffset
+ tp_iter, // tp_iter
+ tp_iternext, // tp_iternext
+ tp_methods, // tp_methods
+ tp_members, // tp_members
+ 0, // tp_getset
+ 0, // tp_base
+ 0, // tp_dict
+ 0, // tp_descr_get
+ 0, // tp_descr_set
+ 0, // tp_dictoffset
+ (initproc)tp_init, // tp_init
+ 0, // tp_alloc
+ tp_new, // tp_new
+};
+
+} // anonymous namespace
+
+PyObject* create_named_expressions_object(
+ spreadsheet::sheet_t origin_sheet, const spreadsheet::document& doc, ixion::named_expressions_iterator iter)
+{
+ PyTypeObject* type = get_named_exps_type();
+
+ PyObject* obj = create_object_from_type(type);
+ if (!obj)
+ return nullptr;
+
+ type->tp_init(obj, nullptr, nullptr);
+
+ named_exps_data& data = *t(obj)->data;
+ data.src = iter;
+ data.origin_sheet = origin_sheet;
+ data.doc = &doc;
+
+ return obj;
+}
+
+PyTypeObject* get_named_exps_type()
+{
+ return &named_exps_type;
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/python/named_expressions.hpp b/src/python/named_expressions.hpp
new file mode 100644
index 0000000..cfad195
--- /dev/null
+++ b/src/python/named_expressions.hpp
@@ -0,0 +1,41 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_PYTHON_NAMED_EXPRESSIONS_HPP
+#define INCLUDED_ORCUS_PYTHON_NAMED_EXPRESSIONS_HPP
+
+#include "orcus/spreadsheet/types.hpp"
+
+#include <Python.h>
+#include <ixion/formula_tokens_fwd.hpp>
+
+namespace ixion {
+
+class named_expressions_iterator;
+
+}
+
+namespace orcus {
+
+namespace spreadsheet {
+
+class document;
+
+}
+
+namespace python {
+
+PyObject* create_named_expressions_object(
+ spreadsheet::sheet_t origin_sheet, const spreadsheet::document& doc, ixion::named_expressions_iterator iter);
+
+PyTypeObject* get_named_exps_type();
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/python/ods.cpp b/src/python/ods.cpp
new file mode 100644
index 0000000..0a7f5ad
--- /dev/null
+++ b/src/python/ods.cpp
@@ -0,0 +1,58 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "ods.hpp"
+#include "global.hpp"
+
+#ifdef __ORCUS_PYTHON_ODS
+#include "document.hpp"
+#include "orcus/orcus_ods.hpp"
+#include "orcus/spreadsheet/document.hpp"
+#include "orcus/spreadsheet/factory.hpp"
+#endif
+
+namespace orcus { namespace python {
+
+#ifdef __ORCUS_PYTHON_ODS
+
+PyObject* ods_read(PyObject* /*module*/, PyObject* args, PyObject* kwargs)
+{
+ stream_with_formulas data = read_stream_and_formula_params_from_args(args, kwargs);
+ if (!data.stream)
+ return nullptr;
+
+ try
+ {
+ spreadsheet::range_size_t ss{1048576, 16384};
+ std::unique_ptr<spreadsheet::document> doc = std::make_unique<spreadsheet::document>(ss);
+ spreadsheet::import_factory fact(*doc);
+ fact.set_recalc_formula_cells(data.recalc_formula_cells);
+ fact.set_formula_error_policy(data.error_policy);
+ orcus_ods app(&fact);
+
+ return import_from_stream_into_document(data.stream.get(), app, std::move(doc));
+ }
+ catch (const std::exception& e)
+ {
+ set_python_exception(PyExc_RuntimeError, e);
+ return nullptr;
+ }
+}
+
+#else
+
+PyObject* ods_read(PyObject*, PyObject*, PyObject*)
+{
+ PyErr_SetString(PyExc_RuntimeError, "The ods module is not enabled.");
+ return nullptr;
+}
+
+#endif
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/python/ods.hpp b/src/python/ods.hpp
new file mode 100644
index 0000000..a25c861
--- /dev/null
+++ b/src/python/ods.hpp
@@ -0,0 +1,21 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_PYTHON_ODS_HPP
+#define INCLUDED_ORCUS_PYTHON_ODS_HPP
+
+#include <Python.h>
+
+namespace orcus { namespace python {
+
+PyObject* ods_read(PyObject* module, PyObject* args, PyObject* kwargs);
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/python/orcus/__init__.py b/src/python/orcus/__init__.py
new file mode 100644
index 0000000..4914d95
--- /dev/null
+++ b/src/python/orcus/__init__.py
@@ -0,0 +1,111 @@
+#######################################################################
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+########################################################################
+
+try:
+ from _orcus import *
+ from _orcus import __version__
+except ModuleNotFoundError:
+ # We do this to enable sphinx to generate documentation without having to
+ # build the C++ part.
+ pass
+
+from enum import Enum
+
+
+class FormatType(Enum):
+ """Collection of file format types currently used in orcus."""
+
+ UNKNOWN = 0
+ ODS = 1
+ XLSX = 2
+ GNUMERIC = 3
+ XLS_XML = 4
+ CSV = 5
+ YAML = 6
+ JSON = 7
+ XML = 8
+ PARQUET = 9
+
+
+class CellType(Enum):
+ """Collection of cell types stored in spreadsheet."""
+
+ UNKNOWN = 0
+ EMPTY = 1
+ BOOLEAN = 2
+ NUMERIC = 3
+ STRING = 4
+ STRING_WITH_ERROR = 5
+ FORMULA = 6
+ FORMULA_WITH_ERROR = 7
+
+
+class FormulaTokenType(Enum):
+ """Collection of formula token types."""
+
+ UNKNOWN = 0
+ REFERENCE = 1
+ VALUE = 2
+ NAME = 3
+ FUNCTION = 4
+ OPERATOR = 5
+ ERROR = 6
+
+
+class FormulaTokenOp(Enum):
+ """Collection of formula token opcodes."""
+
+ UNKNOWN = 0
+ SINGLE_REF = 1
+ RANGE_REF = 2
+ TABLE_REF = 3
+ NAMED_EXPRESSION = 4
+ STRING = 5
+ VALUE = 6
+ FUNCTION = 7
+ PLUS = 8
+ MINUS = 9
+ DIVIDE = 10
+ MULTIPLY = 11
+ EXPONENT = 12
+ CONCAT = 13
+ EQUAL = 14
+ NOT_EQUAL = 15
+ LESS = 16
+ GREATER = 17
+ LESS_EQUAL = 18
+ GREATER_EQUAL = 19
+ OPEN = 20
+ CLOSE = 21
+ SEP = 22
+ ERROR = 23
+
+
+def get_document_loader_module(format_type):
+ """Obtain a document loader module for the specified format type.
+
+ Args:
+ format_type (orcus.FormatType):
+ Format type for which to load a document loader.
+
+ Returns:
+ Document loader module.
+ """
+ m = None
+ if format_type == FormatType.ODS:
+ from . import ods as m
+ elif format_type == FormatType.XLSX:
+ from . import xlsx as m
+ elif format_type == FormatType.XLS_XML:
+ from . import xls_xml as m
+ elif format_type == FormatType.GNUMERIC:
+ from . import gnumeric as m
+ elif format_type == FormatType.CSV:
+ from . import csv as m
+
+ return m
diff --git a/src/python/orcus/csv.py b/src/python/orcus/csv.py
new file mode 100644
index 0000000..bad095f
--- /dev/null
+++ b/src/python/orcus/csv.py
@@ -0,0 +1,10 @@
+########################################################################
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+########################################################################
+
+from _orcus import _csv_read as read
+
diff --git a/src/python/orcus/gnumeric.py b/src/python/orcus/gnumeric.py
new file mode 100644
index 0000000..d7f0f23
--- /dev/null
+++ b/src/python/orcus/gnumeric.py
@@ -0,0 +1,10 @@
+########################################################################
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+########################################################################
+
+from _orcus import _gnumeric_read as read
+
diff --git a/src/python/orcus/json.py b/src/python/orcus/json.py
new file mode 100644
index 0000000..d351766
--- /dev/null
+++ b/src/python/orcus/json.py
@@ -0,0 +1,10 @@
+########################################################################
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+########################################################################
+
+from _orcus_json import *
+
diff --git a/src/python/orcus/ods.py b/src/python/orcus/ods.py
new file mode 100644
index 0000000..8bcf2b9
--- /dev/null
+++ b/src/python/orcus/ods.py
@@ -0,0 +1,10 @@
+########################################################################
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+########################################################################
+
+from _orcus import _ods_read as read
+
diff --git a/src/python/orcus/tools/__init__.py b/src/python/orcus/tools/__init__.py
new file mode 100644
index 0000000..413bd0a
--- /dev/null
+++ b/src/python/orcus/tools/__init__.py
@@ -0,0 +1,9 @@
+########################################################################
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+########################################################################
+
+
diff --git a/src/python/orcus/tools/bugzilla.py b/src/python/orcus/tools/bugzilla.py
new file mode 100644
index 0000000..f23b4d5
--- /dev/null
+++ b/src/python/orcus/tools/bugzilla.py
@@ -0,0 +1,219 @@
+########################################################################
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+########################################################################
+
+import argparse
+import requests
+import json
+import os
+import base64
+import traceback
+import concurrent.futures as cf
+from pathlib import Path
+from urllib.parse import urlparse
+
+
+class BugzillaAccess:
+ """Encapsulates access to a bugzilla server by using its REST API.
+
+ Args:
+ bzurl (str): URL to the bugzilla server.
+ cache_dir (:obj:`pathlib.Path`): path to the cache directory.
+ """
+
+ def __init__(self, bzurl, cache_dir):
+ self._bzurl = bzurl
+ self._cache_dir = cache_dir
+ os.makedirs(self._cache_dir, exist_ok=True)
+
+ def _get_cache_content(self, cache_file, func_fetch):
+ if os.path.isfile(cache_file):
+ with open(cache_file, 'r') as f:
+ return f.read()
+
+ s = func_fetch()
+ with open(cache_file, 'w') as f:
+ f.write(s)
+
+ return s
+
+ def get_bug_ids(self, bz_params):
+ """Get all bug ID's for specified bugzilla query parameters.
+
+ Args:
+ bz_params (dict):
+ dictionary containing all search parameters. Each search term
+ must form a single key-value pair.
+
+ Returns (:obj:`list` of :obj:`str`):
+ list of bug ID strings.
+ """
+
+ def _fetch():
+ r = requests.get(
+ f"{self._bzurl}/rest/bug",
+ params=bz_params
+ )
+
+ if r.status_code != 200:
+ raise RuntimeError(f"failed to query bug ids from the TDF bugzilla! (status:{r.status_code})")
+ return r.text
+
+ escape_chars = " /"
+ buf = []
+ for key in bz_params.keys():
+ v = str(bz_params[key])
+ for c in escape_chars:
+ v = v.replace(c, '-')
+ buf.append(key)
+ buf.append(v)
+
+ cache_file = '-'.join(buf) + ".json"
+ cache_file = self._cache_dir / cache_file
+ s = self._get_cache_content(cache_file, _fetch)
+
+ content = json.loads(s)
+ bugs = content.get("bugs")
+ if not bugs:
+ return []
+
+ bug_ids = [bug.get("id") for bug in bugs]
+ bug_ids = [x for x in filter(None, bug_ids)]
+ return bug_ids
+
+ def get_attachments(self, bug_id):
+ """Fetch all attachments for specified bug."""
+
+ def _fetch():
+ r = requests.get(f"{self._bzurl}/rest/bug/{bug_id}/attachment")
+ if r.status_code != 200:
+ raise RuntimeError(
+ f"failed to fetch the attachments for bug {bug_id}! (status:{r.status_code})")
+ return r.text
+
+ cache_file = self._cache_dir / f"attachments-{bug_id}.json"
+ s = self._get_cache_content(cache_file, _fetch)
+ content = json.loads(s)
+ attachments = list()
+ for d in content["bugs"][str(bug_id)]:
+ data = d["data"]
+ if not data:
+ continue
+ bytes = base64.b64decode(data)
+ attachments.append({
+ "content_type": d["content_type"],
+ "filename": d["file_name"],
+ "data": bytes
+ })
+ return attachments
+
+
+def parse_query_params(queries):
+ bz_params = dict()
+ for query in queries:
+ k, v = query.split('=')
+ if v and v[0] in ('"', "'"):
+ if v[0] != v[-1]:
+ raise argparse.ArgumentError(f"mis-matched quotes in {query}")
+ v = v[1:-1]
+ bz_params[k] = v
+ return bz_params
+
+
+def _create_argparser():
+ parser = argparse.ArgumentParser(
+ description="""This command allows you to download attachments from a
+bugzilla server that supports REST API.""")
+ parser.add_argument(
+ "--outdir", "-o", type=str, required=True,
+ help="""output directory for downloaded files. Downloaded files are
+grouped by their respective bug ID's.""")
+ parser.add_argument(
+ "--limit", type=int, default=50,
+ help="number of bugs to include in a single set of search results.")
+ parser.add_argument(
+ "--offset", type=int, default=0,
+ help="number of bugs to skip in the search results.")
+ parser.add_argument(
+ "--cont", action="store_true", default=False,
+ help="""when specified, the search continues after the initial batch
+is returned, by retrieving the next batch of results until the entire search
+results are returned. The number specified by the ``--limit`` option is used
+as the batch size.""")
+ parser.add_argument(
+ "--worker", type=int, default=8,
+ help="number of worker threads to use for parallel downloads of files.")
+ parser.add_argument(
+ "--cache-dir", type=Path, default=Path(".bugzilla"),
+ help="""directory to keep downloaded bugzilla search results. The
+command will not send the query request to the remote server when the results
+are cached. You may want to delete the cache directory after you are finished.""")
+ parser.add_argument(
+ "--url", type=str, required=True,
+ help="""base URL for bugzilla service. It must begin with the
+``http(s)://`` prefix.""")
+ parser.add_argument(
+ "query", type=str, nargs='*',
+ help="""One or more query term to use to limit your search. Each query
+term must be in the form key=value. You need to quote the value string when the
+value string contains whitespace character i.e. key="value with space".""")
+ return parser
+
+
+def main():
+ parser = _create_argparser()
+ args = parser.parse_args()
+
+ bz_params = parse_query_params(args.query)
+
+ for k, v in bz_params.items():
+ print(f"{k}: {v}")
+
+ bz_params["limit"] = args.limit
+ bz_params["offset"] = args.offset
+
+ url = urlparse(args.url)
+ cache_dir = Path(args.cache_dir) / url.netloc
+ bz = BugzillaAccess(args.url, cache_dir)
+
+ def _run(bug_id, index, totals):
+ """Top-level function for each worker thread."""
+ width = len(str(totals))
+ index_s = str(index+1)
+ index_s = ' ' * (width - len(index_s)) + index_s
+ print(f"({index_s}/{totals}) fetching attachments for bug {bug_id} ...", flush=True)
+
+ try:
+ attachments = bz.get_attachments(bug_id)
+ for attachment in attachments:
+ filepath = Path(args.outdir) / url.netloc / str(bug_id) / attachment["filename"]
+ os.makedirs(os.path.dirname(filepath), exist_ok=True)
+ with open(filepath, "wb") as f:
+ f.write(attachment["data"])
+ except Exception as e:
+ traceback.print_exc()
+ print(e)
+
+ iter_count = 0
+ while True:
+ bug_ids = bz.get_bug_ids(bz_params)
+ if not bug_ids:
+ return
+ print(f"-- iteration {iter_count+1}", flush=True)
+ with cf.ThreadPoolExecutor(max_workers=args.worker) as executor:
+ for i, bug_id in enumerate(bug_ids):
+ executor.submit(_run, bug_id, i, len(bug_ids))
+
+ if not args.cont:
+ return
+
+ bz_params["offset"] += bz_params["limit"]
+ iter_count += 1
+
+
+if __name__ == "__main__":
+ main()
diff --git a/src/python/orcus/tools/file_processor.py b/src/python/orcus/tools/file_processor.py
new file mode 100644
index 0000000..472fea3
--- /dev/null
+++ b/src/python/orcus/tools/file_processor.py
@@ -0,0 +1,295 @@
+########################################################################
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+########################################################################
+
+import argparse
+import os
+import os.path
+import sys
+import string
+import pathlib
+import enum
+import re
+import multiprocessing as mp
+import importlib.util
+
+import orcus
+
+
+class _Config:
+ ext_good = "orcus-pf.good"
+ ext_bad = "orcus-pf.bad"
+ ext_out = "orcus-pf.out"
+ prefix_skip = ".orcus-pf.skip."
+
+
+config = _Config()
+
+
+def is_special_file(filename):
+ if filename.find(config.prefix_skip) >= 0:
+ return True
+
+ return filename.endswith(config.ext_out) or filename.endswith(config.ext_good) or filename.endswith(config.ext_bad)
+
+
+def skips_by_rule(filename, skip_rules):
+ for rule in skip_rules:
+ if rule.search(filename):
+ return True
+ return False
+
+
+def sanitize_string(s):
+ """Replace non-printable characters with \\x[value]."""
+
+ buf = list()
+ for c in s:
+ if c in string.printable:
+ buf.append(c)
+ else:
+ buf.append(f"\\x{ord(c):02X}")
+
+ return "".join(buf)
+
+
+class LoadStatus(enum.Enum):
+ SUCCESS = 0
+ FAILURE = 1
+ SKIPPED = 2
+
+
+def load_doc(bytes):
+
+ buf = list()
+
+ try:
+ format_type = orcus.detect_format(bytes)
+ except Exception as e:
+ buf.append(str(e))
+ status = LoadStatus.SKIPPED
+ return None, status, buf
+
+ buf.append(f"* format type: {format_type}")
+ buf.append(f"* size: {len(bytes)} bytes")
+
+ doc = None
+
+ try:
+ loader = orcus.get_document_loader_module(format_type)
+ if loader is None:
+ buf.append(f"unhandled format type: {format_type}")
+ status = LoadStatus.SKIPPED
+ return doc, status, buf
+
+ status = LoadStatus.SUCCESS
+ doc = loader.read(bytes, error_policy="skip")
+ return doc, status, buf
+
+ except Exception as e:
+ buf.append(f"{e.__class__.__name__}: {e}")
+ status = LoadStatus.FAILURE
+ return None, status, buf
+
+
+def print_results(inpath):
+ outpath = f"{inpath}.{config.ext_out}"
+ with open(outpath, "r") as f:
+ print()
+ for line in f.readlines():
+ print(f" {line.strip()}")
+ print()
+
+
+def remove_result_files(rootdir):
+ for root, dir, files in os.walk(rootdir):
+ for filename in files:
+ if is_special_file(filename):
+ filepath = os.path.join(root, filename)
+ os.remove(filepath)
+
+
+def show_result_stats(rootdir):
+ counts = dict(good=0, bad=0, skipped=0, unprocessed=0)
+ for root, dir, files in os.walk(rootdir):
+ for filename in files:
+ if is_special_file(filename):
+ continue
+
+ inpath = os.path.join(root, filename)
+ out_filepath = f"{inpath}.{config.ext_out}"
+ good_filepath = f"{inpath}.{config.ext_good}"
+ bad_filepath = f"{inpath}.{config.ext_bad}"
+ if os.path.isfile(good_filepath):
+ counts["good"] += 1
+ elif os.path.isfile(bad_filepath):
+ counts["bad"] += 1
+ elif os.path.isfile(out_filepath):
+ counts["skipped"] += 1
+ else:
+ counts["unprocessed"] += 1
+
+ print("* result counts")
+ for cat in ("good", "bad", "skipped", "unprocessed"):
+ print(f" * {cat}: {counts[cat]}")
+
+ total = counts["good"] + counts["bad"]
+ if total:
+ print("* ratios")
+ print(f" * good: {counts['good']/total*100:.1f}%")
+ print(f" * bad: {counts['bad']/total*100:.1f}%")
+
+
+def show_results(rootdir, good, bad):
+ for root, dir, files in os.walk(rootdir):
+ for filename in files:
+ if is_special_file(filename):
+ continue
+ inpath = os.path.join(root, filename)
+ good_filepath = f"{inpath}.{config.ext_good}"
+ bad_filepath = f"{inpath}.{config.ext_bad}"
+
+ if os.path.isfile(good_filepath) and good:
+ print(sanitize_string(inpath), flush=True)
+ print_results(inpath)
+ elif os.path.isfile(bad_filepath) and bad:
+ print(sanitize_string(inpath), flush=True)
+ print_results(inpath)
+ else:
+ continue
+
+
+def load_module_from_filepath(filepath):
+ if not os.path.isfile(filepath):
+ raise RuntimeError(f"{filepath} is not a valid file.")
+
+ mod_name = os.path.splitext(os.path.basename(filepath))[0]
+ mod_name = mod_name.replace('-', '_')
+ spec = importlib.util.spec_from_file_location(mod_name, filepath)
+ mod = importlib.util.module_from_spec(spec)
+ spec.loader.exec_module(mod)
+ return mod
+
+
+def process_filepath(i, inpath, outpath, processor_path):
+ mod = load_module_from_filepath(processor_path) if processor_path else None
+ term_buf = list() # terminal output buffer
+ term_buf.append(f"{i} {sanitize_string(inpath)}")
+
+ good_filepath = f"{inpath}.{config.ext_good}"
+ bad_filepath = f"{inpath}.{config.ext_bad}"
+
+ if os.path.isfile(good_filepath) or os.path.isfile(bad_filepath):
+ term_buf.append("already processed. skipping...")
+ return "\n".join(term_buf)
+
+ success = False
+ with open(inpath, 'rb') as f:
+ bytes = f.read()
+
+ buf = list() # non-terminal output buffer
+ doc, status, output = load_doc(bytes)
+ buf.extend(output)
+ if doc and mod:
+ buf.extend(mod.process_document(inpath, doc))
+
+ with open(outpath, "w") as f:
+ f.write("\n".join(buf))
+
+ term_buf.extend(buf)
+
+ if status == LoadStatus.SUCCESS:
+ pathlib.Path(good_filepath).touch()
+ elif status == LoadStatus.FAILURE:
+ pathlib.Path(bad_filepath).touch()
+
+ return "\n".join(term_buf)
+
+
+def _create_argparser():
+ parser = argparse.ArgumentParser(
+ description="""This script allows you to process a collection of spreadsheet documents.""")
+ parser.add_argument(
+ "--skip-file", type=argparse.FileType("r"),
+ help="Optional text file containing a set of regular expressions (one per line). Files that match one of these rules will be skipped.")
+ parser.add_argument("--processes", type=int, default=1, help="Number of worker processes to use.")
+ parser.add_argument("-p", "--processor", type=str, help="Python module file containing callback functions.")
+ parser.add_argument(
+ "--remove-results", action="store_true", default=False,
+ help="Remove all cached results files from the directory tree.")
+ parser.add_argument(
+ "--results", action="store_true", default=False,
+ help="Display the results of the processed files.")
+ parser.add_argument(
+ "--good", action="store_true", default=False,
+ help="Display the results of the successfully processed files.")
+ parser.add_argument(
+ "--bad", action="store_true", default=False,
+ help="Display the results of the unsuccessfully processed files.")
+ parser.add_argument(
+ "--stats", action="store_true", default=False,
+ help="Display statistics of the results. Use it with --results.")
+ parser.add_argument(
+ "rootdir", metavar="ROOT-DIR",
+ help="Root directory below which to recursively find and process test files.")
+ return parser
+
+
+def main():
+ parser = _create_argparser()
+ args = parser.parse_args()
+
+ if args.remove_results:
+ remove_result_files(args.rootdir)
+ return
+
+ if args.results:
+ if args.stats:
+ show_result_stats(args.rootdir)
+ return
+
+ show_results(args.rootdir, args.good, args.bad)
+ return
+
+ skip_rules = list()
+
+ if args.skip_file:
+ for line in args.skip_file.readlines():
+ line = line.strip()
+ if not line:
+ continue
+ rule = re.compile(line)
+ skip_rules.append(rule)
+
+ # build a list of files to process.
+ filepaths = list()
+ for root, dir, files in os.walk(args.rootdir):
+ for filename in files:
+ if is_special_file(filename):
+ continue
+
+ inpath = os.path.join(root, filename)
+ outpath = f"{inpath}.{config.ext_out}"
+ if skips_by_rule(inpath, skip_rules):
+ pathlib.Path(outpath).touch()
+ continue
+
+ filepaths.append((inpath, outpath))
+
+ with mp.Pool(processes=args.processes) as pool:
+ futures = list()
+ for i, (inpath, outpath) in enumerate(filepaths):
+ future = pool.apply_async(process_filepath, (i, inpath, outpath, args.processor))
+ futures.append(future)
+
+ for future in futures:
+ output = future.get()
+ print(output)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/src/python/orcus/xls_xml.py b/src/python/orcus/xls_xml.py
new file mode 100644
index 0000000..671d39b
--- /dev/null
+++ b/src/python/orcus/xls_xml.py
@@ -0,0 +1,10 @@
+########################################################################
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+########################################################################
+
+from _orcus import _xls_xml_read as read
+
diff --git a/src/python/orcus/xlsx.py b/src/python/orcus/xlsx.py
new file mode 100644
index 0000000..fd24ee1
--- /dev/null
+++ b/src/python/orcus/xlsx.py
@@ -0,0 +1,10 @@
+########################################################################
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+########################################################################
+
+from _orcus import _xlsx_read as read
+
diff --git a/src/python/python.cpp b/src/python/python.cpp
new file mode 100644
index 0000000..53fb867
--- /dev/null
+++ b/src/python/python.cpp
@@ -0,0 +1,186 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/env.hpp"
+#include "orcus/info.hpp"
+
+#include "root.hpp"
+#include "xlsx.hpp"
+#include "ods.hpp"
+#include "csv.hpp"
+#include "xls_xml.hpp"
+#include "gnumeric.hpp"
+
+#ifdef __ORCUS_SPREADSHEET_MODEL
+#include "document.hpp"
+#include "sheet.hpp"
+#include "sheet_rows.hpp"
+#include "cell.hpp"
+#include "named_expression.hpp"
+#include "named_expressions.hpp"
+#include "formula_token.hpp"
+#include "formula_tokens.hpp"
+#endif
+
+#include <iostream>
+#include <sstream>
+#include <string>
+
+#include <Python.h>
+
+#define ORCUS_DEBUG_PYTHON 0
+#define GETSTATE(m) ((struct module_state*)PyModule_GetState(m))
+
+using namespace std;
+
+namespace orcus { namespace python {
+
+namespace {
+
+#if ORCUS_DEBUG_PYTHON
+void print_args(PyObject* args)
+{
+ string args_str;
+ PyObject* repr = PyObject_Repr(args);
+ if (repr)
+ {
+ Py_INCREF(repr);
+ args_str = PyBytes_AsString(repr);
+ Py_DECREF(repr);
+ }
+ cout << args_str << "\n";
+}
+#endif
+
+PyMethodDef orcus_methods[] =
+{
+ { "detect_format", (PyCFunction)detect_format, METH_VARARGS | METH_KEYWORDS,
+ "Detect the format type of a spreadsheet file." },
+
+ { "_csv_read", (PyCFunction)csv_read, METH_VARARGS | METH_KEYWORDS,
+ "Load specified csv file into a document model." },
+
+ { "_ods_read", (PyCFunction)ods_read, METH_VARARGS | METH_KEYWORDS,
+ "Load specified ods file into a document model." },
+
+ { "_xlsx_read", (PyCFunction)xlsx_read, METH_VARARGS | METH_KEYWORDS,
+ "Load specified xlsx file into a document model." },
+
+ { "_xls_xml_read", (PyCFunction)xls_xml_read, METH_VARARGS | METH_KEYWORDS,
+ "Load specified xls-xml file into a document model." },
+
+ { "_gnumeric_read", (PyCFunction)gnumeric_read, METH_VARARGS | METH_KEYWORDS,
+ "Load specified gnumeric file into a document model." },
+
+ { nullptr, nullptr, 0, nullptr }
+};
+
+struct module_state
+{
+ PyObject* error;
+};
+
+int orcus_traverse(PyObject* m, visitproc visit, void* arg)
+{
+ Py_VISIT(GETSTATE(m)->error);
+ return 0;
+}
+
+int orcus_clear(PyObject* m)
+{
+ Py_CLEAR(GETSTATE(m)->error);
+ return 0;
+}
+
+[[maybe_unused]]
+bool add_type_to_module(PyObject* m, PyTypeObject* typeobj, const char* type_name)
+{
+ if (PyType_Ready(typeobj))
+ return false;
+
+ Py_INCREF(typeobj);
+ if (PyModule_AddObject(m, type_name, reinterpret_cast<PyObject*>(typeobj)) < 0)
+ {
+ Py_DECREF(m);
+ Py_DECREF(typeobj);
+ return false;
+ }
+
+ return true;
+}
+
+bool populate_module_attributes(PyObject* m)
+{
+ std::ostringstream os;
+ os << orcus::get_version_major() << '.'
+ << orcus::get_version_minor() << '.'
+ << orcus::get_version_micro();
+
+ PyObject* version = PyUnicode_FromString(os.str().data());
+ if (PyModule_AddObject(m, "__version__", version) < 0)
+ return false;
+
+ return true;
+}
+
+}
+
+struct PyModuleDef moduledef =
+{
+ PyModuleDef_HEAD_INIT,
+ "_orcus",
+ nullptr,
+ sizeof(struct module_state),
+ orcus_methods,
+ nullptr,
+ orcus_traverse,
+ orcus_clear,
+ nullptr
+};
+
+}}
+
+extern "C" {
+
+ORCUS_DLLPUBLIC PyObject* PyInit__orcus()
+{
+ PyObject* m = PyModule_Create(&orcus::python::moduledef);
+ if (!orcus::python::populate_module_attributes(m))
+ return nullptr;
+
+#ifdef __ORCUS_SPREADSHEET_MODEL
+ if (!orcus::python::add_type_to_module(m, orcus::python::get_document_type(), "Document"))
+ return nullptr;
+
+ if (!orcus::python::add_type_to_module(m, orcus::python::get_sheet_type(), "Sheet"))
+ return nullptr;
+
+ if (!orcus::python::add_type_to_module(m, orcus::python::get_sheet_rows_type(), "SheetRows"))
+ return nullptr;
+
+ if (!orcus::python::add_type_to_module(m, orcus::python::get_cell_type(), "Cell"))
+ return nullptr;
+
+ if (!orcus::python::add_type_to_module(m, orcus::python::get_named_exp_type(), "NamedExpression"))
+ return nullptr;
+
+ if (!orcus::python::add_type_to_module(m, orcus::python::get_named_exps_type(), "NamedExpressions"))
+ return nullptr;
+
+ if (!orcus::python::add_type_to_module(m, orcus::python::get_formula_token_type(), "FormulaToken"))
+ return nullptr;
+
+ if (!orcus::python::add_type_to_module(m, orcus::python::get_formula_tokens_type(), "FormulaTokens"))
+ return nullptr;
+#endif
+
+ return m;
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/python/root.cpp b/src/python/root.cpp
new file mode 100644
index 0000000..d3ac021
--- /dev/null
+++ b/src/python/root.cpp
@@ -0,0 +1,68 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "root.hpp"
+#include "document.hpp"
+#include "global.hpp"
+
+#include "orcus/format_detection.hpp"
+#include "orcus/info.hpp"
+
+#include <iostream>
+#include <sstream>
+
+#include <object.h>
+
+using namespace std;
+
+namespace orcus { namespace python {
+
+PyObject* detect_format(PyObject* /*module*/, PyObject* args, PyObject* kwargs)
+{
+ py_unique_ptr stream = read_stream_from_args(args, kwargs);
+ if (!stream)
+ return nullptr;
+
+ char* p = nullptr;
+ Py_ssize_t n = 0;
+ if (PyBytes_AsStringAndSize(stream.get(), &p, &n) < 0)
+ return nullptr;
+
+ try
+ {
+ format_t ft = orcus::detect({p, (size_t)n});
+
+ switch (ft)
+ {
+ case format_t::ods:
+ return get_python_enum_value("FormatType", "ODS");
+ case format_t::xlsx:
+ return get_python_enum_value("FormatType", "XLSX");
+ case format_t::gnumeric:
+ return get_python_enum_value("FormatType", "GNUMERIC");
+ case format_t::xls_xml:
+ return get_python_enum_value("FormatType", "XLS_XML");
+ case format_t::parquet:
+ return get_python_enum_value("FormatType", "PARQUET");
+ case format_t::csv:
+ return get_python_enum_value("FormatType", "CSV");
+ case format_t::unknown:
+ default:
+ return get_python_enum_value("FormatType", "UNKNOWN");
+ }
+ }
+ catch (const std::exception&)
+ {
+ PyErr_SetString(PyExc_ValueError, "failed to perform deep detection on this file.");
+ return nullptr;
+ }
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+
diff --git a/src/python/root.hpp b/src/python/root.hpp
new file mode 100644
index 0000000..9b679bd
--- /dev/null
+++ b/src/python/root.hpp
@@ -0,0 +1,21 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_PYTHON_ROOT_HPP
+#define INCLUDED_ORCUS_PYTHON_ROOT_HPP
+
+#include <Python.h>
+
+namespace orcus { namespace python {
+
+PyObject* detect_format(PyObject* module, PyObject* args, PyObject* kwargs);
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/python/sheet.cpp b/src/python/sheet.cpp
new file mode 100644
index 0000000..d4037ea
--- /dev/null
+++ b/src/python/sheet.cpp
@@ -0,0 +1,327 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "sheet.hpp"
+#include "sheet_rows.hpp"
+#include "named_expression.hpp"
+#include "named_expressions.hpp"
+
+#include <orcus/spreadsheet/types.hpp>
+#include <orcus/spreadsheet/sheet.hpp>
+#include <orcus/spreadsheet/document.hpp>
+
+#include <ixion/model_context.hpp>
+#include <ixion/named_expressions_iterator.hpp>
+
+#include <structmember.h>
+#include <bytesobject.h>
+#include <iostream>
+#include <sstream>
+#include <cstring>
+
+namespace ss = orcus::spreadsheet;
+
+namespace orcus { namespace python {
+
+sheet_data::sheet_data() : m_doc(nullptr), m_sheet(nullptr) {}
+sheet_data::~sheet_data() {}
+
+namespace {
+
+/**
+ * Python object for orcus.Sheet.
+ */
+struct pyobj_sheet
+{
+ PyObject_HEAD
+
+ PyObject* name;
+ PyObject* sheet_size;
+ PyObject* data_size;
+ PyObject* named_expressions;
+
+ sheet_data* data;
+};
+
+inline pyobj_sheet* t(PyObject* self)
+{
+ return reinterpret_cast<pyobj_sheet*>(self);
+}
+
+inline sheet_data* get_sheet_data(PyObject* self)
+{
+ return t(self)->data;
+}
+
+/**
+ * Get the underlying C++ sheet class instance from the python object
+ * representation.
+ */
+inline spreadsheet::sheet* get_core_sheet(PyObject* self)
+{
+ return get_sheet_data(self)->m_sheet;
+}
+
+void tp_dealloc(pyobj_sheet* self)
+{
+ delete self->data;
+
+ Py_CLEAR(self->name);
+ Py_CLEAR(self->sheet_size);
+ Py_CLEAR(self->data_size);
+
+ Py_TYPE(self)->tp_free(reinterpret_cast<PyObject*>(self));
+}
+
+PyObject* tp_new(PyTypeObject* type, PyObject* /*args*/, PyObject* /*kwargs*/)
+{
+ pyobj_sheet* self = (pyobj_sheet*)type->tp_alloc(type, 0);
+ self->data = new sheet_data;
+ return reinterpret_cast<PyObject*>(self);
+}
+
+int tp_init(pyobj_sheet* /*self*/, PyObject* /*args*/, PyObject* /*kwargs*/)
+{
+ return 0;
+}
+
+PyObject* sheet_get_rows(PyObject* self, PyObject* /*args*/, PyObject* /*kwargs*/)
+{
+ PyTypeObject* sr_type = get_sheet_rows_type();
+
+ PyObject* rows = sr_type->tp_new(sr_type, nullptr, nullptr);
+ if (!rows)
+ return nullptr;
+
+ sr_type->tp_init(rows, nullptr, nullptr);
+
+ // Populate the sheet rows data.
+ sheet_data* data = get_sheet_data(self);
+ store_sheet_rows_data(rows, data->m_doc, data->m_sheet);
+
+ return rows;
+}
+
+namespace {
+
+format_t to_format_type_enum(PyObject* format)
+{
+ static const char* err_not_format_type = "An enum value of 'orcus.FormatType' was expected.";
+ static const char* err_format_not_supported = "Unsupported format type.";
+
+ // Check the type name.
+
+ PyTypeObject* type = Py_TYPE(format);
+ if (!type || strncmp(type->tp_name, "FormatType", 10u) != 0)
+ {
+ PyErr_SetString(PyExc_RuntimeError, err_not_format_type);
+ return format_t::unknown;
+ }
+
+ // Now check the member name.
+
+ PyObject* format_s = PyObject_GetAttrString(format, "name"); // new reference
+ if (!format_s)
+ {
+ PyErr_SetString(PyExc_RuntimeError, err_not_format_type);
+ return format_t::unknown;
+ }
+
+ // TODO : currently we only support csv format. Change this code when we
+ // add more format type(s) to support.
+
+ const char* p = PyUnicode_AsUTF8(format_s);
+ if (!p || strncmp(p, "CSV", 3u) != 0)
+ {
+ PyErr_SetString(PyExc_RuntimeError, err_format_not_supported);
+ Py_DECREF(format_s);
+ return format_t::unknown;
+ }
+
+ Py_DECREF(format_s);
+ return format_t::csv;
+}
+
+bool sheet_write_as_csv(spreadsheet::sheet* sheet, PyObject* file)
+{
+ std::ostringstream os;
+ sheet->dump_csv(os);
+ std::string s = os.str();
+
+ if (!s.empty())
+ {
+ PyObject* func_write = PyObject_GetAttrString(file, "write"); // new reference
+ if (!func_write)
+ {
+ PyErr_SetString(PyExc_RuntimeError, "'write' function was expected, but not found.");
+ return false;
+ }
+
+ // write the content as python's utf-8 string ('s'). Use 'y' to write
+ // it as bytes (for future reference).
+ PyObject_CallFunction(func_write, "s", s.data(), nullptr);
+ Py_XDECREF(func_write);
+ }
+
+ return true;
+}
+
+}
+
+PyObject* sheet_write(PyObject* self, PyObject* args, PyObject* kwargs)
+{
+ static const char* kwlist[] = { "file", "format", nullptr };
+
+ PyObject* file = nullptr;
+ PyObject* format = nullptr;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO", const_cast<char**>(kwlist), &file, &format))
+ return nullptr;
+
+ format_t ft = to_format_type_enum(format);
+
+ if (ft == format_t::unknown)
+ return nullptr;
+
+ spreadsheet::sheet* sheet = get_core_sheet(self);
+
+ switch (ft)
+ {
+ case format_t::csv:
+ {
+ if (!sheet_write_as_csv(sheet, file))
+ return nullptr;
+
+ break;
+ }
+ default:
+ {
+ PyErr_SetString(PyExc_RuntimeError, "this format is not yet supported.");
+ return nullptr;
+ }
+ }
+
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+PyObject* sheet_get_named_expressions(PyObject* self, PyObject* /*args*/, PyObject* /*kwargs*/)
+{
+ const ss::document& doc = *t(self)->data->m_doc;
+ ss::sheet_t si = t(self)->data->m_sheet->get_index();
+ const ixion::model_context& cxt = doc.get_model_context();
+ return create_named_expressions_object(si, doc, cxt.get_named_expressions_iterator(si));
+}
+
+PyMethodDef tp_methods[] =
+{
+ { "get_rows", (PyCFunction)sheet_get_rows, METH_VARARGS, "Get a sheet row iterator." },
+ { "write", (PyCFunction)sheet_write, METH_VARARGS | METH_KEYWORDS, "Write sheet content to specified file object." },
+ { "get_named_expressions", (PyCFunction)sheet_get_named_expressions, METH_NOARGS, "Get a named expressions iterator." },
+ { nullptr }
+};
+
+PyMemberDef tp_members[] =
+{
+ { (char*)"name", T_OBJECT_EX, offsetof(pyobj_sheet, name), READONLY, (char*)"sheet name" },
+ { (char*)"sheet_size", T_OBJECT_EX, offsetof(pyobj_sheet, sheet_size), READONLY, (char*)"sheet size" },
+ { (char*)"data_size", T_OBJECT_EX, offsetof(pyobj_sheet, data_size), READONLY, (char*)"data size" },
+ { nullptr }
+};
+
+PyTypeObject sheet_type =
+{
+ PyVarObject_HEAD_INIT(nullptr, 0)
+ "orcus.Sheet", // tp_name
+ sizeof(pyobj_sheet), // tp_basicsize
+ 0, // tp_itemsize
+ (destructor)tp_dealloc, // tp_dealloc
+ 0, // tp_print
+ 0, // tp_getattr
+ 0, // tp_setattr
+ 0, // tp_compare
+ 0, // tp_repr
+ 0, // tp_as_number
+ 0, // tp_as_sequence
+ 0, // tp_as_mapping
+ 0, // tp_hash
+ 0, // tp_call
+ 0, // tp_str
+ 0, // tp_getattro
+ 0, // tp_setattro
+ 0, // tp_as_buffer
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, // tp_flags
+ "orcus sheet object", // tp_doc
+ 0, // tp_traverse
+ 0, // tp_clear
+ 0, // tp_richcompare
+ 0, // tp_weaklistoffset
+ 0, // tp_iter
+ 0, // tp_iternext
+ tp_methods, // tp_methods
+ tp_members, // tp_members
+ 0, // tp_getset
+ 0, // tp_base
+ 0, // tp_dict
+ 0, // tp_descr_get
+ 0, // tp_descr_set
+ 0, // tp_dictoffset
+ (initproc)tp_init, // tp_init
+ 0, // tp_alloc
+ tp_new, // tp_new
+};
+
+}
+
+sheet_data* get_sheet_data(PyObject* self)
+{
+ return reinterpret_cast<pyobj_sheet*>(self)->data;
+}
+
+PyTypeObject* get_sheet_type()
+{
+ return &sheet_type;
+}
+
+void store_sheet(
+ PyObject* self, const spreadsheet::document* doc, spreadsheet::sheet* orcus_sheet)
+{
+ pyobj_sheet* pysheet = reinterpret_cast<pyobj_sheet*>(self);
+ pysheet->data->m_doc = doc;
+ pysheet->data->m_sheet = orcus_sheet;
+
+ // Populate the python members.
+
+ // Sheet name
+ spreadsheet::sheet_t sid = orcus_sheet->get_index();
+ std::string_view sheet_name = doc->get_sheet_name(sid);
+ pysheet->name = PyUnicode_FromStringAndSize(sheet_name.data(), sheet_name.size());
+
+ // Data size - size of the data area.
+ ixion::abs_range_t range = orcus_sheet->get_data_range();
+ if (range.valid())
+ {
+ pysheet->data_size = PyDict_New();
+ PyDict_SetItemString(pysheet->data_size, "column", PyLong_FromLong(range.last.column+1));
+ PyDict_SetItemString(pysheet->data_size, "row", PyLong_FromLong(range.last.row+1));
+ }
+ else
+ {
+ Py_INCREF(Py_None);
+ pysheet->data_size = Py_None;
+ }
+
+ // Sheet size - size of the entire sheet.
+ pysheet->sheet_size = PyDict_New();
+ ss::range_size_t sheet_size = doc->get_sheet_size();
+ PyDict_SetItemString(pysheet->sheet_size, "column", PyLong_FromLong(sheet_size.columns));
+ PyDict_SetItemString(pysheet->sheet_size, "row", PyLong_FromLong(sheet_size.rows));
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/python/sheet.hpp b/src/python/sheet.hpp
new file mode 100644
index 0000000..ef349ba
--- /dev/null
+++ b/src/python/sheet.hpp
@@ -0,0 +1,43 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_PYTHON_SHEET_HPP
+#define INCLUDED_ORCUS_PYTHON_SHEET_HPP
+
+#include <Python.h>
+
+namespace orcus {
+
+namespace spreadsheet {
+
+class sheet;
+class document;
+
+}
+
+namespace python {
+
+/** non-python part of the sheet object. */
+struct sheet_data
+{
+ const spreadsheet::document* m_doc;
+ spreadsheet::sheet* m_sheet;
+
+ sheet_data();
+ ~sheet_data();
+};
+
+PyTypeObject* get_sheet_type();
+
+void store_sheet(
+ PyObject* self, const spreadsheet::document* doc, spreadsheet::sheet* orcus_sheet);
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/python/sheet_rows.cpp b/src/python/sheet_rows.cpp
new file mode 100644
index 0000000..be49589
--- /dev/null
+++ b/src/python/sheet_rows.cpp
@@ -0,0 +1,209 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "sheet_rows.hpp"
+#include "memory.hpp"
+#include "cell.hpp"
+#include "orcus/spreadsheet/sheet.hpp"
+#include "orcus/spreadsheet/document.hpp"
+
+#include <ixion/model_context.hpp>
+
+namespace orcus { namespace python {
+
+sheet_rows_data::sheet_rows_data() :
+ m_doc(nullptr),
+ m_sheet(nullptr),
+ m_range(ixion::abs_range_t::invalid),
+ m_current_row(-1) {}
+
+sheet_rows_data::~sheet_rows_data() {}
+
+namespace {
+
+/**
+ * Python object for orcus.SheetRows.
+ */
+struct pyobj_sheet_rows
+{
+ PyObject_HEAD
+
+ sheet_rows_data* m_data;
+};
+
+void sheet_rows_dealloc(pyobj_sheet_rows* self)
+{
+ delete self->m_data;
+
+ Py_TYPE(self)->tp_free(reinterpret_cast<PyObject*>(self));
+}
+
+PyObject* sheet_rows_new(PyTypeObject* type, PyObject* /*args*/, PyObject* /*kwargs*/)
+{
+ pyobj_sheet_rows* self = (pyobj_sheet_rows*)type->tp_alloc(type, 0);
+ self->m_data = new sheet_rows_data;
+ return reinterpret_cast<PyObject*>(self);
+}
+
+int sheet_rows_init(pyobj_sheet_rows* /*self*/, PyObject* /*args*/, PyObject* /*kwargs*/)
+{
+ return 0;
+}
+
+PyObject* sheet_rows_iter(PyObject* self)
+{
+ sheet_rows_data* data = reinterpret_cast<pyobj_sheet_rows*>(self)->m_data;
+
+ const ixion::abs_range_t& range = data->m_range;
+ if (range.valid())
+ {
+ data->m_current_row = 0;
+
+ ixion::abs_rc_range_t sheet_range;
+ sheet_range.first.column = 0;
+ sheet_range.first.row = 0;
+ sheet_range.last.column = range.last.column;
+ sheet_range.last.row = range.last.row;
+
+ data->m_range_iterator = data->m_doc->get_model_context().get_model_iterator(
+ data->m_sheet->get_index(), ixion::rc_direction_t::horizontal, sheet_range);
+ }
+
+ Py_INCREF(self);
+ return self;
+}
+
+PyObject* sheet_rows_iternext(PyObject* self)
+{
+ sheet_rows_data* data = reinterpret_cast<pyobj_sheet_rows*>(self)->m_data;
+ ixion::model_iterator& iter = data->m_range_iterator;
+
+ if (!iter.has())
+ {
+ // No more elements. Stop the iteration.
+ PyErr_SetNone(PyExc_StopIteration);
+ return nullptr;
+ }
+
+ PyObject* pyobj_row = PyTuple_New(data->m_range.last.column+1);
+
+ for (; iter.has(); iter.next())
+ {
+ const auto& cell = iter.get();
+ if (cell.row != data->m_current_row)
+ {
+ ++data->m_current_row;
+ assert(cell.row == data->m_current_row);
+ break;
+ }
+
+ PyObject* obj = nullptr;
+ switch (cell.type)
+ {
+ case ixion::celltype_t::empty:
+ {
+ obj = create_cell_object_empty();
+ break;
+ }
+ case ixion::celltype_t::boolean:
+ {
+ obj = create_cell_object_boolean(std::get<bool>(cell.value));
+ break;
+ }
+ case ixion::celltype_t::numeric:
+ {
+ obj = create_cell_object_numeric(std::get<double>(cell.value));
+ break;
+ }
+ case ixion::celltype_t::string:
+ {
+ ixion::string_id_t sid = std::get<ixion::string_id_t>(cell.value);
+ const ixion::model_context& cxt = data->m_doc->get_model_context();
+ const std::string* ps = cxt.get_string(sid);
+ obj = create_cell_object_string(ps);
+ break;
+ }
+ case ixion::celltype_t::formula:
+ {
+ const ixion::formula_cell* fc = std::get<const ixion::formula_cell*>(cell.value);
+ ixion::abs_address_t pos(data->m_sheet->get_index(), cell.row, cell.col);
+ obj = create_cell_object_formula(*data->m_doc, pos, fc);
+ break;
+ }
+ case ixion::celltype_t::unknown:
+ break;
+ }
+
+ if (!obj)
+ return nullptr;
+
+ PyTuple_SetItem(pyobj_row, cell.col, obj);
+ }
+
+ return pyobj_row;
+}
+
+PyTypeObject sheet_rows_type =
+{
+ PyVarObject_HEAD_INIT(nullptr, 0)
+ "orcus.SheetRows", // tp_name
+ sizeof(pyobj_sheet_rows), // tp_basicsize
+ 0, // tp_itemsize
+ (destructor)sheet_rows_dealloc, // tp_dealloc
+ 0, // tp_print
+ 0, // tp_getattr
+ 0, // tp_setattr
+ 0, // tp_compare
+ 0, // tp_repr
+ 0, // tp_as_number
+ 0, // tp_as_sequence
+ 0, // tp_as_mapping
+ 0, // tp_hash
+ 0, // tp_call
+ 0, // tp_str
+ 0, // tp_getattro
+ 0, // tp_setattro
+ 0, // tp_as_buffer
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, // tp_flags
+ "orcus sheet rows iterator", // tp_doc
+ 0, // tp_traverse
+ 0, // tp_clear
+ 0, // tp_richcompare
+ 0, // tp_weaklistoffset
+ (getiterfunc)sheet_rows_iter, // tp_iter
+ (iternextfunc)sheet_rows_iternext, // tp_iternext
+ 0, // tp_methods
+ 0, // tp_members
+ 0, // tp_getset
+ 0, // tp_base
+ 0, // tp_dict
+ 0, // tp_descr_get
+ 0, // tp_descr_set
+ 0, // tp_dictoffset
+ (initproc)sheet_rows_init, // tp_init
+ 0, // tp_alloc
+ sheet_rows_new, // tp_new
+};
+
+}
+
+PyTypeObject* get_sheet_rows_type()
+{
+ return &sheet_rows_type;
+}
+
+void store_sheet_rows_data(PyObject* self, const spreadsheet::document* orcus_doc, const spreadsheet::sheet* orcus_sheet)
+{
+ sheet_rows_data* data = reinterpret_cast<pyobj_sheet_rows*>(self)->m_data;
+ data->m_doc = orcus_doc;
+ data->m_sheet = orcus_sheet;
+ data->m_range = orcus_sheet->get_data_range();
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/python/sheet_rows.hpp b/src/python/sheet_rows.hpp
new file mode 100644
index 0000000..e750098
--- /dev/null
+++ b/src/python/sheet_rows.hpp
@@ -0,0 +1,54 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_PYTHON_SHEET_ROWS_HPP
+#define INCLUDED_ORCUS_PYTHON_SHEET_ROWS_HPP
+
+#include <Python.h>
+#include <ixion/address.hpp>
+#include <ixion/model_iterator.hpp>
+
+namespace ixion {
+
+class formula_name_resolver;
+
+}
+
+namespace orcus {
+
+namespace spreadsheet {
+
+class sheet;
+class document;
+
+}
+
+namespace python {
+
+/** non-python part. */
+struct sheet_rows_data
+{
+ const spreadsheet::document* m_doc;
+ const spreadsheet::sheet* m_sheet;
+ ixion::abs_range_t m_range;
+ ixion::model_iterator m_range_iterator;
+
+ ixion::row_t m_current_row;
+
+ sheet_rows_data();
+ ~sheet_rows_data();
+};
+
+PyTypeObject* get_sheet_rows_type();
+
+void store_sheet_rows_data(PyObject* self, const spreadsheet::document* orcus_doc, const spreadsheet::sheet* orcus_sheet);
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/python/xls_xml.cpp b/src/python/xls_xml.cpp
new file mode 100644
index 0000000..5caf747
--- /dev/null
+++ b/src/python/xls_xml.cpp
@@ -0,0 +1,58 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xls_xml.hpp"
+#include "global.hpp"
+
+#ifdef __ORCUS_PYTHON_XLS_XML
+#include "document.hpp"
+#include "orcus/orcus_xls_xml.hpp"
+#include "orcus/spreadsheet/document.hpp"
+#include "orcus/spreadsheet/factory.hpp"
+#endif
+
+namespace orcus { namespace python {
+
+#ifdef __ORCUS_PYTHON_XLS_XML
+
+PyObject* xls_xml_read(PyObject* /*module*/, PyObject* args, PyObject* kwargs)
+{
+ stream_with_formulas data = read_stream_and_formula_params_from_args(args, kwargs);
+ if (!data.stream)
+ return nullptr;
+
+ try
+ {
+ spreadsheet::range_size_t ss{1048576, 16384};
+ std::unique_ptr<spreadsheet::document> doc = std::make_unique<spreadsheet::document>(ss);
+ spreadsheet::import_factory fact(*doc);
+ fact.set_recalc_formula_cells(data.recalc_formula_cells);
+ fact.set_formula_error_policy(data.error_policy);
+ orcus_xls_xml app(&fact);
+
+ return import_from_stream_into_document(data.stream.get(), app, std::move(doc));
+ }
+ catch (const std::exception& e)
+ {
+ set_python_exception(PyExc_RuntimeError, e);
+ return nullptr;
+ }
+}
+
+#else
+
+PyObject* xls_xml_read(PyObject*, PyObject*, PyObject*)
+{
+ PyErr_SetString(PyExc_RuntimeError, "The xls-xml module is not enabled.");
+ return nullptr;
+}
+
+#endif
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/python/xls_xml.hpp b/src/python/xls_xml.hpp
new file mode 100644
index 0000000..5639521
--- /dev/null
+++ b/src/python/xls_xml.hpp
@@ -0,0 +1,21 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_PYTHON_XLS_XML_HPP
+#define INCLUDED_ORCUS_PYTHON_XLS_XML_HPP
+
+#include <Python.h>
+
+namespace orcus { namespace python {
+
+PyObject* xls_xml_read(PyObject* module, PyObject* args, PyObject* kwargs);
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/python/xlsx.cpp b/src/python/xlsx.cpp
new file mode 100644
index 0000000..56cf47d
--- /dev/null
+++ b/src/python/xlsx.cpp
@@ -0,0 +1,58 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xlsx.hpp"
+#include "global.hpp"
+
+#ifdef __ORCUS_PYTHON_XLSX
+#include "document.hpp"
+#include "orcus/orcus_xlsx.hpp"
+#include "orcus/spreadsheet/document.hpp"
+#include "orcus/spreadsheet/factory.hpp"
+#endif
+
+namespace orcus { namespace python {
+
+#ifdef __ORCUS_PYTHON_XLSX
+
+PyObject* xlsx_read(PyObject* /*module*/, PyObject* args, PyObject* kwargs)
+{
+ stream_with_formulas data = read_stream_and_formula_params_from_args(args, kwargs);
+ if (!data.stream)
+ return nullptr;
+
+ try
+ {
+ spreadsheet::range_size_t ss{1048576, 16384};
+ std::unique_ptr<spreadsheet::document> doc = std::make_unique<spreadsheet::document>(ss);
+ spreadsheet::import_factory fact(*doc);
+ fact.set_recalc_formula_cells(data.recalc_formula_cells);
+ fact.set_formula_error_policy(data.error_policy);
+ orcus_xlsx app(&fact);
+
+ return import_from_stream_into_document(data.stream.get(), app, std::move(doc));
+ }
+ catch (const std::exception& e)
+ {
+ set_python_exception(PyExc_RuntimeError, e);
+ return nullptr;
+ }
+}
+
+#else
+
+PyObject* xlsx_read(PyObject*, PyObject*, PyObject*)
+{
+ PyErr_SetString(PyExc_RuntimeError, "The xlsx module is not enabled.");
+ return nullptr;
+}
+
+#endif
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/python/xlsx.hpp b/src/python/xlsx.hpp
new file mode 100644
index 0000000..b3d97e9
--- /dev/null
+++ b/src/python/xlsx.hpp
@@ -0,0 +1,21 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_PYTHON_XLSX_HPP
+#define INCLUDED_ORCUS_PYTHON_XLSX_HPP
+
+#include <Python.h>
+
+namespace orcus { namespace python {
+
+PyObject* xlsx_read(PyObject* module, PyObject* args, PyObject* kwargs);
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/Makefile.am b/src/spreadsheet/Makefile.am
new file mode 100644
index 0000000..8f1e0fb
--- /dev/null
+++ b/src/spreadsheet/Makefile.am
@@ -0,0 +1,90 @@
+if BUILD_SPREADSHEET_MODEL
+
+AM_CPPFLAGS = \
+ -I$(top_srcdir)/include \
+ -I$(top_srcdir)/src/include \
+ -D__ORCUS_SPM_BUILDING_DLL
+
+AM_CPPFLAGS += $(BOOST_CPPFLAGS) $(LIBIXION_CFLAGS)
+
+if HAVE_FILESYSTEM
+AM_CPPFLAGS += "-DHAVE_FILESYSTEM=1"
+endif
+
+if HAVE_EXPERIMENTAL_FILESYSTEM
+AM_CPPFLAGS += "-DHAVE_EXPERIMENTAL_FILESYSTEM=1"
+endif
+
+COMMON_CPPFLAGS = $(AM_CPPFLAGS)
+
+if HAVE_STATIC_LIB
+AM_CPPFLAGS += -D__ORCUS_STATIC_LIB=1
+endif
+
+lib_LTLIBRARIES = liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la
+liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_SOURCES = \
+ auto_filter.cpp \
+ check_dumper.hpp \
+ check_dumper.cpp \
+ config.cpp \
+ debug_state_dumper.hpp \
+ debug_state_dumper.cpp \
+ document.cpp \
+ document_impl.hpp \
+ document_impl.cpp \
+ document_types.cpp \
+ dumper_global.hpp \
+ dumper_global.cpp \
+ factory.cpp \
+ factory_pivot.hpp \
+ factory_pivot.cpp \
+ factory_shared_strings.hpp \
+ factory_shared_strings.cpp \
+ factory_sheet.hpp \
+ factory_sheet.cpp \
+ factory_styles.cpp \
+ factory_table.hpp \
+ factory_table.cpp \
+ flat_dumper.hpp \
+ flat_dumper.cpp \
+ formula_global.hpp \
+ formula_global.cpp \
+ html_dumper.hpp \
+ html_dumper.cpp \
+ impl_types.hpp \
+ csv_dumper.hpp \
+ csv_dumper.cpp \
+ json_dumper.hpp \
+ json_dumper.cpp \
+ number_format.hpp \
+ number_format.cpp \
+ pivot.cpp \
+ shared_formula.hpp \
+ shared_formula.cpp \
+ shared_strings.cpp \
+ sheet.cpp \
+ sheet_impl.hpp \
+ sheet_impl.cpp \
+ styles.cpp \
+ view.cpp \
+ global_settings.hpp \
+ global_settings.cpp
+
+liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS = $(AM_CPPFLAGS) $(LIBIXION_CFLAGS)
+liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_LDFLAGS = -no-undefined
+liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_LIBADD = \
+ $(LIBIXION_LIBS) \
+ $(BOOST_DATE_TIME_LIBS) \
+ $(BOOST_SYSTEM_LIBS) \
+ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+ ../liborcus/liborcus-@ORCUS_API_VERSION@.la
+
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_LIBADD += -lstdc++fs
+else
+liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_LIBADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
+endif
diff --git a/src/spreadsheet/Makefile.in b/src/spreadsheet/Makefile.in
new file mode 100644
index 0000000..f1fabb8
--- /dev/null
+++ b/src/spreadsheet/Makefile.in
@@ -0,0 +1,1134 @@
+# Makefile.in generated by automake 1.16.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2021 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.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+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@
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_FILESYSTEM_TRUE@am__append_1 = "-DHAVE_FILESYSTEM=1"
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_TRUE@am__append_2 = "-DHAVE_EXPERIMENTAL_FILESYSTEM=1"
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_STATIC_LIB_TRUE@am__append_3 = -D__ORCUS_STATIC_LIB=1
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_TRUE@@HAVE_FILESYSTEM_FALSE@am__append_4 = -lstdc++fs
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@am__append_5 = $(BOOST_FILESYSTEM_LIBS)
+subdir = src/spreadsheet
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
+ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_17.m4 \
+ $(top_srcdir)/m4/boost.m4 $(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)/m4/m4_ax_valgrind_check.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+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)"
+LTLIBRARIES = $(lib_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+@BUILD_SPREADSHEET_MODEL_TRUE@@HAVE_EXPERIMENTAL_FILESYSTEM_FALSE@@HAVE_FILESYSTEM_FALSE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1)
+@BUILD_SPREADSHEET_MODEL_TRUE@liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_DEPENDENCIES = \
+@BUILD_SPREADSHEET_MODEL_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@ ../liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_SPREADSHEET_MODEL_TRUE@ $(am__DEPENDENCIES_2)
+am__liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_SOURCES_DIST = \
+ auto_filter.cpp check_dumper.hpp check_dumper.cpp config.cpp \
+ debug_state_dumper.hpp debug_state_dumper.cpp document.cpp \
+ document_impl.hpp document_impl.cpp document_types.cpp \
+ dumper_global.hpp dumper_global.cpp factory.cpp \
+ factory_pivot.hpp factory_pivot.cpp factory_shared_strings.hpp \
+ factory_shared_strings.cpp factory_sheet.hpp factory_sheet.cpp \
+ factory_styles.cpp factory_table.hpp factory_table.cpp \
+ flat_dumper.hpp flat_dumper.cpp formula_global.hpp \
+ formula_global.cpp html_dumper.hpp html_dumper.cpp \
+ impl_types.hpp csv_dumper.hpp csv_dumper.cpp json_dumper.hpp \
+ json_dumper.cpp number_format.hpp number_format.cpp pivot.cpp \
+ shared_formula.hpp shared_formula.cpp shared_strings.cpp \
+ sheet.cpp sheet_impl.hpp sheet_impl.cpp styles.cpp view.cpp \
+ global_settings.hpp global_settings.cpp
+@BUILD_SPREADSHEET_MODEL_TRUE@am_liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_OBJECTS = liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-auto_filter.lo \
+@BUILD_SPREADSHEET_MODEL_TRUE@ liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-check_dumper.lo \
+@BUILD_SPREADSHEET_MODEL_TRUE@ liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-config.lo \
+@BUILD_SPREADSHEET_MODEL_TRUE@ liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-debug_state_dumper.lo \
+@BUILD_SPREADSHEET_MODEL_TRUE@ liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document.lo \
+@BUILD_SPREADSHEET_MODEL_TRUE@ liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document_impl.lo \
+@BUILD_SPREADSHEET_MODEL_TRUE@ liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document_types.lo \
+@BUILD_SPREADSHEET_MODEL_TRUE@ liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-dumper_global.lo \
+@BUILD_SPREADSHEET_MODEL_TRUE@ liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory.lo \
+@BUILD_SPREADSHEET_MODEL_TRUE@ liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_pivot.lo \
+@BUILD_SPREADSHEET_MODEL_TRUE@ liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_shared_strings.lo \
+@BUILD_SPREADSHEET_MODEL_TRUE@ liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_sheet.lo \
+@BUILD_SPREADSHEET_MODEL_TRUE@ liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_styles.lo \
+@BUILD_SPREADSHEET_MODEL_TRUE@ liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_table.lo \
+@BUILD_SPREADSHEET_MODEL_TRUE@ liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-flat_dumper.lo \
+@BUILD_SPREADSHEET_MODEL_TRUE@ liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-formula_global.lo \
+@BUILD_SPREADSHEET_MODEL_TRUE@ liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-html_dumper.lo \
+@BUILD_SPREADSHEET_MODEL_TRUE@ liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-csv_dumper.lo \
+@BUILD_SPREADSHEET_MODEL_TRUE@ liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-json_dumper.lo \
+@BUILD_SPREADSHEET_MODEL_TRUE@ liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-number_format.lo \
+@BUILD_SPREADSHEET_MODEL_TRUE@ liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-pivot.lo \
+@BUILD_SPREADSHEET_MODEL_TRUE@ liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-shared_formula.lo \
+@BUILD_SPREADSHEET_MODEL_TRUE@ liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-shared_strings.lo \
+@BUILD_SPREADSHEET_MODEL_TRUE@ liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-sheet.lo \
+@BUILD_SPREADSHEET_MODEL_TRUE@ liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-sheet_impl.lo \
+@BUILD_SPREADSHEET_MODEL_TRUE@ liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-styles.lo \
+@BUILD_SPREADSHEET_MODEL_TRUE@ liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-view.lo \
+@BUILD_SPREADSHEET_MODEL_TRUE@ liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-global_settings.lo
+liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_OBJECTS = $(am_liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_OBJECTS)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_LINK = $(LIBTOOL) \
+ $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \
+ $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_LDFLAGS) \
+ $(LDFLAGS) -o $@
+@BUILD_SPREADSHEET_MODEL_TRUE@am_liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_rpath = \
+@BUILD_SPREADSHEET_MODEL_TRUE@ -rpath $(libdir)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-auto_filter.Plo \
+ ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-check_dumper.Plo \
+ ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-config.Plo \
+ ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-csv_dumper.Plo \
+ ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-debug_state_dumper.Plo \
+ ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document.Plo \
+ ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document_impl.Plo \
+ ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document_types.Plo \
+ ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-dumper_global.Plo \
+ ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory.Plo \
+ ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_pivot.Plo \
+ ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_shared_strings.Plo \
+ ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_sheet.Plo \
+ ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_styles.Plo \
+ ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_table.Plo \
+ ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-flat_dumper.Plo \
+ ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-formula_global.Plo \
+ ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-global_settings.Plo \
+ ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-html_dumper.Plo \
+ ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-json_dumper.Plo \
+ ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-number_format.Plo \
+ ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-pivot.Plo \
+ ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-shared_formula.Plo \
+ ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-shared_strings.Plo \
+ ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-sheet.Plo \
+ ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-sheet_impl.Plo \
+ ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-styles.Plo \
+ ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-view.Plo
+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_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+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_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = \
+ $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_SOURCES)
+DIST_SOURCES = $(am__liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_SOURCES_DIST)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__extra_recursive_targets = check-valgrind-recursive \
+ check-valgrind-memcheck-recursive \
+ check-valgrind-helgrind-recursive check-valgrind-drd-recursive \
+ check-valgrind-sgcheck-recursive
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BOOST_CPPFLAGS = @BOOST_CPPFLAGS@
+BOOST_DATE_TIME_LDFLAGS = @BOOST_DATE_TIME_LDFLAGS@
+BOOST_DATE_TIME_LDPATH = @BOOST_DATE_TIME_LDPATH@
+BOOST_DATE_TIME_LIBS = @BOOST_DATE_TIME_LIBS@
+BOOST_FILESYSTEM_LDFLAGS = @BOOST_FILESYSTEM_LDFLAGS@
+BOOST_FILESYSTEM_LDPATH = @BOOST_FILESYSTEM_LDPATH@
+BOOST_FILESYSTEM_LIBS = @BOOST_FILESYSTEM_LIBS@
+BOOST_IOSTREAMS_LDFLAGS = @BOOST_IOSTREAMS_LDFLAGS@
+BOOST_IOSTREAMS_LDPATH = @BOOST_IOSTREAMS_LDPATH@
+BOOST_IOSTREAMS_LIBS = @BOOST_IOSTREAMS_LIBS@
+BOOST_LDPATH = @BOOST_LDPATH@
+BOOST_PROGRAM_OPTIONS_LDFLAGS = @BOOST_PROGRAM_OPTIONS_LDFLAGS@
+BOOST_PROGRAM_OPTIONS_LDPATH = @BOOST_PROGRAM_OPTIONS_LDPATH@
+BOOST_PROGRAM_OPTIONS_LIBS = @BOOST_PROGRAM_OPTIONS_LIBS@
+BOOST_ROOT = @BOOST_ROOT@
+BOOST_SYSTEM_LDFLAGS = @BOOST_SYSTEM_LDFLAGS@
+BOOST_SYSTEM_LDPATH = @BOOST_SYSTEM_LDPATH@
+BOOST_SYSTEM_LIBS = @BOOST_SYSTEM_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CSCOPE = @CSCOPE@
+CTAGS = @CTAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_VALGRIND_drd = @ENABLE_VALGRIND_drd@
+ENABLE_VALGRIND_helgrind = @ENABLE_VALGRIND_helgrind@
+ENABLE_VALGRIND_memcheck = @ENABLE_VALGRIND_memcheck@
+ENABLE_VALGRIND_sgcheck = @ENABLE_VALGRIND_sgcheck@
+ETAGS = @ETAGS@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+HAVE_CXX17 = @HAVE_CXX17@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+IXION_REQUIRED_API_VERSION = @IXION_REQUIRED_API_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBIXION_CFLAGS = @LIBIXION_CFLAGS@
+LIBIXION_LIBS = @LIBIXION_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MDDS_CFLAGS = @MDDS_CFLAGS@
+MDDS_LIBS = @MDDS_LIBS@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+ORCUS_API_VERSION = @ORCUS_API_VERSION@
+ORCUS_MAJOR_VERSION = @ORCUS_MAJOR_VERSION@
+ORCUS_MICRO_VERSION = @ORCUS_MICRO_VERSION@
+ORCUS_MINOR_VERSION = @ORCUS_MINOR_VERSION@
+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@
+PARQUET_CFLAGS = @PARQUET_CFLAGS@
+PARQUET_LIBS = @PARQUET_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POW_LIB = @POW_LIB@
+PYTHON = @PYTHON@
+PYTHON_CFLAGS = @PYTHON_CFLAGS@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VALGRIND = @VALGRIND@
+VALGRIND_ENABLED = @VALGRIND_ENABLED@
+VERSION = @VERSION@
+ZLIB_CFLAGS = @ZLIB_CFLAGS@
+ZLIB_LIBS = @ZLIB_LIBS@
+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@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+runstatedir = @runstatedir@
+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@
+valgrind_enabled_tools = @valgrind_enabled_tools@
+valgrind_tools = @valgrind_tools@
+@BUILD_SPREADSHEET_MODEL_TRUE@AM_CPPFLAGS = -I$(top_srcdir)/include \
+@BUILD_SPREADSHEET_MODEL_TRUE@ -I$(top_srcdir)/src/include \
+@BUILD_SPREADSHEET_MODEL_TRUE@ -D__ORCUS_SPM_BUILDING_DLL \
+@BUILD_SPREADSHEET_MODEL_TRUE@ $(BOOST_CPPFLAGS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@ $(LIBIXION_CFLAGS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@ $(am__append_1) $(am__append_2) \
+@BUILD_SPREADSHEET_MODEL_TRUE@ $(am__append_3)
+@BUILD_SPREADSHEET_MODEL_TRUE@COMMON_CPPFLAGS = $(AM_CPPFLAGS)
+@BUILD_SPREADSHEET_MODEL_TRUE@lib_LTLIBRARIES = liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la
+@BUILD_SPREADSHEET_MODEL_TRUE@liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_SOURCES = \
+@BUILD_SPREADSHEET_MODEL_TRUE@ auto_filter.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ check_dumper.hpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ check_dumper.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ config.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ debug_state_dumper.hpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ debug_state_dumper.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ document.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ document_impl.hpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ document_impl.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ document_types.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ dumper_global.hpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ dumper_global.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ factory.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ factory_pivot.hpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ factory_pivot.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ factory_shared_strings.hpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ factory_shared_strings.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ factory_sheet.hpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ factory_sheet.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ factory_styles.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ factory_table.hpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ factory_table.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ flat_dumper.hpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ flat_dumper.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ formula_global.hpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ formula_global.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ html_dumper.hpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ html_dumper.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ impl_types.hpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ csv_dumper.hpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ csv_dumper.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ json_dumper.hpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ json_dumper.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ number_format.hpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ number_format.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ pivot.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ shared_formula.hpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ shared_formula.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ shared_strings.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ sheet.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ sheet_impl.hpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ sheet_impl.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ styles.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ view.cpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ global_settings.hpp \
+@BUILD_SPREADSHEET_MODEL_TRUE@ global_settings.cpp
+
+@BUILD_SPREADSHEET_MODEL_TRUE@liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS = $(AM_CPPFLAGS) $(LIBIXION_CFLAGS)
+@BUILD_SPREADSHEET_MODEL_TRUE@liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_LDFLAGS = -no-undefined
+@BUILD_SPREADSHEET_MODEL_TRUE@liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_LIBADD = \
+@BUILD_SPREADSHEET_MODEL_TRUE@ $(LIBIXION_LIBS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@ $(BOOST_DATE_TIME_LIBS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@ $(BOOST_SYSTEM_LIBS) \
+@BUILD_SPREADSHEET_MODEL_TRUE@ ../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@ ../liborcus/liborcus-@ORCUS_API_VERSION@.la \
+@BUILD_SPREADSHEET_MODEL_TRUE@ $(am__append_4) $(am__append_5)
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cpp .lo .o .obj
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/spreadsheet/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign src/spreadsheet/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+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)'; \
+ locs=`for p in $$list; do echo $$p; done | \
+ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+ sort -u`; \
+ test -z "$$locs" || { \
+ echo rm -f $${locs}; \
+ rm -f $${locs}; \
+ }
+
+liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la: $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_OBJECTS) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_DEPENDENCIES) $(EXTRA_liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_DEPENDENCIES)
+ $(AM_V_CXXLD)$(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_LINK) $(am_liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_rpath) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_OBJECTS) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-auto_filter.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-check_dumper.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-config.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-csv_dumper.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-debug_state_dumper.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document_impl.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document_types.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-dumper_global.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_pivot.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_shared_strings.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_sheet.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_styles.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_table.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-flat_dumper.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-formula_global.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-global_settings.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-html_dumper.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-json_dumper.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-number_format.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-pivot.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-shared_formula.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-shared_strings.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-sheet.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-sheet_impl.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-styles.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-view.Plo@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.cpp.o:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cpp.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cpp.lo:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-auto_filter.lo: auto_filter.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-auto_filter.lo -MD -MP -MF $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-auto_filter.Tpo -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-auto_filter.lo `test -f 'auto_filter.cpp' || echo '$(srcdir)/'`auto_filter.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-auto_filter.Tpo $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-auto_filter.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='auto_filter.cpp' object='liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-auto_filter.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-auto_filter.lo `test -f 'auto_filter.cpp' || echo '$(srcdir)/'`auto_filter.cpp
+
+liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-check_dumper.lo: check_dumper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-check_dumper.lo -MD -MP -MF $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-check_dumper.Tpo -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-check_dumper.lo `test -f 'check_dumper.cpp' || echo '$(srcdir)/'`check_dumper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-check_dumper.Tpo $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-check_dumper.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='check_dumper.cpp' object='liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-check_dumper.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-check_dumper.lo `test -f 'check_dumper.cpp' || echo '$(srcdir)/'`check_dumper.cpp
+
+liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-config.lo: config.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-config.lo -MD -MP -MF $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-config.Tpo -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-config.lo `test -f 'config.cpp' || echo '$(srcdir)/'`config.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-config.Tpo $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-config.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='config.cpp' object='liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-config.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-config.lo `test -f 'config.cpp' || echo '$(srcdir)/'`config.cpp
+
+liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-debug_state_dumper.lo: debug_state_dumper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-debug_state_dumper.lo -MD -MP -MF $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-debug_state_dumper.Tpo -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-debug_state_dumper.lo `test -f 'debug_state_dumper.cpp' || echo '$(srcdir)/'`debug_state_dumper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-debug_state_dumper.Tpo $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-debug_state_dumper.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='debug_state_dumper.cpp' object='liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-debug_state_dumper.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-debug_state_dumper.lo `test -f 'debug_state_dumper.cpp' || echo '$(srcdir)/'`debug_state_dumper.cpp
+
+liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document.lo: document.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document.lo -MD -MP -MF $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document.Tpo -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document.lo `test -f 'document.cpp' || echo '$(srcdir)/'`document.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document.Tpo $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='document.cpp' object='liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document.lo `test -f 'document.cpp' || echo '$(srcdir)/'`document.cpp
+
+liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document_impl.lo: document_impl.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document_impl.lo -MD -MP -MF $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document_impl.Tpo -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document_impl.lo `test -f 'document_impl.cpp' || echo '$(srcdir)/'`document_impl.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document_impl.Tpo $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document_impl.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='document_impl.cpp' object='liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document_impl.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document_impl.lo `test -f 'document_impl.cpp' || echo '$(srcdir)/'`document_impl.cpp
+
+liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document_types.lo: document_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document_types.lo -MD -MP -MF $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document_types.Tpo -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document_types.lo `test -f 'document_types.cpp' || echo '$(srcdir)/'`document_types.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document_types.Tpo $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document_types.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='document_types.cpp' object='liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document_types.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document_types.lo `test -f 'document_types.cpp' || echo '$(srcdir)/'`document_types.cpp
+
+liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-dumper_global.lo: dumper_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-dumper_global.lo -MD -MP -MF $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-dumper_global.Tpo -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-dumper_global.lo `test -f 'dumper_global.cpp' || echo '$(srcdir)/'`dumper_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-dumper_global.Tpo $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-dumper_global.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dumper_global.cpp' object='liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-dumper_global.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-dumper_global.lo `test -f 'dumper_global.cpp' || echo '$(srcdir)/'`dumper_global.cpp
+
+liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory.lo: factory.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory.lo -MD -MP -MF $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory.Tpo -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory.lo `test -f 'factory.cpp' || echo '$(srcdir)/'`factory.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory.Tpo $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='factory.cpp' object='liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory.lo `test -f 'factory.cpp' || echo '$(srcdir)/'`factory.cpp
+
+liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_pivot.lo: factory_pivot.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_pivot.lo -MD -MP -MF $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_pivot.Tpo -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_pivot.lo `test -f 'factory_pivot.cpp' || echo '$(srcdir)/'`factory_pivot.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_pivot.Tpo $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_pivot.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='factory_pivot.cpp' object='liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_pivot.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_pivot.lo `test -f 'factory_pivot.cpp' || echo '$(srcdir)/'`factory_pivot.cpp
+
+liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_shared_strings.lo: factory_shared_strings.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_shared_strings.lo -MD -MP -MF $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_shared_strings.Tpo -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_shared_strings.lo `test -f 'factory_shared_strings.cpp' || echo '$(srcdir)/'`factory_shared_strings.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_shared_strings.Tpo $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_shared_strings.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='factory_shared_strings.cpp' object='liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_shared_strings.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_shared_strings.lo `test -f 'factory_shared_strings.cpp' || echo '$(srcdir)/'`factory_shared_strings.cpp
+
+liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_sheet.lo: factory_sheet.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_sheet.lo -MD -MP -MF $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_sheet.Tpo -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_sheet.lo `test -f 'factory_sheet.cpp' || echo '$(srcdir)/'`factory_sheet.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_sheet.Tpo $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_sheet.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='factory_sheet.cpp' object='liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_sheet.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_sheet.lo `test -f 'factory_sheet.cpp' || echo '$(srcdir)/'`factory_sheet.cpp
+
+liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_styles.lo: factory_styles.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_styles.lo -MD -MP -MF $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_styles.Tpo -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_styles.lo `test -f 'factory_styles.cpp' || echo '$(srcdir)/'`factory_styles.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_styles.Tpo $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_styles.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='factory_styles.cpp' object='liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_styles.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_styles.lo `test -f 'factory_styles.cpp' || echo '$(srcdir)/'`factory_styles.cpp
+
+liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_table.lo: factory_table.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_table.lo -MD -MP -MF $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_table.Tpo -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_table.lo `test -f 'factory_table.cpp' || echo '$(srcdir)/'`factory_table.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_table.Tpo $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_table.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='factory_table.cpp' object='liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_table.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_table.lo `test -f 'factory_table.cpp' || echo '$(srcdir)/'`factory_table.cpp
+
+liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-flat_dumper.lo: flat_dumper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-flat_dumper.lo -MD -MP -MF $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-flat_dumper.Tpo -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-flat_dumper.lo `test -f 'flat_dumper.cpp' || echo '$(srcdir)/'`flat_dumper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-flat_dumper.Tpo $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-flat_dumper.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flat_dumper.cpp' object='liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-flat_dumper.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-flat_dumper.lo `test -f 'flat_dumper.cpp' || echo '$(srcdir)/'`flat_dumper.cpp
+
+liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-formula_global.lo: formula_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-formula_global.lo -MD -MP -MF $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-formula_global.Tpo -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-formula_global.lo `test -f 'formula_global.cpp' || echo '$(srcdir)/'`formula_global.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-formula_global.Tpo $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-formula_global.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='formula_global.cpp' object='liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-formula_global.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-formula_global.lo `test -f 'formula_global.cpp' || echo '$(srcdir)/'`formula_global.cpp
+
+liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-html_dumper.lo: html_dumper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-html_dumper.lo -MD -MP -MF $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-html_dumper.Tpo -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-html_dumper.lo `test -f 'html_dumper.cpp' || echo '$(srcdir)/'`html_dumper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-html_dumper.Tpo $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-html_dumper.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='html_dumper.cpp' object='liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-html_dumper.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-html_dumper.lo `test -f 'html_dumper.cpp' || echo '$(srcdir)/'`html_dumper.cpp
+
+liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-csv_dumper.lo: csv_dumper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-csv_dumper.lo -MD -MP -MF $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-csv_dumper.Tpo -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-csv_dumper.lo `test -f 'csv_dumper.cpp' || echo '$(srcdir)/'`csv_dumper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-csv_dumper.Tpo $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-csv_dumper.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='csv_dumper.cpp' object='liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-csv_dumper.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-csv_dumper.lo `test -f 'csv_dumper.cpp' || echo '$(srcdir)/'`csv_dumper.cpp
+
+liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-json_dumper.lo: json_dumper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-json_dumper.lo -MD -MP -MF $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-json_dumper.Tpo -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-json_dumper.lo `test -f 'json_dumper.cpp' || echo '$(srcdir)/'`json_dumper.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-json_dumper.Tpo $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-json_dumper.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='json_dumper.cpp' object='liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-json_dumper.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-json_dumper.lo `test -f 'json_dumper.cpp' || echo '$(srcdir)/'`json_dumper.cpp
+
+liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-number_format.lo: number_format.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-number_format.lo -MD -MP -MF $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-number_format.Tpo -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-number_format.lo `test -f 'number_format.cpp' || echo '$(srcdir)/'`number_format.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-number_format.Tpo $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-number_format.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='number_format.cpp' object='liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-number_format.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-number_format.lo `test -f 'number_format.cpp' || echo '$(srcdir)/'`number_format.cpp
+
+liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-pivot.lo: pivot.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-pivot.lo -MD -MP -MF $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-pivot.Tpo -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-pivot.lo `test -f 'pivot.cpp' || echo '$(srcdir)/'`pivot.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-pivot.Tpo $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-pivot.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='pivot.cpp' object='liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-pivot.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-pivot.lo `test -f 'pivot.cpp' || echo '$(srcdir)/'`pivot.cpp
+
+liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-shared_formula.lo: shared_formula.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-shared_formula.lo -MD -MP -MF $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-shared_formula.Tpo -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-shared_formula.lo `test -f 'shared_formula.cpp' || echo '$(srcdir)/'`shared_formula.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-shared_formula.Tpo $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-shared_formula.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='shared_formula.cpp' object='liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-shared_formula.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-shared_formula.lo `test -f 'shared_formula.cpp' || echo '$(srcdir)/'`shared_formula.cpp
+
+liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-shared_strings.lo: shared_strings.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-shared_strings.lo -MD -MP -MF $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-shared_strings.Tpo -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-shared_strings.lo `test -f 'shared_strings.cpp' || echo '$(srcdir)/'`shared_strings.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-shared_strings.Tpo $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-shared_strings.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='shared_strings.cpp' object='liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-shared_strings.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-shared_strings.lo `test -f 'shared_strings.cpp' || echo '$(srcdir)/'`shared_strings.cpp
+
+liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-sheet.lo: sheet.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-sheet.lo -MD -MP -MF $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-sheet.Tpo -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-sheet.lo `test -f 'sheet.cpp' || echo '$(srcdir)/'`sheet.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-sheet.Tpo $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-sheet.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='sheet.cpp' object='liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-sheet.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-sheet.lo `test -f 'sheet.cpp' || echo '$(srcdir)/'`sheet.cpp
+
+liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-sheet_impl.lo: sheet_impl.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-sheet_impl.lo -MD -MP -MF $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-sheet_impl.Tpo -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-sheet_impl.lo `test -f 'sheet_impl.cpp' || echo '$(srcdir)/'`sheet_impl.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-sheet_impl.Tpo $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-sheet_impl.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='sheet_impl.cpp' object='liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-sheet_impl.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-sheet_impl.lo `test -f 'sheet_impl.cpp' || echo '$(srcdir)/'`sheet_impl.cpp
+
+liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-styles.lo: styles.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-styles.lo -MD -MP -MF $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-styles.Tpo -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-styles.lo `test -f 'styles.cpp' || echo '$(srcdir)/'`styles.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-styles.Tpo $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-styles.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='styles.cpp' object='liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-styles.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-styles.lo `test -f 'styles.cpp' || echo '$(srcdir)/'`styles.cpp
+
+liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-view.lo: view.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-view.lo -MD -MP -MF $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-view.Tpo -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-view.lo `test -f 'view.cpp' || echo '$(srcdir)/'`view.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-view.Tpo $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-view.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='view.cpp' object='liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-view.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-view.lo `test -f 'view.cpp' || echo '$(srcdir)/'`view.cpp
+
+liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-global_settings.lo: global_settings.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-global_settings.lo -MD -MP -MF $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-global_settings.Tpo -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-global_settings.lo `test -f 'global_settings.cpp' || echo '$(srcdir)/'`global_settings.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-global_settings.Tpo $(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-global_settings.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='global_settings.cpp' object='liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-global_settings.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-global_settings.lo `test -f 'global_settings.cpp' || echo '$(srcdir)/'`global_settings.cpp
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+check-valgrind-local:
+check-valgrind-memcheck-local:
+check-valgrind-helgrind-local:
+check-valgrind-drd-local:
+check-valgrind-sgcheck-local:
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @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
+check-am: all-am
+check: check-am
+all-am: Makefile $(LTLIBRARIES)
+installdirs:
+ for dir in "$(DESTDIR)$(libdir)"; 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:
+
+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)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+check-valgrind: check-valgrind-am
+
+check-valgrind-am: check-valgrind-local
+
+check-valgrind-drd: check-valgrind-drd-am
+
+check-valgrind-drd-am: check-valgrind-drd-local
+
+check-valgrind-helgrind: check-valgrind-helgrind-am
+
+check-valgrind-helgrind-am: check-valgrind-helgrind-local
+
+check-valgrind-memcheck: check-valgrind-memcheck-am
+
+check-valgrind-memcheck-am: check-valgrind-memcheck-local
+
+check-valgrind-sgcheck: check-valgrind-sgcheck-am
+
+check-valgrind-sgcheck-am: check-valgrind-sgcheck-local
+
+clean: clean-am
+
+clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-auto_filter.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-check_dumper.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-config.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-csv_dumper.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-debug_state_dumper.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document_impl.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document_types.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-dumper_global.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_pivot.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_shared_strings.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_sheet.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_styles.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_table.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-flat_dumper.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-formula_global.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-global_settings.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-html_dumper.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-json_dumper.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-number_format.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-pivot.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-shared_formula.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-shared_strings.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-sheet.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-sheet_impl.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-styles.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-view.Plo
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-libLTLIBRARIES
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+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 ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-auto_filter.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-check_dumper.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-config.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-csv_dumper.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-debug_state_dumper.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document_impl.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-document_types.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-dumper_global.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_pivot.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_shared_strings.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_sheet.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_styles.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-factory_table.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-flat_dumper.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-formula_global.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-global_settings.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-html_dumper.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-json_dumper.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-number_format.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-pivot.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-shared_formula.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-shared_strings.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-sheet.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-sheet_impl.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-styles.Plo
+ -rm -f ./$(DEPDIR)/liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la-view.Plo
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-libLTLIBRARIES
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am am--depfiles check check-am check-valgrind-am \
+ check-valgrind-drd-am check-valgrind-drd-local \
+ check-valgrind-helgrind-am check-valgrind-helgrind-local \
+ check-valgrind-local check-valgrind-memcheck-am \
+ check-valgrind-memcheck-local check-valgrind-sgcheck-am \
+ check-valgrind-sgcheck-local clean clean-generic \
+ clean-libLTLIBRARIES clean-libtool cscopelist-am ctags-am \
+ distclean distclean-compile distclean-generic \
+ distclean-libtool distdir dvi dvi-am html html-am info info-am \
+ install install-am 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-man install-pdf install-pdf-am \
+ 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 \
+ tags-am uninstall uninstall-am uninstall-libLTLIBRARIES
+
+.PRECIOUS: Makefile
+
+
+# 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/src/spreadsheet/auto_filter.cpp b/src/spreadsheet/auto_filter.cpp
new file mode 100644
index 0000000..3262305
--- /dev/null
+++ b/src/spreadsheet/auto_filter.cpp
@@ -0,0 +1,116 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/spreadsheet/auto_filter.hpp"
+
+namespace orcus { namespace spreadsheet {
+
+auto_filter_column_t::auto_filter_column_t() = default;
+auto_filter_column_t::auto_filter_column_t(const auto_filter_column_t& other) = default;
+auto_filter_column_t::auto_filter_column_t(auto_filter_column_t&& other) = default;
+auto_filter_column_t::~auto_filter_column_t() = default;
+
+auto_filter_column_t& auto_filter_column_t::operator=(const auto_filter_column_t& other) = default;
+auto_filter_column_t& auto_filter_column_t::operator=(auto_filter_column_t&& other) = default;
+
+void auto_filter_column_t::reset()
+{
+ match_values.clear();
+}
+
+void auto_filter_column_t::swap(auto_filter_column_t& r)
+{
+ match_values.swap(r.match_values);
+}
+
+auto_filter_t::auto_filter_t() : range(ixion::abs_range_t::invalid) {}
+auto_filter_t::auto_filter_t(const auto_filter_t& other) = default;
+auto_filter_t::auto_filter_t(auto_filter_t&& other) = default;
+auto_filter_t::~auto_filter_t() = default;
+
+auto_filter_t& auto_filter_t::operator=(const auto_filter_t& other) = default;
+auto_filter_t& auto_filter_t::operator=(auto_filter_t&& other) = default;
+
+void auto_filter_t::reset()
+{
+ range = ixion::abs_range_t(ixion::abs_range_t::invalid);
+ columns.clear();
+}
+
+void auto_filter_t::swap(auto_filter_t& r)
+{
+ std::swap(range, r.range);
+ columns.swap(r.columns);
+}
+
+void auto_filter_t::commit_column(col_t col, auto_filter_column_t data)
+{
+ if (col < 0)
+ // Invalid column index. Nothing happens.
+ return;
+
+ columns.insert_or_assign(col, std::move(data));
+}
+
+table_column_t::table_column_t() : identifier(0), totals_row_function(totals_row_function_t::none) {}
+
+table_column_t::table_column_t(const table_column_t& other) = default;
+table_column_t::~table_column_t() = default;
+
+table_column_t& table_column_t::operator=(const table_column_t& other) = default;
+
+void table_column_t::reset()
+{
+ identifier = 0;
+ name = std::string_view{};
+ totals_row_label = std::string_view{};
+ totals_row_function = totals_row_function_t::none;
+}
+
+table_style_t::table_style_t() :
+ show_first_column(false),
+ show_last_column(false),
+ show_row_stripes(false),
+ show_column_stripes(false) {}
+
+table_style_t::table_style_t(const table_style_t& other) = default;
+table_style_t::~table_style_t() = default;
+
+table_style_t& table_style_t::operator=(const table_style_t& other) = default;
+
+void table_style_t::reset()
+{
+ name = std::string_view{};
+ show_first_column = false;
+ show_last_column = false;
+ show_row_stripes = false;
+ show_column_stripes = false;
+}
+
+table_t::table_t() : identifier(0), range(ixion::abs_range_t::invalid), totals_row_count(0) {}
+table_t::table_t(const table_t& other) = default;
+table_t::table_t(table_t&& other) = default;
+table_t::~table_t() = default;
+
+table_t& table_t::operator=(const table_t& other) = default;
+table_t& table_t::operator=(table_t&& other) = default;
+
+void table_t::reset()
+{
+ identifier = 0;
+ name = std::string_view{};
+ display_name = std::string_view{};
+ range = ixion::abs_range_t(ixion::abs_range_t::invalid);
+ totals_row_count = 0;
+ filter.reset();
+ columns.clear();
+ style.reset();
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/check_dumper.cpp b/src/spreadsheet/check_dumper.cpp
new file mode 100644
index 0000000..191b5a0
--- /dev/null
+++ b/src/spreadsheet/check_dumper.cpp
@@ -0,0 +1,209 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "check_dumper.hpp"
+#include "sheet_impl.hpp"
+#include "number_format.hpp"
+#include "orcus/spreadsheet/document.hpp"
+
+#include <ixion/model_context.hpp>
+#include <ixion/cell.hpp>
+#include <ixion/formula.hpp>
+#include <ixion/formula_name_resolver.hpp>
+#include <ixion/formula_result.hpp>
+
+#include <string>
+#include <algorithm>
+
+namespace orcus { namespace spreadsheet { namespace detail {
+
+namespace {
+
+void write_cell_position(std::ostream& os, std::string_view sheet_name, row_t row, col_t col)
+{
+ os << sheet_name << '/' << row << '/' << col << ':';
+}
+
+std::string escape_chars(const std::string& str)
+{
+ if (str.empty())
+ return str;
+
+ std::string ret;
+ const char* p = &str[0];
+ const char* p_end = p + str.size();
+ for (; p != p_end; ++p)
+ {
+ if (*p == '"')
+ ret.push_back('\\');
+ ret.push_back(*p);
+ }
+ return ret;
+}
+
+}
+
+check_dumper::check_dumper(const detail::sheet_impl& sheet, std::string_view sheet_name) :
+ m_sheet(sheet), m_sheet_name(sheet_name)
+{
+}
+
+void check_dumper::dump(std::ostream& os) const
+{
+ dump_cell_values(os);
+ dump_merged_cell_info(os);
+}
+
+void check_dumper::dump_cell_values(std::ostream& os) const
+{
+ ixion::abs_range_t range = m_sheet.get_data_range();
+ if (!range.valid())
+ // Sheet is empty. Nothing to print.
+ return;
+
+ const ixion::model_context& cxt = m_sheet.doc.get_model_context();
+ const ixion::formula_name_resolver* resolver =
+ m_sheet.doc.get_formula_name_resolver(spreadsheet::formula_ref_context_t::global);
+
+ size_t row_count = range.last.row + 1;
+ size_t col_count = range.last.column + 1;
+
+ for (size_t row = 0; row < row_count; ++row)
+ {
+ for (size_t col = 0; col < col_count; ++col)
+ {
+ ixion::abs_address_t pos(m_sheet.sheet_id, row, col);
+ switch (cxt.get_celltype(pos))
+ {
+ case ixion::celltype_t::string:
+ {
+ write_cell_position(os, m_sheet_name, row, col);
+ size_t sindex = cxt.get_string_identifier(pos);
+ const std::string* p = cxt.get_string(sindex);
+ assert(p);
+ os << "string:\"" << escape_chars(*p) << '"' << std::endl;
+ break;
+ }
+ case ixion::celltype_t::numeric:
+ {
+ write_cell_position(os, m_sheet_name, row, col);
+ os << "numeric:";
+ detail::format_to_file_output(os, cxt.get_numeric_value(pos));
+ os << std::endl;
+ break;
+ }
+ case ixion::celltype_t::boolean:
+ {
+ write_cell_position(os, m_sheet_name, row, col);
+ os << "boolean:" << (cxt.get_boolean_value(pos) ? "true" : "false") << std::endl;
+ break;
+ }
+ case ixion::celltype_t::formula:
+ {
+ write_cell_position(os, m_sheet_name, row, col);
+ os << "formula";
+
+ // print the formula and the formula result.
+ const ixion::formula_cell* cell = cxt.get_formula_cell(pos);
+ assert(cell);
+ const ixion::formula_tokens_store_ptr_t& ts = cell->get_tokens();
+ if (ts)
+ {
+ const ixion::formula_tokens_t& tokens = ts->get();
+ std::string formula;
+ if (resolver)
+ {
+ pos = cell->get_parent_position(pos);
+ formula = ixion::print_formula_tokens(
+ m_sheet.doc.get_model_context(), pos, *resolver, tokens);
+ }
+ else
+ formula = "???";
+
+ os << ':';
+
+ ixion::formula_group_t fg = cell->get_group_properties();
+
+ if (fg.grouped)
+ os << '{' << formula << '}';
+ else
+ os << formula;
+
+ try
+ {
+ ixion::formula_result res = cell->get_result_cache(
+ ixion::formula_result_wait_policy_t::throw_exception);
+ os << ':' << res.str(m_sheet.doc.get_model_context());
+ }
+ catch (const std::exception&)
+ {
+ os << ":#RES!";
+ }
+ }
+
+ os << std::endl;
+ break;
+ }
+ default:
+ ;
+ }
+ }
+ }
+}
+
+void check_dumper::dump_merged_cell_info(std::ostream& os) const
+{
+ // Sort by rows first then by columns.
+
+ struct _entry
+ {
+ row_t row;
+ col_t col;
+ const merge_size* ms;
+
+ _entry(row_t _row, col_t _col, const merge_size* _ms) :
+ row(_row), col(_col), ms(_ms) {}
+ };
+
+ std::vector<_entry> entries;
+
+ for (const auto& col_entry : m_sheet.merge_ranges)
+ {
+ col_t col = col_entry.first;
+
+ for (const auto& row_entry : *col_entry.second)
+ {
+ row_t row = row_entry.first;
+ const merge_size& ms = row_entry.second;
+
+ entries.emplace_back(row, col, &ms);
+ }
+ }
+
+ std::sort(entries.begin(), entries.end(),
+ [](const _entry& left, const _entry& right) -> bool
+ {
+ if (left.row != right.row)
+ return left.row < right.row;
+
+ if (left.col != right.col)
+ return left.col < right.col;
+
+ return left.ms < right.ms;
+ }
+ );
+
+ for (const _entry e : entries)
+ {
+ os << m_sheet_name << '/' << e.row << '/' << e.col << ":merge-width:" << e.ms->width << std::endl;
+ os << m_sheet_name << '/' << e.row << '/' << e.col << ":merge-height:" << e.ms->height << std::endl;
+ }
+}
+
+}}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/check_dumper.hpp b/src/spreadsheet/check_dumper.hpp
new file mode 100644
index 0000000..3a55a2c
--- /dev/null
+++ b/src/spreadsheet/check_dumper.hpp
@@ -0,0 +1,38 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_SPREADSHEET_CHECK_DUMPER_HPP
+#define INCLUDED_ORCUS_SPREADSHEET_CHECK_DUMPER_HPP
+
+#include <ostream>
+#include <string_view>
+
+namespace orcus { namespace spreadsheet {
+
+namespace detail {
+
+struct sheet_impl;
+
+class check_dumper
+{
+ const sheet_impl& m_sheet;
+ std::string_view m_sheet_name;
+
+public:
+ check_dumper(const sheet_impl& sheet, std::string_view sheet_name);
+ void dump(std::ostream& os) const;
+
+private:
+ void dump_cell_values(std::ostream& os) const;
+ void dump_merged_cell_info(std::ostream& os) const;
+};
+
+}}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/config.cpp b/src/spreadsheet/config.cpp
new file mode 100644
index 0000000..45a7934
--- /dev/null
+++ b/src/spreadsheet/config.cpp
@@ -0,0 +1,28 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/spreadsheet/config.hpp"
+
+namespace orcus { namespace spreadsheet {
+
+document_config::document_config() :
+ output_precision(-1) {}
+
+document_config::document_config(const document_config& r) :
+ output_precision(r.output_precision) {}
+
+document_config::~document_config() {}
+
+document_config& document_config::operator= (const document_config& r)
+{
+ output_precision = r.output_precision;
+ return *this;
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/csv_dumper.cpp b/src/spreadsheet/csv_dumper.cpp
new file mode 100644
index 0000000..5aa5a4e
--- /dev/null
+++ b/src/spreadsheet/csv_dumper.cpp
@@ -0,0 +1,95 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "csv_dumper.hpp"
+#include "dumper_global.hpp"
+#include "orcus/spreadsheet/document.hpp"
+
+#include <ixion/model_context.hpp>
+#include <ixion/formula_name_resolver.hpp>
+#include <ixion/formula_result.hpp>
+#include <mdds/multi_type_vector/collection.hpp>
+
+#include <fstream>
+#include <sstream>
+#include <iostream>
+
+namespace orcus { namespace spreadsheet { namespace detail {
+
+namespace {
+
+void dump_string(std::ostream& os, const std::string& s)
+{
+ // Scan for any special characters that necessitate quoting.
+ bool outer_quotes = s.find_first_of(",\"") != std::string::npos;
+
+ if (outer_quotes)
+ os << '"';
+
+ for (const char c : s)
+ {
+ switch (c)
+ {
+ case '"':
+ {
+ os << c << c;
+ break;
+ }
+ default:
+ os << c;
+ }
+ }
+
+ if (outer_quotes)
+ os << '"';
+}
+
+void dump_empty(std::ostream& /*os*/)
+{
+ // Do nothing.
+}
+
+}
+
+csv_dumper::csv_dumper(const document& doc) :
+ m_doc(doc), m_sep(','), m_quote('"')
+{
+}
+
+void csv_dumper::dump(std::ostream& os, ixion::sheet_t sheet_id) const
+{
+ const ixion::model_context& cxt = m_doc.get_model_context();
+ ixion::abs_range_t data_range = cxt.get_data_range(sheet_id);
+ if (!data_range.valid())
+ return;
+
+ ixion::abs_rc_range_t iter_range;
+ iter_range.first.column = 0;
+ iter_range.first.row = 0;
+ iter_range.last.column = data_range.last.column;
+ iter_range.last.row = data_range.last.row;
+
+ auto iter = cxt.get_model_iterator(
+ sheet_id, ixion::rc_direction_t::horizontal, iter_range);
+
+ for (; iter.has(); iter.next())
+ {
+ const auto& cell = iter.get();
+
+ if (cell.col == 0 && cell.row > 0)
+ os << std::endl;
+
+ if (cell.col > 0)
+ os << m_sep;
+
+ dump_cell_value(os, cxt, cell, dump_string, dump_empty);
+ }
+}
+
+}}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/csv_dumper.hpp b/src/spreadsheet/csv_dumper.hpp
new file mode 100644
index 0000000..a03bbe9
--- /dev/null
+++ b/src/spreadsheet/csv_dumper.hpp
@@ -0,0 +1,38 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_SPREADSHEET_CSV_DUMPER_HPP
+#define INCLUDED_ORCUS_SPREADSHEET_CSV_DUMPER_HPP
+
+#include <string>
+#include <ostream>
+#include <ixion/types.hpp>
+
+namespace orcus { namespace spreadsheet {
+
+class document;
+
+namespace detail {
+
+class csv_dumper
+{
+ const document& m_doc;
+ const char m_sep;
+ const char m_quote;
+
+public:
+ csv_dumper(const document& doc);
+
+ void dump(std::ostream& os, ixion::sheet_t sheet_id) const;
+};
+
+}}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+
diff --git a/src/spreadsheet/debug_state_dumper.cpp b/src/spreadsheet/debug_state_dumper.cpp
new file mode 100644
index 0000000..c748924
--- /dev/null
+++ b/src/spreadsheet/debug_state_dumper.cpp
@@ -0,0 +1,460 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "debug_state_dumper.hpp"
+#include "check_dumper.hpp"
+#include "document_impl.hpp"
+#include "sheet_impl.hpp"
+#include "ostream_utils.hpp"
+
+#include <ixion/formula_name_resolver.hpp>
+#include <ixion/named_expressions_iterator.hpp>
+
+#include <fstream>
+#include <algorithm>
+
+namespace orcus { namespace spreadsheet { namespace detail {
+
+namespace {
+
+void print_named_expressions(const ixion::model_context& cxt, ixion::named_expressions_iterator iter, std::ostream& os)
+{
+ auto resolver = ixion::formula_name_resolver::get(ixion::formula_name_resolver_t::excel_a1, &cxt);
+
+ if (!resolver)
+ return;
+
+ const ixion::abs_address_t origin{0, 0, 0};
+ ixion::print_config config;
+ config.display_sheet = ixion::display_sheet_t::always;
+
+ for (; iter.has(); iter.next())
+ {
+ auto name = iter.get();
+
+ std::string exp = ixion::print_formula_tokens(
+ config, cxt, origin, *resolver, name.expression->tokens);
+
+ os << "- name: " << *name.name << std::endl;
+ os << " origin: " << resolver->get_name(name.expression->origin, origin, true) << std::endl;
+ os << " expression: " << exp << std::endl;
+ }
+}
+
+} // anonymous namespace
+
+doc_debug_state_dumper::doc_debug_state_dumper(const document_impl& doc) : m_doc(doc)
+{
+}
+
+void doc_debug_state_dumper::dump(const fs::path& outdir) const
+{
+ dump_properties(outdir);
+ dump_styles(outdir);
+ dump_named_expressions(outdir);
+}
+
+void doc_debug_state_dumper::dump_properties(const fs::path& outdir) const
+{
+ const fs::path outpath = outdir / "properties.yaml";
+ std::ofstream of{outpath.native()};
+ if (!of)
+ return;
+
+ of << "formula-grammar: " << m_doc.grammar << std::endl;
+ of << "origin-date: " << m_doc.origin_date << std::endl;
+ of << "output-precision: " << short(m_doc.doc_config.output_precision) << std::endl;
+}
+
+void doc_debug_state_dumper::dump_styles(const fs::path& outdir) const
+{
+ const fs::path outpath = outdir / "styles.yaml";
+ std::ofstream of{outpath.native()};
+ if (!of)
+ return;
+
+ of << std::boolalpha;
+
+ auto to_string = [](std::optional<bool> v) -> std::string
+ {
+ if (!v)
+ return "(unset)";
+
+ return *v ? "true" : "false";
+ };
+
+ auto dump_xf = [&of,to_string](std::size_t i, const cell_format_t& xf)
+ {
+ of << " - id: " << i << std::endl
+ << " font: " << xf.font << std::endl
+ << " fill: " << xf.fill << std::endl
+ << " border: " << xf.border << std::endl
+ << " protection: " << xf.protection << std::endl
+ << " number-format: " << xf.number_format << std::endl
+ << " style-xf: " << xf.style_xf << std::endl
+ << " horizontal-alignment: " << xf.hor_align << std::endl
+ << " vertical-alignment: " << xf.ver_align << std::endl
+ << " apply-number-format: " << xf.apply_num_format << std::endl
+ << " apply-font: " << xf.apply_font << std::endl
+ << " apply-fill: " << xf.apply_fill << std::endl
+ << " apply-border: " << xf.apply_border << std::endl
+ << " apply-alignment: " << xf.apply_alignment << std::endl
+ << " apply-protection: " << xf.apply_protection << std::endl
+ << " wrap-text: " << to_string(xf.wrap_text) << std::endl
+ << " shrink-to-fit: " << to_string(xf.shrink_to_fit) << std::endl;
+ };
+
+ auto optional_value = [&of](std::string_view name, const auto& v, int level=2)
+ {
+ // v is of type std::optional<T>.
+
+ constexpr char q = '"';
+ constexpr const char* indent_unit_s = " ";
+
+ std::string indent = indent_unit_s;
+ for (int i = 0; i < level - 1; ++i)
+ indent += indent_unit_s;
+
+ of << indent << name << ": ";
+
+ if (v)
+ {
+ std::ostringstream os;
+ os << *v;
+ std::string s = os.str();
+ bool quote = s.find_first_of("#:-") != s.npos;
+ if (quote)
+ of << q << s << q;
+ else
+ of << s;
+ }
+ else
+ of << "(unset)";
+
+ of << std::endl;
+ };
+
+ auto dump_border = [&optional_value](const border_attrs_t& _attrs)
+ {
+ optional_value("style", _attrs.style, 3);
+ optional_value("color", _attrs.border_color, 3);
+ optional_value("width", _attrs.border_width, 3);
+ };
+
+ of << "cell-styles:" << std::endl;
+
+ for (std::size_t i = 0; i < m_doc.styles_store.get_cell_styles_count(); ++i)
+ {
+ const cell_style_t* cs = m_doc.styles_store.get_cell_style(i);
+ assert(cs);
+
+ of << " - id: " << i << std::endl
+ << " name: " << cs->name << std::endl
+ << " display-name: " << cs->display_name << std::endl
+ << " parent: " << cs->parent_name << std::endl
+ << " xf: " << cs->xf << std::endl
+ << " builtin: " << cs->builtin << std::endl;
+ }
+
+ of << "cell-style-formats:" << std::endl;
+
+ for (std::size_t i = 0; i < m_doc.styles_store.get_cell_style_formats_count(); ++i)
+ {
+ const cell_format_t* xf = m_doc.styles_store.get_cell_style_format(i);
+ assert(xf);
+ dump_xf(i, *xf);
+ }
+
+ of << "cell-formats:" << std::endl;
+
+ for (std::size_t i = 0; i < m_doc.styles_store.get_cell_formats_count(); ++i)
+ {
+ const cell_format_t* xf = m_doc.styles_store.get_cell_format(i);
+ assert(xf);
+ dump_xf(i, *xf);
+ }
+
+ of << "fonts:" << std::endl;
+
+ for (std::size_t i = 0; i < m_doc.styles_store.get_font_count(); ++i)
+ {
+ const font_t* font = m_doc.styles_store.get_font(i);
+ assert(font);
+
+ of << " - id: " << i << std::endl;
+ optional_value("name", font->name, 2);
+ optional_value("name-asian", font->name_asian, 2);
+ optional_value("name-complex", font->name_complex, 2);
+ optional_value("size", font->size, 2);
+ optional_value("size-asian", font->size_asian, 2);
+ optional_value("size-complex", font->size_complex, 2);
+ optional_value("bold", font->bold, 2);
+ optional_value("bold-asian", font->bold_asian, 2);
+ optional_value("bold-complex", font->bold_complex, 2);
+ optional_value("italic", font->italic, 2);
+ optional_value("italic-asian", font->italic_asian, 2);
+ optional_value("italic-complex", font->italic_complex, 2);
+ optional_value("underline-style", font->underline_style, 2);
+ optional_value("underline-width", font->underline_width, 2);
+ optional_value("underline-mode", font->underline_mode, 2);
+ optional_value("underline-type", font->underline_type, 2);
+ optional_value("underline-color", font->underline_color, 2);
+ optional_value("color", font->color, 2);
+ optional_value("strikethrough-style", font->strikethrough_style, 2);
+ optional_value("strikethrough-width", font->strikethrough_width, 2);
+ optional_value("strikethrough-type", font->strikethrough_type, 2);
+ optional_value("strikethrough-text", font->strikethrough_text, 2);
+ }
+
+ of << "fills:" << std::endl;
+
+ for (std::size_t i = 0; i < m_doc.styles_store.get_fill_count(); ++i)
+ {
+ const fill_t* fill = m_doc.styles_store.get_fill(i);
+ assert(fill);
+
+ of << " - id: " << i << std::endl;
+ optional_value("pattern", fill->pattern_type, 2);
+ optional_value("fg-color", fill->fg_color, 2);
+ optional_value("bg-color", fill->bg_color, 2);
+ }
+
+ of << "borders:" << std::endl;
+
+ for (std::size_t i = 0; i < m_doc.styles_store.get_border_count(); ++i)
+ {
+ const border_t* border = m_doc.styles_store.get_border(i);
+ assert(border);
+
+ of << " - id: " << i << std::endl;
+
+ of << " top:" << std::endl;
+ dump_border(border->top);
+ of << " bottom:" << std::endl;
+ dump_border(border->bottom);
+ of << " left:" << std::endl;
+ dump_border(border->left);
+ of << " right:" << std::endl;
+ dump_border(border->right);
+ of << " diagonal:" << std::endl;
+ dump_border(border->diagonal);
+ of << " diagonal-bl-tr:" << std::endl;
+ dump_border(border->diagonal_bl_tr);
+ of << " diagonal-tl-br:" << std::endl;
+ dump_border(border->diagonal_tl_br);
+ }
+
+ of << "protections:" << std::endl;
+
+ for (std::size_t i = 0; i < m_doc.styles_store.get_protection_count(); ++i)
+ {
+ const protection_t* prot = m_doc.styles_store.get_protection(i);
+ assert(prot);
+
+ of << " - id: " << i << std::endl;
+ optional_value("locked", prot->locked, 2);
+ optional_value("hidden", prot->hidden, 2);
+ optional_value("print-content", prot->print_content, 2);
+ optional_value("formula-hidden", prot->formula_hidden, 2);
+ }
+
+ of << "number-formats:" << std::endl;
+
+ for (std::size_t i = 0; i < m_doc.styles_store.get_number_format_count(); ++i)
+ {
+ const number_format_t* numfmt = m_doc.styles_store.get_number_format(i);
+ assert(numfmt);
+
+ of << " - id: " << i << std::endl;
+ optional_value("identifier", numfmt->identifier, 2);
+ optional_value("format-string", numfmt->format_string, 2);
+ }
+}
+
+void doc_debug_state_dumper::dump_named_expressions(const fs::path& outdir) const
+{
+ const fs::path outpath = outdir / "named-expressions.yaml";
+ std::ofstream of{outpath.native()};
+ if (!of)
+ return;
+
+ print_named_expressions(m_doc.context, m_doc.context.get_named_expressions_iterator(), of);
+}
+
+sheet_debug_state_dumper::sheet_debug_state_dumper(const sheet_impl& sheet, std::string_view sheet_name) :
+ m_sheet(sheet), m_sheet_name(sheet_name) {}
+
+void sheet_debug_state_dumper::dump(const fs::path& outdir) const
+{
+ dump_cell_values(outdir);
+ dump_cell_formats(outdir);
+ dump_column_formats(outdir);
+ dump_row_formats(outdir);
+ dump_column_widths(outdir);
+ dump_row_heights(outdir);
+ dump_auto_filter(outdir);
+ dump_named_expressions(outdir);
+}
+
+void sheet_debug_state_dumper::dump_cell_values(const fs::path& outdir) const
+{
+ check_dumper dumper{m_sheet, m_sheet_name};
+ fs::path outpath = outdir / "cell-values.txt";
+ std::ofstream of{outpath.native()};
+ if (of)
+ dumper.dump(of);
+}
+
+void sheet_debug_state_dumper::dump_cell_formats(const fs::path& outdir) const
+{
+ fs::path outpath = outdir / "cell-formats.yaml";
+ std::ofstream of{outpath.native()};
+ if (!of)
+ return;
+
+ std::vector<col_t> columns;
+ for (const auto& node : m_sheet.cell_formats)
+ columns.push_back(node.first);
+
+ std::sort(columns.begin(), columns.end());
+
+ for (const col_t col : columns)
+ {
+ of << "column: " << col << std::endl;
+
+ auto it = m_sheet.cell_formats.find(col);
+ assert(it != m_sheet.cell_formats.end());
+ const segment_row_index_type& rows = *it->second;
+
+ for (const auto& seg : rows.segment_range())
+ {
+ // NB: end position is not inclusive.
+ of << " - rows: " << seg.start << '-' << (seg.end - 1) << std::endl;
+ of << " xf: " << seg.value << std::endl;
+ }
+ }
+}
+
+void sheet_debug_state_dumper::dump_column_formats(const fs::path& outdir) const
+{
+ fs::path outpath = outdir / "column-formats.yaml";
+ std::ofstream of{outpath.native()};
+ if (!of)
+ return;
+
+ for (const auto& seg : m_sheet.column_formats.segment_range())
+ {
+ of << "- columns: " << seg.start << '-' << (seg.end - 1) << std::endl;
+ of << " xf: " << seg.value << std::endl;
+ }
+}
+
+void sheet_debug_state_dumper::dump_row_formats(const fs::path& outdir) const
+{
+ fs::path outpath = outdir / "row-formats.yaml";
+ std::ofstream of{outpath.native()};
+ if (!of)
+ return;
+
+ for (const auto& seg : m_sheet.row_formats.segment_range())
+ {
+ of << "- rows: " << seg.start << '-' << (seg.end - 1) << std::endl;
+ of << " xf: " << seg.value << std::endl;
+ }
+}
+
+void sheet_debug_state_dumper::dump_column_widths(const fs::path& outdir) const
+{
+ fs::path outpath = outdir / "column-widths.yaml";
+ std::ofstream of{outpath.native()};
+ if (!of)
+ return;
+
+ for (const auto& seg : m_sheet.col_widths.segment_range())
+ {
+ of << "- columns: " << seg.start << '-' << (seg.end - 1) << std::endl;
+ of << " width: ";
+
+ if (seg.value == get_default_column_width())
+ of << "(default)";
+ else
+ of << seg.value;
+
+ of << std::endl;
+ }
+}
+
+void sheet_debug_state_dumper::dump_row_heights(const fs::path& outdir) const
+{
+ fs::path outpath = outdir / "row-heights.yaml";
+ std::ofstream of{outpath.native()};
+ if (!of)
+ return;
+
+ for (const auto& seg : m_sheet.row_heights.segment_range())
+ {
+ of << "- rows: " << seg.start << '-' << (seg.end - 1) << std::endl;
+ of << " height: ";
+
+ if (seg.value == get_default_row_height())
+ of << "(default)";
+ else
+ of << seg.value;
+
+ of << std::endl;
+ }
+}
+
+void sheet_debug_state_dumper::dump_auto_filter(const fs::path& outdir) const
+{
+ if (!m_sheet.auto_filter_data)
+ return;
+
+ fs::path outpath = outdir / "auto-filter.yaml";
+ std::ofstream of{outpath.native()};
+ if (!of)
+ return;
+
+ const auto_filter_t& data = *m_sheet.auto_filter_data;
+
+ auto resolver = ixion::formula_name_resolver::get(
+ ixion::formula_name_resolver_t::excel_a1, nullptr);
+
+ if (!resolver)
+ return;
+
+ ixion::abs_address_t origin;
+ ixion::range_t name{data.range};
+ name.set_absolute(false);
+
+ of << "range: " << resolver->get_name(name, origin, false) << "\n";
+ of << "columns:\n";
+
+ for (const auto& [col, cdata] : data.columns)
+ {
+ of << "- column: " << col << "\n";
+ of << " match-values:\n";
+
+ for (const auto& v : cdata.match_values)
+ of << " - " << v << std::endl;
+ }
+}
+
+void sheet_debug_state_dumper::dump_named_expressions(const fs::path& outdir) const
+{
+ const fs::path outpath = outdir / "named-expressions.yaml";
+ std::ofstream of{outpath.native()};
+ if (!of)
+ return;
+
+ const ixion::model_context& cxt = m_sheet.doc.get_model_context();
+ print_named_expressions(cxt, cxt.get_named_expressions_iterator(m_sheet.sheet_id), of);
+}
+
+}}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/debug_state_dumper.hpp b/src/spreadsheet/debug_state_dumper.hpp
new file mode 100644
index 0000000..7e895ca
--- /dev/null
+++ b/src/spreadsheet/debug_state_dumper.hpp
@@ -0,0 +1,61 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#pragma once
+
+#include "filesystem_env.hpp"
+
+#include <string_view>
+
+namespace orcus { namespace spreadsheet {
+
+class document;
+
+namespace detail {
+
+struct document_impl;
+struct sheet_impl;
+
+class doc_debug_state_dumper
+{
+ const document_impl& m_doc;
+
+public:
+ doc_debug_state_dumper(const document_impl& doc);
+
+ void dump(const fs::path& outdir) const;
+
+private:
+ void dump_properties(const fs::path& outdir) const;
+ void dump_styles(const fs::path& outdir) const;
+ void dump_named_expressions(const fs::path& outdir) const;
+};
+
+class sheet_debug_state_dumper
+{
+ const sheet_impl& m_sheet;
+ std::string_view m_sheet_name;
+
+public:
+ sheet_debug_state_dumper(const sheet_impl& sheet, std::string_view sheet_name);
+
+ void dump(const fs::path& outdir) const;
+
+private:
+ void dump_cell_values(const fs::path& outdir) const;
+ void dump_cell_formats(const fs::path& outdir) const;
+ void dump_column_formats(const fs::path& outdir) const;
+ void dump_row_formats(const fs::path& outdir) const;
+ void dump_column_widths(const fs::path& outdir) const;
+ void dump_row_heights(const fs::path& outdir) const;
+ void dump_auto_filter(const fs::path& outdir) const;
+ void dump_named_expressions(const fs::path& outdir) const;
+};
+
+}}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/document.cpp b/src/spreadsheet/document.cpp
new file mode 100644
index 0000000..dc8daec
--- /dev/null
+++ b/src/spreadsheet/document.cpp
@@ -0,0 +1,526 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "document_impl.hpp"
+#include "debug_state_dumper.hpp"
+
+#include <iostream>
+#include <fstream>
+#include <sstream>
+#include <map>
+#include <algorithm>
+
+using namespace std;
+
+namespace orcus { namespace spreadsheet {
+
+namespace {
+
+class find_sheet_by_name
+{
+ std::string_view m_name;
+public:
+ find_sheet_by_name(std::string_view name) : m_name(name) {}
+ bool operator() (const std::unique_ptr<detail::sheet_item>& v) const
+ {
+ return v->name == m_name;
+ }
+};
+
+}
+
+document::document(const range_size_t& sheet_size) : mp_impl(std::make_unique<detail::document_impl>(*this, sheet_size)) {}
+
+document::~document() {}
+
+shared_strings& document::get_shared_strings()
+{
+ return mp_impl->ss_store;
+}
+
+const shared_strings& document::get_shared_strings() const
+{
+ return mp_impl->ss_store;
+}
+
+styles& document::get_styles()
+{
+ return mp_impl->styles_store;
+}
+
+const styles& document::get_styles() const
+{
+ return mp_impl->styles_store;
+}
+
+pivot_collection& document::get_pivot_collection()
+{
+ return mp_impl->pivots;
+}
+
+const pivot_collection& document::get_pivot_collection() const
+{
+ return mp_impl->pivots;
+}
+
+ixion::model_context& document::get_model_context()
+{
+ return mp_impl->context;
+}
+
+const ixion::model_context& document::get_model_context() const
+{
+ return mp_impl->context;
+}
+
+const document_config& document::get_config() const
+{
+ return mp_impl->doc_config;
+}
+
+void document::set_config(const document_config& cfg)
+{
+ mp_impl->doc_config = cfg;
+ ixion::config ixion_cfg = mp_impl->context.get_config();
+ ixion_cfg.output_precision = cfg.output_precision;
+ mp_impl->context.set_config(ixion_cfg);
+}
+
+string_pool& document::get_string_pool()
+{
+ return mp_impl->string_pool_store;
+}
+
+const string_pool& document::get_string_pool() const
+{
+ return mp_impl->string_pool_store;
+}
+
+void document::insert_table(table_t* p)
+{
+ if (!p)
+ return;
+
+ std::string_view name = p->name;
+ mp_impl->tables.emplace(name, std::unique_ptr<table_t>(p));
+}
+
+const table_t* document::get_table(std::string_view name) const
+{
+ auto it = mp_impl->tables.find(name);
+ return it == mp_impl->tables.end() ? nullptr : it->second.get();
+}
+
+void document::finalize_import()
+{
+ std::for_each(mp_impl->sheets.begin(), mp_impl->sheets.end(),
+ [](std::unique_ptr<detail::sheet_item>& sh)
+ {
+ sh->data.finalize_import();
+ }
+ );
+
+ mp_impl->styles_store.finalize_import();
+}
+
+sheet* document::append_sheet(std::string_view sheet_name)
+{
+ std::string_view sheet_name_safe = mp_impl->string_pool_store.intern(sheet_name).first;
+ sheet_t sheet_index = static_cast<sheet_t>(mp_impl->sheets.size());
+
+ mp_impl->sheets.push_back(
+ std::make_unique<detail::sheet_item>(*this, sheet_name_safe, sheet_index));
+
+ mp_impl->context.append_sheet(std::string{sheet_name_safe});
+
+ return &mp_impl->sheets.back()->data;
+}
+
+sheet* document::get_sheet(std::string_view sheet_name)
+{
+ const sheet* sh = const_cast<const document*>(this)->get_sheet(sheet_name);
+ return const_cast<sheet*>(sh);
+}
+
+const sheet* document::get_sheet(std::string_view sheet_name) const
+{
+ auto it = std::find_if(
+ mp_impl->sheets.begin(), mp_impl->sheets.end(), find_sheet_by_name(sheet_name));
+
+ if (it == mp_impl->sheets.end())
+ return nullptr;
+
+ return &(*it)->data;
+}
+
+sheet* document::get_sheet(sheet_t sheet_pos)
+{
+ const sheet* sh = const_cast<const document*>(this)->get_sheet(sheet_pos);
+ return const_cast<sheet*>(sh);
+}
+
+const sheet* document::get_sheet(sheet_t sheet_pos) const
+{
+ if (static_cast<size_t>(sheet_pos) >= mp_impl->sheets.size())
+ return nullptr;
+
+ return &mp_impl->sheets[sheet_pos]->data;
+}
+
+void document::recalc_formula_cells()
+{
+ ixion::abs_range_set_t empty;
+
+ ixion::model_context& cxt = get_model_context();
+ std::vector<ixion::abs_range_t> sorted = ixion::query_and_sort_dirty_cells(
+ cxt, empty, &mp_impl->dirty_cells);
+ ixion::calculate_sorted_cells(cxt, sorted, 0);
+}
+
+void document::clear()
+{
+ mp_impl = std::make_unique<detail::document_impl>(*this, get_sheet_size());
+}
+
+void document::dump(dump_format_t format, const std::string& output) const
+{
+ if (format == dump_format_t::none)
+ return;
+
+ if (format == dump_format_t::check)
+ {
+ // For this output, we write to a single file.
+ std::ostream* ostrm = &std::cout;
+ std::unique_ptr<std::ofstream> fs;
+
+ if (!output.empty())
+ {
+ if (fs::is_directory(output))
+ {
+ std::ostringstream os;
+ os << "Output file path points to an existing directory.";
+ throw std::invalid_argument(os.str());
+ }
+
+ // Output to stdout when output path is not given.
+ fs = std::make_unique<std::ofstream>(output.data());
+ ostrm = fs.get();
+ }
+
+ dump_check(*ostrm);
+ return;
+ }
+
+ if (output.empty())
+ throw std::invalid_argument("No output directory.");
+
+ if (fs::exists(output))
+ {
+ if (!fs::is_directory(output))
+ {
+ std::ostringstream os;
+ os << "A file named '" << output << "' already exists, and is not a directory.";
+ throw std::invalid_argument(os.str());
+ }
+ }
+ else
+ fs::create_directory(output);
+
+ switch (format)
+ {
+ case dump_format_t::csv:
+ dump_csv(output);
+ break;
+ case dump_format_t::flat:
+ dump_flat(output);
+ break;
+ case dump_format_t::html:
+ dump_html(output);
+ break;
+ case dump_format_t::json:
+ dump_json(output);
+ break;
+ case dump_format_t::debug_state:
+ dump_debug_state(output);
+ break;
+ // coverity[dead_error_line] - following conditions exist to avoid compiler warning
+ case dump_format_t::none:
+ case dump_format_t::unknown:
+ break;
+ default:
+ ;
+ }
+}
+
+void document::dump_check(ostream& os) const
+{
+ for (const std::unique_ptr<detail::sheet_item>& sheet : mp_impl->sheets)
+ sheet->data.dump_check(os, sheet->name);
+}
+
+void document::dump_flat(const string& outdir) const
+{
+ cout << "----------------------------------------------------------------------" << endl;
+ cout << " Document content summary" << endl;
+ cout << "----------------------------------------------------------------------" << endl;
+ mp_impl->ss_store.dump(cout);
+
+ cout << "number of sheets: " << mp_impl->sheets.size() << endl;
+
+ for (const std::unique_ptr<detail::sheet_item>& sheet : mp_impl->sheets)
+ {
+ fs::path outpath{outdir};
+ outpath /= std::string{sheet->name};
+ outpath.replace_extension(".txt");
+
+ std::ofstream file(outpath.native());
+ if (!file)
+ {
+ cerr << "failed to create file: " << outpath << endl;
+ return;
+ }
+
+ file << "---" << endl;
+ file << "Sheet name: " << sheet->name << endl;
+ sheet->data.dump_flat(file);
+ }
+}
+
+void document::dump_html(const string& outdir) const
+{
+ for (const std::unique_ptr<detail::sheet_item>& sheet : mp_impl->sheets)
+ {
+ fs::path outpath{outdir};
+ outpath /= std::string{sheet->name};
+ outpath.replace_extension(".html");
+
+ std::ofstream file(outpath.native());
+ if (!file)
+ {
+ cerr << "failed to create file: " << outpath << endl;
+ return;
+ }
+
+ sheet->data.dump_html(file);
+ }
+}
+
+void document::dump_json(const string& outdir) const
+{
+ for (const std::unique_ptr<detail::sheet_item>& sheet : mp_impl->sheets)
+ {
+ fs::path outpath{outdir};
+ outpath /= std::string{sheet->name};
+ outpath.replace_extension(".json");
+
+ std::ofstream file(outpath.native());
+ if (!file)
+ {
+ cerr << "failed to create file: " << outpath << endl;
+ return;
+ }
+
+ sheet->data.dump_json(file);
+ }
+}
+
+void document::dump_csv(const std::string& outdir) const
+{
+ for (const std::unique_ptr<detail::sheet_item>& sheet : mp_impl->sheets)
+ {
+ fs::path outpath{outdir};
+ outpath /= std::string{sheet->name};
+ outpath.replace_extension(".csv");
+
+ ofstream file(outpath.c_str());
+ if (!file)
+ {
+ cerr << "failed to create file: " << outpath << endl;
+ return;
+ }
+
+ sheet->data.dump_csv(file);
+ }
+}
+
+void document::dump_debug_state(const std::string& outdir) const
+{
+ detail::doc_debug_state_dumper dumper{*mp_impl};
+ fs::path output_dir{outdir};
+ dumper.dump(output_dir);
+
+ for (const std::unique_ptr<detail::sheet_item>& sheet : mp_impl->sheets)
+ {
+ fs::path outpath = output_dir;
+ outpath /= std::string{sheet->name};
+ fs::create_directories(outpath);
+ sheet->data.dump_debug_state(outpath.string(), sheet->name);
+ }
+}
+
+sheet_t document::get_sheet_index(std::string_view name) const
+{
+ auto it = std::find_if(
+ mp_impl->sheets.begin(), mp_impl->sheets.end(), find_sheet_by_name(name));
+
+ if (it == mp_impl->sheets.end())
+ return ixion::invalid_sheet;
+
+ auto it_beg = mp_impl->sheets.begin();
+ size_t pos = std::distance(it_beg, it);
+ return static_cast<sheet_t>(pos);
+}
+
+std::string_view document::get_sheet_name(sheet_t sheet_pos) const
+{
+ if (sheet_pos < 0)
+ return std::string_view{};
+
+ size_t pos = static_cast<size_t>(sheet_pos);
+ if (pos >= mp_impl->sheets.size())
+ return std::string_view{};
+
+ return mp_impl->sheets[pos]->name;
+}
+
+void document::set_sheet_name(sheet_t sheet_pos, std::string name)
+{
+ assert(mp_impl->sheets.size() == mp_impl->context.get_sheet_count());
+
+ std::string_view name_interned = mp_impl->string_pool_store.intern(name).first;
+ mp_impl->context.set_sheet_name(sheet_pos, std::move(name)); // will throw on invalid name or position
+ mp_impl->sheets[sheet_pos]->name = name_interned;
+}
+
+range_size_t document::get_sheet_size() const
+{
+ ixion::rc_size_t ss = mp_impl->context.get_sheet_size();
+ range_size_t ret;
+ ret.rows = ss.row;
+ ret.columns = ss.column;
+ return ret;
+}
+
+void document::set_sheet_size(const range_size_t& sheet_size)
+{
+ mp_impl->context.set_sheet_size({sheet_size.rows, sheet_size.columns});
+}
+
+size_t document::get_sheet_count() const
+{
+ return mp_impl->sheets.size();
+}
+
+void document::set_origin_date(int year, int month, int day)
+{
+ mp_impl->origin_date.year = year;
+ mp_impl->origin_date.month = month;
+ mp_impl->origin_date.day = day;
+}
+
+date_time_t document::get_origin_date() const
+{
+ return mp_impl->origin_date;
+}
+
+void document::set_formula_grammar(formula_grammar_t grammar)
+{
+ if (mp_impl->grammar == grammar)
+ return;
+
+ mp_impl->grammar = grammar;
+
+ ixion::formula_name_resolver_t resolver_type_global = ixion::formula_name_resolver_t::unknown;
+ ixion::formula_name_resolver_t resolver_type_named_exp_base = ixion::formula_name_resolver_t::unknown;
+ ixion::formula_name_resolver_t resolver_type_named_range = ixion::formula_name_resolver_t::unknown;
+ char arg_sep = 0;
+
+ switch (mp_impl->grammar)
+ {
+ case formula_grammar_t::xls_xml:
+ resolver_type_global = ixion::formula_name_resolver_t::excel_r1c1;
+ arg_sep = ',';
+ break;
+ case formula_grammar_t::xlsx:
+ resolver_type_global = ixion::formula_name_resolver_t::excel_a1;
+ arg_sep = ',';
+ break;
+ case formula_grammar_t::ods:
+ resolver_type_global = ixion::formula_name_resolver_t::odff;
+ resolver_type_named_exp_base = ixion::formula_name_resolver_t::calc_a1;
+ resolver_type_named_range = ixion::formula_name_resolver_t::odf_cra;
+ arg_sep = ';';
+ break;
+ case formula_grammar_t::gnumeric:
+ // TODO : Use Excel A1 name resolver for now.
+ resolver_type_global = ixion::formula_name_resolver_t::excel_a1;
+ arg_sep = ',';
+ break;
+ default:
+ ;
+ }
+
+ mp_impl->name_resolver_global.reset();
+ mp_impl->name_resolver_named_exp_base.reset();
+
+ if (resolver_type_global != ixion::formula_name_resolver_t::unknown)
+ {
+ mp_impl->name_resolver_global =
+ ixion::formula_name_resolver::get(resolver_type_global, &mp_impl->context);
+
+ if (resolver_type_named_exp_base != ixion::formula_name_resolver_t::unknown)
+ {
+ mp_impl->name_resolver_named_exp_base =
+ ixion::formula_name_resolver::get(resolver_type_named_exp_base, &mp_impl->context);
+ }
+
+ if (resolver_type_named_range != ixion::formula_name_resolver_t::unknown)
+ {
+ mp_impl->name_resolver_named_range =
+ ixion::formula_name_resolver::get(resolver_type_named_range, &mp_impl->context);
+ }
+
+ ixion::config cfg = mp_impl->context.get_config();
+ cfg.sep_function_arg = arg_sep;
+ cfg.output_precision = mp_impl->doc_config.output_precision;
+ mp_impl->context.set_config(cfg);
+ }
+}
+
+formula_grammar_t document::get_formula_grammar() const
+{
+ return mp_impl->grammar;
+}
+
+const ixion::formula_name_resolver* document::get_formula_name_resolver(formula_ref_context_t cxt) const
+{
+ switch (cxt)
+ {
+ case formula_ref_context_t::global:
+ return mp_impl->name_resolver_global.get();
+ case formula_ref_context_t::named_expression_base:
+ if (mp_impl->name_resolver_named_exp_base)
+ return mp_impl->name_resolver_named_exp_base.get();
+ break;
+ case formula_ref_context_t::named_range:
+ if (mp_impl->name_resolver_named_range)
+ return mp_impl->name_resolver_named_range.get();
+ break;
+ default:
+ ;
+ }
+
+ return mp_impl->name_resolver_global.get();
+}
+
+void document::insert_dirty_cell(const ixion::abs_address_t& pos)
+{
+ mp_impl->dirty_cells.insert(pos);
+}
+
+}}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/document_impl.cpp b/src/spreadsheet/document_impl.cpp
new file mode 100644
index 0000000..db6050a
--- /dev/null
+++ b/src/spreadsheet/document_impl.cpp
@@ -0,0 +1,232 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "document_impl.hpp"
+
+#include <algorithm>
+
+namespace orcus { namespace spreadsheet { namespace detail {
+
+namespace {
+
+class find_column_by_name
+{
+ std::string_view m_name;
+public:
+ find_column_by_name(std::string_view name) : m_name(name) {}
+
+ bool operator() (const table_column_t& col) const
+ {
+ return col.name == m_name;
+ }
+};
+
+void adjust_row_range(ixion::abs_range_t& range, const table_t& tab, ixion::table_areas_t areas)
+{
+ bool headers = (areas & ixion::table_area_headers);
+ bool data = (areas & ixion::table_area_data);
+ bool totals = (areas & ixion::table_area_totals);
+
+ if (headers)
+ {
+ if (data)
+ {
+ if (totals)
+ {
+ // All areas.
+ return;
+ }
+
+ // Headers + data
+ range.last.row -= tab.totals_row_count;
+ return;
+ }
+
+ if (totals)
+ {
+ // Header + total is invalid.
+ range = ixion::abs_range_t(ixion::abs_range_t::invalid);
+ return;
+ }
+
+ // Headers only.
+ range.last.row = range.first.row;
+ return;
+ }
+
+ if (data)
+ {
+ ++range.first.row;
+
+ if (totals)
+ {
+ // Data + total
+ return;
+ }
+
+ // Data only
+ range.last.row -= tab.totals_row_count;
+ return;
+ }
+
+ if (totals)
+ {
+ // Total only
+ if (!tab.totals_row_count)
+ {
+ // This table has not total rows. Return empty range.
+ range = ixion::abs_range_t();
+ return;
+ }
+
+ range.first.row = range.last.row - tab.totals_row_count - 1;
+ return;
+ }
+
+ // Empty range.
+ range = ixion::abs_range_t();
+}
+
+}
+
+sheet_item::sheet_item(document& doc, std::string_view _name, sheet_t sheet_index) :
+ name(_name), data(doc, sheet_index) {}
+
+
+const table_t* ixion_table_handler::find_table(const ixion::abs_address_t& pos) const
+{
+ auto it = m_tables.begin(), it_end = m_tables.end();
+ for (; it != it_end; ++it)
+ {
+ const table_t* p = it->second.get();
+ if (p->range.contains(pos))
+ return p;
+ }
+
+ return nullptr;
+}
+
+std::string_view ixion_table_handler::get_string(ixion::string_id_t sid) const
+{
+ if (sid == ixion::empty_string_id)
+ return std::string_view{};
+
+ const std::string* p = m_context.get_string(sid);
+ if (!p || p->empty())
+ return std::string_view{};
+
+ return std::string_view(p->data(), p->size());
+}
+
+col_t ixion_table_handler::find_column(const table_t& tab, std::string_view name, size_t offset) const
+{
+ if (offset >= tab.columns.size())
+ return -1;
+
+ table_t::columns_type::const_iterator it_beg = tab.columns.begin();
+ table_t::columns_type::const_iterator it_end = tab.columns.end();
+
+ std::advance(it_beg, offset);
+ table_t::columns_type::const_iterator it =
+ std::find_if(it_beg, it_end, find_column_by_name(name));
+
+ if (it == it_end)
+ // not found.
+ return -1;
+
+ size_t dist = std::distance(tab.columns.begin(), it);
+ return tab.range.first.column + dist;
+}
+
+ixion::abs_range_t ixion_table_handler::get_range_from_table(
+ const table_t& tab, ixion::string_id_t column_first, ixion::string_id_t column_last,
+ ixion::table_areas_t areas) const
+{
+ if (column_first != ixion::empty_string_id)
+ {
+ std::string_view col1_name = get_string(column_first);
+ if (col1_name.empty())
+ return ixion::abs_range_t(ixion::abs_range_t::invalid);
+
+ col_t col1_index = find_column(tab, col1_name, 0);
+ if (col1_index < 0)
+ return ixion::abs_range_t(ixion::abs_range_t::invalid);
+
+ if (column_last != ixion::empty_string_id)
+ {
+ std::string_view col2_name = get_string(column_last);
+ if (!col2_name.empty())
+ {
+ // column range table reference.
+ col_t col2_index = find_column(tab, col2_name, col1_index);
+ ixion::abs_range_t range = tab.range;
+ range.first.column = col1_index;
+ range.last.column = col2_index;
+ adjust_row_range(range, tab, areas);
+ return range;
+ }
+ }
+
+ // single column table reference.
+ ixion::abs_range_t range = tab.range;
+ range.first.column = range.last.column = col1_index;
+ adjust_row_range(range, tab, areas);
+ return range;
+ }
+
+ return ixion::abs_range_t();
+}
+
+ixion_table_handler::ixion_table_handler(const ixion::model_context& cxt, const table_store_type& tables) :
+ m_context(cxt), m_tables(tables) {}
+
+ixion::abs_range_t ixion_table_handler::get_range(
+ const ixion::abs_address_t& pos, ixion::string_id_t column_first, ixion::string_id_t column_last,
+ ixion::table_areas_t areas) const
+{
+ const table_t* tab = find_table(pos);
+ if (!tab)
+ return ixion::abs_range_t(ixion::abs_range_t::invalid);
+
+ return get_range_from_table(*tab, column_first, column_last, areas);
+
+}
+
+ixion::abs_range_t ixion_table_handler::get_range(
+ ixion::string_id_t table, ixion::string_id_t column_first, ixion::string_id_t column_last,
+ ixion::table_areas_t areas) const
+{
+ std::string_view tab_name = get_string(table);
+ if (tab_name.empty())
+ // no table name given.
+ return ixion::abs_range_t(ixion::abs_range_t::invalid);
+
+ auto it = m_tables.find(tab_name);
+ if (it == m_tables.end())
+ // no table by this name found.
+ return ixion::abs_range_t(ixion::abs_range_t::invalid);
+
+ const table_t* tab = it->second.get();
+ return get_range_from_table(*tab, column_first, column_last, areas);
+}
+
+document_impl::document_impl(document& _doc, const range_size_t& sheet_size) :
+ doc(_doc),
+ context({sheet_size.rows, sheet_size.columns}),
+ styles_store(),
+ ss_store(context),
+ pivots(doc),
+ name_resolver_global(ixion::formula_name_resolver::get(ixion::formula_name_resolver_t::excel_a1, &context)),
+ grammar(formula_grammar_t::xlsx),
+ table_handler(context, tables)
+{
+ context.set_table_handler(&table_handler);
+}
+
+}}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/document_impl.hpp b/src/spreadsheet/document_impl.hpp
new file mode 100644
index 0000000..44ee91f
--- /dev/null
+++ b/src/spreadsheet/document_impl.hpp
@@ -0,0 +1,104 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#pragma once
+
+#include <orcus/spreadsheet/auto_filter.hpp>
+#include <orcus/spreadsheet/config.hpp>
+#include <orcus/spreadsheet/document.hpp>
+#include <orcus/spreadsheet/pivot.hpp>
+#include <orcus/spreadsheet/shared_strings.hpp>
+#include <orcus/spreadsheet/sheet.hpp>
+#include <orcus/spreadsheet/styles.hpp>
+#include <orcus/string_pool.hpp>
+#include <orcus/types.hpp>
+
+#include <ixion/config.hpp>
+#include <ixion/formula.hpp>
+#include <ixion/formula_name_resolver.hpp>
+#include <ixion/formula_result.hpp>
+#include <ixion/interface/table_handler.hpp>
+#include <ixion/matrix.hpp>
+#include <ixion/model_context.hpp>
+
+namespace orcus { namespace spreadsheet { namespace detail {
+
+/**
+ * Single sheet entry which consists of a sheet name and a sheet data.
+ */
+struct sheet_item
+{
+ sheet_item(const sheet_item&) = delete;
+ sheet_item& operator=(const sheet_item&) = delete;
+
+ std::string_view name;
+ sheet data;
+ sheet_item(document& doc, std::string_view _name, sheet_t sheet_index);
+};
+
+typedef std::map<std::string_view, std::unique_ptr<table_t>> table_store_type;
+typedef std::vector<std::unique_ptr<sheet_item>> sheet_items_type;
+
+class ixion_table_handler : public ixion::iface::table_handler
+{
+ const ixion::model_context& m_context;
+ const table_store_type& m_tables;
+
+ const table_t* find_table(const ixion::abs_address_t& pos) const;
+
+ std::string_view get_string(ixion::string_id_t sid) const;
+
+ col_t find_column(const table_t& tab, std::string_view name, size_t offset) const;
+
+ ixion::abs_range_t get_range_from_table(
+ const table_t& tab, ixion::string_id_t column_first, ixion::string_id_t column_last,
+ ixion::table_areas_t areas) const;
+
+public:
+ ixion_table_handler(const ixion::model_context& cxt, const table_store_type& tables);
+
+ virtual ixion::abs_range_t get_range(
+ const ixion::abs_address_t& pos, ixion::string_id_t column_first, ixion::string_id_t column_last,
+ ixion::table_areas_t areas) const override;
+
+ virtual ixion::abs_range_t get_range(
+ ixion::string_id_t table, ixion::string_id_t column_first, ixion::string_id_t column_last,
+ ixion::table_areas_t areas) const override;
+};
+
+struct document_impl
+{
+ document_impl(const document_impl&) = delete;
+ document_impl& operator=(const document_impl&) = delete;
+
+ document& doc;
+
+ document_config doc_config;
+ string_pool string_pool_store;
+ ixion::model_context context;
+ date_time_t origin_date;
+ sheet_items_type sheets;
+ styles styles_store;
+ shared_strings ss_store;
+ ixion::abs_range_set_t dirty_cells;
+
+ pivot_collection pivots;
+
+ std::unique_ptr<ixion::formula_name_resolver> name_resolver_global;
+ std::unique_ptr<ixion::formula_name_resolver> name_resolver_named_exp_base;
+ std::unique_ptr<ixion::formula_name_resolver> name_resolver_named_range;
+ formula_grammar_t grammar;
+
+ table_store_type tables;
+ ixion_table_handler table_handler;
+
+ document_impl(document& _doc, const range_size_t& sheet_size);
+};
+
+}}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/document_types.cpp b/src/spreadsheet/document_types.cpp
new file mode 100644
index 0000000..88e0724
--- /dev/null
+++ b/src/spreadsheet/document_types.cpp
@@ -0,0 +1,77 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/spreadsheet/document_types.hpp>
+
+namespace orcus { namespace spreadsheet {
+
+color_t::color_t() :
+ alpha(0), red(0), green(0), blue(0)
+{
+}
+
+color_t::color_t(color_elem_t _red, color_elem_t _green, color_elem_t _blue) :
+ alpha(255), red(_red), green(_green), blue(_blue)
+{
+}
+
+color_t::color_t(color_elem_t _alpha, color_elem_t _red, color_elem_t _green, color_elem_t _blue) :
+ alpha(_alpha), red(_red), green(_green), blue(_blue)
+{
+}
+
+void color_t::reset()
+{
+ *this = color_t();
+}
+
+bool color_t::operator==(const color_t& other) const
+{
+ return alpha == other.alpha && red == other.red && green == other.green && blue == other.blue;
+}
+
+bool color_t::operator!=(const color_t& other) const
+{
+ return !operator==(other);
+}
+
+format_run::format_run() :
+ pos(0), size(0),
+ font_size(0),
+ bold(false), italic(false) {}
+
+void format_run::reset()
+{
+ pos = 0;
+ size = 0;
+ font = std::string_view{};
+ font_size = 0;
+ bold = false;
+ italic = false;
+ color = color_t();
+}
+
+bool format_run::formatted() const
+{
+ if (bold || italic)
+ return true;
+
+ if (font_size)
+ return true;
+
+ if (!font.empty())
+ return true;
+
+ if (color.alpha || color.red || color.green || color.blue)
+ return true;
+
+ return false;
+}
+
+}} // namespace orcus::spreadsheet
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/dumper_global.cpp b/src/spreadsheet/dumper_global.cpp
new file mode 100644
index 0000000..f500f3c
--- /dev/null
+++ b/src/spreadsheet/dumper_global.cpp
@@ -0,0 +1,87 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "dumper_global.hpp"
+#include "number_format.hpp"
+
+#include <ixion/formula_name_resolver.hpp>
+#include <ixion/formula_result.hpp>
+#include <ixion/cell.hpp>
+
+namespace orcus { namespace spreadsheet { namespace detail {
+
+void dump_cell_value(
+ std::ostream& os, const ixion::model_context& cxt, const ixion::model_iterator::cell& cell,
+ func_str_handler str_handler,
+ func_empty_handler empty_handler)
+{
+ switch (cell.type)
+ {
+ case ixion::celltype_t::empty:
+ empty_handler(os);
+ break;
+ case ixion::celltype_t::boolean:
+ {
+ os << (std::get<bool>(cell.value) ? "true" : "false");
+ break;
+ }
+ case ixion::celltype_t::numeric:
+ {
+ format_to_file_output(os, std::get<double>(cell.value));
+ break;
+ }
+ case ixion::celltype_t::string:
+ {
+ const std::string* p = cxt.get_string(std::get<ixion::string_id_t>(cell.value));
+ assert(p);
+ str_handler(os, *p);
+ break;
+ }
+ case ixion::celltype_t::formula:
+ {
+ const ixion::formula_cell* fc = std::get<const ixion::formula_cell*>(cell.value);
+ assert(fc);
+ ixion::formula_result res;
+
+ try
+ {
+ res = fc->get_result_cache(
+ ixion::formula_result_wait_policy_t::throw_exception);
+ }
+ catch (const std::exception&)
+ {
+ os << "\"#RES!\"";
+ break;
+ }
+
+ switch (res.get_type())
+ {
+ case ixion::formula_result::result_type::value:
+ format_to_file_output(os, res.get_value());
+ break;
+ case ixion::formula_result::result_type::string:
+ {
+ const std::string& s = res.get_string();
+ str_handler(os, s);
+ }
+ break;
+ case ixion::formula_result::result_type::error:
+ os << "\"#ERR!\"";
+ break;
+ default:
+ ;
+ }
+ break;
+ }
+ default:
+ ;
+ }
+}
+
+}}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/dumper_global.hpp b/src/spreadsheet/dumper_global.hpp
new file mode 100644
index 0000000..96c5afc
--- /dev/null
+++ b/src/spreadsheet/dumper_global.hpp
@@ -0,0 +1,31 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_SPREADSHEET_DUMPER_GLOBAL_HPP
+#define INCLUDED_ORCUS_SPREADSHEET_DUMPER_GLOBAL_HPP
+
+#include <ixion/model_context.hpp>
+#include <ixion/model_iterator.hpp>
+
+#include <ostream>
+#include <functional>
+
+namespace orcus { namespace spreadsheet { namespace detail {
+
+using func_str_handler = std::function<void(std::ostream&, const std::string&)>;
+using func_empty_handler = std::function<void(std::ostream&)>;
+
+void dump_cell_value(
+ std::ostream& os, const ixion::model_context& cxt, const ixion::model_iterator::cell& cell,
+ func_str_handler str_handler,
+ func_empty_handler empty_handler);
+
+}}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/factory.cpp b/src/spreadsheet/factory.cpp
new file mode 100644
index 0000000..9cd7884
--- /dev/null
+++ b/src/spreadsheet/factory.cpp
@@ -0,0 +1,410 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/spreadsheet/factory.hpp"
+
+#include <orcus/spreadsheet/shared_strings.hpp>
+#include <orcus/spreadsheet/styles.hpp>
+#include <orcus/spreadsheet/sheet.hpp>
+#include <orcus/spreadsheet/document.hpp>
+#include <orcus/spreadsheet/view.hpp>
+#include <orcus/exception.hpp>
+#include <orcus/string_pool.hpp>
+
+#include "factory_pivot.hpp"
+#include "factory_shared_strings.hpp"
+#include "factory_sheet.hpp"
+#include "global_settings.hpp"
+
+#include <ixion/formula_name_resolver.hpp>
+#include <ixion/formula_tokens.hpp>
+#include <ixion/formula.hpp>
+#include <ixion/model_context.hpp>
+#include <sstream>
+#include <iostream>
+#include <unordered_map>
+
+namespace orcus { namespace spreadsheet {
+
+namespace {
+
+class import_ref_resolver : public iface::import_reference_resolver
+{
+ document& m_doc;
+ const ixion::formula_name_resolver* m_resolver;
+
+public:
+ import_ref_resolver(document& doc) : m_doc(doc), m_resolver(nullptr) {}
+
+ void set_formula_ref_context(formula_ref_context_t cxt)
+ {
+ m_resolver = m_doc.get_formula_name_resolver(cxt);
+ }
+
+ virtual src_address_t resolve_address(std::string_view address) override
+ {
+ if (!m_resolver)
+ throw std::runtime_error("import_ref_resolver::resolve_address: formula resolver is null!");
+
+ ixion::formula_name_t name = m_resolver->resolve(address, ixion::abs_address_t());
+
+ if (name.type != ixion::formula_name_t::cell_reference)
+ {
+ std::ostringstream os;
+ os << address << " is not a valid cell address.";
+ throw orcus::invalid_arg_error(os.str());
+ }
+
+ auto addr = std::get<ixion::address_t>(name.value);
+ src_address_t ret;
+ ret.sheet = addr.sheet;
+ ret.column = addr.column;
+ ret.row = addr.row;
+ return ret;
+ }
+
+ virtual src_range_t resolve_range(std::string_view range) override
+ {
+ if (!m_resolver)
+ throw std::runtime_error("import_ref_resolver::resolve_range: formula resolver is null!");
+
+ ixion::formula_name_t name = m_resolver->resolve(range, ixion::abs_address_t());
+
+ switch (name.type)
+ {
+ case ixion::formula_name_t::range_reference:
+ {
+ auto v = std::get<ixion::range_t>(name.value);
+ src_range_t ret;
+ ret.first.sheet = v.first.sheet;
+ ret.first.column = v.first.column;
+ ret.first.row = v.first.row;
+ ret.last.sheet = v.last.sheet;
+ ret.last.column = v.last.column;
+ ret.last.row = v.last.row;
+ return ret;
+ }
+ case ixion::formula_name_t::cell_reference:
+ {
+ // Single cell address is still considered a valid "range".
+ auto addr = std::get<ixion::address_t>(name.value);
+ src_address_t cell;
+ cell.sheet = addr.sheet;
+ cell.column = addr.column;
+ cell.row = addr.row;
+
+ src_range_t ret;
+ ret.first = cell;
+ ret.last = cell;
+ return ret;
+ }
+ default:
+ ;
+ }
+
+ std::ostringstream os;
+ os << "'" << range << "' is not a valid range address.";
+ throw orcus::invalid_arg_error(os.str());
+ }
+};
+
+class import_global_named_exp : public iface::import_named_expression
+{
+ document& m_doc;
+ std::string_view m_name;
+ ixion::abs_address_t m_base;
+ ixion::formula_tokens_t m_tokens;
+
+ void define(std::string_view name, std::string_view expression, formula_ref_context_t ref_cxt)
+ {
+ string_pool& sp = m_doc.get_string_pool();
+ m_name = sp.intern(name).first;
+
+ const ixion::formula_name_resolver* resolver = m_doc.get_formula_name_resolver(ref_cxt);
+ assert(resolver);
+
+ ixion::model_context& cxt = m_doc.get_model_context();
+ m_tokens = ixion::parse_formula_string(cxt, m_base, *resolver, expression);
+ }
+public:
+ import_global_named_exp(document& doc) : m_doc(doc), m_base(0, 0, 0) {}
+ virtual ~import_global_named_exp() override {}
+
+ virtual void set_base_position(const src_address_t& pos) override
+ {
+ m_base.sheet = pos.sheet;
+ m_base.row = pos.row;
+ m_base.column = pos.column;
+ }
+
+ virtual void set_named_expression(std::string_view name, std::string_view expression) override
+ {
+ define(name, expression, formula_ref_context_t::global);
+ }
+
+ virtual void set_named_range(std::string_view name, std::string_view range) override
+ {
+ define(name, range, formula_ref_context_t::named_range);
+ }
+
+ virtual void commit() override
+ {
+ ixion::model_context& cxt = m_doc.get_model_context();
+ cxt.set_named_expression(std::string{m_name}, m_base, std::move(m_tokens));
+
+ m_name = std::string_view{};
+ m_base.sheet = 0;
+ m_base.row = 0;
+ m_base.column = 0;
+ }
+};
+
+using sheet_ifaces_type = std::vector<std::unique_ptr<import_sheet>>;
+
+} // anonymous namespace
+
+import_factory_config::import_factory_config() = default;
+import_factory_config::import_factory_config(const import_factory_config& other) = default;
+import_factory_config::~import_factory_config() = default;
+
+import_factory_config& import_factory_config::operator=(const import_factory_config& other) = default;
+
+struct import_factory::impl
+{
+ std::shared_ptr<import_factory_config> m_config;
+ import_factory& m_envelope;
+ document& m_doc;
+ view* m_view;
+ character_set_t m_charset;
+
+ import_global_settings m_global_settings;
+ import_pivot_cache_def m_pc_def;
+ import_pivot_cache_records m_pc_records;
+ import_ref_resolver m_ref_resolver;
+ import_global_named_exp m_global_named_exp;
+ import_styles m_styles;
+ detail::import_shared_strings shared_strings;
+
+ sheet_ifaces_type m_sheets;
+
+ bool m_recalc_formula_cells;
+ formula_error_policy_t m_error_policy;
+
+ impl(import_factory& envelope, document& doc) :
+ m_config(std::make_shared<import_factory_config>()),
+ m_envelope(envelope),
+ m_doc(doc),
+ m_view(nullptr),
+ m_charset(character_set_t::unspecified),
+ m_global_settings(envelope, doc),
+ m_pc_def(doc),
+ m_pc_records(doc),
+ m_ref_resolver(doc),
+ m_global_named_exp(doc),
+ m_styles(m_config, doc.get_styles(), doc.get_string_pool()),
+ shared_strings(doc.get_string_pool(), doc.get_model_context(), doc.get_styles(), doc.get_shared_strings()),
+ m_recalc_formula_cells(false),
+ m_error_policy(formula_error_policy_t::fail)
+ {
+ }
+};
+
+import_factory::import_factory(document& doc) :
+ mp_impl(std::make_unique<impl>(*this, doc)) {}
+
+import_factory::import_factory(document& doc, view& view_store) :
+ mp_impl(std::make_unique<impl>(*this, doc))
+{
+ // Store the optional view store.
+ mp_impl->m_view = &view_store;
+}
+
+import_factory::~import_factory() {}
+
+iface::import_global_settings* import_factory::get_global_settings()
+{
+ return &mp_impl->m_global_settings;
+}
+
+iface::import_shared_strings* import_factory::get_shared_strings()
+{
+ return &mp_impl->shared_strings;
+}
+
+iface::import_styles* import_factory::get_styles()
+{
+ return &mp_impl->m_styles;
+}
+
+iface::import_named_expression* import_factory::get_named_expression()
+{
+ return &mp_impl->m_global_named_exp;
+}
+
+iface::import_reference_resolver* import_factory::get_reference_resolver(formula_ref_context_t cxt)
+{
+ mp_impl->m_ref_resolver.set_formula_ref_context(cxt);
+ return &mp_impl->m_ref_resolver;
+}
+
+iface::import_pivot_cache_definition* import_factory::create_pivot_cache_definition(
+ pivot_cache_id_t cache_id)
+{
+ mp_impl->m_pc_def.create_cache(cache_id);
+ return &mp_impl->m_pc_def;
+}
+
+iface::import_pivot_cache_records* import_factory::create_pivot_cache_records(
+ orcus::spreadsheet::pivot_cache_id_t cache_id)
+{
+ pivot_collection& pcs = mp_impl->m_doc.get_pivot_collection();
+ pivot_cache* pc = pcs.get_cache(cache_id);
+ if (!pc)
+ return nullptr;
+
+ mp_impl->m_pc_records.set_cache(pc);
+ return &mp_impl->m_pc_records;
+}
+
+iface::import_sheet* import_factory::append_sheet(sheet_t sheet_index, std::string_view name)
+{
+ assert(sheet_index == static_cast<sheet_t>(mp_impl->m_doc.get_sheet_count()));
+
+ sheet* sh = mp_impl->m_doc.append_sheet(name);
+
+ if (!sh)
+ return nullptr;
+
+ sheet_view* sv = nullptr;
+ if (mp_impl->m_view)
+ sv = mp_impl->m_view->get_or_create_sheet_view(sheet_index);
+
+ mp_impl->m_sheets.push_back(
+ std::make_unique<import_sheet>(mp_impl->m_doc, *sh, sv));
+
+ import_sheet* p = mp_impl->m_sheets.back().get();
+ p->set_character_set(mp_impl->m_charset);
+ p->set_fill_missing_formula_results(!mp_impl->m_recalc_formula_cells);
+ p->set_formula_error_policy(mp_impl->m_error_policy);
+ return p;
+}
+
+iface::import_sheet* import_factory::get_sheet(std::string_view name)
+{
+ sheet_t si = mp_impl->m_doc.get_sheet_index(name);
+ if (si == ixion::invalid_sheet)
+ return nullptr;
+
+ return mp_impl->m_sheets.at(si).get();
+}
+
+iface::import_sheet* import_factory::get_sheet(sheet_t sheet_index)
+{
+ if (sheet_index < 0 || size_t(sheet_index) >= mp_impl->m_sheets.size())
+ return nullptr;
+
+ return mp_impl->m_sheets[sheet_index].get();
+}
+
+void import_factory::finalize()
+{
+ mp_impl->m_doc.finalize_import();
+
+ if (mp_impl->m_recalc_formula_cells)
+ mp_impl->m_doc.recalc_formula_cells();
+}
+
+void import_factory::set_config(const import_factory_config& config)
+{
+ // NB: update the object state.
+ *mp_impl->m_config = config;
+}
+
+void import_factory::set_default_row_size(row_t row_size)
+{
+ range_size_t ss = mp_impl->m_doc.get_sheet_size();
+ ss.rows = row_size;
+ mp_impl->m_doc.set_sheet_size(ss);
+}
+
+void import_factory::set_default_column_size(col_t col_size)
+{
+ range_size_t ss = mp_impl->m_doc.get_sheet_size();
+ ss.columns = col_size;
+ mp_impl->m_doc.set_sheet_size(ss);
+}
+
+void import_factory::set_character_set(character_set_t charset)
+{
+ mp_impl->m_charset = charset;
+
+ for (std::unique_ptr<import_sheet>& sheet : mp_impl->m_sheets)
+ sheet->set_character_set(charset);
+}
+
+character_set_t import_factory::get_character_set() const
+{
+ return mp_impl->m_charset;
+}
+
+void import_factory::set_recalc_formula_cells(bool b)
+{
+ mp_impl->m_recalc_formula_cells = b;
+}
+
+void import_factory::set_formula_error_policy(formula_error_policy_t policy)
+{
+ mp_impl->m_error_policy = policy;
+}
+
+struct export_factory::impl
+{
+ const document& m_doc;
+
+ std::vector<std::unique_ptr<export_sheet>> m_sheets;
+ std::unordered_map<std::string_view, sheet_t> m_sheet_index_map;
+
+ impl(const document& doc) : m_doc(doc) {}
+
+ export_sheet* get_sheet(std::string_view name)
+ {
+ auto it = m_sheet_index_map.find(name);
+ if (it != m_sheet_index_map.end())
+ {
+ // Instance for this sheet already exists.
+ sheet_t sheet_pos = it->second;
+ assert(size_t(sheet_pos) < m_sheets.size());
+ return m_sheets[sheet_pos].get();
+ }
+
+ const sheet* sh = m_doc.get_sheet(name);
+ if (!sh)
+ return nullptr;
+
+ sheet_t sheet_pos = m_sheets.size();
+ m_sheets.emplace_back(std::make_unique<export_sheet>(m_doc, *sh));
+
+ m_sheet_index_map.insert(
+ std::make_pair(name, sheet_pos));
+
+ return m_sheets[sheet_pos].get();
+ }
+};
+
+export_factory::export_factory(const document& doc) :
+ mp_impl(std::make_unique<impl>(doc)) {}
+
+export_factory::~export_factory() {}
+
+const iface::export_sheet* export_factory::get_sheet(std::string_view sheet_name) const
+{
+ return mp_impl->get_sheet(sheet_name);
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/factory_pivot.cpp b/src/spreadsheet/factory_pivot.cpp
new file mode 100644
index 0000000..2761da5
--- /dev/null
+++ b/src/spreadsheet/factory_pivot.cpp
@@ -0,0 +1,303 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "factory_pivot.hpp"
+
+#include "orcus/string_pool.hpp"
+#include "orcus/exception.hpp"
+
+#include <sstream>
+#include <iostream>
+#include <cassert>
+
+namespace orcus { namespace spreadsheet {
+
+class import_pc_field_group : public iface::import_pivot_cache_field_group
+{
+ using range_grouping_type = pivot_cache_group_data_t::range_grouping_type;
+
+ document& m_doc;
+ pivot_cache_field_t& m_parent_field;
+ std::unique_ptr<pivot_cache_group_data_t> m_data;
+ pivot_cache_item_t m_current_field_item;
+
+private:
+ std::string_view intern(std::string_view s)
+ {
+ return m_doc.get_string_pool().intern(s).first;
+ }
+
+ range_grouping_type& get_range_grouping()
+ {
+ if (!m_data->range_grouping)
+ m_data->range_grouping = range_grouping_type();
+
+ return *m_data->range_grouping;
+ }
+
+public:
+ import_pc_field_group(document& doc, pivot_cache_field_t& parent, size_t base_index) :
+ m_doc(doc),
+ m_parent_field(parent),
+ m_data(std::make_unique<pivot_cache_group_data_t>(base_index)) {}
+
+ ~import_pc_field_group() override {}
+
+ void link_base_to_group_items(size_t group_item_index) override
+ {
+ pivot_cache_indices_t& b2g = m_data->base_to_group_indices;
+ b2g.push_back(group_item_index);
+ }
+
+ void set_field_item_string(std::string_view value) override
+ {
+ m_current_field_item.type = pivot_cache_item_t::item_type::character;
+ m_current_field_item.value = intern(value);
+ }
+
+ void set_field_item_numeric(double v) override
+ {
+ m_current_field_item.type = pivot_cache_item_t::item_type::numeric;
+ m_current_field_item.value = v;
+ }
+
+ void commit_field_item() override
+ {
+ m_data->items.push_back(std::move(m_current_field_item));
+ }
+
+ void set_range_grouping_type(pivot_cache_group_by_t group_by) override
+ {
+ get_range_grouping().group_by = group_by;
+ }
+
+ void set_range_auto_start(bool b) override
+ {
+ get_range_grouping().auto_start = b;
+ }
+
+ void set_range_auto_end(bool b) override
+ {
+ get_range_grouping().auto_end = b;
+ }
+
+ void set_range_start_number(double v) override
+ {
+ get_range_grouping().start = v;
+ }
+
+ void set_range_end_number(double v) override
+ {
+ get_range_grouping().end = v;
+ }
+
+ void set_range_start_date(const date_time_t& dt) override
+ {
+ get_range_grouping().start_date = dt;
+ }
+
+ void set_range_end_date(const date_time_t& dt) override
+ {
+ get_range_grouping().end_date = dt;
+ }
+
+ void set_range_interval(double v) override
+ {
+ get_range_grouping().interval = v;
+ }
+
+ void commit() override
+ {
+ m_parent_field.group_data = std::move(m_data);
+ }
+};
+
+std::string_view import_pivot_cache_def::intern(std::string_view s)
+{
+ return m_doc.get_string_pool().intern(s).first;
+}
+
+import_pivot_cache_def::import_pivot_cache_def(document& doc) : m_doc(doc) {}
+
+import_pivot_cache_def::~import_pivot_cache_def() {}
+
+void import_pivot_cache_def::create_cache(pivot_cache_id_t cache_id)
+{
+ m_src_type = unknown;
+ m_cache = std::make_unique<pivot_cache>(cache_id, m_doc.get_string_pool());
+}
+
+void import_pivot_cache_def::set_worksheet_source(std::string_view ref, std::string_view sheet_name)
+{
+ assert(m_cache);
+
+ const ixion::formula_name_resolver* resolver =
+ m_doc.get_formula_name_resolver(spreadsheet::formula_ref_context_t::global);
+ assert(resolver);
+
+ m_src_type = worksheet;
+ m_src_sheet_name = intern(sheet_name);
+
+ ixion::formula_name_t fn = resolver->resolve(ref, ixion::abs_address_t(0,0,0));
+
+ if (fn.type != ixion::formula_name_t::range_reference)
+ {
+ std::ostringstream os;
+ os << "'" << ref << "' is not a valid range.";
+ throw xml_structure_error(os.str());
+ }
+
+ m_src_range = std::get<ixion::range_t>(fn.value).to_abs(ixion::abs_address_t(0,0,0));
+}
+
+void import_pivot_cache_def::set_worksheet_source(std::string_view table_name)
+{
+ assert(m_cache);
+
+ m_src_table_name = intern(table_name);
+}
+
+void import_pivot_cache_def::set_field_count(size_t n)
+{
+ m_current_fields.reserve(n);
+}
+
+void import_pivot_cache_def::set_field_name(std::string_view name)
+{
+ m_current_field.name = intern(name);
+}
+
+iface::import_pivot_cache_field_group* import_pivot_cache_def::start_field_group(size_t base_index)
+{
+ m_current_field_group =
+ std::make_unique<import_pc_field_group>(m_doc, m_current_field, base_index);
+
+ return m_current_field_group.get();
+}
+
+void import_pivot_cache_def::set_field_min_value(double v)
+{
+ m_current_field.min_value = v;
+}
+
+void import_pivot_cache_def::set_field_max_value(double v)
+{
+ m_current_field.max_value = v;
+}
+
+void import_pivot_cache_def::set_field_min_date(const date_time_t& dt)
+{
+ m_current_field.min_date = dt;
+}
+
+void import_pivot_cache_def::set_field_max_date(const date_time_t& dt)
+{
+ m_current_field.max_date = dt;
+}
+
+void import_pivot_cache_def::commit_field()
+{
+ m_current_fields.push_back(std::move(m_current_field));
+}
+
+void import_pivot_cache_def::set_field_item_string(std::string_view value)
+{
+ m_current_field_item.type = pivot_cache_item_t::item_type::character;
+ m_current_field_item.value = intern(value);
+}
+
+void import_pivot_cache_def::set_field_item_numeric(double v)
+{
+ m_current_field_item.type = pivot_cache_item_t::item_type::numeric;
+ m_current_field_item.value = v;
+}
+
+void import_pivot_cache_def::set_field_item_date_time(const date_time_t& dt)
+{
+ m_current_field_item.type = pivot_cache_item_t::item_type::date_time;
+ m_current_field_item.value = dt;
+}
+
+void import_pivot_cache_def::set_field_item_error(error_value_t ev)
+{
+ m_current_field_item.type = pivot_cache_item_t::item_type::error;
+ m_current_field_item.value = ev;
+}
+
+void import_pivot_cache_def::commit_field_item()
+{
+ m_current_field.items.push_back(std::move(m_current_field_item));
+}
+
+void import_pivot_cache_def::commit()
+{
+ m_cache->insert_fields(std::move(m_current_fields));
+ assert(m_current_fields.empty());
+
+ if (!m_src_table_name.empty())
+ {
+ m_doc.get_pivot_collection().insert_worksheet_cache(
+ m_src_table_name, std::move(m_cache));
+ return;
+ }
+
+ m_doc.get_pivot_collection().insert_worksheet_cache(
+ m_src_sheet_name, m_src_range, std::move(m_cache));
+}
+
+import_pivot_cache_records::import_pivot_cache_records(document& doc) :
+ m_doc(doc), m_cache(nullptr) {}
+
+import_pivot_cache_records::~import_pivot_cache_records() {}
+
+void import_pivot_cache_records::set_cache(pivot_cache* p)
+{
+ m_cache = p;
+}
+
+void import_pivot_cache_records::set_record_count(size_t n)
+{
+ m_records.reserve(n);
+}
+
+void import_pivot_cache_records::append_record_value_numeric(double v)
+{
+ m_current_record.emplace_back(v);
+}
+
+void import_pivot_cache_records::append_record_value_character(std::string_view s)
+{
+ m_current_record.emplace_back(s);
+}
+
+void import_pivot_cache_records::append_record_value_shared_item(size_t index)
+{
+ m_current_record.emplace_back(index);
+}
+
+void import_pivot_cache_records::commit_record()
+{
+ if (!m_cache)
+ {
+ m_current_record.clear();
+ return;
+ }
+
+ m_records.push_back(std::move(m_current_record));
+}
+
+void import_pivot_cache_records::commit()
+{
+ if (!m_cache)
+ return;
+
+ m_cache->insert_records(std::move(m_records));
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/factory_pivot.hpp b/src/spreadsheet/factory_pivot.hpp
new file mode 100644
index 0000000..465fef1
--- /dev/null
+++ b/src/spreadsheet/factory_pivot.hpp
@@ -0,0 +1,120 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_SPREADSHEET_FACTORY_PIVOT_HPP
+#define INCLUDED_ORCUS_SPREADSHEET_FACTORY_PIVOT_HPP
+
+#include "orcus/spreadsheet/pivot.hpp"
+#include "orcus/spreadsheet/document.hpp"
+#include "orcus/spreadsheet/import_interface_pivot.hpp"
+
+#include <ixion/formula_name_resolver.hpp>
+
+namespace orcus { namespace spreadsheet {
+
+class import_pc_field_group;
+
+/**
+ * Concrete implementation of the import_pivot_cache_definition interface.
+ */
+class import_pivot_cache_def : public iface::import_pivot_cache_definition
+{
+ enum source_type { unknown = 0, worksheet, external, consolidation, scenario };
+
+ document& m_doc;
+
+ pivot_cache_id_t m_cache_id = 0;
+
+ source_type m_src_type = unknown;
+ std::string_view m_src_sheet_name;
+ ixion::abs_range_t m_src_range;
+ std::string_view m_src_table_name;
+
+ std::unique_ptr<pivot_cache> m_cache;
+ pivot_cache::fields_type m_current_fields;
+ pivot_cache_field_t m_current_field;
+ pivot_cache_item_t m_current_field_item;
+
+ std::unique_ptr<import_pc_field_group> m_current_field_group;
+
+private:
+ std::string_view intern(std::string_view s);
+
+public:
+ import_pivot_cache_def(document& doc);
+ ~import_pivot_cache_def();
+
+ void create_cache(pivot_cache_id_t cache_id);
+
+ virtual void set_worksheet_source(std::string_view ref, std::string_view sheet_name) override;
+
+ virtual void set_worksheet_source(std::string_view table_name) override;
+
+ virtual void set_field_count(size_t n) override;
+
+ virtual void set_field_name(std::string_view name) override;
+
+ virtual iface::import_pivot_cache_field_group* start_field_group(size_t base_index) override;
+
+ virtual void set_field_min_value(double v) override;
+
+ virtual void set_field_max_value(double v) override;
+
+ virtual void set_field_min_date(const date_time_t& dt) override;
+
+ virtual void set_field_max_date(const date_time_t& dt) override;
+
+ virtual void commit_field() override;
+
+ virtual void set_field_item_string(std::string_view value) override;
+
+ virtual void set_field_item_numeric(double v) override;
+
+ virtual void set_field_item_date_time(const date_time_t& dt) override;
+
+ virtual void set_field_item_error(error_value_t ev) override;
+
+ virtual void commit_field_item() override;
+
+ virtual void commit() override;
+};
+
+/**
+ * Concrete implementation of the import_pivot_cache_records interface.
+ */
+class import_pivot_cache_records : public iface::import_pivot_cache_records
+{
+ document& m_doc;
+ pivot_cache* m_cache; //< cache to push the records to at the very end.
+
+ pivot_cache_record_t m_current_record;
+ pivot_cache::records_type m_records;
+
+public:
+ import_pivot_cache_records(document& doc);
+ ~import_pivot_cache_records();
+
+ void set_cache(pivot_cache* p);
+
+ virtual void set_record_count(size_t n) override;
+
+ virtual void append_record_value_numeric(double v) override;
+
+ virtual void append_record_value_character(std::string_view s) override;
+
+ virtual void append_record_value_shared_item(size_t index) override;
+
+ virtual void commit_record() override;
+
+ virtual void commit() override;
+};
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/factory_shared_strings.cpp b/src/spreadsheet/factory_shared_strings.cpp
new file mode 100644
index 0000000..a8375c0
--- /dev/null
+++ b/src/spreadsheet/factory_shared_strings.cpp
@@ -0,0 +1,118 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "factory_shared_strings.hpp"
+
+#include <orcus/spreadsheet/shared_strings.hpp>
+#include <orcus/spreadsheet/styles.hpp>
+#include <orcus/string_pool.hpp>
+#include <ixion/model_context.hpp>
+
+namespace orcus { namespace spreadsheet { namespace detail {
+
+import_shared_strings::import_shared_strings(
+ string_pool& sp, ixion::model_context& cxt, styles& st, shared_strings& ss_store) :
+ m_string_pool(sp),
+ m_cxt(cxt),
+ m_styles(st),
+ m_ss_store(ss_store)
+{
+}
+
+import_shared_strings::~import_shared_strings() {}
+
+size_t import_shared_strings::append(std::string_view s)
+{
+ return m_cxt.append_string(s);
+}
+
+size_t import_shared_strings::add(std::string_view s)
+{
+ return m_cxt.add_string(s);
+}
+
+void import_shared_strings::set_segment_font(size_t font_index)
+{
+ const font_t* font_data = m_styles.get_font(font_index);
+ if (!font_data)
+ return;
+
+ m_cur_format.bold = font_data->bold ? *font_data->bold : false;
+ m_cur_format.italic = font_data->italic ? *font_data->italic : false;
+
+ if (font_data->name)
+ m_cur_format.font = *font_data->name; // font names are already interned when set.
+
+ if (font_data->size)
+ m_cur_format.font_size = *font_data->size;
+
+ if (font_data->color)
+ m_cur_format.color = *font_data->color;
+}
+
+void import_shared_strings::set_segment_bold(bool b)
+{
+ m_cur_format.bold = b;
+}
+
+void import_shared_strings::set_segment_italic(bool b)
+{
+ m_cur_format.italic = b;
+}
+
+void import_shared_strings::set_segment_font_name(std::string_view s)
+{
+ m_cur_format.font = m_string_pool.intern(s).first;
+}
+
+void import_shared_strings::set_segment_font_size(double point)
+{
+ m_cur_format.font_size = point;
+}
+
+void import_shared_strings::set_segment_font_color(
+ color_elem_t alpha, color_elem_t red, color_elem_t green, color_elem_t blue)
+{
+ m_cur_format.color = color_t(alpha, red, green, blue);
+}
+
+void import_shared_strings::append_segment(std::string_view s)
+{
+ if (s.empty())
+ return;
+
+ size_t start_pos = m_cur_segment_string.size();
+ m_cur_segment_string += s;
+
+ if (m_cur_format.formatted())
+ {
+ // This segment is formatted.
+ // Record the position and size of the format run.
+ m_cur_format.pos = start_pos;
+ m_cur_format.size = s.size();
+
+ if (!mp_cur_format_runs)
+ mp_cur_format_runs = std::make_unique<format_runs_t>();
+
+ mp_cur_format_runs->push_back(m_cur_format);
+ m_cur_format.reset();
+ }
+}
+
+size_t import_shared_strings::commit_segments()
+{
+ ixion::string_id_t sindex = m_cxt.append_string(m_cur_segment_string);
+ m_cur_segment_string.clear();
+ m_ss_store.set_format_runs(sindex, std::move(mp_cur_format_runs));
+ mp_cur_format_runs.reset();
+
+ return sindex;
+}
+
+}}} // namespace orcus::spreadsheet::detail
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/factory_shared_strings.hpp b/src/spreadsheet/factory_shared_strings.hpp
new file mode 100644
index 0000000..b49d274
--- /dev/null
+++ b/src/spreadsheet/factory_shared_strings.hpp
@@ -0,0 +1,64 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#pragma once
+
+#include <orcus/spreadsheet/import_interface.hpp>
+#include <orcus/spreadsheet/document_types.hpp>
+
+#include <memory>
+
+namespace ixion {
+
+class model_context;
+
+}
+
+namespace orcus {
+
+class string_pool;
+
+namespace spreadsheet {
+
+class styles;
+class shared_strings;
+
+namespace detail {
+
+class import_shared_strings : public iface::import_shared_strings
+{
+ orcus::string_pool& m_string_pool;
+ ixion::model_context& m_cxt;
+ styles& m_styles;
+ shared_strings& m_ss_store;
+
+ std::string m_cur_segment_string;
+ format_run m_cur_format;
+ std::unique_ptr<format_runs_t> mp_cur_format_runs;
+
+public:
+ import_shared_strings(
+ string_pool& sp, ixion::model_context& cxt, styles& st,
+ orcus::spreadsheet::shared_strings& ss_store);
+ virtual ~import_shared_strings() override;
+
+ virtual size_t append(std::string_view s) override;
+ virtual size_t add(std::string_view s) override;
+
+ virtual void set_segment_font(size_t font_index) override;
+ virtual void set_segment_bold(bool b) override;
+ virtual void set_segment_italic(bool b) override;
+ virtual void set_segment_font_name(std::string_view s) override;
+ virtual void set_segment_font_size(double point) override;
+ virtual void set_segment_font_color(color_elem_t alpha, color_elem_t red, color_elem_t green, color_elem_t blue) override;
+ virtual void append_segment(std::string_view s) override;
+ virtual size_t commit_segments() override;
+};
+
+}}} // namespace orcus::spreadsheet::detail
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/factory_sheet.cpp b/src/spreadsheet/factory_sheet.cpp
new file mode 100644
index 0000000..dcc6639
--- /dev/null
+++ b/src/spreadsheet/factory_sheet.cpp
@@ -0,0 +1,640 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "factory_sheet.hpp"
+#include "orcus/spreadsheet/sheet.hpp"
+#include "orcus/spreadsheet/document.hpp"
+#include "orcus/spreadsheet/view.hpp"
+#include "orcus/measurement.hpp"
+#include "orcus/string_pool.hpp"
+
+#include "formula_global.hpp"
+
+#include <ixion/formula_name_resolver.hpp>
+#include <ixion/model_context.hpp>
+#include <ixion/formula.hpp>
+
+namespace orcus { namespace spreadsheet {
+
+import_sheet_named_exp::import_sheet_named_exp(document& doc, sheet_t sheet_index) :
+ m_doc(doc), m_sheet_index(sheet_index), m_base(sheet_index, 0, 0) {}
+
+import_sheet_named_exp::~import_sheet_named_exp() {}
+
+void import_sheet_named_exp::define(
+ std::string_view name, std::string_view expression, formula_ref_context_t ref_cxt)
+{
+ string_pool& sp = m_doc.get_string_pool();
+ m_name = sp.intern(name).first;
+
+ const ixion::formula_name_resolver* resolver = m_doc.get_formula_name_resolver(ref_cxt);
+ assert(resolver);
+
+ ixion::model_context& cxt = m_doc.get_model_context();
+ m_tokens = ixion::parse_formula_string(cxt, m_base, *resolver, expression);
+}
+
+void import_sheet_named_exp::set_base_position(const src_address_t& pos)
+{
+ m_base.sheet = pos.sheet;
+ m_base.row = pos.row;
+ m_base.column = pos.column;
+}
+
+void import_sheet_named_exp::set_named_expression(std::string_view name, std::string_view expression)
+{
+ define(name, expression, formula_ref_context_t::global);
+}
+
+void import_sheet_named_exp::set_named_range(std::string_view name, std::string_view range)
+{
+ define(name, range, formula_ref_context_t::named_range);
+}
+
+void import_sheet_named_exp::commit()
+{
+ ixion::model_context& cxt = m_doc.get_model_context();
+ cxt.set_named_expression(m_sheet_index, std::string{m_name}, m_base, std::move(m_tokens));
+
+ m_name = std::string_view{};
+ m_base.sheet = 0;
+ m_base.row = 0;
+ m_base.column = 0;
+}
+
+import_data_table::import_data_table(sheet& sh) : m_sheet(sh) {}
+import_data_table::~import_data_table() {}
+
+void import_data_table::reset()
+{
+}
+
+void import_data_table::set_type(data_table_type_t /*type*/)
+{
+}
+
+void import_data_table::set_range(const range_t& /*range*/)
+{
+}
+
+void import_data_table::set_first_reference(std::string_view /*ref*/, bool /*deleted*/)
+{
+}
+
+void import_data_table::set_second_reference(std::string_view /*ref*/, bool /*deleted*/)
+{
+}
+
+void import_data_table::commit()
+{
+}
+
+import_auto_filter::import_auto_filter(sheet& sh, string_pool& sp) :
+ m_sheet(sh),
+ m_string_pool(sp),
+ m_cur_col(-1) {}
+
+void import_auto_filter::reset()
+{
+ mp_data.reset(new auto_filter_t);
+ m_cur_col = -1;
+ m_cur_col_data.reset();
+}
+
+void import_auto_filter::set_range(const range_t& range)
+{
+ mp_data->range = to_abs_range(range, m_sheet.get_index());
+}
+
+void import_auto_filter::set_column(col_t col)
+{
+ m_cur_col = col;
+}
+
+void import_auto_filter::append_column_match_value(std::string_view value)
+{
+ // The string pool belongs to the document.
+ value = m_string_pool.intern(value).first;
+ m_cur_col_data.match_values.insert(value);
+}
+
+void import_auto_filter::commit_column()
+{
+ if (!mp_data)
+ return;
+
+ mp_data->commit_column(m_cur_col, m_cur_col_data);
+ m_cur_col_data.reset();
+}
+
+void import_auto_filter::commit()
+{
+ m_sheet.set_auto_filter_data(mp_data.release());
+}
+
+import_array_formula::import_array_formula(document& doc, sheet& sheet) :
+ m_doc(doc), m_sheet(sheet), m_missing_formula_result(), m_error_policy(formula_error_policy_t::fail)
+{
+ m_range.first.column = -1;
+ m_range.first.row = -1;
+ m_range.last = m_range.first;
+}
+
+import_array_formula::~import_array_formula()
+{
+}
+
+void import_array_formula::set_range(const range_t& range)
+{
+ m_range = range;
+
+ // Initialize the result matrix with the missing result value.
+ switch (m_missing_formula_result.get_type())
+ {
+ case ixion::formula_result::result_type::value:
+ {
+ ixion::matrix _mtx(
+ m_range.last.row - m_range.first.row + 1,
+ m_range.last.column - m_range.first.column + 1,
+ m_missing_formula_result.get_value());
+ m_result_mtx.swap(_mtx);
+ break;
+ }
+ case ixion::formula_result::result_type::error:
+ {
+ ixion::matrix _mtx(
+ m_range.last.row - m_range.first.row + 1,
+ m_range.last.column - m_range.first.column + 1,
+ m_missing_formula_result.get_error());
+ m_result_mtx.swap(_mtx);
+ break;
+ }
+ case ixion::formula_result::result_type::string:
+ {
+ ixion::matrix _mtx(
+ m_range.last.row - m_range.first.row + 1,
+ m_range.last.column - m_range.first.column + 1,
+ m_missing_formula_result.get_string());
+ m_result_mtx.swap(_mtx);
+ break;
+ }
+ default:
+ {
+ ixion::matrix _mtx(
+ m_range.last.row - m_range.first.row + 1,
+ m_range.last.column - m_range.first.column + 1);
+ m_result_mtx.swap(_mtx);
+ }
+ }
+}
+
+void import_array_formula::set_formula(formula_grammar_t /*grammar*/, std::string_view formula)
+{
+ const ixion::formula_name_resolver* resolver =
+ m_doc.get_formula_name_resolver(spreadsheet::formula_ref_context_t::global);
+ if (!resolver)
+ return;
+
+ // Tokenize the formula string and store it.
+ ixion::model_context& cxt = m_doc.get_model_context();
+ ixion::abs_address_t pos(m_sheet.get_index(), m_range.first.row, m_range.first.column);
+
+ try
+ {
+ m_tokens = ixion::parse_formula_string(cxt, pos, *resolver, formula);
+ }
+ catch (const std::exception& e)
+ {
+ if (m_error_policy == formula_error_policy_t::fail)
+ throw;
+
+ std::string_view error_s = e.what();
+ m_tokens = ixion::create_formula_error_tokens(cxt, formula, error_s);
+ }
+}
+
+void import_array_formula::set_result_value(row_t row, col_t col, double value)
+{
+ m_result_mtx.set(row, col, value);
+}
+
+void import_array_formula::set_result_string(row_t /*row*/, col_t /*col*/, std::string_view /*value*/)
+{
+ // TODO : handle this
+}
+
+void import_array_formula::set_result_empty(row_t /*row*/, col_t /*col*/)
+{
+ // TODO : handle this
+}
+
+void import_array_formula::set_result_bool(row_t row, col_t col, bool value)
+{
+ m_result_mtx.set(row, col, value);
+}
+
+void import_array_formula::commit()
+{
+ ixion::formula_result cached_results(std::move(m_result_mtx));
+ m_sheet.set_grouped_formula(m_range, std::move(m_tokens), std::move(cached_results));
+}
+
+void import_array_formula::set_missing_formula_result(ixion::formula_result result)
+{
+ m_missing_formula_result = std::move(result);
+}
+
+void import_array_formula::set_formula_error_policy(formula_error_policy_t policy)
+{
+ m_error_policy = policy;
+}
+
+void import_array_formula::reset()
+{
+ m_tokens.clear();
+ m_result_mtx = ixion::matrix();
+ m_range.first.row = -1;
+ m_range.first.column = -1;
+ m_range.last.row = -1;
+ m_range.last.column = -1;
+}
+
+import_formula::import_formula(document& doc, sheet& sheet, shared_formula_pool& pool) :
+ m_doc(doc),
+ m_sheet(sheet),
+ m_shared_formula_pool(pool),
+ m_row(-1),
+ m_col(-1),
+ m_shared_index(0),
+ m_shared(false),
+ m_error_policy(formula_error_policy_t::fail) {}
+
+import_formula::~import_formula() {}
+
+void import_formula::set_position(row_t row, col_t col)
+{
+ m_row = row;
+ m_col = col;
+}
+
+void import_formula::set_formula(formula_grammar_t /*grammar*/, std::string_view formula)
+{
+ if (m_row < 0 || m_col < 0)
+ return;
+
+ const ixion::formula_name_resolver* resolver =
+ m_doc.get_formula_name_resolver(spreadsheet::formula_ref_context_t::global);
+ if (!resolver)
+ return;
+
+ // Tokenize the formula string and store it.
+ ixion::model_context& cxt = m_doc.get_model_context();
+ ixion::abs_address_t pos(m_sheet.get_index(), m_row, m_col);
+
+ ixion::formula_tokens_t tokens;
+ try
+ {
+ tokens = ixion::parse_formula_string(cxt, pos, *resolver, formula);
+ }
+ catch (const std::exception& e)
+ {
+ if (m_error_policy == formula_error_policy_t::fail)
+ throw;
+
+ std::string_view error_s = e.what();
+ tokens = ixion::create_formula_error_tokens(cxt, formula, error_s);
+ }
+
+ m_tokens_store = ixion::formula_tokens_store::create();
+ m_tokens_store->get() = std::move(tokens);
+}
+
+void import_formula::set_shared_formula_index(size_t index)
+{
+ m_shared = true;
+ m_shared_index = index;
+}
+
+void import_formula::set_result_value(double value)
+{
+ m_result = ixion::formula_result(value);
+}
+
+void import_formula::set_result_string(std::string_view value)
+{
+ m_result = ixion::formula_result(std::string{value});
+}
+
+void import_formula::set_result_empty() {}
+void import_formula::set_result_bool(bool /*value*/) {}
+
+void import_formula::commit()
+{
+ if (m_row < 0 || m_col < 0)
+ return;
+
+ if (m_shared)
+ {
+ if (m_tokens_store)
+ {
+ if (m_result)
+ m_sheet.set_formula(m_row, m_col, m_tokens_store, *m_result);
+ else
+ m_sheet.set_formula(m_row, m_col, m_tokens_store);
+
+ m_shared_formula_pool.add(m_shared_index, m_tokens_store);
+ }
+ else
+ {
+ ixion::formula_tokens_store_ptr_t ts = m_shared_formula_pool.get(m_shared_index);
+ if (!ts)
+ return;
+
+ if (m_result)
+ m_sheet.set_formula(m_row, m_col, ts, *m_result);
+ else
+ m_sheet.set_formula(m_row, m_col, ts);
+ }
+ return;
+ }
+
+ if (m_result)
+ m_sheet.set_formula(m_row, m_col, m_tokens_store, *m_result);
+ else
+ m_sheet.set_formula(m_row, m_col, m_tokens_store);
+}
+
+void import_formula::set_missing_formula_result(ixion::formula_result result)
+{
+ m_result = std::move(result);
+}
+
+void import_formula::set_formula_error_policy(formula_error_policy_t policy)
+{
+ m_error_policy = policy;
+}
+
+void import_formula::reset()
+{
+ m_tokens_store.reset();
+ m_result.reset();
+ m_row = -1;
+ m_col = -1;
+ m_shared_index = 0;
+ m_shared = false;
+}
+
+import_sheet::import_sheet(document& doc, sheet& sh, sheet_view* view) :
+ m_doc(doc),
+ m_sheet(sh),
+ m_formula(doc, sh, m_shared_formula_pool),
+ m_array_formula(doc, sh),
+ m_named_exp(doc, sh.get_index()),
+ m_sheet_properties(doc, sh),
+ m_data_table(sh),
+ m_auto_filter(sh, doc.get_string_pool()),
+ m_table(doc, sh),
+ m_charset(character_set_t::unspecified),
+ m_fill_missing_formula_results(false)
+{
+ if (view)
+ m_sheet_view = std::make_unique<import_sheet_view>(*view, sh.get_index());
+}
+
+import_sheet::~import_sheet() {}
+
+iface::import_sheet_view* import_sheet::get_sheet_view()
+{
+ return m_sheet_view.get();
+}
+
+iface::import_auto_filter* import_sheet::get_auto_filter()
+{
+ m_auto_filter.reset();
+ return &m_auto_filter;
+}
+
+iface::import_conditional_format* import_sheet::get_conditional_format()
+{
+ return nullptr;
+}
+
+iface::import_data_table* import_sheet::get_data_table()
+{
+ return &m_data_table;
+}
+
+iface::import_named_expression* import_sheet::get_named_expression()
+{
+ return &m_named_exp;
+}
+
+iface::import_sheet_properties* import_sheet::get_sheet_properties()
+{
+ return &m_sheet_properties;
+}
+
+iface::import_table* import_sheet::get_table()
+{
+ m_table.reset();
+ return &m_table;
+}
+
+iface::import_formula* import_sheet::get_formula()
+{
+ m_formula.reset();
+
+ if (m_fill_missing_formula_results)
+ {
+ m_formula.set_missing_formula_result(
+ ixion::formula_result(ixion::formula_error_t::no_result_error));
+ }
+
+ return &m_formula;
+}
+
+iface::import_array_formula* import_sheet::get_array_formula()
+{
+ m_array_formula.reset();
+
+ if (m_fill_missing_formula_results)
+ {
+ m_array_formula.set_missing_formula_result(
+ ixion::formula_result(ixion::formula_error_t::no_result_error));
+ }
+
+ return &m_array_formula;
+}
+
+void import_sheet::set_auto(row_t row, col_t col, std::string_view s)
+{
+ m_sheet.set_auto(row, col, s);
+}
+
+void import_sheet::set_bool(row_t row, col_t col, bool value)
+{
+ m_sheet.set_bool(row, col, value);
+}
+
+void import_sheet::set_date_time(row_t row, col_t col, int year, int month, int day, int hour, int minute, double second)
+{
+ m_sheet.set_date_time(row, col, year, month, day, hour, minute, second);
+}
+
+void import_sheet::set_format(row_t row, col_t col, size_t xf_index)
+{
+ m_sheet.set_format(row, col, xf_index);
+}
+
+void import_sheet::set_format(
+ row_t row_start, col_t col_start, row_t row_end, col_t col_end, size_t xf_index)
+{
+ m_sheet.set_format(row_start, col_start, row_end, col_end, xf_index);
+}
+
+void import_sheet::set_column_format(col_t col, col_t col_span, std::size_t xf_index)
+{
+ m_sheet.set_column_format(col, col_span, xf_index);
+}
+
+void import_sheet::set_row_format(row_t row, std::size_t xf_index)
+{
+ m_sheet.set_row_format(row, xf_index);
+}
+
+void import_sheet::set_string(row_t row, col_t col, string_id_t sindex)
+{
+ m_sheet.set_string(row, col, sindex);
+}
+
+void import_sheet::set_value(row_t row, col_t col, double value)
+{
+ m_sheet.set_value(row, col, value);
+}
+
+void import_sheet::fill_down_cells(row_t src_row, col_t src_col, row_t range_size)
+{
+ m_sheet.fill_down_cells(src_row, src_col, range_size);
+}
+
+range_size_t import_sheet::get_sheet_size() const
+{
+ return m_doc.get_sheet_size();
+}
+
+void import_sheet::set_character_set(character_set_t charset)
+{
+ m_charset = charset;
+}
+
+void import_sheet::set_fill_missing_formula_results(bool b)
+{
+ m_fill_missing_formula_results = b;
+}
+
+void import_sheet::set_formula_error_policy(formula_error_policy_t policy)
+{
+ m_formula.set_formula_error_policy(policy);
+ m_array_formula.set_formula_error_policy(policy);
+}
+
+import_sheet_view::import_sheet_view(sheet_view& view, sheet_t si) :
+ m_view(view), m_sheet_index(si) {}
+
+import_sheet_view::~import_sheet_view() {}
+
+void import_sheet_view::set_split_pane(
+ double hor_split, double ver_split,
+ const orcus::spreadsheet::address_t& top_left_cell,
+ orcus::spreadsheet::sheet_pane_t active_pane)
+{
+ m_view.set_split_pane(hor_split, ver_split, top_left_cell);
+ m_view.set_active_pane(active_pane);
+}
+
+void import_sheet_view::set_frozen_pane(
+ orcus::spreadsheet::col_t visible_columns,
+ orcus::spreadsheet::row_t visible_rows,
+ const orcus::spreadsheet::address_t& top_left_cell,
+ orcus::spreadsheet::sheet_pane_t active_pane)
+{
+ m_view.set_frozen_pane(visible_columns, visible_rows, top_left_cell);
+ m_view.set_active_pane(active_pane);
+}
+
+void import_sheet_view::set_selected_range(sheet_pane_t pane, range_t range)
+{
+ m_view.set_selection(pane, range);
+}
+
+void import_sheet_view::set_sheet_active()
+{
+ m_view.get_document_view().set_active_sheet(m_sheet_index);
+}
+
+import_sheet_properties::import_sheet_properties(document& doc, sheet& sh) :
+ m_doc(doc), m_sheet(sh) {}
+
+import_sheet_properties::~import_sheet_properties() {}
+
+void import_sheet_properties::set_column_width(col_t col, col_t col_span, double width, orcus::length_unit_t unit)
+{
+ col_width_t w = orcus::convert(width, unit, length_unit_t::twip);
+ m_sheet.set_col_width(col, col_span, w);
+}
+
+void import_sheet_properties::set_column_hidden(col_t col, col_t col_span, bool hidden)
+{
+ m_sheet.set_col_hidden(col, col_span, hidden);
+}
+
+void import_sheet_properties::set_row_height(row_t row, double height, orcus::length_unit_t unit)
+{
+ row_height_t h = orcus::convert(height, unit, length_unit_t::twip);
+ m_sheet.set_row_height(row, h);
+}
+
+void import_sheet_properties::set_row_hidden(row_t row, bool hidden)
+{
+ m_sheet.set_row_hidden(row, hidden);
+}
+
+void import_sheet_properties::set_merge_cell_range(const range_t& range)
+{
+ m_sheet.set_merge_cell_range(range);
+}
+
+export_sheet::export_sheet(const document& doc, const sheet& sh) : m_doc(doc), m_sheet(sh) {}
+export_sheet::~export_sheet() {}
+
+void export_sheet::write_string(std::ostream& os, row_t row, col_t col) const
+{
+ const ixion::model_context& cxt = m_doc.get_model_context();
+ ixion::abs_address_t pos(m_sheet.get_index(), row, col);
+
+ switch (cxt.get_celltype(pos))
+ {
+ case ixion::celltype_t::string:
+ {
+ size_t str_id = cxt.get_string_identifier(pos);
+ const std::string* p = cxt.get_string(str_id);
+ if (p)
+ os << *p;
+ }
+ break;
+ case ixion::celltype_t::numeric:
+ os << cxt.get_numeric_value(pos);
+ break;
+ default:
+ ;
+ }
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+
diff --git a/src/spreadsheet/factory_sheet.hpp b/src/spreadsheet/factory_sheet.hpp
new file mode 100644
index 0000000..ded4d10
--- /dev/null
+++ b/src/spreadsheet/factory_sheet.hpp
@@ -0,0 +1,275 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_SPREADSHEET_FACTORY_SHEET_HPP
+#define INCLUDED_ORCUS_SPREADSHEET_FACTORY_SHEET_HPP
+
+#include <orcus/spreadsheet/import_interface.hpp>
+#include <orcus/spreadsheet/import_interface_view.hpp>
+#include <orcus/spreadsheet/auto_filter.hpp>
+
+#include <orcus/spreadsheet/export_interface.hpp>
+
+#include "factory_table.hpp"
+#include "shared_formula.hpp"
+
+#include <memory>
+#include <optional>
+#include <ixion/formula_name_resolver.hpp>
+#include <ixion/formula_result.hpp>
+#include <ixion/matrix.hpp>
+
+namespace orcus {
+
+class string_pool;
+
+namespace spreadsheet {
+
+class document;
+class sheet_view;
+class sheet;
+class import_sheet_view;
+
+class import_sheet_named_exp : public iface::import_named_expression
+{
+ document& m_doc;
+ sheet_t m_sheet_index;
+ std::string_view m_name;
+ ixion::abs_address_t m_base;
+ ixion::formula_tokens_t m_tokens;
+
+ void define(std::string_view name, std::string_view expression, formula_ref_context_t ref_cxt);
+
+public:
+ import_sheet_named_exp(document& doc, sheet_t sheet_index);
+ virtual ~import_sheet_named_exp() override;
+
+ virtual void set_base_position(const src_address_t& pos) override;
+ virtual void set_named_expression(std::string_view name, std::string_view expression) override;
+ virtual void set_named_range(std::string_view name, std::string_view range) override;
+ virtual void commit();
+};
+
+/**
+ * Implement the sheet properties import interface, but the actual
+ * properties are stored in sheet.
+ */
+class import_sheet_properties : public iface::import_sheet_properties
+{
+ document& m_doc;
+ sheet& m_sheet;
+public:
+ import_sheet_properties(document& doc, sheet& sh);
+ ~import_sheet_properties();
+
+ virtual void set_column_width(col_t col, col_t col_span, double width, orcus::length_unit_t unit);
+ virtual void set_column_hidden(col_t col, col_t col_span, bool hidden);
+ virtual void set_row_height(row_t row, double height, orcus::length_unit_t unit);
+ virtual void set_row_hidden(row_t row, bool hidden);
+ virtual void set_merge_cell_range(const range_t& range);
+};
+
+class import_data_table : public iface::import_data_table
+{
+ sheet& m_sheet;
+public:
+ import_data_table(sheet& sh);
+ ~import_data_table();
+
+ void reset();
+
+ virtual void set_type(data_table_type_t type) override;
+
+ virtual void set_range(const range_t& range) override;
+
+ virtual void set_first_reference(std::string_view ref, bool deleted) override;
+
+ virtual void set_second_reference(std::string_view ref, bool deleted) override;
+
+ virtual void commit() override;
+};
+
+class import_auto_filter : public orcus::spreadsheet::iface::import_auto_filter
+{
+ sheet& m_sheet;
+ string_pool& m_string_pool;
+ std::unique_ptr<auto_filter_t> mp_data;
+ col_t m_cur_col;
+ auto_filter_column_t m_cur_col_data;
+
+public:
+ import_auto_filter(sheet& sh, string_pool& sp);
+
+ void reset();
+
+ virtual void set_range(const range_t& range) override;
+
+ virtual void set_column(col_t col) override;
+
+ virtual void append_column_match_value(std::string_view value) override;
+
+ virtual void commit_column() override;
+
+ virtual void commit() override;
+};
+
+class import_array_formula : public iface::import_array_formula
+{
+ document& m_doc;
+ sheet& m_sheet;
+
+ range_t m_range;
+ ixion::formula_tokens_t m_tokens;
+ ixion::formula_result m_missing_formula_result;
+ ixion::matrix m_result_mtx;
+ formula_error_policy_t m_error_policy;
+
+public:
+ import_array_formula(document& doc, sheet& sheet);
+ virtual ~import_array_formula() override;
+
+ virtual void set_range(const range_t& range) override;
+
+ virtual void set_formula(formula_grammar_t grammar, std::string_view formula) override;
+
+ virtual void set_result_value(row_t row, col_t col, double value) override;
+
+ virtual void set_result_string(row_t row, col_t col, std::string_view value) override;
+
+ virtual void set_result_empty(row_t row, col_t col) override;
+
+ virtual void set_result_bool(row_t row, col_t col, bool value) override;
+
+ virtual void commit() override;
+
+ void set_missing_formula_result(ixion::formula_result result);
+
+ void set_formula_error_policy(formula_error_policy_t policy);
+
+ void reset();
+};
+
+class import_formula : public iface::import_formula
+{
+ document& m_doc;
+ sheet& m_sheet;
+ shared_formula_pool& m_shared_formula_pool;
+
+ row_t m_row;
+ col_t m_col;
+ size_t m_shared_index;
+ bool m_shared;
+
+ ixion::formula_tokens_store_ptr_t m_tokens_store;
+ std::optional<ixion::formula_result> m_result;
+ formula_error_policy_t m_error_policy;
+
+public:
+ import_formula(document& doc, sheet& sheet, shared_formula_pool& pool);
+ virtual ~import_formula() override;
+
+ virtual void set_position(row_t row, col_t col) override;
+ virtual void set_formula(formula_grammar_t grammar, std::string_view formula) override;
+ virtual void set_shared_formula_index(size_t index) override;
+ virtual void set_result_value(double value) override;
+ virtual void set_result_string(std::string_view value) override;
+ virtual void set_result_empty() override;
+ virtual void set_result_bool(bool value) override;
+ virtual void commit() override;
+
+ void set_missing_formula_result(ixion::formula_result result);
+ void set_formula_error_policy(formula_error_policy_t policy);
+
+ void reset();
+};
+
+class import_sheet : public iface::import_sheet
+{
+ document& m_doc;
+ sheet& m_sheet;
+ shared_formula_pool m_shared_formula_pool;
+ import_formula m_formula;
+ import_array_formula m_array_formula;
+ import_sheet_named_exp m_named_exp;
+ import_sheet_properties m_sheet_properties;
+ import_data_table m_data_table;
+ import_auto_filter m_auto_filter;
+ import_table m_table;
+ character_set_t m_charset;
+
+ std::unique_ptr<import_sheet_view> m_sheet_view;
+
+ bool m_fill_missing_formula_results;
+
+public:
+ import_sheet(document& doc, sheet& sh, sheet_view* view);
+ virtual ~import_sheet() override;
+
+ virtual iface::import_sheet_view* get_sheet_view() override;
+ virtual iface::import_auto_filter* get_auto_filter() override;
+ virtual iface::import_conditional_format* get_conditional_format() override;
+ virtual iface::import_data_table* get_data_table() override;
+ virtual iface::import_named_expression* get_named_expression() override;
+ virtual iface::import_sheet_properties* get_sheet_properties() override;
+ virtual iface::import_table* get_table() override;
+ virtual iface::import_formula* get_formula() override;
+ virtual iface::import_array_formula* get_array_formula() override;
+ virtual void set_auto(row_t row, col_t col, std::string_view s) override;
+ virtual void set_bool(row_t row, col_t col, bool value) override;
+ virtual void set_date_time(row_t row, col_t col, int year, int month, int day, int hour, int minute, double second) override;
+ virtual void set_format(row_t row, col_t col, size_t xf_index) override;
+ virtual void set_format(row_t row_start, col_t col_start, row_t row_end, col_t col_end, size_t xf_index) override;
+ virtual void set_column_format(col_t col, col_t col_span, std::size_t xf_index) override;
+ virtual void set_row_format(row_t row, std::size_t xf_index) override;
+ virtual void set_string(row_t row, col_t col, string_id_t sindex) override;
+ virtual void set_value(row_t row, col_t col, double value) override;
+ virtual void fill_down_cells(row_t src_row, col_t src_col, row_t range_size) override;
+ virtual range_size_t get_sheet_size() const override;
+
+ void set_character_set(character_set_t charset);
+ void set_fill_missing_formula_results(bool b);
+ void set_formula_error_policy(formula_error_policy_t policy);
+};
+
+class import_sheet_view : public iface::import_sheet_view
+{
+ sheet_view& m_view;
+ sheet_t m_sheet_index;
+public:
+ import_sheet_view(sheet_view& view, sheet_t si);
+ virtual ~import_sheet_view();
+ virtual void set_sheet_active() override;
+
+ virtual void set_split_pane(
+ double hor_split, double ver_split,
+ const address_t& top_left_cell,
+ sheet_pane_t active_pane) override;
+
+ virtual void set_frozen_pane(
+ col_t visible_columns, row_t visible_rows,
+ const address_t& top_left_cell,
+ sheet_pane_t active_pane) override;
+
+ virtual void set_selected_range(sheet_pane_t pane, range_t range) override;
+};
+
+class export_sheet : public iface::export_sheet
+{
+ const document& m_doc;
+ const sheet& m_sheet;
+public:
+ export_sheet(const document& doc, const sheet& sh);
+ ~export_sheet();
+
+ virtual void write_string(std::ostream& os, row_t row, col_t col) const override;
+};
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/factory_styles.cpp b/src/spreadsheet/factory_styles.cpp
new file mode 100644
index 0000000..91c6844
--- /dev/null
+++ b/src/spreadsheet/factory_styles.cpp
@@ -0,0 +1,870 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/spreadsheet/factory.hpp"
+#include "orcus/spreadsheet/styles.hpp"
+#include "orcus/string_pool.hpp"
+
+#include <unordered_map>
+
+namespace orcus { namespace spreadsheet {
+
+namespace {
+
+class import_font_style : public iface::import_font_style
+{
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+public:
+ import_font_style() = delete;
+ import_font_style(styles& _styles_model, string_pool& sp);
+ import_font_style(std::shared_ptr<import_factory_config> _config, styles& _styles_model, string_pool& sp);
+ virtual ~import_font_style() override;
+
+ virtual void set_bold(bool b) override;
+ virtual void set_bold_asian(bool b) override;
+ virtual void set_bold_complex(bool b) override;
+
+ virtual void set_italic(bool b) override;
+ virtual void set_italic_asian(bool b) override;
+ virtual void set_italic_complex(bool b) override;
+
+ virtual void set_name(std::string_view s) override;
+ virtual void set_name_asian(std::string_view s) override;
+ virtual void set_name_complex(std::string_view s) override;
+
+ virtual void set_size(double point) override;
+ virtual void set_size_asian(double point) override;
+ virtual void set_size_complex(double point) override;
+
+ virtual void set_underline(underline_t e) override;
+ virtual void set_underline_width(underline_width_t e) override;
+ virtual void set_underline_mode(underline_mode_t e) override;
+ virtual void set_underline_type(underline_type_t e) override;
+ virtual void set_underline_color(color_elem_t alpha, color_elem_t red, color_elem_t green, color_elem_t blue) override;
+ virtual void set_color(color_elem_t alpha, color_elem_t red, color_elem_t green, color_elem_t blue) override;
+ virtual void set_strikethrough_style(strikethrough_style_t s) override;
+ virtual void set_strikethrough_type(strikethrough_type_t s) override;
+ virtual void set_strikethrough_width(strikethrough_width_t s) override;
+ virtual void set_strikethrough_text(strikethrough_text_t s) override;
+ virtual std::size_t commit() override;
+
+ void reset();
+};
+
+class import_fill_style : public iface::import_fill_style
+{
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+public:
+ import_fill_style() = delete;
+ import_fill_style(styles& _styles_model, string_pool& sp);
+ virtual ~import_fill_style() override;
+
+ virtual void set_pattern_type(fill_pattern_t fp) override;
+ virtual void set_fg_color(color_elem_t alpha, color_elem_t red, color_elem_t green, color_elem_t blue) override;
+ virtual void set_bg_color(color_elem_t alpha, color_elem_t red, color_elem_t green, color_elem_t blue) override;
+ virtual size_t commit() override;
+
+ void reset();
+};
+
+class import_border_style : public iface::import_border_style
+{
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+public:
+ import_border_style() = delete;
+ import_border_style(styles& _styles_model, string_pool& sp);
+ virtual ~import_border_style() override;
+
+ virtual void set_style(border_direction_t dir, border_style_t style) override;
+ virtual void set_color(
+ border_direction_t dir, color_elem_t alpha, color_elem_t red, color_elem_t green, color_elem_t blue) override;
+ virtual void set_width(border_direction_t dir, double width, orcus::length_unit_t unit) override;
+ virtual size_t commit() override;
+
+ void reset();
+};
+
+class import_cell_protection : public iface::import_cell_protection
+{
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+public:
+ import_cell_protection() = delete;
+ import_cell_protection(styles& _styles_model, string_pool& sp);
+ virtual ~import_cell_protection() override;
+
+ virtual void set_hidden(bool b) override;
+ virtual void set_locked(bool b) override;
+ virtual void set_print_content(bool b) override;
+ virtual void set_formula_hidden(bool b) override;
+ virtual size_t commit() override;
+
+ void reset();
+};
+
+class import_number_format : public iface::import_number_format
+{
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+public:
+ import_number_format() = delete;
+ import_number_format(styles& _styles_model, string_pool& sp);
+ virtual ~import_number_format() override;
+
+ virtual void set_identifier(std::size_t id) override;
+ virtual void set_code(std::string_view s) override;
+ virtual size_t commit() override;
+
+ void reset();
+};
+
+class import_xf : public iface::import_xf
+{
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+public:
+ import_xf() = delete;
+ import_xf(styles& _styles_model, string_pool& sp);
+ virtual ~import_xf() override;
+
+ virtual void set_font(size_t index) override;
+ virtual void set_fill(size_t index) override;
+ virtual void set_border(size_t index) override;
+ virtual void set_protection(size_t index) override;
+ virtual void set_number_format(size_t index) override;
+ virtual void set_style_xf(size_t index) override;
+ virtual void set_apply_alignment(bool b) override;
+ virtual void set_horizontal_alignment(hor_alignment_t align) override;
+ virtual void set_vertical_alignment(ver_alignment_t align) override;
+ virtual void set_wrap_text(bool b) override;
+ virtual void set_shrink_to_fit(bool b) override;
+ virtual size_t commit() override;
+
+ void reset(xf_category_t cat);
+};
+
+class import_cell_style : public iface::import_cell_style
+{
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+public:
+ import_cell_style() = delete;
+ import_cell_style(styles& _styles_model, string_pool& sp);
+ virtual ~import_cell_style() override;
+
+ void set_name(std::string_view s) override;
+ void set_display_name(std::string_view s) override;
+ void set_xf(size_t index) override;
+ void set_builtin(size_t index) override;
+ void set_parent_name(std::string_view s) override;
+ void commit() override;
+
+ void reset();
+};
+
+struct import_font_style::impl
+{
+ std::shared_ptr<import_factory_config> config;
+ styles& styles_model;
+ string_pool& str_pool;
+
+ std::unordered_map<font_t, std::size_t, font_t::hash> font_cache;
+ font_t cur_font;
+
+ impl(styles& _styles_model, string_pool& sp) :
+ config(std::make_shared<import_factory_config>()),
+ styles_model(_styles_model),
+ str_pool(sp) {}
+
+ impl(std::shared_ptr<import_factory_config> _config, styles& _styles_model, string_pool& sp) :
+ config(_config), styles_model(_styles_model), str_pool(sp) {}
+};
+
+import_font_style::import_font_style(styles& _styles_model, string_pool& sp) :
+ mp_impl(std::make_unique<impl>(_styles_model, sp))
+{
+}
+
+import_font_style::import_font_style(
+ std::shared_ptr<import_factory_config> _config, styles& _styles_model, string_pool& sp) :
+ mp_impl(std::make_unique<impl>(_config, _styles_model, sp))
+{
+}
+
+import_font_style::~import_font_style() = default;
+
+void import_font_style::set_bold(bool b)
+{
+ mp_impl->cur_font.bold = b;
+}
+
+void import_font_style::set_bold_asian(bool b)
+{
+ mp_impl->cur_font.bold_asian = b;
+}
+
+void import_font_style::set_bold_complex(bool b)
+{
+ mp_impl->cur_font.bold_complex = b;
+}
+
+void import_font_style::set_italic(bool b)
+{
+ mp_impl->cur_font.italic = b;
+}
+
+void import_font_style::set_italic_asian(bool b)
+{
+ mp_impl->cur_font.italic_asian = b;
+}
+
+void import_font_style::set_italic_complex(bool b)
+{
+ mp_impl->cur_font.italic_complex = b;
+}
+
+void import_font_style::set_name(std::string_view s)
+{
+ mp_impl->cur_font.name = mp_impl->str_pool.intern(s).first;
+}
+
+void import_font_style::set_name_asian(std::string_view s)
+{
+ mp_impl->cur_font.name_asian = mp_impl->str_pool.intern(s).first;
+}
+
+void import_font_style::set_name_complex(std::string_view s)
+{
+ mp_impl->cur_font.name_complex = mp_impl->str_pool.intern(s).first;
+}
+
+void import_font_style::set_size(double point)
+{
+ mp_impl->cur_font.size = point;
+}
+
+void import_font_style::set_size_asian(double point)
+{
+ mp_impl->cur_font.size_asian = point;
+}
+
+void import_font_style::set_size_complex(double point)
+{
+ mp_impl->cur_font.size_complex = point;
+}
+
+void import_font_style::set_underline(underline_t e)
+{
+ mp_impl->cur_font.underline_style = e;
+}
+
+void import_font_style::set_underline_width(underline_width_t e)
+{
+ mp_impl->cur_font.underline_width = e;
+}
+
+void import_font_style::set_underline_mode(underline_mode_t e)
+{
+ mp_impl->cur_font.underline_mode = e;
+}
+
+void import_font_style::set_underline_type(underline_type_t e)
+{
+ mp_impl->cur_font.underline_type = e;
+}
+
+void import_font_style::set_underline_color(color_elem_t alpha, color_elem_t red, color_elem_t green, color_elem_t blue)
+{
+ mp_impl->cur_font.underline_color = color_t(alpha, red, green, blue);
+}
+
+void import_font_style::set_color(color_elem_t alpha, color_elem_t red, color_elem_t green, color_elem_t blue)
+{
+ mp_impl->cur_font.color = color_t(alpha, red, green, blue);
+}
+
+void import_font_style::set_strikethrough_style(strikethrough_style_t s)
+{
+ mp_impl->cur_font.strikethrough_style = s;
+}
+
+void import_font_style::set_strikethrough_type(strikethrough_type_t s)
+{
+ mp_impl->cur_font.strikethrough_type = s;
+}
+
+void import_font_style::set_strikethrough_width(strikethrough_width_t s)
+{
+ mp_impl->cur_font.strikethrough_width = s;
+}
+
+void import_font_style::set_strikethrough_text(strikethrough_text_t s)
+{
+ mp_impl->cur_font.strikethrough_text = s;
+}
+
+std::size_t import_font_style::commit()
+{
+ if (mp_impl->config->enable_font_cache)
+ {
+ auto it = mp_impl->font_cache.find(mp_impl->cur_font);
+ if (it != mp_impl->font_cache.end())
+ return it->second;
+ }
+
+ std::size_t font_id = mp_impl->styles_model.append_font(mp_impl->cur_font);
+ mp_impl->font_cache.insert({mp_impl->cur_font, font_id});
+ mp_impl->cur_font.reset();
+ return font_id;
+}
+
+void import_font_style::reset()
+{
+ mp_impl->cur_font.reset();
+}
+
+struct import_fill_style::impl
+{
+ styles& styles_model;
+ string_pool& str_pool;
+
+ fill_t cur_fill;
+
+ impl(styles& _styles_model, string_pool& sp) :
+ styles_model(_styles_model), str_pool(sp) {}
+};
+
+import_fill_style::import_fill_style(styles& _styles_model, string_pool& sp) :
+ mp_impl(std::make_unique<impl>(_styles_model, sp))
+{
+}
+
+import_fill_style::~import_fill_style()
+{
+}
+
+void import_fill_style::set_pattern_type(fill_pattern_t fp)
+{
+ mp_impl->cur_fill.pattern_type = fp;
+}
+
+void import_fill_style::set_fg_color(color_elem_t alpha, color_elem_t red, color_elem_t green, color_elem_t blue)
+{
+ mp_impl->cur_fill.fg_color = color_t{alpha, red, green, blue};
+}
+
+void import_fill_style::set_bg_color(color_elem_t alpha, color_elem_t red, color_elem_t green, color_elem_t blue)
+{
+ mp_impl->cur_fill.bg_color = color_t{alpha, red, green, blue};
+}
+
+size_t import_fill_style::commit()
+{
+ size_t fill_id = mp_impl->styles_model.append_fill(mp_impl->cur_fill);
+ mp_impl->cur_fill.reset();
+ return fill_id;
+}
+
+void import_fill_style::reset()
+{
+ mp_impl->cur_fill.reset();
+}
+
+struct import_border_style::impl
+{
+ styles& styles_model;
+ string_pool& str_pool;
+
+ border_t cur_border;
+
+ impl(styles& _styles_model, string_pool& sp) :
+ styles_model(_styles_model), str_pool(sp) {}
+
+ border_attrs_t* get_border_attrs(border_direction_t dir)
+ {
+ switch (dir)
+ {
+ case border_direction_t::top:
+ return &cur_border.top;
+ case border_direction_t::bottom:
+ return &cur_border.bottom;
+ case border_direction_t::left:
+ return &cur_border.left;
+ case border_direction_t::right:
+ return &cur_border.right;
+ case border_direction_t::diagonal:
+ return &cur_border.diagonal;
+ case border_direction_t::diagonal_bl_tr:
+ return &cur_border.diagonal_bl_tr;
+ case border_direction_t::diagonal_tl_br:
+ return &cur_border.diagonal_tl_br;
+ case border_direction_t::unknown:
+ ;
+ }
+
+ return nullptr;
+ }
+};
+
+import_border_style::import_border_style(styles& _styles_model, string_pool& sp) :
+ mp_impl(std::make_unique<impl>(_styles_model, sp))
+{
+}
+
+import_border_style::~import_border_style()
+{
+}
+
+void import_border_style::set_style(border_direction_t dir, border_style_t style)
+{
+ border_attrs_t* v = mp_impl->get_border_attrs(dir);
+ if (!v)
+ return;
+
+ v->style = style;
+}
+
+void import_border_style::set_color(
+ border_direction_t dir, color_elem_t alpha, color_elem_t red, color_elem_t green, color_elem_t blue)
+{
+ border_attrs_t* v = mp_impl->get_border_attrs(dir);
+ if (!v)
+ return;
+
+ v->border_color = color_t(alpha, red, green, blue);
+}
+
+void import_border_style::set_width(border_direction_t dir, double width, orcus::length_unit_t unit)
+{
+ border_attrs_t* v = mp_impl->get_border_attrs(dir);
+ if (!v)
+ return;
+
+ length_t bw{unit, width};
+ v->border_width = bw;
+}
+
+size_t import_border_style::commit()
+{
+ size_t border_id = mp_impl->styles_model.append_border(mp_impl->cur_border);
+ mp_impl->cur_border.reset();
+ return border_id;
+}
+
+void import_border_style::reset()
+{
+ mp_impl->cur_border.reset();
+}
+
+struct import_cell_protection::impl
+{
+ styles& styles_model;
+ string_pool& str_pool;
+
+ protection_t cur_protection;
+
+ impl(styles& _styles_model, string_pool& sp) :
+ styles_model(_styles_model), str_pool(sp) {}
+};
+
+import_cell_protection::import_cell_protection(styles& _styles_model, string_pool& sp) :
+ mp_impl(std::make_unique<impl>(_styles_model, sp))
+{
+}
+
+import_cell_protection::~import_cell_protection()
+{
+}
+
+void import_cell_protection::set_hidden(bool b)
+{
+ mp_impl->cur_protection.hidden = b;
+}
+
+void import_cell_protection::set_locked(bool b)
+{
+ mp_impl->cur_protection.locked = b;
+}
+
+void import_cell_protection::set_print_content(bool b)
+{
+ mp_impl->cur_protection.print_content = b;
+}
+
+void import_cell_protection::set_formula_hidden(bool b)
+{
+ mp_impl->cur_protection.formula_hidden = b;
+}
+
+std::size_t import_cell_protection::commit()
+{
+ std::size_t cp_id = mp_impl->styles_model.append_protection(mp_impl->cur_protection);
+ mp_impl->cur_protection.reset();
+ return cp_id;
+}
+
+void import_cell_protection::reset()
+{
+ mp_impl->cur_protection.reset();
+}
+
+struct import_number_format::impl
+{
+ styles& styles_model;
+ string_pool& str_pool;
+
+ number_format_t cur_numfmt;
+
+ impl(styles& _styles_model, string_pool& sp) :
+ styles_model(_styles_model), str_pool(sp) {}
+};
+
+import_number_format::import_number_format(styles& _styles_model, string_pool& sp) :
+ mp_impl(std::make_unique<impl>(_styles_model, sp))
+{
+}
+
+import_number_format::~import_number_format()
+{
+}
+
+void import_number_format::set_identifier(std::size_t id)
+{
+ mp_impl->cur_numfmt.identifier = id;
+}
+
+void import_number_format::set_code(std::string_view s)
+{
+ mp_impl->cur_numfmt.format_string = s;
+}
+
+size_t import_number_format::commit()
+{
+ std::size_t fmt_id = mp_impl->styles_model.append_number_format(mp_impl->cur_numfmt);
+ mp_impl->cur_numfmt.reset();
+
+ return fmt_id;
+}
+
+void import_number_format::reset()
+{
+ mp_impl->cur_numfmt.reset();
+}
+
+struct import_xf::impl
+{
+ styles& styles_model;
+ string_pool& str_pool;
+
+ cell_format_t cur_cell_format;
+ xf_category_t xf_category = xf_category_t::unknown;
+
+ impl(styles& _styles_model, string_pool& sp) :
+ styles_model(_styles_model), str_pool(sp) {}
+};
+
+import_xf::import_xf(styles& _styles_model, string_pool& sp) :
+ mp_impl(std::make_unique<impl>(_styles_model, sp))
+{
+}
+
+import_xf::~import_xf()
+{
+}
+
+void import_xf::set_font(size_t index)
+{
+ mp_impl->cur_cell_format.font = index;
+}
+
+void import_xf::set_fill(size_t index)
+{
+ mp_impl->cur_cell_format.fill = index;
+}
+
+void import_xf::set_border(size_t index)
+{
+ mp_impl->cur_cell_format.border = index;
+
+ // TODO : we need to decide whether to have interface methods for these
+ // apply_foo attributes. For now there is only one, for alignment.
+ mp_impl->cur_cell_format.apply_border = index > 0;
+}
+
+void import_xf::set_protection(size_t index)
+{
+ mp_impl->cur_cell_format.protection = index;
+}
+
+void import_xf::set_number_format(size_t index)
+{
+ mp_impl->cur_cell_format.number_format = index;
+}
+
+void import_xf::set_style_xf(size_t index)
+{
+ mp_impl->cur_cell_format.style_xf = index;
+}
+
+void import_xf::set_apply_alignment(bool b)
+{
+ mp_impl->cur_cell_format.apply_alignment = b;
+}
+
+void import_xf::set_horizontal_alignment(hor_alignment_t align)
+{
+ mp_impl->cur_cell_format.hor_align = align;
+}
+
+void import_xf::set_vertical_alignment(ver_alignment_t align)
+{
+ mp_impl->cur_cell_format.ver_align = align;
+}
+
+void import_xf::set_wrap_text(bool b)
+{
+ mp_impl->cur_cell_format.wrap_text = b;
+}
+
+void import_xf::set_shrink_to_fit(bool b)
+{
+ mp_impl->cur_cell_format.shrink_to_fit = b;
+}
+
+
+size_t import_xf::commit()
+{
+ size_t xf_id = 0;
+
+ switch (mp_impl->xf_category)
+ {
+ case xf_category_t::cell:
+ xf_id = mp_impl->styles_model.append_cell_format(mp_impl->cur_cell_format);
+ break;
+ case xf_category_t::cell_style:
+ xf_id = mp_impl->styles_model.append_cell_style_format(mp_impl->cur_cell_format);
+ break;
+ case xf_category_t::differential:
+ xf_id = mp_impl->styles_model.append_diff_cell_format(mp_impl->cur_cell_format);
+ break;
+ case xf_category_t::unknown:
+ throw std::logic_error("unknown cell format category");
+ }
+
+ mp_impl->cur_cell_format.reset();
+ return xf_id;
+}
+
+void import_xf::reset(xf_category_t cat)
+{
+ if (cat == xf_category_t::unknown)
+ throw std::invalid_argument("The specified category is 'unknown'.");
+
+ mp_impl->cur_cell_format.reset();
+ mp_impl->xf_category = cat;
+}
+
+struct import_cell_style::impl
+{
+ styles& styles_model;
+ string_pool& str_pool;
+
+ cell_style_t cur_cell_style;
+
+ impl(styles& _styles_model, string_pool& sp) :
+ styles_model(_styles_model), str_pool(sp) {}
+};
+
+import_cell_style::import_cell_style(styles& _styles_model, string_pool& sp) :
+ mp_impl(std::make_unique<impl>(_styles_model, sp))
+{
+}
+
+import_cell_style::~import_cell_style() {}
+
+void import_cell_style::set_name(std::string_view s)
+{
+ mp_impl->cur_cell_style.name = mp_impl->str_pool.intern(s).first;
+}
+
+void import_cell_style::set_display_name(std::string_view s)
+{
+ mp_impl->cur_cell_style.display_name = mp_impl->str_pool.intern(s).first;
+}
+
+void import_cell_style::set_xf(size_t index)
+{
+ mp_impl->cur_cell_style.xf = index;
+}
+
+void import_cell_style::set_builtin(size_t index)
+{
+ mp_impl->cur_cell_style.builtin = index;
+}
+
+void import_cell_style::set_parent_name(std::string_view s)
+{
+ mp_impl->cur_cell_style.parent_name = mp_impl->str_pool.intern(s).first;
+}
+
+void import_cell_style::commit()
+{
+ mp_impl->styles_model.append_cell_style(mp_impl->cur_cell_style);
+ mp_impl->cur_cell_style.reset();
+}
+
+void import_cell_style::reset()
+{
+ mp_impl->cur_cell_style.reset();
+}
+
+} // anonymous namespace
+
+struct import_styles::impl
+{
+ styles& styles_model;
+ string_pool& str_pool;
+
+ import_font_style font_style;
+ import_fill_style fill_style;
+ import_border_style border_style;
+ import_cell_protection cell_protection;
+ import_number_format number_format;
+ import_xf xf;
+ import_cell_style cell_style;
+
+ impl(styles& _styles_model, string_pool& sp) :
+ styles_model(_styles_model),
+ str_pool(sp),
+ font_style(_styles_model, sp),
+ fill_style(_styles_model, sp),
+ border_style(_styles_model, sp),
+ cell_protection(_styles_model, sp),
+ number_format(_styles_model, sp),
+ xf(_styles_model, sp),
+ cell_style(_styles_model, sp)
+ {}
+
+ impl(std::shared_ptr<import_factory_config> config, styles& _styles_model, string_pool& sp) :
+ styles_model(_styles_model),
+ str_pool(sp),
+ font_style(config, _styles_model, sp),
+ fill_style(_styles_model, sp),
+ border_style(_styles_model, sp),
+ cell_protection(_styles_model, sp),
+ number_format(_styles_model, sp),
+ xf(_styles_model, sp),
+ cell_style(_styles_model, sp)
+ {}
+};
+
+import_styles::import_styles(styles& styles_store, string_pool& sp) :
+ mp_impl(std::make_unique<impl>(styles_store, sp)) {}
+
+import_styles::import_styles(std::shared_ptr<import_factory_config> config, styles& styles_store, string_pool& sp) :
+ mp_impl(std::make_unique<impl>(config, styles_store, sp)) {}
+
+import_styles::~import_styles() = default;
+
+iface::import_font_style* import_styles::start_font_style()
+{
+ mp_impl->font_style.reset();
+ return &mp_impl->font_style;
+}
+
+iface::import_fill_style* import_styles::start_fill_style()
+{
+ mp_impl->fill_style.reset();
+ return &mp_impl->fill_style;
+}
+
+iface::import_border_style* import_styles::start_border_style()
+{
+ mp_impl->border_style.reset();
+ return &mp_impl->border_style;
+}
+
+iface::import_cell_protection* import_styles::start_cell_protection()
+{
+ mp_impl->cell_protection.reset();
+ return &mp_impl->cell_protection;
+}
+
+iface::import_number_format* import_styles::start_number_format()
+{
+ mp_impl->number_format.reset();
+ return &mp_impl->number_format;
+}
+
+iface::import_xf* import_styles::start_xf(xf_category_t cat)
+{
+ mp_impl->xf.reset(cat);
+ return &mp_impl->xf;
+}
+
+iface::import_cell_style* import_styles::start_cell_style()
+{
+ mp_impl->cell_style.reset();
+ return &mp_impl->cell_style;
+}
+
+void import_styles::set_font_count(size_t n)
+{
+ mp_impl->styles_model.reserve_font_store(n);
+}
+
+void import_styles::set_fill_count(size_t n)
+{
+ mp_impl->styles_model.reserve_fill_store(n);
+}
+
+void import_styles::set_border_count(size_t n)
+{
+ mp_impl->styles_model.reserve_border_store(n);
+}
+
+void import_styles::set_number_format_count(size_t n)
+{
+ mp_impl->styles_model.reserve_number_format_store(n);
+}
+
+void import_styles::set_xf_count(xf_category_t cat, size_t n)
+{
+ switch (cat)
+ {
+ case xf_category_t::cell:
+ mp_impl->styles_model.reserve_cell_format_store(n);
+ break;
+ case xf_category_t::cell_style:
+ mp_impl->styles_model.reserve_cell_style_format_store(n);
+ break;
+ case xf_category_t::differential:
+ mp_impl->styles_model.reserve_diff_cell_format_store(n);
+ break;
+ case xf_category_t::unknown:
+ break;
+ }
+}
+
+void import_styles::set_cell_style_count(size_t n)
+{
+ mp_impl->styles_model.reserve_cell_style_store(n);
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/factory_table.cpp b/src/spreadsheet/factory_table.cpp
new file mode 100644
index 0000000..a77b7af
--- /dev/null
+++ b/src/spreadsheet/factory_table.cpp
@@ -0,0 +1,213 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "factory_table.hpp"
+#include "formula_global.hpp"
+
+#include "orcus/string_pool.hpp"
+#include "orcus/spreadsheet/document.hpp"
+#include "orcus/spreadsheet/sheet.hpp"
+#include "orcus/spreadsheet/auto_filter.hpp"
+
+#include <ixion/formula_name_resolver.hpp>
+
+namespace orcus { namespace spreadsheet {
+
+namespace {
+
+class table_auto_filter : public iface::import_auto_filter
+{
+ string_pool& m_pool;
+ sheet_t m_sheet_pos;
+ col_t m_cur_col;
+ auto_filter_column_t m_cur_col_data;
+ auto_filter_t m_filter_data;
+
+ auto_filter_t* mp_data;
+
+public:
+ table_auto_filter(document& doc, sheet& sh) :
+ m_pool(doc.get_string_pool()),
+ m_sheet_pos(sh.get_index()),
+ m_cur_col(-1),
+ mp_data(nullptr) {}
+
+ void reset(auto_filter_t* data)
+ {
+ mp_data = data;
+ m_cur_col = -1;
+ m_cur_col_data.reset();
+ m_filter_data.reset();
+ }
+
+ virtual void set_range(const range_t& range)
+ {
+ m_filter_data.range = to_abs_range(range, m_sheet_pos);
+ }
+
+ virtual void set_column(orcus::spreadsheet::col_t col)
+ {
+ m_cur_col = col;
+ }
+
+ virtual void append_column_match_value(std::string_view value)
+ {
+ // The string pool belongs to the document.
+ value = m_pool.intern(value).first;
+ m_cur_col_data.match_values.insert(value);
+ };
+
+ virtual void commit_column()
+ {
+ m_filter_data.commit_column(m_cur_col, m_cur_col_data);
+ m_cur_col_data.reset();
+ }
+
+ virtual void commit()
+ {
+ if (!mp_data)
+ return;
+
+ mp_data->swap(m_filter_data);
+ }
+};
+
+}
+
+struct import_table::impl
+{
+ document& m_doc;
+ sheet& m_sheet;
+
+ table_auto_filter m_auto_filter;
+
+ std::unique_ptr<table_t> mp_data;
+ table_column_t m_column;
+
+ impl(const impl&) = delete;
+ impl& operator=(const impl&) = delete;
+
+ impl(document& doc, sheet& sh) :
+ m_doc(doc), m_sheet(sh), m_auto_filter(doc, sh) {}
+};
+
+import_table::import_table(document& doc, sheet& sh) : mp_impl(std::make_unique<impl>(doc, sh)) {}
+
+import_table::~import_table() {}
+
+iface::import_auto_filter* import_table::get_auto_filter()
+{
+ mp_impl->m_auto_filter.reset(&mp_impl->mp_data->filter);
+ return &mp_impl->m_auto_filter;
+}
+
+void import_table::set_range(const range_t& range)
+{
+ mp_impl->mp_data->range = to_abs_range(range, mp_impl->m_sheet.get_index());
+}
+
+void import_table::set_identifier(size_t id)
+{
+ mp_impl->mp_data->identifier = id;
+}
+
+void import_table::set_name(std::string_view name)
+{
+ string_pool& sp = mp_impl->m_doc.get_string_pool();
+ mp_impl->mp_data->name = sp.intern(name).first;
+}
+
+void import_table::set_display_name(std::string_view name)
+{
+ string_pool& sp = mp_impl->m_doc.get_string_pool();
+ mp_impl->mp_data->display_name = sp.intern(name).first;
+}
+
+void import_table::set_totals_row_count(size_t row_count)
+{
+ mp_impl->mp_data->totals_row_count = row_count;
+}
+
+void import_table::set_column_count(size_t n)
+{
+ mp_impl->mp_data->columns.reserve(n);
+}
+
+void import_table::set_column_identifier(size_t id)
+{
+ mp_impl->m_column.identifier = id;
+}
+
+void import_table::set_column_name(std::string_view name)
+{
+ string_pool& sp = mp_impl->m_doc.get_string_pool();
+ mp_impl->m_column.name = sp.intern(name).first;
+}
+
+void import_table::set_column_totals_row_label(std::string_view label)
+{
+ string_pool& sp = mp_impl->m_doc.get_string_pool();
+ mp_impl->m_column.totals_row_label = sp.intern(label).first;
+}
+
+void import_table::set_column_totals_row_function(orcus::spreadsheet::totals_row_function_t func)
+{
+ mp_impl->m_column.totals_row_function = func;
+}
+
+void import_table::commit_column()
+{
+ mp_impl->mp_data->columns.push_back(mp_impl->m_column);
+ mp_impl->m_column.reset();
+}
+
+void import_table::set_style_name(std::string_view name)
+{
+ table_style_t& style = mp_impl->mp_data->style;
+ string_pool& sp = mp_impl->m_doc.get_string_pool();
+ style.name = sp.intern(name).first;
+}
+
+void import_table::set_style_show_first_column(bool b)
+{
+ table_style_t& style = mp_impl->mp_data->style;
+ style.show_first_column = b;
+}
+
+void import_table::set_style_show_last_column(bool b)
+{
+ table_style_t& style = mp_impl->mp_data->style;
+ style.show_last_column = b;
+}
+
+void import_table::set_style_show_row_stripes(bool b)
+{
+ table_style_t& style = mp_impl->mp_data->style;
+ style.show_row_stripes = b;
+}
+
+void import_table::set_style_show_column_stripes(bool b)
+{
+ table_style_t& style = mp_impl->mp_data->style;
+ style.show_column_stripes = b;
+}
+
+void import_table::commit()
+{
+ mp_impl->m_doc.insert_table(mp_impl->mp_data.release());
+ mp_impl->mp_data.reset(new table_t);
+}
+
+void import_table::reset()
+{
+ mp_impl->mp_data.reset(new table_t);
+ mp_impl->m_column.reset();
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/factory_table.hpp b/src/spreadsheet/factory_table.hpp
new file mode 100644
index 0000000..0a274b4
--- /dev/null
+++ b/src/spreadsheet/factory_table.hpp
@@ -0,0 +1,60 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_SPREADSHEET_TABLE_HPP
+#define INCLUDED_ORCUS_SPREADSHEET_TABLE_HPP
+
+#include "orcus/spreadsheet/import_interface.hpp"
+
+#include <memory>
+
+namespace orcus { namespace spreadsheet {
+
+class document;
+class sheet;
+
+class import_table : public iface::import_table
+{
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+public:
+ import_table(document& doc, sheet& sh);
+ ~import_table();
+
+ virtual iface::import_auto_filter* get_auto_filter() override;
+
+ virtual void set_range(const range_t& range) override;
+ virtual void set_identifier(size_t id) override;
+ virtual void set_name(std::string_view name) override;
+ virtual void set_display_name(std::string_view name) override;
+ virtual void set_totals_row_count(size_t row_count) override;
+
+ virtual void set_column_count(size_t n) override;
+
+ virtual void set_column_identifier(size_t id) override;
+ virtual void set_column_name(std::string_view name) override;
+ virtual void set_column_totals_row_label(std::string_view label) override;
+ virtual void set_column_totals_row_function(orcus::spreadsheet::totals_row_function_t func) override;
+ virtual void commit_column() override;
+
+ virtual void set_style_name(std::string_view name) override;
+ virtual void set_style_show_first_column(bool b) override;
+ virtual void set_style_show_last_column(bool b) override;
+ virtual void set_style_show_row_stripes(bool b) override;
+ virtual void set_style_show_column_stripes(bool b) override;
+
+ virtual void commit() override;
+
+ void reset();
+};
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/flat_dumper.cpp b/src/spreadsheet/flat_dumper.cpp
new file mode 100644
index 0000000..9be4245
--- /dev/null
+++ b/src/spreadsheet/flat_dumper.cpp
@@ -0,0 +1,208 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "flat_dumper.hpp"
+#include "number_format.hpp"
+#include <orcus/spreadsheet/document.hpp>
+#include <orcus/stream.hpp>
+
+#include <ixion/formula.hpp>
+#include <ixion/model_context.hpp>
+#include <ixion/model_iterator.hpp>
+#include <ixion/formula_name_resolver.hpp>
+#include <ixion/formula_result.hpp>
+#include <ixion/cell.hpp>
+
+#include <iostream>
+#include <sstream>
+#include <string>
+#include <vector>
+
+using std::cout;
+using std::endl;
+
+namespace orcus { namespace spreadsheet { namespace detail {
+
+flat_dumper::flat_dumper(const document& doc) : m_doc(doc) {}
+
+void flat_dumper::dump(std::ostream& os, ixion::sheet_t sheet_id) const
+{
+ const ixion::model_context& cxt = m_doc.get_model_context();
+ ixion::abs_range_t range = cxt.get_data_range(sheet_id);
+ if (!range.valid())
+ // Sheet is empty. Nothing to print.
+ return;
+
+ const ixion::formula_name_resolver* resolver =
+ m_doc.get_formula_name_resolver(spreadsheet::formula_ref_context_t::global);
+ if (!resolver)
+ return;
+
+ size_t row_count = range.last.row + 1;
+ size_t col_count = range.last.column + 1;
+ os << "rows: " << row_count << " cols: " << col_count << endl;
+
+ // Always start at the top-left corner.
+ range.first.row = 0;
+ range.first.column = 0;
+ ixion::model_iterator iter = cxt.get_model_iterator(
+ sheet_id, ixion::rc_direction_t::vertical, range);
+
+ std::vector<std::string> mx(row_count*col_count);
+
+ auto to_pos = [col_count](size_t row, size_t col) -> size_t
+ {
+ return col_count * row + col;
+ };
+
+ // Calculate column widths as we iterate.
+ std::vector<size_t> col_widths(col_count, 0);
+ auto it_colwidth = col_widths.begin();
+ col_t current_col = 0;
+
+ for (; iter.has(); iter.next())
+ {
+ const ixion::model_iterator::cell& c = iter.get();
+ if (c.col > current_col)
+ {
+ ++current_col;
+ ++it_colwidth;
+ assert(current_col == c.col);
+ }
+
+ size_t cell_str_width = 0;
+
+ switch (c.type)
+ {
+ case ixion::celltype_t::string:
+ {
+ ixion::string_id_t sindex = std::get<ixion::string_id_t>(c.value);
+ const std::string* p = cxt.get_string(sindex);
+ assert(p);
+ cell_str_width = calc_logical_string_length(*p);
+ mx[to_pos(c.row, c.col)] = std::move(*p);
+ break;
+ }
+ case ixion::celltype_t::numeric:
+ {
+ std::ostringstream os2;
+ format_to_file_output(os2, std::get<double>(c.value));
+ os2 << " [v]";
+ std::string s = os2.str();
+ cell_str_width = calc_logical_string_length(s);
+ mx[to_pos(c.row, c.col)] = std::move(s);
+ break;
+ }
+ case ixion::celltype_t::boolean:
+ {
+ std::ostringstream os2;
+ os2 << (std::get<bool>(c.value) ? "true" : "false") << " [b]";
+ std::string s = os2.str();
+ cell_str_width = calc_logical_string_length(s);
+ mx[to_pos(c.row, c.col)] = std::move(s);
+ break;
+ }
+ case ixion::celltype_t::formula:
+ {
+ // print the formula and the formula result.
+ const ixion::formula_cell* cell = std::get<const ixion::formula_cell*>(c.value);
+ assert(cell);
+ const ixion::formula_tokens_store_ptr_t& ts = cell->get_tokens();
+ if (ts)
+ {
+ const ixion::formula_tokens_t& tokens = ts->get();
+
+ std::ostringstream os2;
+ std::string formula;
+ if (resolver)
+ {
+ ixion::abs_address_t pos(sheet_id, c.row, c.col);
+ pos = cell->get_parent_position(pos);
+ formula = ixion::print_formula_tokens(
+ cxt, pos, *resolver, tokens);
+ }
+ else
+ formula = "???";
+
+ ixion::formula_group_t fg = cell->get_group_properties();
+
+ if (fg.grouped)
+ os2 << '{' << formula << '}';
+ else
+ os2 << formula;
+
+ try
+ {
+ ixion::formula_result res = cell->get_result_cache(
+ ixion::formula_result_wait_policy_t::throw_exception);
+ os2 << " (" << res.str(cxt) << ")";
+ }
+ catch (const std::exception&)
+ {
+ os2 << "(#RES!)";
+ }
+
+ std::string s = os2.str();
+ cell_str_width = calc_logical_string_length(s);
+ mx[to_pos(c.row, c.col)] = std::move(s);
+ }
+ break;
+ }
+ default:
+ ;
+ }
+
+ if (*it_colwidth < cell_str_width)
+ *it_colwidth = cell_str_width;
+ }
+
+ // Create a row separator string;
+ std::ostringstream os2;
+ os2 << '+';
+ for (size_t i = 0; i < col_widths.size(); ++i)
+ {
+ os2 << '-';
+ size_t cw = col_widths[i];
+ for (size_t j = 0; j < cw; ++j)
+ os2 << '-';
+ os2 << "-+";
+ }
+
+ std::string sep = os2.str();
+
+ // Now print to stdout.
+ os << sep << endl;
+ for (size_t r = 0; r < row_count; ++r)
+ {
+ os << "|";
+ for (size_t c = 0; c < col_count; ++c)
+ {
+ size_t cw = col_widths[c]; // column width
+ const std::string& s = mx[to_pos(r, c)];
+ if (s.empty())
+ {
+ for (size_t i = 0; i < cw; ++i)
+ os << ' ';
+ os << " |";
+ }
+ else
+ {
+ os << ' ' << s;
+ cw -= calc_logical_string_length(s);
+ for (size_t i = 0; i < cw; ++i)
+ os << ' ';
+ os << " |";
+ }
+ }
+ os << endl;
+ os << sep << endl;
+ }
+}
+
+}}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/flat_dumper.hpp b/src/spreadsheet/flat_dumper.hpp
new file mode 100644
index 0000000..2a72938
--- /dev/null
+++ b/src/spreadsheet/flat_dumper.hpp
@@ -0,0 +1,36 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_SPREADSHEET_FLAT_DUMPER_HPP
+#define INCLUDED_ORCUS_SPREADSHEET_FLAT_DUMPER_HPP
+
+#include <string>
+#include <ostream>
+#include <ixion/types.hpp>
+
+namespace orcus { namespace spreadsheet {
+
+class document;
+
+namespace detail {
+
+class flat_dumper
+{
+ const document& m_doc;
+
+public:
+ flat_dumper(const document& doc);
+
+ void dump(std::ostream& os, ixion::sheet_t sheet_id) const;
+};
+
+}}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+
diff --git a/src/spreadsheet/formula_global.cpp b/src/spreadsheet/formula_global.cpp
new file mode 100644
index 0000000..a4d7c6d
--- /dev/null
+++ b/src/spreadsheet/formula_global.cpp
@@ -0,0 +1,56 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "formula_global.hpp"
+
+#include <ixion/address.hpp>
+#include <ixion/formula_name_resolver.hpp>
+
+namespace orcus { namespace spreadsheet {
+
+ixion::abs_range_t to_abs_range(
+ const ixion::formula_name_resolver& resolver, const char* p_ref, size_t n_ref)
+{
+ ixion::abs_range_t range(ixion::abs_range_t::invalid);
+ ixion::abs_address_t pos(0,0,0);
+
+ ixion::formula_name_t res = resolver.resolve({p_ref, n_ref}, pos);
+ switch (res.type)
+ {
+ case ixion::formula_name_t::cell_reference:
+ // Single cell reference.
+ range.first = std::get<ixion::address_t>(res.value).to_abs(pos);
+ range.last = range.first;
+ break;
+ case ixion::formula_name_t::range_reference:
+ // Range reference.
+ range = std::get<ixion::range_t>(res.value).to_abs(pos);
+ break;
+ default:
+ ; // Unsupported range. Leave it invalid.
+ }
+
+ return range;
+}
+
+ixion::abs_range_t to_abs_range(const range_t& range, sheet_t sheet_pos)
+{
+ ixion::abs_range_t ret;
+ ret.first.column = range.first.column;
+ ret.first.row = range.first.row;
+ ret.first.sheet = sheet_pos;
+
+ ret.last.column = range.last.column;
+ ret.last.row = range.last.row;
+ ret.last.sheet = sheet_pos;
+
+ return ret;
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/formula_global.hpp b/src/spreadsheet/formula_global.hpp
new file mode 100644
index 0000000..9f43a65
--- /dev/null
+++ b/src/spreadsheet/formula_global.hpp
@@ -0,0 +1,48 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_SPREADSHEET_FORMULA_GLOBAL_HPP
+#define INCLUDED_ORCUS_SPREADSHEET_FORMULA_GLOBAL_HPP
+
+#include "orcus/spreadsheet/types.hpp"
+
+#include <cstdlib>
+
+namespace ixion {
+
+struct abs_range_t;
+class formula_name_resolver;
+
+}
+
+namespace orcus { namespace spreadsheet {
+
+struct range_t;
+
+/**
+ * Parse a string representing a 2-dimensional range using the passed name
+ * resolver, and return an absolute range object. The sheet index will be
+ * unconditionally set to 0. It returns an invalid range object in case the
+ * parsing fails.
+ *
+ * @param resolver name resolver to use to resolve the range string.
+ * @param p_ref pointer to the first character of the range string.
+ * @param n_ref length of the range string.
+ *
+ * @return absolute range object, which may be set invalid in case the
+ * parsing is unsuccessful.
+ */
+ixion::abs_range_t to_abs_range(
+ const ixion::formula_name_resolver& resolver, const char* p_ref, size_t n_ref);
+
+ixion::abs_range_t to_abs_range(const range_t& range, sheet_t sheet_pos);
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/global_settings.cpp b/src/spreadsheet/global_settings.cpp
new file mode 100644
index 0000000..71778bd
--- /dev/null
+++ b/src/spreadsheet/global_settings.cpp
@@ -0,0 +1,50 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "global_settings.hpp"
+#include "orcus/spreadsheet/document.hpp"
+#include "orcus/spreadsheet/factory.hpp"
+
+namespace orcus { namespace spreadsheet {
+
+struct import_global_settings::impl
+{
+ import_factory& m_factory;
+ document& m_doc;
+
+ impl(import_factory& factory, document& doc) :
+ m_factory(factory), m_doc(doc) {}
+};
+
+import_global_settings::import_global_settings(import_factory& factory, document& doc) :
+ mp_impl(std::make_unique<impl>(factory, doc)) {}
+
+import_global_settings::~import_global_settings() {}
+
+void import_global_settings::set_origin_date(int year, int month, int day)
+{
+ mp_impl->m_doc.set_origin_date(year, month, day);
+}
+
+void import_global_settings::set_default_formula_grammar(formula_grammar_t grammar)
+{
+ mp_impl->m_doc.set_formula_grammar(grammar);
+}
+
+formula_grammar_t import_global_settings::get_default_formula_grammar() const
+{
+ return mp_impl->m_doc.get_formula_grammar();
+}
+
+void import_global_settings::set_character_set(character_set_t charset)
+{
+ mp_impl->m_factory.set_character_set(charset);
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/global_settings.hpp b/src/spreadsheet/global_settings.hpp
new file mode 100644
index 0000000..8213833
--- /dev/null
+++ b/src/spreadsheet/global_settings.hpp
@@ -0,0 +1,41 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_SPREADSHEET_GLOBAL_SETTINGS_HPP
+#define INCLUDED_ORCUS_SPREADSHEET_GLOBAL_SETTINGS_HPP
+
+#include "orcus/spreadsheet/import_interface.hpp"
+
+#include <memory>
+
+namespace orcus { namespace spreadsheet {
+
+class document;
+class import_factory;
+
+class import_global_settings : public spreadsheet::iface::import_global_settings
+{
+ struct impl;
+ std::unique_ptr<impl> mp_impl;
+
+public:
+ import_global_settings(import_factory& factory, document& doc);
+ virtual ~import_global_settings() override;
+
+ virtual void set_origin_date(int year, int month, int day) override;
+
+ virtual void set_default_formula_grammar(orcus::spreadsheet::formula_grammar_t grammar) override;
+
+ virtual orcus::spreadsheet::formula_grammar_t get_default_formula_grammar() const override;
+
+ virtual void set_character_set(character_set_t charset) override;
+};
+
+}}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/html_dumper.cpp b/src/spreadsheet/html_dumper.cpp
new file mode 100644
index 0000000..cdf04de
--- /dev/null
+++ b/src/spreadsheet/html_dumper.cpp
@@ -0,0 +1,695 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "html_dumper.hpp"
+#include "impl_types.hpp"
+#include "number_format.hpp"
+
+#include "orcus/spreadsheet/styles.hpp"
+#include "orcus/spreadsheet/shared_strings.hpp"
+#include "orcus/spreadsheet/document.hpp"
+#include "orcus/spreadsheet/sheet.hpp"
+
+#include <ixion/address.hpp>
+#include <ixion/model_context.hpp>
+#include <ixion/formula.hpp>
+#include <ixion/formula_result.hpp>
+#include <ixion/cell.hpp>
+
+#include <sstream>
+
+namespace orcus { namespace spreadsheet { namespace detail {
+
+namespace {
+
+void build_rgb_color(std::ostringstream& os, const color_t& color_value)
+{
+ // Special colors.
+ if (color_value.alpha == 255 && color_value.red == 0 && color_value.green == 0 && color_value.blue == 0)
+ {
+ os << "black";
+ return;
+ }
+
+ if (color_value.alpha == 255 && color_value.red == 255 && color_value.green == 0 && color_value.blue == 0)
+ {
+ os << "red";
+ return;
+ }
+
+ if (color_value.alpha == 255 && color_value.red == 0 && color_value.green == 255 && color_value.blue == 0)
+ {
+ os << "green";
+ return;
+ }
+
+ if (color_value.alpha == 255 && color_value.red == 0 && color_value.green == 0 && color_value.blue == 255)
+ {
+ os << "blue";
+ return;
+ }
+
+ os << "rgb("
+ << static_cast<short>(color_value.red) << ","
+ << static_cast<short>(color_value.green) << ","
+ << static_cast<short>(color_value.blue) << ")";
+}
+
+const char* css_style_global =
+"table, td { "
+ "border-collapse : collapse; "
+"}\n"
+
+"table { "
+ "border-spacing : 0px; "
+"}\n"
+
+"td { "
+ "width : 1in; border: 1px solid lightgray; "
+"}\n"
+
+"td.empty { "
+ "color : white; "
+"}\n";
+
+class html_elem
+{
+public:
+ struct attr
+ {
+ std::string name;
+ std::string value;
+
+ attr(const std::string& _name, const std::string& _value) : name(_name), value(_value) {}
+ };
+
+ typedef std::vector<attr> attrs_type;
+
+ html_elem(std::ostream& strm, const char* name, const char* style = nullptr, const char* style_class = nullptr) :
+ m_strm(strm), m_name(name)
+ {
+ m_strm << '<' << m_name;
+
+ if (style)
+ m_strm << " style=\"" << style << "\"";
+
+ if (style_class)
+ m_strm << " class=\"" << style_class << "\"";
+
+ m_strm << '>';
+ }
+
+ html_elem(std::ostream& strm, const char* name, const attrs_type& attrs) :
+ m_strm(strm), m_name(name)
+ {
+ m_strm << '<' << m_name;
+
+ attrs_type::const_iterator it = attrs.begin(), it_end = attrs.end();
+ for (; it != it_end; ++it)
+ m_strm << " " << it->name << "=\"" << it->value << "\"";
+
+ m_strm << '>';
+ }
+
+ ~html_elem()
+ {
+ m_strm << "</" << m_name << '>';
+ }
+
+private:
+ std::ostream& m_strm;
+ const char* m_name;
+};
+
+void print_formatted_text(std::ostream& strm, const std::string& text, const format_runs_t& formats)
+{
+ typedef html_elem elem;
+
+ const char* p_span = "span";
+
+ size_t pos = 0;
+ format_runs_t::const_iterator itr = formats.begin(), itr_end = formats.end();
+ for (; itr != itr_end; ++itr)
+ {
+ const format_run& run = *itr;
+ if (pos < run.pos)
+ {
+ // flush unformatted text.
+ strm << std::string(&text[pos], run.pos-pos);
+ pos = run.pos;
+ }
+
+ if (!run.size)
+ continue;
+
+ std::string style = "";
+ if (run.bold)
+ style += "font-weight: bold;";
+ else
+ style += "font-weight: normal;";
+
+ if (run.italic)
+ style += "font-style: italic;";
+ else
+ style += "font-style: normal;";
+
+ if (!run.font.empty())
+ {
+ style += "font-family: ";
+ style += run.font;
+ style += ";";
+ }
+
+ if (run.font_size)
+ {
+ std::ostringstream os;
+ os << "font-size: " << run.font_size << "pt;";
+ style += os.str();
+ }
+
+ const color_t& col = run.color;
+ if (col.red || col.green || col.blue)
+ {
+ std::ostringstream os;
+ os << "color: ";
+ build_rgb_color(os, col);
+ os << ";";
+ style += os.str();
+ }
+
+ if (style.empty())
+ strm << std::string(&text[pos], run.size);
+ else
+ {
+ elem span(strm, p_span, style.c_str());
+ strm << std::string(&text[pos], run.size);
+ }
+
+ pos += run.size;
+ }
+
+ if (pos < text.size())
+ {
+ // flush the remaining unformatted text.
+ strm << std::string(&text[pos], text.size() - pos);
+ }
+}
+
+void build_border_style(std::ostringstream& os, const char* style_name, const border_attrs_t& attrs)
+{
+ if (!attrs.style || *attrs.style == border_style_t::none)
+ return;
+
+ os << style_name << ": ";
+ switch (*attrs.style)
+ {
+ case border_style_t::thin:
+ {
+ os << "solid 1px ";
+ break;
+ }
+ case border_style_t::medium:
+ {
+ os << "solid 2px ";
+ break;
+ }
+ case border_style_t::thick:
+ {
+ os << "solid 3px ";
+ break;
+ }
+ case border_style_t::hair:
+ {
+ os << "solid 0.5px ";
+ break;
+ }
+ case border_style_t::dotted:
+ {
+ os << "dotted 1px ";
+ break;
+ }
+ case border_style_t::dashed:
+ {
+ os << "dashed 1px ";
+ break;
+ }
+ case border_style_t::double_border:
+ {
+ os << "3px double ";
+ break;
+ }
+ case border_style_t::dash_dot:
+ {
+ // CSS doesn't support dash-dot.
+ os << "dashed 1px ";
+ break;
+ }
+ case border_style_t::dash_dot_dot:
+ {
+ // CSS doesn't support dash-dot-dot.
+ os << "dashed 1px ";
+ break;
+ }
+ case border_style_t::medium_dashed:
+ {
+ os << "dashed 2px ";
+ break;
+ }
+ case border_style_t::medium_dash_dot:
+ {
+ // CSS doesn't support dash-dot.
+ os << "dashed 2px ";
+ break;
+ }
+ case border_style_t::medium_dash_dot_dot:
+ {
+ // CSS doesn't support dash-dot-dot.
+ os << "dashed 2px ";
+ break;
+ }
+ case border_style_t::slant_dash_dot:
+ {
+ // CSS doesn't support dash-dot.
+ os << "dashed 2px ";
+ break;
+ }
+ default:;
+ }
+
+ build_rgb_color(os, *attrs.border_color);
+ os << "; ";
+}
+
+void build_style_string(std::string& str, const styles& styles, const cell_format_t& fmt)
+{
+ std::ostringstream os;
+
+ {
+ const font_t* p = styles.get_font(fmt.font);
+ if (p)
+ {
+ if (p->name && !p->name.value().empty())
+ os << "font-family: " << *p->name << ";";
+ if (p->size)
+ os << "font-size: " << *p->size << "pt;";
+ if (p->bold && *p->bold)
+ os << "font-weight: bold;";
+ if (p->italic && *p->italic)
+ os << "font-style: italic;";
+
+ if (p->color)
+ {
+ const color_t& r = *p->color;
+ if (r.red || r.green || r.blue)
+ {
+ os << "color: ";
+ build_rgb_color(os, r);
+ os << ";";
+ }
+ }
+ }
+ }
+
+ {
+ const fill_t* p = styles.get_fill(fmt.fill);
+ if (p)
+ {
+ if (p->pattern_type && *p->pattern_type == fill_pattern_t::solid && p->fg_color)
+ {
+ const color_t& r = *p->fg_color;
+ os << "background-color: ";
+ build_rgb_color(os, r);
+ os << ";";
+ }
+ }
+ }
+
+ {
+ const border_t* p = styles.get_border(fmt.border);
+ if (p)
+ {
+ build_border_style(os, "border-top", p->top);
+ build_border_style(os, "border-bottom", p->bottom);
+ build_border_style(os, "border-left", p->left);
+ build_border_style(os, "border-right", p->right);
+ }
+ }
+
+ if (fmt.apply_alignment)
+ {
+ if (fmt.hor_align != hor_alignment_t::unknown)
+ {
+ os << "text-align: ";
+ switch (fmt.hor_align)
+ {
+ case hor_alignment_t::left:
+ os << "left";
+ break;
+ case hor_alignment_t::center:
+ os << "center";
+ break;
+ case hor_alignment_t::right:
+ os << "right";
+ break;
+ default:
+ ;
+ }
+ os << ";";
+ }
+
+ if (fmt.ver_align != ver_alignment_t::unknown)
+ {
+ os << "vertical-align: ";
+ switch (fmt.ver_align)
+ {
+ case ver_alignment_t::top:
+ os << "top";
+ break;
+ case ver_alignment_t::middle:
+ os << "middle";
+ break;
+ case ver_alignment_t::bottom:
+ os << "bottom";
+ break;
+ default:
+ ;
+ }
+ os << ";";
+ }
+ }
+
+ str += os.str();
+}
+
+void dump_html_head(std::ostream& os)
+{
+ typedef html_elem elem;
+
+ const char* p_head = "head";
+ const char* p_style = "style";
+
+ elem elem_head(os, p_head);
+ {
+ elem elem_style(os, p_style);
+ os << css_style_global;
+ }
+}
+
+void build_html_elem_attributes(html_elem::attrs_type& attrs, const std::string& style, const merge_size* p_merge_size)
+{
+ attrs.push_back(html_elem::attr("style", style));
+ if (p_merge_size)
+ {
+ if (p_merge_size->width > 1)
+ {
+ std::ostringstream os2;
+ os2 << p_merge_size->width;
+ attrs.push_back(html_elem::attr("colspan", os2.str()));
+ }
+
+ if (p_merge_size->height > 1)
+ {
+ std::ostringstream os2;
+ os2 << p_merge_size->height;
+ attrs.push_back(html_elem::attr("rowspan", os2.str()));
+ }
+ }
+}
+
+}
+
+html_dumper::html_dumper(
+ const document& doc,
+ const col_merge_size_type& merge_ranges,
+ sheet_t sheet_id) :
+ m_doc(doc),
+ m_merge_ranges(merge_ranges),
+ m_sheet_id(sheet_id)
+{
+ build_overlapped_ranges();
+}
+
+void html_dumper::dump(std::ostream& os) const
+{
+ const sheet* sh = m_doc.get_sheet(m_sheet_id);
+ if (!sh)
+ return;
+
+ typedef html_elem elem;
+
+ const char* p_html = "html";
+ const char* p_body = "body";
+ const char* p_table = "table";
+ const char* p_tr = "tr";
+ const char* p_td = "td";
+
+ ixion::abs_range_t range = sh->get_data_range();
+
+ elem root(os, p_html);
+ dump_html_head(os);
+
+ {
+ elem elem_body(os, p_body);
+
+ if (!range.valid())
+ // Sheet is empty. Nothing to print.
+ return;
+
+ const ixion::model_context& cxt = m_doc.get_model_context();
+ const ixion::formula_name_resolver* resolver =
+ m_doc.get_formula_name_resolver(spreadsheet::formula_ref_context_t::global);
+ const shared_strings& sstrings = m_doc.get_shared_strings();
+
+ elem table(os, p_table);
+
+ row_t row_count = range.last.row + 1;
+ col_t col_count = range.last.column + 1;
+ for (row_t row = 0; row < row_count; ++row)
+ {
+ // Set the row height.
+ std::string row_style;
+ row_height_t rh = sh->get_row_height(row, nullptr, nullptr);
+
+ // Convert height from twip to inches.
+ if (rh != get_default_row_height())
+ {
+ std::string style;
+ double val = orcus::convert(rh, length_unit_t::twip, length_unit_t::inch);
+ std::ostringstream os_style;
+ os_style << "height: " << val << "in;";
+ row_style += os_style.str();
+ }
+
+ const char* style_str = nullptr;
+ if (!row_style.empty())
+ style_str = row_style.c_str();
+ elem tr(os, p_tr, style_str);
+
+ const detail::overlapped_col_index_type* p_overlapped = get_overlapped_ranges(row);
+
+ for (col_t col = 0; col < col_count; ++col)
+ {
+ ixion::abs_address_t pos(m_sheet_id, row, col);
+
+ const merge_size* p_merge_size = get_merge_size(row, col);
+ if (!p_merge_size && p_overlapped)
+ {
+ // Check if this cell is overlapped by a merged cell.
+ col_t overlapped_origin = -1;
+ col_t last_col = -1;
+ if (p_overlapped->search_tree(col, overlapped_origin, nullptr, &last_col).second && overlapped_origin >= 0)
+ {
+ // Skip all overlapped cells on this row.
+ col = last_col - 1;
+ continue;
+ }
+ }
+ size_t xf_id = sh->get_cell_format(row, col);
+ std::string style;
+
+ if (row == 0)
+ {
+ // Set the column width.
+ col_width_t cw = sh->get_col_width(col, nullptr, nullptr);
+
+ // Convert width from twip to inches.
+ if (cw != get_default_column_width())
+ {
+ double val = orcus::convert(cw, length_unit_t::twip, length_unit_t::inch);
+ std::ostringstream os_style;
+ os_style << "width: " << val << "in;";
+ style += os_style.str();
+ }
+ }
+
+ {
+ // Apply cell format.
+ const styles& styles = m_doc.get_styles();
+ const cell_format_t* fmt = styles.get_cell_format(xf_id);
+ if (fmt)
+ build_style_string(style, styles, *fmt);
+ }
+
+ ixion::celltype_t ct = cxt.get_celltype(pos);
+ if (ct == ixion::celltype_t::empty)
+ {
+ html_elem::attrs_type attrs;
+ build_html_elem_attributes(attrs, style, p_merge_size);
+ attrs.push_back(html_elem::attr("class", "empty"));
+ elem td(os, p_td, attrs);
+ os << '-'; // empty cell.
+ continue;
+ }
+
+ html_elem::attrs_type attrs;
+ build_html_elem_attributes(attrs, style, p_merge_size);
+ elem td(os, p_td, attrs);
+
+ switch (ct)
+ {
+ case ixion::celltype_t::string:
+ {
+ size_t sindex = cxt.get_string_identifier(pos);
+ const std::string* p = cxt.get_string(sindex);
+ assert(p);
+ const format_runs_t* pformat = sstrings.get_format_runs(sindex);
+ if (pformat)
+ print_formatted_text(os, *p, *pformat);
+ else
+ os << *p;
+
+ break;
+ }
+ case ixion::celltype_t::numeric:
+ format_to_file_output(os, cxt.get_numeric_value(pos));
+ break;
+ case ixion::celltype_t::boolean:
+ os << (cxt.get_boolean_value(pos) ? "true" : "false");
+ break;
+ case ixion::celltype_t::formula:
+ {
+ // print the formula and the formula result.
+ const ixion::formula_cell* cell = cxt.get_formula_cell(pos);
+ assert(cell);
+ const ixion::formula_tokens_store_ptr_t& ts = cell->get_tokens();
+ if (ts)
+ {
+ const ixion::formula_tokens_t& tokens = ts->get();
+
+ std::string formula;
+ if (resolver)
+ {
+ pos = cell->get_parent_position(pos);
+ formula = ixion::print_formula_tokens(
+ m_doc.get_model_context(), pos, *resolver, tokens);
+ }
+ else
+ formula = "???";
+
+ ixion::formula_group_t fg = cell->get_group_properties();
+
+ if (fg.grouped)
+ os << '{' << formula << '}';
+ else
+ os << formula;
+
+ try
+ {
+ ixion::formula_result res = cell->get_result_cache(
+ ixion::formula_result_wait_policy_t::throw_exception);
+ os << " (" << res.str(m_doc.get_model_context()) << ")";
+ }
+ catch (const std::exception&)
+ {
+ os << " (#RES!)";
+ }
+ }
+
+ break;
+ }
+ default:
+ ;
+ }
+ }
+ }
+ }
+}
+
+const overlapped_col_index_type* html_dumper::get_overlapped_ranges(row_t row) const
+{
+ overlapped_cells_type::const_iterator it = m_overlapped_ranges.find(row);
+ if (it == m_overlapped_ranges.end())
+ return nullptr;
+
+ return it->second.get();
+}
+
+const merge_size* html_dumper::get_merge_size(row_t row, col_t col) const
+{
+ col_merge_size_type::const_iterator it_col = m_merge_ranges.find(col);
+ if (it_col == m_merge_ranges.end())
+ return nullptr;
+
+ merge_size_type& col_merge_sizes = *it_col->second;
+ merge_size_type::const_iterator it_row = col_merge_sizes.find(row);
+ if (it_row == col_merge_sizes.end())
+ return nullptr;
+
+ return &it_row->second;
+}
+
+void html_dumper::build_overlapped_ranges()
+{
+ const sheet* sh = m_doc.get_sheet(m_sheet_id);
+ if (!sh)
+ return;
+
+ range_size_t sheet_size = m_doc.get_sheet_size();
+
+ detail::col_merge_size_type::const_iterator it_col = m_merge_ranges.begin(), it_col_end = m_merge_ranges.end();
+ for (; it_col != it_col_end; ++it_col)
+ {
+ col_t col = it_col->first;
+ const detail::merge_size_type& data = *it_col->second;
+ detail::merge_size_type::const_iterator it = data.begin(), it_end = data.end();
+ for (; it != it_end; ++it)
+ {
+ row_t row = it->first;
+ const detail::merge_size& item = it->second;
+ for (row_t i = 0; i < item.height; ++i, ++row)
+ {
+ // Get the container for this row.
+ detail::overlapped_cells_type::iterator it_cont = m_overlapped_ranges.find(row);
+ if (it_cont == m_overlapped_ranges.end())
+ {
+ auto p = std::make_unique<detail::overlapped_col_index_type>(0, sheet_size.columns, -1);
+ std::pair<detail::overlapped_cells_type::iterator, bool> r =
+ m_overlapped_ranges.insert(detail::overlapped_cells_type::value_type(row, std::move(p)));
+
+ if (!r.second)
+ {
+ // Insertion failed.
+ return;
+ }
+
+ it_cont = r.first;
+ }
+
+ detail::overlapped_col_index_type& cont = *it_cont->second;
+ cont.insert_back(col, col+item.width, col);
+ }
+ }
+ }
+
+ // Build trees.
+ for (auto& range : m_overlapped_ranges)
+ range.second->build_tree();
+}
+
+}}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/html_dumper.hpp b/src/spreadsheet/html_dumper.hpp
new file mode 100644
index 0000000..4e66809
--- /dev/null
+++ b/src/spreadsheet/html_dumper.hpp
@@ -0,0 +1,49 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_SPREADSHEET_HTML_DUMPER_HPP
+#define INCLUDED_ORCUS_SPREADSHEET_HTML_DUMPER_HPP
+
+#include <string>
+#include <ostream>
+#include <ixion/types.hpp>
+
+#include "impl_types.hpp"
+
+namespace orcus { namespace spreadsheet {
+
+class document;
+
+namespace detail {
+
+class html_dumper
+{
+ const document& m_doc;
+ overlapped_cells_type m_overlapped_ranges;
+ const col_merge_size_type& m_merge_ranges;
+ sheet_t m_sheet_id;
+
+ const overlapped_col_index_type* get_overlapped_ranges(row_t row) const;
+ const merge_size* get_merge_size(row_t row, col_t col) const;
+
+ void build_overlapped_ranges();
+
+public:
+ html_dumper(
+ const document& doc,
+ const col_merge_size_type& merge_ranges,
+ sheet_t sheet_id);
+
+ void dump(std::ostream& os) const;
+};
+
+}}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+
diff --git a/src/spreadsheet/impl_types.hpp b/src/spreadsheet/impl_types.hpp
new file mode 100644
index 0000000..bed30db
--- /dev/null
+++ b/src/spreadsheet/impl_types.hpp
@@ -0,0 +1,40 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_SPREADSHEET_DETAIL_IMPL_TYPES_HPP
+#define INCLUDED_ORCUS_SPREADSHEET_DETAIL_IMPL_TYPES_HPP
+
+#include "orcus/spreadsheet/types.hpp"
+
+#include <mdds/flat_segment_tree.hpp>
+#include <unordered_map>
+#include <memory>
+
+namespace orcus { namespace spreadsheet { namespace detail {
+
+struct merge_size
+{
+ col_t width;
+ row_t height;
+
+ merge_size(col_t _width, row_t _height) :
+ width(_width), height(_height) {}
+};
+
+// Merged cell data stored in sheet.
+typedef std::unordered_map<row_t, detail::merge_size> merge_size_type;
+typedef std::unordered_map<col_t, std::unique_ptr<merge_size_type>> col_merge_size_type;
+
+// Overlapped cells per row, used when rendering sheet content.
+typedef mdds::flat_segment_tree<col_t, col_t> overlapped_col_index_type;
+typedef std::unordered_map<row_t, std::unique_ptr<overlapped_col_index_type>> overlapped_cells_type;
+
+}}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/json_dumper.cpp b/src/spreadsheet/json_dumper.cpp
new file mode 100644
index 0000000..3fe6184
--- /dev/null
+++ b/src/spreadsheet/json_dumper.cpp
@@ -0,0 +1,95 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "json_dumper.hpp"
+#include "dumper_global.hpp"
+
+#include "orcus/json_global.hpp"
+#include "orcus/spreadsheet/document.hpp"
+
+#include <ixion/model_context.hpp>
+#include <ixion/formula_name_resolver.hpp>
+
+#include <fstream>
+#include <sstream>
+#include <iostream>
+
+namespace orcus { namespace spreadsheet { namespace detail {
+
+json_dumper::json_dumper(const document& doc) : m_doc(doc) {}
+
+void json_dumper::dump(std::ostream& os, ixion::sheet_t sheet_id) const
+{
+ const ixion::model_context& cxt = m_doc.get_model_context();
+ ixion::abs_range_t data_range = cxt.get_data_range(sheet_id);
+ if (!data_range.valid())
+ return;
+
+ ixion::abs_rc_range_t iter_range;
+ iter_range.first.column = 0;
+ iter_range.first.row = 0;
+ iter_range.last.column = data_range.last.column;
+ iter_range.last.row = data_range.last.row;
+
+ auto iter = cxt.get_model_iterator(
+ sheet_id, ixion::rc_direction_t::horizontal, iter_range);
+
+ std::vector<std::string> column_labels;
+ column_labels.reserve(data_range.last.column+1);
+
+ // Get the column labels.
+ auto resolver = ixion::formula_name_resolver::get(ixion::formula_name_resolver_t::excel_a1, &cxt);
+ for (ixion::col_t i = 0; i <= data_range.last.column; ++i)
+ column_labels.emplace_back(resolver->get_column_name(i));
+
+ os << "[" << std::endl;
+
+ ixion::row_t row = iter.get().row;
+ ixion::col_t col = iter.get().col;
+ assert(row == 0);
+ assert(col == 0);
+
+ os << " {";
+ os << "\"" << column_labels[col] << "\": ";
+
+ func_str_handler str_handler = [](std::ostream& _os, const std::string& s)
+ {
+ _os << '"' << json::escape_string(s) << '"';
+ };
+
+ func_empty_handler empty_handler = [](std::ostream& _os) { _os << "null"; };
+
+ dump_cell_value(os, cxt, iter.get(), str_handler, empty_handler);
+
+ ixion::row_t last_row = row;
+
+ for (iter.next(); iter.has(); iter.next())
+ {
+ const auto& cell = iter.get();
+ ixion::row_t this_row = cell.row;
+ ixion::col_t this_col = cell.col;
+
+ if (this_row > last_row)
+ os << "}," << std::endl;
+
+ if (this_col == 0)
+ os << " {";
+ else
+ os << ", ";
+
+ os << "\"" << column_labels.at(this_col) << "\": ";
+
+ dump_cell_value(os, cxt, cell, str_handler, empty_handler);
+ last_row = this_row;
+ }
+
+ os << "}" << std::endl << "]" << std::endl;
+}
+
+}}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/json_dumper.hpp b/src/spreadsheet/json_dumper.hpp
new file mode 100644
index 0000000..a695091
--- /dev/null
+++ b/src/spreadsheet/json_dumper.hpp
@@ -0,0 +1,36 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_JSON_DUMPER_HPP
+#define INCLUDED_ORCUS_JSON_DUMPER_HPP
+
+#include <string>
+#include <ostream>
+
+#include <ixion/types.hpp>
+
+namespace orcus { namespace spreadsheet {
+
+class document;
+
+namespace detail {
+
+class json_dumper
+{
+ const document& m_doc;
+
+public:
+ json_dumper(const document& doc);
+
+ void dump(std::ostream& os, ixion::sheet_t sheet_id) const;
+};
+
+}}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/number_format.cpp b/src/spreadsheet/number_format.cpp
new file mode 100644
index 0000000..1823ef0
--- /dev/null
+++ b/src/spreadsheet/number_format.cpp
@@ -0,0 +1,25 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "number_format.hpp"
+#include "ostream_utils.hpp"
+
+#include <ostream>
+#include <iomanip>
+#include <limits>
+
+namespace orcus { namespace spreadsheet { namespace detail {
+
+void format_to_file_output(std::ostream& os, double v)
+{
+ ::orcus::detail::ostream_format_guard guard(os);
+ os << std::setprecision(std::numeric_limits<double>::digits10 + 1) << v;
+}
+
+}}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/number_format.hpp b/src/spreadsheet/number_format.hpp
new file mode 100644
index 0000000..ea18847
--- /dev/null
+++ b/src/spreadsheet/number_format.hpp
@@ -0,0 +1,28 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_SPREADSHEET_NUMBER_FORMAT_HPP
+#define INCLUDED_ORCUS_SPREADSHEET_NUMBER_FORMAT_HPP
+
+#include <iosfwd>
+
+namespace orcus { namespace spreadsheet { namespace detail {
+
+/**
+ * Format a numeric value to a lossless string representation appripriate
+ * for file output.
+ *
+ * @param os output stream to add the string representation to.
+ * @param v source numeric value to format.
+ */
+void format_to_file_output(std::ostream& os, double v);
+
+}}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/pivot.cpp b/src/spreadsheet/pivot.cpp
new file mode 100644
index 0000000..4bc21ee
--- /dev/null
+++ b/src/spreadsheet/pivot.cpp
@@ -0,0 +1,371 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/spreadsheet/pivot.hpp"
+#include "orcus/spreadsheet/document.hpp"
+#include "orcus/string_pool.hpp"
+
+#include <ixion/address.hpp>
+
+#include <unordered_map>
+#include <cassert>
+#include <sstream>
+
+namespace orcus { namespace spreadsheet {
+
+pivot_cache_record_value_t::pivot_cache_record_value_t() :
+ type(record_type::unknown), value(false) {}
+
+pivot_cache_record_value_t::pivot_cache_record_value_t(std::string_view s) :
+ type(record_type::character), value(s)
+{
+}
+
+pivot_cache_record_value_t::pivot_cache_record_value_t(double v) :
+ type(record_type::numeric), value(v)
+{
+}
+
+pivot_cache_record_value_t::pivot_cache_record_value_t(size_t index) :
+ type(record_type::shared_item_index), value(index)
+{
+}
+
+bool pivot_cache_record_value_t::operator== (const pivot_cache_record_value_t& other) const
+{
+ return type == other.type && value == other.value;
+}
+
+bool pivot_cache_record_value_t::operator!= (const pivot_cache_record_value_t& other) const
+{
+ return !operator==(other);
+}
+
+pivot_cache_item_t::pivot_cache_item_t() : type(item_type::unknown) {}
+
+pivot_cache_item_t::pivot_cache_item_t(std::string_view s) :
+ type(item_type::character), value(s)
+{
+}
+
+pivot_cache_item_t::pivot_cache_item_t(double numeric) :
+ type(item_type::numeric), value(numeric)
+{
+}
+
+pivot_cache_item_t::pivot_cache_item_t(bool boolean) :
+ type(item_type::boolean), value(boolean)
+{
+}
+
+pivot_cache_item_t::pivot_cache_item_t(const date_time_t& date_time) :
+ type(item_type::date_time), value(date_time)
+{
+}
+
+pivot_cache_item_t::pivot_cache_item_t(error_value_t error) :
+ type(item_type::error), value(error)
+{
+}
+
+pivot_cache_item_t::pivot_cache_item_t(const pivot_cache_item_t& other) :
+ type(other.type), value(other.value)
+{
+}
+
+pivot_cache_item_t::pivot_cache_item_t(pivot_cache_item_t&& other) :
+ type(other.type), value(std::move(other.value))
+{
+ other.type = item_type::unknown;
+ other.value = false;
+}
+
+bool pivot_cache_item_t::operator< (const pivot_cache_item_t& other) const
+{
+ if (type != other.type)
+ return type < other.type;
+
+ return value < other.value;
+}
+
+bool pivot_cache_item_t::operator== (const pivot_cache_item_t& other) const
+{
+ return type == other.type && value == other.value;
+}
+
+pivot_cache_item_t& pivot_cache_item_t::operator= (pivot_cache_item_t other)
+{
+ swap(other);
+ return *this;
+}
+
+void pivot_cache_item_t::swap(pivot_cache_item_t& other)
+{
+ std::swap(type, other.type);
+ std::swap(value, other.value);
+}
+
+pivot_cache_group_data_t::pivot_cache_group_data_t(size_t _base_field) :
+ base_field(_base_field) {}
+
+pivot_cache_group_data_t::pivot_cache_group_data_t(const pivot_cache_group_data_t& other) :
+ base_to_group_indices(other.base_to_group_indices),
+ range_grouping(other.range_grouping),
+ items(other.items),
+ base_field(other.base_field) {}
+
+pivot_cache_group_data_t::pivot_cache_group_data_t(pivot_cache_group_data_t&& other) :
+ base_to_group_indices(std::move(other.base_to_group_indices)),
+ range_grouping(std::move(other.range_grouping)),
+ items(std::move(other.items)),
+ base_field(other.base_field) {}
+
+pivot_cache_field_t::pivot_cache_field_t() {}
+
+pivot_cache_field_t::pivot_cache_field_t(std::string_view _name) : name(_name) {}
+
+pivot_cache_field_t::pivot_cache_field_t(const pivot_cache_field_t& other) :
+ name(other.name),
+ items(other.items),
+ min_value(other.min_value),
+ max_value(other.max_value),
+ min_date(other.min_date),
+ max_date(other.max_date),
+ group_data(std::make_unique<pivot_cache_group_data_t>(*other.group_data)) {}
+
+pivot_cache_field_t::pivot_cache_field_t(pivot_cache_field_t&& other) :
+ name(other.name),
+ items(std::move(other.items)),
+ min_value(std::move(other.min_value)),
+ max_value(std::move(other.max_value)),
+ min_date(std::move(other.min_date)),
+ max_date(std::move(other.max_date)),
+ group_data(std::move(other.group_data))
+{
+ other.name = std::string_view{};
+}
+
+struct pivot_cache::impl
+{
+ pivot_cache_id_t m_cache_id;
+
+ string_pool& m_string_pool;
+
+ std::string_view m_src_sheet_name;
+
+ pivot_cache::fields_type m_fields;
+
+ pivot_cache::records_type m_records;
+
+ impl(pivot_cache_id_t cache_id, string_pool& sp) :
+ m_cache_id(cache_id), m_string_pool(sp) {}
+};
+
+pivot_cache::pivot_cache(pivot_cache_id_t cache_id, string_pool& sp) :
+ mp_impl(std::make_unique<impl>(cache_id, sp)) {}
+
+pivot_cache::~pivot_cache() {}
+
+void pivot_cache::insert_fields(fields_type fields)
+{
+ mp_impl->m_fields = std::move(fields);
+}
+
+void pivot_cache::insert_records(records_type records)
+{
+ mp_impl->m_records = std::move(records);
+}
+
+size_t pivot_cache::get_field_count() const
+{
+ return mp_impl->m_fields.size();
+}
+
+const pivot_cache_field_t* pivot_cache::get_field(size_t index) const
+{
+ return index < mp_impl->m_fields.size() ? &mp_impl->m_fields[index] : nullptr;
+}
+
+pivot_cache_id_t pivot_cache::get_id() const
+{
+ return mp_impl->m_cache_id;
+}
+
+const pivot_cache::records_type& pivot_cache::get_all_records() const
+{
+ return mp_impl->m_records;
+}
+
+namespace {
+
+constexpr const ixion::sheet_t ignored_sheet = -1;
+
+struct worksheet_range
+{
+ std::string_view sheet; /// it must be an interned string with the document.
+ ixion::abs_range_t range; /// sheet indices are ignored.
+
+ worksheet_range(std::string_view _sheet, ixion::abs_range_t _range) :
+ sheet(std::move(_sheet)), range(std::move(_range))
+ {
+ range.first.sheet = ignored_sheet;
+ range.last.sheet = ignored_sheet;
+ }
+
+ bool operator== (const worksheet_range& other) const
+ {
+ return sheet == other.sheet && range == other.range;
+ }
+
+ struct hash
+ {
+ std::hash<std::string_view> ps_hasher;
+ ixion::abs_range_t::hash range_hasher;
+
+ size_t operator() (const worksheet_range& v) const
+ {
+ assert(v.range.first.sheet == ignored_sheet);
+ assert(v.range.last.sheet == ignored_sheet);
+
+ size_t n = ps_hasher(v.sheet);
+ n ^= range_hasher(v.range);
+ return n;
+ }
+ };
+};
+
+using range_map_type = std::unordered_map<worksheet_range, std::unordered_set<pivot_cache_id_t>, worksheet_range::hash>;
+using name_map_type = std::unordered_map<std::string_view, std::unordered_set<pivot_cache_id_t>>;
+
+using caches_type = std::unordered_map<pivot_cache_id_t, std::unique_ptr<pivot_cache>>;
+
+}
+
+struct pivot_collection::impl
+{
+ document& m_doc;
+
+ range_map_type m_worksheet_range_map; /// mapping of sheet name & range pair to cache ID.
+ name_map_type m_table_map; /// mapping of table name to cache ID.
+
+ caches_type m_caches;
+
+ impl(document& doc) : m_doc(doc) {}
+
+ void ensure_unique_cache(pivot_cache_id_t cache_id)
+ {
+ if (m_caches.count(cache_id) > 0)
+ {
+ std::ostringstream os;
+ os << "Pivot cache with the ID of " << cache_id << " already exists.";
+ throw std::invalid_argument(os.str());
+ }
+ }
+};
+
+pivot_collection::pivot_collection(document& doc) : mp_impl(std::make_unique<impl>(doc)) {}
+
+pivot_collection::~pivot_collection() {}
+
+void pivot_collection::insert_worksheet_cache(
+ std::string_view sheet_name, const ixion::abs_range_t& range,
+ std::unique_ptr<pivot_cache>&& cache)
+{
+ // First, ensure that no caches exist for the cache ID.
+ pivot_cache_id_t cache_id = cache->get_id();
+ mp_impl->ensure_unique_cache(cache_id);
+
+ // Check and see if there is already a cache for this location. If yes,
+ // overwrite the existing cache.
+ mp_impl->m_caches[cache_id] = std::move(cache);
+
+ worksheet_range key(sheet_name, range);
+
+ range_map_type& range_map = mp_impl->m_worksheet_range_map;
+ auto it = range_map.find(key);
+
+ if (it == range_map.end())
+ {
+ // sheet name must be interned with the document it belongs to.
+ key.sheet = mp_impl->m_doc.get_string_pool().intern(key.sheet).first;
+ range_map.insert(range_map_type::value_type(std::move(key), {cache_id}));
+ return;
+ }
+
+ auto& id_set = it->second;
+ id_set.insert(cache_id);
+}
+
+void pivot_collection::insert_worksheet_cache(
+ std::string_view table_name, std::unique_ptr<pivot_cache>&& cache)
+{
+ // First, ensure that no caches exist for the cache ID.
+ pivot_cache_id_t cache_id = cache->get_id();
+ mp_impl->ensure_unique_cache(cache_id);
+
+ mp_impl->m_caches[cache_id] = std::move(cache);
+
+ name_map_type& name_map = mp_impl->m_table_map;
+ auto it = name_map.find(table_name);
+
+ if (it == name_map.end())
+ {
+ // First cache to be associated with this name.
+ std::string_view table_name_interned =
+ mp_impl->m_doc.get_string_pool().intern(table_name).first;
+ name_map.insert(name_map_type::value_type(table_name_interned, {cache_id}));
+ return;
+ }
+
+ auto& id_set = it->second;
+ id_set.insert(cache_id);
+}
+
+size_t pivot_collection::get_cache_count() const
+{
+ return mp_impl->m_caches.size();
+}
+
+const pivot_cache* pivot_collection::get_cache(
+ std::string_view sheet_name, const ixion::abs_range_t& range) const
+{
+ worksheet_range wr(sheet_name, range);
+
+ auto it = mp_impl->m_worksheet_range_map.find(wr);
+ if (it == mp_impl->m_worksheet_range_map.end())
+ return nullptr;
+
+ // Pick the first cache ID.
+ assert(!it->second.empty());
+ pivot_cache_id_t cache_id = *it->second.cbegin();
+ return mp_impl->m_caches[cache_id].get();
+}
+
+namespace {
+
+template<typename _CachesT, typename _CacheT>
+_CacheT* get_cache_impl(_CachesT& caches, pivot_cache_id_t cache_id)
+{
+ auto it = caches.find(cache_id);
+ return it == caches.end() ? nullptr : it->second.get();
+}
+
+}
+
+pivot_cache* pivot_collection::get_cache(pivot_cache_id_t cache_id)
+{
+ return get_cache_impl<caches_type, pivot_cache>(mp_impl->m_caches, cache_id);
+}
+
+const pivot_cache* pivot_collection::get_cache(pivot_cache_id_t cache_id) const
+{
+ return get_cache_impl<const caches_type, const pivot_cache>(mp_impl->m_caches, cache_id);
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/shared_formula.cpp b/src/spreadsheet/shared_formula.cpp
new file mode 100644
index 0000000..e17a0ee
--- /dev/null
+++ b/src/spreadsheet/shared_formula.cpp
@@ -0,0 +1,32 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "shared_formula.hpp"
+
+namespace orcus { namespace spreadsheet {
+
+shared_formula_pool::shared_formula_pool() {}
+shared_formula_pool::~shared_formula_pool() {}
+
+void shared_formula_pool::add(
+ size_t sf_index, const ixion::formula_tokens_store_ptr_t& sf_tokens)
+{
+ m_store.emplace(sf_index, sf_tokens);
+}
+
+ixion::formula_tokens_store_ptr_t shared_formula_pool::get(size_t sf_index) const
+{
+ auto it = m_store.find(sf_index);
+ if (it == m_store.end())
+ return ixion::formula_tokens_store_ptr_t();
+
+ return it->second;
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/shared_formula.hpp b/src/spreadsheet/shared_formula.hpp
new file mode 100644
index 0000000..a72c9f3
--- /dev/null
+++ b/src/spreadsheet/shared_formula.hpp
@@ -0,0 +1,36 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_SPREADSHEET_SHARED_FORMULA_HPP
+#define INCLUDED_ORCUS_SPREADSHEET_SHARED_FORMULA_HPP
+
+#include <ixion/formula_tokens.hpp>
+
+#include <unordered_map>
+
+namespace orcus { namespace spreadsheet {
+
+class shared_formula_pool
+{
+ using store_type = std::unordered_map<size_t, ixion::formula_tokens_store_ptr_t>;
+
+ store_type m_store;
+
+public:
+ shared_formula_pool();
+ ~shared_formula_pool();
+
+ void add(size_t sf_index, const ixion::formula_tokens_store_ptr_t& sf_tokens);
+
+ ixion::formula_tokens_store_ptr_t get(size_t sf_index) const;
+};
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/shared_strings.cpp b/src/spreadsheet/shared_strings.cpp
new file mode 100644
index 0000000..f133e50
--- /dev/null
+++ b/src/spreadsheet/shared_strings.cpp
@@ -0,0 +1,61 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <orcus/spreadsheet/shared_strings.hpp>
+#include <ixion/model_context.hpp>
+
+#include <iostream>
+#include <algorithm>
+#include <unordered_map>
+
+namespace orcus { namespace spreadsheet {
+
+// format runs for all shared strings, mapped by string IDs.
+using format_runs_map_type = std::unordered_map<size_t, std::unique_ptr<format_runs_t>>;
+
+struct shared_strings::impl
+{
+ ixion::model_context& context;
+
+ /**
+ * Container for all format runs of all formatted strings. Format runs
+ * are mapped with the string IDs.
+ */
+ format_runs_map_type formats;
+
+ impl(ixion::model_context& cxt) : context(cxt) {}
+};
+
+shared_strings::shared_strings(ixion::model_context& cxt) : mp_impl(std::make_unique<impl>(cxt)) {}
+
+shared_strings::~shared_strings() = default;
+
+void shared_strings::set_format_runs(std::size_t sindex, std::unique_ptr<format_runs_t> runs)
+{
+ mp_impl->formats.insert_or_assign(sindex, std::move(runs));
+}
+
+const format_runs_t* shared_strings::get_format_runs(std::size_t index) const
+{
+ auto it = mp_impl->formats.find(index);
+ if (it != mp_impl->formats.end())
+ return it->second.get();
+ return nullptr;
+}
+
+const std::string* shared_strings::get_string(std::size_t index) const
+{
+ return mp_impl->context.get_string(index);
+}
+
+void shared_strings::dump(std::ostream& os) const
+{
+ os << "number of shared strings: " << mp_impl->context.get_string_count() << std::endl;
+}
+
+}}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/sheet.cpp b/src/spreadsheet/sheet.cpp
new file mode 100644
index 0000000..4ffa8df
--- /dev/null
+++ b/src/spreadsheet/sheet.cpp
@@ -0,0 +1,555 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/spreadsheet/sheet.hpp"
+#include "orcus/spreadsheet/document.hpp"
+#include "orcus/exception.hpp"
+
+#include "json_dumper.hpp"
+#include "check_dumper.hpp"
+#include "csv_dumper.hpp"
+#include "flat_dumper.hpp"
+#include "html_dumper.hpp"
+#include "sheet_impl.hpp"
+#include "debug_state_dumper.hpp"
+
+#include <iostream>
+#include <algorithm>
+#include <vector>
+#include <cassert>
+#include <cstdlib>
+
+#include <ixion/exceptions.hpp>
+#include <ixion/formula.hpp>
+#include <ixion/model_context.hpp>
+
+#include <boost/date_time/posix_time/posix_time.hpp>
+#include <boost/date_time/gregorian/greg_date.hpp>
+
+#include "filesystem_env.hpp"
+
+#define ORCUS_DEBUG_SHEET 0
+
+using namespace std;
+namespace gregorian = boost::gregorian;
+namespace posix_time = boost::posix_time;
+
+namespace orcus { namespace spreadsheet {
+
+namespace {
+
+ixion::abs_range_t to_ixion_range(sheet_t sheet, const range_t& range)
+{
+ ixion::abs_range_t pos;
+
+ pos.first.sheet = sheet;
+ pos.first.row = range.first.row;
+ pos.first.column = range.first.column;
+ pos.last.sheet = sheet;
+ pos.last.row = range.last.row;
+ pos.last.column = range.last.column;
+
+ return pos;
+}
+
+}
+
+const row_t sheet::max_row_limit = 1048575;
+const col_t sheet::max_col_limit = 1023;
+
+sheet::sheet(document& doc, sheet_t sheet_index) :
+ mp_impl(std::make_unique<detail::sheet_impl>(doc, *this, sheet_index)) {}
+
+sheet::~sheet() noexcept
+{
+}
+
+void sheet::set_auto(row_t row, col_t col, std::string_view s)
+{
+ if (s.empty())
+ return;
+
+ ixion::model_context& cxt = mp_impl->doc.get_model_context();
+
+ // First, see if this can be parsed as a number.
+ char* endptr = nullptr;
+ double val = strtod(s.data(), &endptr);
+ const char* endptr_check = s.data() + s.size();
+ if (endptr == endptr_check)
+ // Treat this as a numeric value.
+ cxt.set_numeric_cell(ixion::abs_address_t(mp_impl->sheet_id,row,col), val);
+ else
+ // Treat this as a string value.
+ cxt.set_string_cell(ixion::abs_address_t(mp_impl->sheet_id,row,col), s);
+}
+
+void sheet::set_string(row_t row, col_t col, string_id_t sindex)
+{
+ ixion::model_context& cxt = mp_impl->doc.get_model_context();
+ cxt.set_string_cell(ixion::abs_address_t(mp_impl->sheet_id,row,col), sindex);
+
+#if ORCUS_DEBUG_SHEET
+ cout << "sheet::set_string: sheet=" << mp_impl->sheet_id << "; row=" << row << "; col=" << col << "; si=" << sindex << endl;
+#endif
+}
+
+void sheet::set_value(row_t row, col_t col, double value)
+{
+ ixion::model_context& cxt = mp_impl->doc.get_model_context();
+ cxt.set_numeric_cell(ixion::abs_address_t(mp_impl->sheet_id,row,col), value);
+}
+
+void sheet::set_bool(row_t row, col_t col, bool value)
+{
+ ixion::model_context& cxt = mp_impl->doc.get_model_context();
+ cxt.set_boolean_cell(ixion::abs_address_t(mp_impl->sheet_id,row,col), value);
+}
+
+void sheet::set_date_time(row_t row, col_t col, int year, int month, int day, int hour, int minute, double second)
+{
+ // Convert this to a double value representing days since epoch.
+
+ date_time_t dt_origin = mp_impl->doc.get_origin_date();
+
+ gregorian::date origin(dt_origin.year, dt_origin.month, dt_origin.day);
+ gregorian::date d(year, month, day);
+
+ double days_since_epoch = (d - origin).days();
+
+ long ms = second * 1000000.0;
+
+ posix_time::time_duration t(
+ posix_time::hours(hour) +
+ posix_time::minutes(minute) +
+ posix_time::microseconds(ms)
+ );
+
+ double time_as_day = t.total_microseconds();
+ time_as_day /= 1000000.0; // microseconds to seconds
+ time_as_day /= 60.0 * 60.0 * 24.0; // seconds to day
+
+ set_value(row, col, days_since_epoch + time_as_day);
+}
+
+void sheet::set_format(row_t row, col_t col, size_t index)
+{
+ set_format(row, col, row, col, index);
+}
+
+void sheet::set_format(row_t row_start, col_t col_start, row_t row_end, col_t col_end, size_t index)
+{
+ for (col_t col = col_start; col <= col_end; ++col)
+ {
+ auto itr = mp_impl->cell_formats.find(col);
+ if (itr == mp_impl->cell_formats.end())
+ {
+ auto p = std::make_unique<detail::segment_row_index_type>(0, mp_impl->doc.get_sheet_size().rows, 0);
+ auto r = mp_impl->cell_formats.emplace(col, std::move(p));
+
+ if (!r.second)
+ {
+ cerr << "insertion of new cell format container failed!" << endl;
+ return;
+ }
+
+ itr = r.first;
+ }
+
+ detail::segment_row_index_type& con = *itr->second;
+ con.insert_back(row_start, row_end+1, index);
+ }
+}
+
+void sheet::set_column_format(col_t col, col_t col_span, std::size_t index)
+{
+ if (col_span > 0)
+ mp_impl->column_formats.insert_back(col, col + col_span, index);
+}
+
+void sheet::set_row_format(row_t row, std::size_t index)
+{
+ mp_impl->row_formats.insert_back(row, row+1, index);
+}
+
+void sheet::set_formula(row_t row, col_t col, const ixion::formula_tokens_store_ptr_t& tokens)
+{
+ ixion::model_context& cxt = mp_impl->doc.get_model_context();
+ ixion::abs_address_t pos(mp_impl->sheet_id, row, col);
+
+ cxt.set_formula_cell(pos, tokens);
+ try
+ {
+ ixion::register_formula_cell(cxt, pos);
+ mp_impl->doc.insert_dirty_cell(pos);
+ }
+ catch ([[maybe_unused]] const ixion::formula_registration_error& e)
+ {
+#if ORCUS_DEBUG_SHEET
+ cout << "sheet::set_formula: sheet=" << mp_impl->sheet_id << "; row=" << row << "; col=" << col << "; e=" << e.what() << endl;
+#endif
+ }
+}
+
+void sheet::set_formula(
+ row_t row, col_t col, const ixion::formula_tokens_store_ptr_t& tokens,
+ ixion::formula_result result)
+{
+ ixion::model_context& cxt = mp_impl->doc.get_model_context();
+ ixion::abs_address_t pos(mp_impl->sheet_id, row, col);
+
+ cxt.set_formula_cell(pos, tokens, result);
+
+ try
+ {
+ ixion::register_formula_cell(cxt, pos);
+ mp_impl->doc.insert_dirty_cell(pos);
+ }
+ catch ([[maybe_unused]] const ixion::formula_registration_error& e)
+ {
+#if ORCUS_DEBUG_SHEET
+ cout << "sheet::set_formula: sheet=" << mp_impl->sheet_id << "; row=" << row << "; col=" << col << "; e=" << e.what() << endl;
+#endif
+ }
+}
+
+void sheet::set_grouped_formula(const range_t& range, ixion::formula_tokens_t tokens)
+{
+ ixion::abs_range_t pos = to_ixion_range(mp_impl->sheet_id, range);
+ ixion::model_context& cxt = mp_impl->doc.get_model_context();
+
+ cxt.set_grouped_formula_cells(pos, std::move(tokens));
+ try
+ {
+ ixion::register_formula_cell(cxt, pos.first);
+ mp_impl->doc.insert_dirty_cell(pos.first);
+ }
+ catch ([[maybe_unused]] const ixion::formula_registration_error& e)
+ {
+#if ORCUS_DEBUG_SHEET
+ cout << "sheet::set_formula: sheet=" << mp_impl->sheet_id << "; range=" << range << "; e=" << e.what() << endl;
+#endif
+ }
+}
+
+void sheet::set_grouped_formula(const range_t& range, ixion::formula_tokens_t tokens, ixion::formula_result result)
+{
+ ixion::abs_range_t pos = to_ixion_range(mp_impl->sheet_id, range);
+ ixion::model_context& cxt = mp_impl->doc.get_model_context();
+
+ cxt.set_grouped_formula_cells(pos, std::move(tokens), std::move(result));
+ try
+ {
+ ixion::register_formula_cell(cxt, pos.first);
+ mp_impl->doc.insert_dirty_cell(pos.first);
+ }
+ catch ([[maybe_unused]] const ixion::formula_registration_error& e)
+ {
+#if ORCUS_DEBUG_SHEET
+ cout << "sheet::set_formula: sheet=" << mp_impl->sheet_id << "; range=" << range << "; e=" << e.what() << endl;
+#endif
+ }
+}
+
+void sheet::set_col_width(col_t col, col_t col_span, col_width_t width)
+{
+ mp_impl->col_width_pos =
+ mp_impl->col_widths.insert(mp_impl->col_width_pos, col, col+col_span, width).first;
+}
+
+col_width_t sheet::get_col_width(col_t col, col_t* col_start, col_t* col_end) const
+{
+ detail::col_widths_store_type& col_widths = mp_impl->col_widths;
+ if (!col_widths.is_tree_valid())
+ col_widths.build_tree();
+
+ col_width_t ret = 0;
+ if (!col_widths.search_tree(col, ret, col_start, col_end).second)
+ throw orcus::general_error("sheet::get_col_width: failed to search tree.");
+
+ return ret;
+}
+
+void sheet::set_col_hidden(col_t col, col_t col_span, bool hidden)
+{
+ mp_impl->col_hidden_pos =
+ mp_impl->col_hidden.insert(mp_impl->col_hidden_pos, col, col+col_span, hidden).first;
+}
+
+bool sheet::is_col_hidden(col_t col, col_t* col_start, col_t* col_end) const
+{
+ detail::col_hidden_store_type& col_hidden = mp_impl->col_hidden;
+ if (!col_hidden.is_tree_valid())
+ col_hidden.build_tree();
+
+ bool hidden = false;
+ if (!col_hidden.search_tree(col, hidden, col_start, col_end).second)
+ throw orcus::general_error("sheet::is_col_hidden: failed to search tree.");
+
+ return hidden;
+}
+
+void sheet::set_row_height(row_t row, row_height_t height)
+{
+ mp_impl->row_height_pos =
+ mp_impl->row_heights.insert(mp_impl->row_height_pos, row, row+1, height).first;
+}
+
+row_height_t sheet::get_row_height(row_t row, row_t* row_start, row_t* row_end) const
+{
+ detail::row_heights_store_type& row_heights = mp_impl->row_heights;
+ if (!row_heights.is_tree_valid())
+ row_heights.build_tree();
+
+ row_height_t ret = 0;
+ if (!row_heights.search_tree(row, ret, row_start, row_end).second)
+ throw orcus::general_error("sheet::get_row_height: failed to search tree.");
+
+ return ret;
+}
+
+void sheet::set_row_hidden(row_t row, bool hidden)
+{
+ mp_impl->row_hidden_pos =
+ mp_impl->row_hidden.insert(mp_impl->row_hidden_pos, row, row+1, hidden).first;
+}
+
+bool sheet::is_row_hidden(row_t row, row_t* row_start, row_t* row_end) const
+{
+ detail::row_hidden_store_type& row_hidden = mp_impl->row_hidden;
+ if (!row_hidden.is_tree_valid())
+ row_hidden.build_tree();
+
+ bool hidden = false;
+ if (!row_hidden.search_tree(row, hidden, row_start, row_end).second)
+ throw orcus::general_error("sheet::is_row_hidden: failed to search tree.");
+
+ return hidden;
+}
+
+void sheet::set_merge_cell_range(const range_t& range)
+{
+ detail::col_merge_size_type::iterator it_col = mp_impl->merge_ranges.find(range.first.column);
+ if (it_col == mp_impl->merge_ranges.end())
+ {
+ auto p = std::make_unique<detail::merge_size_type>();
+ pair<detail::col_merge_size_type::iterator, bool> r =
+ mp_impl->merge_ranges.insert(
+ detail::col_merge_size_type::value_type(range.first.column, std::move(p)));
+
+ if (!r.second)
+ // Insertion failed.
+ return;
+
+ it_col = r.first;
+ }
+
+ detail::merge_size_type& col_data = *it_col->second;
+ detail::merge_size sz(range.last.column-range.first.column+1, range.last.row-range.first.row+1);
+ col_data.insert(
+ detail::merge_size_type::value_type(range.first.row, sz));
+}
+
+void sheet::fill_down_cells(row_t src_row, col_t src_col, row_t range_size)
+{
+ ixion::model_context& cxt = mp_impl->doc.get_model_context();
+ ixion::abs_address_t src_pos(mp_impl->sheet_id, src_row, src_col);
+ cxt.fill_down_cells(src_pos, range_size);
+}
+
+range_t sheet::get_merge_cell_range(row_t row, col_t col) const
+{
+ range_t ret;
+ ret.first.column = col;
+ ret.first.row = row;
+ ret.last.column = col;
+ ret.last.row = row;
+
+ detail::col_merge_size_type::const_iterator it_col = mp_impl->merge_ranges.find(col);
+ if (it_col == mp_impl->merge_ranges.end())
+ return ret; // not a merged cell
+
+ const detail::merge_size_type& col_data = *it_col->second;
+ detail::merge_size_type::const_iterator it = col_data.find(row);
+ if (it == col_data.end())
+ return ret; // not a merged cell
+
+ const detail::merge_size& ms = it->second;
+ ret.last.column += ms.width - 1;
+ ret.last.row += ms.height - 1;
+
+ return ret;
+}
+
+size_t sheet::get_string_identifier(row_t row, col_t col) const
+{
+ const ixion::model_context& cxt = mp_impl->doc.get_model_context();
+ return cxt.get_string_identifier(ixion::abs_address_t(mp_impl->sheet_id, row, col));
+}
+
+auto_filter_t* sheet::get_auto_filter_data()
+{
+ return mp_impl->auto_filter_data.get();
+}
+
+const auto_filter_t* sheet::get_auto_filter_data() const
+{
+ return mp_impl->auto_filter_data.get();
+}
+
+void sheet::set_auto_filter_data(auto_filter_t* p)
+{
+ mp_impl->auto_filter_data.reset(p);
+}
+
+ixion::abs_range_t sheet::get_data_range() const
+{
+ return mp_impl->get_data_range();
+}
+
+sheet_t sheet::get_index() const
+{
+ return mp_impl->sheet_id;
+}
+
+date_time_t sheet::get_date_time(row_t row, col_t col) const
+{
+ const ixion::model_context& cxt = mp_impl->doc.get_model_context();
+
+ // raw value as days since epoch.
+ double dt_raw = cxt.get_numeric_value(
+ ixion::abs_address_t(mp_impl->sheet_id, row, col));
+
+ double days_since_epoch = std::floor(dt_raw);
+ double time_fraction = dt_raw - days_since_epoch;
+
+ date_time_t dt_origin = mp_impl->doc.get_origin_date();
+
+ posix_time::ptime origin(
+ gregorian::date(
+ gregorian::greg_year(dt_origin.year),
+ gregorian::greg_month(dt_origin.month),
+ gregorian::greg_day(dt_origin.day)
+ )
+ );
+
+ posix_time::ptime date_part = origin + gregorian::days(days_since_epoch);
+
+ long hours = 0;
+ long minutes = 0;
+ double seconds = 0.0;
+
+ if (time_fraction)
+ {
+ // Convert a fraction day to microseconds.
+ long long ms = time_fraction * 24.0 * 60.0 * 60.0 * 1000000.0;
+ posix_time::time_duration td = posix_time::microsec(ms);
+
+ hours = td.hours();
+ minutes = td.minutes();
+ seconds = td.seconds(); // long to double
+
+ td -= posix_time::hours(hours);
+ td -= posix_time::minutes(minutes);
+ td -= posix_time::seconds((long)seconds);
+
+ ms = td.total_microseconds(); // remaining microseconds.
+
+ seconds += ms / 1000000.0;
+ }
+
+ gregorian::date d = date_part.date();
+
+ return date_time_t(d.year(), d.month(), d.day(), hours, minutes, seconds);
+}
+
+void sheet::finalize_import()
+{
+ mp_impl->col_widths.build_tree();
+ mp_impl->row_heights.build_tree();
+}
+
+void sheet::dump_flat(std::ostream& os) const
+{
+ detail::flat_dumper dumper(mp_impl->doc);
+ dumper.dump(os, mp_impl->sheet_id);
+}
+
+void sheet::dump_check(ostream& os, std::string_view sheet_name) const
+{
+ detail::check_dumper dumper(*mp_impl, sheet_name);
+ dumper.dump(os);
+}
+
+void sheet::dump_html(std::ostream& os) const
+{
+ if (!mp_impl->col_widths.is_tree_valid())
+ mp_impl->col_widths.build_tree();
+
+ if (!mp_impl->row_heights.is_tree_valid())
+ mp_impl->row_heights.build_tree();
+
+ detail::html_dumper dumper(mp_impl->doc, mp_impl->merge_ranges, mp_impl->sheet_id);
+ dumper.dump(os);
+}
+
+void sheet::dump_json(std::ostream& os) const
+{
+ detail::json_dumper dumper(mp_impl->doc);
+ dumper.dump(os, mp_impl->sheet_id);
+}
+
+void sheet::dump_csv(std::ostream& os) const
+{
+ detail::csv_dumper dumper(mp_impl->doc);
+ dumper.dump(os, mp_impl->sheet_id);
+}
+
+void sheet::dump_debug_state(const std::string& output_dir, std::string_view sheet_name) const
+{
+ fs::path outdir{output_dir};
+ detail::sheet_debug_state_dumper dumper(*mp_impl, sheet_name);
+ dumper.dump(outdir);
+}
+
+size_t sheet::get_cell_format(row_t row, col_t col) const
+{
+ // Check the cell format store first
+ auto it = mp_impl->cell_formats.find(col);
+ if (it != mp_impl->cell_formats.end())
+ {
+ detail::segment_row_index_type& con = *it->second;
+ if (!con.is_tree_valid())
+ con.build_tree();
+
+ // Return only if the index is not a default index
+ std::size_t index;
+ if (con.search_tree(row, index).second && index)
+ return index;
+ }
+
+ // Not found in the cell format store. Check the row store.
+ if (!mp_impl->row_formats.is_tree_valid())
+ mp_impl->row_formats.build_tree();
+
+ std::size_t index;
+ if (mp_impl->row_formats.search_tree(row, index).second && index)
+ return index;
+
+ // Not found in the row store. Check the column store.
+ if (!mp_impl->column_formats.is_tree_valid())
+ mp_impl->column_formats.build_tree();
+
+ if (mp_impl->column_formats.search_tree(col, index).second && index)
+ return index;
+
+ // Not found. Return the default format index.
+ return 0;
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/sheet_impl.cpp b/src/spreadsheet/sheet_impl.cpp
new file mode 100644
index 0000000..1364e25
--- /dev/null
+++ b/src/spreadsheet/sheet_impl.cpp
@@ -0,0 +1,53 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "sheet_impl.hpp"
+#include "orcus/spreadsheet/document.hpp"
+
+#include <ixion/model_context.hpp>
+
+namespace orcus { namespace spreadsheet { namespace detail {
+
+sheet_impl::sheet_impl(document& _doc, sheet& /*sh*/, sheet_t sheet_index) :
+ doc(_doc),
+ col_widths(0, doc.get_sheet_size().columns, get_default_column_width()),
+ row_heights(0, doc.get_sheet_size().rows, get_default_row_height()),
+ col_width_pos(col_widths.begin()),
+ row_height_pos(row_heights.begin()),
+ col_hidden(0, doc.get_sheet_size().columns, false),
+ row_hidden(0, doc.get_sheet_size().rows, false),
+ col_hidden_pos(col_hidden.begin()),
+ row_hidden_pos(row_hidden.begin()),
+ column_formats(0, doc.get_sheet_size().columns, 0),
+ row_formats(0, doc.get_sheet_size().rows, 0),
+ sheet_id(sheet_index) {}
+
+sheet_impl::~sheet_impl() {}
+
+const detail::merge_size* sheet_impl::get_merge_size(row_t row, col_t col) const
+{
+ detail::col_merge_size_type::const_iterator it_col = merge_ranges.find(col);
+ if (it_col == merge_ranges.end())
+ return nullptr;
+
+ detail::merge_size_type& col_merge_sizes = *it_col->second;
+ detail::merge_size_type::const_iterator it_row = col_merge_sizes.find(row);
+ if (it_row == col_merge_sizes.end())
+ return nullptr;
+
+ return &it_row->second;
+}
+
+ixion::abs_range_t sheet_impl::get_data_range() const
+{
+ const ixion::model_context& cxt = doc.get_model_context();
+ return cxt.get_data_range(sheet_id);
+}
+
+}}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/sheet_impl.hpp b/src/spreadsheet/sheet_impl.hpp
new file mode 100644
index 0000000..11f691a
--- /dev/null
+++ b/src/spreadsheet/sheet_impl.hpp
@@ -0,0 +1,72 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_SPREADSHEET_SHEET_IMPL_HPP
+#define INCLUDED_ORCUS_SPREADSHEET_SHEET_IMPL_HPP
+
+#include "impl_types.hpp"
+#include "orcus/spreadsheet/auto_filter.hpp"
+
+namespace orcus { namespace spreadsheet {
+
+class document;
+class sheet;
+
+namespace detail {
+
+using segment_row_index_type = mdds::flat_segment_tree<row_t, std::size_t>;
+using segment_col_index_type = mdds::flat_segment_tree<col_t, std::size_t>;
+typedef std::unordered_map<col_t, std::unique_ptr<segment_row_index_type>> cell_format_type;
+
+// Widths and heights are stored in twips.
+typedef mdds::flat_segment_tree<col_t, col_width_t> col_widths_store_type;
+typedef mdds::flat_segment_tree<row_t, row_height_t> row_heights_store_type;
+
+// hidden information
+typedef mdds::flat_segment_tree<col_t, bool> col_hidden_store_type;
+typedef mdds::flat_segment_tree<row_t, bool> row_hidden_store_type;
+
+struct sheet_impl
+{
+ document& doc;
+
+ mutable col_widths_store_type col_widths;
+ mutable row_heights_store_type row_heights;
+ col_widths_store_type::const_iterator col_width_pos;
+ row_heights_store_type::const_iterator row_height_pos;
+
+ mutable col_hidden_store_type col_hidden;
+ mutable row_hidden_store_type row_hidden;
+ col_hidden_store_type::const_iterator col_hidden_pos;
+ row_hidden_store_type::const_iterator row_hidden_pos;
+
+ detail::col_merge_size_type merge_ranges; /// 2-dimensional merged cell ranges.
+
+ std::unique_ptr<auto_filter_t> auto_filter_data;
+
+ cell_format_type cell_formats;
+ segment_col_index_type column_formats;
+ segment_row_index_type row_formats;
+ const sheet_t sheet_id;
+
+ sheet_impl() = delete;
+ sheet_impl(const sheet_impl&) = delete;
+ sheet_impl& operator=(const sheet_impl&) = delete;
+
+ sheet_impl(document& _doc, sheet& sh, sheet_t sheet_index);
+ ~sheet_impl();
+
+ const detail::merge_size* get_merge_size(row_t row, col_t col) const;
+
+ ixion::abs_range_t get_data_range() const;
+};
+
+}}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/styles.cpp b/src/spreadsheet/styles.cpp
new file mode 100644
index 0000000..328814e
--- /dev/null
+++ b/src/spreadsheet/styles.cpp
@@ -0,0 +1,485 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/spreadsheet/styles.hpp"
+#include "orcus/string_pool.hpp"
+
+#include "ostream_utils.hpp"
+
+#include <functional>
+#include <algorithm>
+#include <cassert>
+#include <iomanip>
+#include <vector>
+#include <map>
+
+namespace orcus { namespace spreadsheet {
+
+font_t::font_t() = default;
+font_t::font_t(const font_t& other) = default;
+font_t::~font_t() = default;
+
+font_t& font_t::operator=(const font_t& other) = default;
+
+bool font_t::operator==(const font_t& other) const
+{
+ if (name != other.name)
+ return false;
+
+ if (name_asian != other.name_asian)
+ return false;
+
+ if (name_complex != other.name_complex)
+ return false;
+
+ if (size != other.size)
+ return false;
+
+ if (size_asian != other.size_asian)
+ return false;
+
+ if (size_complex != other.size_complex)
+ return false;
+
+ if (bold != other.bold)
+ return false;
+
+ if (bold_asian != other.bold_asian)
+ return false;
+
+ if (bold_complex != other.bold_complex)
+ return false;
+
+ if (italic != other.italic)
+ return false;
+
+ if (italic_asian != other.italic_asian)
+ return false;
+
+ if (italic_complex != other.italic_complex)
+ return false;
+
+ if (underline_style != other.underline_style)
+ return false;
+
+ if (underline_width != other.underline_width)
+ return false;
+
+ if (underline_mode != other.underline_mode)
+ return false;
+
+ if (underline_type != other.underline_type)
+ return false;
+
+ if (underline_color != other.underline_color)
+ return false;
+
+ if (color != other.color)
+ return false;
+
+ if (strikethrough_style != other.strikethrough_style)
+ return false;
+
+ if (strikethrough_width != other.strikethrough_width)
+ return false;
+
+ if (strikethrough_type != other.strikethrough_type)
+ return false;
+
+ if (strikethrough_text != other.strikethrough_text)
+ return false;
+
+ return true;
+}
+
+bool font_t::operator!=(const font_t& other) const
+{
+ return !operator==(other);
+}
+
+void font_t::reset()
+{
+ *this = font_t();
+}
+
+std::size_t font_t::hash::operator()(const font_t& v) const
+{
+ std::size_t hash_value = 0u;
+
+ if (v.name)
+ hash_value |= std::hash<std::string_view>{}(*v.name);
+
+ if (v.size)
+ hash_value |= std::hash<double>{}(*v.size);
+
+ if (v.bold)
+ hash_value |= std::hash<bool>{}(*v.bold);
+
+ if (v.italic)
+ hash_value |= std::hash<bool>{}(*v.italic);
+
+ return hash_value;
+}
+
+fill_t::fill_t() = default;
+
+void fill_t::reset()
+{
+ *this = fill_t();
+}
+
+border_attrs_t::border_attrs_t() = default;
+
+void border_attrs_t::reset()
+{
+ *this = border_attrs_t();
+}
+
+border_t::border_t() = default;
+
+void border_t::reset()
+{
+ *this = border_t();
+}
+
+protection_t::protection_t() = default;
+
+void protection_t::reset()
+{
+ *this = protection_t();
+}
+
+number_format_t::number_format_t() = default;
+
+void number_format_t::reset()
+{
+ *this = number_format_t();
+}
+
+bool number_format_t::operator== (const number_format_t& other) const noexcept
+{
+ return identifier == other.identifier && format_string == other.format_string;
+}
+
+bool number_format_t::operator!= (const number_format_t& other) const noexcept
+{
+ return !operator== (other);
+}
+
+cell_format_t::cell_format_t() :
+ font(0),
+ fill(0),
+ border(0),
+ protection(0),
+ number_format(0),
+ style_xf(0),
+ hor_align(hor_alignment_t::unknown),
+ ver_align(ver_alignment_t::unknown),
+ apply_num_format(false),
+ apply_font(false),
+ apply_fill(false),
+ apply_border(false),
+ apply_alignment(false),
+ apply_protection(false)
+{
+}
+
+void cell_format_t::reset()
+{
+ *this = cell_format_t();
+}
+
+cell_style_t::cell_style_t() :
+ xf(0), builtin(0)
+{
+}
+
+void cell_style_t::reset()
+{
+ *this = cell_style_t();
+}
+
+std::ostream& operator<< (std::ostream& os, const color_t& c)
+{
+ ::orcus::detail::ostream_format_guard ifs(os);
+
+ os << std::uppercase;
+
+ os << "(ARGB:"
+ << ' ' << std::hex << std::setfill('0') << std::setw(2) << int(c.alpha & 0xFF)
+ << ' ' << std::hex << std::setfill('0') << std::setw(2) << int(c.red & 0xFF)
+ << ' ' << std::hex << std::setfill('0') << std::setw(2) << int(c.green & 0xFF)
+ << ' ' << std::hex << std::setfill('0') << std::setw(2) << int(c.blue & 0xFF)
+ << ")";
+
+ return os;
+}
+
+struct styles::impl
+{
+ std::vector<font_t> fonts;
+ std::vector<fill_t> fills;
+ std::vector<border_t> borders;
+ std::vector<protection_t> protections;
+ std::vector<number_format_t> number_formats;
+ std::vector<cell_format_t> cell_style_formats;
+ std::vector<cell_format_t> cell_formats;
+ std::vector<cell_format_t> dxf_formats;
+ std::vector<cell_style_t> cell_styles;
+ std::map<std::size_t, std::size_t> cell_styles_map; // style xf to style position in `cell_styles`
+
+ string_pool str_pool;
+};
+
+styles::styles() : mp_impl(std::make_unique<impl>()) {}
+styles::~styles() {}
+
+void styles::reserve_font_store(size_t n)
+{
+ mp_impl->fonts.reserve(n);
+}
+
+std::size_t styles::append_font(const font_t& font)
+{
+ mp_impl->fonts.emplace_back(font);
+ return mp_impl->fonts.size() - 1;
+}
+
+void styles::reserve_fill_store(size_t n)
+{
+ mp_impl->fills.reserve(n);
+}
+
+std::size_t styles::append_fill(const fill_t& fill)
+{
+ mp_impl->fills.emplace_back(fill);
+ return mp_impl->fills.size() - 1;
+}
+
+void styles::reserve_border_store(size_t n)
+{
+ mp_impl->borders.reserve(n);
+}
+
+std::size_t styles::append_border(const border_t& border)
+{
+ mp_impl->borders.emplace_back(border);
+ return mp_impl->borders.size() - 1;
+}
+
+std::size_t styles::append_protection(const protection_t& protection)
+{
+ mp_impl->protections.emplace_back(protection);
+ return mp_impl->protections.size() - 1;
+}
+
+void styles::reserve_number_format_store(size_t n)
+{
+ mp_impl->number_formats.reserve(n);
+}
+
+std::size_t styles::append_number_format(const number_format_t& nf)
+{
+ if (nf.format_string)
+ {
+ number_format_t copied = nf;
+ copied.format_string = mp_impl->str_pool.intern(*nf.format_string).first;
+ mp_impl->number_formats.emplace_back(copied);
+ }
+ else
+ mp_impl->number_formats.emplace_back(nf);
+
+ return mp_impl->number_formats.size() - 1;
+}
+
+void styles::reserve_cell_style_format_store(size_t n)
+{
+ mp_impl->cell_style_formats.reserve(n);
+}
+
+size_t styles::append_cell_style_format(const cell_format_t& cf)
+{
+ mp_impl->cell_style_formats.push_back(cf);
+ return mp_impl->cell_style_formats.size() - 1;
+}
+
+void styles::reserve_cell_format_store(size_t n)
+{
+ mp_impl->cell_formats.reserve(n);
+}
+
+size_t styles::append_cell_format(const cell_format_t& cf)
+{
+ mp_impl->cell_formats.push_back(cf);
+ return mp_impl->cell_formats.size() - 1;
+}
+
+void styles::reserve_diff_cell_format_store(size_t n)
+{
+ mp_impl->dxf_formats.reserve(n);
+}
+
+size_t styles::append_diff_cell_format(const cell_format_t& cf)
+{
+ mp_impl->dxf_formats.push_back(cf);
+ return mp_impl->dxf_formats.size() - 1;
+}
+
+void styles::reserve_cell_style_store(size_t n)
+{
+ mp_impl->cell_styles.reserve(n);
+}
+
+void styles::append_cell_style(const cell_style_t& cs)
+{
+ mp_impl->cell_styles.push_back(cs);
+}
+
+const font_t* styles::get_font(size_t index) const
+{
+ if (index >= mp_impl->fonts.size())
+ return nullptr;
+
+ return &mp_impl->fonts[index];
+}
+
+const cell_format_t* styles::get_cell_format(size_t index) const
+{
+ if (index >= mp_impl->cell_formats.size())
+ return nullptr;
+
+ return &mp_impl->cell_formats[index];
+}
+
+const fill_t* styles::get_fill(size_t index) const
+{
+ if (index >= mp_impl->fills.size())
+ return nullptr;
+
+ return &mp_impl->fills[index];
+}
+
+const border_t* styles::get_border(size_t index) const
+{
+ if (index >= mp_impl->borders.size())
+ return nullptr;
+
+ return &mp_impl->borders[index];
+}
+
+const protection_t* styles::get_protection(size_t index) const
+{
+ if (index >= mp_impl->protections.size())
+ return nullptr;
+
+ return &mp_impl->protections[index];
+}
+
+const number_format_t* styles::get_number_format(size_t index) const
+{
+ if (index >= mp_impl->number_formats.size())
+ return nullptr;
+
+ return &mp_impl->number_formats[index];
+}
+
+const cell_format_t* styles::get_cell_style_format(size_t index) const
+{
+ if (index >= mp_impl->cell_style_formats.size())
+ return nullptr;
+
+ return &mp_impl->cell_style_formats[index];
+}
+
+const cell_format_t* styles::get_dxf_format(size_t index) const
+{
+ if (index >= mp_impl->dxf_formats.size())
+ return nullptr;
+
+ return &mp_impl->dxf_formats[index];
+}
+
+const cell_style_t* styles::get_cell_style(size_t index) const
+{
+ if (index >= mp_impl->cell_styles.size())
+ return nullptr;
+
+ return &mp_impl->cell_styles[index];
+}
+
+const cell_style_t* styles::get_cell_style_by_xf(size_t xfid) const
+{
+ auto it = mp_impl->cell_styles_map.find(xfid);
+ if (it == mp_impl->cell_styles_map.end())
+ return nullptr;
+
+ auto index = it->second;
+ return &mp_impl->cell_styles[index];
+}
+
+size_t styles::get_font_count() const
+{
+ return mp_impl->fonts.size();
+}
+
+size_t styles::get_fill_count() const
+{
+ return mp_impl->fills.size();
+}
+
+size_t styles::get_border_count() const
+{
+ return mp_impl->borders.size();
+}
+
+size_t styles::get_protection_count() const
+{
+ return mp_impl->protections.size();
+}
+
+size_t styles::get_number_format_count() const
+{
+ return mp_impl->number_formats.size();
+}
+
+size_t styles::get_cell_formats_count() const
+{
+ return mp_impl->cell_formats.size();
+}
+
+size_t styles::get_cell_style_formats_count() const
+{
+ return mp_impl->cell_style_formats.size();
+}
+
+size_t styles::get_dxf_count() const
+{
+ return mp_impl->dxf_formats.size();
+}
+
+size_t styles::get_cell_styles_count() const
+{
+ return mp_impl->cell_styles.size();
+}
+
+void styles::clear()
+{
+ mp_impl = std::make_unique<impl>();
+}
+
+void styles::finalize_import()
+{
+ for (std::size_t i = 0; i < mp_impl->cell_styles.size(); ++i)
+ {
+ const auto& entry = mp_impl->cell_styles[i];
+ mp_impl->cell_styles_map.insert_or_assign(entry.xf, i);
+ }
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/spreadsheet/view.cpp b/src/spreadsheet/view.cpp
new file mode 100644
index 0000000..7e21fff
--- /dev/null
+++ b/src/spreadsheet/view.cpp
@@ -0,0 +1,201 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "orcus/spreadsheet/view.hpp"
+#include "orcus/spreadsheet/document.hpp"
+
+#include <cassert>
+#include <iostream>
+
+namespace orcus { namespace spreadsheet {
+
+struct view::impl
+{
+ document& m_doc;
+
+ std::vector<std::unique_ptr<sheet_view>> m_sheet_views;
+ sheet_t m_active_sheet;
+
+ impl(document& doc) : m_doc(doc), m_active_sheet(0) {}
+};
+
+view::view(document& doc) : mp_impl(std::make_unique<impl>(doc)) {}
+view::~view() {}
+
+sheet_view* view::get_or_create_sheet_view(sheet_t sheet)
+{
+ if (sheet < 0)
+ return nullptr;
+
+ sheet_t n = mp_impl->m_doc.get_sheet_count();
+ if (sheet >= n)
+ return nullptr;
+
+ // Make sure the container is large enough for the requested sheet view index.
+ n = mp_impl->m_sheet_views.size();
+ if (sheet >= n)
+ mp_impl->m_sheet_views.resize(sheet+1);
+
+ if (!mp_impl->m_sheet_views[sheet])
+ mp_impl->m_sheet_views[sheet] = std::make_unique<sheet_view>(*this);
+
+ return mp_impl->m_sheet_views[sheet].get();
+}
+
+const sheet_view* view::get_sheet_view(sheet_t sheet) const
+{
+ if (sheet < 0)
+ return nullptr;
+
+ sheet_t n = mp_impl->m_doc.get_sheet_count();
+ if (sheet >= n)
+ return nullptr;
+
+ n = mp_impl->m_sheet_views.size();
+ if (sheet >= n)
+ return nullptr;
+
+ assert(mp_impl->m_sheet_views[sheet]);
+ return mp_impl->m_sheet_views[sheet].get();
+}
+
+void view::set_active_sheet(sheet_t sheet)
+{
+ mp_impl->m_active_sheet = sheet;
+}
+
+sheet_t view::get_active_sheet() const
+{
+ return mp_impl->m_active_sheet;
+}
+
+namespace {
+
+/**
+ * Stores all data for a single sheet pane.
+ */
+struct sheet_pane_data
+{
+ range_t m_selection;
+
+ sheet_pane_data()
+ {
+ m_selection.first.row = -1;
+ m_selection.first.column = -1;
+ m_selection.last = m_selection.first;
+ }
+};
+
+size_t to_pane_index(sheet_pane_t pos)
+{
+ switch (pos)
+ {
+ case sheet_pane_t::top_left:
+ return 0;
+ case sheet_pane_t::top_right:
+ return 1;
+ case sheet_pane_t::bottom_left:
+ return 2;
+ case sheet_pane_t::bottom_right:
+ return 3;
+ case sheet_pane_t::unspecified:
+ default:
+ throw std::runtime_error("invalid sheet pane.");
+ }
+}
+
+} // anonymous namespace
+
+struct sheet_view::impl
+{
+ view& m_doc_view;
+ sheet_pane_data m_panes[4];
+ sheet_pane_t m_active_pane;
+ split_pane_t m_split_pane;
+ frozen_pane_t m_frozen_pane;
+
+ sheet_pane_data& get_pane(sheet_pane_t pos)
+ {
+ return m_panes[to_pane_index(pos)];
+ }
+
+ const sheet_pane_data& get_pane(sheet_pane_t pos) const
+ {
+ return m_panes[to_pane_index(pos)];
+ }
+
+ impl(view& doc_view) : m_doc_view(doc_view), m_active_pane(sheet_pane_t::top_left)
+ {
+ m_split_pane.hor_split = 0.0;
+ m_split_pane.ver_split = 0.0;
+ m_split_pane.top_left_cell.row = -1;
+ m_split_pane.top_left_cell.column = -1;
+ m_frozen_pane.visible_columns = 0;
+ m_frozen_pane.visible_rows = 0;
+ m_frozen_pane.top_left_cell.row = -1;
+ m_frozen_pane.top_left_cell.column = -1;
+ }
+};
+
+sheet_view::sheet_view(view& doc_view) : mp_impl(std::make_unique<impl>(doc_view)) {}
+sheet_view::~sheet_view() {}
+
+const range_t& sheet_view::get_selection(sheet_pane_t pos) const
+{
+ const sheet_pane_data& pd = mp_impl->get_pane(pos);
+ return pd.m_selection;
+}
+
+void sheet_view::set_selection(sheet_pane_t pos, const range_t& range)
+{
+ sheet_pane_data& pd = mp_impl->get_pane(pos);
+ pd.m_selection = range;
+}
+
+void sheet_view::set_active_pane(sheet_pane_t pos)
+{
+ mp_impl->m_active_pane = pos;
+}
+
+sheet_pane_t sheet_view::get_active_pane() const
+{
+ return mp_impl->m_active_pane;
+}
+
+void sheet_view::set_split_pane(
+ double hor_split, double ver_split, const address_t& top_left_cell)
+{
+ mp_impl->m_split_pane.hor_split = hor_split;
+ mp_impl->m_split_pane.ver_split = ver_split;
+ mp_impl->m_split_pane.top_left_cell = top_left_cell;
+}
+
+const split_pane_t& sheet_view::get_split_pane() const
+{
+ return mp_impl->m_split_pane;
+}
+
+void sheet_view::set_frozen_pane(col_t visible_cols, row_t visible_rows, const address_t& top_left_cell)
+{
+ mp_impl->m_frozen_pane.visible_columns = visible_cols;
+ mp_impl->m_frozen_pane.visible_rows = visible_rows;
+ mp_impl->m_frozen_pane.top_left_cell = top_left_cell;
+}
+
+const frozen_pane_t& sheet_view::get_frozen_pane() const
+{
+ return mp_impl->m_frozen_pane;
+}
+
+view& sheet_view::get_document_view()
+{
+ return mp_impl->m_doc_view;
+}
+
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/test/Makefile.am b/src/test/Makefile.am
new file mode 100644
index 0000000..ea4eca9
--- /dev/null
+++ b/src/test/Makefile.am
@@ -0,0 +1,10 @@
+
+AM_CPPFLAGS = \
+ -I$(top_srcdir)/include \
+ -I$(top_srcdir)/src/include
+
+noinst_LIBRARIES = liborcus-test.a
+
+liborcus_test_a_SOURCES = \
+ test_global.cpp \
+ mock_spreadsheet.cpp
diff --git a/src/test/Makefile.in b/src/test/Makefile.in
new file mode 100644
index 0000000..bddc4f2
--- /dev/null
+++ b/src/test/Makefile.in
@@ -0,0 +1,704 @@
+# Makefile.in generated by automake 1.16.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2021 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.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+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@
+subdir = src/test
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
+ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_17.m4 \
+ $(top_srcdir)/m4/boost.m4 $(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)/m4/m4_ax_valgrind_check.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+ARFLAGS = cru
+AM_V_AR = $(am__v_AR_@AM_V@)
+am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)
+am__v_AR_0 = @echo " AR " $@;
+am__v_AR_1 =
+liborcus_test_a_AR = $(AR) $(ARFLAGS)
+liborcus_test_a_LIBADD =
+am_liborcus_test_a_OBJECTS = test_global.$(OBJEXT) \
+ mock_spreadsheet.$(OBJEXT)
+liborcus_test_a_OBJECTS = $(am_liborcus_test_a_OBJECTS)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/mock_spreadsheet.Po \
+ ./$(DEPDIR)/test_global.Po
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+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_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+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_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(liborcus_test_a_SOURCES)
+DIST_SOURCES = $(liborcus_test_a_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__extra_recursive_targets = check-valgrind-recursive \
+ check-valgrind-memcheck-recursive \
+ check-valgrind-helgrind-recursive check-valgrind-drd-recursive \
+ check-valgrind-sgcheck-recursive
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BOOST_CPPFLAGS = @BOOST_CPPFLAGS@
+BOOST_DATE_TIME_LDFLAGS = @BOOST_DATE_TIME_LDFLAGS@
+BOOST_DATE_TIME_LDPATH = @BOOST_DATE_TIME_LDPATH@
+BOOST_DATE_TIME_LIBS = @BOOST_DATE_TIME_LIBS@
+BOOST_FILESYSTEM_LDFLAGS = @BOOST_FILESYSTEM_LDFLAGS@
+BOOST_FILESYSTEM_LDPATH = @BOOST_FILESYSTEM_LDPATH@
+BOOST_FILESYSTEM_LIBS = @BOOST_FILESYSTEM_LIBS@
+BOOST_IOSTREAMS_LDFLAGS = @BOOST_IOSTREAMS_LDFLAGS@
+BOOST_IOSTREAMS_LDPATH = @BOOST_IOSTREAMS_LDPATH@
+BOOST_IOSTREAMS_LIBS = @BOOST_IOSTREAMS_LIBS@
+BOOST_LDPATH = @BOOST_LDPATH@
+BOOST_PROGRAM_OPTIONS_LDFLAGS = @BOOST_PROGRAM_OPTIONS_LDFLAGS@
+BOOST_PROGRAM_OPTIONS_LDPATH = @BOOST_PROGRAM_OPTIONS_LDPATH@
+BOOST_PROGRAM_OPTIONS_LIBS = @BOOST_PROGRAM_OPTIONS_LIBS@
+BOOST_ROOT = @BOOST_ROOT@
+BOOST_SYSTEM_LDFLAGS = @BOOST_SYSTEM_LDFLAGS@
+BOOST_SYSTEM_LDPATH = @BOOST_SYSTEM_LDPATH@
+BOOST_SYSTEM_LIBS = @BOOST_SYSTEM_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CSCOPE = @CSCOPE@
+CTAGS = @CTAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_VALGRIND_drd = @ENABLE_VALGRIND_drd@
+ENABLE_VALGRIND_helgrind = @ENABLE_VALGRIND_helgrind@
+ENABLE_VALGRIND_memcheck = @ENABLE_VALGRIND_memcheck@
+ENABLE_VALGRIND_sgcheck = @ENABLE_VALGRIND_sgcheck@
+ETAGS = @ETAGS@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+HAVE_CXX17 = @HAVE_CXX17@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+IXION_REQUIRED_API_VERSION = @IXION_REQUIRED_API_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBIXION_CFLAGS = @LIBIXION_CFLAGS@
+LIBIXION_LIBS = @LIBIXION_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MDDS_CFLAGS = @MDDS_CFLAGS@
+MDDS_LIBS = @MDDS_LIBS@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+ORCUS_API_VERSION = @ORCUS_API_VERSION@
+ORCUS_MAJOR_VERSION = @ORCUS_MAJOR_VERSION@
+ORCUS_MICRO_VERSION = @ORCUS_MICRO_VERSION@
+ORCUS_MINOR_VERSION = @ORCUS_MINOR_VERSION@
+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@
+PARQUET_CFLAGS = @PARQUET_CFLAGS@
+PARQUET_LIBS = @PARQUET_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POW_LIB = @POW_LIB@
+PYTHON = @PYTHON@
+PYTHON_CFLAGS = @PYTHON_CFLAGS@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VALGRIND = @VALGRIND@
+VALGRIND_ENABLED = @VALGRIND_ENABLED@
+VERSION = @VERSION@
+ZLIB_CFLAGS = @ZLIB_CFLAGS@
+ZLIB_LIBS = @ZLIB_LIBS@
+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@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+runstatedir = @runstatedir@
+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@
+valgrind_enabled_tools = @valgrind_enabled_tools@
+valgrind_tools = @valgrind_tools@
+AM_CPPFLAGS = \
+ -I$(top_srcdir)/include \
+ -I$(top_srcdir)/src/include
+
+noinst_LIBRARIES = liborcus-test.a
+liborcus_test_a_SOURCES = \
+ test_global.cpp \
+ mock_spreadsheet.cpp
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cpp .lo .o .obj
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/test/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign src/test/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-noinstLIBRARIES:
+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
+liborcus-test.a: $(liborcus_test_a_OBJECTS) $(liborcus_test_a_DEPENDENCIES) $(EXTRA_liborcus_test_a_DEPENDENCIES)
+ $(AM_V_at)-rm -f liborcus-test.a
+ $(AM_V_AR)$(liborcus_test_a_AR) liborcus-test.a $(liborcus_test_a_OBJECTS) $(liborcus_test_a_LIBADD)
+ $(AM_V_at)$(RANLIB) liborcus-test.a
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mock_spreadsheet.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_global.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.cpp.o:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cpp.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cpp.lo:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+check-valgrind-local:
+check-valgrind-memcheck-local:
+check-valgrind-helgrind-local:
+check-valgrind-drd-local:
+check-valgrind-sgcheck-local:
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ 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-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ 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"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @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
+check-am: all-am
+check: check-am
+all-am: Makefile $(LIBRARIES)
+installdirs:
+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:
+
+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)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+check-valgrind: check-valgrind-am
+
+check-valgrind-am: check-valgrind-local
+
+check-valgrind-drd: check-valgrind-drd-am
+
+check-valgrind-drd-am: check-valgrind-drd-local
+
+check-valgrind-helgrind: check-valgrind-helgrind-am
+
+check-valgrind-helgrind-am: check-valgrind-helgrind-local
+
+check-valgrind-memcheck: check-valgrind-memcheck-am
+
+check-valgrind-memcheck-am: check-valgrind-memcheck-local
+
+check-valgrind-sgcheck: check-valgrind-sgcheck-am
+
+check-valgrind-sgcheck-am: check-valgrind-sgcheck-local
+
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -f ./$(DEPDIR)/mock_spreadsheet.Po
+ -rm -f ./$(DEPDIR)/test_global.Po
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+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 ./$(DEPDIR)/mock_spreadsheet.Po
+ -rm -f ./$(DEPDIR)/test_global.Po
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am \
+ check-valgrind-am check-valgrind-drd-am \
+ check-valgrind-drd-local check-valgrind-helgrind-am \
+ check-valgrind-helgrind-local check-valgrind-local \
+ check-valgrind-memcheck-am check-valgrind-memcheck-local \
+ check-valgrind-sgcheck-am check-valgrind-sgcheck-local clean \
+ clean-generic clean-libtool clean-noinstLIBRARIES \
+ cscopelist-am ctags ctags-am distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ 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-man install-pdf \
+ install-pdf-am 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 \
+ tags tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+# 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/src/test/mock_spreadsheet.cpp b/src/test/mock_spreadsheet.cpp
new file mode 100644
index 0000000..bf4f629
--- /dev/null
+++ b/src/test/mock_spreadsheet.cpp
@@ -0,0 +1,319 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "mock_spreadsheet.hpp"
+
+#include <cassert>
+
+using namespace orcus::spreadsheet;
+
+namespace orcus { namespace spreadsheet { namespace mock {
+
+//import_factory
+
+import_factory::~import_factory()
+{
+}
+
+orcus::spreadsheet::iface::import_global_settings* import_factory::get_global_settings()
+{
+ assert(false);
+ return nullptr;
+}
+
+orcus::spreadsheet::iface::import_shared_strings* import_factory::get_shared_strings()
+{
+ assert(false);
+ return nullptr;
+}
+
+orcus::spreadsheet::iface::import_styles* import_factory::get_styles()
+{
+ assert(false);
+ return nullptr;
+}
+
+orcus::spreadsheet::iface::import_sheet* import_factory::append_sheet(orcus::spreadsheet::sheet_t, std::string_view)
+{
+ assert(false);
+ return nullptr;
+}
+
+orcus::spreadsheet::iface::import_sheet* import_factory::get_sheet(std::string_view)
+{
+ assert(false);
+ return nullptr;
+}
+
+orcus::spreadsheet::iface::import_sheet* import_factory::get_sheet(orcus::spreadsheet::sheet_t)
+{
+ assert(false);
+ return nullptr;
+}
+
+void import_factory::finalize() {}
+
+// import_shared_strings
+
+import_shared_strings::~import_shared_strings()
+{
+}
+
+size_t import_shared_strings::append(std::string_view)
+{
+ assert(false);
+ return 0;
+}
+
+size_t import_shared_strings::add(std::string_view)
+{
+ assert(false);
+ return 0;
+}
+
+void import_shared_strings::set_segment_font(size_t)
+{
+ assert(false);
+}
+
+void import_shared_strings::set_segment_bold(bool)
+{
+ assert(false);
+}
+
+void import_shared_strings::set_segment_italic(bool)
+{
+ assert(false);
+}
+
+void import_shared_strings::set_segment_font_name(std::string_view)
+{
+ assert(false);
+}
+
+void import_shared_strings::set_segment_font_size(double)
+{
+ assert(false);
+}
+
+void import_shared_strings::set_segment_font_color(color_elem_t, color_elem_t, color_elem_t, color_elem_t)
+{
+ assert(false);
+}
+
+void import_shared_strings::append_segment(std::string_view)
+{
+ assert(false);
+}
+
+size_t import_shared_strings::commit_segments()
+{
+ assert(false);
+ return 0;
+}
+
+// import sheet properties
+
+import_sheet_properties::~import_sheet_properties()
+{
+}
+
+void import_sheet_properties::set_column_width(col_t, col_t, double, length_unit_t)
+{
+ assert(false);
+}
+
+void import_sheet_properties::set_column_hidden(col_t, col_t, bool)
+{
+ assert(false);
+}
+
+void import_sheet_properties::set_row_height(row_t, double, length_unit_t)
+{
+ assert(false);
+}
+
+void import_sheet_properties::set_row_hidden(row_t, bool)
+{
+ assert(false);
+}
+
+void import_sheet_properties::set_merge_cell_range(const range_t&)
+{
+ assert(false);
+}
+
+import_reference_resolver::~import_reference_resolver()
+{
+}
+
+spreadsheet::src_address_t import_reference_resolver::resolve_address(std::string_view)
+{
+ spreadsheet::src_address_t ret;
+ ret.column = ret.row = ret.sheet = 0;
+ assert(false);
+ return ret;
+}
+
+spreadsheet::src_range_t import_reference_resolver::resolve_range(std::string_view)
+{
+ spreadsheet::src_range_t ret;
+ ret.first.column = ret.first.row = ret.last.column = ret.last.row = 0;
+ ret.first.sheet = ret.last.sheet = 0;
+ assert(false);
+ return ret;
+}
+
+import_array_formula::~import_array_formula()
+{
+}
+
+void import_array_formula::set_range(const range_t&)
+{
+ assert(false);
+}
+
+void import_array_formula::set_formula(formula_grammar_t, std::string_view)
+{
+ assert(false);
+}
+
+void import_array_formula::set_result_value(row_t, col_t, double)
+{
+ assert(false);
+}
+
+void import_array_formula::set_result_string(row_t, col_t, std::string_view)
+{
+ assert(false);
+}
+
+void import_array_formula::set_result_empty(row_t, col_t)
+{
+ assert(false);
+}
+
+void import_array_formula::set_result_bool(row_t, col_t, bool)
+{
+ assert(false);
+}
+
+void import_array_formula::commit()
+{
+ assert(false);
+}
+
+import_formula::~import_formula()
+{
+}
+
+void import_formula::set_position(row_t, col_t)
+{
+ assert(false);
+}
+
+void import_formula::set_formula(formula_grammar_t, std::string_view)
+{
+ assert(false);
+}
+
+void import_formula::set_shared_formula_index(size_t)
+{
+ assert(false);
+}
+
+void import_formula::set_result_value(double)
+{
+ assert(false);
+}
+
+void import_formula::set_result_string(std::string_view)
+{
+ assert(false);
+}
+
+void import_formula::set_result_bool(bool)
+{
+ assert(false);
+}
+
+void import_formula::set_result_empty()
+{
+ assert(false);
+}
+
+void import_formula::commit()
+{
+ assert(false);
+}
+
+// import_sheet
+
+import_sheet::~import_sheet()
+{
+}
+
+void import_sheet::set_auto(row_t, col_t, std::string_view)
+{
+ assert(false);
+}
+
+void import_sheet::set_value(row_t, col_t, double)
+{
+ assert(false);
+}
+
+void import_sheet::set_bool(row_t, col_t, bool)
+{
+ assert(false);
+}
+
+void import_sheet::set_date_time(row_t, col_t, int, int, int, int, int, double)
+{
+ assert(false);
+}
+
+void import_sheet::set_string(row_t, col_t, string_id_t)
+{
+ assert(false);
+}
+
+void import_sheet::set_format(row_t, col_t, size_t)
+{
+ assert(false);
+}
+
+void import_sheet::set_format(row_t, col_t, row_t, col_t, size_t)
+{
+ assert(false);
+}
+
+void import_sheet::set_column_format(col_t, col_t, std::size_t)
+{
+ assert(false);
+}
+
+void import_sheet::set_row_format(row_t, std::size_t)
+{
+ assert(false);
+}
+
+void import_sheet::fill_down_cells(row_t, col_t, row_t)
+{
+ assert(false);
+}
+
+orcus::spreadsheet::range_size_t import_sheet::get_sheet_size() const
+{
+ assert(false);
+ orcus::spreadsheet::range_size_t ret;
+ ret.columns = ret.rows = 0;
+ return ret;
+}
+
+}}}
+
diff --git a/src/test/test_global.cpp b/src/test/test_global.cpp
new file mode 100644
index 0000000..f689591
--- /dev/null
+++ b/src/test/test_global.cpp
@@ -0,0 +1,75 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "test_global.hpp"
+
+#include <orcus/stream.hpp>
+#include <orcus/parser_global.hpp>
+
+namespace orcus { namespace test {
+
+stack_printer::stack_printer(const char* msg) :
+ m_msg(msg)
+{
+ std::cerr << m_msg << ": --begin" << std::endl;
+ m_start_time = get_time();
+}
+
+stack_printer::~stack_printer()
+{
+ double end_time = get_time();
+ std::cerr << m_msg << ": --end (duration: " << (end_time-m_start_time) << " sec)" << std::endl;
+}
+
+double stack_printer::get_time() const
+{
+ double v = std::chrono::system_clock::now().time_since_epoch() / std::chrono::milliseconds(1);
+ return v / 1000.0;
+}
+
+assert_error::assert_error(const char* filename, size_t line_no, const char* msg)
+{
+ std::ostringstream os;
+ os << filename << ":" << line_no << ": " << msg;
+ m_msg = os.str();
+}
+
+const char* assert_error::what() const noexcept
+{
+ return m_msg.data();
+}
+
+void verify_content(
+ const char* filename, size_t line_no, std::string_view expected, const std::string& actual)
+{
+ std::string_view s1 = expected;
+ std::string_view s2(actual.data(), actual.size());
+ s1 = trim(s1);
+ s2 = trim(s2);
+
+ if (s1 != s2)
+ {
+ // TODO : improve the error message to make it more viewer-friendly.
+
+ size_t diff_pos = locate_first_different_char(s1, s2);
+ std::string msg_s1 = create_parse_error_output(s1, diff_pos);
+ std::string msg_s2 = create_parse_error_output(s2, diff_pos);
+
+ std::ostringstream os;
+ os << "content is not as expected: " << std::endl << std::endl
+ << "* expected:" << std::endl << std::endl
+ << msg_s1 << std::endl
+ << "* actual:" << std::endl << std::endl
+ << msg_s2;
+
+ throw assert_error(filename, line_no, os.str().data());
+ }
+}
+
+}} // namespace orcus::test
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/test-driver b/test-driver
new file mode 100755
index 0000000..be73b80
--- /dev/null
+++ b/test-driver
@@ -0,0 +1,153 @@
+#! /bin/sh
+# test-driver - basic testsuite driver script.
+
+scriptversion=2018-03-07.03; # UTC
+
+# Copyright (C) 2011-2021 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 <https://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.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+# Make unconditional expansion of undefined variables an error. This
+# helps a lot in preventing typo-related bugs.
+set -u
+
+usage_error ()
+{
+ echo "$0: $*" >&2
+ print_usage >&2
+ exit 2
+}
+
+print_usage ()
+{
+ cat <<END
+Usage:
+ test-driver --test-name NAME --log-file PATH --trs-file PATH
+ [--expect-failure {yes|no}] [--color-tests {yes|no}]
+ [--enable-hard-errors {yes|no}] [--]
+ TEST-SCRIPT [TEST-SCRIPT-ARGUMENTS]
+
+The '--test-name', '--log-file' and '--trs-file' options are mandatory.
+See the GNU Automake documentation for information.
+END
+}
+
+test_name= # Used for reporting.
+log_file= # Where to save the output of the test script.
+trs_file= # Where to save the metadata of the test run.
+expect_failure=no
+color_tests=no
+enable_hard_errors=yes
+while test $# -gt 0; do
+ case $1 in
+ --help) print_usage; exit $?;;
+ --version) echo "test-driver $scriptversion"; exit $?;;
+ --test-name) test_name=$2; shift;;
+ --log-file) log_file=$2; shift;;
+ --trs-file) trs_file=$2; shift;;
+ --color-tests) color_tests=$2; shift;;
+ --expect-failure) expect_failure=$2; shift;;
+ --enable-hard-errors) enable_hard_errors=$2; shift;;
+ --) shift; break;;
+ -*) usage_error "invalid option: '$1'";;
+ *) break;;
+ esac
+ shift
+done
+
+missing_opts=
+test x"$test_name" = x && missing_opts="$missing_opts --test-name"
+test x"$log_file" = x && missing_opts="$missing_opts --log-file"
+test x"$trs_file" = x && missing_opts="$missing_opts --trs-file"
+if test x"$missing_opts" != x; then
+ usage_error "the following mandatory options are missing:$missing_opts"
+fi
+
+if test $# -eq 0; then
+ usage_error "missing argument"
+fi
+
+if test $color_tests = yes; then
+ # Keep this in sync with 'lib/am/check.am:$(am__tty_colors)'.
+ red='' # Red.
+ grn='' # Green.
+ lgn='' # Light green.
+ blu='' # Blue.
+ mgn='' # Magenta.
+ std='' # No color.
+else
+ red= grn= lgn= blu= mgn= std=
+fi
+
+do_exit='rm -f $log_file $trs_file; (exit $st); exit $st'
+trap "st=129; $do_exit" 1
+trap "st=130; $do_exit" 2
+trap "st=141; $do_exit" 13
+trap "st=143; $do_exit" 15
+
+# Test script is run here. We create the file first, then append to it,
+# to ameliorate tests themselves also writing to the log file. Our tests
+# don't, but others can (automake bug#35762).
+: >"$log_file"
+"$@" >>"$log_file" 2>&1
+estatus=$?
+
+if test $enable_hard_errors = no && test $estatus -eq 99; then
+ tweaked_estatus=1
+else
+ tweaked_estatus=$estatus
+fi
+
+case $tweaked_estatus:$expect_failure in
+ 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;;
+ 0:*) col=$grn res=PASS recheck=no gcopy=no;;
+ 77:*) col=$blu res=SKIP recheck=no gcopy=yes;;
+ 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;;
+ *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;;
+ *:*) col=$red res=FAIL recheck=yes gcopy=yes;;
+esac
+
+# Report the test outcome and exit status in the logs, so that one can
+# know whether the test passed or failed simply by looking at the '.log'
+# file, without the need of also peaking into the corresponding '.trs'
+# file (automake bug#11814).
+echo "$res $test_name (exit status: $estatus)" >>"$log_file"
+
+# Report outcome to console.
+echo "${col}${res}${std}: $test_name"
+
+# Register the test result, and other relevant metadata.
+echo ":test-result: $res" > $trs_file
+echo ":global-test-result: $res" >> $trs_file
+echo ":recheck: $recheck" >> $trs_file
+echo ":copy-in-global-log: $gcopy" >> $trs_file
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/test/css/basic1.css b/test/css/basic1.css
new file mode 100644
index 0000000..0295549
--- /dev/null
+++ b/test/css/basic1.css
@@ -0,0 +1,16 @@
+
+<!--
+
+/* Handle <!-- --> */
+
+table {
+ width: auto;
+ height: 500px;
+}
+
+td {
+ color: gray;
+ background-color: yellow;
+}
+
+-->
diff --git a/test/css/basic10.css b/test/css/basic10.css
new file mode 100644
index 0000000..a4112f9
--- /dev/null
+++ b/test/css/basic10.css
@@ -0,0 +1,7 @@
+
+/* function as property value */
+.foo {
+ background-color: rgb(12, 230, 222);
+ border: solid 5px rgba(30, 12, 0, 0.79);
+}
+
diff --git a/test/css/basic11.css b/test/css/basic11.css
new file mode 100644
index 0000000..bc0f6fe
--- /dev/null
+++ b/test/css/basic11.css
@@ -0,0 +1,8 @@
+
+.callout::before {
+ content: "";
+ width: 0px;
+ height: 0px;
+ border: 0.8em solid transparent;
+ position: absolute;
+}
diff --git a/test/css/basic12.css b/test/css/basic12.css
new file mode 100644
index 0000000..d5426cc
--- /dev/null
+++ b/test/css/basic12.css
@@ -0,0 +1,19 @@
+
+div {
+ background-image: url("https://mdn.mozillademos.org/files/6457/mdn_logo_only_color.png");
+}
+
+p {
+ background-image: none;
+}
+
+div.img1 {
+ background-image: url('http://www.rabiakhan.com/Gallery/background.jpg');
+}
+
+div.img2 {
+ background-image: url(
+ http://www.tgraphic.com/userimages/Gallery/Backgrounds/TGraphic_com-Full-Wallpapers-Backgrounds_Colorful_C_1920_33.jpg
+ );
+}
+
diff --git a/test/css/basic13.css b/test/css/basic13.css
new file mode 100644
index 0000000..1bc0757
--- /dev/null
+++ b/test/css/basic13.css
@@ -0,0 +1,6 @@
+
+#p1 {background-color: hsl(120, 100%, 50%);} /* green */
+#p2 {background-color: hsl(120, 100%, 75%);} /* light green */
+#p3 {background-color: hsl(120, 100%, 25%);} /* dark green */
+#p4 {background-color: hsl(120, 60%, 70%);} /* pastel green */
+
diff --git a/test/css/basic14.css b/test/css/basic14.css
new file mode 100644
index 0000000..2007cc7
--- /dev/null
+++ b/test/css/basic14.css
@@ -0,0 +1,5 @@
+
+#p1 {background-color: hsla(120, 100%, 50%, 0.3);} /* green with opacity */
+#p2 {background-color: hsla(120, 100%, 75%, 0.3);} /* light green with opacity */
+#p3 {background-color: hsla(120, 100%, 25%, 0.3);} /* dark green with opacity */
+#p4 {background-color: hsla(120, 60%, 70%, 0.3);} /* pastel green with opacity */
diff --git a/test/css/basic2.css b/test/css/basic2.css
new file mode 100644
index 0000000..81efee6
--- /dev/null
+++ b/test/css/basic2.css
@@ -0,0 +1,10 @@
+/* selectors with class */
+
+div.foo { border: solid 1px; }
+
+.warning
+/* warning for all elements */
+{
+ background-color: red;
+ font-weight: 900;
+}
diff --git a/test/css/basic3.css b/test/css/basic3.css
new file mode 100644
index 0000000..1a43f6d
--- /dev/null
+++ b/test/css/basic3.css
@@ -0,0 +1,10 @@
+/* Grouped selectors */
+html, body {
+ height: 100%; /* This equals height of browser's inner window size. */
+}
+
+h1, h2, h3, h4 {
+ font-variant: small-caps;
+ padding: 2.5em;
+}
+
diff --git a/test/css/basic4.css b/test/css/basic4.css
new file mode 100644
index 0000000..3972d91
--- /dev/null
+++ b/test/css/basic4.css
@@ -0,0 +1,6 @@
+h1 { margin: 0.5in } /* inches */
+h2 { line-height: 3cm } /* centimeters */
+h3 { word-spacing: 4mm } /* millimeters */
+h4 { font-size: 12pt } /* points */
+h4 { font-size: 1pc } /* picas */
+p { font-size: 12px } /* px */
diff --git a/test/css/basic5.css b/test/css/basic5.css
new file mode 100644
index 0000000..511803a
--- /dev/null
+++ b/test/css/basic5.css
@@ -0,0 +1,7 @@
+/* Handling of comments */
+
+/**/ .info/*--*/{/**/
+/*!!!!*/ word-spacing /**/: /**/normal/**/;/**/
+}/**/
+
+/* end */
diff --git a/test/css/basic6.css b/test/css/basic6.css
new file mode 100644
index 0000000..ad55e6d
--- /dev/null
+++ b/test/css/basic6.css
@@ -0,0 +1,8 @@
+/* ID selector */
+h1#chapter1 { text-align: center }
+
+h1#z98y { letter-spacing: 0.5em }
+
+#id_global {
+ margin: 10px;
+}
diff --git a/test/css/basic7.css b/test/css/basic7.css
new file mode 100644
index 0000000..9e857b5
--- /dev/null
+++ b/test/css/basic7.css
@@ -0,0 +1,26 @@
+/* selector with multiple classes */
+
+.one.two.three {
+ color: blue;
+}
+
+.one {
+ color: aqua;
+}
+
+.two {
+ color: azure;
+}
+
+.one.two {
+ color: brown;
+}
+
+span.button.selected {
+ border: solid 4px red;
+}
+
+span.button {
+ border: solid 1px gray;
+}
+
diff --git a/test/css/basic8.css b/test/css/basic8.css
new file mode 100644
index 0000000..f467bef
--- /dev/null
+++ b/test/css/basic8.css
@@ -0,0 +1,15 @@
+
+.ribbon {
+ background-color: #5BC8F7;
+}
+
+.ribbon::after {
+ content: "Look at this orange box.";
+ background-color: #FFBA10;
+ border-color: black;
+ border-style: dotted;
+}
+
+.ribbon::after::selection {
+ content: 'Selected orange box.';
+}
diff --git a/test/css/basic9.css b/test/css/basic9.css
new file mode 100644
index 0000000..cb26aff
--- /dev/null
+++ b/test/css/basic9.css
@@ -0,0 +1,20 @@
+/* unvisited link */
+a:link {
+ color: #FF0000;
+}
+
+/* visited link */
+a:visited {
+ color: #00FF00;
+}
+
+/* mouse over link */
+a:hover {
+ color: #FF00FF;
+}
+
+/* selected link */
+a:active {
+ color: #0000FF;
+}
+
diff --git a/test/css/chained1.css b/test/css/chained1.css
new file mode 100644
index 0000000..3b4dcae
--- /dev/null
+++ b/test/css/chained1.css
@@ -0,0 +1,15 @@
+/* descendant selector */
+div p {
+ background-color: yellow;
+}
+
+/* direct child */
+div > p {
+ background-color: blue;
+}
+
+/* next sibling */
+div + p {
+ background-color: red;
+}
+
diff --git a/test/css/chained2.css b/test/css/chained2.css
new file mode 100644
index 0000000..7bcbc6e
--- /dev/null
+++ b/test/css/chained2.css
@@ -0,0 +1,6 @@
+
+/* selector with 3 chained simple selectors */
+#id1 table.data td {
+ background-color: aquamarine;
+ border: solid 2px;
+}
diff --git a/test/css/complex/callout.css b/test/css/complex/callout.css
new file mode 100644
index 0000000..e6c7c36
--- /dev/null
+++ b/test/css/complex/callout.css
@@ -0,0 +1,71 @@
+
+body {
+ font-family: Helvetica;
+ font-size: 13px;
+}
+
+div.callout {
+ height: 60px;
+ width: 200px;
+ float: left;
+}
+
+div.callout {
+ background-color: #444;
+ background-image: -moz-linear-gradient(top, #444, #444);
+ position: relative;
+ color: #ccc;
+ padding: 10px;
+ border-radius: 3px;
+ box-shadow: 0px 0px 20px #999;
+ margin: 25px;
+ min-height: 50px;
+ border: 1px solid #333;
+ text-shadow: 0 0 1px #000;
+
+ /*box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2) inset;*/
+}
+
+.callout::before {
+ content: "";
+ width: 0px;
+ height: 0px;
+ border: 0.8em solid transparent;
+ position: absolute;
+}
+
+.callout.top::before {
+ left: 60%;
+ bottom: -20px;
+ border-top: 10px solid #444;
+}
+
+.callout.bottom::before {
+ left: 45%;
+ top: -20px;
+ border-bottom: 10px solid #444;
+}
+
+.callout.left::before {
+ right: -20px;
+ top: 40%;
+ border-left: 10px solid #444;
+}
+
+.callout.right::before {
+ left: -20px;
+ top: 40%;
+ border-right: 10px solid #444;
+}
+
+.callout.top-left::before {
+ left: 7px;
+ bottom: -20px;
+ border-top: 10px solid #444;
+}
+
+.callout.top-right::before {
+ right: 7px;
+ bottom: -20px;
+ border-top: 10px solid #444;
+}
diff --git a/test/css/complex/excel-html.css b/test/css/complex/excel-html.css
new file mode 100644
index 0000000..6bf7886
--- /dev/null
+++ b/test/css/complex/excel-html.css
@@ -0,0 +1,103 @@
+<!--table
+ {mso-displayed-decimal-separator:"\.";
+ mso-displayed-thousand-separator:"\,";}
+@page
+ {margin:1.0in .75in 1.0in .75in;
+ mso-header-margin:.5in;
+ mso-footer-margin:.5in;}
+tr
+ {mso-height-source:auto;}
+col
+ {mso-width-source:auto;}
+br
+ {mso-data-placement:same-cell;}
+.style0
+ {mso-number-format:General;
+ text-align:general;
+ vertical-align:bottom;
+ white-space:nowrap;
+ mso-rotate:0;
+ mso-background-source:auto;
+ mso-pattern:auto;
+ color:windowtext;
+ font-size:11.0pt;
+ font-weight:400;
+ font-style:normal;
+ text-decoration:none;
+ font-family:"Zurich BT";
+ mso-generic-font-family:auto;
+ mso-font-charset:0;
+ border:none;
+ mso-protection:locked visible;
+ mso-style-name:Normal;
+ mso-style-id:0;}
+td
+ {mso-style-parent:style0;
+ padding-top:1px;
+ padding-right:1px;
+ padding-left:1px;
+ mso-ignore:padding;
+ color:windowtext;
+ font-size:11.0pt;
+ font-weight:400;
+ font-style:normal;
+ text-decoration:none;
+ font-family:"Zurich BT";
+ mso-generic-font-family:auto;
+ mso-font-charset:0;
+ mso-number-format:General;
+ text-align:general;
+ vertical-align:bottom;
+ border:none;
+ mso-background-source:auto;
+ mso-pattern:auto;
+ mso-protection:locked visible;
+ white-space:nowrap;
+ mso-rotate:0;}
+.xl24
+ {mso-style-parent:style0;
+ font-weight:700;
+ text-align:center;
+ background:silver;
+ mso-pattern:auto none;}
+.xl25
+ {mso-style-parent:style0;
+ font-weight:700;
+ text-align:center;
+ border:.5pt solid black;
+ background:silver;
+ mso-pattern:auto none;
+ white-space:normal;}
+.xl26
+ {mso-style-parent:style0;
+ font-weight:700;
+ text-align:center;
+ border-top:.5pt solid black;
+ border-right:.5pt solid black;
+ border-bottom:.5pt solid black;
+ border-left:none;
+ background:silver;
+ mso-pattern:auto none;
+ white-space:normal;}
+.xl27
+ {mso-style-parent:style0;
+ text-align:center;}
+.xl28
+ {mso-style-parent:style0;
+ mso-number-format:"\@";
+ text-align:center;
+ border-top:none;
+ border-right:.5pt solid black;
+ border-bottom:.5pt solid black;
+ border-left:.5pt solid black;
+ white-space:normal;}
+.xl29
+ {mso-style-parent:style0;
+ mso-number-format:"\@";
+ text-align:center;
+ border-top:none;
+ border-right:.5pt solid black;
+ border-bottom:.5pt solid black;
+ border-left:none;
+ white-space:normal;}
+-->
diff --git a/test/css/empty.css b/test/css/empty.css
new file mode 100644
index 0000000..1a4baf5
--- /dev/null
+++ b/test/css/empty.css
@@ -0,0 +1 @@
+
diff --git a/test/css/invalids/1.css b/test/css/invalids/1.css
new file mode 100644
index 0000000..60a648c
--- /dev/null
+++ b/test/css/invalids/1.css
@@ -0,0 +1,7 @@
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font ss:FontName="Arial Cyr" x:CharSet="204"/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+
diff --git a/test/css/test.css b/test/css/test.css
new file mode 100644
index 0000000..4ec1e86
--- /dev/null
+++ b/test/css/test.css
@@ -0,0 +1,15 @@
+
+
+
+ <!--
+.test {
+ font-weight: bold;
+ font-size: 34px;
+}
+h1, h2 { color: blue; }
+
+td.text { mso-number-format:"@"; color: red; }
+-->
+
+
+
diff --git a/test/css/utf8-1.css b/test/css/utf8-1.css
new file mode 100644
index 0000000..1a509eb
--- /dev/null
+++ b/test/css/utf8-1.css
@@ -0,0 +1,13 @@
+
+.style17
+ {mso-pattern:auto none;
+ background:#EDEDED;
+ color:#000000;
+ font-size:11.0pt;
+ font-weight:400;
+ font-style:normal;
+ text-decoration:none;
+ font-family:宋体;
+ mso-generic-font-family:auto;
+ mso-font-charset:0;
+ mso-style-name:"20% - 强调文字颜色 3";}
diff --git a/test/csv/double-quotes/check.txt b/test/csv/double-quotes/check.txt
new file mode 100644
index 0000000..7bf03e1
--- /dev/null
+++ b/test/csv/double-quotes/check.txt
@@ -0,0 +1,6 @@
+data/0/0:string:"\"single literal quote\""
+data/0/1:string:"\"\"double literal quote\"\""
+data/0/2:string:"\"\"\"triple literal quote\"\"\""
+data/1/0:numeric:1
+data/1/1:numeric:2
+data/1/2:numeric:3
diff --git a/test/csv/double-quotes/input.csv b/test/csv/double-quotes/input.csv
new file mode 100644
index 0000000..3c8ee50
--- /dev/null
+++ b/test/csv/double-quotes/input.csv
@@ -0,0 +1,3 @@
+"""single literal quote""","""""double literal quote""""","""""""triple literal quote"""""""
+1,2,3
+
diff --git a/test/csv/normal-quotes/check.txt b/test/csv/normal-quotes/check.txt
new file mode 100644
index 0000000..dc3f207
--- /dev/null
+++ b/test/csv/normal-quotes/check.txt
@@ -0,0 +1,6 @@
+data/0/0:string:"normal quote"
+data/0/1:string:" not quoted"
+data/0/2:string:" \"and other quoted cells\""
+data/1/0:string:"not quoted"
+data/1/1:string:" \"quoted\""
+data/1/2:string:" and so on...."
diff --git a/test/csv/normal-quotes/input.csv b/test/csv/normal-quotes/input.csv
new file mode 100644
index 0000000..f600712
--- /dev/null
+++ b/test/csv/normal-quotes/input.csv
@@ -0,0 +1,2 @@
+"normal quote", not quoted, "and other quoted cells"
+not quoted, "quoted", and so on....
diff --git a/test/csv/quoted-with-delim/check.txt b/test/csv/quoted-with-delim/check.txt
new file mode 100644
index 0000000..dd594fe
--- /dev/null
+++ b/test/csv/quoted-with-delim/check.txt
@@ -0,0 +1,2 @@
+data/0/0:string:"This is a single normal quoted cell, and contains a delimiter."
+data/0/1:string:"next cell"
diff --git a/test/csv/quoted-with-delim/input.csv b/test/csv/quoted-with-delim/input.csv
new file mode 100644
index 0000000..d7114cf
--- /dev/null
+++ b/test/csv/quoted-with-delim/input.csv
@@ -0,0 +1 @@
+"This is a single normal quoted cell, and contains a delimiter.",next cell
diff --git a/test/csv/simple-numbers/check.txt b/test/csv/simple-numbers/check.txt
new file mode 100644
index 0000000..0c5a816
--- /dev/null
+++ b/test/csv/simple-numbers/check.txt
@@ -0,0 +1,11 @@
+data/0/0:numeric:1
+data/0/1:numeric:2
+data/0/2:numeric:3
+data/0/3:numeric:4
+data/0/4:numeric:5
+data/1/0:numeric:6
+data/1/1:numeric:7
+data/1/2:numeric:8
+data/1/3:numeric:9
+data/1/4:numeric:10
+data/3/0:numeric:11
diff --git a/test/csv/simple-numbers/input.csv b/test/csv/simple-numbers/input.csv
new file mode 100644
index 0000000..e8712bc
--- /dev/null
+++ b/test/csv/simple-numbers/input.csv
@@ -0,0 +1,5 @@
+1,2,3,4,5
+6,7,8,9,10
+
+11
+
diff --git a/test/csv/split-sheet/check-1.txt b/test/csv/split-sheet/check-1.txt
new file mode 100644
index 0000000..7eae1fb
--- /dev/null
+++ b/test/csv/split-sheet/check-1.txt
@@ -0,0 +1,42 @@
+data/0/0:string:"F1"
+data/0/1:string:"F2"
+data/1/0:string:"A-1"
+data/1/1:numeric:1
+data/2/0:string:"A-2"
+data/2/1:numeric:2
+data/3/0:string:"A-3"
+data/3/1:numeric:3
+data/4/0:string:"A-4"
+data/4/1:numeric:4
+data/5/0:string:"A-5"
+data/5/1:numeric:5
+data/6/0:string:"A-6"
+data/6/1:numeric:6
+data/7/0:string:"A-7"
+data/7/1:numeric:7
+data/8/0:string:"A-8"
+data/8/1:numeric:8
+data/9/0:string:"A-9"
+data/9/1:numeric:9
+data/10/0:string:"A-10"
+data/10/1:numeric:10
+data_1/0/0:string:"A-11"
+data_1/0/1:numeric:11
+data_1/1/0:string:"A-12"
+data_1/1/1:numeric:12
+data_1/2/0:string:"A-13"
+data_1/2/1:numeric:13
+data_1/3/0:string:"A-14"
+data_1/3/1:numeric:14
+data_1/4/0:string:"A-15"
+data_1/4/1:numeric:15
+data_1/5/0:string:"A-16"
+data_1/5/1:numeric:16
+data_1/6/0:string:"A-17"
+data_1/6/1:numeric:17
+data_1/7/0:string:"A-18"
+data_1/7/1:numeric:18
+data_1/8/0:string:"A-19"
+data_1/8/1:numeric:19
+data_1/9/0:string:"A-20"
+data_1/9/1:numeric:20
diff --git a/test/csv/split-sheet/check-2.txt b/test/csv/split-sheet/check-2.txt
new file mode 100644
index 0000000..f022c8b
--- /dev/null
+++ b/test/csv/split-sheet/check-2.txt
@@ -0,0 +1,44 @@
+data/0/0:string:"F1"
+data/0/1:string:"F2"
+data/1/0:string:"A-1"
+data/1/1:numeric:1
+data/2/0:string:"A-2"
+data/2/1:numeric:2
+data/3/0:string:"A-3"
+data/3/1:numeric:3
+data/4/0:string:"A-4"
+data/4/1:numeric:4
+data/5/0:string:"A-5"
+data/5/1:numeric:5
+data/6/0:string:"A-6"
+data/6/1:numeric:6
+data/7/0:string:"A-7"
+data/7/1:numeric:7
+data/8/0:string:"A-8"
+data/8/1:numeric:8
+data/9/0:string:"A-9"
+data/9/1:numeric:9
+data/10/0:string:"A-10"
+data/10/1:numeric:10
+data_1/0/0:string:"F1"
+data_1/0/1:string:"F2"
+data_1/1/0:string:"A-11"
+data_1/1/1:numeric:11
+data_1/2/0:string:"A-12"
+data_1/2/1:numeric:12
+data_1/3/0:string:"A-13"
+data_1/3/1:numeric:13
+data_1/4/0:string:"A-14"
+data_1/4/1:numeric:14
+data_1/5/0:string:"A-15"
+data_1/5/1:numeric:15
+data_1/6/0:string:"A-16"
+data_1/6/1:numeric:16
+data_1/7/0:string:"A-17"
+data_1/7/1:numeric:17
+data_1/8/0:string:"A-18"
+data_1/8/1:numeric:18
+data_1/9/0:string:"A-19"
+data_1/9/1:numeric:19
+data_1/10/0:string:"A-20"
+data_1/10/1:numeric:20
diff --git a/test/csv/split-sheet/check-3.txt b/test/csv/split-sheet/check-3.txt
new file mode 100644
index 0000000..182a09b
--- /dev/null
+++ b/test/csv/split-sheet/check-3.txt
@@ -0,0 +1,22 @@
+data/0/0:string:"F1"
+data/0/1:string:"F2"
+data/1/0:string:"A-1"
+data/1/1:numeric:1
+data/2/0:string:"A-2"
+data/2/1:numeric:2
+data/3/0:string:"A-3"
+data/3/1:numeric:3
+data/4/0:string:"A-4"
+data/4/1:numeric:4
+data/5/0:string:"A-5"
+data/5/1:numeric:5
+data/6/0:string:"A-6"
+data/6/1:numeric:6
+data/7/0:string:"A-7"
+data/7/1:numeric:7
+data/8/0:string:"A-8"
+data/8/1:numeric:8
+data/9/0:string:"A-9"
+data/9/1:numeric:9
+data/10/0:string:"A-10"
+data/10/1:numeric:10
diff --git a/test/csv/split-sheet/input.csv b/test/csv/split-sheet/input.csv
new file mode 100644
index 0000000..fd4ce9d
--- /dev/null
+++ b/test/csv/split-sheet/input.csv
@@ -0,0 +1,21 @@
+F1,F2
+A-1,1
+A-2,2
+A-3,3
+A-4,4
+A-5,5
+A-6,6
+A-7,7
+A-8,8
+A-9,9
+A-10,10
+A-11,11
+A-12,12
+A-13,13
+A-14,14
+A-15,15
+A-16,16
+A-17,17
+A-18,18
+A-19,19
+A-20,20
diff --git a/test/gnumeric/background-color/standard.gnumeric b/test/gnumeric/background-color/standard.gnumeric
new file mode 100644
index 0000000..26206a9
--- /dev/null
+++ b/test/gnumeric/background-color/standard.gnumeric
Binary files differ
diff --git a/test/gnumeric/borders/colors.gnumeric b/test/gnumeric/borders/colors.gnumeric
new file mode 100644
index 0000000..2f632db
--- /dev/null
+++ b/test/gnumeric/borders/colors.gnumeric
Binary files differ
diff --git a/test/gnumeric/borders/directions.gnumeric b/test/gnumeric/borders/directions.gnumeric
new file mode 100644
index 0000000..897fda0
--- /dev/null
+++ b/test/gnumeric/borders/directions.gnumeric
Binary files differ
diff --git a/test/gnumeric/borders/grid-box.gnumeric b/test/gnumeric/borders/grid-box.gnumeric
new file mode 100644
index 0000000..c01988c
--- /dev/null
+++ b/test/gnumeric/borders/grid-box.gnumeric
Binary files differ
diff --git a/test/gnumeric/borders/single-cells.gnumeric b/test/gnumeric/borders/single-cells.gnumeric
new file mode 100644
index 0000000..e394402
--- /dev/null
+++ b/test/gnumeric/borders/single-cells.gnumeric
Binary files differ
diff --git a/test/gnumeric/cell-properties/wrap-and-shrink.gnumeric b/test/gnumeric/cell-properties/wrap-and-shrink.gnumeric
new file mode 100644
index 0000000..8b6dd3b
--- /dev/null
+++ b/test/gnumeric/cell-properties/wrap-and-shrink.gnumeric
Binary files differ
diff --git a/test/gnumeric/cell-value-types/check.txt b/test/gnumeric/cell-value-types/check.txt
new file mode 100644
index 0000000..43b97e9
--- /dev/null
+++ b/test/gnumeric/cell-value-types/check.txt
@@ -0,0 +1,41 @@
+Values/0/0:string:"Numeric"
+Values/0/1:numeric:1.2
+Values/1/0:string:"Boolean"
+Values/1/1:boolean:true
+Values/2/0:string:"String"
+Values/2/1:string:"This is string"
+Values/3/0:string:"Integer"
+Values/3/1:numeric:11
+Values/4/0:string:"Numeric"
+Values/4/1:numeric:-1.2
+Formula/0/0:numeric:1
+Formula/0/1:formula:A1*2:2
+Formula/1/0:numeric:2
+Formula/1/1:formula:A2*2:4
+Formula/2/0:numeric:3
+Formula/2/1:formula:A3*2:6
+Formula/3/0:numeric:4
+Formula/3/1:formula:A4*2:8
+Formula/4/0:numeric:5
+Formula/4/1:formula:A5*2:10
+Formula/5/0:numeric:6
+Formula/5/1:formula:A6*2:12
+Formula/6/0:numeric:7
+Formula/6/1:formula:A7*2:14
+Formula/7/0:numeric:8
+Formula/7/1:formula:A8*2:16
+Array/0/0:numeric:1
+Array/0/1:numeric:2
+Array/0/2:numeric:3
+Array/2/0:numeric:4
+Array/3/0:numeric:5
+Array/4/0:numeric:6
+Array/6/0:formula:{MMULT(A3:A5,A1:C1)}:4
+Array/6/1:formula:{MMULT(A3:A5,A1:C1)}:8
+Array/6/2:formula:{MMULT(A3:A5,A1:C1)}:12
+Array/7/0:formula:{MMULT(A3:A5,A1:C1)}:5
+Array/7/1:formula:{MMULT(A3:A5,A1:C1)}:10
+Array/7/2:formula:{MMULT(A3:A5,A1:C1)}:15
+Array/8/0:formula:{MMULT(A3:A5,A1:C1)}:6
+Array/8/1:formula:{MMULT(A3:A5,A1:C1)}:12
+Array/8/2:formula:{MMULT(A3:A5,A1:C1)}:18
diff --git a/test/gnumeric/cell-value-types/input.gnumeric b/test/gnumeric/cell-value-types/input.gnumeric
new file mode 100644
index 0000000..2c4c38b
--- /dev/null
+++ b/test/gnumeric/cell-value-types/input.gnumeric
Binary files differ
diff --git a/test/gnumeric/colored-text/input.gnumeric b/test/gnumeric/colored-text/input.gnumeric
new file mode 100644
index 0000000..68e48fa
--- /dev/null
+++ b/test/gnumeric/colored-text/input.gnumeric
Binary files differ
diff --git a/test/gnumeric/column-width-row-height/input.gnumeric b/test/gnumeric/column-width-row-height/input.gnumeric
new file mode 100644
index 0000000..66b5cc8
--- /dev/null
+++ b/test/gnumeric/column-width-row-height/input.gnumeric
Binary files differ
diff --git a/test/gnumeric/formula-cells/check.txt b/test/gnumeric/formula-cells/check.txt
new file mode 100644
index 0000000..b6abe9c
--- /dev/null
+++ b/test/gnumeric/formula-cells/check.txt
@@ -0,0 +1,7 @@
+Sheet1/0/0:numeric:1
+Sheet1/0/1:formula:A1*2:2
+Sheet1/1/0:numeric:2
+Sheet1/1/1:formula:A2-10:-8
+Sheet1/2/0:numeric:3
+Sheet1/2/1:formula:A3/3:1
+Sheet1/4/0:formula:SUM(A1:A3):6
diff --git a/test/gnumeric/formula-cells/input.gnumeric b/test/gnumeric/formula-cells/input.gnumeric
new file mode 100644
index 0000000..b236b4a
--- /dev/null
+++ b/test/gnumeric/formula-cells/input.gnumeric
Binary files differ
diff --git a/test/gnumeric/hidden-rows-columns/input.gnumeric b/test/gnumeric/hidden-rows-columns/input.gnumeric
new file mode 100644
index 0000000..d8e8cc5
--- /dev/null
+++ b/test/gnumeric/hidden-rows-columns/input.gnumeric
Binary files differ
diff --git a/test/gnumeric/merged-cells/input.gnumeric b/test/gnumeric/merged-cells/input.gnumeric
new file mode 100644
index 0000000..f167bed
--- /dev/null
+++ b/test/gnumeric/merged-cells/input.gnumeric
Binary files differ
diff --git a/test/gnumeric/named-expression-sheet-local/check.txt b/test/gnumeric/named-expression-sheet-local/check.txt
new file mode 100644
index 0000000..321f221
--- /dev/null
+++ b/test/gnumeric/named-expression-sheet-local/check.txt
@@ -0,0 +1,22 @@
+Sheet1/0/0:numeric:1
+Sheet1/0/1:numeric:6
+Sheet1/1/0:numeric:2
+Sheet1/1/1:numeric:7
+Sheet1/2/0:numeric:3
+Sheet1/2/1:numeric:8
+Sheet1/3/0:numeric:4
+Sheet1/3/1:numeric:9
+Sheet1/4/0:numeric:5
+Sheet1/4/1:numeric:10
+Sheet1/6/0:formula:SUM(MyRange):27
+Sheet2/0/0:numeric:10
+Sheet2/0/1:numeric:20
+Sheet2/1/0:numeric:11
+Sheet2/1/1:numeric:21
+Sheet2/2/0:numeric:12
+Sheet2/2/1:numeric:22
+Sheet2/3/0:numeric:13
+Sheet2/3/1:numeric:23
+Sheet2/4/0:numeric:14
+Sheet2/4/1:numeric:24
+Sheet2/6/0:formula:SUM(MyRange):74
diff --git a/test/gnumeric/named-expression-sheet-local/input.gnumeric b/test/gnumeric/named-expression-sheet-local/input.gnumeric
new file mode 100644
index 0000000..2034e28
--- /dev/null
+++ b/test/gnumeric/named-expression-sheet-local/input.gnumeric
Binary files differ
diff --git a/test/gnumeric/named-expression/check.txt b/test/gnumeric/named-expression/check.txt
new file mode 100644
index 0000000..d6d6ff0
--- /dev/null
+++ b/test/gnumeric/named-expression/check.txt
@@ -0,0 +1,12 @@
+Sheet1/0/0:numeric:1
+Sheet1/0/1:numeric:6
+Sheet1/1/0:numeric:2
+Sheet1/1/1:numeric:7
+Sheet1/2/0:numeric:3
+Sheet1/2/1:numeric:8
+Sheet1/3/0:numeric:4
+Sheet1/3/1:numeric:9
+Sheet1/4/0:numeric:5
+Sheet1/4/1:numeric:10
+Sheet1/6/0:formula:SUM(MyRange):15
+Sheet1/6/1:formula:SUM(MyRange2):55
diff --git a/test/gnumeric/named-expression/input.gnumeric b/test/gnumeric/named-expression/input.gnumeric
new file mode 100644
index 0000000..7b0d682
--- /dev/null
+++ b/test/gnumeric/named-expression/input.gnumeric
Binary files differ
diff --git a/test/gnumeric/number-formats/input.gnumeric b/test/gnumeric/number-formats/input.gnumeric
new file mode 100644
index 0000000..5fda45e
--- /dev/null
+++ b/test/gnumeric/number-formats/input.gnumeric
Binary files differ
diff --git a/test/gnumeric/raw-values-1/check.txt b/test/gnumeric/raw-values-1/check.txt
new file mode 100644
index 0000000..935cf22
--- /dev/null
+++ b/test/gnumeric/raw-values-1/check.txt
@@ -0,0 +1,25 @@
+Num/1/0:numeric:1.1
+Num/1/2:numeric:2.1
+Num/1/4:numeric:3.1
+Num/2/0:numeric:1.2
+Num/2/2:numeric:2.2
+Num/2/4:numeric:3.2
+Num/3/0:numeric:1.3
+Num/3/2:numeric:2.3
+Num/3/4:numeric:3.3
+Num/6/2:numeric:5
+Num/6/3:numeric:6
+Num/6/4:numeric:7
+Text/0/0:string:"A"
+Text/1/0:string:"B"
+Text/1/1:string:"D"
+Text/2/0:string:"C"
+Text/2/1:string:"E"
+Text/2/2:string:"G"
+Text/3/1:string:"F"
+Text/3/2:string:"H"
+Text/4/2:string:"I"
+Text/6/3:string:"Andy"
+Text/7/3:string:"Bruce"
+Text/8/3:string:"Charlie"
+Text/9/3:string:"David"
diff --git a/test/gnumeric/raw-values-1/input.gnumeric b/test/gnumeric/raw-values-1/input.gnumeric
new file mode 100644
index 0000000..589694e
--- /dev/null
+++ b/test/gnumeric/raw-values-1/input.gnumeric
Binary files differ
diff --git a/test/gnumeric/table/autofilter.gnumeric b/test/gnumeric/table/autofilter.gnumeric
new file mode 100644
index 0000000..8a4746d
--- /dev/null
+++ b/test/gnumeric/table/autofilter.gnumeric
Binary files differ
diff --git a/test/gnumeric/test.gnumeric b/test/gnumeric/test.gnumeric
new file mode 100644
index 0000000..53d2026
--- /dev/null
+++ b/test/gnumeric/test.gnumeric
Binary files differ
diff --git a/test/gnumeric/text-alignment/input.gnumeric b/test/gnumeric/text-alignment/input.gnumeric
new file mode 100644
index 0000000..1dacd39
--- /dev/null
+++ b/test/gnumeric/text-alignment/input.gnumeric
Binary files differ
diff --git a/test/gnumeric/text-formats/input.gnumeric b/test/gnumeric/text-formats/input.gnumeric
new file mode 100644
index 0000000..4c79646
--- /dev/null
+++ b/test/gnumeric/text-formats/input.gnumeric
Binary files differ
diff --git a/test/json-mapped/array-of-arrays-basic/check.txt b/test/json-mapped/array-of-arrays-basic/check.txt
new file mode 100644
index 0000000..28da464
--- /dev/null
+++ b/test/json-mapped/array-of-arrays-basic/check.txt
@@ -0,0 +1,11 @@
+data/0/2:string:"Simple list of arrays"
+data/1/2:string:"This file contains a list of arrays as data and some title strings at the top."
+data/3/1:numeric:1
+data/3/2:numeric:2
+data/3/3:numeric:3
+data/4/1:numeric:4
+data/4/2:numeric:5
+data/4/3:numeric:6
+data/5/1:numeric:7
+data/5/2:numeric:8
+data/5/3:numeric:9
diff --git a/test/json-mapped/array-of-arrays-basic/input.json b/test/json-mapped/array-of-arrays-basic/input.json
new file mode 100644
index 0000000..a93a012
--- /dev/null
+++ b/test/json-mapped/array-of-arrays-basic/input.json
@@ -0,0 +1,9 @@
+[
+ "Simple list of arrays",
+ "This file contains a list of arrays as data and some title strings at the top.",
+ [
+ [1, 2, 3],
+ [4, 5, 6],
+ [7, 8, 9]
+ ]
+]
diff --git a/test/json-mapped/array-of-arrays-basic/map.json b/test/json-mapped/array-of-arrays-basic/map.json
new file mode 100644
index 0000000..68af455
--- /dev/null
+++ b/test/json-mapped/array-of-arrays-basic/map.json
@@ -0,0 +1,19 @@
+{
+ "sheets": ["data"],
+ "cells": [
+ {"path": "$[0]", "sheet": "data", "row": 0, "column": 2},
+ {"path": "$[1]", "sheet": "data", "row": 1, "column": 2}
+ ],
+ "ranges": [
+ {"sheet": "data", "row": 3, "column": 1,
+ "fields": [
+ {"path": "$[][][0]"},
+ {"path": "$[][][1]"},
+ {"path": "$[][][2]"}
+ ],
+ "row-groups": [
+ {"path": "$[]"}
+ ]
+ }
+ ]
+}
diff --git a/test/json-mapped/array-of-arrays-header/check.txt b/test/json-mapped/array-of-arrays-header/check.txt
new file mode 100644
index 0000000..0a8b423
--- /dev/null
+++ b/test/json-mapped/array-of-arrays-header/check.txt
@@ -0,0 +1,57 @@
+city/0/0:string:"RID"
+city/0/1:string:"Country"
+city/0/2:string:"City"
+city/1/0:string:"1"
+city/1/1:string:"Tunisia"
+city/1/2:string:"Menzel Bourguiba"
+city/2/0:string:"2"
+city/2/1:string:"Indonesia"
+city/2/2:string:"Jiwuwu"
+city/3/0:string:"3"
+city/3/1:string:"China"
+city/3/2:string:"Dingtou"
+city/4/0:string:"4"
+city/4/1:string:"China"
+city/4/2:string:"Tucheng"
+city/5/0:string:"5"
+city/5/1:string:"United States"
+city/5/2:string:"Charlotte"
+city/6/0:string:"6"
+city/6/1:string:"China"
+city/6/2:string:"Xuwei"
+city/7/0:string:"7"
+city/7/1:string:"Uganda"
+city/7/2:string:"Moroto"
+city/8/0:string:"8"
+city/8/1:string:"Poland"
+city/8/2:string:"Krasne"
+city/9/0:string:"10"
+city/9/1:string:"Indonesia"
+city/9/2:string:"Babakan"
+city/10/0:string:"11"
+city/10/1:string:"Philippines"
+city/10/2:string:"Vigo"
+city/11/0:string:"12"
+city/11/1:string:"Tajikistan"
+city/11/2:string:"Konsoy"
+city/12/0:string:"13"
+city/12/1:string:"Honduras"
+city/12/2:string:"La Estancia"
+city/13/0:string:"14"
+city/13/1:string:"Japan"
+city/13/2:string:"Yatsushiro"
+city/14/0:string:"15"
+city/14/1:string:"Mexico"
+city/14/2:string:"Lindavista"
+city/15/0:string:"17"
+city/15/1:string:"United States"
+city/15/2:string:"San Jose"
+city/16/0:string:"18"
+city/16/1:string:"Nigeria"
+city/16/2:string:"Uyo"
+city/17/0:string:"19"
+city/17/1:string:"Brazil"
+city/17/2:string:"Planaltina"
+city/18/0:string:"20"
+city/18/1:string:"United States"
+city/18/2:string:"Indianapolis"
diff --git a/test/json-mapped/array-of-arrays-header/input.json b/test/json-mapped/array-of-arrays-header/input.json
new file mode 100644
index 0000000..4f0fbe9
--- /dev/null
+++ b/test/json-mapped/array-of-arrays-header/input.json
@@ -0,0 +1,19 @@
+[["1","Tunisia","Menzel Bourguiba"],
+["2","Indonesia","Jiwuwu"],
+["3","China","Dingtou"],
+["4","China","Tucheng"],
+["5","United States","Charlotte"],
+["6","China","Xuwei"],
+["7","Uganda","Moroto"],
+["8","Poland","Krasne"],
+["10","Indonesia","Babakan"],
+["11","Philippines","Vigo"],
+["12","Tajikistan","Konsoy"],
+["13","Honduras","La Estancia"],
+["14","Japan","Yatsushiro"],
+["15","Mexico","Lindavista"],
+["17","United States","San Jose"],
+["18","Nigeria","Uyo"],
+["19","Brazil","Planaltina"],
+["20","United States","Indianapolis"]
+]
diff --git a/test/json-mapped/array-of-arrays-header/map.json b/test/json-mapped/array-of-arrays-header/map.json
new file mode 100644
index 0000000..1c7bfea
--- /dev/null
+++ b/test/json-mapped/array-of-arrays-header/map.json
@@ -0,0 +1,15 @@
+{
+ "sheets": ["city"],
+ "ranges": [
+ {"row": 0, "column": 0, "sheet": "city", "row-header": true,
+ "fields": [
+ {"path": "$[][0]", "label": "RID"},
+ {"path": "$[][1]", "label": "Country"},
+ {"path": "$[][2]", "label": "City"},
+ ],
+ "row-groups": [
+ {"path": "$"},
+ ]
+ }
+ ]
+}
diff --git a/test/json-mapped/array-of-objects-basic/check.txt b/test/json-mapped/array-of-objects-basic/check.txt
new file mode 100644
index 0000000..6aba1bb
--- /dev/null
+++ b/test/json-mapped/array-of-objects-basic/check.txt
@@ -0,0 +1,20 @@
+Imported/0/0:numeric:1
+Imported/0/1:string:"Caitlin"
+Imported/0/2:string:"Kealy"
+Imported/0/3:string:"ckealy0@hud.gov"
+Imported/1/0:numeric:2
+Imported/1/1:string:"Bernice"
+Imported/1/2:string:"McEvilly"
+Imported/1/3:string:"bmcevilly1@comsenz.com"
+Imported/2/0:numeric:3
+Imported/2/1:string:"Ariel"
+Imported/2/2:string:"Casajuana"
+Imported/2/3:string:"acasajuana2@fema.gov"
+Imported/3/0:numeric:4
+Imported/3/1:string:"Grannie"
+Imported/3/2:string:"Parlot"
+Imported/3/3:string:"gparlot3@soup.io"
+Imported/4/0:numeric:5
+Imported/4/1:string:"Merridie"
+Imported/4/2:string:"Dungey"
+Imported/4/3:string:"mdungey4@nifty.com"
diff --git a/test/json-mapped/array-of-objects-basic/input.json b/test/json-mapped/array-of-objects-basic/input.json
new file mode 100644
index 0000000..1d10e9e
--- /dev/null
+++ b/test/json-mapped/array-of-objects-basic/input.json
@@ -0,0 +1,32 @@
+[
+ {
+ "id": 1,
+ "first_name": "Caitlin",
+ "last_name": "Kealy",
+ "email": "ckealy0@hud.gov"
+ },
+ {
+ "id": 2,
+ "first_name": "Bernice",
+ "last_name": "McEvilly",
+ "email": "bmcevilly1@comsenz.com"
+ },
+ {
+ "id": 3,
+ "first_name": "Ariel",
+ "last_name": "Casajuana",
+ "email": "acasajuana2@fema.gov"
+ },
+ {
+ "id": 4,
+ "first_name": "Grannie",
+ "last_name": "Parlot",
+ "email": "gparlot3@soup.io"
+ },
+ {
+ "id": 5,
+ "first_name": "Merridie",
+ "last_name": "Dungey",
+ "email": "mdungey4@nifty.com"
+ }
+] \ No newline at end of file
diff --git a/test/json-mapped/array-of-objects-basic/map.json b/test/json-mapped/array-of-objects-basic/map.json
new file mode 100644
index 0000000..a9b949c
--- /dev/null
+++ b/test/json-mapped/array-of-objects-basic/map.json
@@ -0,0 +1,16 @@
+{
+ "sheets": ["Imported"],
+ "ranges": [
+ {"sheet": "Imported", "row": 0, "column": 0,
+ "fields": [
+ {"path": "$[]['id']"},
+ {"path": "$[]['first_name']"},
+ {"path": "$[]['last_name']"},
+ {"path": "$[]['email']"}
+ ],
+ "row-groups": [
+ {"path": "$"}
+ ]
+ }
+ ]
+}
diff --git a/test/json-mapped/array-of-objects-header/check.txt b/test/json-mapped/array-of-objects-header/check.txt
new file mode 100644
index 0000000..63d7e01
--- /dev/null
+++ b/test/json-mapped/array-of-objects-header/check.txt
@@ -0,0 +1,64 @@
+models/0/0:string:"Record ID"
+models/0/1:string:"Model Year"
+models/0/2:string:"Make"
+models/0/3:string:"Model"
+models/1/0:numeric:1
+models/1/1:numeric:1992
+models/1/2:string:"Mazda"
+models/1/3:string:"MPV"
+models/2/0:numeric:2
+models/2/1:numeric:2008
+models/2/2:string:"GMC"
+models/2/3:string:"Savana 1500"
+models/3/0:numeric:3
+models/3/1:numeric:1994
+models/3/2:string:"Mitsubishi"
+models/3/3:string:"RVR"
+models/4/0:numeric:4
+models/4/1:numeric:2005
+models/4/2:string:"Mercury"
+models/4/3:string:"Grand Marquis"
+models/5/0:numeric:5
+models/5/1:numeric:1994
+models/5/2:string:"Volkswagen"
+models/5/3:string:"Golf"
+models/6/0:numeric:6
+models/6/1:numeric:1996
+models/6/2:string:"Cadillac"
+models/6/3:string:"Eldorado"
+models/7/0:numeric:7
+models/7/1:numeric:2000
+models/7/2:string:"Cadillac"
+models/7/3:string:"Escalade"
+models/8/0:numeric:8
+models/8/1:numeric:2009
+models/8/2:string:"Kia"
+models/8/3:string:"Mohave/Borrego"
+models/9/0:numeric:9
+models/9/1:numeric:1988
+models/9/2:string:"Volkswagen"
+models/9/3:string:"Cabriolet"
+models/10/0:numeric:10
+models/10/1:numeric:2008
+models/10/2:string:"Acura"
+models/10/3:string:"TSX"
+models/11/0:numeric:11
+models/11/1:numeric:1993
+models/11/2:string:"Chrysler"
+models/11/3:string:"Imperial"
+models/12/0:numeric:12
+models/12/1:numeric:2009
+models/12/2:string:"Hyundai"
+models/12/3:string:"Azera"
+models/13/0:numeric:13
+models/13/1:numeric:2012
+models/13/2:string:"Ford"
+models/13/3:string:"Focus"
+models/14/0:numeric:14
+models/14/1:numeric:1999
+models/14/2:string:"GMC"
+models/14/3:string:"Suburban 2500"
+models/15/0:numeric:15
+models/15/1:numeric:2009
+models/15/2:string:"Pontiac"
+models/15/3:string:"G5"
diff --git a/test/json-mapped/array-of-objects-header/input.json b/test/json-mapped/array-of-objects-header/input.json
new file mode 100644
index 0000000..d9b6605
--- /dev/null
+++ b/test/json-mapped/array-of-objects-header/input.json
@@ -0,0 +1,15 @@
+[{"Record ID":1,"Model Year":1992,"Make":"Mazda","Model":"MPV"},
+{"Record ID":2,"Model Year":2008,"Make":"GMC","Model":"Savana 1500"},
+{"Record ID":3,"Model Year":1994,"Make":"Mitsubishi","Model":"RVR"},
+{"Record ID":4,"Model Year":2005,"Make":"Mercury","Model":"Grand Marquis"},
+{"Record ID":5,"Model Year":1994,"Make":"Volkswagen","Model":"Golf"},
+{"Record ID":6,"Model Year":1996,"Make":"Cadillac","Model":"Eldorado"},
+{"Record ID":7,"Model Year":2000,"Make":"Cadillac","Model":"Escalade"},
+{"Record ID":8,"Model Year":2009,"Make":"Kia","Model":"Mohave/Borrego"},
+{"Record ID":9,"Model Year":1988,"Make":"Volkswagen","Model":"Cabriolet"},
+{"Record ID":10,"Model Year":2008,"Make":"Acura","Model":"TSX"},
+{"Record ID":11,"Model Year":1993,"Make":"Chrysler","Model":"Imperial"},
+{"Record ID":12,"Model Year":2009,"Make":"Hyundai","Model":"Azera"},
+{"Record ID":13,"Model Year":2012,"Make":"Ford","Model":"Focus"},
+{"Record ID":14,"Model Year":1999,"Make":"GMC","Model":"Suburban 2500"},
+{"Record ID":15,"Model Year":2009,"Make":"Pontiac","Model":"G5"}] \ No newline at end of file
diff --git a/test/json-mapped/array-of-objects-header/map.json b/test/json-mapped/array-of-objects-header/map.json
new file mode 100644
index 0000000..0e772f4
--- /dev/null
+++ b/test/json-mapped/array-of-objects-header/map.json
@@ -0,0 +1,16 @@
+{
+ "sheets": ["models"],
+ "ranges": [
+ {"row": 0, "column": 0, "sheet": "models", "row-header": true,
+ "fields": [
+ {"path": "$[]['Record ID']"},
+ {"path": "$[]['Model Year']"},
+ {"path": "$[]['Make']"},
+ {"path": "$[]['Model']"},
+ ],
+ "row-groups": [
+ {"path": "$"},
+ ]
+ }
+ ]
+}
diff --git a/test/json-mapped/nested-repeats-2/check.txt b/test/json-mapped/nested-repeats-2/check.txt
new file mode 100644
index 0000000..0553451
--- /dev/null
+++ b/test/json-mapped/nested-repeats-2/check.txt
@@ -0,0 +1,25 @@
+nested repeats 2/1/0:string:"foo"
+nested repeats 2/1/1:string:"A"
+nested repeats 2/1/2:numeric:1000
+nested repeats 2/1/3:string:"A123456789"
+nested repeats 2/1/4:string:"en-US"
+nested repeats 2/2/0:string:"foo"
+nested repeats 2/2/1:string:"A"
+nested repeats 2/2/2:numeric:1001
+nested repeats 2/2/3:string:"A987654321"
+nested repeats 2/2/4:string:"en-US"
+nested repeats 2/3/0:string:"foo"
+nested repeats 2/3/1:string:"B"
+nested repeats 2/3/2:numeric:2000
+nested repeats 2/3/3:string:"B123456789"
+nested repeats 2/3/4:string:"ja-JP"
+nested repeats 2/4/0:string:"foo"
+nested repeats 2/4/1:string:"B"
+nested repeats 2/4/2:numeric:2001
+nested repeats 2/4/3:string:"B987654321"
+nested repeats 2/4/4:string:"ja-JP"
+nested repeats 2/5/0:string:"foo"
+nested repeats 2/5/1:string:"B"
+nested repeats 2/5/2:numeric:2002
+nested repeats 2/5/3:string:"B987654323"
+nested repeats 2/5/4:string:"ja-JP"
diff --git a/test/json-mapped/nested-repeats-2/input.json b/test/json-mapped/nested-repeats-2/input.json
new file mode 100644
index 0000000..ac3da5e
--- /dev/null
+++ b/test/json-mapped/nested-repeats-2/input.json
@@ -0,0 +1,20 @@
+[
+ {"parent": "foo",
+ "data":
+ [
+ {"category": "A", "region": "en-US",
+ "records": [
+ {"id": 1000, "ref": "A123456789"},
+ {"id": 1001, "ref": "A987654321"}
+ ]
+ },
+ {"category": "B", "region": "ja-JP",
+ "records": [
+ {"id": 2000, "ref": "B123456789"},
+ {"id": 2001, "ref": "B987654321"},
+ {"id": 2002, "ref": "B987654323"}
+ ]
+ }
+ ]
+ }
+]
diff --git a/test/json-mapped/nested-repeats-2/map.json b/test/json-mapped/nested-repeats-2/map.json
new file mode 100644
index 0000000..293462d
--- /dev/null
+++ b/test/json-mapped/nested-repeats-2/map.json
@@ -0,0 +1,24 @@
+{
+ "sheets": ["nested repeats 2"],
+
+ "ranges": [
+ {"sheet": "nested repeats 2",
+ "row": 1,
+ "column": 0,
+
+ "fields": [
+ {"path": "$[]['parent']"},
+ {"path": "$[]['data'][]['category']"},
+ {"path": "$[]['data'][]['records'][]['id']"},
+ {"path": "$[]['data'][]['records'][]['ref']"},
+ {"path": "$[]['data'][]['region']"}
+ ],
+
+ "row-groups": [
+ {"path": "$"},
+ {"path": "$[]['data']"},
+ {"path": "$[]['data'][]['records']"}
+ ]
+ }
+ ]
+}
diff --git a/test/json-mapped/nested-repeats/check.txt b/test/json-mapped/nested-repeats/check.txt
new file mode 100644
index 0000000..c089547
--- /dev/null
+++ b/test/json-mapped/nested-repeats/check.txt
@@ -0,0 +1,64 @@
+nested repeats/3/2:string:"A"
+nested repeats/3/3:numeric:1000
+nested repeats/3/4:string:"A123456789"
+nested repeats/3/5:string:"en-US"
+nested repeats/4/2:string:"A"
+nested repeats/4/3:numeric:1001
+nested repeats/4/4:string:"A987654321"
+nested repeats/4/5:string:"en-US"
+nested repeats/5/2:string:"B"
+nested repeats/5/3:numeric:2000
+nested repeats/5/4:string:"B123456789"
+nested repeats/5/5:string:"ja-JP"
+nested repeats/6/2:string:"B"
+nested repeats/6/3:numeric:2001
+nested repeats/6/4:string:"B987654321"
+nested repeats/6/5:string:"ja-JP"
+nested repeats/7/2:string:"B"
+nested repeats/7/3:numeric:2002
+nested repeats/7/4:string:"B987654323"
+nested repeats/7/5:string:"ja-JP"
+nested repeats/8/2:string:"C"
+nested repeats/8/3:numeric:3000
+nested repeats/8/4:string:"C123456789"
+nested repeats/8/5:string:"fr-CA"
+nested repeats/9/2:string:"C"
+nested repeats/9/3:numeric:3001
+nested repeats/9/4:string:"C987654320"
+nested repeats/9/5:string:"fr-CA"
+nested repeats/10/2:string:"C"
+nested repeats/10/3:numeric:3002
+nested repeats/10/4:string:"C987654321"
+nested repeats/10/5:string:"fr-CA"
+nested repeats/11/2:string:"C"
+nested repeats/11/3:numeric:3003
+nested repeats/11/4:string:"C987654322"
+nested repeats/11/5:string:"fr-CA"
+nested repeats/12/2:string:"C"
+nested repeats/12/3:numeric:3004
+nested repeats/12/4:string:"C987654323"
+nested repeats/12/5:string:"fr-CA"
+nested repeats/13/2:string:"C"
+nested repeats/13/3:numeric:3005
+nested repeats/13/4:string:"C987654324"
+nested repeats/13/5:string:"fr-CA"
+nested repeats/14/2:string:"C"
+nested repeats/14/3:numeric:3006
+nested repeats/14/4:string:"C987654325"
+nested repeats/14/5:string:"fr-CA"
+nested repeats/15/2:string:"D"
+nested repeats/15/3:numeric:4000
+nested repeats/15/4:string:"D123456789"
+nested repeats/15/5:string:"unknown"
+nested repeats/16/2:string:"E"
+nested repeats/17/2:string:"F"
+nested repeats/17/3:numeric:6000
+nested repeats/17/4:string:"F123456789"
+nested repeats/18/2:string:"G"
+nested repeats/18/3:numeric:7000
+nested repeats/18/4:string:"G123456789"
+nested repeats/18/5:string:"en-GB"
+nested repeats/19/2:string:"G"
+nested repeats/19/3:numeric:7000
+nested repeats/19/4:string:"G123456780"
+nested repeats/19/5:string:"en-GB"
diff --git a/test/json-mapped/nested-repeats/input.json b/test/json-mapped/nested-repeats/input.json
new file mode 100644
index 0000000..d755f45
--- /dev/null
+++ b/test/json-mapped/nested-repeats/input.json
@@ -0,0 +1,45 @@
+{
+ "data": [
+ {"category": "A", "region": "en-US",
+ "records": [
+ {"id": 1000, "ref": "A123456789"},
+ {"id": 1001, "ref": "A987654321"}
+ ]
+ },
+ {"category": "B", "region": "ja-JP",
+ "records": [
+ {"id": 2000, "ref": "B123456789"},
+ {"id": 2001, "ref": "B987654321"},
+ {"id": 2002, "ref": "B987654323"}
+ ]
+ },
+ {"category": "C", "region": "fr-CA",
+ "records": [
+ {"id": 3000, "ref": "C123456789"},
+ {"id": 3001, "ref": "C987654320"},
+ {"id": 3002, "ref": "C987654321"},
+ {"id": 3003, "ref": "C987654322"},
+ {"id": 3004, "ref": "C987654323"},
+ {"id": 3005, "ref": "C987654324"},
+ {"id": 3006, "ref": "C987654325"}
+ ]
+ },
+ {"category": "D", "region": "unknown",
+ "records": [
+ {"id": 4000, "ref": "D123456789"},
+ ]
+ },
+ {"category": "E", "records": []},
+ {"category": "F",
+ "records": [
+ {"id": 6000, "ref": "F123456789"}
+ ]
+ },
+ {"category": "G", "region": "en-GB",
+ "records": [
+ {"id": 7000, "ref": "G123456789"},
+ {"id": 7000, "ref": "G123456780"}
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/test/json-mapped/nested-repeats/map.json b/test/json-mapped/nested-repeats/map.json
new file mode 100644
index 0000000..668863e
--- /dev/null
+++ b/test/json-mapped/nested-repeats/map.json
@@ -0,0 +1,22 @@
+{
+ "sheets": ["nested repeats"],
+
+ "ranges": [
+ {"sheet": "nested repeats",
+ "row": 3,
+ "column": 2,
+
+ "fields": [
+ {"path": "$['data'][]['category']"},
+ {"path": "$['data'][]['records'][]['id']"},
+ {"path": "$['data'][]['records'][]['ref']"},
+ {"path": "$['data'][]['region']"}
+ ],
+
+ "row-groups": [
+ {"path": "$['data']"},
+ {"path": "$['data'][]['records']"}
+ ]
+ }
+ ]
+}
diff --git a/test/json-structure/arrays-in-object/check.txt b/test/json-structure/arrays-in-object/check.txt
new file mode 100644
index 0000000..1f4654e
--- /dev/null
+++ b/test/json-structure/arrays-in-object/check.txt
@@ -0,0 +1,4 @@
+$object['footnotes'].value
+$object['rows'].array[4].object(*)['age'].value
+$object['rows'].array[4].object(*)['error'].value
+$object['rows'].array[4].object(*)['name'].value
diff --git a/test/json-structure/arrays-in-object/input.json b/test/json-structure/arrays-in-object/input.json
new file mode 100644
index 0000000..2b5dbf1
--- /dev/null
+++ b/test/json-structure/arrays-in-object/input.json
@@ -0,0 +1,10 @@
+{
+ "rows": [
+ {"name": "a", "age": 12},
+ {"name": "b", "age": 13},
+ {"name": "c", "age": 14},
+ {"error": -1}
+ ],
+
+ "footnotes": "some footnotes."
+}
diff --git a/test/json-structure/multiple-ranges/check.txt b/test/json-structure/multiple-ranges/check.txt
new file mode 100644
index 0000000..49cf18b
--- /dev/null
+++ b/test/json-structure/multiple-ranges/check.txt
@@ -0,0 +1,5 @@
+$object['data'].array[7].object(*)['category'].value
+$object['data'].array[7].object(*)['records'].array[7].object(*)['id'].value
+$object['data'].array[7].object(*)['records'].array[7].object(*)['ref'].value
+$object['data'].array[7].object(*)['region'].value
+$object['misc'].array[2].array(*)[3].value[0,1,2]
diff --git a/test/json-structure/multiple-ranges/input.json b/test/json-structure/multiple-ranges/input.json
new file mode 100644
index 0000000..e604b13
--- /dev/null
+++ b/test/json-structure/multiple-ranges/input.json
@@ -0,0 +1,49 @@
+{
+ "data": [
+ {"category": "A", "region": "en-US",
+ "records": [
+ {"id": 1000, "ref": "A123456789"},
+ {"id": 1001, "ref": "A987654321"}
+ ]
+ },
+ {"category": "B", "region": "ja-JP",
+ "records": [
+ {"id": 2000, "ref": "B123456789"},
+ {"id": 2001, "ref": "B987654321"},
+ {"id": 2002, "ref": "B987654323"}
+ ]
+ },
+ {"category": "C", "region": "fr-CA",
+ "records": [
+ {"id": 3000, "ref": "C123456789"},
+ {"id": 3001, "ref": "C987654320"},
+ {"id": 3002, "ref": "C987654321"},
+ {"id": 3003, "ref": "C987654322"},
+ {"id": 3004, "ref": "C987654323"},
+ {"id": 3005, "ref": "C987654324"},
+ {"id": 3006, "ref": "C987654325"}
+ ]
+ },
+ {"category": "D", "region": "unknown",
+ "records": [
+ {"id": 4000, "ref": "D123456789"},
+ ]
+ },
+ {"category": "E", "records": []},
+ {"category": "F",
+ "records": [
+ {"id": 6000, "ref": "F123456789"}
+ ]
+ },
+ {"category": "G", "region": "en-GB",
+ "records": [
+ {"id": 7000, "ref": "G123456789"},
+ {"id": 7000, "ref": "G123456780"}
+ ]
+ }
+ ],
+ "misc": [
+ [1, 2, 3],
+ [4, 5, 6],
+ ]
+} \ No newline at end of file
diff --git a/test/json-structure/nested-arrays-mixed-2/check.txt b/test/json-structure/nested-arrays-mixed-2/check.txt
new file mode 100644
index 0000000..1347175
--- /dev/null
+++ b/test/json-structure/nested-arrays-mixed-2/check.txt
@@ -0,0 +1,3 @@
+$array[2].array(*)[3].object['age'].value
+$array[2].array(*)[3].object['name'].value
+$array[2].array(*)[3].value[1,2]
diff --git a/test/json-structure/nested-arrays-mixed-2/input.json b/test/json-structure/nested-arrays-mixed-2/input.json
new file mode 100644
index 0000000..b63feb3
--- /dev/null
+++ b/test/json-structure/nested-arrays-mixed-2/input.json
@@ -0,0 +1,15 @@
+[
+ [
+ 3,
+ 4,
+ 5
+ ],
+ [
+ {
+ "name": "Jane Doe",
+ "age": -1
+ },
+ 1,
+ 2
+ ]
+]
diff --git a/test/json-structure/nested-arrays-mixed/check.txt b/test/json-structure/nested-arrays-mixed/check.txt
new file mode 100644
index 0000000..1347175
--- /dev/null
+++ b/test/json-structure/nested-arrays-mixed/check.txt
@@ -0,0 +1,3 @@
+$array[2].array(*)[3].object['age'].value
+$array[2].array(*)[3].object['name'].value
+$array[2].array(*)[3].value[1,2]
diff --git a/test/json-structure/nested-arrays-mixed/input.json b/test/json-structure/nested-arrays-mixed/input.json
new file mode 100644
index 0000000..d0d7617
--- /dev/null
+++ b/test/json-structure/nested-arrays-mixed/input.json
@@ -0,0 +1,15 @@
+[
+ [
+ {
+ "name": "Jane Doe",
+ "age": -1
+ },
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 4,
+ 5
+ ]
+]
diff --git a/test/json-structure/nested-arrays/check.txt b/test/json-structure/nested-arrays/check.txt
new file mode 100644
index 0000000..03123e8
--- /dev/null
+++ b/test/json-structure/nested-arrays/check.txt
@@ -0,0 +1 @@
+$array[2].array(*)[3].value[0,1,2]
diff --git a/test/json-structure/nested-arrays/input.json b/test/json-structure/nested-arrays/input.json
new file mode 100644
index 0000000..e4e6b99
--- /dev/null
+++ b/test/json-structure/nested-arrays/input.json
@@ -0,0 +1,5 @@
+[
+ [0, 1, 2],
+ [3, 4, 5]
+]
+
diff --git a/test/json-structure/no-value-nodes/01.json b/test/json-structure/no-value-nodes/01.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/test/json-structure/no-value-nodes/01.json
@@ -0,0 +1 @@
+[]
diff --git a/test/json-structure/no-value-nodes/02.json b/test/json-structure/no-value-nodes/02.json
new file mode 100644
index 0000000..1721244
--- /dev/null
+++ b/test/json-structure/no-value-nodes/02.json
@@ -0,0 +1 @@
+[[]]
diff --git a/test/json-structure/no-value-nodes/03.json b/test/json-structure/no-value-nodes/03.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/test/json-structure/no-value-nodes/03.json
@@ -0,0 +1 @@
+{}
diff --git a/test/json-structure/no-value-nodes/04.json b/test/json-structure/no-value-nodes/04.json
new file mode 100644
index 0000000..b672212
--- /dev/null
+++ b/test/json-structure/no-value-nodes/04.json
@@ -0,0 +1 @@
+{"k": []}
diff --git a/test/json-structure/repeat-objects-2/check.txt b/test/json-structure/repeat-objects-2/check.txt
new file mode 100644
index 0000000..9e406e0
--- /dev/null
+++ b/test/json-structure/repeat-objects-2/check.txt
@@ -0,0 +1,6 @@
+$array[3].object(*)['age'].value
+$array[3].object(*)['name'].value
+$array[3].object(*)['props'].object['alpha'].value
+$array[3].object(*)['props'].object['beta'].value
+$array[3].object(*)['props'].object['gamma'].value
+$array[3].object(*)['props'].object['theta'].value
diff --git a/test/json-structure/repeat-objects-2/input.json b/test/json-structure/repeat-objects-2/input.json
new file mode 100644
index 0000000..54ba1cc
--- /dev/null
+++ b/test/json-structure/repeat-objects-2/input.json
@@ -0,0 +1,6 @@
+[
+ {"name": "a", "age": 12, "props": {"alpha": 1, "beta": 2}},
+ {"name": "b", "age": 13, "props": {"gamma": 3}},
+ {"name": "c", "age": 14, "props": {"theta": 4}},
+]
+
diff --git a/test/json-structure/repeat-objects/check.txt b/test/json-structure/repeat-objects/check.txt
new file mode 100644
index 0000000..df6de0b
--- /dev/null
+++ b/test/json-structure/repeat-objects/check.txt
@@ -0,0 +1,2 @@
+$array[4].object(*)['age'].value
+$array[4].object(*)['name'].value
diff --git a/test/json-structure/repeat-objects/input.json b/test/json-structure/repeat-objects/input.json
new file mode 100644
index 0000000..27882a4
--- /dev/null
+++ b/test/json-structure/repeat-objects/input.json
@@ -0,0 +1,6 @@
+[
+ {"name": "a", "age": 12},
+ {"name": "b", "age": true},
+ {"name": "c", "age": null},
+ {"name": "d", "age": "n/a"},
+]
diff --git a/test/json/basic1/check.txt b/test/json/basic1/check.txt
new file mode 100644
index 0000000..075a355
--- /dev/null
+++ b/test/json/basic1/check.txt
@@ -0,0 +1,8 @@
+ns0="http://schemas.kohei.us/orcus/2015/json"
+/ns0:array
+/ns0:array/ns0:item
+/ns0:array/ns0:item/ns0:true
+/ns0:array/ns0:item
+/ns0:array/ns0:item/ns0:false
+/ns0:array/ns0:item
+/ns0:array/ns0:item/ns0:null
diff --git a/test/json/basic1/input.json b/test/json/basic1/input.json
new file mode 100644
index 0000000..8aca25a
--- /dev/null
+++ b/test/json/basic1/input.json
@@ -0,0 +1,6 @@
+[
+ true,
+ false,
+ null
+]
+
diff --git a/test/json/basic1/output.yaml b/test/json/basic1/output.yaml
new file mode 100644
index 0000000..f1aa6af
--- /dev/null
+++ b/test/json/basic1/output.yaml
@@ -0,0 +1,4 @@
+---
+- true
+- false
+- null
diff --git a/test/json/basic2/check.txt b/test/json/basic2/check.txt
new file mode 100644
index 0000000..b66e266
--- /dev/null
+++ b/test/json/basic2/check.txt
@@ -0,0 +1,44 @@
+ns0="http://schemas.kohei.us/orcus/2015/json"
+/ns0:array
+/ns0:array/ns0:item
+/ns0:array/ns0:item/ns0:string
+/ns0:array/ns0:item/ns0:string@value="I am string"
+/ns0:array/ns0:item
+/ns0:array/ns0:item/ns0:string
+/ns0:array/ns0:item/ns0:string@value="me too"
+/ns0:array/ns0:item
+/ns0:array/ns0:item/ns0:string
+/ns0:array/ns0:item/ns0:string@value=""
+/ns0:array/ns0:item
+/ns0:array/ns0:item/ns0:string
+/ns0:array/ns0:item/ns0:string@value="\\"
+/ns0:array/ns0:item
+/ns0:array/ns0:item/ns0:string
+/ns0:array/ns0:item/ns0:string@value="/"
+/ns0:array/ns0:item
+/ns0:array/ns0:item/ns0:string
+/ns0:array/ns0:item/ns0:string@value="\\b"
+/ns0:array/ns0:item
+/ns0:array/ns0:item/ns0:string
+/ns0:array/ns0:item/ns0:string@value="\\f"
+/ns0:array/ns0:item
+/ns0:array/ns0:item/ns0:string
+/ns0:array/ns0:item/ns0:string@value="\\n"
+/ns0:array/ns0:item
+/ns0:array/ns0:item/ns0:string
+/ns0:array/ns0:item/ns0:string@value="\\r"
+/ns0:array/ns0:item
+/ns0:array/ns0:item/ns0:string
+/ns0:array/ns0:item/ns0:string@value="\\t"
+/ns0:array/ns0:item
+/ns0:array/ns0:item/ns0:string
+/ns0:array/ns0:item/ns0:string@value="\"quoted\""
+/ns0:array/ns0:item
+/ns0:array/ns0:item/ns0:string
+/ns0:array/ns0:item/ns0:string@value="http://www.google.com"
+/ns0:array/ns0:item
+/ns0:array/ns0:item/ns0:string
+/ns0:array/ns0:item/ns0:string@value="one \\n two \\n three"
+/ns0:array/ns0:item
+/ns0:array/ns0:item/ns0:string
+/ns0:array/ns0:item/ns0:string@value="front segment 'single quote' and \"double quote\" end segment"
diff --git a/test/json/basic2/input.json b/test/json/basic2/input.json
new file mode 100644
index 0000000..0ff47ad
--- /dev/null
+++ b/test/json/basic2/input.json
@@ -0,0 +1,17 @@
+[
+ "I am string",
+ "me too",
+ "",
+ "\\",
+ "\/",
+ "\b",
+ "\f",
+ "\n",
+ "\r",
+ "\t",
+ "\"quoted\"",
+ "http:\/\/www.google.com",
+ "one \n two \n three",
+ "front segment 'single quote' and \"double quote\" end segment"
+]
+
diff --git a/test/json/basic2/output.yaml b/test/json/basic2/output.yaml
new file mode 100644
index 0000000..19ead19
--- /dev/null
+++ b/test/json/basic2/output.yaml
@@ -0,0 +1,15 @@
+---
+- I am string
+- me too
+-
+- \
+- /
+- \b
+- \f
+- \n
+- \r
+- \t
+- "quoted"
+- http://www.google.com
+- one \n two \n three
+- front segment 'single quote' and "double quote" end segment
diff --git a/test/json/basic3/check.txt b/test/json/basic3/check.txt
new file mode 100644
index 0000000..350d182
--- /dev/null
+++ b/test/json/basic3/check.txt
@@ -0,0 +1,29 @@
+ns0="http://schemas.kohei.us/orcus/2015/json"
+/ns0:array
+/ns0:array/ns0:item
+/ns0:array/ns0:item/ns0:number
+/ns0:array/ns0:item/ns0:number@value="0"
+/ns0:array/ns0:item
+/ns0:array/ns0:item/ns0:number
+/ns0:array/ns0:item/ns0:number@value="1"
+/ns0:array/ns0:item
+/ns0:array/ns0:item/ns0:number
+/ns0:array/ns0:item/ns0:number@value="2"
+/ns0:array/ns0:item
+/ns0:array/ns0:item/ns0:number
+/ns0:array/ns0:item/ns0:number@value="15"
+/ns0:array/ns0:item
+/ns0:array/ns0:item/ns0:number
+/ns0:array/ns0:item/ns0:number@value="12.34"
+/ns0:array/ns0:item
+/ns0:array/ns0:item/ns0:number
+/ns0:array/ns0:item/ns0:number@value="-0.12"
+/ns0:array/ns0:item
+/ns0:array/ns0:item/ns0:number
+/ns0:array/ns0:item/ns0:number@value="1.2e+22"
+/ns0:array/ns0:item
+/ns0:array/ns0:item/ns0:number
+/ns0:array/ns0:item/ns0:number@value="1.11e-07"
+/ns0:array/ns0:item
+/ns0:array/ns0:item/ns0:number
+/ns0:array/ns0:item/ns0:number@value="1100"
diff --git a/test/json/basic3/input.json b/test/json/basic3/input.json
new file mode 100644
index 0000000..d2a8967
--- /dev/null
+++ b/test/json/basic3/input.json
@@ -0,0 +1,11 @@
+[
+ 0,
+ 1,
+ 2,
+ 15,
+ 12.34,
+ -0.12,
+ 1.2e+22,
+ 1.11e-7,
+ 11E2
+]
diff --git a/test/json/basic3/output.yaml b/test/json/basic3/output.yaml
new file mode 100644
index 0000000..3624666
--- /dev/null
+++ b/test/json/basic3/output.yaml
@@ -0,0 +1,10 @@
+---
+- 0
+- 1
+- 2
+- 15
+- 12.34
+- -0.12
+- 1.2e+22
+- 1.11e-07
+- 1100
diff --git a/test/json/basic4/check.txt b/test/json/basic4/check.txt
new file mode 100644
index 0000000..e50afa7
--- /dev/null
+++ b/test/json/basic4/check.txt
@@ -0,0 +1,14 @@
+ns0="http://schemas.kohei.us/orcus/2015/json"
+/ns0:object
+/ns0:object/ns0:item
+/ns0:object/ns0:item@name="int"
+/ns0:object/ns0:item/ns0:number
+/ns0:object/ns0:item/ns0:number@value="12"
+/ns0:object/ns0:item
+/ns0:object/ns0:item@name="float"
+/ns0:object/ns0:item/ns0:number
+/ns0:object/ns0:item/ns0:number@value="0.125"
+/ns0:object/ns0:item
+/ns0:object/ns0:item@name="string"
+/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:string@value="blah..."
diff --git a/test/json/basic4/input.json b/test/json/basic4/input.json
new file mode 100644
index 0000000..2161908
--- /dev/null
+++ b/test/json/basic4/input.json
@@ -0,0 +1,6 @@
+{
+ "int": 12,
+ "float": 0.125,
+ "string": "blah..."
+}
+
diff --git a/test/json/basic4/output.yaml b/test/json/basic4/output.yaml
new file mode 100644
index 0000000..a027a09
--- /dev/null
+++ b/test/json/basic4/output.yaml
@@ -0,0 +1,4 @@
+---
+int: 12
+float: 0.125
+string: blah...
diff --git a/test/json/empty-array-1/check.txt b/test/json/empty-array-1/check.txt
new file mode 100644
index 0000000..60374d8
--- /dev/null
+++ b/test/json/empty-array-1/check.txt
@@ -0,0 +1,2 @@
+ns0="http://schemas.kohei.us/orcus/2015/json"
+/ns0:array
diff --git a/test/json/empty-array-1/input.json b/test/json/empty-array-1/input.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/test/json/empty-array-1/input.json
@@ -0,0 +1 @@
+[]
diff --git a/test/json/empty-array-2/check.txt b/test/json/empty-array-2/check.txt
new file mode 100644
index 0000000..60374d8
--- /dev/null
+++ b/test/json/empty-array-2/check.txt
@@ -0,0 +1,2 @@
+ns0="http://schemas.kohei.us/orcus/2015/json"
+/ns0:array
diff --git a/test/json/empty-array-2/input.json b/test/json/empty-array-2/input.json
new file mode 100644
index 0000000..1e3ec72
--- /dev/null
+++ b/test/json/empty-array-2/input.json
@@ -0,0 +1 @@
+[ ]
diff --git a/test/json/empty-array-3/check.txt b/test/json/empty-array-3/check.txt
new file mode 100644
index 0000000..60374d8
--- /dev/null
+++ b/test/json/empty-array-3/check.txt
@@ -0,0 +1,2 @@
+ns0="http://schemas.kohei.us/orcus/2015/json"
+/ns0:array
diff --git a/test/json/empty-array-3/input.json b/test/json/empty-array-3/input.json
new file mode 100644
index 0000000..0d4f101
--- /dev/null
+++ b/test/json/empty-array-3/input.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/test/json/nested1/check.txt b/test/json/nested1/check.txt
new file mode 100644
index 0000000..ca1dae7
--- /dev/null
+++ b/test/json/nested1/check.txt
@@ -0,0 +1,14 @@
+ns0="http://schemas.kohei.us/orcus/2015/json"
+/ns0:object
+/ns0:object/ns0:item
+/ns0:object/ns0:item@name="array"
+/ns0:object/ns0:item/ns0:array
+/ns0:object/ns0:item/ns0:array/ns0:item
+/ns0:object/ns0:item/ns0:array/ns0:item/ns0:number
+/ns0:object/ns0:item/ns0:array/ns0:item/ns0:number@value="1"
+/ns0:object/ns0:item/ns0:array/ns0:item
+/ns0:object/ns0:item/ns0:array/ns0:item/ns0:number
+/ns0:object/ns0:item/ns0:array/ns0:item/ns0:number@value="2"
+/ns0:object/ns0:item/ns0:array/ns0:item
+/ns0:object/ns0:item/ns0:array/ns0:item/ns0:number
+/ns0:object/ns0:item/ns0:array/ns0:item/ns0:number@value="3"
diff --git a/test/json/nested1/input.json b/test/json/nested1/input.json
new file mode 100644
index 0000000..fece0f5
--- /dev/null
+++ b/test/json/nested1/input.json
@@ -0,0 +1,2 @@
+{ "array" : [1,2,3] }
+
diff --git a/test/json/nested1/output.yaml b/test/json/nested1/output.yaml
new file mode 100644
index 0000000..9d39827
--- /dev/null
+++ b/test/json/nested1/output.yaml
@@ -0,0 +1,5 @@
+---
+array:
+ - 1
+ - 2
+ - 3
diff --git a/test/json/nested2/check.txt b/test/json/nested2/check.txt
new file mode 100644
index 0000000..84a4d05
--- /dev/null
+++ b/test/json/nested2/check.txt
@@ -0,0 +1,20 @@
+ns0="http://schemas.kohei.us/orcus/2015/json"
+/ns0:array
+/ns0:array/ns0:item
+/ns0:array/ns0:item/ns0:object
+/ns0:array/ns0:item/ns0:object/ns0:item
+/ns0:array/ns0:item/ns0:object/ns0:item@name="value"
+/ns0:array/ns0:item/ns0:object/ns0:item/ns0:number
+/ns0:array/ns0:item/ns0:object/ns0:item/ns0:number@value="1"
+/ns0:array/ns0:item
+/ns0:array/ns0:item/ns0:object
+/ns0:array/ns0:item/ns0:object/ns0:item
+/ns0:array/ns0:item/ns0:object/ns0:item@name="value"
+/ns0:array/ns0:item/ns0:object/ns0:item/ns0:number
+/ns0:array/ns0:item/ns0:object/ns0:item/ns0:number@value="2"
+/ns0:array/ns0:item
+/ns0:array/ns0:item/ns0:object
+/ns0:array/ns0:item/ns0:object/ns0:item
+/ns0:array/ns0:item/ns0:object/ns0:item@name="value"
+/ns0:array/ns0:item/ns0:object/ns0:item/ns0:number
+/ns0:array/ns0:item/ns0:object/ns0:item/ns0:number@value="3"
diff --git a/test/json/nested2/input.json b/test/json/nested2/input.json
new file mode 100644
index 0000000..6506406
--- /dev/null
+++ b/test/json/nested2/input.json
@@ -0,0 +1,6 @@
+[
+ { "value":1 },
+ { "value":2 },
+ { "value":3 }
+]
+
diff --git a/test/json/nested2/output.yaml b/test/json/nested2/output.yaml
new file mode 100644
index 0000000..bdbece3
--- /dev/null
+++ b/test/json/nested2/output.yaml
@@ -0,0 +1,4 @@
+---
+- value: 1
+- value: 2
+- value: 3
diff --git a/test/json/refs1/check.txt b/test/json/refs1/check.txt
new file mode 100644
index 0000000..2650ebe
--- /dev/null
+++ b/test/json/refs1/check.txt
@@ -0,0 +1,19 @@
+ns0="http://schemas.kohei.us/orcus/2015/json"
+/ns0:object
+/ns0:object/ns0:item
+/ns0:object/ns0:item@name="ref1"
+/ns0:object/ns0:item/ns0:number
+/ns0:object/ns0:item/ns0:number@value="1"
+/ns0:object/ns0:item
+/ns0:object/ns0:item@name="ref2"
+/ns0:object/ns0:item/ns0:array
+/ns0:object/ns0:item/ns0:array/ns0:item
+/ns0:object/ns0:item/ns0:array/ns0:item/ns0:number
+/ns0:object/ns0:item/ns0:array/ns0:item/ns0:number@value="12"
+/ns0:object/ns0:item/ns0:array/ns0:item
+/ns0:object/ns0:item/ns0:array/ns0:item/ns0:number
+/ns0:object/ns0:item/ns0:array/ns0:item/ns0:number@value="34"
+/ns0:object/ns0:item
+/ns0:object/ns0:item@name="ref3"
+/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:string@value="foo"
diff --git a/test/json/refs1/input.json b/test/json/refs1/input.json
new file mode 100644
index 0000000..9889889
--- /dev/null
+++ b/test/json/refs1/input.json
@@ -0,0 +1,4 @@
+{
+ "$ref": "./ref.json"
+}
+
diff --git a/test/json/refs1/ref.json b/test/json/refs1/ref.json
new file mode 100644
index 0000000..17f67b4
--- /dev/null
+++ b/test/json/refs1/ref.json
@@ -0,0 +1,2 @@
+{ "ref1": 1, "ref2": [12,34], "ref3": "foo" }
+
diff --git a/test/json/swagger/check.txt b/test/json/swagger/check.txt
new file mode 100644
index 0000000..30e14b3
--- /dev/null
+++ b/test/json/swagger/check.txt
@@ -0,0 +1,546 @@
+ns0="http://schemas.kohei.us/orcus/2015/json"
+/ns0:object
+/ns0:object/ns0:item
+/ns0:object/ns0:item@name="swagger"
+/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:string@value="2.0"
+/ns0:object/ns0:item
+/ns0:object/ns0:item@name="info"
+/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item@name="version"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="1.0.0"
+/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item@name="title"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="Swagger Petstore (Simple)"
+/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item@name="description"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="A sample API that uses a petstore as an example to demonstrate features in the swagger-2.0 specification"
+/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item@name="termsOfService"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="http://helloreverb.com/terms/"
+/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item@name="contact"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="name"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="Swagger API team"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="email"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="foo@example.com"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="url"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="http://swagger.io"
+/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item@name="license"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="name"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="MIT"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="url"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="http://opensource.org/licenses/MIT"
+/ns0:object/ns0:item
+/ns0:object/ns0:item@name="host"
+/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:string@value="petstore.swagger.wordnik.com"
+/ns0:object/ns0:item
+/ns0:object/ns0:item@name="basePath"
+/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:string@value="/api"
+/ns0:object/ns0:item
+/ns0:object/ns0:item@name="schemes"
+/ns0:object/ns0:item/ns0:array
+/ns0:object/ns0:item/ns0:array/ns0:item
+/ns0:object/ns0:item/ns0:array/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:array/ns0:item/ns0:string@value="http"
+/ns0:object/ns0:item
+/ns0:object/ns0:item@name="consumes"
+/ns0:object/ns0:item/ns0:array
+/ns0:object/ns0:item/ns0:array/ns0:item
+/ns0:object/ns0:item/ns0:array/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:array/ns0:item/ns0:string@value="application/json"
+/ns0:object/ns0:item
+/ns0:object/ns0:item@name="produces"
+/ns0:object/ns0:item/ns0:array
+/ns0:object/ns0:item/ns0:array/ns0:item
+/ns0:object/ns0:item/ns0:array/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:array/ns0:item/ns0:string@value="application/json"
+/ns0:object/ns0:item
+/ns0:object/ns0:item@name="paths"
+/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item@name="/pets"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="get"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="description"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="Returns all pets from the system that the user has access to"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="operationId"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="findPets"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="produces"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:string@value="application/json"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:string@value="application/xml"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:string@value="text/xml"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:string@value="text/html"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="parameters"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item@name="name"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string@value="tags"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item@name="in"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string@value="query"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item@name="description"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string@value="tags to filter by"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item@name="required"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:false
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item@name="type"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string@value="array"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item@name="items"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="type"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="string"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item@name="collectionFormat"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string@value="csv"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item@name="name"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string@value="limit"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item@name="in"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string@value="query"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item@name="description"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string@value="maximum number of results to return"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item@name="required"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:false
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item@name="type"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string@value="integer"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item@name="format"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string@value="int32"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="responses"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="200"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="description"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="pet response"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="schema"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="type"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="array"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="items"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="$ref"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="#/definitions/pet"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="default"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="description"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="unexpected error"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="schema"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="$ref"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="#/definitions/errorModel"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="post"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="description"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="Creates a new pet in the store. Duplicates are allowed"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="operationId"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="addPet"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="produces"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:string@value="application/json"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="parameters"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item@name="name"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string@value="pet"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item@name="in"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string@value="body"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item@name="description"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string@value="Pet to add to the store"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item@name="required"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:true
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item@name="schema"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="$ref"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="#/definitions/newPet"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="responses"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="200"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="description"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="pet response"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="schema"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="$ref"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="#/definitions/pet"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="default"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="description"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="unexpected error"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="schema"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="$ref"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="#/definitions/errorModel"
+/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item@name="/pets/{id}"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="get"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="description"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="Returns a user based on a single ID, if the user does not have access to the pet"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="operationId"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="findPetById"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="produces"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:string@value="application/json"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:string@value="application/xml"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:string@value="text/xml"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:string@value="text/html"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="parameters"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item@name="name"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string@value="id"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item@name="in"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string@value="path"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item@name="description"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string@value="ID of pet to fetch"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item@name="required"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:true
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item@name="type"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string@value="integer"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item@name="format"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string@value="int64"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="responses"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="200"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="description"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="pet response"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="schema"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="$ref"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="#/definitions/pet"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="default"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="description"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="unexpected error"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="schema"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="$ref"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="#/definitions/errorModel"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="delete"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="description"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="deletes a single pet based on the ID supplied"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="operationId"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="deletePet"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="parameters"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item@name="name"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string@value="id"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item@name="in"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string@value="path"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item@name="description"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string@value="ID of pet to delete"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item@name="required"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:true
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item@name="type"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string@value="integer"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item@name="format"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:object/ns0:item/ns0:string@value="int64"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="responses"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="204"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="description"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="pet deleted"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="default"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="description"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="unexpected error"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="schema"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="$ref"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="#/definitions/errorModel"
+/ns0:object/ns0:item
+/ns0:object/ns0:item@name="definitions"
+/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item@name="pet"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="required"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:string@value="id"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:string@value="name"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="properties"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="id"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="type"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="integer"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="format"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="int64"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="name"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="type"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="string"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="tag"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="type"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="string"
+/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item@name="newPet"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="required"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:string@value="name"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="properties"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="id"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="type"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="integer"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="format"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="int64"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="name"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="type"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="string"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="tag"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="type"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="string"
+/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item@name="errorModel"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="required"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:string@value="code"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:array/ns0:item/ns0:string@value="message"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="properties"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="code"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="type"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="integer"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="format"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="int32"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="message"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item@name="type"
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:object/ns0:item/ns0:string@value="string"
diff --git a/test/json/swagger/input.json b/test/json/swagger/input.json
new file mode 100644
index 0000000..5e57330
--- /dev/null
+++ b/test/json/swagger/input.json
@@ -0,0 +1,226 @@
+{
+ "swagger": "2.0",
+ "info": {
+ "version": "1.0.0",
+ "title": "Swagger Petstore (Simple)",
+ "description": "A sample API that uses a petstore as an example to demonstrate features in the swagger-2.0 specification",
+ "termsOfService": "http://helloreverb.com/terms/",
+ "contact": {
+ "name": "Swagger API team",
+ "email": "foo@example.com",
+ "url": "http://swagger.io"
+ },
+ "license": {
+ "name": "MIT",
+ "url": "http://opensource.org/licenses/MIT"
+ }
+ },
+ "host": "petstore.swagger.wordnik.com",
+ "basePath": "/api",
+ "schemes": [
+ "http"
+ ],
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "paths": {
+ "/pets": {
+ "get": {
+ "description": "Returns all pets from the system that the user has access to",
+ "operationId": "findPets",
+ "produces": [
+ "application/json",
+ "application/xml",
+ "text/xml",
+ "text/html"
+ ],
+ "parameters": [
+ {
+ "name": "tags",
+ "in": "query",
+ "description": "tags to filter by",
+ "required": false,
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "collectionFormat": "csv"
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "description": "maximum number of results to return",
+ "required": false,
+ "type": "integer",
+ "format": "int32"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "pet response",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/pet"
+ }
+ }
+ },
+ "default": {
+ "description": "unexpected error",
+ "schema": {
+ "$ref": "#/definitions/errorModel"
+ }
+ }
+ }
+ },
+ "post": {
+ "description": "Creates a new pet in the store. Duplicates are allowed",
+ "operationId": "addPet",
+ "produces": [
+ "application/json"
+ ],
+ "parameters": [
+ {
+ "name": "pet",
+ "in": "body",
+ "description": "Pet to add to the store",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/newPet"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "pet response",
+ "schema": {
+ "$ref": "#/definitions/pet"
+ }
+ },
+ "default": {
+ "description": "unexpected error",
+ "schema": {
+ "$ref": "#/definitions/errorModel"
+ }
+ }
+ }
+ }
+ },
+ "/pets/{id}": {
+ "get": {
+ "description": "Returns a user based on a single ID, if the user does not have access to the pet",
+ "operationId": "findPetById",
+ "produces": [
+ "application/json",
+ "application/xml",
+ "text/xml",
+ "text/html"
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "ID of pet to fetch",
+ "required": true,
+ "type": "integer",
+ "format": "int64"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "pet response",
+ "schema": {
+ "$ref": "#/definitions/pet"
+ }
+ },
+ "default": {
+ "description": "unexpected error",
+ "schema": {
+ "$ref": "#/definitions/errorModel"
+ }
+ }
+ }
+ },
+ "delete": {
+ "description": "deletes a single pet based on the ID supplied",
+ "operationId": "deletePet",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "ID of pet to delete",
+ "required": true,
+ "type": "integer",
+ "format": "int64"
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "pet deleted"
+ },
+ "default": {
+ "description": "unexpected error",
+ "schema": {
+ "$ref": "#/definitions/errorModel"
+ }
+ }
+ }
+ }
+ }
+ },
+ "definitions": {
+ "pet": {
+ "required": [
+ "id",
+ "name"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "name": {
+ "type": "string"
+ },
+ "tag": {
+ "type": "string"
+ }
+ }
+ },
+ "newPet": {
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "name": {
+ "type": "string"
+ },
+ "tag": {
+ "type": "string"
+ }
+ }
+ },
+ "errorModel": {
+ "required": [
+ "code",
+ "message"
+ ],
+ "properties": {
+ "code": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "message": {
+ "type": "string"
+ }
+ }
+ }
+ }
+}
diff --git a/test/json/swagger/output.yaml b/test/json/swagger/output.yaml
new file mode 100644
index 0000000..349e7a1
--- /dev/null
+++ b/test/json/swagger/output.yaml
@@ -0,0 +1,155 @@
+---
+swagger: 2.0
+info:
+ version: 1.0.0
+ title: Swagger Petstore (Simple)
+ description: A sample API that uses a petstore as an example to demonstrate features in the swagger-2.0 specification
+ termsOfService: http://helloreverb.com/terms/
+ contact:
+ name: Swagger API team
+ email: foo@example.com
+ url: http://swagger.io
+ license:
+ name: MIT
+ url: http://opensource.org/licenses/MIT
+host: petstore.swagger.wordnik.com
+basePath: /api
+schemes:
+ - http
+consumes:
+ - application/json
+produces:
+ - application/json
+paths:
+ /pets:
+ get:
+ description: Returns all pets from the system that the user has access to
+ operationId: findPets
+ produces:
+ - application/json
+ - application/xml
+ - text/xml
+ - text/html
+ parameters:
+ - name: tags
+ in: query
+ description: tags to filter by
+ required: false
+ type: array
+ items:
+ type: string
+ collectionFormat: csv
+ - name: limit
+ in: query
+ description: maximum number of results to return
+ required: false
+ type: integer
+ format: int32
+ responses:
+ 200:
+ description: pet response
+ schema:
+ type: array
+ items:
+ $ref: "#/definitions/pet"
+ default:
+ description: unexpected error
+ schema:
+ $ref: "#/definitions/errorModel"
+ post:
+ description: Creates a new pet in the store. Duplicates are allowed
+ operationId: addPet
+ produces:
+ - application/json
+ parameters:
+ - name: pet
+ in: body
+ description: Pet to add to the store
+ required: true
+ schema:
+ $ref: "#/definitions/newPet"
+ responses:
+ 200:
+ description: pet response
+ schema:
+ $ref: "#/definitions/pet"
+ default:
+ description: unexpected error
+ schema:
+ $ref: "#/definitions/errorModel"
+ /pets/{id}:
+ get:
+ description: Returns a user based on a single ID, if the user does not have access to the pet
+ operationId: findPetById
+ produces:
+ - application/json
+ - application/xml
+ - text/xml
+ - text/html
+ parameters:
+ - name: id
+ in: path
+ description: ID of pet to fetch
+ required: true
+ type: integer
+ format: int64
+ responses:
+ 200:
+ description: pet response
+ schema:
+ $ref: "#/definitions/pet"
+ default:
+ description: unexpected error
+ schema:
+ $ref: "#/definitions/errorModel"
+ delete:
+ description: deletes a single pet based on the ID supplied
+ operationId: deletePet
+ parameters:
+ - name: id
+ in: path
+ description: ID of pet to delete
+ required: true
+ type: integer
+ format: int64
+ responses:
+ 204:
+ description: pet deleted
+ default:
+ description: unexpected error
+ schema:
+ $ref: "#/definitions/errorModel"
+definitions:
+ pet:
+ required:
+ - id
+ - name
+ properties:
+ id:
+ type: integer
+ format: int64
+ name:
+ type: string
+ tag:
+ type: string
+ newPet:
+ required:
+ - name
+ properties:
+ id:
+ type: integer
+ format: int64
+ name:
+ type: string
+ tag:
+ type: string
+ errorModel:
+ required:
+ - code
+ - message
+ properties:
+ code:
+ type: integer
+ format: int32
+ message:
+ type: string
diff --git a/test/json/to-yaml-1/check.txt b/test/json/to-yaml-1/check.txt
new file mode 100644
index 0000000..955eee1
--- /dev/null
+++ b/test/json/to-yaml-1/check.txt
@@ -0,0 +1,14 @@
+ns0="http://schemas.kohei.us/orcus/2015/json"
+/ns0:object
+/ns0:object/ns0:item
+/ns0:object/ns0:item@name="A:B:C"
+/ns0:object/ns0:item/ns0:number
+/ns0:object/ns0:item/ns0:number@value="123"
+/ns0:object/ns0:item
+/ns0:object/ns0:item@name="#text"
+/ns0:object/ns0:item/ns0:string
+/ns0:object/ns0:item/ns0:string@value="my value"
+/ns0:object/ns0:item
+/ns0:object/ns0:item@name="A: B: C: "
+/ns0:object/ns0:item/ns0:number
+/ns0:object/ns0:item/ns0:number@value="456"
diff --git a/test/json/to-yaml-1/input.json b/test/json/to-yaml-1/input.json
new file mode 100644
index 0000000..3dedc8a
--- /dev/null
+++ b/test/json/to-yaml-1/input.json
@@ -0,0 +1 @@
+{ "A:B:C": 123, "#text": "my value", "A: B: C: ": 456 }
diff --git a/test/json/to-yaml-1/output.yaml b/test/json/to-yaml-1/output.yaml
new file mode 100644
index 0000000..1d8628a
--- /dev/null
+++ b/test/json/to-yaml-1/output.yaml
@@ -0,0 +1,4 @@
+---
+A:B:C: 123
+"#text": my value
+"A: B: C: ": 456
diff --git a/test/json/validation/LICENSE b/test/json/validation/LICENSE
new file mode 100644
index 0000000..c4b3621
--- /dev/null
+++ b/test/json/validation/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2016 Nicolas Seriot
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/test/json/validation/README b/test/json/validation/README
new file mode 100644
index 0000000..1967dfe
--- /dev/null
+++ b/test/json/validation/README
@@ -0,0 +1 @@
+These files are taken from https://github.com/nst/JSONTestSuite and are distributed under the MIT license.
diff --git a/test/json/validation/i_number_double_huge_neg_exp.json b/test/json/validation/i_number_double_huge_neg_exp.json
new file mode 100644
index 0000000..ae4c7b7
--- /dev/null
+++ b/test/json/validation/i_number_double_huge_neg_exp.json
@@ -0,0 +1 @@
+[123.456e-789] \ No newline at end of file
diff --git a/test/json/validation/i_number_huge_exp.json b/test/json/validation/i_number_huge_exp.json
new file mode 100644
index 0000000..9b5efa2
--- /dev/null
+++ b/test/json/validation/i_number_huge_exp.json
@@ -0,0 +1 @@
+[0.4e00669999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999969999999006] \ No newline at end of file
diff --git a/test/json/validation/i_number_neg_int_huge_exp.json b/test/json/validation/i_number_neg_int_huge_exp.json
new file mode 100644
index 0000000..3abd58a
--- /dev/null
+++ b/test/json/validation/i_number_neg_int_huge_exp.json
@@ -0,0 +1 @@
+[-1e+9999] \ No newline at end of file
diff --git a/test/json/validation/i_number_pos_double_huge_exp.json b/test/json/validation/i_number_pos_double_huge_exp.json
new file mode 100644
index 0000000..e10a7eb
--- /dev/null
+++ b/test/json/validation/i_number_pos_double_huge_exp.json
@@ -0,0 +1 @@
+[1.5e+9999] \ No newline at end of file
diff --git a/test/json/validation/i_number_real_neg_overflow.json b/test/json/validation/i_number_real_neg_overflow.json
new file mode 100644
index 0000000..3d628a9
--- /dev/null
+++ b/test/json/validation/i_number_real_neg_overflow.json
@@ -0,0 +1 @@
+[-123123e100000] \ No newline at end of file
diff --git a/test/json/validation/i_number_real_pos_overflow.json b/test/json/validation/i_number_real_pos_overflow.json
new file mode 100644
index 0000000..54d7d3d
--- /dev/null
+++ b/test/json/validation/i_number_real_pos_overflow.json
@@ -0,0 +1 @@
+[123123e100000] \ No newline at end of file
diff --git a/test/json/validation/i_number_real_underflow.json b/test/json/validation/i_number_real_underflow.json
new file mode 100644
index 0000000..c5236eb
--- /dev/null
+++ b/test/json/validation/i_number_real_underflow.json
@@ -0,0 +1 @@
+[123e-10000000] \ No newline at end of file
diff --git a/test/json/validation/i_number_too_big_neg_int.json b/test/json/validation/i_number_too_big_neg_int.json
new file mode 100644
index 0000000..dfa3846
--- /dev/null
+++ b/test/json/validation/i_number_too_big_neg_int.json
@@ -0,0 +1 @@
+[-123123123123123123123123123123] \ No newline at end of file
diff --git a/test/json/validation/i_number_too_big_pos_int.json b/test/json/validation/i_number_too_big_pos_int.json
new file mode 100644
index 0000000..338a8c3
--- /dev/null
+++ b/test/json/validation/i_number_too_big_pos_int.json
@@ -0,0 +1 @@
+[100000000000000000000] \ No newline at end of file
diff --git a/test/json/validation/i_number_very_big_negative_int.json b/test/json/validation/i_number_very_big_negative_int.json
new file mode 100644
index 0000000..e2d9738
--- /dev/null
+++ b/test/json/validation/i_number_very_big_negative_int.json
@@ -0,0 +1 @@
+[-237462374673276894279832749832423479823246327846] \ No newline at end of file
diff --git a/test/json/validation/i_object_key_lone_2nd_surrogate.json b/test/json/validation/i_object_key_lone_2nd_surrogate.json
new file mode 100644
index 0000000..5be7eba
--- /dev/null
+++ b/test/json/validation/i_object_key_lone_2nd_surrogate.json
@@ -0,0 +1 @@
+{"\uDFAA":0} \ No newline at end of file
diff --git a/test/json/validation/i_string_1st_surrogate_but_2nd_missing.json b/test/json/validation/i_string_1st_surrogate_but_2nd_missing.json
new file mode 100644
index 0000000..3b9e37c
--- /dev/null
+++ b/test/json/validation/i_string_1st_surrogate_but_2nd_missing.json
@@ -0,0 +1 @@
+["\uDADA"] \ No newline at end of file
diff --git a/test/json/validation/i_string_1st_valid_surrogate_2nd_invalid.json b/test/json/validation/i_string_1st_valid_surrogate_2nd_invalid.json
new file mode 100644
index 0000000..4875928
--- /dev/null
+++ b/test/json/validation/i_string_1st_valid_surrogate_2nd_invalid.json
@@ -0,0 +1 @@
+["\uD888\u1234"] \ No newline at end of file
diff --git a/test/json/validation/i_string_UTF-16LE_with_BOM.json b/test/json/validation/i_string_UTF-16LE_with_BOM.json
new file mode 100644
index 0000000..2a79c06
--- /dev/null
+++ b/test/json/validation/i_string_UTF-16LE_with_BOM.json
Binary files differ
diff --git a/test/json/validation/i_string_UTF-8_invalid_sequence.json b/test/json/validation/i_string_UTF-8_invalid_sequence.json
new file mode 100644
index 0000000..e2a968a
--- /dev/null
+++ b/test/json/validation/i_string_UTF-8_invalid_sequence.json
@@ -0,0 +1 @@
+["日ш"] \ No newline at end of file
diff --git a/test/json/validation/i_string_UTF8_surrogate_U+D800.json b/test/json/validation/i_string_UTF8_surrogate_U+D800.json
new file mode 100644
index 0000000..916bff9
--- /dev/null
+++ b/test/json/validation/i_string_UTF8_surrogate_U+D800.json
@@ -0,0 +1 @@
+[""] \ No newline at end of file
diff --git a/test/json/validation/i_string_incomplete_surrogate_and_escape_valid.json b/test/json/validation/i_string_incomplete_surrogate_and_escape_valid.json
new file mode 100644
index 0000000..3cb11d2
--- /dev/null
+++ b/test/json/validation/i_string_incomplete_surrogate_and_escape_valid.json
@@ -0,0 +1 @@
+["\uD800\n"] \ No newline at end of file
diff --git a/test/json/validation/i_string_incomplete_surrogate_pair.json b/test/json/validation/i_string_incomplete_surrogate_pair.json
new file mode 100644
index 0000000..38ec23b
--- /dev/null
+++ b/test/json/validation/i_string_incomplete_surrogate_pair.json
@@ -0,0 +1 @@
+["\uDd1ea"] \ No newline at end of file
diff --git a/test/json/validation/i_string_incomplete_surrogates_escape_valid.json b/test/json/validation/i_string_incomplete_surrogates_escape_valid.json
new file mode 100644
index 0000000..c9cd6f6
--- /dev/null
+++ b/test/json/validation/i_string_incomplete_surrogates_escape_valid.json
@@ -0,0 +1 @@
+["\uD800\uD800\n"] \ No newline at end of file
diff --git a/test/json/validation/i_string_invalid_lonely_surrogate.json b/test/json/validation/i_string_invalid_lonely_surrogate.json
new file mode 100644
index 0000000..3abbd8d
--- /dev/null
+++ b/test/json/validation/i_string_invalid_lonely_surrogate.json
@@ -0,0 +1 @@
+["\ud800"] \ No newline at end of file
diff --git a/test/json/validation/i_string_invalid_surrogate.json b/test/json/validation/i_string_invalid_surrogate.json
new file mode 100644
index 0000000..ffddc04
--- /dev/null
+++ b/test/json/validation/i_string_invalid_surrogate.json
@@ -0,0 +1 @@
+["\ud800abc"] \ No newline at end of file
diff --git a/test/json/validation/i_string_invalid_utf-8.json b/test/json/validation/i_string_invalid_utf-8.json
new file mode 100644
index 0000000..8e45a7e
--- /dev/null
+++ b/test/json/validation/i_string_invalid_utf-8.json
@@ -0,0 +1 @@
+[""] \ No newline at end of file
diff --git a/test/json/validation/i_string_inverted_surrogates_U+1D11E.json b/test/json/validation/i_string_inverted_surrogates_U+1D11E.json
new file mode 100644
index 0000000..0d5456c
--- /dev/null
+++ b/test/json/validation/i_string_inverted_surrogates_U+1D11E.json
@@ -0,0 +1 @@
+["\uDd1e\uD834"] \ No newline at end of file
diff --git a/test/json/validation/i_string_iso_latin_1.json b/test/json/validation/i_string_iso_latin_1.json
new file mode 100644
index 0000000..9389c98
--- /dev/null
+++ b/test/json/validation/i_string_iso_latin_1.json
@@ -0,0 +1 @@
+[""] \ No newline at end of file
diff --git a/test/json/validation/i_string_lone_second_surrogate.json b/test/json/validation/i_string_lone_second_surrogate.json
new file mode 100644
index 0000000..1dbd397
--- /dev/null
+++ b/test/json/validation/i_string_lone_second_surrogate.json
@@ -0,0 +1 @@
+["\uDFAA"] \ No newline at end of file
diff --git a/test/json/validation/i_string_lone_utf8_continuation_byte.json b/test/json/validation/i_string_lone_utf8_continuation_byte.json
new file mode 100644
index 0000000..729337c
--- /dev/null
+++ b/test/json/validation/i_string_lone_utf8_continuation_byte.json
@@ -0,0 +1 @@
+[""] \ No newline at end of file
diff --git a/test/json/validation/i_string_not_in_unicode_range.json b/test/json/validation/i_string_not_in_unicode_range.json
new file mode 100644
index 0000000..df90a29
--- /dev/null
+++ b/test/json/validation/i_string_not_in_unicode_range.json
@@ -0,0 +1 @@
+[""] \ No newline at end of file
diff --git a/test/json/validation/i_string_overlong_sequence_2_bytes.json b/test/json/validation/i_string_overlong_sequence_2_bytes.json
new file mode 100644
index 0000000..c8cee5e
--- /dev/null
+++ b/test/json/validation/i_string_overlong_sequence_2_bytes.json
@@ -0,0 +1 @@
+[""] \ No newline at end of file
diff --git a/test/json/validation/i_string_overlong_sequence_6_bytes.json b/test/json/validation/i_string_overlong_sequence_6_bytes.json
new file mode 100644
index 0000000..9a91da7
--- /dev/null
+++ b/test/json/validation/i_string_overlong_sequence_6_bytes.json
@@ -0,0 +1 @@
+[""] \ No newline at end of file
diff --git a/test/json/validation/i_string_overlong_sequence_6_bytes_null.json b/test/json/validation/i_string_overlong_sequence_6_bytes_null.json
new file mode 100644
index 0000000..d24fffd
--- /dev/null
+++ b/test/json/validation/i_string_overlong_sequence_6_bytes_null.json
@@ -0,0 +1 @@
+[""] \ No newline at end of file
diff --git a/test/json/validation/i_string_truncated-utf-8.json b/test/json/validation/i_string_truncated-utf-8.json
new file mode 100644
index 0000000..63c7777
--- /dev/null
+++ b/test/json/validation/i_string_truncated-utf-8.json
@@ -0,0 +1 @@
+[""] \ No newline at end of file
diff --git a/test/json/validation/i_string_utf16BE_no_BOM.json b/test/json/validation/i_string_utf16BE_no_BOM.json
new file mode 100644
index 0000000..57e5392
--- /dev/null
+++ b/test/json/validation/i_string_utf16BE_no_BOM.json
Binary files differ
diff --git a/test/json/validation/i_string_utf16LE_no_BOM.json b/test/json/validation/i_string_utf16LE_no_BOM.json
new file mode 100644
index 0000000..c49c1b2
--- /dev/null
+++ b/test/json/validation/i_string_utf16LE_no_BOM.json
Binary files differ
diff --git a/test/json/validation/i_structure_500_nested_arrays.json b/test/json/validation/i_structure_500_nested_arrays.json
new file mode 100644
index 0000000..7118405
--- /dev/null
+++ b/test/json/validation/i_structure_500_nested_arrays.json
@@ -0,0 +1 @@
+[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] \ No newline at end of file
diff --git a/test/json/validation/i_structure_UTF-8_BOM_empty_object.json b/test/json/validation/i_structure_UTF-8_BOM_empty_object.json
new file mode 100644
index 0000000..22fdca1
--- /dev/null
+++ b/test/json/validation/i_structure_UTF-8_BOM_empty_object.json
@@ -0,0 +1 @@
+{} \ No newline at end of file
diff --git a/test/json/validation/n_array_1_true_without_comma.json b/test/json/validation/n_array_1_true_without_comma.json
new file mode 100644
index 0000000..c14e3f6
--- /dev/null
+++ b/test/json/validation/n_array_1_true_without_comma.json
@@ -0,0 +1 @@
+[1 true] \ No newline at end of file
diff --git a/test/json/validation/n_array_a_invalid_utf8.json b/test/json/validation/n_array_a_invalid_utf8.json
new file mode 100644
index 0000000..38a86e2
--- /dev/null
+++ b/test/json/validation/n_array_a_invalid_utf8.json
@@ -0,0 +1 @@
+[a] \ No newline at end of file
diff --git a/test/json/validation/n_array_colon_instead_of_comma.json b/test/json/validation/n_array_colon_instead_of_comma.json
new file mode 100644
index 0000000..0d02ad4
--- /dev/null
+++ b/test/json/validation/n_array_colon_instead_of_comma.json
@@ -0,0 +1 @@
+["": 1] \ No newline at end of file
diff --git a/test/json/validation/n_array_comma_after_close.json b/test/json/validation/n_array_comma_after_close.json
new file mode 100644
index 0000000..2ccba8d
--- /dev/null
+++ b/test/json/validation/n_array_comma_after_close.json
@@ -0,0 +1 @@
+[""], \ No newline at end of file
diff --git a/test/json/validation/n_array_comma_and_number.json b/test/json/validation/n_array_comma_and_number.json
new file mode 100644
index 0000000..d2c84e3
--- /dev/null
+++ b/test/json/validation/n_array_comma_and_number.json
@@ -0,0 +1 @@
+[,1] \ No newline at end of file
diff --git a/test/json/validation/n_array_double_comma.json b/test/json/validation/n_array_double_comma.json
new file mode 100644
index 0000000..0431712
--- /dev/null
+++ b/test/json/validation/n_array_double_comma.json
@@ -0,0 +1 @@
+[1,,2] \ No newline at end of file
diff --git a/test/json/validation/n_array_double_extra_comma.json b/test/json/validation/n_array_double_extra_comma.json
new file mode 100644
index 0000000..3f01d31
--- /dev/null
+++ b/test/json/validation/n_array_double_extra_comma.json
@@ -0,0 +1 @@
+["x",,] \ No newline at end of file
diff --git a/test/json/validation/n_array_extra_close.json b/test/json/validation/n_array_extra_close.json
new file mode 100644
index 0000000..c12f9fa
--- /dev/null
+++ b/test/json/validation/n_array_extra_close.json
@@ -0,0 +1 @@
+["x"]] \ No newline at end of file
diff --git a/test/json/validation/n_array_extra_comma.json b/test/json/validation/n_array_extra_comma.json
new file mode 100644
index 0000000..5f8ce18
--- /dev/null
+++ b/test/json/validation/n_array_extra_comma.json
@@ -0,0 +1 @@
+["",] \ No newline at end of file
diff --git a/test/json/validation/n_array_incomplete.json b/test/json/validation/n_array_incomplete.json
new file mode 100644
index 0000000..cc65b0b
--- /dev/null
+++ b/test/json/validation/n_array_incomplete.json
@@ -0,0 +1 @@
+["x" \ No newline at end of file
diff --git a/test/json/validation/n_array_incomplete_invalid_value.json b/test/json/validation/n_array_incomplete_invalid_value.json
new file mode 100644
index 0000000..c21a8f6
--- /dev/null
+++ b/test/json/validation/n_array_incomplete_invalid_value.json
@@ -0,0 +1 @@
+[x \ No newline at end of file
diff --git a/test/json/validation/n_array_inner_array_no_comma.json b/test/json/validation/n_array_inner_array_no_comma.json
new file mode 100644
index 0000000..c70b716
--- /dev/null
+++ b/test/json/validation/n_array_inner_array_no_comma.json
@@ -0,0 +1 @@
+[3[4]] \ No newline at end of file
diff --git a/test/json/validation/n_array_invalid_utf8.json b/test/json/validation/n_array_invalid_utf8.json
new file mode 100644
index 0000000..6099d34
--- /dev/null
+++ b/test/json/validation/n_array_invalid_utf8.json
@@ -0,0 +1 @@
+[] \ No newline at end of file
diff --git a/test/json/validation/n_array_items_separated_by_semicolon.json b/test/json/validation/n_array_items_separated_by_semicolon.json
new file mode 100644
index 0000000..d4bd731
--- /dev/null
+++ b/test/json/validation/n_array_items_separated_by_semicolon.json
@@ -0,0 +1 @@
+[1:2] \ No newline at end of file
diff --git a/test/json/validation/n_array_just_comma.json b/test/json/validation/n_array_just_comma.json
new file mode 100644
index 0000000..9d7077c
--- /dev/null
+++ b/test/json/validation/n_array_just_comma.json
@@ -0,0 +1 @@
+[,] \ No newline at end of file
diff --git a/test/json/validation/n_array_just_minus.json b/test/json/validation/n_array_just_minus.json
new file mode 100644
index 0000000..29501c6
--- /dev/null
+++ b/test/json/validation/n_array_just_minus.json
@@ -0,0 +1 @@
+[-] \ No newline at end of file
diff --git a/test/json/validation/n_array_missing_value.json b/test/json/validation/n_array_missing_value.json
new file mode 100644
index 0000000..3a6ba86
--- /dev/null
+++ b/test/json/validation/n_array_missing_value.json
@@ -0,0 +1 @@
+[ , ""] \ No newline at end of file
diff --git a/test/json/validation/n_array_newlines_unclosed.json b/test/json/validation/n_array_newlines_unclosed.json
new file mode 100644
index 0000000..6466800
--- /dev/null
+++ b/test/json/validation/n_array_newlines_unclosed.json
@@ -0,0 +1,3 @@
+["a",
+4
+,1, \ No newline at end of file
diff --git a/test/json/validation/n_array_number_and_comma.json b/test/json/validation/n_array_number_and_comma.json
new file mode 100644
index 0000000..13f6f1d
--- /dev/null
+++ b/test/json/validation/n_array_number_and_comma.json
@@ -0,0 +1 @@
+[1,] \ No newline at end of file
diff --git a/test/json/validation/n_array_number_and_several_commas.json b/test/json/validation/n_array_number_and_several_commas.json
new file mode 100644
index 0000000..0ac408c
--- /dev/null
+++ b/test/json/validation/n_array_number_and_several_commas.json
@@ -0,0 +1 @@
+[1,,] \ No newline at end of file
diff --git a/test/json/validation/n_array_spaces_vertical_tab_formfeed.json b/test/json/validation/n_array_spaces_vertical_tab_formfeed.json
new file mode 100644
index 0000000..6cd7cf5
--- /dev/null
+++ b/test/json/validation/n_array_spaces_vertical_tab_formfeed.json
@@ -0,0 +1 @@
+[" a"\f] \ No newline at end of file
diff --git a/test/json/validation/n_array_star_inside.json b/test/json/validation/n_array_star_inside.json
new file mode 100644
index 0000000..5a51946
--- /dev/null
+++ b/test/json/validation/n_array_star_inside.json
@@ -0,0 +1 @@
+[*] \ No newline at end of file
diff --git a/test/json/validation/n_array_unclosed.json b/test/json/validation/n_array_unclosed.json
new file mode 100644
index 0000000..0607330
--- /dev/null
+++ b/test/json/validation/n_array_unclosed.json
@@ -0,0 +1 @@
+["" \ No newline at end of file
diff --git a/test/json/validation/n_array_unclosed_trailing_comma.json b/test/json/validation/n_array_unclosed_trailing_comma.json
new file mode 100644
index 0000000..6604698
--- /dev/null
+++ b/test/json/validation/n_array_unclosed_trailing_comma.json
@@ -0,0 +1 @@
+[1, \ No newline at end of file
diff --git a/test/json/validation/n_array_unclosed_with_new_lines.json b/test/json/validation/n_array_unclosed_with_new_lines.json
new file mode 100644
index 0000000..4f61de3
--- /dev/null
+++ b/test/json/validation/n_array_unclosed_with_new_lines.json
@@ -0,0 +1,3 @@
+[1,
+1
+,1 \ No newline at end of file
diff --git a/test/json/validation/n_array_unclosed_with_object_inside.json b/test/json/validation/n_array_unclosed_with_object_inside.json
new file mode 100644
index 0000000..043a87e
--- /dev/null
+++ b/test/json/validation/n_array_unclosed_with_object_inside.json
@@ -0,0 +1 @@
+[{} \ No newline at end of file
diff --git a/test/json/validation/n_incomplete_false.json b/test/json/validation/n_incomplete_false.json
new file mode 100644
index 0000000..eb18c6a
--- /dev/null
+++ b/test/json/validation/n_incomplete_false.json
@@ -0,0 +1 @@
+[fals] \ No newline at end of file
diff --git a/test/json/validation/n_incomplete_null.json b/test/json/validation/n_incomplete_null.json
new file mode 100644
index 0000000..c18ef53
--- /dev/null
+++ b/test/json/validation/n_incomplete_null.json
@@ -0,0 +1 @@
+[nul] \ No newline at end of file
diff --git a/test/json/validation/n_incomplete_true.json b/test/json/validation/n_incomplete_true.json
new file mode 100644
index 0000000..f451ac6
--- /dev/null
+++ b/test/json/validation/n_incomplete_true.json
@@ -0,0 +1 @@
+[tru] \ No newline at end of file
diff --git a/test/json/validation/n_multidigit_number_then_00.json b/test/json/validation/n_multidigit_number_then_00.json
new file mode 100644
index 0000000..c22507b
--- /dev/null
+++ b/test/json/validation/n_multidigit_number_then_00.json
Binary files differ
diff --git a/test/json/validation/n_number_++.json b/test/json/validation/n_number_++.json
new file mode 100644
index 0000000..bdb62aa
--- /dev/null
+++ b/test/json/validation/n_number_++.json
@@ -0,0 +1 @@
+[++1234] \ No newline at end of file
diff --git a/test/json/validation/n_number_+1.json b/test/json/validation/n_number_+1.json
new file mode 100644
index 0000000..3cbe58c
--- /dev/null
+++ b/test/json/validation/n_number_+1.json
@@ -0,0 +1 @@
+[+1] \ No newline at end of file
diff --git a/test/json/validation/n_number_+Inf.json b/test/json/validation/n_number_+Inf.json
new file mode 100644
index 0000000..871ae14
--- /dev/null
+++ b/test/json/validation/n_number_+Inf.json
@@ -0,0 +1 @@
+[+Inf] \ No newline at end of file
diff --git a/test/json/validation/n_number_-01.json b/test/json/validation/n_number_-01.json
new file mode 100644
index 0000000..0df32ba
--- /dev/null
+++ b/test/json/validation/n_number_-01.json
@@ -0,0 +1 @@
+[-01] \ No newline at end of file
diff --git a/test/json/validation/n_number_-1.0..json b/test/json/validation/n_number_-1.0..json
new file mode 100644
index 0000000..7cf55a8
--- /dev/null
+++ b/test/json/validation/n_number_-1.0..json
@@ -0,0 +1 @@
+[-1.0.] \ No newline at end of file
diff --git a/test/json/validation/n_number_-2..json b/test/json/validation/n_number_-2..json
new file mode 100644
index 0000000..9be8436
--- /dev/null
+++ b/test/json/validation/n_number_-2..json
@@ -0,0 +1 @@
+[-2.] \ No newline at end of file
diff --git a/test/json/validation/n_number_-NaN.json b/test/json/validation/n_number_-NaN.json
new file mode 100644
index 0000000..f61615d
--- /dev/null
+++ b/test/json/validation/n_number_-NaN.json
@@ -0,0 +1 @@
+[-NaN] \ No newline at end of file
diff --git a/test/json/validation/n_number_.-1.json b/test/json/validation/n_number_.-1.json
new file mode 100644
index 0000000..1c9f2dd
--- /dev/null
+++ b/test/json/validation/n_number_.-1.json
@@ -0,0 +1 @@
+[.-1] \ No newline at end of file
diff --git a/test/json/validation/n_number_.2e-3.json b/test/json/validation/n_number_.2e-3.json
new file mode 100644
index 0000000..c6c976f
--- /dev/null
+++ b/test/json/validation/n_number_.2e-3.json
@@ -0,0 +1 @@
+[.2e-3] \ No newline at end of file
diff --git a/test/json/validation/n_number_0.1.2.json b/test/json/validation/n_number_0.1.2.json
new file mode 100644
index 0000000..c83a256
--- /dev/null
+++ b/test/json/validation/n_number_0.1.2.json
@@ -0,0 +1 @@
+[0.1.2] \ No newline at end of file
diff --git a/test/json/validation/n_number_0.3e+.json b/test/json/validation/n_number_0.3e+.json
new file mode 100644
index 0000000..a55a1bf
--- /dev/null
+++ b/test/json/validation/n_number_0.3e+.json
@@ -0,0 +1 @@
+[0.3e+] \ No newline at end of file
diff --git a/test/json/validation/n_number_0.3e.json b/test/json/validation/n_number_0.3e.json
new file mode 100644
index 0000000..3dd5df4
--- /dev/null
+++ b/test/json/validation/n_number_0.3e.json
@@ -0,0 +1 @@
+[0.3e] \ No newline at end of file
diff --git a/test/json/validation/n_number_0.e1.json b/test/json/validation/n_number_0.e1.json
new file mode 100644
index 0000000..c92c71c
--- /dev/null
+++ b/test/json/validation/n_number_0.e1.json
@@ -0,0 +1 @@
+[0.e1] \ No newline at end of file
diff --git a/test/json/validation/n_number_0_capital_E+.json b/test/json/validation/n_number_0_capital_E+.json
new file mode 100644
index 0000000..3ba2c7d
--- /dev/null
+++ b/test/json/validation/n_number_0_capital_E+.json
@@ -0,0 +1 @@
+[0E+] \ No newline at end of file
diff --git a/test/json/validation/n_number_0_capital_E.json b/test/json/validation/n_number_0_capital_E.json
new file mode 100644
index 0000000..5301840
--- /dev/null
+++ b/test/json/validation/n_number_0_capital_E.json
@@ -0,0 +1 @@
+[0E] \ No newline at end of file
diff --git a/test/json/validation/n_number_0e+.json b/test/json/validation/n_number_0e+.json
new file mode 100644
index 0000000..8ab0bc4
--- /dev/null
+++ b/test/json/validation/n_number_0e+.json
@@ -0,0 +1 @@
+[0e+] \ No newline at end of file
diff --git a/test/json/validation/n_number_0e.json b/test/json/validation/n_number_0e.json
new file mode 100644
index 0000000..47ec421
--- /dev/null
+++ b/test/json/validation/n_number_0e.json
@@ -0,0 +1 @@
+[0e] \ No newline at end of file
diff --git a/test/json/validation/n_number_1.0e+.json b/test/json/validation/n_number_1.0e+.json
new file mode 100644
index 0000000..cd84b9f
--- /dev/null
+++ b/test/json/validation/n_number_1.0e+.json
@@ -0,0 +1 @@
+[1.0e+] \ No newline at end of file
diff --git a/test/json/validation/n_number_1.0e-.json b/test/json/validation/n_number_1.0e-.json
new file mode 100644
index 0000000..4eb7afa
--- /dev/null
+++ b/test/json/validation/n_number_1.0e-.json
@@ -0,0 +1 @@
+[1.0e-] \ No newline at end of file
diff --git a/test/json/validation/n_number_1.0e.json b/test/json/validation/n_number_1.0e.json
new file mode 100644
index 0000000..21753f4
--- /dev/null
+++ b/test/json/validation/n_number_1.0e.json
@@ -0,0 +1 @@
+[1.0e] \ No newline at end of file
diff --git a/test/json/validation/n_number_1_000.json b/test/json/validation/n_number_1_000.json
new file mode 100644
index 0000000..7b18b66
--- /dev/null
+++ b/test/json/validation/n_number_1_000.json
@@ -0,0 +1 @@
+[1 000.0] \ No newline at end of file
diff --git a/test/json/validation/n_number_1eE2.json b/test/json/validation/n_number_1eE2.json
new file mode 100644
index 0000000..4318a34
--- /dev/null
+++ b/test/json/validation/n_number_1eE2.json
@@ -0,0 +1 @@
+[1eE2] \ No newline at end of file
diff --git a/test/json/validation/n_number_2.e+3.json b/test/json/validation/n_number_2.e+3.json
new file mode 100644
index 0000000..4442f39
--- /dev/null
+++ b/test/json/validation/n_number_2.e+3.json
@@ -0,0 +1 @@
+[2.e+3] \ No newline at end of file
diff --git a/test/json/validation/n_number_2.e-3.json b/test/json/validation/n_number_2.e-3.json
new file mode 100644
index 0000000..a65060e
--- /dev/null
+++ b/test/json/validation/n_number_2.e-3.json
@@ -0,0 +1 @@
+[2.e-3] \ No newline at end of file
diff --git a/test/json/validation/n_number_2.e3.json b/test/json/validation/n_number_2.e3.json
new file mode 100644
index 0000000..66f7cf7
--- /dev/null
+++ b/test/json/validation/n_number_2.e3.json
@@ -0,0 +1 @@
+[2.e3] \ No newline at end of file
diff --git a/test/json/validation/n_number_9.e+.json b/test/json/validation/n_number_9.e+.json
new file mode 100644
index 0000000..732a7b1
--- /dev/null
+++ b/test/json/validation/n_number_9.e+.json
@@ -0,0 +1 @@
+[9.e+] \ No newline at end of file
diff --git a/test/json/validation/n_number_Inf.json b/test/json/validation/n_number_Inf.json
new file mode 100644
index 0000000..c40c734
--- /dev/null
+++ b/test/json/validation/n_number_Inf.json
@@ -0,0 +1 @@
+[Inf] \ No newline at end of file
diff --git a/test/json/validation/n_number_NaN.json b/test/json/validation/n_number_NaN.json
new file mode 100644
index 0000000..4992317
--- /dev/null
+++ b/test/json/validation/n_number_NaN.json
@@ -0,0 +1 @@
+[NaN] \ No newline at end of file
diff --git a/test/json/validation/n_number_U+FF11_fullwidth_digit_one.json b/test/json/validation/n_number_U+FF11_fullwidth_digit_one.json
new file mode 100644
index 0000000..b14587e
--- /dev/null
+++ b/test/json/validation/n_number_U+FF11_fullwidth_digit_one.json
@@ -0,0 +1 @@
+[1] \ No newline at end of file
diff --git a/test/json/validation/n_number_expression.json b/test/json/validation/n_number_expression.json
new file mode 100644
index 0000000..76fdbc8
--- /dev/null
+++ b/test/json/validation/n_number_expression.json
@@ -0,0 +1 @@
+[1+2] \ No newline at end of file
diff --git a/test/json/validation/n_number_hex_1_digit.json b/test/json/validation/n_number_hex_1_digit.json
new file mode 100644
index 0000000..3b21488
--- /dev/null
+++ b/test/json/validation/n_number_hex_1_digit.json
@@ -0,0 +1 @@
+[0x1] \ No newline at end of file
diff --git a/test/json/validation/n_number_hex_2_digits.json b/test/json/validation/n_number_hex_2_digits.json
new file mode 100644
index 0000000..83e516a
--- /dev/null
+++ b/test/json/validation/n_number_hex_2_digits.json
@@ -0,0 +1 @@
+[0x42] \ No newline at end of file
diff --git a/test/json/validation/n_number_infinity.json b/test/json/validation/n_number_infinity.json
new file mode 100644
index 0000000..8c2baf7
--- /dev/null
+++ b/test/json/validation/n_number_infinity.json
@@ -0,0 +1 @@
+[Infinity] \ No newline at end of file
diff --git a/test/json/validation/n_number_invalid+-.json b/test/json/validation/n_number_invalid+-.json
new file mode 100644
index 0000000..1cce602
--- /dev/null
+++ b/test/json/validation/n_number_invalid+-.json
@@ -0,0 +1 @@
+[0e+-1] \ No newline at end of file
diff --git a/test/json/validation/n_number_invalid-negative-real.json b/test/json/validation/n_number_invalid-negative-real.json
new file mode 100644
index 0000000..5fc3c1e
--- /dev/null
+++ b/test/json/validation/n_number_invalid-negative-real.json
@@ -0,0 +1 @@
+[-123.123foo] \ No newline at end of file
diff --git a/test/json/validation/n_number_invalid-utf-8-in-bigger-int.json b/test/json/validation/n_number_invalid-utf-8-in-bigger-int.json
new file mode 100644
index 0000000..3b97e58
--- /dev/null
+++ b/test/json/validation/n_number_invalid-utf-8-in-bigger-int.json
@@ -0,0 +1 @@
+[123] \ No newline at end of file
diff --git a/test/json/validation/n_number_invalid-utf-8-in-exponent.json b/test/json/validation/n_number_invalid-utf-8-in-exponent.json
new file mode 100644
index 0000000..ea35d72
--- /dev/null
+++ b/test/json/validation/n_number_invalid-utf-8-in-exponent.json
@@ -0,0 +1 @@
+[1e1] \ No newline at end of file
diff --git a/test/json/validation/n_number_invalid-utf-8-in-int.json b/test/json/validation/n_number_invalid-utf-8-in-int.json
new file mode 100644
index 0000000..371226e
--- /dev/null
+++ b/test/json/validation/n_number_invalid-utf-8-in-int.json
@@ -0,0 +1 @@
+[0]
diff --git a/test/json/validation/n_number_minus_infinity.json b/test/json/validation/n_number_minus_infinity.json
new file mode 100644
index 0000000..cf4133d
--- /dev/null
+++ b/test/json/validation/n_number_minus_infinity.json
@@ -0,0 +1 @@
+[-Infinity] \ No newline at end of file
diff --git a/test/json/validation/n_number_minus_sign_with_trailing_garbage.json b/test/json/validation/n_number_minus_sign_with_trailing_garbage.json
new file mode 100644
index 0000000..a6d8e78
--- /dev/null
+++ b/test/json/validation/n_number_minus_sign_with_trailing_garbage.json
@@ -0,0 +1 @@
+[-foo] \ No newline at end of file
diff --git a/test/json/validation/n_number_minus_space_1.json b/test/json/validation/n_number_minus_space_1.json
new file mode 100644
index 0000000..9a5ebed
--- /dev/null
+++ b/test/json/validation/n_number_minus_space_1.json
@@ -0,0 +1 @@
+[- 1] \ No newline at end of file
diff --git a/test/json/validation/n_number_neg_int_starting_with_zero.json b/test/json/validation/n_number_neg_int_starting_with_zero.json
new file mode 100644
index 0000000..67af096
--- /dev/null
+++ b/test/json/validation/n_number_neg_int_starting_with_zero.json
@@ -0,0 +1 @@
+[-012] \ No newline at end of file
diff --git a/test/json/validation/n_number_neg_real_without_int_part.json b/test/json/validation/n_number_neg_real_without_int_part.json
new file mode 100644
index 0000000..1f2a434
--- /dev/null
+++ b/test/json/validation/n_number_neg_real_without_int_part.json
@@ -0,0 +1 @@
+[-.123] \ No newline at end of file
diff --git a/test/json/validation/n_number_neg_with_garbage_at_end.json b/test/json/validation/n_number_neg_with_garbage_at_end.json
new file mode 100644
index 0000000..2aa7311
--- /dev/null
+++ b/test/json/validation/n_number_neg_with_garbage_at_end.json
@@ -0,0 +1 @@
+[-1x] \ No newline at end of file
diff --git a/test/json/validation/n_number_real_garbage_after_e.json b/test/json/validation/n_number_real_garbage_after_e.json
new file mode 100644
index 0000000..9213dfc
--- /dev/null
+++ b/test/json/validation/n_number_real_garbage_after_e.json
@@ -0,0 +1 @@
+[1ea] \ No newline at end of file
diff --git a/test/json/validation/n_number_real_with_invalid_utf8_after_e.json b/test/json/validation/n_number_real_with_invalid_utf8_after_e.json
new file mode 100644
index 0000000..1e52ef9
--- /dev/null
+++ b/test/json/validation/n_number_real_with_invalid_utf8_after_e.json
@@ -0,0 +1 @@
+[1e] \ No newline at end of file
diff --git a/test/json/validation/n_number_real_without_fractional_part.json b/test/json/validation/n_number_real_without_fractional_part.json
new file mode 100644
index 0000000..1de287c
--- /dev/null
+++ b/test/json/validation/n_number_real_without_fractional_part.json
@@ -0,0 +1 @@
+[1.] \ No newline at end of file
diff --git a/test/json/validation/n_number_starting_with_dot.json b/test/json/validation/n_number_starting_with_dot.json
new file mode 100644
index 0000000..f682dbd
--- /dev/null
+++ b/test/json/validation/n_number_starting_with_dot.json
@@ -0,0 +1 @@
+[.123] \ No newline at end of file
diff --git a/test/json/validation/n_number_with_alpha.json b/test/json/validation/n_number_with_alpha.json
new file mode 100644
index 0000000..1e42d81
--- /dev/null
+++ b/test/json/validation/n_number_with_alpha.json
@@ -0,0 +1 @@
+[1.2a-3] \ No newline at end of file
diff --git a/test/json/validation/n_number_with_alpha_char.json b/test/json/validation/n_number_with_alpha_char.json
new file mode 100644
index 0000000..b79dacc
--- /dev/null
+++ b/test/json/validation/n_number_with_alpha_char.json
@@ -0,0 +1 @@
+[1.8011670033376514H-308] \ No newline at end of file
diff --git a/test/json/validation/n_number_with_leading_zero.json b/test/json/validation/n_number_with_leading_zero.json
new file mode 100644
index 0000000..7106da1
--- /dev/null
+++ b/test/json/validation/n_number_with_leading_zero.json
@@ -0,0 +1 @@
+[012] \ No newline at end of file
diff --git a/test/json/validation/n_object_bad_value.json b/test/json/validation/n_object_bad_value.json
new file mode 100644
index 0000000..a03a8c0
--- /dev/null
+++ b/test/json/validation/n_object_bad_value.json
@@ -0,0 +1 @@
+["x", truth] \ No newline at end of file
diff --git a/test/json/validation/n_object_bracket_key.json b/test/json/validation/n_object_bracket_key.json
new file mode 100644
index 0000000..cc443b4
--- /dev/null
+++ b/test/json/validation/n_object_bracket_key.json
@@ -0,0 +1 @@
+{[: "x"}
diff --git a/test/json/validation/n_object_comma_instead_of_colon.json b/test/json/validation/n_object_comma_instead_of_colon.json
new file mode 100644
index 0000000..8d56377
--- /dev/null
+++ b/test/json/validation/n_object_comma_instead_of_colon.json
@@ -0,0 +1 @@
+{"x", null} \ No newline at end of file
diff --git a/test/json/validation/n_object_double_colon.json b/test/json/validation/n_object_double_colon.json
new file mode 100644
index 0000000..80e8c7b
--- /dev/null
+++ b/test/json/validation/n_object_double_colon.json
@@ -0,0 +1 @@
+{"x"::"b"} \ No newline at end of file
diff --git a/test/json/validation/n_object_emoji.json b/test/json/validation/n_object_emoji.json
new file mode 100644
index 0000000..cb4078e
--- /dev/null
+++ b/test/json/validation/n_object_emoji.json
@@ -0,0 +1 @@
+{🇨🇭} \ No newline at end of file
diff --git a/test/json/validation/n_object_garbage_at_end.json b/test/json/validation/n_object_garbage_at_end.json
new file mode 100644
index 0000000..80c42cb
--- /dev/null
+++ b/test/json/validation/n_object_garbage_at_end.json
@@ -0,0 +1 @@
+{"a":"a" 123} \ No newline at end of file
diff --git a/test/json/validation/n_object_key_with_single_quotes.json b/test/json/validation/n_object_key_with_single_quotes.json
new file mode 100644
index 0000000..77c3275
--- /dev/null
+++ b/test/json/validation/n_object_key_with_single_quotes.json
@@ -0,0 +1 @@
+{key: 'value'} \ No newline at end of file
diff --git a/test/json/validation/n_object_lone_continuation_byte_in_key_and_trailing_comma.json b/test/json/validation/n_object_lone_continuation_byte_in_key_and_trailing_comma.json
new file mode 100644
index 0000000..aa2cb63
--- /dev/null
+++ b/test/json/validation/n_object_lone_continuation_byte_in_key_and_trailing_comma.json
@@ -0,0 +1 @@
+{"":"0",} \ No newline at end of file
diff --git a/test/json/validation/n_object_missing_colon.json b/test/json/validation/n_object_missing_colon.json
new file mode 100644
index 0000000..b98eff6
--- /dev/null
+++ b/test/json/validation/n_object_missing_colon.json
@@ -0,0 +1 @@
+{"a" b} \ No newline at end of file
diff --git a/test/json/validation/n_object_missing_key.json b/test/json/validation/n_object_missing_key.json
new file mode 100644
index 0000000..b4fb0f5
--- /dev/null
+++ b/test/json/validation/n_object_missing_key.json
@@ -0,0 +1 @@
+{:"b"} \ No newline at end of file
diff --git a/test/json/validation/n_object_missing_semicolon.json b/test/json/validation/n_object_missing_semicolon.json
new file mode 100644
index 0000000..e345138
--- /dev/null
+++ b/test/json/validation/n_object_missing_semicolon.json
@@ -0,0 +1 @@
+{"a" "b"} \ No newline at end of file
diff --git a/test/json/validation/n_object_missing_value.json b/test/json/validation/n_object_missing_value.json
new file mode 100644
index 0000000..3ef538a
--- /dev/null
+++ b/test/json/validation/n_object_missing_value.json
@@ -0,0 +1 @@
+{"a": \ No newline at end of file
diff --git a/test/json/validation/n_object_no-colon.json b/test/json/validation/n_object_no-colon.json
new file mode 100644
index 0000000..f3797b3
--- /dev/null
+++ b/test/json/validation/n_object_no-colon.json
@@ -0,0 +1 @@
+{"a" \ No newline at end of file
diff --git a/test/json/validation/n_object_non_string_key.json b/test/json/validation/n_object_non_string_key.json
new file mode 100644
index 0000000..b9945b3
--- /dev/null
+++ b/test/json/validation/n_object_non_string_key.json
@@ -0,0 +1 @@
+{1:1} \ No newline at end of file
diff --git a/test/json/validation/n_object_non_string_key_but_huge_number_instead.json b/test/json/validation/n_object_non_string_key_but_huge_number_instead.json
new file mode 100644
index 0000000..b37fa86
--- /dev/null
+++ b/test/json/validation/n_object_non_string_key_but_huge_number_instead.json
@@ -0,0 +1 @@
+{9999E9999:1} \ No newline at end of file
diff --git a/test/json/validation/n_object_repeated_null_null.json b/test/json/validation/n_object_repeated_null_null.json
new file mode 100644
index 0000000..f7d2959
--- /dev/null
+++ b/test/json/validation/n_object_repeated_null_null.json
@@ -0,0 +1 @@
+{null:null,null:null} \ No newline at end of file
diff --git a/test/json/validation/n_object_several_trailing_commas.json b/test/json/validation/n_object_several_trailing_commas.json
new file mode 100644
index 0000000..3c9afe8
--- /dev/null
+++ b/test/json/validation/n_object_several_trailing_commas.json
@@ -0,0 +1 @@
+{"id":0,,,,,} \ No newline at end of file
diff --git a/test/json/validation/n_object_single_quote.json b/test/json/validation/n_object_single_quote.json
new file mode 100644
index 0000000..e5cdf97
--- /dev/null
+++ b/test/json/validation/n_object_single_quote.json
@@ -0,0 +1 @@
+{'a':0} \ No newline at end of file
diff --git a/test/json/validation/n_object_trailing_comma.json b/test/json/validation/n_object_trailing_comma.json
new file mode 100644
index 0000000..a4b0250
--- /dev/null
+++ b/test/json/validation/n_object_trailing_comma.json
@@ -0,0 +1 @@
+{"id":0,} \ No newline at end of file
diff --git a/test/json/validation/n_object_trailing_comment.json b/test/json/validation/n_object_trailing_comment.json
new file mode 100644
index 0000000..a372c65
--- /dev/null
+++ b/test/json/validation/n_object_trailing_comment.json
@@ -0,0 +1 @@
+{"a":"b"}/**/ \ No newline at end of file
diff --git a/test/json/validation/n_object_trailing_comment_open.json b/test/json/validation/n_object_trailing_comment_open.json
new file mode 100644
index 0000000..d557f41
--- /dev/null
+++ b/test/json/validation/n_object_trailing_comment_open.json
@@ -0,0 +1 @@
+{"a":"b"}/**// \ No newline at end of file
diff --git a/test/json/validation/n_object_trailing_comment_slash_open.json b/test/json/validation/n_object_trailing_comment_slash_open.json
new file mode 100644
index 0000000..e335136
--- /dev/null
+++ b/test/json/validation/n_object_trailing_comment_slash_open.json
@@ -0,0 +1 @@
+{"a":"b"}// \ No newline at end of file
diff --git a/test/json/validation/n_object_trailing_comment_slash_open_incomplete.json b/test/json/validation/n_object_trailing_comment_slash_open_incomplete.json
new file mode 100644
index 0000000..d892e49
--- /dev/null
+++ b/test/json/validation/n_object_trailing_comment_slash_open_incomplete.json
@@ -0,0 +1 @@
+{"a":"b"}/ \ No newline at end of file
diff --git a/test/json/validation/n_object_two_commas_in_a_row.json b/test/json/validation/n_object_two_commas_in_a_row.json
new file mode 100644
index 0000000..7c639ae
--- /dev/null
+++ b/test/json/validation/n_object_two_commas_in_a_row.json
@@ -0,0 +1 @@
+{"a":"b",,"c":"d"} \ No newline at end of file
diff --git a/test/json/validation/n_object_unquoted_key.json b/test/json/validation/n_object_unquoted_key.json
new file mode 100644
index 0000000..8ba1372
--- /dev/null
+++ b/test/json/validation/n_object_unquoted_key.json
@@ -0,0 +1 @@
+{a: "b"} \ No newline at end of file
diff --git a/test/json/validation/n_object_unterminated-value.json b/test/json/validation/n_object_unterminated-value.json
new file mode 100644
index 0000000..7fe699a
--- /dev/null
+++ b/test/json/validation/n_object_unterminated-value.json
@@ -0,0 +1 @@
+{"a":"a \ No newline at end of file
diff --git a/test/json/validation/n_object_with_single_string.json b/test/json/validation/n_object_with_single_string.json
new file mode 100644
index 0000000..d63f7fb
--- /dev/null
+++ b/test/json/validation/n_object_with_single_string.json
@@ -0,0 +1 @@
+{ "foo" : "bar", "a" } \ No newline at end of file
diff --git a/test/json/validation/n_object_with_trailing_garbage.json b/test/json/validation/n_object_with_trailing_garbage.json
new file mode 100644
index 0000000..787c8f0
--- /dev/null
+++ b/test/json/validation/n_object_with_trailing_garbage.json
@@ -0,0 +1 @@
+{"a":"b"}# \ No newline at end of file
diff --git a/test/json/validation/n_single_space.json b/test/json/validation/n_single_space.json
new file mode 100644
index 0000000..0519ecb
--- /dev/null
+++ b/test/json/validation/n_single_space.json
@@ -0,0 +1 @@
+ \ No newline at end of file
diff --git a/test/json/validation/n_string_1_surrogate_then_escape.json b/test/json/validation/n_string_1_surrogate_then_escape.json
new file mode 100644
index 0000000..acec66d
--- /dev/null
+++ b/test/json/validation/n_string_1_surrogate_then_escape.json
@@ -0,0 +1 @@
+["\uD800\"] \ No newline at end of file
diff --git a/test/json/validation/n_string_1_surrogate_then_escape_u.json b/test/json/validation/n_string_1_surrogate_then_escape_u.json
new file mode 100644
index 0000000..e834b05
--- /dev/null
+++ b/test/json/validation/n_string_1_surrogate_then_escape_u.json
@@ -0,0 +1 @@
+["\uD800\u"] \ No newline at end of file
diff --git a/test/json/validation/n_string_1_surrogate_then_escape_u1.json b/test/json/validation/n_string_1_surrogate_then_escape_u1.json
new file mode 100644
index 0000000..a04cd34
--- /dev/null
+++ b/test/json/validation/n_string_1_surrogate_then_escape_u1.json
@@ -0,0 +1 @@
+["\uD800\u1"] \ No newline at end of file
diff --git a/test/json/validation/n_string_1_surrogate_then_escape_u1x.json b/test/json/validation/n_string_1_surrogate_then_escape_u1x.json
new file mode 100644
index 0000000..bfbd234
--- /dev/null
+++ b/test/json/validation/n_string_1_surrogate_then_escape_u1x.json
@@ -0,0 +1 @@
+["\uD800\u1x"] \ No newline at end of file
diff --git a/test/json/validation/n_string_accentuated_char_no_quotes.json b/test/json/validation/n_string_accentuated_char_no_quotes.json
new file mode 100644
index 0000000..fd68956
--- /dev/null
+++ b/test/json/validation/n_string_accentuated_char_no_quotes.json
@@ -0,0 +1 @@
+[é] \ No newline at end of file
diff --git a/test/json/validation/n_string_backslash_00.json b/test/json/validation/n_string_backslash_00.json
new file mode 100644
index 0000000..b5bf267
--- /dev/null
+++ b/test/json/validation/n_string_backslash_00.json
Binary files differ
diff --git a/test/json/validation/n_string_escape_x.json b/test/json/validation/n_string_escape_x.json
new file mode 100644
index 0000000..fae2919
--- /dev/null
+++ b/test/json/validation/n_string_escape_x.json
@@ -0,0 +1 @@
+["\x00"] \ No newline at end of file
diff --git a/test/json/validation/n_string_escaped_backslash_bad.json b/test/json/validation/n_string_escaped_backslash_bad.json
new file mode 100644
index 0000000..016fcb4
--- /dev/null
+++ b/test/json/validation/n_string_escaped_backslash_bad.json
@@ -0,0 +1 @@
+["\\\"] \ No newline at end of file
diff --git a/test/json/validation/n_string_escaped_ctrl_char_tab.json b/test/json/validation/n_string_escaped_ctrl_char_tab.json
new file mode 100644
index 0000000..f35ea38
--- /dev/null
+++ b/test/json/validation/n_string_escaped_ctrl_char_tab.json
@@ -0,0 +1 @@
+["\ "] \ No newline at end of file
diff --git a/test/json/validation/n_string_escaped_emoji.json b/test/json/validation/n_string_escaped_emoji.json
new file mode 100644
index 0000000..a277754
--- /dev/null
+++ b/test/json/validation/n_string_escaped_emoji.json
@@ -0,0 +1 @@
+["\🌀"] \ No newline at end of file
diff --git a/test/json/validation/n_string_incomplete_escape.json b/test/json/validation/n_string_incomplete_escape.json
new file mode 100644
index 0000000..3415c33
--- /dev/null
+++ b/test/json/validation/n_string_incomplete_escape.json
@@ -0,0 +1 @@
+["\"] \ No newline at end of file
diff --git a/test/json/validation/n_string_incomplete_escaped_character.json b/test/json/validation/n_string_incomplete_escaped_character.json
new file mode 100644
index 0000000..0f2197e
--- /dev/null
+++ b/test/json/validation/n_string_incomplete_escaped_character.json
@@ -0,0 +1 @@
+["\u00A"] \ No newline at end of file
diff --git a/test/json/validation/n_string_incomplete_surrogate.json b/test/json/validation/n_string_incomplete_surrogate.json
new file mode 100644
index 0000000..75504a6
--- /dev/null
+++ b/test/json/validation/n_string_incomplete_surrogate.json
@@ -0,0 +1 @@
+["\uD834\uDd"] \ No newline at end of file
diff --git a/test/json/validation/n_string_incomplete_surrogate_escape_invalid.json b/test/json/validation/n_string_incomplete_surrogate_escape_invalid.json
new file mode 100644
index 0000000..bd96560
--- /dev/null
+++ b/test/json/validation/n_string_incomplete_surrogate_escape_invalid.json
@@ -0,0 +1 @@
+["\uD800\uD800\x"] \ No newline at end of file
diff --git a/test/json/validation/n_string_invalid-utf-8-in-escape.json b/test/json/validation/n_string_invalid-utf-8-in-escape.json
new file mode 100644
index 0000000..0c43006
--- /dev/null
+++ b/test/json/validation/n_string_invalid-utf-8-in-escape.json
@@ -0,0 +1 @@
+["\u"] \ No newline at end of file
diff --git a/test/json/validation/n_string_invalid_backslash_esc.json b/test/json/validation/n_string_invalid_backslash_esc.json
new file mode 100644
index 0000000..d1eb609
--- /dev/null
+++ b/test/json/validation/n_string_invalid_backslash_esc.json
@@ -0,0 +1 @@
+["\a"] \ No newline at end of file
diff --git a/test/json/validation/n_string_invalid_unicode_escape.json b/test/json/validation/n_string_invalid_unicode_escape.json
new file mode 100644
index 0000000..7608cb6
--- /dev/null
+++ b/test/json/validation/n_string_invalid_unicode_escape.json
@@ -0,0 +1 @@
+["\uqqqq"] \ No newline at end of file
diff --git a/test/json/validation/n_string_invalid_utf8_after_escape.json b/test/json/validation/n_string_invalid_utf8_after_escape.json
new file mode 100644
index 0000000..2f757a2
--- /dev/null
+++ b/test/json/validation/n_string_invalid_utf8_after_escape.json
@@ -0,0 +1 @@
+["\"] \ No newline at end of file
diff --git a/test/json/validation/n_string_leading_uescaped_thinspace.json b/test/json/validation/n_string_leading_uescaped_thinspace.json
new file mode 100644
index 0000000..7b297c6
--- /dev/null
+++ b/test/json/validation/n_string_leading_uescaped_thinspace.json
@@ -0,0 +1 @@
+[\u0020"asd"] \ No newline at end of file
diff --git a/test/json/validation/n_string_no_quotes_with_bad_escape.json b/test/json/validation/n_string_no_quotes_with_bad_escape.json
new file mode 100644
index 0000000..01bc70a
--- /dev/null
+++ b/test/json/validation/n_string_no_quotes_with_bad_escape.json
@@ -0,0 +1 @@
+[\n] \ No newline at end of file
diff --git a/test/json/validation/n_string_single_doublequote.json b/test/json/validation/n_string_single_doublequote.json
new file mode 100644
index 0000000..9d68933
--- /dev/null
+++ b/test/json/validation/n_string_single_doublequote.json
@@ -0,0 +1 @@
+" \ No newline at end of file
diff --git a/test/json/validation/n_string_single_quote.json b/test/json/validation/n_string_single_quote.json
new file mode 100644
index 0000000..caff239
--- /dev/null
+++ b/test/json/validation/n_string_single_quote.json
@@ -0,0 +1 @@
+['single quote'] \ No newline at end of file
diff --git a/test/json/validation/n_string_single_string_no_double_quotes.json b/test/json/validation/n_string_single_string_no_double_quotes.json
new file mode 100644
index 0000000..f2ba8f8
--- /dev/null
+++ b/test/json/validation/n_string_single_string_no_double_quotes.json
@@ -0,0 +1 @@
+abc \ No newline at end of file
diff --git a/test/json/validation/n_string_start_escape_unclosed.json b/test/json/validation/n_string_start_escape_unclosed.json
new file mode 100644
index 0000000..db62a46
--- /dev/null
+++ b/test/json/validation/n_string_start_escape_unclosed.json
@@ -0,0 +1 @@
+["\ \ No newline at end of file
diff --git a/test/json/validation/n_string_unescaped_crtl_char.json b/test/json/validation/n_string_unescaped_crtl_char.json
new file mode 100644
index 0000000..9f21348
--- /dev/null
+++ b/test/json/validation/n_string_unescaped_crtl_char.json
Binary files differ
diff --git a/test/json/validation/n_string_unescaped_newline.json b/test/json/validation/n_string_unescaped_newline.json
new file mode 100644
index 0000000..700d360
--- /dev/null
+++ b/test/json/validation/n_string_unescaped_newline.json
@@ -0,0 +1,2 @@
+["new
+line"] \ No newline at end of file
diff --git a/test/json/validation/n_string_unescaped_tab.json b/test/json/validation/n_string_unescaped_tab.json
new file mode 100644
index 0000000..160264a
--- /dev/null
+++ b/test/json/validation/n_string_unescaped_tab.json
@@ -0,0 +1 @@
+[" "] \ No newline at end of file
diff --git a/test/json/validation/n_string_unicode_CapitalU.json b/test/json/validation/n_string_unicode_CapitalU.json
new file mode 100644
index 0000000..17332bb
--- /dev/null
+++ b/test/json/validation/n_string_unicode_CapitalU.json
@@ -0,0 +1 @@
+"\UA66D" \ No newline at end of file
diff --git a/test/json/validation/n_string_with_trailing_garbage.json b/test/json/validation/n_string_with_trailing_garbage.json
new file mode 100644
index 0000000..efe3bd2
--- /dev/null
+++ b/test/json/validation/n_string_with_trailing_garbage.json
@@ -0,0 +1 @@
+""x \ No newline at end of file
diff --git a/test/json/validation/n_structure_100000_opening_arrays.json b/test/json/validation/n_structure_100000_opening_arrays.json
new file mode 100644
index 0000000..a4823ee
--- /dev/null
+++ b/test/json/validation/n_structure_100000_opening_arrays.json
@@ -0,0 +1 @@
+[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ \ No newline at end of file
diff --git a/test/json/validation/n_structure_U+2060_word_joined.json b/test/json/validation/n_structure_U+2060_word_joined.json
new file mode 100644
index 0000000..81156a6
--- /dev/null
+++ b/test/json/validation/n_structure_U+2060_word_joined.json
@@ -0,0 +1 @@
+[⁠] \ No newline at end of file
diff --git a/test/json/validation/n_structure_UTF8_BOM_no_data.json b/test/json/validation/n_structure_UTF8_BOM_no_data.json
new file mode 100644
index 0000000..5f28270
--- /dev/null
+++ b/test/json/validation/n_structure_UTF8_BOM_no_data.json
@@ -0,0 +1 @@
+ \ No newline at end of file
diff --git a/test/json/validation/n_structure_angle_bracket_..json b/test/json/validation/n_structure_angle_bracket_..json
new file mode 100644
index 0000000..a56fef0
--- /dev/null
+++ b/test/json/validation/n_structure_angle_bracket_..json
@@ -0,0 +1 @@
+<.> \ No newline at end of file
diff --git a/test/json/validation/n_structure_angle_bracket_null.json b/test/json/validation/n_structure_angle_bracket_null.json
new file mode 100644
index 0000000..617f262
--- /dev/null
+++ b/test/json/validation/n_structure_angle_bracket_null.json
@@ -0,0 +1 @@
+[<null>] \ No newline at end of file
diff --git a/test/json/validation/n_structure_array_trailing_garbage.json b/test/json/validation/n_structure_array_trailing_garbage.json
new file mode 100644
index 0000000..5a745e6
--- /dev/null
+++ b/test/json/validation/n_structure_array_trailing_garbage.json
@@ -0,0 +1 @@
+[1]x \ No newline at end of file
diff --git a/test/json/validation/n_structure_array_with_extra_array_close.json b/test/json/validation/n_structure_array_with_extra_array_close.json
new file mode 100644
index 0000000..6cfb139
--- /dev/null
+++ b/test/json/validation/n_structure_array_with_extra_array_close.json
@@ -0,0 +1 @@
+[1]] \ No newline at end of file
diff --git a/test/json/validation/n_structure_array_with_unclosed_string.json b/test/json/validation/n_structure_array_with_unclosed_string.json
new file mode 100644
index 0000000..ba6b178
--- /dev/null
+++ b/test/json/validation/n_structure_array_with_unclosed_string.json
@@ -0,0 +1 @@
+["asd] \ No newline at end of file
diff --git a/test/json/validation/n_structure_ascii-unicode-identifier.json b/test/json/validation/n_structure_ascii-unicode-identifier.json
new file mode 100644
index 0000000..ef2ab62
--- /dev/null
+++ b/test/json/validation/n_structure_ascii-unicode-identifier.json
@@ -0,0 +1 @@
+aå \ No newline at end of file
diff --git a/test/json/validation/n_structure_capitalized_True.json b/test/json/validation/n_structure_capitalized_True.json
new file mode 100644
index 0000000..7cd8846
--- /dev/null
+++ b/test/json/validation/n_structure_capitalized_True.json
@@ -0,0 +1 @@
+[True] \ No newline at end of file
diff --git a/test/json/validation/n_structure_close_unopened_array.json b/test/json/validation/n_structure_close_unopened_array.json
new file mode 100644
index 0000000..d2af0c6
--- /dev/null
+++ b/test/json/validation/n_structure_close_unopened_array.json
@@ -0,0 +1 @@
+1] \ No newline at end of file
diff --git a/test/json/validation/n_structure_comma_instead_of_closing_brace.json b/test/json/validation/n_structure_comma_instead_of_closing_brace.json
new file mode 100644
index 0000000..ac61b82
--- /dev/null
+++ b/test/json/validation/n_structure_comma_instead_of_closing_brace.json
@@ -0,0 +1 @@
+{"x": true, \ No newline at end of file
diff --git a/test/json/validation/n_structure_double_array.json b/test/json/validation/n_structure_double_array.json
new file mode 100644
index 0000000..058d162
--- /dev/null
+++ b/test/json/validation/n_structure_double_array.json
@@ -0,0 +1 @@
+[][] \ No newline at end of file
diff --git a/test/json/validation/n_structure_end_array.json b/test/json/validation/n_structure_end_array.json
new file mode 100644
index 0000000..54caf60
--- /dev/null
+++ b/test/json/validation/n_structure_end_array.json
@@ -0,0 +1 @@
+] \ No newline at end of file
diff --git a/test/json/validation/n_structure_incomplete_UTF8_BOM.json b/test/json/validation/n_structure_incomplete_UTF8_BOM.json
new file mode 100644
index 0000000..bfcdd51
--- /dev/null
+++ b/test/json/validation/n_structure_incomplete_UTF8_BOM.json
@@ -0,0 +1 @@
+{} \ No newline at end of file
diff --git a/test/json/validation/n_structure_lone-invalid-utf-8.json b/test/json/validation/n_structure_lone-invalid-utf-8.json
new file mode 100644
index 0000000..8b1296c
--- /dev/null
+++ b/test/json/validation/n_structure_lone-invalid-utf-8.json
@@ -0,0 +1 @@
+ \ No newline at end of file
diff --git a/test/json/validation/n_structure_lone-open-bracket.json b/test/json/validation/n_structure_lone-open-bracket.json
new file mode 100644
index 0000000..8e2f0be
--- /dev/null
+++ b/test/json/validation/n_structure_lone-open-bracket.json
@@ -0,0 +1 @@
+[ \ No newline at end of file
diff --git a/test/json/validation/n_structure_no_data.json b/test/json/validation/n_structure_no_data.json
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/test/json/validation/n_structure_no_data.json
diff --git a/test/json/validation/n_structure_null-byte-outside-string.json b/test/json/validation/n_structure_null-byte-outside-string.json
new file mode 100644
index 0000000..326db14
--- /dev/null
+++ b/test/json/validation/n_structure_null-byte-outside-string.json
Binary files differ
diff --git a/test/json/validation/n_structure_number_with_trailing_garbage.json b/test/json/validation/n_structure_number_with_trailing_garbage.json
new file mode 100644
index 0000000..0746539
--- /dev/null
+++ b/test/json/validation/n_structure_number_with_trailing_garbage.json
@@ -0,0 +1 @@
+2@ \ No newline at end of file
diff --git a/test/json/validation/n_structure_object_followed_by_closing_object.json b/test/json/validation/n_structure_object_followed_by_closing_object.json
new file mode 100644
index 0000000..aa9ebae
--- /dev/null
+++ b/test/json/validation/n_structure_object_followed_by_closing_object.json
@@ -0,0 +1 @@
+{}} \ No newline at end of file
diff --git a/test/json/validation/n_structure_object_unclosed_no_value.json b/test/json/validation/n_structure_object_unclosed_no_value.json
new file mode 100644
index 0000000..17d0451
--- /dev/null
+++ b/test/json/validation/n_structure_object_unclosed_no_value.json
@@ -0,0 +1 @@
+{"": \ No newline at end of file
diff --git a/test/json/validation/n_structure_object_with_comment.json b/test/json/validation/n_structure_object_with_comment.json
new file mode 100644
index 0000000..ed1b569
--- /dev/null
+++ b/test/json/validation/n_structure_object_with_comment.json
@@ -0,0 +1 @@
+{"a":/*comment*/"b"} \ No newline at end of file
diff --git a/test/json/validation/n_structure_object_with_trailing_garbage.json b/test/json/validation/n_structure_object_with_trailing_garbage.json
new file mode 100644
index 0000000..9ca2336
--- /dev/null
+++ b/test/json/validation/n_structure_object_with_trailing_garbage.json
@@ -0,0 +1 @@
+{"a": true} "x" \ No newline at end of file
diff --git a/test/json/validation/n_structure_open_array_apostrophe.json b/test/json/validation/n_structure_open_array_apostrophe.json
new file mode 100644
index 0000000..8bebe3a
--- /dev/null
+++ b/test/json/validation/n_structure_open_array_apostrophe.json
@@ -0,0 +1 @@
+[' \ No newline at end of file
diff --git a/test/json/validation/n_structure_open_array_comma.json b/test/json/validation/n_structure_open_array_comma.json
new file mode 100644
index 0000000..6295fdc
--- /dev/null
+++ b/test/json/validation/n_structure_open_array_comma.json
@@ -0,0 +1 @@
+[, \ No newline at end of file
diff --git a/test/json/validation/n_structure_open_array_object.json b/test/json/validation/n_structure_open_array_object.json
new file mode 100644
index 0000000..e870445
--- /dev/null
+++ b/test/json/validation/n_structure_open_array_object.json
@@ -0,0 +1 @@
+[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":
diff --git a/test/json/validation/n_structure_open_array_open_object.json b/test/json/validation/n_structure_open_array_open_object.json
new file mode 100644
index 0000000..7a63c8c
--- /dev/null
+++ b/test/json/validation/n_structure_open_array_open_object.json
@@ -0,0 +1 @@
+[{ \ No newline at end of file
diff --git a/test/json/validation/n_structure_open_array_open_string.json b/test/json/validation/n_structure_open_array_open_string.json
new file mode 100644
index 0000000..9822a6b
--- /dev/null
+++ b/test/json/validation/n_structure_open_array_open_string.json
@@ -0,0 +1 @@
+["a \ No newline at end of file
diff --git a/test/json/validation/n_structure_open_array_string.json b/test/json/validation/n_structure_open_array_string.json
new file mode 100644
index 0000000..42a6193
--- /dev/null
+++ b/test/json/validation/n_structure_open_array_string.json
@@ -0,0 +1 @@
+["a" \ No newline at end of file
diff --git a/test/json/validation/n_structure_open_object.json b/test/json/validation/n_structure_open_object.json
new file mode 100644
index 0000000..81750b9
--- /dev/null
+++ b/test/json/validation/n_structure_open_object.json
@@ -0,0 +1 @@
+{ \ No newline at end of file
diff --git a/test/json/validation/n_structure_open_object_close_array.json b/test/json/validation/n_structure_open_object_close_array.json
new file mode 100644
index 0000000..eebc700
--- /dev/null
+++ b/test/json/validation/n_structure_open_object_close_array.json
@@ -0,0 +1 @@
+{] \ No newline at end of file
diff --git a/test/json/validation/n_structure_open_object_comma.json b/test/json/validation/n_structure_open_object_comma.json
new file mode 100644
index 0000000..47bc910
--- /dev/null
+++ b/test/json/validation/n_structure_open_object_comma.json
@@ -0,0 +1 @@
+{, \ No newline at end of file
diff --git a/test/json/validation/n_structure_open_object_open_array.json b/test/json/validation/n_structure_open_object_open_array.json
new file mode 100644
index 0000000..381ede5
--- /dev/null
+++ b/test/json/validation/n_structure_open_object_open_array.json
@@ -0,0 +1 @@
+{[ \ No newline at end of file
diff --git a/test/json/validation/n_structure_open_object_open_string.json b/test/json/validation/n_structure_open_object_open_string.json
new file mode 100644
index 0000000..328c30c
--- /dev/null
+++ b/test/json/validation/n_structure_open_object_open_string.json
@@ -0,0 +1 @@
+{"a \ No newline at end of file
diff --git a/test/json/validation/n_structure_open_object_string_with_apostrophes.json b/test/json/validation/n_structure_open_object_string_with_apostrophes.json
new file mode 100644
index 0000000..9dba170
--- /dev/null
+++ b/test/json/validation/n_structure_open_object_string_with_apostrophes.json
@@ -0,0 +1 @@
+{'a' \ No newline at end of file
diff --git a/test/json/validation/n_structure_open_open.json b/test/json/validation/n_structure_open_open.json
new file mode 100644
index 0000000..841fd5f
--- /dev/null
+++ b/test/json/validation/n_structure_open_open.json
@@ -0,0 +1 @@
+["\{["\{["\{["\{ \ No newline at end of file
diff --git a/test/json/validation/n_structure_single_eacute.json b/test/json/validation/n_structure_single_eacute.json
new file mode 100644
index 0000000..92a39f3
--- /dev/null
+++ b/test/json/validation/n_structure_single_eacute.json
@@ -0,0 +1 @@
+ \ No newline at end of file
diff --git a/test/json/validation/n_structure_single_star.json b/test/json/validation/n_structure_single_star.json
new file mode 100644
index 0000000..f59ec20
--- /dev/null
+++ b/test/json/validation/n_structure_single_star.json
@@ -0,0 +1 @@
+* \ No newline at end of file
diff --git a/test/json/validation/n_structure_trailing_#.json b/test/json/validation/n_structure_trailing_#.json
new file mode 100644
index 0000000..8986110
--- /dev/null
+++ b/test/json/validation/n_structure_trailing_#.json
@@ -0,0 +1 @@
+{"a":"b"}#{} \ No newline at end of file
diff --git a/test/json/validation/n_structure_uescaped_LF_before_string.json b/test/json/validation/n_structure_uescaped_LF_before_string.json
new file mode 100644
index 0000000..df2f0f2
--- /dev/null
+++ b/test/json/validation/n_structure_uescaped_LF_before_string.json
@@ -0,0 +1 @@
+[\u000A""] \ No newline at end of file
diff --git a/test/json/validation/n_structure_unclosed_array.json b/test/json/validation/n_structure_unclosed_array.json
new file mode 100644
index 0000000..1120951
--- /dev/null
+++ b/test/json/validation/n_structure_unclosed_array.json
@@ -0,0 +1 @@
+[1 \ No newline at end of file
diff --git a/test/json/validation/n_structure_unclosed_array_partial_null.json b/test/json/validation/n_structure_unclosed_array_partial_null.json
new file mode 100644
index 0000000..0d59176
--- /dev/null
+++ b/test/json/validation/n_structure_unclosed_array_partial_null.json
@@ -0,0 +1 @@
+[ false, nul \ No newline at end of file
diff --git a/test/json/validation/n_structure_unclosed_array_unfinished_false.json b/test/json/validation/n_structure_unclosed_array_unfinished_false.json
new file mode 100644
index 0000000..a2ff850
--- /dev/null
+++ b/test/json/validation/n_structure_unclosed_array_unfinished_false.json
@@ -0,0 +1 @@
+[ true, fals \ No newline at end of file
diff --git a/test/json/validation/n_structure_unclosed_array_unfinished_true.json b/test/json/validation/n_structure_unclosed_array_unfinished_true.json
new file mode 100644
index 0000000..3149e8f
--- /dev/null
+++ b/test/json/validation/n_structure_unclosed_array_unfinished_true.json
@@ -0,0 +1 @@
+[ false, tru \ No newline at end of file
diff --git a/test/json/validation/n_structure_unclosed_object.json b/test/json/validation/n_structure_unclosed_object.json
new file mode 100644
index 0000000..694d69d
--- /dev/null
+++ b/test/json/validation/n_structure_unclosed_object.json
@@ -0,0 +1 @@
+{"asd":"asd" \ No newline at end of file
diff --git a/test/json/validation/n_structure_unicode-identifier.json b/test/json/validation/n_structure_unicode-identifier.json
new file mode 100644
index 0000000..7284aea
--- /dev/null
+++ b/test/json/validation/n_structure_unicode-identifier.json
@@ -0,0 +1 @@
+å \ No newline at end of file
diff --git a/test/json/validation/n_structure_whitespace_U+2060_word_joiner.json b/test/json/validation/n_structure_whitespace_U+2060_word_joiner.json
new file mode 100644
index 0000000..81156a6
--- /dev/null
+++ b/test/json/validation/n_structure_whitespace_U+2060_word_joiner.json
@@ -0,0 +1 @@
+[⁠] \ No newline at end of file
diff --git a/test/json/validation/n_structure_whitespace_formfeed.json b/test/json/validation/n_structure_whitespace_formfeed.json
new file mode 100644
index 0000000..a9ea535
--- /dev/null
+++ b/test/json/validation/n_structure_whitespace_formfeed.json
@@ -0,0 +1 @@
+[ ] \ No newline at end of file
diff --git a/test/json/validation/y_array_arraysWithSpaces.json b/test/json/validation/y_array_arraysWithSpaces.json
new file mode 100644
index 0000000..5822907
--- /dev/null
+++ b/test/json/validation/y_array_arraysWithSpaces.json
@@ -0,0 +1 @@
+[[] ] \ No newline at end of file
diff --git a/test/json/validation/y_array_empty-string.json b/test/json/validation/y_array_empty-string.json
new file mode 100644
index 0000000..93b6be2
--- /dev/null
+++ b/test/json/validation/y_array_empty-string.json
@@ -0,0 +1 @@
+[""] \ No newline at end of file
diff --git a/test/json/validation/y_array_empty.json b/test/json/validation/y_array_empty.json
new file mode 100644
index 0000000..0637a08
--- /dev/null
+++ b/test/json/validation/y_array_empty.json
@@ -0,0 +1 @@
+[] \ No newline at end of file
diff --git a/test/json/validation/y_array_ending_with_newline.json b/test/json/validation/y_array_ending_with_newline.json
new file mode 100644
index 0000000..eac5f7b
--- /dev/null
+++ b/test/json/validation/y_array_ending_with_newline.json
@@ -0,0 +1 @@
+["a"] \ No newline at end of file
diff --git a/test/json/validation/y_array_false.json b/test/json/validation/y_array_false.json
new file mode 100644
index 0000000..67b2f07
--- /dev/null
+++ b/test/json/validation/y_array_false.json
@@ -0,0 +1 @@
+[false] \ No newline at end of file
diff --git a/test/json/validation/y_array_heterogeneous.json b/test/json/validation/y_array_heterogeneous.json
new file mode 100644
index 0000000..d3c1e26
--- /dev/null
+++ b/test/json/validation/y_array_heterogeneous.json
@@ -0,0 +1 @@
+[null, 1, "1", {}] \ No newline at end of file
diff --git a/test/json/validation/y_array_null.json b/test/json/validation/y_array_null.json
new file mode 100644
index 0000000..500db4a
--- /dev/null
+++ b/test/json/validation/y_array_null.json
@@ -0,0 +1 @@
+[null] \ No newline at end of file
diff --git a/test/json/validation/y_array_with_1_and_newline.json b/test/json/validation/y_array_with_1_and_newline.json
new file mode 100644
index 0000000..9948255
--- /dev/null
+++ b/test/json/validation/y_array_with_1_and_newline.json
@@ -0,0 +1,2 @@
+[1
+] \ No newline at end of file
diff --git a/test/json/validation/y_array_with_leading_space.json b/test/json/validation/y_array_with_leading_space.json
new file mode 100644
index 0000000..18bfe64
--- /dev/null
+++ b/test/json/validation/y_array_with_leading_space.json
@@ -0,0 +1 @@
+ [1] \ No newline at end of file
diff --git a/test/json/validation/y_array_with_several_null.json b/test/json/validation/y_array_with_several_null.json
new file mode 100644
index 0000000..99f6c5d
--- /dev/null
+++ b/test/json/validation/y_array_with_several_null.json
@@ -0,0 +1 @@
+[1,null,null,null,2] \ No newline at end of file
diff --git a/test/json/validation/y_array_with_trailing_space.json b/test/json/validation/y_array_with_trailing_space.json
new file mode 100644
index 0000000..de9e7a9
--- /dev/null
+++ b/test/json/validation/y_array_with_trailing_space.json
@@ -0,0 +1 @@
+[2] \ No newline at end of file
diff --git a/test/json/validation/y_number.json b/test/json/validation/y_number.json
new file mode 100644
index 0000000..e5f5cc3
--- /dev/null
+++ b/test/json/validation/y_number.json
@@ -0,0 +1 @@
+[123e65] \ No newline at end of file
diff --git a/test/json/validation/y_number_0e+1.json b/test/json/validation/y_number_0e+1.json
new file mode 100644
index 0000000..d1d3967
--- /dev/null
+++ b/test/json/validation/y_number_0e+1.json
@@ -0,0 +1 @@
+[0e+1] \ No newline at end of file
diff --git a/test/json/validation/y_number_0e1.json b/test/json/validation/y_number_0e1.json
new file mode 100644
index 0000000..3283a79
--- /dev/null
+++ b/test/json/validation/y_number_0e1.json
@@ -0,0 +1 @@
+[0e1] \ No newline at end of file
diff --git a/test/json/validation/y_number_after_space.json b/test/json/validation/y_number_after_space.json
new file mode 100644
index 0000000..623570d
--- /dev/null
+++ b/test/json/validation/y_number_after_space.json
@@ -0,0 +1 @@
+[ 4] \ No newline at end of file
diff --git a/test/json/validation/y_number_double_close_to_zero.json b/test/json/validation/y_number_double_close_to_zero.json
new file mode 100644
index 0000000..96555ff
--- /dev/null
+++ b/test/json/validation/y_number_double_close_to_zero.json
@@ -0,0 +1 @@
+[-0.000000000000000000000000000000000000000000000000000000000000000000000000000001]
diff --git a/test/json/validation/y_number_int_with_exp.json b/test/json/validation/y_number_int_with_exp.json
new file mode 100644
index 0000000..a4ca9e7
--- /dev/null
+++ b/test/json/validation/y_number_int_with_exp.json
@@ -0,0 +1 @@
+[20e1] \ No newline at end of file
diff --git a/test/json/validation/y_number_minus_zero.json b/test/json/validation/y_number_minus_zero.json
new file mode 100644
index 0000000..37af131
--- /dev/null
+++ b/test/json/validation/y_number_minus_zero.json
@@ -0,0 +1 @@
+[-0] \ No newline at end of file
diff --git a/test/json/validation/y_number_negative_int.json b/test/json/validation/y_number_negative_int.json
new file mode 100644
index 0000000..8e30f8b
--- /dev/null
+++ b/test/json/validation/y_number_negative_int.json
@@ -0,0 +1 @@
+[-123] \ No newline at end of file
diff --git a/test/json/validation/y_number_negative_one.json b/test/json/validation/y_number_negative_one.json
new file mode 100644
index 0000000..99d21a2
--- /dev/null
+++ b/test/json/validation/y_number_negative_one.json
@@ -0,0 +1 @@
+[-1] \ No newline at end of file
diff --git a/test/json/validation/y_number_negative_zero.json b/test/json/validation/y_number_negative_zero.json
new file mode 100644
index 0000000..37af131
--- /dev/null
+++ b/test/json/validation/y_number_negative_zero.json
@@ -0,0 +1 @@
+[-0] \ No newline at end of file
diff --git a/test/json/validation/y_number_real_capital_e.json b/test/json/validation/y_number_real_capital_e.json
new file mode 100644
index 0000000..6edbdfc
--- /dev/null
+++ b/test/json/validation/y_number_real_capital_e.json
@@ -0,0 +1 @@
+[1E22] \ No newline at end of file
diff --git a/test/json/validation/y_number_real_capital_e_neg_exp.json b/test/json/validation/y_number_real_capital_e_neg_exp.json
new file mode 100644
index 0000000..0a01bd3
--- /dev/null
+++ b/test/json/validation/y_number_real_capital_e_neg_exp.json
@@ -0,0 +1 @@
+[1E-2] \ No newline at end of file
diff --git a/test/json/validation/y_number_real_capital_e_pos_exp.json b/test/json/validation/y_number_real_capital_e_pos_exp.json
new file mode 100644
index 0000000..5a8fc09
--- /dev/null
+++ b/test/json/validation/y_number_real_capital_e_pos_exp.json
@@ -0,0 +1 @@
+[1E+2] \ No newline at end of file
diff --git a/test/json/validation/y_number_real_exponent.json b/test/json/validation/y_number_real_exponent.json
new file mode 100644
index 0000000..da2522d
--- /dev/null
+++ b/test/json/validation/y_number_real_exponent.json
@@ -0,0 +1 @@
+[123e45] \ No newline at end of file
diff --git a/test/json/validation/y_number_real_fraction_exponent.json b/test/json/validation/y_number_real_fraction_exponent.json
new file mode 100644
index 0000000..3944a7a
--- /dev/null
+++ b/test/json/validation/y_number_real_fraction_exponent.json
@@ -0,0 +1 @@
+[123.456e78] \ No newline at end of file
diff --git a/test/json/validation/y_number_real_neg_exp.json b/test/json/validation/y_number_real_neg_exp.json
new file mode 100644
index 0000000..ca40d3c
--- /dev/null
+++ b/test/json/validation/y_number_real_neg_exp.json
@@ -0,0 +1 @@
+[1e-2] \ No newline at end of file
diff --git a/test/json/validation/y_number_real_pos_exponent.json b/test/json/validation/y_number_real_pos_exponent.json
new file mode 100644
index 0000000..343601d
--- /dev/null
+++ b/test/json/validation/y_number_real_pos_exponent.json
@@ -0,0 +1 @@
+[1e+2] \ No newline at end of file
diff --git a/test/json/validation/y_number_simple_int.json b/test/json/validation/y_number_simple_int.json
new file mode 100644
index 0000000..e47f69a
--- /dev/null
+++ b/test/json/validation/y_number_simple_int.json
@@ -0,0 +1 @@
+[123] \ No newline at end of file
diff --git a/test/json/validation/y_number_simple_real.json b/test/json/validation/y_number_simple_real.json
new file mode 100644
index 0000000..b02878e
--- /dev/null
+++ b/test/json/validation/y_number_simple_real.json
@@ -0,0 +1 @@
+[123.456789] \ No newline at end of file
diff --git a/test/json/validation/y_object.json b/test/json/validation/y_object.json
new file mode 100644
index 0000000..78262ed
--- /dev/null
+++ b/test/json/validation/y_object.json
@@ -0,0 +1 @@
+{"asd":"sdf", "dfg":"fgh"} \ No newline at end of file
diff --git a/test/json/validation/y_object_basic.json b/test/json/validation/y_object_basic.json
new file mode 100644
index 0000000..646bbe7
--- /dev/null
+++ b/test/json/validation/y_object_basic.json
@@ -0,0 +1 @@
+{"asd":"sdf"} \ No newline at end of file
diff --git a/test/json/validation/y_object_duplicated_key.json b/test/json/validation/y_object_duplicated_key.json
new file mode 100644
index 0000000..bbc2e1c
--- /dev/null
+++ b/test/json/validation/y_object_duplicated_key.json
@@ -0,0 +1 @@
+{"a":"b","a":"c"} \ No newline at end of file
diff --git a/test/json/validation/y_object_duplicated_key_and_value.json b/test/json/validation/y_object_duplicated_key_and_value.json
new file mode 100644
index 0000000..211581c
--- /dev/null
+++ b/test/json/validation/y_object_duplicated_key_and_value.json
@@ -0,0 +1 @@
+{"a":"b","a":"b"} \ No newline at end of file
diff --git a/test/json/validation/y_object_empty.json b/test/json/validation/y_object_empty.json
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/test/json/validation/y_object_empty.json
@@ -0,0 +1 @@
+{} \ No newline at end of file
diff --git a/test/json/validation/y_object_empty_key.json b/test/json/validation/y_object_empty_key.json
new file mode 100644
index 0000000..c0013d3
--- /dev/null
+++ b/test/json/validation/y_object_empty_key.json
@@ -0,0 +1 @@
+{"":0} \ No newline at end of file
diff --git a/test/json/validation/y_object_escaped_null_in_key.json b/test/json/validation/y_object_escaped_null_in_key.json
new file mode 100644
index 0000000..593f0f6
--- /dev/null
+++ b/test/json/validation/y_object_escaped_null_in_key.json
@@ -0,0 +1 @@
+{"foo\u0000bar": 42} \ No newline at end of file
diff --git a/test/json/validation/y_object_extreme_numbers.json b/test/json/validation/y_object_extreme_numbers.json
new file mode 100644
index 0000000..a0d3531
--- /dev/null
+++ b/test/json/validation/y_object_extreme_numbers.json
@@ -0,0 +1 @@
+{ "min": -1.0e+28, "max": 1.0e+28 } \ No newline at end of file
diff --git a/test/json/validation/y_object_long_strings.json b/test/json/validation/y_object_long_strings.json
new file mode 100644
index 0000000..bdc4a08
--- /dev/null
+++ b/test/json/validation/y_object_long_strings.json
@@ -0,0 +1 @@
+{"x":[{"id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}], "id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"} \ No newline at end of file
diff --git a/test/json/validation/y_object_simple.json b/test/json/validation/y_object_simple.json
new file mode 100644
index 0000000..dacac91
--- /dev/null
+++ b/test/json/validation/y_object_simple.json
@@ -0,0 +1 @@
+{"a":[]} \ No newline at end of file
diff --git a/test/json/validation/y_object_string_unicode.json b/test/json/validation/y_object_string_unicode.json
new file mode 100644
index 0000000..8effdb2
--- /dev/null
+++ b/test/json/validation/y_object_string_unicode.json
@@ -0,0 +1 @@
+{"title":"\u041f\u043e\u043b\u0442\u043e\u0440\u0430 \u0417\u0435\u043c\u043b\u0435\u043a\u043e\u043f\u0430" } \ No newline at end of file
diff --git a/test/json/validation/y_object_with_newlines.json b/test/json/validation/y_object_with_newlines.json
new file mode 100644
index 0000000..246ec6b
--- /dev/null
+++ b/test/json/validation/y_object_with_newlines.json
@@ -0,0 +1,3 @@
+{
+"a": "b"
+} \ No newline at end of file
diff --git a/test/json/validation/y_string_1_2_3_bytes_UTF-8_sequences.json b/test/json/validation/y_string_1_2_3_bytes_UTF-8_sequences.json
new file mode 100644
index 0000000..9967dde
--- /dev/null
+++ b/test/json/validation/y_string_1_2_3_bytes_UTF-8_sequences.json
@@ -0,0 +1 @@
+["\u0060\u012a\u12AB"] \ No newline at end of file
diff --git a/test/json/validation/y_string_accepted_surrogate_pair.json b/test/json/validation/y_string_accepted_surrogate_pair.json
new file mode 100644
index 0000000..996875c
--- /dev/null
+++ b/test/json/validation/y_string_accepted_surrogate_pair.json
@@ -0,0 +1 @@
+["\uD801\udc37"] \ No newline at end of file
diff --git a/test/json/validation/y_string_accepted_surrogate_pairs.json b/test/json/validation/y_string_accepted_surrogate_pairs.json
new file mode 100644
index 0000000..3401021
--- /dev/null
+++ b/test/json/validation/y_string_accepted_surrogate_pairs.json
@@ -0,0 +1 @@
+["\ud83d\ude39\ud83d\udc8d"] \ No newline at end of file
diff --git a/test/json/validation/y_string_allowed_escapes.json b/test/json/validation/y_string_allowed_escapes.json
new file mode 100644
index 0000000..7f49553
--- /dev/null
+++ b/test/json/validation/y_string_allowed_escapes.json
@@ -0,0 +1 @@
+["\"\\\/\b\f\n\r\t"] \ No newline at end of file
diff --git a/test/json/validation/y_string_backslash_and_u_escaped_zero.json b/test/json/validation/y_string_backslash_and_u_escaped_zero.json
new file mode 100644
index 0000000..d4439ed
--- /dev/null
+++ b/test/json/validation/y_string_backslash_and_u_escaped_zero.json
@@ -0,0 +1 @@
+["\\u0000"] \ No newline at end of file
diff --git a/test/json/validation/y_string_backslash_doublequotes.json b/test/json/validation/y_string_backslash_doublequotes.json
new file mode 100644
index 0000000..ae03243
--- /dev/null
+++ b/test/json/validation/y_string_backslash_doublequotes.json
@@ -0,0 +1 @@
+["\""] \ No newline at end of file
diff --git a/test/json/validation/y_string_comments.json b/test/json/validation/y_string_comments.json
new file mode 100644
index 0000000..2260c20
--- /dev/null
+++ b/test/json/validation/y_string_comments.json
@@ -0,0 +1 @@
+["a/*b*/c/*d//e"] \ No newline at end of file
diff --git a/test/json/validation/y_string_double_escape_a.json b/test/json/validation/y_string_double_escape_a.json
new file mode 100644
index 0000000..6715d6f
--- /dev/null
+++ b/test/json/validation/y_string_double_escape_a.json
@@ -0,0 +1 @@
+["\\a"] \ No newline at end of file
diff --git a/test/json/validation/y_string_double_escape_n.json b/test/json/validation/y_string_double_escape_n.json
new file mode 100644
index 0000000..44ca56c
--- /dev/null
+++ b/test/json/validation/y_string_double_escape_n.json
@@ -0,0 +1 @@
+["\\n"] \ No newline at end of file
diff --git a/test/json/validation/y_string_escaped_control_character.json b/test/json/validation/y_string_escaped_control_character.json
new file mode 100644
index 0000000..5b014a9
--- /dev/null
+++ b/test/json/validation/y_string_escaped_control_character.json
@@ -0,0 +1 @@
+["\u0012"] \ No newline at end of file
diff --git a/test/json/validation/y_string_escaped_noncharacter.json b/test/json/validation/y_string_escaped_noncharacter.json
new file mode 100644
index 0000000..2ff52e2
--- /dev/null
+++ b/test/json/validation/y_string_escaped_noncharacter.json
@@ -0,0 +1 @@
+["\uFFFF"] \ No newline at end of file
diff --git a/test/json/validation/y_string_in_array.json b/test/json/validation/y_string_in_array.json
new file mode 100644
index 0000000..21d7ae4
--- /dev/null
+++ b/test/json/validation/y_string_in_array.json
@@ -0,0 +1 @@
+["asd"] \ No newline at end of file
diff --git a/test/json/validation/y_string_in_array_with_leading_space.json b/test/json/validation/y_string_in_array_with_leading_space.json
new file mode 100644
index 0000000..9e1887c
--- /dev/null
+++ b/test/json/validation/y_string_in_array_with_leading_space.json
@@ -0,0 +1 @@
+[ "asd"] \ No newline at end of file
diff --git a/test/json/validation/y_string_last_surrogates_1_and_2.json b/test/json/validation/y_string_last_surrogates_1_and_2.json
new file mode 100644
index 0000000..3919cef
--- /dev/null
+++ b/test/json/validation/y_string_last_surrogates_1_and_2.json
@@ -0,0 +1 @@
+["\uDBFF\uDFFF"] \ No newline at end of file
diff --git a/test/json/validation/y_string_nbsp_uescaped.json b/test/json/validation/y_string_nbsp_uescaped.json
new file mode 100644
index 0000000..2085ab1
--- /dev/null
+++ b/test/json/validation/y_string_nbsp_uescaped.json
@@ -0,0 +1 @@
+["new\u00A0line"] \ No newline at end of file
diff --git a/test/json/validation/y_string_nonCharacterInUTF-8_U+10FFFF.json b/test/json/validation/y_string_nonCharacterInUTF-8_U+10FFFF.json
new file mode 100644
index 0000000..059e4d9
--- /dev/null
+++ b/test/json/validation/y_string_nonCharacterInUTF-8_U+10FFFF.json
@@ -0,0 +1 @@
+["􏿿"] \ No newline at end of file
diff --git a/test/json/validation/y_string_nonCharacterInUTF-8_U+FFFF.json b/test/json/validation/y_string_nonCharacterInUTF-8_U+FFFF.json
new file mode 100644
index 0000000..4c913bd
--- /dev/null
+++ b/test/json/validation/y_string_nonCharacterInUTF-8_U+FFFF.json
@@ -0,0 +1 @@
+["￿"] \ No newline at end of file
diff --git a/test/json/validation/y_string_null_escape.json b/test/json/validation/y_string_null_escape.json
new file mode 100644
index 0000000..c1ad844
--- /dev/null
+++ b/test/json/validation/y_string_null_escape.json
@@ -0,0 +1 @@
+["\u0000"] \ No newline at end of file
diff --git a/test/json/validation/y_string_one-byte-utf-8.json b/test/json/validation/y_string_one-byte-utf-8.json
new file mode 100644
index 0000000..1571859
--- /dev/null
+++ b/test/json/validation/y_string_one-byte-utf-8.json
@@ -0,0 +1 @@
+["\u002c"] \ No newline at end of file
diff --git a/test/json/validation/y_string_pi.json b/test/json/validation/y_string_pi.json
new file mode 100644
index 0000000..9df11ae
--- /dev/null
+++ b/test/json/validation/y_string_pi.json
@@ -0,0 +1 @@
+["π"] \ No newline at end of file
diff --git a/test/json/validation/y_string_reservedCharacterInUTF-8_U+1BFFF.json b/test/json/validation/y_string_reservedCharacterInUTF-8_U+1BFFF.json
new file mode 100644
index 0000000..10a33a1
--- /dev/null
+++ b/test/json/validation/y_string_reservedCharacterInUTF-8_U+1BFFF.json
@@ -0,0 +1 @@
+["𛿿"] \ No newline at end of file
diff --git a/test/json/validation/y_string_simple_ascii.json b/test/json/validation/y_string_simple_ascii.json
new file mode 100644
index 0000000..8cadf7d
--- /dev/null
+++ b/test/json/validation/y_string_simple_ascii.json
@@ -0,0 +1 @@
+["asd "] \ No newline at end of file
diff --git a/test/json/validation/y_string_space.json b/test/json/validation/y_string_space.json
new file mode 100644
index 0000000..efd782c
--- /dev/null
+++ b/test/json/validation/y_string_space.json
@@ -0,0 +1 @@
+" " \ No newline at end of file
diff --git a/test/json/validation/y_string_surrogates_U+1D11E_MUSICAL_SYMBOL_G_CLEF.json b/test/json/validation/y_string_surrogates_U+1D11E_MUSICAL_SYMBOL_G_CLEF.json
new file mode 100644
index 0000000..7620b66
--- /dev/null
+++ b/test/json/validation/y_string_surrogates_U+1D11E_MUSICAL_SYMBOL_G_CLEF.json
@@ -0,0 +1 @@
+["\uD834\uDd1e"] \ No newline at end of file
diff --git a/test/json/validation/y_string_three-byte-utf-8.json b/test/json/validation/y_string_three-byte-utf-8.json
new file mode 100644
index 0000000..108f1d6
--- /dev/null
+++ b/test/json/validation/y_string_three-byte-utf-8.json
@@ -0,0 +1 @@
+["\u0821"] \ No newline at end of file
diff --git a/test/json/validation/y_string_two-byte-utf-8.json b/test/json/validation/y_string_two-byte-utf-8.json
new file mode 100644
index 0000000..461503c
--- /dev/null
+++ b/test/json/validation/y_string_two-byte-utf-8.json
@@ -0,0 +1 @@
+["\u0123"] \ No newline at end of file
diff --git a/test/json/validation/y_string_u+2028_line_sep.json b/test/json/validation/y_string_u+2028_line_sep.json
new file mode 100644
index 0000000..897b602
--- /dev/null
+++ b/test/json/validation/y_string_u+2028_line_sep.json
@@ -0,0 +1 @@
+["
"] \ No newline at end of file
diff --git a/test/json/validation/y_string_u+2029_par_sep.json b/test/json/validation/y_string_u+2029_par_sep.json
new file mode 100644
index 0000000..8cd998c
--- /dev/null
+++ b/test/json/validation/y_string_u+2029_par_sep.json
@@ -0,0 +1 @@
+["
"] \ No newline at end of file
diff --git a/test/json/validation/y_string_uEscape.json b/test/json/validation/y_string_uEscape.json
new file mode 100644
index 0000000..f7b41a0
--- /dev/null
+++ b/test/json/validation/y_string_uEscape.json
@@ -0,0 +1 @@
+["\u0061\u30af\u30EA\u30b9"] \ No newline at end of file
diff --git a/test/json/validation/y_string_uescaped_newline.json b/test/json/validation/y_string_uescaped_newline.json
new file mode 100644
index 0000000..3a5a220
--- /dev/null
+++ b/test/json/validation/y_string_uescaped_newline.json
@@ -0,0 +1 @@
+["new\u000Aline"] \ No newline at end of file
diff --git a/test/json/validation/y_string_unescaped_char_delete.json b/test/json/validation/y_string_unescaped_char_delete.json
new file mode 100644
index 0000000..7d064f4
--- /dev/null
+++ b/test/json/validation/y_string_unescaped_char_delete.json
@@ -0,0 +1 @@
+[""] \ No newline at end of file
diff --git a/test/json/validation/y_string_unicode.json b/test/json/validation/y_string_unicode.json
new file mode 100644
index 0000000..3598095
--- /dev/null
+++ b/test/json/validation/y_string_unicode.json
@@ -0,0 +1 @@
+["\uA66D"] \ No newline at end of file
diff --git a/test/json/validation/y_string_unicodeEscapedBackslash.json b/test/json/validation/y_string_unicodeEscapedBackslash.json
new file mode 100644
index 0000000..0bb3b51
--- /dev/null
+++ b/test/json/validation/y_string_unicodeEscapedBackslash.json
@@ -0,0 +1 @@
+["\u005C"] \ No newline at end of file
diff --git a/test/json/validation/y_string_unicode_2.json b/test/json/validation/y_string_unicode_2.json
new file mode 100644
index 0000000..a7dcb97
--- /dev/null
+++ b/test/json/validation/y_string_unicode_2.json
@@ -0,0 +1 @@
+["⍂㈴⍂"] \ No newline at end of file
diff --git a/test/json/validation/y_string_unicode_U+10FFFE_nonchar.json b/test/json/validation/y_string_unicode_U+10FFFE_nonchar.json
new file mode 100644
index 0000000..9a8370b
--- /dev/null
+++ b/test/json/validation/y_string_unicode_U+10FFFE_nonchar.json
@@ -0,0 +1 @@
+["\uDBFF\uDFFE"] \ No newline at end of file
diff --git a/test/json/validation/y_string_unicode_U+1FFFE_nonchar.json b/test/json/validation/y_string_unicode_U+1FFFE_nonchar.json
new file mode 100644
index 0000000..c51f8ae
--- /dev/null
+++ b/test/json/validation/y_string_unicode_U+1FFFE_nonchar.json
@@ -0,0 +1 @@
+["\uD83F\uDFFE"] \ No newline at end of file
diff --git a/test/json/validation/y_string_unicode_U+200B_ZERO_WIDTH_SPACE.json b/test/json/validation/y_string_unicode_U+200B_ZERO_WIDTH_SPACE.json
new file mode 100644
index 0000000..626d5f8
--- /dev/null
+++ b/test/json/validation/y_string_unicode_U+200B_ZERO_WIDTH_SPACE.json
@@ -0,0 +1 @@
+["\u200B"] \ No newline at end of file
diff --git a/test/json/validation/y_string_unicode_U+2064_invisible_plus.json b/test/json/validation/y_string_unicode_U+2064_invisible_plus.json
new file mode 100644
index 0000000..1e23972
--- /dev/null
+++ b/test/json/validation/y_string_unicode_U+2064_invisible_plus.json
@@ -0,0 +1 @@
+["\u2064"] \ No newline at end of file
diff --git a/test/json/validation/y_string_unicode_U+FDD0_nonchar.json b/test/json/validation/y_string_unicode_U+FDD0_nonchar.json
new file mode 100644
index 0000000..18ef151
--- /dev/null
+++ b/test/json/validation/y_string_unicode_U+FDD0_nonchar.json
@@ -0,0 +1 @@
+["\uFDD0"] \ No newline at end of file
diff --git a/test/json/validation/y_string_unicode_U+FFFE_nonchar.json b/test/json/validation/y_string_unicode_U+FFFE_nonchar.json
new file mode 100644
index 0000000..13d261f
--- /dev/null
+++ b/test/json/validation/y_string_unicode_U+FFFE_nonchar.json
@@ -0,0 +1 @@
+["\uFFFE"] \ No newline at end of file
diff --git a/test/json/validation/y_string_unicode_escaped_double_quote.json b/test/json/validation/y_string_unicode_escaped_double_quote.json
new file mode 100644
index 0000000..4e62578
--- /dev/null
+++ b/test/json/validation/y_string_unicode_escaped_double_quote.json
@@ -0,0 +1 @@
+["\u0022"] \ No newline at end of file
diff --git a/test/json/validation/y_string_utf8.json b/test/json/validation/y_string_utf8.json
new file mode 100644
index 0000000..4087843
--- /dev/null
+++ b/test/json/validation/y_string_utf8.json
@@ -0,0 +1 @@
+["€𝄞"] \ No newline at end of file
diff --git a/test/json/validation/y_string_with_del_character.json b/test/json/validation/y_string_with_del_character.json
new file mode 100644
index 0000000..8bd2490
--- /dev/null
+++ b/test/json/validation/y_string_with_del_character.json
@@ -0,0 +1 @@
+["aa"] \ No newline at end of file
diff --git a/test/json/validation/y_structure_lonely_false.json b/test/json/validation/y_structure_lonely_false.json
new file mode 100644
index 0000000..02e4a84
--- /dev/null
+++ b/test/json/validation/y_structure_lonely_false.json
@@ -0,0 +1 @@
+false \ No newline at end of file
diff --git a/test/json/validation/y_structure_lonely_int.json b/test/json/validation/y_structure_lonely_int.json
new file mode 100644
index 0000000..f70d7bb
--- /dev/null
+++ b/test/json/validation/y_structure_lonely_int.json
@@ -0,0 +1 @@
+42 \ No newline at end of file
diff --git a/test/json/validation/y_structure_lonely_negative_real.json b/test/json/validation/y_structure_lonely_negative_real.json
new file mode 100644
index 0000000..b5135a2
--- /dev/null
+++ b/test/json/validation/y_structure_lonely_negative_real.json
@@ -0,0 +1 @@
+-0.1 \ No newline at end of file
diff --git a/test/json/validation/y_structure_lonely_null.json b/test/json/validation/y_structure_lonely_null.json
new file mode 100644
index 0000000..ec747fa
--- /dev/null
+++ b/test/json/validation/y_structure_lonely_null.json
@@ -0,0 +1 @@
+null \ No newline at end of file
diff --git a/test/json/validation/y_structure_lonely_string.json b/test/json/validation/y_structure_lonely_string.json
new file mode 100644
index 0000000..b6e982c
--- /dev/null
+++ b/test/json/validation/y_structure_lonely_string.json
@@ -0,0 +1 @@
+"asd" \ No newline at end of file
diff --git a/test/json/validation/y_structure_lonely_true.json b/test/json/validation/y_structure_lonely_true.json
new file mode 100644
index 0000000..f32a580
--- /dev/null
+++ b/test/json/validation/y_structure_lonely_true.json
@@ -0,0 +1 @@
+true \ No newline at end of file
diff --git a/test/json/validation/y_structure_string_empty.json b/test/json/validation/y_structure_string_empty.json
new file mode 100644
index 0000000..3cc762b
--- /dev/null
+++ b/test/json/validation/y_structure_string_empty.json
@@ -0,0 +1 @@
+"" \ No newline at end of file
diff --git a/test/json/validation/y_structure_trailing_newline.json b/test/json/validation/y_structure_trailing_newline.json
new file mode 100644
index 0000000..0c3426d
--- /dev/null
+++ b/test/json/validation/y_structure_trailing_newline.json
@@ -0,0 +1 @@
+["a"]
diff --git a/test/json/validation/y_structure_true_in_array.json b/test/json/validation/y_structure_true_in_array.json
new file mode 100644
index 0000000..de601e3
--- /dev/null
+++ b/test/json/validation/y_structure_true_in_array.json
@@ -0,0 +1 @@
+[true] \ No newline at end of file
diff --git a/test/json/validation/y_structure_whitespace_array.json b/test/json/validation/y_structure_whitespace_array.json
new file mode 100644
index 0000000..2bedf7f
--- /dev/null
+++ b/test/json/validation/y_structure_whitespace_array.json
@@ -0,0 +1 @@
+ [] \ No newline at end of file
diff --git a/test/ods/borders/grid-box.ods b/test/ods/borders/grid-box.ods
new file mode 100644
index 0000000..635df51
--- /dev/null
+++ b/test/ods/borders/grid-box.ods
Binary files differ
diff --git a/test/ods/borders/single-cells.ods b/test/ods/borders/single-cells.ods
new file mode 100644
index 0000000..a51d845
--- /dev/null
+++ b/test/ods/borders/single-cells.ods
Binary files differ
diff --git a/test/ods/cell-properties/wrap-and-shrink.ods b/test/ods/cell-properties/wrap-and-shrink.ods
new file mode 100644
index 0000000..ad03617
--- /dev/null
+++ b/test/ods/cell-properties/wrap-and-shrink.ods
Binary files differ
diff --git a/test/ods/column-width-row-height/input.ods b/test/ods/column-width-row-height/input.ods
new file mode 100644
index 0000000..0f4b223
--- /dev/null
+++ b/test/ods/column-width-row-height/input.ods
Binary files differ
diff --git a/test/ods/date-cell/input.ods b/test/ods/date-cell/input.ods
new file mode 100644
index 0000000..1aecd24
--- /dev/null
+++ b/test/ods/date-cell/input.ods
Binary files differ
diff --git a/test/ods/formatted-text/bold-and-italic.ods b/test/ods/formatted-text/bold-and-italic.ods
new file mode 100644
index 0000000..f49e27f
--- /dev/null
+++ b/test/ods/formatted-text/bold-and-italic.ods
Binary files differ
diff --git a/test/ods/formula-1/check.txt b/test/ods/formula-1/check.txt
new file mode 100644
index 0000000..ef31604
--- /dev/null
+++ b/test/ods/formula-1/check.txt
@@ -0,0 +1,4 @@
+Formula/0/0:formula:1*2:2
+Formula/1/0:formula:12/3:4
+Formula/2/0:formula:AVERAGE($A1:A$2):3
+Formula/3/0:formula:SUM($A$1:$A$3):9
diff --git a/test/ods/formula-1/input.ods b/test/ods/formula-1/input.ods
new file mode 100644
index 0000000..36841e6
--- /dev/null
+++ b/test/ods/formula-1/input.ods
Binary files differ
diff --git a/test/ods/formula-2/check.txt b/test/ods/formula-2/check.txt
new file mode 100644
index 0000000..eef6880
--- /dev/null
+++ b/test/ods/formula-2/check.txt
@@ -0,0 +1,21 @@
+Sheet1/0/0:string:"Number"
+Sheet1/0/1:string:"String"
+Sheet1/0/2:string:"Formula"
+Sheet1/1/0:numeric:1
+Sheet1/1/1:string:"Andy"
+Sheet1/1/2:formula:CONCATENATE(A2," ",B2):1 Andy
+Sheet1/2/0:numeric:2
+Sheet1/2/1:string:"Bruce"
+Sheet1/2/2:formula:CONCATENATE(A3," ",B3):2 Bruce
+Sheet1/3/0:numeric:3
+Sheet1/3/1:string:"Charlie"
+Sheet1/3/2:formula:CONCATENATE(A4," ",B4):3 Charlie
+Sheet1/4/0:numeric:4
+Sheet1/4/1:string:"David"
+Sheet1/4/2:formula:CONCATENATE(A5," ",B5):4 David
+Sheet1/5/0:numeric:5
+Sheet1/5/1:string:"Edward"
+Sheet1/5/2:formula:CONCATENATE(A6," ",B6):5 Edward
+Sheet1/6/0:numeric:6
+Sheet1/6/1:string:"Frank"
+Sheet1/6/2:formula:CONCATENATE(A7," ",B7):6 Frank
diff --git a/test/ods/formula-2/input.ods b/test/ods/formula-2/input.ods
new file mode 100644
index 0000000..d310af2
--- /dev/null
+++ b/test/ods/formula-2/input.ods
Binary files differ
diff --git a/test/ods/import-styles/cell-protection.xml b/test/ods/import-styles/cell-protection.xml
new file mode 100644
index 0000000..0bea938
--- /dev/null
+++ b/test/ods/import-styles/cell-protection.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:styles xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0">
+ <style:style style:name="Default" style:family="table-cell"/>
+ <style:style style:name="Protected" style:family="table-cell" style:parent-style-name="Default"/>
+ <style:style style:name="Hide_20_Formula" style:display-name="Hide Formula" style:family="table-cell" style:parent-style-name="Protected">
+ <style:table-cell-properties style:cell-protect="protected formula-hidden" style:print-content="true"/>
+ </style:style>
+ <style:style style:name="Hide_20_When_20_Printing" style:display-name="Hide When Printing" style:family="table-cell" style:parent-style-name="Protected">
+ <style:table-cell-properties style:cell-protect="protected" style:print-content="false"/>
+ </style:style>
+ <style:style style:name="Hide_20_All" style:display-name="Hide All" style:family="table-cell" style:parent-style-name="Protected">
+ <style:table-cell-properties style:cell-protect="hidden-and-protected" style:print-content="true"/>
+ </style:style>
+ <style:style style:name="Not_20_Protected" style:display-name="Not Protected" style:family="table-cell" style:parent-style-name="Default">
+ <style:table-cell-properties style:cell-protect="none" style:print-content="true"/>
+ </style:style>
+</office:styles>
diff --git a/test/ods/import-styles/cell-styles.xml b/test/ods/import-styles/cell-styles.xml
new file mode 100644
index 0000000..f3e94ff
--- /dev/null
+++ b/test/ods/import-styles/cell-styles.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0"?>
+<office:styles xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0">
+ <style:style style:name="Name1" style:family="table-cell" style:parent-style-name="Text">
+ <style:table-cell-properties fo:background-color="#feffcc" fo:border="0.06pt dotted #ffcc12"/>
+ </style:style>
+ <style:style style:name="Name2" style:family="table-cell" style:parent-style-name="Text">
+ <style:table-cell-properties fo:border-top="0.74pt fine-dashed #ffee11" fo:border-bottom="1.74pt double-thin #aeee11" fo:border-left="0.74pt none #11ee11" fo:border-right="0.22pt dash-dot-dot #05ee11"/>
+ </style:style>
+ <style:style style:name="Name3" style:family="table-cell" style:parent-style-name="Text">
+ <style:table-cell-properties fo:diagonal-bl-tr="1.74pt dashed #ffccee" fo:diagonal-tl-br="0.74pt dash-dot #120000" fo:border-left="none" fo:border-right="0.74pt dotted #000000"/>
+ </style:style>
+ <style:style style:name="Name4" style:family="table-cell" style:parent-style-name="Text">
+ <style:table-cell-properties fo:border-top="0.74pt double-border #000000" fo:border-bottom="none" fo:border-left="0.74pt solid #000000" fo:border-right="0.74pt dotted #000000"/>
+ </style:style>
+ <style:style style:name="Name5" style:family="table-cell" style:parent-style-name="Text">
+ <style:table-cell-properties style:cell-protect="hidden-and-protected" style:print-content="true"/>
+ </style:style>
+ <style:style style:name="Name6" style:family="table-cell" style:parent-style-name="Text">
+ <style:table-cell-properties style:cell-protect="protected formula-hidden" style:print-content="false"/>
+ </style:style>
+ <style:style style:name="Name7" style:family="table-cell" style:parent-style-name="Text">
+ <style:table-cell-properties style:cell-protect="none" style:print-content="true"/>
+ </style:style>
+ <style:style style:name="Name8" style:family="table-cell" style:parent-style-name="Text">
+ <style:text-properties style:font-name="Liberation Sans" style:text-underline-style="solid" fo:font-size="24pt" fo:color="#808080" fo:font-style="italic" style:text-underline-color="font-color" fo:font-weight="bold" style:text-underline-width="thick"/>
+ </style:style>
+ <style:style style:name="Name9" style:family="table-cell" style:parent-style-name="Text">
+ <style:text-properties style:font-name="Tahoma" style:text-underline-style="dash" fo:font-size="00pt" style:text-underline-color="#1856ff" fo:font-weight="bold" style:text-underline-width="bold"/>
+ </style:style>
+ <style:style style:name="Name20" style:family="table-cell" style:parent-style-name="Default">
+ <style:text-properties style:text-line-through-style="solid" style:text-line-through-type="single"/>
+ </style:style>
+ <style:style style:name="Name21" style:family="table-cell" style:parent-style-name="Default">
+ <style:text-properties style:text-line-through-style="solid" style:text-line-through-type="single" style:text-line-through-width="bold"/>
+ </style:style>
+ <style:style style:name="Name22" style:family="table-cell" style:parent-style-name="Default">
+ <style:text-properties style:text-line-through-style="solid" style:text-line-through-type="single" style:text-line-through-text="/"/>
+ </style:style>
+ <style:style style:name="Name23" style:family="table-cell" style:parent-style-name="Text">
+ <style:table-cell-properties style:vertical-align="middle"/>
+ <style:paragraph-properties fo:text-align="end"/>
+ </style:style>
+</office:styles>
diff --git a/test/ods/import-styles/standard-styles.xml b/test/ods/import-styles/standard-styles.xml
new file mode 100644
index 0000000..d1d1a75
--- /dev/null
+++ b/test/ods/import-styles/standard-styles.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0"?>
+<office:styles xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0">
+ <style:style style:name="Heading" style:family="table-cell" style:parent-style-name="Default">
+ <style:text-properties fo:color="#000000" fo:font-size="24pt" fo:font-style="normal" fo:font-weight="bold"/>
+ </style:style>
+ <style:style style:name="Heading 1" style:family="table-cell" style:parent-style-name="Heading">
+ <style:text-properties fo:font-size="18pt"/>
+ </style:style>
+ <style:style style:name="Heading 2" style:family="table-cell" style:parent-style-name="Heading">
+ <style:text-properties fo:font-size="12pt"/>
+ </style:style>
+
+ <style:style style:name="Text" style:family="table-cell" style:parent-style-name="Default"/>
+ <style:style style:name="Note" style:family="table-cell" style:parent-style-name="Text">
+ <style:table-cell-properties fo:background-color="#ffffcc" fo:border="0.75pt solid #808080"/>
+ <style:text-properties fo:color="#333333"/>
+ </style:style>
+ <style:style style:name="Footnote" style:family="table-cell" style:parent-style-name="Text">
+ <style:text-properties fo:color="#808080" fo:font-style="italic"/>
+ </style:style>
+ <style:style style:name="Hyperlink" style:family="table-cell" style:parent-style-name="Text">
+ <style:text-properties fo:color="#0000ee" style:text-underline-style="solid" style:text-underline-width="auto" style:text-underline-color="font-color"/>
+ </style:style>
+
+ <style:style style:name="Status" style:family="table-cell" style:parent-style-name="Default"/>
+ <style:style style:name="Good" style:family="table-cell" style:parent-style-name="Status">
+ <style:table-cell-properties fo:background-color="#ccffcc"/>
+ <style:text-properties fo:color="#006600"/>
+ </style:style>
+ <style:style style:name="Neutral" style:family="table-cell" style:parent-style-name="Status">
+ <style:table-cell-properties fo:background-color="#ffffcc"/>
+ <style:text-properties fo:color="#996600"/>
+ </style:style>
+ <style:style style:name="Bad" style:family="table-cell" style:parent-style-name="Status">
+ <style:table-cell-properties fo:background-color="#ffcccc"/>
+ <style:text-properties fo:color="#cc0000"/>
+ </style:style>
+ <style:style style:name="Warning" style:family="table-cell" style:parent-style-name="Status">
+ <style:text-properties fo:color="#cc0000"/>
+ </style:style>
+ <style:style style:name="Error" style:family="table-cell" style:parent-style-name="Status">
+ <style:table-cell-properties fo:background-color="#cc0000"/>
+ <style:text-properties fo:color="#ffffff" fo:font-weight="bold"/>
+ </style:style>
+
+ <style:style style:name="Accent" style:family="table-cell" style:parent-style-name="Default">
+ <style:text-properties fo:font-weight="bold"/>
+ </style:style>
+ <style:style style:name="Accent 1" style:family="table-cell" style:parent-style-name="Accent">
+ <style:table-cell-properties fo:background-color="#000000"/>
+ <style:text-properties fo:color="#ffffff"/>
+ </style:style>
+ <style:style style:name="Accent 2" style:family="table-cell" style:parent-style-name="Accent">
+ <style:table-cell-properties fo:background-color="#808080"/>
+ <style:text-properties fo:color="#ffffff"/>
+ </style:style>
+ <style:style style:name="Accent 3" style:family="table-cell" style:parent-style-name="Accent">
+ <style:table-cell-properties fo:background-color="#dddddd"/>
+ </style:style>
+
+ <style:style style:name="Result" style:family="table-cell" style:parent-style-name="Default">
+ <style:text-properties fo:font-weight="bold" fo:font-style="italic" style:text-underline-style="solid"/>
+ </style:style>
+</office:styles>
diff --git a/test/ods/japanese.ods b/test/ods/japanese.ods
new file mode 100644
index 0000000..3c2cc4e
--- /dev/null
+++ b/test/ods/japanese.ods
Binary files differ
diff --git a/test/ods/named-expression-sheet-local/check.txt b/test/ods/named-expression-sheet-local/check.txt
new file mode 100644
index 0000000..c6dbaed
--- /dev/null
+++ b/test/ods/named-expression-sheet-local/check.txt
@@ -0,0 +1,24 @@
+Sheet1/0/0:numeric:1
+Sheet1/0/1:numeric:6
+Sheet1/1/0:numeric:2
+Sheet1/1/1:numeric:7
+Sheet1/2/0:numeric:3
+Sheet1/2/1:numeric:8
+Sheet1/3/0:numeric:4
+Sheet1/3/1:numeric:9
+Sheet1/4/0:numeric:5
+Sheet1/4/1:numeric:10
+Sheet1/6/0:formula:SUM(MyRange):27
+Sheet1/6/1:formula:MyCalc:9
+Sheet2/0/0:numeric:10
+Sheet2/0/1:numeric:20
+Sheet2/1/0:numeric:11
+Sheet2/1/1:numeric:21
+Sheet2/2/0:numeric:12
+Sheet2/2/1:numeric:22
+Sheet2/3/0:numeric:13
+Sheet2/3/1:numeric:23
+Sheet2/4/0:numeric:14
+Sheet2/4/1:numeric:24
+Sheet2/6/0:formula:SUM(MyRange):74
+Sheet2/6/1:formula:MyCalc:-8
diff --git a/test/ods/named-expression-sheet-local/input.ods b/test/ods/named-expression-sheet-local/input.ods
new file mode 100644
index 0000000..b26f717
--- /dev/null
+++ b/test/ods/named-expression-sheet-local/input.ods
Binary files differ
diff --git a/test/ods/named-expression/check.txt b/test/ods/named-expression/check.txt
new file mode 100644
index 0000000..e25d914
--- /dev/null
+++ b/test/ods/named-expression/check.txt
@@ -0,0 +1,14 @@
+Sheet1/1/1:formula:MyCalc:128
+Sheet1/1/4:numeric:7
+Sheet1/2/4:numeric:3
+Sheet1/3/2:formula:128/MyCalc:1
+Sheet1/3/4:formula:MyCalcWithRef:1024
+Sheet1/6/0:formula:INT(MyCalcWithRef2*PI()):65
+Sheet1/7/0:formula:INT(MyCalcWithRef2*PI()):50
+Sheet1/8/0:formula:INT(MyCalcWithRef2*PI()):28
+Sheet2/0/0:numeric:1
+Sheet2/0/1:numeric:4
+Sheet2/1/0:numeric:2
+Sheet2/1/1:numeric:5
+Sheet2/2/0:numeric:3
+Sheet2/2/1:numeric:6
diff --git a/test/ods/named-expression/input.ods b/test/ods/named-expression/input.ods
new file mode 100644
index 0000000..19a60e8
--- /dev/null
+++ b/test/ods/named-expression/input.ods
Binary files differ
diff --git a/test/ods/named-range/check.txt b/test/ods/named-range/check.txt
new file mode 100644
index 0000000..e745fb7
--- /dev/null
+++ b/test/ods/named-range/check.txt
@@ -0,0 +1,36 @@
+Sheet1/0/0:numeric:1
+Sheet1/0/1:numeric:6
+Sheet1/0/2:numeric:11
+Sheet1/0/4:numeric:1
+Sheet1/0/5:numeric:6
+Sheet1/0/6:numeric:11
+Sheet1/1/0:numeric:2
+Sheet1/1/1:numeric:7
+Sheet1/1/2:numeric:12
+Sheet1/1/4:numeric:2
+Sheet1/1/5:numeric:7
+Sheet1/1/6:numeric:12
+Sheet1/2/0:numeric:3
+Sheet1/2/1:numeric:8
+Sheet1/2/2:numeric:13
+Sheet1/2/4:numeric:3
+Sheet1/2/5:numeric:8
+Sheet1/2/6:numeric:13
+Sheet1/3/0:numeric:4
+Sheet1/3/1:numeric:9
+Sheet1/3/2:numeric:14
+Sheet1/3/4:numeric:4
+Sheet1/3/5:numeric:9
+Sheet1/3/6:numeric:14
+Sheet1/4/0:numeric:5
+Sheet1/4/1:numeric:10
+Sheet1/4/2:numeric:15
+Sheet1/4/4:numeric:5
+Sheet1/4/5:numeric:10
+Sheet1/4/6:numeric:15
+Sheet1/6/0:formula:SUM(MyRange):15
+Sheet1/6/1:formula:SUM(MyRange2):55
+Sheet1/6/2:formula:SUM(MyRange3):65
+Sheet1/6/4:formula:SUM(RangeRelative):15
+Sheet1/6/5:formula:SUM(RangeRelative):40
+Sheet1/6/6:formula:SUM(RangeRelative):65
diff --git a/test/ods/named-range/input.ods b/test/ods/named-range/input.ods
new file mode 100644
index 0000000..47b3aad
--- /dev/null
+++ b/test/ods/named-range/input.ods
Binary files differ
diff --git a/test/ods/number-format/basic-set.ods b/test/ods/number-format/basic-set.ods
new file mode 100644
index 0000000..d009f1b
--- /dev/null
+++ b/test/ods/number-format/basic-set.ods
Binary files differ
diff --git a/test/ods/raw-values-1/check.txt b/test/ods/raw-values-1/check.txt
new file mode 100644
index 0000000..935cf22
--- /dev/null
+++ b/test/ods/raw-values-1/check.txt
@@ -0,0 +1,25 @@
+Num/1/0:numeric:1.1
+Num/1/2:numeric:2.1
+Num/1/4:numeric:3.1
+Num/2/0:numeric:1.2
+Num/2/2:numeric:2.2
+Num/2/4:numeric:3.2
+Num/3/0:numeric:1.3
+Num/3/2:numeric:2.3
+Num/3/4:numeric:3.3
+Num/6/2:numeric:5
+Num/6/3:numeric:6
+Num/6/4:numeric:7
+Text/0/0:string:"A"
+Text/1/0:string:"B"
+Text/1/1:string:"D"
+Text/2/0:string:"C"
+Text/2/1:string:"E"
+Text/2/2:string:"G"
+Text/3/1:string:"F"
+Text/3/2:string:"H"
+Text/4/2:string:"I"
+Text/6/3:string:"Andy"
+Text/7/3:string:"Bruce"
+Text/8/3:string:"Charlie"
+Text/9/3:string:"David"
diff --git a/test/ods/raw-values-1/input.ods b/test/ods/raw-values-1/input.ods
new file mode 100644
index 0000000..8b856a3
--- /dev/null
+++ b/test/ods/raw-values-1/input.ods
Binary files differ
diff --git a/test/ods/styles/asian-complex.ods b/test/ods/styles/asian-complex.ods
new file mode 100644
index 0000000..4e3eb9c
--- /dev/null
+++ b/test/ods/styles/asian-complex.ods
Binary files differ
diff --git a/test/ods/styles/column-styles.ods b/test/ods/styles/column-styles.ods
new file mode 100644
index 0000000..a37ed22
--- /dev/null
+++ b/test/ods/styles/column-styles.ods
Binary files differ
diff --git a/test/ods/styles/direct-format.ods b/test/ods/styles/direct-format.ods
new file mode 100644
index 0000000..6e80685
--- /dev/null
+++ b/test/ods/styles/direct-format.ods
Binary files differ
diff --git a/test/ods/styles/text-underlines.ods b/test/ods/styles/text-underlines.ods
new file mode 100644
index 0000000..316b3c0
--- /dev/null
+++ b/test/ods/styles/text-underlines.ods
Binary files differ
diff --git a/test/ods/test.ods b/test/ods/test.ods
new file mode 100644
index 0000000..0c5b00a
--- /dev/null
+++ b/test/ods/test.ods
Binary files differ
diff --git a/test/parquet/basic/basic-gzip.parquet b/test/parquet/basic/basic-gzip.parquet
new file mode 100644
index 0000000..313de04
--- /dev/null
+++ b/test/parquet/basic/basic-gzip.parquet
Binary files differ
diff --git a/test/parquet/basic/basic-gzip.parquet.check b/test/parquet/basic/basic-gzip.parquet.check
new file mode 100644
index 0000000..455389b
--- /dev/null
+++ b/test/parquet/basic/basic-gzip.parquet.check
@@ -0,0 +1,66 @@
+basic-gzip/0/0:string:"int32"
+basic-gzip/0/1:string:"int64"
+basic-gzip/0/2:string:"float32"
+basic-gzip/0/3:string:"float64"
+basic-gzip/0/4:string:"boolean"
+basic-gzip/0/5:string:"string"
+basic-gzip/1/0:numeric:0
+basic-gzip/1/1:numeric:0
+basic-gzip/1/2:numeric:0
+basic-gzip/1/3:numeric:-21
+basic-gzip/1/4:boolean:false
+basic-gzip/1/5:string:"ubergeek"
+basic-gzip/2/0:numeric:1
+basic-gzip/2/1:numeric:11
+basic-gzip/2/2:numeric:-1
+basic-gzip/2/3:numeric:-22
+basic-gzip/2/4:boolean:true
+basic-gzip/2/5:string:"thwarter"
+basic-gzip/3/0:numeric:2
+basic-gzip/3/1:numeric:22
+basic-gzip/3/2:numeric:-2
+basic-gzip/3/3:numeric:-23
+basic-gzip/3/4:boolean:false
+basic-gzip/3/5:string:"ironfist"
+basic-gzip/4/0:numeric:3
+basic-gzip/4/1:numeric:33
+basic-gzip/4/2:numeric:-3
+basic-gzip/4/3:numeric:-24
+basic-gzip/4/4:boolean:true
+basic-gzip/4/5:string:"turkoman"
+basic-gzip/5/0:numeric:4
+basic-gzip/5/1:numeric:44
+basic-gzip/5/2:numeric:-4
+basic-gzip/5/3:numeric:-25
+basic-gzip/5/4:boolean:false
+basic-gzip/5/5:string:"mesozoan"
+basic-gzip/6/0:numeric:5
+basic-gzip/6/1:numeric:55
+basic-gzip/6/2:numeric:-5
+basic-gzip/6/3:numeric:-26
+basic-gzip/6/4:boolean:true
+basic-gzip/6/5:string:"seatsale"
+basic-gzip/7/0:numeric:6
+basic-gzip/7/1:numeric:66
+basic-gzip/7/2:numeric:-6
+basic-gzip/7/3:numeric:-27
+basic-gzip/7/4:boolean:false
+basic-gzip/7/5:string:"hardtack"
+basic-gzip/8/0:numeric:7
+basic-gzip/8/1:numeric:77
+basic-gzip/8/2:numeric:-7
+basic-gzip/8/3:numeric:-28
+basic-gzip/8/4:boolean:true
+basic-gzip/8/5:string:"phyllary"
+basic-gzip/9/0:numeric:8
+basic-gzip/9/1:numeric:88
+basic-gzip/9/2:numeric:-8
+basic-gzip/9/3:numeric:-29
+basic-gzip/9/4:boolean:false
+basic-gzip/9/5:string:"hydriads"
+basic-gzip/10/0:numeric:9
+basic-gzip/10/1:numeric:99
+basic-gzip/10/2:numeric:-9
+basic-gzip/10/3:numeric:-30
+basic-gzip/10/4:boolean:true
+basic-gzip/10/5:string:"stranger"
diff --git a/test/parquet/basic/basic-nocomp.parquet b/test/parquet/basic/basic-nocomp.parquet
new file mode 100644
index 0000000..25e9cfc
--- /dev/null
+++ b/test/parquet/basic/basic-nocomp.parquet
Binary files differ
diff --git a/test/parquet/basic/basic-nocomp.parquet.check b/test/parquet/basic/basic-nocomp.parquet.check
new file mode 100644
index 0000000..a5c9636
--- /dev/null
+++ b/test/parquet/basic/basic-nocomp.parquet.check
@@ -0,0 +1,66 @@
+basic-nocomp/0/0:string:"int32"
+basic-nocomp/0/1:string:"int64"
+basic-nocomp/0/2:string:"float32"
+basic-nocomp/0/3:string:"float64"
+basic-nocomp/0/4:string:"boolean"
+basic-nocomp/0/5:string:"string"
+basic-nocomp/1/0:numeric:0
+basic-nocomp/1/1:numeric:0
+basic-nocomp/1/2:numeric:0
+basic-nocomp/1/3:numeric:-21
+basic-nocomp/1/4:boolean:false
+basic-nocomp/1/5:string:"ubergeek"
+basic-nocomp/2/0:numeric:1
+basic-nocomp/2/1:numeric:11
+basic-nocomp/2/2:numeric:-1
+basic-nocomp/2/3:numeric:-22
+basic-nocomp/2/4:boolean:true
+basic-nocomp/2/5:string:"thwarter"
+basic-nocomp/3/0:numeric:2
+basic-nocomp/3/1:numeric:22
+basic-nocomp/3/2:numeric:-2
+basic-nocomp/3/3:numeric:-23
+basic-nocomp/3/4:boolean:false
+basic-nocomp/3/5:string:"ironfist"
+basic-nocomp/4/0:numeric:3
+basic-nocomp/4/1:numeric:33
+basic-nocomp/4/2:numeric:-3
+basic-nocomp/4/3:numeric:-24
+basic-nocomp/4/4:boolean:true
+basic-nocomp/4/5:string:"turkoman"
+basic-nocomp/5/0:numeric:4
+basic-nocomp/5/1:numeric:44
+basic-nocomp/5/2:numeric:-4
+basic-nocomp/5/3:numeric:-25
+basic-nocomp/5/4:boolean:false
+basic-nocomp/5/5:string:"mesozoan"
+basic-nocomp/6/0:numeric:5
+basic-nocomp/6/1:numeric:55
+basic-nocomp/6/2:numeric:-5
+basic-nocomp/6/3:numeric:-26
+basic-nocomp/6/4:boolean:true
+basic-nocomp/6/5:string:"seatsale"
+basic-nocomp/7/0:numeric:6
+basic-nocomp/7/1:numeric:66
+basic-nocomp/7/2:numeric:-6
+basic-nocomp/7/3:numeric:-27
+basic-nocomp/7/4:boolean:false
+basic-nocomp/7/5:string:"hardtack"
+basic-nocomp/8/0:numeric:7
+basic-nocomp/8/1:numeric:77
+basic-nocomp/8/2:numeric:-7
+basic-nocomp/8/3:numeric:-28
+basic-nocomp/8/4:boolean:true
+basic-nocomp/8/5:string:"phyllary"
+basic-nocomp/9/0:numeric:8
+basic-nocomp/9/1:numeric:88
+basic-nocomp/9/2:numeric:-8
+basic-nocomp/9/3:numeric:-29
+basic-nocomp/9/4:boolean:false
+basic-nocomp/9/5:string:"hydriads"
+basic-nocomp/10/0:numeric:9
+basic-nocomp/10/1:numeric:99
+basic-nocomp/10/2:numeric:-9
+basic-nocomp/10/3:numeric:-30
+basic-nocomp/10/4:boolean:true
+basic-nocomp/10/5:string:"stranger"
diff --git a/test/parquet/basic/basic-snappy.parquet b/test/parquet/basic/basic-snappy.parquet
new file mode 100644
index 0000000..0ac150c
--- /dev/null
+++ b/test/parquet/basic/basic-snappy.parquet
Binary files differ
diff --git a/test/parquet/basic/basic-snappy.parquet.check b/test/parquet/basic/basic-snappy.parquet.check
new file mode 100644
index 0000000..f7cd1c7
--- /dev/null
+++ b/test/parquet/basic/basic-snappy.parquet.check
@@ -0,0 +1,66 @@
+basic-snappy/0/0:string:"int32"
+basic-snappy/0/1:string:"int64"
+basic-snappy/0/2:string:"float32"
+basic-snappy/0/3:string:"float64"
+basic-snappy/0/4:string:"boolean"
+basic-snappy/0/5:string:"string"
+basic-snappy/1/0:numeric:0
+basic-snappy/1/1:numeric:0
+basic-snappy/1/2:numeric:0
+basic-snappy/1/3:numeric:-21
+basic-snappy/1/4:boolean:false
+basic-snappy/1/5:string:"ubergeek"
+basic-snappy/2/0:numeric:1
+basic-snappy/2/1:numeric:11
+basic-snappy/2/2:numeric:-1
+basic-snappy/2/3:numeric:-22
+basic-snappy/2/4:boolean:true
+basic-snappy/2/5:string:"thwarter"
+basic-snappy/3/0:numeric:2
+basic-snappy/3/1:numeric:22
+basic-snappy/3/2:numeric:-2
+basic-snappy/3/3:numeric:-23
+basic-snappy/3/4:boolean:false
+basic-snappy/3/5:string:"ironfist"
+basic-snappy/4/0:numeric:3
+basic-snappy/4/1:numeric:33
+basic-snappy/4/2:numeric:-3
+basic-snappy/4/3:numeric:-24
+basic-snappy/4/4:boolean:true
+basic-snappy/4/5:string:"turkoman"
+basic-snappy/5/0:numeric:4
+basic-snappy/5/1:numeric:44
+basic-snappy/5/2:numeric:-4
+basic-snappy/5/3:numeric:-25
+basic-snappy/5/4:boolean:false
+basic-snappy/5/5:string:"mesozoan"
+basic-snappy/6/0:numeric:5
+basic-snappy/6/1:numeric:55
+basic-snappy/6/2:numeric:-5
+basic-snappy/6/3:numeric:-26
+basic-snappy/6/4:boolean:true
+basic-snappy/6/5:string:"seatsale"
+basic-snappy/7/0:numeric:6
+basic-snappy/7/1:numeric:66
+basic-snappy/7/2:numeric:-6
+basic-snappy/7/3:numeric:-27
+basic-snappy/7/4:boolean:false
+basic-snappy/7/5:string:"hardtack"
+basic-snappy/8/0:numeric:7
+basic-snappy/8/1:numeric:77
+basic-snappy/8/2:numeric:-7
+basic-snappy/8/3:numeric:-28
+basic-snappy/8/4:boolean:true
+basic-snappy/8/5:string:"phyllary"
+basic-snappy/9/0:numeric:8
+basic-snappy/9/1:numeric:88
+basic-snappy/9/2:numeric:-8
+basic-snappy/9/3:numeric:-29
+basic-snappy/9/4:boolean:false
+basic-snappy/9/5:string:"hydriads"
+basic-snappy/10/0:numeric:9
+basic-snappy/10/1:numeric:99
+basic-snappy/10/2:numeric:-9
+basic-snappy/10/3:numeric:-30
+basic-snappy/10/4:boolean:true
+basic-snappy/10/5:string:"stranger"
diff --git a/test/parquet/basic/basic-zstd.parquet b/test/parquet/basic/basic-zstd.parquet
new file mode 100644
index 0000000..b1c878f
--- /dev/null
+++ b/test/parquet/basic/basic-zstd.parquet
Binary files differ
diff --git a/test/parquet/basic/basic-zstd.parquet.check b/test/parquet/basic/basic-zstd.parquet.check
new file mode 100644
index 0000000..2ae0af6
--- /dev/null
+++ b/test/parquet/basic/basic-zstd.parquet.check
@@ -0,0 +1,66 @@
+basic-zstd/0/0:string:"int32"
+basic-zstd/0/1:string:"int64"
+basic-zstd/0/2:string:"float32"
+basic-zstd/0/3:string:"float64"
+basic-zstd/0/4:string:"boolean"
+basic-zstd/0/5:string:"string"
+basic-zstd/1/0:numeric:0
+basic-zstd/1/1:numeric:0
+basic-zstd/1/2:numeric:0
+basic-zstd/1/3:numeric:-21
+basic-zstd/1/4:boolean:false
+basic-zstd/1/5:string:"ubergeek"
+basic-zstd/2/0:numeric:1
+basic-zstd/2/1:numeric:11
+basic-zstd/2/2:numeric:-1
+basic-zstd/2/3:numeric:-22
+basic-zstd/2/4:boolean:true
+basic-zstd/2/5:string:"thwarter"
+basic-zstd/3/0:numeric:2
+basic-zstd/3/1:numeric:22
+basic-zstd/3/2:numeric:-2
+basic-zstd/3/3:numeric:-23
+basic-zstd/3/4:boolean:false
+basic-zstd/3/5:string:"ironfist"
+basic-zstd/4/0:numeric:3
+basic-zstd/4/1:numeric:33
+basic-zstd/4/2:numeric:-3
+basic-zstd/4/3:numeric:-24
+basic-zstd/4/4:boolean:true
+basic-zstd/4/5:string:"turkoman"
+basic-zstd/5/0:numeric:4
+basic-zstd/5/1:numeric:44
+basic-zstd/5/2:numeric:-4
+basic-zstd/5/3:numeric:-25
+basic-zstd/5/4:boolean:false
+basic-zstd/5/5:string:"mesozoan"
+basic-zstd/6/0:numeric:5
+basic-zstd/6/1:numeric:55
+basic-zstd/6/2:numeric:-5
+basic-zstd/6/3:numeric:-26
+basic-zstd/6/4:boolean:true
+basic-zstd/6/5:string:"seatsale"
+basic-zstd/7/0:numeric:6
+basic-zstd/7/1:numeric:66
+basic-zstd/7/2:numeric:-6
+basic-zstd/7/3:numeric:-27
+basic-zstd/7/4:boolean:false
+basic-zstd/7/5:string:"hardtack"
+basic-zstd/8/0:numeric:7
+basic-zstd/8/1:numeric:77
+basic-zstd/8/2:numeric:-7
+basic-zstd/8/3:numeric:-28
+basic-zstd/8/4:boolean:true
+basic-zstd/8/5:string:"phyllary"
+basic-zstd/9/0:numeric:8
+basic-zstd/9/1:numeric:88
+basic-zstd/9/2:numeric:-8
+basic-zstd/9/3:numeric:-29
+basic-zstd/9/4:boolean:false
+basic-zstd/9/5:string:"hydriads"
+basic-zstd/10/0:numeric:9
+basic-zstd/10/1:numeric:99
+basic-zstd/10/2:numeric:-9
+basic-zstd/10/3:numeric:-30
+basic-zstd/10/4:boolean:true
+basic-zstd/10/5:string:"stranger"
diff --git a/test/parquet/basic/float-with-nan.parquet b/test/parquet/basic/float-with-nan.parquet
new file mode 100644
index 0000000..b3aea00
--- /dev/null
+++ b/test/parquet/basic/float-with-nan.parquet
Binary files differ
diff --git a/test/parquet/basic/float-with-nan.parquet.check b/test/parquet/basic/float-with-nan.parquet.check
new file mode 100644
index 0000000..9618f9e
--- /dev/null
+++ b/test/parquet/basic/float-with-nan.parquet.check
@@ -0,0 +1,4 @@
+float-with-nan/0/0:string:"float64 with nan"
+float-with-nan/1/0:numeric:1.2
+float-with-nan/2/0:numeric:3.4
+float-with-nan/5/0:numeric:5.6
diff --git a/test/python/env.json.in b/test/python/env.json.in
new file mode 100644
index 0000000..26b82d6
--- /dev/null
+++ b/test/python/env.json.in
@@ -0,0 +1,6 @@
+{
+ "version-major": @ORCUS_MAJOR_VERSION@,
+ "version-minor": @ORCUS_MINOR_VERSION@,
+ "version-micro": @ORCUS_MICRO_VERSION@
+}
+
diff --git a/test/python/file_load_common.py b/test/python/file_load_common.py
new file mode 100644
index 0000000..5587405
--- /dev/null
+++ b/test/python/file_load_common.py
@@ -0,0 +1,248 @@
+########################################################################
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+########################################################################
+
+"""Collection of test cases shared between different file format types."""
+
+import os
+import os.path
+import collections
+import orcus
+
+
+class Address(object):
+
+ def __init__(self, pos_s):
+ self.sheet_name, self.row, self.column = pos_s.split('/')
+ self.row = int(self.row)
+ self.column = int(self.column)
+
+ def __repr__(self):
+ return "(sheet={}; row={}, column={})".format(self.sheet_name, self.row, self.column)
+
+
+class ExpectedSheet(object):
+
+ def __init__(self, name):
+ self.__name = name
+ self.__rows = collections.OrderedDict()
+ self.__max_column = 0
+ self.__max_row = 0
+
+ @property
+ def name(self):
+ return self.__name
+
+ @property
+ def data_size(self):
+ return {"column": self.__max_column+1, "row": self.__max_row+1}
+
+ def get_rows(self):
+ rows = list()
+ for i in range(self.__max_row+1):
+ row = [(orcus.CellType.EMPTY, None) for _ in range(self.__max_column+1)]
+ if i in self.__rows:
+ for col_pos, cell in self.__rows[i].items():
+ row[col_pos] = cell
+ rows.append(tuple(row))
+ return tuple(rows)
+
+ def insert_cell(self, row, column, cell_type, cell_value, result):
+ if row not in self.__rows:
+ self.__rows[row] = collections.OrderedDict()
+
+ row_data = self.__rows[row]
+
+ if cell_type == "numeric":
+ row_data[column] = (orcus.CellType.NUMERIC, float(cell_value))
+ elif cell_type == "string":
+ row_data[column] = (orcus.CellType.STRING, self.__unescape_string_cell_value(cell_value))
+ elif cell_type == "boolean":
+ if cell_value == "true":
+ row_data[column] = (orcus.CellType.BOOLEAN, True)
+ elif cell_value == "false":
+ row_data[column] = (orcus.CellType.BOOLEAN, False)
+ else:
+ raise RuntimeError("invalid boolean value: {}".format(cell_value))
+ elif cell_type == "formula":
+ row_data[column] = (orcus.CellType.FORMULA, result, cell_value)
+ else:
+ raise RuntimeError("unhandled cell value type: {}".format(cell_type))
+
+ # Update the data range.
+ if row > self.__max_row:
+ self.__max_row = row
+ if column > self.__max_column:
+ self.__max_column = column
+
+ def __unescape_string_cell_value(self, v):
+ if v[0] != '"' or v[-1] != '"':
+ raise RuntimeError("string value is expected to be quoted.")
+
+ v = v[1:-1] # remove the outer quotes.
+
+ buf = []
+ escaped_char = False
+ for c in v:
+ if escaped_char:
+ buf.append(c)
+ escaped_char = False
+ continue
+
+ if c == '\\':
+ escaped_char = True
+ continue
+
+ buf.append(c)
+
+ return "".join(buf)
+
+
+class ExpectedDocument(object):
+
+ def __init__(self, filepath):
+ self.sheets = []
+
+ with open(filepath, "r") as f:
+ for line in f.readlines():
+ line = line.strip()
+ self.__parse_line(line)
+
+ def __parse_line(self, line):
+ if not line:
+ return
+
+ # Split the line into 3 parts - position, cell type and the value.
+ # Note that a valid formula expression may contain ':', so we cannot
+ # simply split the line by ':'.
+
+ parts = list()
+ idx = line.find(':')
+ while idx >= 0:
+ parts.append(line[:idx])
+ line = line[idx+1:]
+ if len(parts) == 2:
+ # Append the rest.
+ parts.append(line)
+ break
+
+ idx = line.find(':')
+
+ if len(parts) != 3:
+ raise RuntimeError(
+ "line is expected to contain 3 parts, but not all parts are identified.")
+
+ if parts[1] in ("merge-width", "merge-height"):
+ return
+
+ pos, cell_type, cell_value = parts[0], parts[1], parts[2]
+ result = None
+ if cell_type == "formula":
+ # Split the cell value into formula expression and result.
+ idx = cell_value.rfind(':')
+ if idx < 0:
+ raise RuntimeError("formula line is expected to contain a result value.")
+ cell_value, result = cell_value[:idx], cell_value[idx+1:]
+ try:
+ result = float(result)
+ except ValueError:
+ pass
+
+ pos = Address(pos)
+
+ if not self.sheets or self.sheets[-1].name != pos.sheet_name:
+ self.sheets.append(ExpectedSheet(pos.sheet_name))
+
+ self.sheets[-1].insert_cell(pos.row, pos.column, cell_type, cell_value, result)
+
+
+def _compare_cells(expected, actual):
+ type = expected[0]
+
+ if type != actual.type:
+ return False
+
+ if type == orcus.CellType.EMPTY:
+ return True
+
+ if type in (orcus.CellType.BOOLEAN, orcus.CellType.NUMERIC, orcus.CellType.STRING):
+ return expected[1] == actual.value
+
+ if type == orcus.CellType.FORMULA:
+ return expected[1] == actual.value and expected[2] == actual.formula
+
+ return False
+
+
+class DocLoader:
+
+ def __init__(self, mod_loader):
+ self._mod_loader = mod_loader
+
+ def load(self, filepath, recalc):
+ with open(filepath, "rb") as f:
+ return self._mod_loader.read(f, recalc=recalc)
+
+ def load_from_value(self, filepath):
+ with open(filepath, "rb") as f:
+ bytes = f.read()
+ return self._mod_loader.read(bytes, recalc=False)
+
+
+def run_test_dir(self, test_dir, doc_loader):
+ """Run test case for loading a file into a document.
+
+ :param test_dir: test directory that contains an input file (whose base
+ name is 'input') and a content check file (check.txt).
+ :param mod_loader: module object that contains function called 'read'.
+ """
+
+ print("test directory: {}".format(test_dir))
+ expected = ExpectedDocument(os.path.join(test_dir, "check.txt"))
+
+ # Find the input file to load.
+ input_file = None
+ for file_name in os.listdir(test_dir):
+ name, ext = os.path.splitext(file_name)
+ if name == "input":
+ input_file = os.path.join(test_dir, file_name)
+ break
+
+ print("input file: {}".format(input_file))
+ self.assertIsNot(input_file, None)
+
+ doc = doc_loader.load(input_file, True)
+ self.assertIsInstance(doc, orcus.Document)
+
+ # Sometimes the actual document contains trailing empty sheets, which the
+ # expected document does not store.
+ self.assertTrue(len(expected.sheets))
+ self.assertTrue(len(expected.sheets) <= len(doc.sheets))
+
+ expected_sheets = {sh.name: sh for sh in expected.sheets}
+ actual_sheets = {sh.name: sh for sh in doc.sheets}
+
+ for sheet_name, actual_sheet in actual_sheets.items():
+ if sheet_name in expected_sheets:
+ expected_sheet = expected_sheets[sheet_name]
+ self.assertEqual(expected_sheet.data_size, actual_sheet.data_size)
+ for expected_row, actual_row in zip(expected_sheet.get_rows(), actual_sheet.get_rows()):
+ for expected, actual in zip(expected_row, actual_row):
+ self.assertTrue(_compare_cells(expected, actual))
+ else:
+ # This sheet must be empty since it's not in the expected document.
+ # Make sure it returns empty row set.
+ rows = [row for row in actual_sheet.get_rows()]
+ self.assertEqual(len(rows), 0)
+
+ # Also make sure the document loads fine without recalc.
+ doc = doc_loader.load(input_file, False)
+ self.assertIsInstance(doc, orcus.Document)
+
+ # Make sure the document loads from in-memory value.
+ doc = doc_loader.load_from_value(input_file)
+ self.assertIsInstance(doc, orcus.Document)
diff --git a/test/python/perf/test_json.py b/test/python/perf/test_json.py
new file mode 100755
index 0000000..acd34cc
--- /dev/null
+++ b/test/python/perf/test_json.py
@@ -0,0 +1,273 @@
+#!/usr/bin/env python3
+
+from datetime import datetime
+import json
+import orcus.json
+
+swagger_json = """
+{
+ "swagger": "2.0",
+ "info": {
+ "version": "1.0.0",
+ "title": "Swagger Petstore (Simple)",
+ "description": "A sample API that uses a petstore as an example to demonstrate features in the swagger-2.0 specification",
+ "termsOfService": "http://helloreverb.com/terms/",
+ "contact": {
+ "name": "Swagger API team",
+ "email": "foo@example.com",
+ "url": "http://swagger.io"
+ },
+ "license": {
+ "name": "MIT",
+ "url": "http://opensource.org/licenses/MIT"
+ }
+ },
+ "host": "petstore.swagger.wordnik.com",
+ "basePath": "/api",
+ "schemes": [
+ "http"
+ ],
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "paths": {
+ "/pets": {
+ "get": {
+ "description": "Returns all pets from the system that the user has access to",
+ "operationId": "findPets",
+ "produces": [
+ "application/json",
+ "application/xml",
+ "text/xml",
+ "text/html"
+ ],
+ "parameters": [
+ {
+ "name": "tags",
+ "in": "query",
+ "description": "tags to filter by",
+ "required": false,
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "collectionFormat": "csv"
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "description": "maximum number of results to return",
+ "required": false,
+ "type": "integer",
+ "format": "int32"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "pet response",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/pet"
+ }
+ }
+ },
+ "default": {
+ "description": "unexpected error",
+ "schema": {
+ "$ref": "#/definitions/errorModel"
+ }
+ }
+ }
+ },
+ "post": {
+ "description": "Creates a new pet in the store. Duplicates are allowed",
+ "operationId": "addPet",
+ "produces": [
+ "application/json"
+ ],
+ "parameters": [
+ {
+ "name": "pet",
+ "in": "body",
+ "description": "Pet to add to the store",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/newPet"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "pet response",
+ "schema": {
+ "$ref": "#/definitions/pet"
+ }
+ },
+ "default": {
+ "description": "unexpected error",
+ "schema": {
+ "$ref": "#/definitions/errorModel"
+ }
+ }
+ }
+ }
+ },
+ "/pets/{id}": {
+ "get": {
+ "description": "Returns a user based on a single ID, if the user does not have access to the pet",
+ "operationId": "findPetById",
+ "produces": [
+ "application/json",
+ "application/xml",
+ "text/xml",
+ "text/html"
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "ID of pet to fetch",
+ "required": true,
+ "type": "integer",
+ "format": "int64"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "pet response",
+ "schema": {
+ "$ref": "#/definitions/pet"
+ }
+ },
+ "default": {
+ "description": "unexpected error",
+ "schema": {
+ "$ref": "#/definitions/errorModel"
+ }
+ }
+ }
+ },
+ "delete": {
+ "description": "deletes a single pet based on the ID supplied",
+ "operationId": "deletePet",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "ID of pet to delete",
+ "required": true,
+ "type": "integer",
+ "format": "int64"
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "pet deleted"
+ },
+ "default": {
+ "description": "unexpected error",
+ "schema": {
+ "$ref": "#/definitions/errorModel"
+ }
+ }
+ }
+ }
+ }
+ },
+ "definitions": {
+ "pet": {
+ "required": [
+ "id",
+ "name"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "name": {
+ "type": "string"
+ },
+ "tag": {
+ "type": "string"
+ }
+ }
+ },
+ "newPet": {
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "name": {
+ "type": "string"
+ },
+ "tag": {
+ "type": "string"
+ }
+ }
+ },
+ "errorModel": {
+ "required": [
+ "code",
+ "message"
+ ],
+ "properties": {
+ "code": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "message": {
+ "type": "string"
+ }
+ }
+ }
+ }
+}
+"""
+
+class ScopePrinter(object):
+
+ def __init__(self, name):
+ self.start_time = None
+ self.name = name
+
+ def __enter__(self):
+ self.start_time = datetime.now()
+ print("--- {} started".format(self.name))
+
+ def __exit__(self, type, value, traceback):
+ end_time = datetime.now()
+ diff = end_time - self.start_time
+ sec = diff.seconds + diff.microseconds / 1000000.0
+ print("--- {} ended (duration: {} seconds)".format(self.name, sec))
+
+
+def run_builtin():
+ for i in range(20000):
+ o = json.loads(swagger_json)
+
+
+def run_orcus():
+ for i in range(20000):
+ o = orcus.json.loads(swagger_json)
+
+
+def main():
+ with ScopePrinter("builtin"):
+ run_builtin()
+
+ with ScopePrinter("orcus"):
+ run_orcus()
+
+
+if __name__ == '__main__':
+ main()
+
diff --git a/test/python/test_csv.py b/test/python/test_csv.py
new file mode 100755
index 0000000..c6f59e6
--- /dev/null
+++ b/test/python/test_csv.py
@@ -0,0 +1,47 @@
+#!/usr/bin/env python3
+########################################################################
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+########################################################################
+
+import unittest
+import os
+import os.path
+
+from orcus import csv
+
+import file_load_common as common
+
+
+class DocLoader:
+
+ def load(self, filepath, recalc):
+ with open(filepath, "r") as f:
+ return csv.read(f)
+
+ def load_from_value(self, filepath):
+ with open(filepath, "r") as f:
+ content = f.read()
+ return csv.read(content)
+
+
+class TestCase(unittest.TestCase):
+
+ @classmethod
+ def setUpClass(cls):
+ # base directory for ods test files.
+ basedir = os.path.join(os.path.dirname(__file__), "..", "csv")
+ cls.basedir = os.path.normpath(basedir)
+
+ def test_import(self):
+ test_dirs = ("simple-numbers", "normal-quotes", "double-quotes", "quoted-with-delim")
+ for test_dir in test_dirs:
+ test_dir = os.path.join(self.basedir, test_dir)
+ common.run_test_dir(self, test_dir, DocLoader())
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/test/python/test_csv_export.py b/test/python/test_csv_export.py
new file mode 100755
index 0000000..9c6d6b4
--- /dev/null
+++ b/test/python/test_csv_export.py
@@ -0,0 +1,107 @@
+#!/usr/bin/env python3
+########################################################################
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+########################################################################
+
+import unittest
+import os
+import os.path
+import file_load_common as common
+from orcus import FormatType, csv
+
+
+class MockFileObject(object):
+
+ def __init__(self):
+ self._content = None
+
+ def write(self, bytes):
+ self._content = bytes
+
+ def read(self):
+ return self._content
+
+ @property
+ def bytes(self):
+ return self._content
+
+
+class TestCase(unittest.TestCase):
+
+ @classmethod
+ def setUpClass(cls):
+ # base directory for xlsx test files.
+ basedir_xlsx = os.path.join(os.path.dirname(__file__), "..", "xlsx")
+ cls.basedir_xlsx = os.path.normpath(basedir_xlsx)
+
+ @unittest.skipIf(os.environ.get("WITH_PYTHON_XLSX") is None, "python xlsx module is disabled")
+ def test_export_from_xlsx(self):
+ from orcus import xlsx
+
+ test_dirs = (
+ "raw-values-1",
+ "empty-shared-strings",
+ "named-expression",
+ )
+
+ for test_dir in test_dirs:
+ test_dir = os.path.join(self.basedir_xlsx, test_dir)
+ input_file = os.path.join(test_dir, "input.xlsx")
+ with open(input_file, "rb") as f:
+ doc = xlsx.read(f)
+
+ # Build an expected document object from the check file.
+ check_file = os.path.join(test_dir, "check.txt")
+ check_doc = common.ExpectedDocument(check_file)
+
+ # check_doc only contains non-empty sheets.
+ data_sheet_names = set()
+ for sheet in check_doc.sheets:
+ data_sheet_names.add(sheet.name)
+
+ for sheet in doc.sheets:
+ mfo = MockFileObject()
+ sheet.write(mfo, format=FormatType.CSV)
+
+ if mfo.bytes is None:
+ self.assertFalse(sheet.name in data_sheet_names)
+ continue
+
+ # Load the csv stream into a document again.
+ doc_reload = csv.read(mfo)
+ self.assertEqual(1, len(doc_reload.sheets))
+ for row1, row2 in zip(sheet.get_rows(), doc_reload.sheets[0].get_rows()):
+ # Only comare cell values, not cell types.
+ row1 = [c.value for c in row1]
+ row2 = [c.value for c in row2]
+ self.assertEqual(row1, row2)
+
+ # Make sure we raise an exception on invalid format type.
+ # We currently only support exporting sheet as csv.
+
+ invalid_formats = (
+ "foo",
+ FormatType.GNUMERIC,
+ FormatType.JSON,
+ FormatType.ODS,
+ FormatType.XLSX,
+ FormatType.XLS_XML,
+ FormatType.XLS_XML,
+ FormatType.XML,
+ FormatType.YAML,
+ )
+
+ for invalid_format in invalid_formats:
+ mfo = MockFileObject()
+ with self.assertRaises(Exception):
+ doc.sheets[0].write(mfo, format=invalid_format)
+
+
+if __name__ == '__main__':
+ unittest.main()
+
+
diff --git a/test/python/test_gnumeric.py b/test/python/test_gnumeric.py
new file mode 100755
index 0000000..f715776
--- /dev/null
+++ b/test/python/test_gnumeric.py
@@ -0,0 +1,39 @@
+#!/usr/bin/env python3
+########################################################################
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+########################################################################
+
+import unittest
+import os
+import os.path
+
+from orcus import gnumeric
+
+import file_load_common as common
+
+
+class TestCase(unittest.TestCase):
+
+ @classmethod
+ def setUpClass(cls):
+ # base directory for xlsx test files.
+ basedir = os.path.join(os.path.dirname(__file__), "..", "gnumeric")
+ cls.basedir = os.path.normpath(basedir)
+
+ def test_import(self):
+
+ test_dirs = (
+ "raw-values-1",
+ )
+
+ for test_dir in test_dirs:
+ test_dir = os.path.join(self.basedir, test_dir)
+ common.run_test_dir(self, test_dir, common.DocLoader(gnumeric))
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/test/python/test_json.py b/test/python/test_json.py
new file mode 100755
index 0000000..2fde74c
--- /dev/null
+++ b/test/python/test_json.py
@@ -0,0 +1,45 @@
+#!/usr/bin/env python3
+########################################################################
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+########################################################################
+
+import unittest
+from orcus import json
+
+
+class JsonTest(unittest.TestCase):
+
+ def test_loads(self):
+ s = '[1,2,3,"foo",[4,5,6], {"a": 12.3, "b": 34.4, "c": [true, false, null]}]'
+ o = json.loads(s)
+ self.assertTrue(isinstance(o, list))
+ self.assertEqual(len(o), 6)
+ self.assertEqual(o[0], 1)
+ self.assertEqual(o[1], 2)
+ self.assertEqual(o[2], 3)
+ self.assertEqual(o[3], "foo")
+
+ self.assertTrue(isinstance(o[4], list))
+ self.assertEqual(o[4][0], 4)
+ self.assertEqual(o[4][1], 5)
+ self.assertEqual(o[4][2], 6)
+
+ d = o[5]
+ self.assertTrue(isinstance(d, dict))
+ self.assertEqual(len(d), 3)
+ self.assertEqual(d["a"], 12.3)
+ self.assertEqual(d["b"], 34.4)
+
+ l = d["c"]
+ self.assertEqual(len(l), 3)
+ self.assertEqual(l[0], True)
+ self.assertEqual(l[1], False)
+ self.assertEqual(l[2], None)
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/test/python/test_module.py b/test/python/test_module.py
new file mode 100755
index 0000000..2d6ca4b
--- /dev/null
+++ b/test/python/test_module.py
@@ -0,0 +1,56 @@
+#!/usr/bin/env python3
+########################################################################
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+########################################################################
+
+import unittest
+import orcus
+import os.path
+import json
+import os
+from pathlib import Path
+
+
+class ModuleTest(unittest.TestCase):
+
+ @classmethod
+ def setUpClass(cls):
+ top_builddir = Path(os.environ["BUILDDIR"])
+ with open(top_builddir / "test" / "python" / "env.json", "r") as f:
+ cls.env = json.load(f)
+
+ def test_version(self):
+ s = orcus.__version__
+ expected = f"{self.env['version-major']}.{self.env['version-minor']}.{self.env['version-micro']}"
+ self.assertEqual(expected, s)
+
+ def test_detect_format(self):
+ test_root_dir = os.path.join(os.path.dirname(__file__), "..")
+
+ checks = (
+ (("ods", "raw-values-1", "input.ods"), orcus.FormatType.ODS),
+ (("xlsx", "raw-values-1", "input.xlsx"), orcus.FormatType.XLSX),
+ (("xls-xml", "raw-values-1", "input.xml"), orcus.FormatType.XLS_XML),
+ (("gnumeric", "raw-values-1", "input.gnumeric"), orcus.FormatType.GNUMERIC),
+ )
+
+ for check in checks:
+ filepath = os.path.join(test_root_dir, *check[0])
+ with open(filepath, "rb") as f:
+ # Pass the file object directly.
+ fmt = orcus.detect_format(f)
+ self.assertEqual(check[1], fmt)
+
+ # Pass the bytes.
+ f.seek(0)
+ bytes = f.read()
+ fmt = orcus.detect_format(bytes)
+ self.assertEqual(check[1], fmt)
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/test/python/test_ods.py b/test/python/test_ods.py
new file mode 100755
index 0000000..e4c0dc9
--- /dev/null
+++ b/test/python/test_ods.py
@@ -0,0 +1,164 @@
+#!/usr/bin/env python3
+########################################################################
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+########################################################################
+
+import unittest
+from pathlib import Path
+
+from orcus import ods, FormulaTokenType, FormulaTokenOp
+
+import file_load_common as common
+
+
+class TestCase(unittest.TestCase):
+
+ @classmethod
+ def setUpClass(cls):
+ # base directory for ods test files.
+ basedir = Path(__file__).parent / ".." / "ods"
+ cls.basedir = basedir.resolve()
+
+ def test_import(self):
+ test_dirs = ("raw-values-1", "formula-1", "formula-2")
+ for test_dir in test_dirs:
+ test_dir = self.basedir / test_dir
+ common.run_test_dir(self, test_dir, common.DocLoader(ods))
+
+ def test_formula_tokens_1(self):
+ filepath = self.basedir / "formula-1" / "input.ods"
+ with open(filepath, "rb") as f:
+ doc = ods.read(f, recalc=False)
+
+ self.assertEqual(len(doc.sheets), 1)
+
+ # The 'Formula' sheet contains 4 formula cells in A1:A4.
+ sheet = doc.sheets[0]
+ self.assertEqual(sheet.name, "Formula")
+ rows = [row for row in sheet.get_rows()]
+ self.assertEqual(len(rows), 4)
+
+ expected = ("1*2", "12/3", "AVERAGE($A1:A$2)", "SUM($A$1:$A$3)")
+ for row, expected_formula in zip(sheet.get_rows(), expected):
+ c = row[0]
+ self.assertEqual(c.formula, expected_formula)
+
+ expected = (
+ (
+ ("1", FormulaTokenType.VALUE, FormulaTokenOp.VALUE),
+ ("*", FormulaTokenType.OPERATOR, FormulaTokenOp.MULTIPLY),
+ ("2", FormulaTokenType.VALUE, FormulaTokenOp.VALUE)
+ ),
+ (
+ ("12", FormulaTokenType.VALUE, FormulaTokenOp.VALUE),
+ ("/", FormulaTokenType.OPERATOR, FormulaTokenOp.DIVIDE),
+ ("3", FormulaTokenType.VALUE, FormulaTokenOp.VALUE)
+ ),
+ (
+ ("AVERAGE", FormulaTokenType.FUNCTION, FormulaTokenOp.FUNCTION),
+ ("(", FormulaTokenType.OPERATOR, FormulaTokenOp.OPEN),
+ ("$A1:A$2", FormulaTokenType.REFERENCE, FormulaTokenOp.RANGE_REF),
+ (")", FormulaTokenType.OPERATOR, FormulaTokenOp.CLOSE)
+ ),
+ (
+ ("SUM", FormulaTokenType.FUNCTION, FormulaTokenOp.FUNCTION),
+ ("(", FormulaTokenType.OPERATOR, FormulaTokenOp.OPEN),
+ ("$A$1:$A$3", FormulaTokenType.REFERENCE, FormulaTokenOp.RANGE_REF),
+ (")", FormulaTokenType.OPERATOR, FormulaTokenOp.CLOSE)
+ ),
+ )
+
+ for row, expected_formula_tokens in zip(sheet.get_rows(), expected):
+ c = row[0]
+ iter = c.get_formula_tokens()
+ for token, expected_token in zip(iter, expected_formula_tokens):
+ self.assertEqual(str(token), expected_token[0])
+ self.assertEqual(token.type, expected_token[1])
+ self.assertEqual(token.op, expected_token[2])
+
+ def test_formula_tokens_2(self):
+ filepath = self.basedir / "formula-2" / "input.ods"
+ with open(filepath, "rb") as f:
+ doc = ods.read(f, recalc=False)
+
+ self.assertEqual(len(doc.sheets), 1)
+
+ expected = (
+ (
+ ("CONCATENATE", FormulaTokenType.FUNCTION, FormulaTokenOp.FUNCTION),
+ ("(", FormulaTokenType.OPERATOR, FormulaTokenOp.OPEN),
+ ("A2", FormulaTokenType.REFERENCE, FormulaTokenOp.SINGLE_REF),
+ (",", FormulaTokenType.OPERATOR, FormulaTokenOp.SEP),
+ ('" "', FormulaTokenType.VALUE, FormulaTokenOp.STRING),
+ (",", FormulaTokenType.OPERATOR, FormulaTokenOp.SEP),
+ ("B2", FormulaTokenType.REFERENCE, FormulaTokenOp.SINGLE_REF),
+ (")", FormulaTokenType.OPERATOR, FormulaTokenOp.CLOSE),
+ ),
+ (
+ ("CONCATENATE", FormulaTokenType.FUNCTION, FormulaTokenOp.FUNCTION),
+ ("(", FormulaTokenType.OPERATOR, FormulaTokenOp.OPEN),
+ ("A3", FormulaTokenType.REFERENCE, FormulaTokenOp.SINGLE_REF),
+ (",", FormulaTokenType.OPERATOR, FormulaTokenOp.SEP),
+ ('" "', FormulaTokenType.VALUE, FormulaTokenOp.STRING),
+ (",", FormulaTokenType.OPERATOR, FormulaTokenOp.SEP),
+ ("B3", FormulaTokenType.REFERENCE, FormulaTokenOp.SINGLE_REF),
+ (")", FormulaTokenType.OPERATOR, FormulaTokenOp.CLOSE),
+ ),
+ (
+ ("CONCATENATE", FormulaTokenType.FUNCTION, FormulaTokenOp.FUNCTION),
+ ("(", FormulaTokenType.OPERATOR, FormulaTokenOp.OPEN),
+ ("A4", FormulaTokenType.REFERENCE, FormulaTokenOp.SINGLE_REF),
+ (",", FormulaTokenType.OPERATOR, FormulaTokenOp.SEP),
+ ('" "', FormulaTokenType.VALUE, FormulaTokenOp.STRING),
+ (",", FormulaTokenType.OPERATOR, FormulaTokenOp.SEP),
+ ("B4", FormulaTokenType.REFERENCE, FormulaTokenOp.SINGLE_REF),
+ (")", FormulaTokenType.OPERATOR, FormulaTokenOp.CLOSE),
+ ),
+ (
+ ("CONCATENATE", FormulaTokenType.FUNCTION, FormulaTokenOp.FUNCTION),
+ ("(", FormulaTokenType.OPERATOR, FormulaTokenOp.OPEN),
+ ("A5", FormulaTokenType.REFERENCE, FormulaTokenOp.SINGLE_REF),
+ (",", FormulaTokenType.OPERATOR, FormulaTokenOp.SEP),
+ ('" "', FormulaTokenType.VALUE, FormulaTokenOp.STRING),
+ (",", FormulaTokenType.OPERATOR, FormulaTokenOp.SEP),
+ ("B5", FormulaTokenType.REFERENCE, FormulaTokenOp.SINGLE_REF),
+ (")", FormulaTokenType.OPERATOR, FormulaTokenOp.CLOSE),
+ ),
+ (
+ ("CONCATENATE", FormulaTokenType.FUNCTION, FormulaTokenOp.FUNCTION),
+ ("(", FormulaTokenType.OPERATOR, FormulaTokenOp.OPEN),
+ ("A6", FormulaTokenType.REFERENCE, FormulaTokenOp.SINGLE_REF),
+ (",", FormulaTokenType.OPERATOR, FormulaTokenOp.SEP),
+ ('" "', FormulaTokenType.VALUE, FormulaTokenOp.STRING),
+ (",", FormulaTokenType.OPERATOR, FormulaTokenOp.SEP),
+ ("B6", FormulaTokenType.REFERENCE, FormulaTokenOp.SINGLE_REF),
+ (")", FormulaTokenType.OPERATOR, FormulaTokenOp.CLOSE),
+ ),
+ (
+ ("CONCATENATE", FormulaTokenType.FUNCTION, FormulaTokenOp.FUNCTION),
+ ("(", FormulaTokenType.OPERATOR, FormulaTokenOp.OPEN),
+ ("A7", FormulaTokenType.REFERENCE, FormulaTokenOp.SINGLE_REF),
+ (",", FormulaTokenType.OPERATOR, FormulaTokenOp.SEP),
+ ('" "', FormulaTokenType.VALUE, FormulaTokenOp.STRING),
+ (",", FormulaTokenType.OPERATOR, FormulaTokenOp.SEP),
+ ("B7", FormulaTokenType.REFERENCE, FormulaTokenOp.SINGLE_REF),
+ (")", FormulaTokenType.OPERATOR, FormulaTokenOp.CLOSE),
+ ),
+ )
+
+ # Check cells in column C.
+ rows = [row for row in doc.sheets[0].get_rows()]
+ for row, expected_tokens in zip(rows[1:], expected): # skip the header row
+ tokens = row[2].get_formula_tokens()
+ for token, expected_token in zip(tokens, expected_tokens):
+ self.assertEqual(str(token), expected_token[0])
+ self.assertEqual(token.type, expected_token[1])
+ self.assertEqual(token.op, expected_token[2])
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/test/python/test_xls_xml.py b/test/python/test_xls_xml.py
new file mode 100755
index 0000000..b8ae918
--- /dev/null
+++ b/test/python/test_xls_xml.py
@@ -0,0 +1,80 @@
+#!/usr/bin/env python3
+########################################################################
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+########################################################################
+
+import unittest
+import os
+import os.path
+
+import orcus
+from orcus import xls_xml
+
+import file_load_common as common
+
+
+class TestCase(unittest.TestCase):
+
+ @classmethod
+ def setUpClass(cls):
+ # base directory for ods test files.
+ basedir = os.path.join(os.path.dirname(__file__), "..", "xls-xml")
+ cls.basedir = os.path.normpath(basedir)
+
+ def test_import(self):
+
+ test_dirs = (
+ "basic",
+ "bold-and-italic",
+ "colored-text",
+ "empty-rows",
+ "merged-cells",
+ "named-expression",
+ "named-expression-sheet-local",
+ "raw-values-1",
+ )
+
+ for test_dir in test_dirs:
+ test_dir = os.path.join(self.basedir, test_dir)
+ common.run_test_dir(self, test_dir, common.DocLoader(xls_xml))
+
+ def test_skip_error_cells(self):
+ filepath = os.path.join(self.basedir, "formula-cells-parse-error", "input.xml")
+ with open(filepath, "rb") as f:
+ bytes = f.read()
+
+ with self.assertRaises(RuntimeError):
+ doc = xls_xml.read(bytes)
+
+ with self.assertRaises(RuntimeError): # TODO : should we raise a more specific error?
+ doc = xls_xml.read(bytes, error_policy="fail")
+
+ # With the 'skip' policy, formula cells with erroneous formulas are
+ # imported as formula cells with error.
+ doc = xls_xml.read(bytes, error_policy="skip")
+
+ # Make sure cells B2 and A5 are imported as formula cells.
+ rows = [row for row in doc.sheets[0].get_rows()]
+ c = rows[1][1]
+ self.assertEqual(c.type, orcus.CellType.FORMULA_WITH_ERROR)
+ self.assertFalse(c.formula) # formula string should be empty
+ # error formula tokens consist of: error token, string token (original formula), string token (error message).
+ formula_tokens = [t for t in c.get_formula_tokens()]
+ self.assertEqual(formula_tokens[0].type, orcus.FormulaTokenType.ERROR)
+ self.assertEqual(formula_tokens[1].type, orcus.FormulaTokenType.VALUE)
+ self.assertEqual(formula_tokens[2].type, orcus.FormulaTokenType.VALUE)
+ c = rows[4][0]
+ self.assertEqual(c.type, orcus.CellType.FORMULA_WITH_ERROR)
+ self.assertFalse(c.formula) # formula string should be empty
+ formula_tokens = [t for t in c.get_formula_tokens()]
+ self.assertEqual(formula_tokens[0].type, orcus.FormulaTokenType.ERROR)
+ self.assertEqual(formula_tokens[1].type, orcus.FormulaTokenType.VALUE)
+ self.assertEqual(formula_tokens[2].type, orcus.FormulaTokenType.VALUE)
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/test/python/test_xlsx.py b/test/python/test_xlsx.py
new file mode 100755
index 0000000..1f691da
--- /dev/null
+++ b/test/python/test_xlsx.py
@@ -0,0 +1,103 @@
+#!/usr/bin/env python3
+########################################################################
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+########################################################################
+
+import unittest
+import os
+import os.path
+import mmap
+
+from orcus import xlsx
+
+import file_load_common as common
+
+
+class TestCase(unittest.TestCase):
+
+ @classmethod
+ def setUpClass(cls):
+ # base directory for xlsx test files.
+ basedir = os.path.join(os.path.dirname(__file__), "..", "xlsx")
+ cls.basedir = os.path.normpath(basedir)
+
+ def test_import(self):
+
+ test_dirs = (
+ "boolean-values",
+ "empty-shared-strings",
+ "formula-cells",
+ "formula-shared",
+ "named-expression",
+ "named-expression-sheet-local",
+ "raw-values-1",
+ )
+
+ for test_dir in test_dirs:
+ test_dir = os.path.join(self.basedir, test_dir)
+ common.run_test_dir(self, test_dir, common.DocLoader(xlsx))
+
+ def test_named_expression(self):
+ filepath = os.path.join(self.basedir, "named-expression", "input.xlsx")
+ with open(filepath, "rb") as f:
+ doc = xlsx.read(f)
+
+ named_exps = doc.get_named_expressions()
+ self.assertEqual(named_exps.names(), {"MyRange", "MyRange2"})
+ self.assertEqual(len(named_exps), 2)
+
+ named_exps_dict = {x[0]: x[1] for x in named_exps}
+ exp = named_exps_dict["MyRange"]
+ self.assertEqual(exp.origin, "Sheet1!$A$1")
+ self.assertEqual(exp.formula, "$A$1:$A$5")
+ iter = exp.get_formula_tokens()
+ self.assertEqual(len(iter), 1)
+ tokens = [t for t in iter]
+ self.assertEqual(str(tokens[0]), "$A$1:$A$5")
+
+ exp = named_exps_dict["MyRange2"]
+ self.assertEqual(exp.origin, "Sheet1!$A$1")
+ self.assertEqual(exp.formula, "$A$1:$B$5")
+ iter = exp.get_formula_tokens()
+ self.assertEqual(len(iter), 1)
+ tokens = [t for t in iter]
+ self.assertEqual(str(tokens[0]), "$A$1:$B$5")
+
+ def test_named_expression_sheet_local(self):
+ filepath = os.path.join(self.basedir, "named-expression-sheet-local", "input.xlsx")
+ with open(filepath, "rb") as f:
+ doc = xlsx.read(f)
+
+ sheet = doc.sheets[0]
+ named_exps = sheet.get_named_expressions()
+ self.assertEqual(len(named_exps), 1)
+ self.assertEqual(named_exps.names(), {"MyRange",})
+
+ named_exps_dict = {x[0]: x[1] for x in named_exps}
+ exp = named_exps_dict["MyRange"]
+ self.assertEqual(exp.formula, "$A$1:$B$3")
+ iter = exp.get_formula_tokens()
+ self.assertEqual(len(iter), 1)
+ tokens = [t for t in iter]
+ self.assertEqual(str(tokens[0]), "$A$1:$B$3")
+
+ sheet = doc.sheets[1]
+ named_exps = sheet.get_named_expressions()
+ self.assertEqual(named_exps.names(), {"MyRange",})
+ self.assertEqual(len(named_exps), 1)
+
+ named_exps_dict = {x[0]: x[1] for x in named_exps}
+ exp = named_exps_dict["MyRange"]
+ self.assertEqual(exp.formula, "$A$4:$B$5")
+ iter = exp.get_formula_tokens()
+ self.assertEqual(len(iter), 1)
+ tokens = [t for t in iter]
+ self.assertEqual(str(tokens[0]), "$A$4:$B$5")
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/test/xls-xml/background-color/standard.xml b/test/xls-xml/background-color/standard.xml
new file mode 100644
index 0000000..7ccfef8
--- /dev/null
+++ b/test/xls-xml/background-color/standard.xml
@@ -0,0 +1,150 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2013-10-21T23:43:59Z</Created>
+ <LastSaved>2013-10-21T23:51:49Z</LastSaved>
+ <Version>16.00</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <AllowPNG/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>9270</WindowHeight>
+ <WindowWidth>24915</WindowWidth>
+ <WindowTopX>480</WindowTopX>
+ <WindowTopY>120</WindowTopY>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ <Style ss:ID="s16">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"
+ ss:Bold="1"/>
+ </Style>
+ <Style ss:ID="s17">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#FFFFFF"
+ ss:Bold="1"/>
+ <Interior ss:Color="#C00000" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s18">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#FFFFFF"
+ ss:Bold="1"/>
+ <Interior ss:Color="#FF0000" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s19">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#FFFFFF"
+ ss:Bold="1"/>
+ <Interior ss:Color="#FFC000" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s20">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#FFFFFF"
+ ss:Bold="1"/>
+ <Interior ss:Color="#FFFF00" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s21">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#FFFFFF"
+ ss:Bold="1"/>
+ <Interior ss:Color="#92D050" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s22">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#FFFFFF"
+ ss:Bold="1"/>
+ <Interior ss:Color="#00B050" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s23">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#FFFFFF"
+ ss:Bold="1"/>
+ <Interior ss:Color="#00B0F0" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s24">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#FFFFFF"
+ ss:Bold="1"/>
+ <Interior ss:Color="#0070C0" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s25">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#FFFFFF"
+ ss:Bold="1"/>
+ <Interior ss:Color="#002060" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s26">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#FFFFFF"
+ ss:Bold="1"/>
+ <Interior ss:Color="#7030A0" ss:Pattern="Solid"/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="BackgroundColor">
+ <Table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="11" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Column ss:AutoFitWidth="0" ss:Width="222.75"/>
+ <Row>
+ <Cell ss:StyleID="s16"><Data ss:Type="String">Background Color</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="s17"><Data ss:Type="String">Dark Red</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="s18"><Data ss:Type="String">Red</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="s19"><Data ss:Type="String">Orange</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="s20"><Data ss:Type="String">Yellow</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="s21"><Data ss:Type="String">Light Green</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">Green</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="s23"><Data ss:Type="String">Light Blue</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Blue</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Dark Blue</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="s26"><Data ss:Type="String">Purple</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Print>
+ <ValidPrinterInfo/>
+ <HorizontalResolution>600</HorizontalResolution>
+ <VerticalResolution>600</VerticalResolution>
+ </Print>
+ <Selected/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>12</ActiveRow>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/test/xls-xml/basic-utf-16-be/check.txt b/test/xls-xml/basic-utf-16-be/check.txt
new file mode 100644
index 0000000..7e198a8
--- /dev/null
+++ b/test/xls-xml/basic-utf-16-be/check.txt
@@ -0,0 +1,27 @@
+Data/0/0:string:"Numbers"
+Data/0/2:string:"Fractions"
+Data/0/4:string:"Text"
+Data/1/0:numeric:1
+Data/1/2:numeric:1.1
+Data/1/4:string:"A"
+Data/2/0:numeric:2
+Data/2/2:numeric:1.2
+Data/2/4:string:"B"
+Data/3/0:numeric:3
+Data/3/2:numeric:1.3
+Data/3/4:string:"C"
+Data/4/0:numeric:4
+Data/4/2:numeric:1.4
+Data/4/4:string:"D"
+Data/5/0:numeric:5
+Data/5/2:numeric:1.5
+Data/5/4:string:"E"
+Data/6/0:numeric:6
+Data/6/2:numeric:1.6
+Data/6/4:string:"F"
+Data/8/0:string:"One"
+Data/8/1:string:"Two"
+Data/8/2:string:"Three"
+Data/8/3:string:"Four"
+Data/8/4:string:"Five"
+2nd/0/0:string:"Empty Sheet"
diff --git a/test/xls-xml/basic-utf-16-be/input.xml b/test/xls-xml/basic-utf-16-be/input.xml
new file mode 100644
index 0000000..29e9976
--- /dev/null
+++ b/test/xls-xml/basic-utf-16-be/input.xml
Binary files differ
diff --git a/test/xls-xml/basic-utf-16-le/check.txt b/test/xls-xml/basic-utf-16-le/check.txt
new file mode 100644
index 0000000..7e198a8
--- /dev/null
+++ b/test/xls-xml/basic-utf-16-le/check.txt
@@ -0,0 +1,27 @@
+Data/0/0:string:"Numbers"
+Data/0/2:string:"Fractions"
+Data/0/4:string:"Text"
+Data/1/0:numeric:1
+Data/1/2:numeric:1.1
+Data/1/4:string:"A"
+Data/2/0:numeric:2
+Data/2/2:numeric:1.2
+Data/2/4:string:"B"
+Data/3/0:numeric:3
+Data/3/2:numeric:1.3
+Data/3/4:string:"C"
+Data/4/0:numeric:4
+Data/4/2:numeric:1.4
+Data/4/4:string:"D"
+Data/5/0:numeric:5
+Data/5/2:numeric:1.5
+Data/5/4:string:"E"
+Data/6/0:numeric:6
+Data/6/2:numeric:1.6
+Data/6/4:string:"F"
+Data/8/0:string:"One"
+Data/8/1:string:"Two"
+Data/8/2:string:"Three"
+Data/8/3:string:"Four"
+Data/8/4:string:"Five"
+2nd/0/0:string:"Empty Sheet"
diff --git a/test/xls-xml/basic-utf-16-le/input.xml b/test/xls-xml/basic-utf-16-le/input.xml
new file mode 100644
index 0000000..4c5cfd1
--- /dev/null
+++ b/test/xls-xml/basic-utf-16-le/input.xml
Binary files differ
diff --git a/test/xls-xml/basic/check.txt b/test/xls-xml/basic/check.txt
new file mode 100644
index 0000000..7e198a8
--- /dev/null
+++ b/test/xls-xml/basic/check.txt
@@ -0,0 +1,27 @@
+Data/0/0:string:"Numbers"
+Data/0/2:string:"Fractions"
+Data/0/4:string:"Text"
+Data/1/0:numeric:1
+Data/1/2:numeric:1.1
+Data/1/4:string:"A"
+Data/2/0:numeric:2
+Data/2/2:numeric:1.2
+Data/2/4:string:"B"
+Data/3/0:numeric:3
+Data/3/2:numeric:1.3
+Data/3/4:string:"C"
+Data/4/0:numeric:4
+Data/4/2:numeric:1.4
+Data/4/4:string:"D"
+Data/5/0:numeric:5
+Data/5/2:numeric:1.5
+Data/5/4:string:"E"
+Data/6/0:numeric:6
+Data/6/2:numeric:1.6
+Data/6/4:string:"F"
+Data/8/0:string:"One"
+Data/8/1:string:"Two"
+Data/8/2:string:"Three"
+Data/8/3:string:"Four"
+Data/8/4:string:"Five"
+2nd/0/0:string:"Empty Sheet"
diff --git a/test/xls-xml/basic/input.xml b/test/xls-xml/basic/input.xml
new file mode 100644
index 0000000..6484f68
--- /dev/null
+++ b/test/xls-xml/basic/input.xml
@@ -0,0 +1,112 @@
+<?xml version="1.0"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2013-06-15T21:47:21Z</Created>
+ <Company>SUSE</Company>
+ <Version>10.2625</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <DownloadComponents/>
+ <LocationOfComponents HRef="file:///D:\"/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>9525</WindowHeight>
+ <WindowWidth>14355</WindowWidth>
+ <WindowTopX>240</WindowTopX>
+ <WindowTopY>30</WindowTopY>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Data">
+ <Table ss:ExpandedColumnCount="5" ss:ExpandedRowCount="9" x:FullColumns="1"
+ x:FullRows="1">
+ <Row>
+ <Cell><Data ss:Type="String">Numbers</Data></Cell>
+ <Cell ss:Index="3"><Data ss:Type="String">Fractions</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">Text</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="3"><Data ss:Type="Number">1.1</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">A</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="Number">2</Data></Cell>
+ <Cell ss:Index="3"><Data ss:Type="Number">1.2</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">B</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="Number">3</Data></Cell>
+ <Cell ss:Index="3"><Data ss:Type="Number">1.3</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">C</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="Number">4</Data></Cell>
+ <Cell ss:Index="3"><Data ss:Type="Number">1.4</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">D</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="Number">5</Data></Cell>
+ <Cell ss:Index="3"><Data ss:Type="Number">1.5</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">E</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="Number">6</Data></Cell>
+ <Cell ss:Index="3"><Data ss:Type="Number">1.6</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">F</Data></Cell>
+ </Row>
+ <Row ss:Index="9">
+ <Cell><Data ss:Type="String">One</Data></Cell>
+ <Cell><Data ss:Type="String">Two</Data></Cell>
+ <Cell><Data ss:Type="String">Three</Data></Cell>
+ <Cell><Data ss:Type="String">Four</Data></Cell>
+ <Cell><Data ss:Type="String">Five</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <Selected/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>9</ActiveRow>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+ <Worksheet ss:Name="2nd">
+ <Table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="1" x:FullColumns="1"
+ x:FullRows="1">
+ <Row>
+ <Cell><Data ss:Type="String">Empty Sheet</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>1</ActiveRow>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/test/xls-xml/bold-and-italic/check.txt b/test/xls-xml/bold-and-italic/check.txt
new file mode 100644
index 0000000..0524db3
--- /dev/null
+++ b/test/xls-xml/bold-and-italic/check.txt
@@ -0,0 +1,5 @@
+Sheet1/0/0:string:"Normal Text"
+Sheet1/1/0:string:"Bold Text"
+Sheet1/2/0:string:"Italic Text"
+Sheet1/3/0:string:"Bold and Italic Text"
+Sheet1/4/0:string:"Bold and Italic mixed"
diff --git a/test/xls-xml/bold-and-italic/input.xml b/test/xls-xml/bold-and-italic/input.xml
new file mode 100644
index 0000000..6900bcc
--- /dev/null
+++ b/test/xls-xml/bold-and-italic/input.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2013-06-01T20:53:09Z</Created>
+ <LastSaved>2017-03-03T22:12:09Z</LastSaved>
+ <Version>15.00</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <AllowPNG/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>12000</WindowHeight>
+ <WindowWidth>18225</WindowWidth>
+ <WindowTopX>120</WindowTopX>
+ <WindowTopY>60</WindowTopY>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ <Style ss:ID="s16">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"
+ ss:Bold="1"/>
+ </Style>
+ <Style ss:ID="s17">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"
+ ss:Italic="1"/>
+ </Style>
+ <Style ss:ID="s18">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"
+ ss:Bold="1" ss:Italic="1"/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Sheet1">
+ <Table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="5" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Column ss:AutoFitWidth="0" ss:Width="123"/>
+ <Row>
+ <Cell><Data ss:Type="String">Normal Text</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="s16"><Data ss:Type="String">Bold Text</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="s17"><Data ss:Type="String">Italic Text</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="s18"><Data ss:Type="String">Bold and Italic Text</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40"><B><Font
+ html:Color="#000000">Bold</Font></B><Font html:Color="#000000"> and </Font><I><Font
+ html:Color="#000000">Italic</Font></I><Font html:Color="#000000"> mixed</Font></ss:Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Print>
+ <ValidPrinterInfo/>
+ <HorizontalResolution>600</HorizontalResolution>
+ <VerticalResolution>600</VerticalResolution>
+ </Print>
+ <Selected/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>4</ActiveRow>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+ <Worksheet ss:Name="Sheet2">
+ <Table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="1" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+ <Worksheet ss:Name="Sheet3">
+ <Table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="1" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/test/xls-xml/borders/colors.xml b/test/xls-xml/borders/colors.xml
new file mode 100644
index 0000000..bab7dec
--- /dev/null
+++ b/test/xls-xml/borders/colors.xml
@@ -0,0 +1,109 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2018-02-07T21:56:45Z</Created>
+ <LastSaved>2018-02-07T22:02:54Z</LastSaved>
+ <Version>16.00</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <AllowPNG/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>9105</WindowHeight>
+ <WindowWidth>13800</WindowWidth>
+ <WindowTopX>0</WindowTopX>
+ <WindowTopY>0</WindowTopY>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ <Style ss:ID="s62">
+ <Borders>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"
+ ss:Color="#FF0000"/>
+ </Borders>
+ </Style>
+ <Style ss:ID="s63">
+ <Borders>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"
+ ss:Color="#0070C0"/>
+ </Borders>
+ </Style>
+ <Style ss:ID="s64">
+ <Borders>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"
+ ss:Color="#00B050"/>
+ </Borders>
+ </Style>
+ <Style ss:ID="s65">
+ <Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1"/>
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"
+ ss:Color="#FFFF00"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"
+ ss:Color="#7030A0"/>
+ <Border ss:Position="DiagonalLeft" ss:LineStyle="Continuous" ss:Weight="3"
+ ss:Color="#00B0F0"/>
+ <Border ss:Position="DiagonalRight" ss:LineStyle="Continuous" ss:Weight="3"
+ ss:Color="#00B0F0"/>
+ </Borders>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Sheet1">
+ <Table ss:ExpandedColumnCount="2" ss:ExpandedRowCount="7" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Column ss:Index="2" ss:AutoFitWidth="0" ss:Width="225.75"/>
+ <Row ss:AutoFitHeight="0"/>
+ <Row ss:Index="3" ss:AutoFitHeight="0">
+ <Cell ss:Index="2" ss:StyleID="s62"><Data ss:Type="String">Red -&gt;</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:Index="2" ss:StyleID="s63"><Data ss:Type="String">Blue -&gt;</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:Index="2" ss:StyleID="s64"><Data ss:Type="String">Green -&gt;</Data></Cell>
+ </Row>
+ <Row ss:Index="7" ss:AutoFitHeight="0" ss:Height="66.75">
+ <Cell ss:Index="2" ss:StyleID="s65"><Data ss:Type="String">&lt;- Yellow&#10;Purple -&gt;&#10;Light Blue \</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Unsynced/>
+ <Print>
+ <ValidPrinterInfo/>
+ <HorizontalResolution>600</HorizontalResolution>
+ <VerticalResolution>600</VerticalResolution>
+ </Print>
+ <Selected/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>8</ActiveRow>
+ <ActiveCol>1</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/test/xls-xml/borders/directions.xml b/test/xls-xml/borders/directions.xml
new file mode 100644
index 0000000..77be73b
--- /dev/null
+++ b/test/xls-xml/borders/directions.xml
@@ -0,0 +1,121 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2018-01-14T17:03:52Z</Created>
+ <LastSaved>2018-01-25T01:00:20Z</LastSaved>
+ <Version>16.00</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <AllowPNG/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>7680</WindowHeight>
+ <WindowWidth>20490</WindowWidth>
+ <WindowTopX>0</WindowTopX>
+ <WindowTopY>0</WindowTopY>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ <Style ss:ID="s16">
+ <Borders>
+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+ </Borders>
+ </Style>
+ <Style ss:ID="s17">
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
+ </Borders>
+ </Style>
+ <Style ss:ID="s18">
+ <Borders>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+ </Borders>
+ </Style>
+ <Style ss:ID="s19">
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+ </Borders>
+ </Style>
+ <Style ss:ID="s20">
+ <Borders>
+ <Border ss:Position="DiagonalLeft" ss:LineStyle="Continuous" ss:Weight="1"/>
+ </Borders>
+ </Style>
+ <Style ss:ID="s21">
+ <Borders>
+ <Border ss:Position="DiagonalRight" ss:LineStyle="Continuous" ss:Weight="1"/>
+ </Borders>
+ </Style>
+ <Style ss:ID="s22">
+ <Borders>
+ <Border ss:Position="DiagonalLeft" ss:LineStyle="Continuous" ss:Weight="1"/>
+ <Border ss:Position="DiagonalRight" ss:LineStyle="Continuous" ss:Weight="1"/>
+ </Borders>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Directions">
+ <Table ss:ExpandedColumnCount="2" ss:ExpandedRowCount="14" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Column ss:Index="2" ss:AutoFitWidth="0" ss:Width="92.25"/>
+ <Row ss:Index="2">
+ <Cell ss:Index="2" ss:StyleID="s16"><Data ss:Type="String">top</Data></Cell>
+ </Row>
+ <Row ss:Index="4">
+ <Cell ss:Index="2" ss:StyleID="s17"><Data ss:Type="String">left</Data></Cell>
+ </Row>
+ <Row ss:Index="6">
+ <Cell ss:Index="2" ss:StyleID="s18"><Data ss:Type="String">right</Data></Cell>
+ </Row>
+ <Row ss:Index="8">
+ <Cell ss:Index="2" ss:StyleID="s19"><Data ss:Type="String">bottom</Data></Cell>
+ </Row>
+ <Row ss:Index="10">
+ <Cell ss:Index="2" ss:StyleID="s20"><Data ss:Type="String">tl to br</Data></Cell>
+ </Row>
+ <Row ss:Index="12">
+ <Cell ss:Index="2" ss:StyleID="s21"><Data ss:Type="String">tr to bl</Data></Cell>
+ </Row>
+ <Row ss:Index="14">
+ <Cell ss:Index="2" ss:StyleID="s22"><Data ss:Type="String">cross diagonal</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Print>
+ <ValidPrinterInfo/>
+ <HorizontalResolution>600</HorizontalResolution>
+ <VerticalResolution>600</VerticalResolution>
+ </Print>
+ <Selected/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>13</ActiveRow>
+ <ActiveCol>1</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/test/xls-xml/borders/grid-box.xml b/test/xls-xml/borders/grid-box.xml
new file mode 100644
index 0000000..eca2d24
--- /dev/null
+++ b/test/xls-xml/borders/grid-box.xml
@@ -0,0 +1,237 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2013-10-07T23:59:12Z</Created>
+ <LastSaved>2013-10-08T00:01:57Z</LastSaved>
+ <Version>16.00</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <AllowPNG/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>9270</WindowHeight>
+ <WindowWidth>24915</WindowWidth>
+ <WindowTopX>480</WindowTopX>
+ <WindowTopY>120</WindowTopY>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ <Style ss:ID="s16">
+ <Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"
+ ss:Color="#FF0000"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"
+ ss:Color="#FF0000"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ </Style>
+ <Style ss:ID="s17">
+ <Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"
+ ss:Color="#FF0000"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"
+ ss:Color="#FF0000"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"
+ ss:Color="#FF0000"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ </Style>
+ <Style ss:ID="s18">
+ <Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"
+ ss:Color="#FF0000"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"
+ ss:Color="#FF0000"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ </Style>
+ <Style ss:ID="s19">
+ <Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"
+ ss:Color="#FF0000"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"
+ ss:Color="#FF0000"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"
+ ss:Color="#FF0000"/>
+ </Borders>
+ </Style>
+ <Style ss:ID="s20">
+ <Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"
+ ss:Color="#FF0000"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"
+ ss:Color="#FF0000"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"
+ ss:Color="#FF0000"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"
+ ss:Color="#FF0000"/>
+ </Borders>
+ </Style>
+ <Style ss:ID="s21">
+ <Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"
+ ss:Color="#FF0000"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"
+ ss:Color="#FF0000"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"
+ ss:Color="#FF0000"/>
+ </Borders>
+ </Style>
+ <Style ss:ID="s22">
+ <Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"
+ ss:Color="#FF0000"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"
+ ss:Color="#FF0000"/>
+ </Borders>
+ </Style>
+ <Style ss:ID="s23">
+ <Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"
+ ss:Color="#FF0000"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"
+ ss:Color="#FF0000"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"
+ ss:Color="#FF0000"/>
+ </Borders>
+ </Style>
+ <Style ss:ID="s24">
+ <Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"
+ ss:Color="#FF0000"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"
+ ss:Color="#FF0000"/>
+ </Borders>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Sheet1">
+ <Table ss:ExpandedColumnCount="6" ss:ExpandedRowCount="9" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Column ss:Index="3" ss:AutoFitWidth="0" ss:Width="69"/>
+ <Column ss:Index="6" ss:AutoFitWidth="0" ss:Width="73.5"/>
+ <Row ss:Index="2" ss:Height="15.75"/>
+ <Row ss:Height="15.75">
+ <Cell ss:Index="3" ss:StyleID="s16"><Data ss:Type="String">top left</Data></Cell>
+ <Cell ss:StyleID="s17"/>
+ <Cell ss:StyleID="s17"/>
+ <Cell ss:StyleID="s18"><Data ss:Type="String">top right</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:Index="3" ss:StyleID="s19"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s21"/>
+ </Row>
+ <Row>
+ <Cell ss:Index="3" ss:StyleID="s19"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s21"/>
+ </Row>
+ <Row>
+ <Cell ss:Index="3" ss:StyleID="s19"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s21"/>
+ </Row>
+ <Row>
+ <Cell ss:Index="3" ss:StyleID="s19"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s21"/>
+ </Row>
+ <Row ss:Height="15.75">
+ <Cell ss:Index="3" ss:StyleID="s22"><Data ss:Type="String">bottom left</Data></Cell>
+ <Cell ss:StyleID="s23"/>
+ <Cell ss:StyleID="s23"/>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">bottom right</Data></Cell>
+ </Row>
+ <Row ss:Height="15.75"/>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Print>
+ <ValidPrinterInfo/>
+ <HorizontalResolution>600</HorizontalResolution>
+ <VerticalResolution>600</VerticalResolution>
+ </Print>
+ <Zoom>196</Zoom>
+ <Selected/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>3</ActiveRow>
+ <ActiveCol>3</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+ <Worksheet ss:Name="Sheet2">
+ <Table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="1" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+ <Worksheet ss:Name="Sheet3">
+ <Table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="1" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/test/xls-xml/borders/single-cells.xml b/test/xls-xml/borders/single-cells.xml
new file mode 100644
index 0000000..49fc20e
--- /dev/null
+++ b/test/xls-xml/borders/single-cells.xml
@@ -0,0 +1,202 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2013-10-05T16:34:08Z</Created>
+ <LastSaved>2013-10-05T16:41:06Z</LastSaved>
+ <Version>16.00</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <AllowPNG/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>9270</WindowHeight>
+ <WindowWidth>24915</WindowWidth>
+ <WindowTopX>480</WindowTopX>
+ <WindowTopY>120</WindowTopY>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ <Style ss:ID="s16">
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous"/>
+ </Borders>
+ </Style>
+ <Style ss:ID="s17">
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Dot" ss:Weight="1"/>
+ <Border ss:Position="Left" ss:LineStyle="Dot" ss:Weight="1"/>
+ <Border ss:Position="Right" ss:LineStyle="Dot" ss:Weight="1"/>
+ <Border ss:Position="Top" ss:LineStyle="Dot" ss:Weight="1"/>
+ </Borders>
+ </Style>
+ <Style ss:ID="s18">
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="DashDotDot" ss:Weight="1"/>
+ <Border ss:Position="Left" ss:LineStyle="DashDotDot" ss:Weight="1"/>
+ <Border ss:Position="Right" ss:LineStyle="DashDotDot" ss:Weight="1"/>
+ <Border ss:Position="Top" ss:LineStyle="DashDotDot" ss:Weight="1"/>
+ </Borders>
+ </Style>
+ <Style ss:ID="s19">
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="DashDot" ss:Weight="1"/>
+ <Border ss:Position="Left" ss:LineStyle="DashDot" ss:Weight="1"/>
+ <Border ss:Position="Right" ss:LineStyle="DashDot" ss:Weight="1"/>
+ <Border ss:Position="Top" ss:LineStyle="DashDot" ss:Weight="1"/>
+ </Borders>
+ </Style>
+ <Style ss:ID="s20">
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Dash" ss:Weight="1"/>
+ <Border ss:Position="Left" ss:LineStyle="Dash" ss:Weight="1"/>
+ <Border ss:Position="Right" ss:LineStyle="Dash" ss:Weight="1"/>
+ <Border ss:Position="Top" ss:LineStyle="Dash" ss:Weight="1"/>
+ </Borders>
+ </Style>
+ <Style ss:ID="s21">
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+ </Borders>
+ </Style>
+ <Style ss:ID="s22">
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="DashDotDot" ss:Weight="2"/>
+ <Border ss:Position="Left" ss:LineStyle="DashDotDot" ss:Weight="2"/>
+ <Border ss:Position="Right" ss:LineStyle="DashDotDot" ss:Weight="2"/>
+ <Border ss:Position="Top" ss:LineStyle="DashDotDot" ss:Weight="2"/>
+ </Borders>
+ </Style>
+ <Style ss:ID="s23">
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="SlantDashDot" ss:Weight="2"/>
+ <Border ss:Position="Left" ss:LineStyle="SlantDashDot" ss:Weight="2"/>
+ <Border ss:Position="Right" ss:LineStyle="SlantDashDot" ss:Weight="2"/>
+ <Border ss:Position="Top" ss:LineStyle="SlantDashDot" ss:Weight="2"/>
+ </Borders>
+ </Style>
+ <Style ss:ID="s24">
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="DashDot" ss:Weight="2"/>
+ <Border ss:Position="Left" ss:LineStyle="DashDot" ss:Weight="2"/>
+ <Border ss:Position="Right" ss:LineStyle="DashDot" ss:Weight="2"/>
+ <Border ss:Position="Top" ss:LineStyle="DashDot" ss:Weight="2"/>
+ </Borders>
+ </Style>
+ <Style ss:ID="s25">
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Dash" ss:Weight="2"/>
+ <Border ss:Position="Left" ss:LineStyle="Dash" ss:Weight="2"/>
+ <Border ss:Position="Right" ss:LineStyle="Dash" ss:Weight="2"/>
+ <Border ss:Position="Top" ss:LineStyle="Dash" ss:Weight="2"/>
+ </Borders>
+ </Style>
+ <Style ss:ID="s26">
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="2"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="2"/>
+ </Borders>
+ </Style>
+ <Style ss:ID="s27">
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ </Style>
+ <Style ss:ID="s28">
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Double" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Double" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Double" ss:Weight="3"/>
+ <Border ss:Position="Top" ss:LineStyle="Double" ss:Weight="3"/>
+ </Borders>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Borders">
+ <Table ss:ExpandedColumnCount="4" ss:ExpandedRowCount="15" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Row ss:Height="15.75"/>
+ <Row ss:Height="15.75">
+ <Cell ss:Index="4" ss:StyleID="s22"><Data ss:Type="Number">7</Data></Cell>
+ </Row>
+ <Row ss:Height="15.75"/>
+ <Row ss:Height="15.75">
+ <Cell ss:Index="2" ss:StyleID="s16"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="Number">8</Data></Cell>
+ </Row>
+ <Row ss:Height="15.75"/>
+ <Row ss:Height="15.75">
+ <Cell ss:Index="2" ss:StyleID="s17"><Data ss:Type="Number">2</Data></Cell>
+ <Cell ss:Index="4" ss:StyleID="s24"><Data ss:Type="Number">9</Data></Cell>
+ </Row>
+ <Row ss:Height="15.75"/>
+ <Row ss:Height="15.75">
+ <Cell ss:Index="2" ss:StyleID="s18"><Data ss:Type="Number">3</Data></Cell>
+ <Cell ss:Index="4" ss:StyleID="s25"><Data ss:Type="Number">10</Data></Cell>
+ </Row>
+ <Row ss:Height="15.75"/>
+ <Row ss:Height="15.75">
+ <Cell ss:Index="2" ss:StyleID="s19"><Data ss:Type="Number">4</Data></Cell>
+ <Cell ss:Index="4" ss:StyleID="s26"><Data ss:Type="Number">11</Data></Cell>
+ </Row>
+ <Row ss:Height="15.75"/>
+ <Row ss:Height="16.5">
+ <Cell ss:Index="2" ss:StyleID="s20"><Data ss:Type="Number">5</Data></Cell>
+ <Cell ss:Index="4" ss:StyleID="s27"><Data ss:Type="Number">12</Data></Cell>
+ </Row>
+ <Row ss:Height="16.5"/>
+ <Row ss:Height="16.5">
+ <Cell ss:Index="2" ss:StyleID="s21"><Data ss:Type="Number">6</Data></Cell>
+ <Cell ss:Index="4" ss:StyleID="s28"><Data ss:Type="Number">13</Data></Cell>
+ </Row>
+ <Row ss:Height="15.75"/>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Print>
+ <ValidPrinterInfo/>
+ <HorizontalResolution>600</HorizontalResolution>
+ <VerticalResolution>600</VerticalResolution>
+ </Print>
+ <Selected/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>1</ActiveRow>
+ <ActiveCol>5</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/test/xls-xml/cell-properties/default-style.xml b/test/xls-xml/cell-properties/default-style.xml
new file mode 100644
index 0000000..f00b110
--- /dev/null
+++ b/test/xls-xml/cell-properties/default-style.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2022-09-08T03:01:50Z</Created>
+ <Version>16.00</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <AllowPNG/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>12315</WindowHeight>
+ <WindowWidth>28800</WindowWidth>
+ <WindowTopX>32767</WindowTopX>
+ <WindowTopY>32767</WindowTopY>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Dot" ss:Weight="1"/>
+ </Borders>
+ <Font ss:FontName="DejaVu Sans" x:Family="Swiss" ss:Size="12" ss:Color="#000000"/>
+ <Interior ss:Color="#E2EFDA" ss:Pattern="Solid"/>
+ <NumberFormat ss:Format="0.0000"/>
+ <Protection x:HideFormula="1"/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Sheet1">
+ <Table ss:ExpandedColumnCount="7" ss:ExpandedRowCount="6" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultColumnWidth="68.25" ss:DefaultRowHeight="15.75">
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="String">A1</Data></Cell>
+ <Cell><Data ss:Type="String">B1</Data></Cell>
+ <Cell><Data ss:Type="String">C1</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="String">A2</Data></Cell>
+ <Cell><Data ss:Type="String">B2</Data></Cell>
+ <Cell><Data ss:Type="String">C2</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="String">A3</Data></Cell>
+ <Cell><Data ss:Type="String">B3</Data></Cell>
+ <Cell><Data ss:Type="String">C3</Data></Cell>
+ </Row>
+ <Row ss:Index="5" ss:AutoFitHeight="0">
+ <Cell ss:Index="5"><Data ss:Type="String">E5</Data></Cell>
+ <Cell><Data ss:Type="String">F5</Data></Cell>
+ <Cell><Data ss:Type="String">G5</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:Index="5"><Data ss:Type="String">E6</Data></Cell>
+ <Cell><Data ss:Type="String">F6</Data></Cell>
+ <Cell><Data ss:Type="String">G6</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Unsynced/>
+ <Print>
+ <ValidPrinterInfo/>
+ <VerticalResolution>0</VerticalResolution>
+ </Print>
+ <Selected/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>5</ActiveRow>
+ <ActiveCol>4</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/test/xls-xml/cell-properties/locked-and-hidden.xml b/test/xls-xml/cell-properties/locked-and-hidden.xml
new file mode 100644
index 0000000..7b85e45
--- /dev/null
+++ b/test/xls-xml/cell-properties/locked-and-hidden.xml
@@ -0,0 +1,83 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2022-09-13T23:36:16Z</Created>
+ <Version>16.00</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <AllowPNG/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>12315</WindowHeight>
+ <WindowWidth>28800</WindowWidth>
+ <WindowTopX>32767</WindowTopX>
+ <WindowTopY>32767</WindowTopY>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ <Style ss:ID="s63">
+ <Alignment ss:Vertical="Bottom" ss:WrapText="1"/>
+ <Protection ss:Protected="0"/>
+ </Style>
+ <Style ss:ID="s64">
+ <Alignment ss:Vertical="Bottom" ss:WrapText="1"/>
+ <Protection x:HideFormula="1"/>
+ </Style>
+ <Style ss:ID="s65">
+ <Alignment ss:Vertical="Bottom" ss:WrapText="1"/>
+ <Protection x:HideFormula="1" ss:Protected="0"/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Sheet1">
+ <Table ss:ExpandedColumnCount="2" ss:ExpandedRowCount="2" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Column ss:Width="205.5"/>
+ <Column ss:AutoFitWidth="0" ss:Width="132"/>
+ <Row ss:Height="30">
+ <Cell><Data ss:Type="String">Default (Should be locked but not hidden)</Data></Cell>
+ <Cell ss:StyleID="s63"><Data ss:Type="String">Not Locked and not hidden</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="s64"><Data ss:Type="String">Locked and hidden</Data></Cell>
+ <Cell ss:StyleID="s65"><Data ss:Type="String">Not locked and hidden</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Print>
+ <ValidPrinterInfo/>
+ <VerticalResolution>0</VerticalResolution>
+ </Print>
+ <Selected/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>1</ActiveRow>
+ <ActiveCol>1</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/test/xls-xml/cell-properties/wrap-and-shrink.xml b/test/xls-xml/cell-properties/wrap-and-shrink.xml
new file mode 100644
index 0000000..429110c
--- /dev/null
+++ b/test/xls-xml/cell-properties/wrap-and-shrink.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2022-05-18T00:46:32Z</Created>
+ <LastSaved>2022-05-18T01:44:54Z</LastSaved>
+ <Version>16.00</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <AllowPNG/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>15990</WindowHeight>
+ <WindowWidth>29040</WindowWidth>
+ <WindowTopX>32767</WindowTopX>
+ <WindowTopY>32767</WindowTopY>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ <Style ss:ID="s16">
+ <Alignment ss:Vertical="Bottom" ss:WrapText="1"/>
+ </Style>
+ <Style ss:ID="s17">
+ <Alignment ss:Vertical="Bottom" ss:ShrinkToFit="1"/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Sheet1">
+ <Table ss:ExpandedColumnCount="2" ss:ExpandedRowCount="3" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Column ss:AutoFitWidth="0" ss:Width="85.5"/>
+ <Column ss:AutoFitWidth="0" ss:Width="88.5"/>
+ <Row>
+ <Cell><Data ss:Type="String">Default</Data></Cell>
+ <Cell><Data ss:Type="String">Text long enough to spill over</Data></Cell>
+ </Row>
+ <Row ss:Height="30">
+ <Cell><Data ss:Type="String">Wrap text</Data></Cell>
+ <Cell ss:StyleID="s16"><Data ss:Type="String">Text long enough to spill over</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Shrink to fit</Data></Cell>
+ <Cell ss:StyleID="s17"><Data ss:Type="String">Text long enough to spill over</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Print>
+ <ValidPrinterInfo/>
+ <VerticalResolution>0</VerticalResolution>
+ </Print>
+ <Selected/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>9</ActiveRow>
+ <ActiveCol>14</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/test/xls-xml/character-set/input.xml b/test/xls-xml/character-set/input.xml
new file mode 100644
index 0000000..bb0f4c0
--- /dev/null
+++ b/test/xls-xml/character-set/input.xml
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="windows-1252"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2013-06-15T21:47:21Z</Created>
+ <Company>SUSE</Company>
+ <Version>10.2625</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <DownloadComponents/>
+ <LocationOfComponents HRef="file:///D:\"/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>9525</WindowHeight>
+ <WindowWidth>14355</WindowWidth>
+ <WindowTopX>240</WindowTopX>
+ <WindowTopY>30</WindowTopY>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Data">
+ <Table ss:ExpandedColumnCount="5" ss:ExpandedRowCount="9" x:FullColumns="1"
+ x:FullRows="1">
+ <Row>
+ <Cell><Data ss:Type="String">Numbers</Data></Cell>
+ <Cell ss:Index="3"><Data ss:Type="String">Fractions</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">Text</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="3"><Data ss:Type="Number">1.1</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">A</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="Number">2</Data></Cell>
+ <Cell ss:Index="3"><Data ss:Type="Number">1.2</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">B</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="Number">3</Data></Cell>
+ <Cell ss:Index="3"><Data ss:Type="Number">1.3</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">C</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="Number">4</Data></Cell>
+ <Cell ss:Index="3"><Data ss:Type="Number">1.4</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">D</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="Number">5</Data></Cell>
+ <Cell ss:Index="3"><Data ss:Type="Number">1.5</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">E</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="Number">6</Data></Cell>
+ <Cell ss:Index="3"><Data ss:Type="Number">1.6</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">F</Data></Cell>
+ </Row>
+ <Row ss:Index="9">
+ <Cell><Data ss:Type="String">One</Data></Cell>
+ <Cell><Data ss:Type="String">Two</Data></Cell>
+ <Cell><Data ss:Type="String">Three</Data></Cell>
+ <Cell><Data ss:Type="String">Four</Data></Cell>
+ <Cell><Data ss:Type="String">Five</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <Selected/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>9</ActiveRow>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+ <Worksheet ss:Name="2nd">
+ <Table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="1" x:FullColumns="1"
+ x:FullRows="1">
+ <Row>
+ <Cell><Data ss:Type="String">Empty Sheet</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>1</ActiveRow>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/test/xls-xml/colored-text/check.txt b/test/xls-xml/colored-text/check.txt
new file mode 100644
index 0000000..b06bc36
--- /dev/null
+++ b/test/xls-xml/colored-text/check.txt
@@ -0,0 +1,13 @@
+ColoredText/0/0:string:"Standard colors (all cells)"
+ColoredText/0/1:string:"Standard colors (mixed)"
+ColoredText/1/0:string:"Dark Red"
+ColoredText/1/1:string:"Red and Blue"
+ColoredText/2/0:string:"Red"
+ColoredText/3/0:string:"Orange"
+ColoredText/4/0:string:"Yellow"
+ColoredText/5/0:string:"Light Green"
+ColoredText/6/0:string:"Green"
+ColoredText/7/0:string:"Light Blue"
+ColoredText/8/0:string:"Blue"
+ColoredText/9/0:string:"Dark Blue"
+ColoredText/10/0:string:"Purple"
diff --git a/test/xls-xml/colored-text/input.xml b/test/xls-xml/colored-text/input.xml
new file mode 100644
index 0000000..bc28b2e
--- /dev/null
+++ b/test/xls-xml/colored-text/input.xml
@@ -0,0 +1,136 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2013-10-13T20:22:59Z</Created>
+ <LastSaved>2013-10-13T20:37:20Z</LastSaved>
+ <Version>15.00</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <AllowPNG/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>9270</WindowHeight>
+ <WindowWidth>24915</WindowWidth>
+ <WindowTopX>480</WindowTopX>
+ <WindowTopY>120</WindowTopY>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ <Style ss:ID="s16">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#FF0000"/>
+ </Style>
+ <Style ss:ID="s17">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#C00000"/>
+ </Style>
+ <Style ss:ID="s18">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#92D050"/>
+ </Style>
+ <Style ss:ID="s19">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"
+ ss:Bold="1"/>
+ </Style>
+ <Style ss:ID="s20">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#FFC000"/>
+ </Style>
+ <Style ss:ID="s21">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#FFFF00"/>
+ </Style>
+ <Style ss:ID="s22">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#00B050"/>
+ </Style>
+ <Style ss:ID="s23">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#00B0F0"/>
+ </Style>
+ <Style ss:ID="s24">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#0070C0"/>
+ </Style>
+ <Style ss:ID="s25">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#002060"/>
+ </Style>
+ <Style ss:ID="s26">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#7030A0"/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="ColoredText">
+ <Table ss:ExpandedColumnCount="2" ss:ExpandedRowCount="11" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Column ss:AutoFitWidth="0" ss:Width="141"/>
+ <Column ss:AutoFitWidth="0" ss:Width="123"/>
+ <Row>
+ <Cell ss:StyleID="s19"><Data ss:Type="String">Standard colors (all cells)</Data></Cell>
+ <Cell ss:StyleID="s19"><Data ss:Type="String">Standard colors (mixed)</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="s17"><Data ss:Type="String">Dark Red</Data></Cell>
+ <Cell><ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40"><Font
+ html:Color="#FF0000">Red</Font><Font html:Color="#000000"> and </Font><Font
+ html:Color="#0070C0">Blue</Font></ss:Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="s16"><Data ss:Type="String">Red</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="s20"><Data ss:Type="String">Orange</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="s21"><Data ss:Type="String">Yellow</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="s18"><Data ss:Type="String">Light Green</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">Green</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="s23"><Data ss:Type="String">Light Blue</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Blue</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Dark Blue</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="s26"><Data ss:Type="String">Purple</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Print>
+ <ValidPrinterInfo/>
+ <HorizontalResolution>600</HorizontalResolution>
+ <VerticalResolution>600</VerticalResolution>
+ </Print>
+ <Selected/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>2</ActiveRow>
+ <ActiveCol>1</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/test/xls-xml/column-width-row-height/input.xml b/test/xls-xml/column-width-row-height/input.xml
new file mode 100644
index 0000000..a8fed06
--- /dev/null
+++ b/test/xls-xml/column-width-row-height/input.xml
@@ -0,0 +1,140 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2013-04-16T23:00:57Z</Created>
+ <LastSaved>2013-04-16T23:09:17Z</LastSaved>
+ <Company>Novell, Inc.</Company>
+ <Version>16.00</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <AllowPNG/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>12315</WindowHeight>
+ <WindowWidth>28800</WindowWidth>
+ <WindowTopX>32767</WindowTopX>
+ <WindowTopY>32767</WindowTopY>
+ <ActiveSheet>1</ActiveSheet>
+ <Iteration/>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Sheet1">
+ <Table ss:ExpandedColumnCount="12" ss:ExpandedRowCount="14" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Column ss:AutoFitWidth="0" ss:Width="93"/>
+ <Column ss:AutoFitWidth="0" ss:Width="56.25"/>
+ <Column ss:AutoFitWidth="0" ss:Width="82.5"/>
+ <Column ss:AutoFitWidth="0" ss:Width="108.75"/>
+ <Column ss:Index="6" ss:AutoFitWidth="0" ss:Width="66.75" ss:Span="2"/>
+ <Column ss:Index="11" ss:AutoFitWidth="0" ss:Width="119.25" ss:Span="1"/>
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="String">Column Width</Data></Cell>
+ <Cell><Data ss:Type="Number">10</Data></Cell>
+ <Cell><Data ss:Type="Number">15</Data></Cell>
+ <Cell><Data ss:Type="Number">20</Data></Cell>
+ <Cell ss:Index="6"><Data ss:Type="Number">12</Data></Cell>
+ <Cell><Data ss:Type="Number">12</Data></Cell>
+ <Cell><Data ss:Type="Number">12</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="Number">22</Data></Cell>
+ <Cell><Data ss:Type="Number">22</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="String">Row Height</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="20.0625">
+ <Cell><Data ss:Type="Number">20</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="30">
+ <Cell><Data ss:Type="Number">30</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="39.9375">
+ <Cell><Data ss:Type="Number">40</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="50.0625">
+ <Cell><Data ss:Type="Number">50</Data></Cell>
+ </Row>
+ <Row ss:Index="8" ss:AutoFitHeight="0" ss:Height="24.9375">
+ <Cell><Data ss:Type="Number">25</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="24.9375">
+ <Cell><Data ss:Type="Number">25</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="24.9375">
+ <Cell><Data ss:Type="Number">25</Data></Cell>
+ </Row>
+ <Row ss:Index="13" ss:AutoFitHeight="0" ss:Height="35.0625">
+ <Cell><Data ss:Type="Number">35</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="35.0625">
+ <Cell><Data ss:Type="Number">35</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Unsynced/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>2</ActiveRow>
+ <RangeSelection>R3</RangeSelection>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+ <Worksheet ss:Name="Sheet2">
+ <Table ss:ExpandedColumnCount="4" ss:ExpandedRowCount="5" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Column ss:AutoFitWidth="0" ss:Width="93"/>
+ <Column ss:AutoFitWidth="0" ss:Width="119.25"/>
+ <Column ss:Index="4" ss:AutoFitWidth="0" ss:Width="234.75"/>
+ <Row>
+ <Cell><Data ss:Type="String">Column Width</Data></Cell>
+ <Cell><Data ss:Type="Number">22</Data></Cell>
+ <Cell ss:Index="4"><Data ss:Type="Number">44</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Row Height</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="39.9375">
+ <Cell><Data ss:Type="Number">40</Data></Cell>
+ </Row>
+ <Row ss:Index="5" ss:AutoFitHeight="0" ss:Height="60">
+ <Cell><Data ss:Type="Number">60</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Selected/>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/test/xls-xml/date-time/input.xml b/test/xls-xml/date-time/input.xml
new file mode 100644
index 0000000..586ce0f
--- /dev/null
+++ b/test/xls-xml/date-time/input.xml
@@ -0,0 +1,86 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2016-12-17T20:02:43Z</Created>
+ <LastSaved>2016-12-17T20:26:26Z</LastSaved>
+ <Version>15.00</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <AllowPNG/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>14385</WindowHeight>
+ <WindowWidth>24000</WindowWidth>
+ <WindowTopX>0</WindowTopX>
+ <WindowTopY>0</WindowTopY>
+ <RefModeR1C1/>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ <Style ss:ID="s62">
+ <NumberFormat ss:Format="Short Date"/>
+ </Style>
+ <Style ss:ID="s63">
+ <NumberFormat ss:Format="General Date"/>
+ </Style>
+ <Style ss:ID="s65">
+ <NumberFormat ss:Format="yyyy\-mm\-dd\ hh:mm:ss.000"/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Sheet1">
+ <Table ss:ExpandedColumnCount="8" ss:ExpandedRowCount="24" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Column ss:Width="139.5"/>
+ <Column ss:AutoFitWidth="0" ss:Width="127.5"/>
+ <Column ss:Index="7" ss:AutoFitWidth="0" ss:Width="102"/>
+ <Row>
+ <Cell><Data ss:Type="String">Date</Data></Cell>
+ <Cell ss:StyleID="s62"><Data ss:Type="DateTime">2016-12-14T00:00:00.000</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Date Time</Data></Cell>
+ <Cell ss:StyleID="s63"><Data ss:Type="DateTime">2002-02-03T12:34:45.000</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Date Time with Milliseconds</Data></Cell>
+ <Cell ss:StyleID="s65"><Data ss:Type="DateTime">1992-03-04T08:34:33.555</Data></Cell>
+ </Row>
+ <Row ss:Index="24">
+ <Cell ss:Index="7" ss:StyleID="s62"/>
+ <Cell ss:StyleID="s62"/>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Selected/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>3</ActiveRow>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/test/xls-xml/double-bom/input.xml b/test/xls-xml/double-bom/input.xml
new file mode 100644
index 0000000..62c554e
--- /dev/null
+++ b/test/xls-xml/double-bom/input.xml
@@ -0,0 +1,58050 @@
+<?xml version="1.0"?>
+<ss:Workbook xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
+<ss:Styles>
+<ss:Style ss:ID="Default">
+<ss:Alignment ss:Horizontal="Left"/>
+</ss:Style>
+<ss:Style ss:ID="wraptext">
+<ss:Alignment ss:Horizontal="Left" ss:WrapText="1"/>
+<ss:Font ss:Italic="1"/>
+</ss:Style>
+<ss:Style ss:ID="disclaimer">
+<ss:Alignment ss:Vertical="Top" ss:WrapText="1"/>
+</ss:Style>
+<ss:Style ss:ID="DefaultHyperlink">
+<ss:Alignment ss:Vertical="Center" ss:WrapText="1"/>
+<ss:Font ss:Color="#0000FF" ss:Underline="Single" />
+</ss:Style>
+<ss:Style ss:ID="headerstyle">
+<ss:Font ss:Bold="1" />
+</ss:Style>
+<ss:Style ss:ID="Date">
+<ss:NumberFormat ss:Format="dd\-mmm\-yyyy"/>
+</ss:Style>
+<ss:Style ss:ID="Left">
+<ss:Alignment ss:Horizontal="Left"/>
+<ss:NumberFormat ss:Format="Standard"/>
+</ss:Style>
+<ss:Style ss:ID="Right">
+<ss:Alignment ss:Horizontal="Right"/>
+<ss:NumberFormat ss:Format="Standard"/>
+</ss:Style>
+</ss:Styles>
+<ss:Worksheet ss:Name="Holdings">
+<ss:Table>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Jul-2022</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">iShares Core SPI® ETF (CH)</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell>
+<ss:Data ss:Type="String">Inception Date</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Apr-2014</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell>
+<ss:Data ss:Type="String">Fund Holdings as of</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Jul-2022</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell>
+<ss:Data ss:Type="String">Number of Securities</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="String">212.00</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell>
+<ss:Data ss:Type="String">Shares Outstanding</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="String">17,625,000.00</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell>
+<ss:Data ss:Type="String"></ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="headerstyle">
+<ss:Data ss:Type="String">Issuer Ticker</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="headerstyle">
+<ss:Data ss:Type="String">Name</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="headerstyle">
+<ss:Data ss:Type="String">Sector</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="headerstyle">
+<ss:Data ss:Type="String">Asset Class</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="headerstyle">
+<ss:Data ss:Type="String">Market Value</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="headerstyle">
+<ss:Data ss:Type="String">Weight (%)</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="headerstyle">
+<ss:Data ss:Type="String">Notional Value</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="headerstyle">
+<ss:Data ss:Type="String">Nominal</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="headerstyle">
+<ss:Data ss:Type="String">Price</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="headerstyle">
+<ss:Data ss:Type="String">Location</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="headerstyle">
+<ss:Data ss:Type="String">Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="headerstyle">
+<ss:Data ss:Type="String">Market Currency</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">NESN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">NESTLE SA</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Consumer Staples</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">490308545.66</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">20.81208</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">490308545.66</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4336711</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.06</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ROG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ROCHE HOLDING PAR AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Health Care</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">350356371.3</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14.87154</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">350356371.3</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1082349</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">323.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">NOVN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">NOVARTIS AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Health Care</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">300027349.54</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12.73523</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">300027349.54</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3703127</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">81.02</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ZURN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ZURICH INSURANCE GROUP AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">95145479.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4.03863</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">95145479.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">231949</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">410.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CFR</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">COMPAGNIE FINANCIERE RICHEMONT SA</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Consumer Discretionary</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">81231361.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3.44802</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">81231361.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">805068</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.9</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">UBSG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">UBS GROUP AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">76397775</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3.24285</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">76397775</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5093185</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ABBN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ABB LTD</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">64589117.3</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2.74161</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">64589117.3</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2501515</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">25.82</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">LONN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">LONZA GROUP AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Health Care</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">62907165</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2.67021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">62907165</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114585</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">549</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ALC</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ALCON AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Health Care</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">52534800.64</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2.22994</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">52534800.64</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">768952</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">68.32</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIKA</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIKA AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Materials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">51326045.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2.17863</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">51326045.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">236853</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">216.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">GIVN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">GIVAUDAN SA</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Materials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">39415377</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1.67306</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">39415377</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12237</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3221</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">HOLN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">HOLCIM LTD AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Materials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">35127978.9</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1.49107</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">35127978.9</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">868215</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">40.46</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SREN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SWISS RE AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">31723756.56</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1.34658</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">31723756.56</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">444684</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">71.34</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">PGHN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">PARTNERS GROUP HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">30024320</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1.27444</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">30024320</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">34912</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">860</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SOON</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SONOVA HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Health Care</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">26108372</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1.10822</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">26108372</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">81208</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">321.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">GEBN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">GEBERIT AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">25687351.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1.09035</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">25687351.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">55206</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">465.3</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF CASH</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Cash and/or Derivatives</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Cash</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">24011147.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1.0192</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">24011147.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">24011148</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SLHN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SWISS LIFE HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">22783583.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.96709</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">22783583.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">48517</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">469.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">STMN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">STRAUMANN HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Health Care</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">20536659</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.87172</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">20536659</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">173745</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SCMN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SWISSCOM AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Communication</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">20528550</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.87137</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">20528550</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">39102</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">525</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SGSN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SGS SA</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">20446412</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.86789</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">20446412</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9332</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2191</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">KNIN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">KUEHNE UND NAGEL INTERNATIONAL AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">20237130.9</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.859</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">20237130.9</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">87493</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">231.3</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CSGN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CREDIT SUISSE GROUP AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">19790859.16</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.84006</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">19790859.16</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3874483</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5.11</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">LISN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHOCOLADEFABRIKEN LINDT &amp; SPRUENGL</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Consumer Staples</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.71311</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">168</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">LISP</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHOCOLADEFABRIKEN LINDT &amp; SPRUENGL</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Consumer Staples</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16090480</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.68299</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16090480</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1652</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9740</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">RO</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ROCHE HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Health Care</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15753815</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.6687</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15753815</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">40919</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">385</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BAER</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">JULIUS BAER GRUPPE AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14557790.61</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.61793</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14557790.61</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">341973</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">42.57</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">LOGN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">LOGITECH INTERNATIONAL SA</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Information Technology</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13643420.54</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.57912</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13643420.54</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">267623</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">50.98</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIGN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIG GROUP N AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Materials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12136105.02</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.51514</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12136105.02</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">536521</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">22.62</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SCHP</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SCHINDLER HOLDING PAR AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11333267.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.48106</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11333267.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">62684</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">180.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BARN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BARRY CALLEBAUT AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Consumer Staples</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11315486</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.48031</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11315486</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5509</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2054</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BALN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BALOISE HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10734469.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.45565</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10734469.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">70668</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.9</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">UHR</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">THE SWATCH GROUP AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Consumer Discretionary</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10459399</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.44397</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10459399</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">44794</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">233.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SPSN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SWISS PRIME SITE AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Real Estate</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9993108.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.42418</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9993108.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118683</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">84.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">VACN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">VAT GROUP AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9615169.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.40813</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9615169.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">41409</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">232.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ADEN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ADECCO GROUP AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8381045.12</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.35575</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8381045.12</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">262976</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">31.87</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">TEMN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">TEMENOS AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Information Technology</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7728651.96</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.32806</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7728651.96</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103269</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">74.84</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">PSPN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">PSP SWISS PROPERTY AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Real Estate</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7593477.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.32232</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7593477.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">70637</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">EMSN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">EMS-CHEMIE HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Materials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7298287</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.30979</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7298287</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10471</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">697</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">TECN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">TECAN GROUP AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Health Care</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6194232</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.26293</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6194232</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">19602</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">316</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">GF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">GEORG FISCHER AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5970355.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.25342</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5970355.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126330</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">47.26</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">GALE</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">GALENICA AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Health Care</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5917481.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.25118</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5917481.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">77151</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">76.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CLN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CLARIANT AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Materials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5810821.77</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.24665</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5810821.77</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">346501</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16.77</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">HELN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">HELVETIA HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5792215.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.24586</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5792215.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">53831</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SCHN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SCHINDLER HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5643240</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.23954</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5643240</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">31775</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">177.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BEAN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BELIMO N AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5389901</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.22878</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5389901</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15334</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">351.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BION</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BB BIOTECH AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Health Care</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4951077</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.21016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4951077</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">86861</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">57</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">DKSH</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">DKSH HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4509397.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.19141</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4509397.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">55364</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">81.45</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">FHZN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">FLUGHAFEN ZUERICH AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4346050.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.18448</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4346050.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">28993</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149.9</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SFZN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIEGFRIED HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Health Care</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4210708.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.17873</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4210708.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6483</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">649.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ALLN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ALLREAL HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Real Estate</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3798772</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.16125</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3798772</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">24196</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">UHRN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">THE SWATCH GROUP AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Consumer Discretionary</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3680294.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.15622</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3680294.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">85192</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">43.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BCVN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BC VAUD N</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3624730.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.15386</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3624730.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">44258</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">81.9</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BUCN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BUCHER INDUSTRIES AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3354009.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.14237</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3354009.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10176</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">329.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">DUFN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">DUFRY AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Consumer Discretionary</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3352965</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.14232</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3352965</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101605</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">33</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CMBN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CEMBRA MONEY BANK AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3344524.75</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.14196</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3344524.75</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">46291</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">72.25</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BKW</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BKW N AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Utilities</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3169106.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.13452</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3169106.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">30649</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">AMS</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">AMS-OSRAM AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Information Technology</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3152889.55</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.13383</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3152889.55</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">430135</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7.33</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SFSN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SFS GROUP AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3139073.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.13324</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3139073.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">32563</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">96.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">EMMN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">EMMI AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Consumer Staples</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3042475</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.12914</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3042475</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3275</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">929</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BANB</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BACHEM HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Health Care</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2785535.35</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.11824</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2785535.35</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">48151</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">57.85</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">MOBN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">MOBIMO HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Real Estate</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2681819</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.11383</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2681819</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11221</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">239</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SRAIL</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">STADLER RAIL AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2669569.28</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.11331</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2669569.28</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">89824</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">29.72</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">VONN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">VONTOBEL HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2630524.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.11166</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2630524.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">43408</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">60.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">INRN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">INTERROLL HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2396940</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.10174</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2396940</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1092</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2195</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">DAE</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">DAETWYLER HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2289476</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.09718</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2289476</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11681</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">196</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">F-GSI</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CASH COLLATERAL CHF F-GSI</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Cash and/or Derivatives</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Cash Collateral and Margins</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2219000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.09419</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2219000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2219000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">IFCN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">INFICON HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Information Technology</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2124570</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.09018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2124570</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2814</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">755</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">OERL</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">OC OERLIKON CORPORATION AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2098489.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.08907</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2098489.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">317953</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">LUKN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">LUZERNER KTBANK AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2091579</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.08878</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2091579</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5089</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">411</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">FORN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">FORBO HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Consumer Discretionary</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2087720</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.08862</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2087720</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1558</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1340</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">HUBN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">HUBER &amp; SUHNER AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2073398.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.08801</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2073398.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">26548</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">78.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">IDIA</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">IDORSIA N LTD</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Health Care</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2070547.38</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.08789</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2070547.38</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">169578</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12.21</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">VATN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">VALIANT HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2063225.3</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.08758</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2063225.3</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">24533</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">84.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SGKN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ST.GALLER KANTONALBANK AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1960416</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.08321</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1960416</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4538</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">432</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">DOKA</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">DORMAKABA HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1933016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.08205</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1933016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4559</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">424</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SWON</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SOFTWAREONE HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Information Technology</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1928133.9</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.08184</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1928133.9</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">166938</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11.55</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ALSN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ALSO HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Information Technology</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1924281.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.08168</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1924281.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9699</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">198.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">GRKP</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">GRAUBUNDNER KANTONALBANK PAR</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1847580</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.07842</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1847580</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1162</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1590</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BCHN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BURCKHARDT COMPRESSION HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1832600</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.07779</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1832600</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4675</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">392</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">COTN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">COMET HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Information Technology</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1769755.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.07512</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1769755.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12072</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">VZN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">VZ HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1731768</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.07351</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1731768</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">24460</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">70.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">LAND</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">LANDIS+GYR GROUP AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Information Technology</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1719508.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.07299</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1719508.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">33004</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">52.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">MBTN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">MEYER BURGER TECHNOLOGY AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Information Technology</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1694614.47</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.07193</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1694614.47</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3784311</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.45</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ARYN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ARYZTA AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Consumer Staples</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1692570.07</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.07184</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1692570.07</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1547139</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1.09</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SENS</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SENSIRION HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Information Technology</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1658719.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.07041</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1658719.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16943</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.9</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SQN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SWISSQUOTE GROUP HOLDING SA</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1656760.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.07032</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1656760.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16676</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.35</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BYS</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BYSTRONIC AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1634346</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.06937</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1634346</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2289</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">714</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ZUGER</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ZUGER KANTONALBANK</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1559400</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.06619</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1559400</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">226</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6900</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BOSN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BOSSARD HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1558425.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.06615</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1558425.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8544</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">182.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BEKN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BERNER KANTONALBANK AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1542610</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.06548</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1542610</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7060</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">218.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SUN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SULZER AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1536033.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.0652</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1536033.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">26552</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">57.85</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">VALN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">VALORA HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Consumer Discretionary</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1488144</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.06317</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1488144</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5768</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">258</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">LEHN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">LEM HOLDING SA</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Information Technology</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1456612</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.06183</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1456612</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">866</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1682</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SWTQ</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SCHWEITER TECHNOLOGIES AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1442238</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.06122</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1442238</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1493</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">966</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">KARN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">KARDEX HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1440720</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.06115</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1440720</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9200</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">KOMN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">KOMAX HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1335412.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.05668</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1335412.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5975</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">223.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">UBXN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">U-BLOX HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Information Technology</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1226932</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.05208</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1226932</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10577</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">MOZN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">MOBILEZONE HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Consumer Discretionary</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1099860.38</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.04669</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1099860.38</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">66497</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16.54</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ISN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">INTERSHOP HOLDING N AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Real Estate</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1088000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.04618</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1088000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1700</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">640</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ARBN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ARBONIA AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1085913.92</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.04609</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1085913.92</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">87152</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12.46</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">EFGN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">EFG INTERNATIONAL AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1056292.65</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.04484</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1056292.65</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150255</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7.03</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ROSE</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ZUR ROSE GROUP AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Consumer Staples</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1040037.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.04415</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1040037.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15976</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">65.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">LEON</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">LEONTEQ AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1007772</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.04278</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1007772</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">18390</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">54.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">PPGN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">POLYPEPTIDE N AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Health Care</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1005764.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.04269</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1005764.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">23068</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">43.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">JFN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">JUNGFRAUBAHN HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">972316.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.04127</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">972316.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7791</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">LLBN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">LIECHTENSTEINISCHE LANDESBANK AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">957582</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.04065</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">957582</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17733</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">54</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ZUGN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ZUG ESTATES HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Real Estate</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">929430</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.03945</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">929430</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">449</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2070</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">DESN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">DOTTIKON ES HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Materials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">868230</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.03685</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">868230</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4385</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">198</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ORON</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ORIOR AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Consumer Staples</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">861871.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.03658</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">861871.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10236</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">84.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ZEHN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ZEHNDER GROUP AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">861342.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.03656</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">861342.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15245</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">56.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BELL</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BELL FOOD GROUP AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Consumer Staples</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">852093</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.03617</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">852093</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3322</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">256.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">WKBN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">WALLISER KANTONALBANK</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">851352</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.03614</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">851352</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7468</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SNBN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SCHWEIZERISCHE NATIONALBANK</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">851200</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.03613</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">851200</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6400</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">YPSN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">YPSOMED HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Health Care</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">835081.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.03545</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">835081.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6404</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BRKN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BURKHALTER HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">821175</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.03486</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">821175</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10949</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">75</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BLKB</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BASELLANDSCHAFTLICHE KANTONALBANK</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">810898</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.03442</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">810898</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">899</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">902</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BOBNN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BOBST GROUP SA</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">792218.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.03363</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">792218.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11949</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">66.3</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">PEAN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">PEACH PROPERTY GROUP AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Real Estate</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">786784.35</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.0334</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">786784.35</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">24321</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">32.35</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">FREN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">FUNDAMENTA REAL N AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Real Estate</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">779880</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.0331</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">779880</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">46560</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16.75</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">PMAG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">PIERER MOBILITY AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Consumer Discretionary</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">777840</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.03302</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">777840</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12964</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">60</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Austria</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">PLAN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">PLAZZA AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Real Estate</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">777870</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.03302</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">777870</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2322</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">335</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">MOVE</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">MEDACTA GROUP SA</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Health Care</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">759046.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.03222</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">759046.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8909</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">85.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">MEDX</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">MEDMIX N LTD</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Health Care</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">738062.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.03133</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">738062.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">37182</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">19.85</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">TKBP</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">THURGAUER KANTONALBANK</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">722430</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.03066</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">722430</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6282</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">AEVS</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">AEVIS VICTORIA SA</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Health Care</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">714303.9</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.03032</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">714303.9</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">39033</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">18.3</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">AERO</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">MONTANA N AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">708860.16</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.03009</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">708860.16</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">45792</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15.48</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BSLN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BASILEA PHARMACEUTICA AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Health Care</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">703895.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.02988</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">703895.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">18283</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">38.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">COPN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">COSMO PHARMACEUTICALS NV</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Health Care</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">684585</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.02906</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">684585</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14850</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">46.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">VETN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">VETROPACK HOLDING SA</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Materials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">676558.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.02872</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">676558.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">19582</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">34.55</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SKAN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SKAN N AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Health Care</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">660385</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.02803</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">660385</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12007</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">55</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">HIAG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">HIAG IMMOBILIEN HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Real Estate</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">620343.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.02633</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">620343.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7247</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">85.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">TXGN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">TX GROUP AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Communication</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">607582</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.02579</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">607582</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5149</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">VAHN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">VAUDOISE ASSURANCES SA</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">593813</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.02521</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">593813</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1459</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">407</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">HREN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ROMANDE ENERGIE HOLDING SA</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Utilities</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">576300</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.02446</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">576300</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">510</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1130</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">WARN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">WARTECK INVEST AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Real Estate</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">559730</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.02376</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">559730</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">251</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2230</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BSKP</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BASLER KANTONALBANK PAR</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">555540</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.02358</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">555540</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9259</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">60</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CLTN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">COLTENE HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Health Care</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">551933.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.02343</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">551933.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6682</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">82.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BCGE</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BANQUE CANTONALE DE GENEVE</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">533025</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.02263</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">533025</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3090</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">172.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">NREN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">NOVAVEST REAL ESTATE AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Real Estate</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">529311.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.02247</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">529311.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12281</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">43.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">METN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">METALL ZUG AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Health Care</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">507780</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.02155</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">507780</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">279</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1820</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">GURN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">GURIT HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Materials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">469604.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.01993</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">469604.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4787</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">MED</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">MEDARTIS HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Health Care</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">459075</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.01949</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">459075</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6121</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">75</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">IREN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">INVESTIS HOLDING SA</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Real Estate</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">446499</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.01895</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">446499</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4314</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">VARN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">VARIA US PROPERTIES LTD AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Real Estate</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">445480.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.01891</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">445480.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9834</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">45.3</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CPHN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CPH CHEMIE PAPIER HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Materials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">434609.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.01845</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">434609.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6317</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">68.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CFT</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">COMPAGNIE FINANCIERE TRADITION SA</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">434765.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.01845</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">434765.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4121</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">AUTN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">AUTONEUM HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Consumer Discretionary</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">417136</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.01771</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">417136</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4495</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">92.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">RIEN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">RIETER HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">408704</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.01735</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">408704</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3968</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SFPN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SF URBAN PROPERTIES N AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Real Estate</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">400816</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.01701</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">400816</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4264</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">94</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">IMPN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">IMPLENIA AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">398564.25</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.01692</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">398564.25</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17913</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">22.25</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BBN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BELLEVUE GROUP AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">394729.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.01676</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">394729.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12183</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">32.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">HBLN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">HYPOTHEKARBANK LENZBURG AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">391040</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.0166</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">391040</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">94</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4160</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">VPBN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">VP BANK AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">386405.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.0164</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">386405.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4747</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">81.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">APGN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">APG SGA SA</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Communication</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">378048</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.01605</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">378048</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2112</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">179</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ASCN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ASCOM HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Health Care</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">373534.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.01586</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">373534.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">56340</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6.63</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CALN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CALIDA HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Consumer Discretionary</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">341025.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.01448</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">341025.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8410</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">40.55</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">VZUG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">V-ZUG N AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Consumer Discretionary</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">317402.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.01347</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">317402.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3838</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">82.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">PM</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">PHOENIX MECANO AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">312308</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.01326</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">312308</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">958</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">326</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">PEHN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">PRIVATE EQUITY HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">291642</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.01238</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">291642</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3739</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">78</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">EPIC</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">EPIC SUISSE AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Real Estate</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">255750</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.01086</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">255750</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3875</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">66</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">OBSN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">OBSEVA SA</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Health Care</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">246978.59</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.01048</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">246978.59</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149322</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1.65</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">STLN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SWISS STEEL HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Materials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">240306.83</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.0102</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">240306.83</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">990956</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.24</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SAHN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SCHAFFNER HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Information Technology</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">228140</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00968</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">228140</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">748</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">305</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">LMN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">LASTMINUTE NV</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Consumer Discretionary</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">226261.35</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.0096</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">226261.35</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7981</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">28.35</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">MOLN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">MOLECULAR PARTNERS AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Health Care</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">225654.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00958</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">225654.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">37360</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6.04</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">TIBN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BERGBAHN ENGELB TRUEB TITLIS AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Consumer Discretionary</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">200518</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00851</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">200518</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4685</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">42.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">GAV</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CARLO GAVAZZI HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186735</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00793</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186735</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">633</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">295</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">AFP</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ALUFLEXPACK AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Materials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186381</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00791</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186381</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11505</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">FTON</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">FEINTOOL INTERNATIONAL HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">178611.46</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00758</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">178611.46</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9293</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">19.22</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">GAM</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">GAM HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">175495.18</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00745</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">175495.18</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">193064</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.91</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SHLTN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SHL TELEMEDICINE LTD</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Health Care</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">165906</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00704</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">165906</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9217</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">18</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Israel</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">KUD</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">KUDELSKI SA</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Information Technology</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">159970.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00679</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">159970.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">61527</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ODHN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ORASCOM DEVELOPMENT HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Consumer Discretionary</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150624.86</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00639</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150624.86</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">20191</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7.46</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">GMI</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">GROUPE MINOTERIES SA</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Consumer Staples</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147700</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00627</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147700</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">422</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">350</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">INA</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">INA INVEST N AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Real Estate</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145160</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00616</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145160</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7640</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">19</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">GLKBN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">GLARNER KANTONALBANK</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143641.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.0061</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143641.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5611</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">25.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">VBSN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">IVF HARTMANN HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Health Care</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136922</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00581</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136922</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1228</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BVZN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BVZ HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136500</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00579</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136500</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">182</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">750</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">HLEE</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">HIGHLIGHT EVENT AND ENTERTAINMENT</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Communication</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126960</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00539</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126960</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5290</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">24</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CICN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CICOR TECHNOLOGIES B LTD</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Information Technology</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126912.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00539</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126912.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3103</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">40.9</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">MTG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">MEIER TOBLER GROUP AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117643.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00499</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117643.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4943</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">23.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">EVE</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">EVOLVA HOLDING SA</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Materials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110429.84</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00469</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110429.84</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1233853</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.09</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">KLIN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">KLINGELNBERG N AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105049.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00446</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105049.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6866</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15.3</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">XLS</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">XLIFE SCIENCES AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Health Care</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102811.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00436</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102811.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3822</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">26.9</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Germany</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">OFN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ORELL FUSSLI AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100679</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00427</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100679</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1213</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">83</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">MIKN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">MIKRON HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">90376.78</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00384</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">90376.78</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11213</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8.06</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">RLF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">RELIEF THERAPEUTICS HOLDING SA</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Health Care</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">84413.46</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00358</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">84413.46</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2384561</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.04</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ZUBN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ZUEBLIN IMMOBILIEN HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Real Estate</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">76570</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00325</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">76570</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2945</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">26</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ROL</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">VON ROLL HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">72759.34</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00309</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">72759.34</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99398</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.73</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">STGN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">STARRAG GROUP HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">71865</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00305</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">71865</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1597</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">45</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">MCHN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">MCH GROUP AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Communication</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">70701.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.003</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">70701.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9958</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">TOHN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">TORNOS HOLDINGS AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">70062.44</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00297</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">70062.44</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12206</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5.74</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">HOCN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">HOCHDORF HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Consumer Staples</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">69261.3</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00294</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">69261.3</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1877</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">36.9</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ADVN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ADVAL TECH HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">65858</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.0028</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">65858</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">442</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BCJ</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BANQUE CANTONALE DU JURA SA</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">65591</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00278</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">65591</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1226</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">53.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">LLQ</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">LALIQUE GROUP SA</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Consumer Staples</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">63782.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00271</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">63782.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1661</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">38.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">LECN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">LECLANCHE SA</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">62458.79</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00265</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">62458.79</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101066</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.62</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CLXN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CREALOGIX HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Information Technology</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">59690</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00253</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">59690</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">940</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">63.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">VLRT</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">VALARTIS GROUP AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">59031</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00251</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">59031</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3748</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15.75</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">WIHN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">WISEKEY INTERNATIONAL HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Information Technology</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">47467.44</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00201</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">47467.44</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">197781</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.24</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SANN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SANTHERA PHARMACEUTICALS AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Health Care</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">36828</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00156</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">36828</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">41850</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.88</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">KURN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">KUROS BIOSCIENCES AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Health Care</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">36810.84</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00156</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">36810.84</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">20856</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1.76</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">NWRN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">NEWRON PHARMACEUTICALS</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Health Care</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">35320.14</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.0015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">35320.14</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">24443</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1.45</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">THAG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">TALENTHOUSE AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">33589.74</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00143</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">33589.74</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">180590</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.19</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">AIRE</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">AIRESIS SA</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">31026.04</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00132</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">31026.04</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">50042</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.62</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ESUN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">EDISUN POWER EUROPE AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Utilities</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">30537</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.0013</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">30537</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">261</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SPCE</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SPICE PRIVATE EQUITY AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Financials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">30473.27</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00129</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">30473.27</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2008</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15.18</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">USD</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">GBP</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">GBP CASH</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Cash and/or Derivatives</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Cash</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">28098.89</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00119</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">28098.89</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">24197</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.13</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">United Kingdom</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">GBP</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">STRN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SCHLATTER INDUSTRIES AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">18487</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00078</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">18487</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">665</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">27.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">PEDU</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">PERROT DUVAL SA</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16252.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00069</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16252.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">165</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SPEX</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SPEXIS N AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Health Care</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12128.29</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00051</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12128.29</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13446</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.9</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ADXN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">ADDEX THERAPEUTICS LTD</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Health Care</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7074.71</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.0003</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7074.71</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">39925</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.18</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BLS</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BLACKSTONE RESOURCES I AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Materials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4832.52</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4832.52</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17259</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.28</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">KNRS</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">KINARUS THERAPEUTICS HOLDING AG</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Industrials</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3464.27</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.00015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3464.27</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123724</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.03</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SIX Swiss Exchange</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">EUR</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">EUR/GBP</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Cash and/or Derivatives</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">FX</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.01</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.01</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1400</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1.16</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">United Kingdom</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">GBP</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">GBP</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">GBP/CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Cash and/or Derivatives</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">FX</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-0.37</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-0.37</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-23000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SMU2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">SWISS MKT IX SEP 22</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Cash and/or Derivatives</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Futures</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">25572300</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">237</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10790</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Eurex Deutschland</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">EUR</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">EUR CASH</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Cash and/or Derivatives</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Cash</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-701.76</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-0.00003</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-701.76</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-712</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.51</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">European Union</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">EUR</ss:Data>
+</ss:Cell>
+</ss:Row>
+</ss:Table>
+</ss:Worksheet>
+<ss:Worksheet ss:Name="Overview">
+<ss:Table>
+<ss:Row >
+<ss:Cell ss:StyleID="headerstyle">
+<ss:Data ss:Type="String">iShares Core SPI® ETF (CH)</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row/>
+<ss:Row ss:Height="50">
+<ss:Cell ss:MergeAcross="11" ss:StyleID="wraptext">
+<ss:Data ss:Type="String">The Fund seeks to track the performance of an index composed of large, mid and small capitalisation equities with a primary listing on the SIX Swiss Exchange.</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row/>
+<ss:Row>
+<ss:Cell>
+<ss:Data ss:Type="String">Net Assets of Fund</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="String">CHF 2,395,043,495</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell>
+<ss:Data ss:Type="String">Fund Launch Date</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Apr-2014</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell>
+<ss:Data ss:Type="String">Fund Base Currency</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell>
+<ss:Data ss:Type="String">Asset Class</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Equity</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell>
+<ss:Data ss:Type="String">Benchmark Index</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Swiss Performance Index (SPI®)</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell>
+<ss:Data ss:Type="String">SFDR Classification</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Other</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell>
+<ss:Data ss:Type="String">Shares Outstanding</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="String">17,625,000</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell>
+<ss:Data ss:Type="String">Total Expense Ratio</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="String">0.10%</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell>
+<ss:Data ss:Type="String">Distribution Frequency</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Ad-Hoc</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell>
+<ss:Data ss:Type="String">Use of Income</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Distributing</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell>
+<ss:Data ss:Type="String">Securities Lending Return</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="String">0.01%</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell>
+<ss:Data ss:Type="String">Domicile</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Switzerland</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell>
+<ss:Data ss:Type="String">Product Structure</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Physical</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell>
+<ss:Data ss:Type="String">Rebalance Frequency</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Quarterly</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell>
+<ss:Data ss:Type="String">Methodology</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Optimised</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell>
+<ss:Data ss:Type="String">UCITS Compliant</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">No</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell>
+<ss:Data ss:Type="String">UCITS Eligible</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">Yes</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell>
+<ss:Data ss:Type="String">Issuing Company</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">iShares ETF (CH)</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell>
+<ss:Data ss:Type="String">Fund Manager</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">BlackRock Asset Management Schweiz AG</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell>
+<ss:Data ss:Type="String">Administrator</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">State Street Bank International GmbH, Munich, Zurich Branch</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell>
+<ss:Data ss:Type="String">Custodian</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">State Street Bank International GmbH, Munich, Zurich Branch</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell>
+<ss:Data ss:Type="String">Fiscal Year End</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31 May</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell>
+<ss:Data ss:Type="String">Bloomberg Ticker</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHSPI SW</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell>
+<ss:Data ss:Type="String">ISIN</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CH0237935652</ss:Data>
+</ss:Cell>
+</ss:Row>
+</ss:Table>
+</ss:Worksheet>
+<ss:Worksheet ss:Name="Historical">
+<ss:Table>
+<ss:Row>
+<ss:Cell ss:StyleID="headerstyle">
+<ss:Data ss:Type="String">As Of</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="headerstyle">
+<ss:Data ss:Type="String">Currency</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="headerstyle">
+<ss:Data ss:Type="String">NAV per Share</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="headerstyle">
+<ss:Data ss:Type="String">Shares Outstanding</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="headerstyle">
+<ss:Data ss:Type="String">Total Net Assets</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="headerstyle">
+<ss:Data ss:Type="String">Fund Return Series</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="headerstyle">
+<ss:Data ss:Type="String">Benchmark Return Series</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Jul-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.889</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2395043494.95</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Jul-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.6663</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2355867782.13</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">167.378028</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">168.930833</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Jul-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.9029</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2377663482.92</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">168.926509</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">170.492876</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Jul-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136.7364</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2399723845.48</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">171.222433</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">172.811611</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Jul-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136.3095</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2392231227.98</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">170.687865</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">172.272114</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Jul-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136.3299</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2392589021.95</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">170.71341</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">172.29491</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Jul-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.4589</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2377304181.09</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">169.622737</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">171.194334</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Jul-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.1748</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2354767767.32</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">168.014776</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">169.570634</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Jul-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.4035</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2323680837.87</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">165.79674</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">167.328628</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Jul-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.2954</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2356885004.76</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">168.165792</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">169.718951</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Jul-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.1893</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2337471567.05</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">166.780725</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">168.321792</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Jun-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.7555</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2329858154.24</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">166.237517</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">167.778566</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Jun-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.5941</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2344577294.52</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">167.287619</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">168.834051</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Jun-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.6485</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2345530869.34</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">167.355739</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">168.897146</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Jun-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.7887</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2365541288.26</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">168.783507</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">170.345153</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Jun-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.8304</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2348723022.58</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">167.583516</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">169.132084</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Jun-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.469</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2272180634.78</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.122135</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">163.615093</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Jun-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.2794</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2276632305.42</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">163.136925</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">164.642288</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Jun-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.649</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2255892176.24</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.347533</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">163.843129</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Jun-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.5929</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2216038350.63</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.277284</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">163.774814</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Jun-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.1749</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2208891566.65</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">161.753861</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">163.243719</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Jun-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.2042</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2209391227.92</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">161.79055</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">163.275026</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Jun-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.1125</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2276223511.26</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">166.684555</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">168.214659</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Jun-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.089</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2258722330.18</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">165.40292</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">166.921413</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Jun-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.2759</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2296117450.53</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">168.141374</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">169.683174</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Jun-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136.7218</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2337942021.97</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">171.20415</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">172.772473</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Jun-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">139.4039</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2373351818.64</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">174.562698</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">176.157554</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Jun-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.1613</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2392683212.65</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">176.763328</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">178.381874</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Jun-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">142.0398</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2407574248.81</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">177.863393</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">179.491372</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Jun-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">142.0579</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2397226918.07</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">177.886058</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">179.515994</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Jun-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">142.3293</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2391131496.21</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">178.225907</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">179.859113</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Jun-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.6569</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2379835751.96</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">177.383923</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">179.005597</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-May-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.1771</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2405375378.11</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">179.287529</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">180.932815</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-May-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.652073</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2430154829.96</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">181.134503</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">182.792994</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-May-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.3973</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2398319763.23</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">179.563266</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">181.205055</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-May-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.1667</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2361012419.13</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">176.77009</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">178.379852</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-May-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.1096</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2360058397.66</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">176.698589</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">178.307769</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-May-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.2651</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2362658976.65</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">176.893308</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">178.515414</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-May-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">139.4475</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2332259345.44</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">174.617294</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">176.220691</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-May-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">139.2362</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2328725666.02</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">174.352702</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">175.94449</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-May-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">142.6127</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2385196837.11</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">178.580783</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">180.210473</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-May-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.6931</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2419992264.24</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">181.185877</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">182.847276</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-May-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.9766</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2408009271.53</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">180.28867</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">181.93467</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-May-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.7837</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2404782088.68</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">180.047119</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">181.697541</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-May-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.8624</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2372648083.48</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-May-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">142.4335</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2382200050.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">178.356388</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">179.990265</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-May-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">142.0436</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2386333292.78</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">177.868152</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">179.490347</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-May-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.9998</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2379371636.66</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">176.561097</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">178.172639</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-May-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.6769</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2441422414.54</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">181.165591</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">182.820701</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-May-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.5062</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2472292726.27</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">183.456256</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.139397</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-May-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.5973</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2484824999.39</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">183.570332</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.24938</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-May-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">148.0689</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2509768115.93</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.413081</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.109639</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-May-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">148.416</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2515650522.68</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.146486</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.841074</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Apr-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.3136</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2547814781.26</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.51371</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">189.22939</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Apr-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149.5147</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2534274127.04</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.517096</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">188.224293</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Apr-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149.0039</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2525616214.88</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.879882</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.578337</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Apr-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.6634</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2502894608.07</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">184.20763</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.886763</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Apr-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149.7311</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2537942805.48</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.787051</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">188.495142</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Apr-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.5963</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2569556677.27</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">189.113857</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">190.837015</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Apr-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.3364</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2582101814.45</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">190.03712</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">191.771173</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Apr-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.1774</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2579406579.71</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">189.83877</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">191.570821</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Apr-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.8146</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2573256982.76</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">189.386183</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">191.110512</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Apr-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.7033</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2605270548.78</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">191.742305</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">193.488385</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Apr-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.5571</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2585842612.27</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">190.312439</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">192.046264</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Apr-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.5611</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2585910271.07</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">190.317429</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">192.050532</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Apr-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.0302</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2622363611.38</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">192.150107</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">193.899544</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Apr-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.0976</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2623511663.56</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">191.338529</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">193.075559</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Apr-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.9004</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2603129287.69</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">189.082164</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">190.796414</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Apr-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.3314</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2593441696.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">188.378518</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">190.086668</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Apr-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.4591</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2612641908.11</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">189.773073</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">191.50023</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Apr-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.1248</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2606950096.02</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">189.359665</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">191.078893</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Apr-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.3185</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2576197157.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.125929</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">188.820257</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Mar-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.0202</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2571118443</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.757041</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">188.447028</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Mar-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.1757</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2590791746.91</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">188.185974</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">189.895436</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Mar-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.1779</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2607854376.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">189.42533</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">191.151409</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Mar-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.9319</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2569614779.74</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.647846</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">188.340678</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Mar-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.1401</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2556135274.13</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.668677</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.349581</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Mar-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.3591</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">17025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2559863518.61</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.9395</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.623288</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Mar-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.0231</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2542890866.33</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.523991</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.190544</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Mar-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.3656</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2565647549.83</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.184175</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">188.878046</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Mar-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.0416</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2560154756.48</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.783505</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">188.475109</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Mar-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.0544</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2560372870.14</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.799334</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">188.488849</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Mar-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149.3821</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2532026901.29</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">184.731307</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.399481</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Mar-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.6424</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2502539346.46</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">181.862682</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">183.504063</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Mar-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.5167</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2417042410.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">178.012513</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">179.619431</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Mar-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.5956</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2418361213.58</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">178.1097</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">179.718311</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Mar-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">142.6393</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2385642557.09</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">175.699973</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">177.284326</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Mar-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.4172</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16650000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2354597149.91</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">174.194617</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">175.764713</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Mar-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">142.7598</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16650000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2376951246.83</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">175.848402</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">177.433922</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Mar-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">137.0634</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16575000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2271825177.72</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">168.831701</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">170.351331</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Mar-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">138.9267</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16575000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2302710465.52</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">170.239993</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">171.769439</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Mar-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.2956</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16575000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2325400035.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">171.917435</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">173.460464</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Mar-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.9258</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16575000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2402144512.81</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">177.591256</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">179.187351</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Mar-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.4672</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16575000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2444268141.07</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">180.705473</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">182.330975</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Mar-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.3207</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16575000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2441840166.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">180.525953</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">182.150764</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Feb-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">148.8116</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16575000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2466552143.53</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">182.352893</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">183.995948</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Feb-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">148.6458</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16425000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2441507308.59</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">182.149723</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">183.789024</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Feb-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.427</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16200000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2339717719.04</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">176.980029</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">178.572827</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Feb-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.9795</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16200000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2397267117.65</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">181.333243</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">182.967647</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Feb-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">148.2365</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16200000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2401431329.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">181.648169</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">183.284368</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Feb-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.4324</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16200000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2388404638.39</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">180.66283</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">182.290346</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Feb-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">148.9486</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16200000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2412966682.41</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">182.520773</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">184.166365</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Feb-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149.8023</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16200000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2426797398.06</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">183.566892</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.221057</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Feb-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.1505</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16200000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2448638758.28</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.218968</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.88867</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Feb-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.084</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16200000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2447560677.54</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.13748</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.805683</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Feb-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149.1511</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16200000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2416248086.23</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">182.768915</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">184.414638</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Feb-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.7538</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16200000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2458411627.59</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.958249</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.630575</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Feb-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.7478</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16125000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2463058098.28</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.176291</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">188.861046</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Feb-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.1944</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16125000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2470259705.28</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.723552</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">189.410812</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Feb-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.5129</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16125000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2427021046.37</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">184.437657</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.097795</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Feb-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.2611</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16050000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2427740944.93</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.354497</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.021993</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Feb-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.7768</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16050000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2419968263.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">184.761038</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.42205</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Feb-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.9214</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16050000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2438338024.46</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.163625</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.838202</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Feb-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.7765</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16050000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2468113575.86</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">188.436854</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">190.130988</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Feb-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.5506</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16050000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2464487133.87</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">188.160037</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">189.851064</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Jan-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.1627</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16050000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2442212113.71</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.459312</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">188.134432</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Jan-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.4907</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2381515143.71</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">184.410453</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.065845</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Jan-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.2608</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2371013083.43</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.354129</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.016216</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Jan-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.5827</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2360383649.03</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">184.523189</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.177921</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Jan-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">148.6547</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2319012852.92</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">182.160629</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">183.793391</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Jan-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.8561</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2306555496.07</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">181.182029</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">182.805507</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Jan-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.6708</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2385738774.57</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">188.30733</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">189.993691</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Jan-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.218</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2425284635.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">191.428654</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">193.141015</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Jan-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.5697</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2415220037.62</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">190.634231</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">192.338369</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Jan-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.7393</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2417852264.19</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">190.842058</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">192.5476</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Jan-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.2351</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2429282540.11</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">192.675003</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">194.396279</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Jan-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.7952</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2407036283.57</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">190.910557</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">192.616432</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Jan-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.1946</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2405077927.84</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">192.625374</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">194.344524</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Jan-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.892</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2415747779.94</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">193.479964</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">195.204504</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Jan-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">158.0698</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2418468301.77</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">193.697839</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">195.422447</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Jan-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.6924</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16500000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2585424640.25</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">192.009981</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">193.72224</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Jan-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">159.7588</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16425000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2624037668</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">195.76753</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">197.511815</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Jan-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">159.8957</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16350000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2614294462.36</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">195.935287</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">197.681626</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Jan-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">161.5272</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16350000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2640969552.96</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">197.934518</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">199.696187</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Jan-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">161.7086</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16350000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2643935071.67</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">198.156804</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">199.920116</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Jan-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.1603</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16350000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2651321107.51</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">198.710315</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">200.478026</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Dec-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">161.3185</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16350000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2637558083.82</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">197.678778</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">199.434072</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Dec-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">161.3189</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16350000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2637564525.15</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">197.679268</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">199.434072</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Dec-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">161.9245</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16350000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2647466129.95</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">198.421367</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">200.182212</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Dec-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.3786</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16350000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2654890439.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">198.977819</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">200.741896</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Dec-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">161.1064</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16350000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2634089093.54</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">197.418872</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">199.167912</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Dec-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">160.1134</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16350000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2617854623.23</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">196.202055</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">197.938899</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Dec-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">159.2072</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16425000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2614978317.73</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">195.091603</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">196.817215</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Dec-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">158.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16425000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2603361983.96</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">194.225004</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">195.941049</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Dec-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.4414</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16350000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2574167325.12</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">192.927802</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">194.633423</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Dec-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">158.7702</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16350000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2595893263.74</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">194.556106</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">196.272335</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Dec-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">159.6603</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16350000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2610445858.26</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">195.646829</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">197.370581</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Dec-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.97</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16350000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2566459419.67</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">192.350151</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">194.044257</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Dec-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.4918</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16350000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2542290473.08</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">190.538773</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">192.217455</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Dec-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.2215</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16275000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2558779703.07</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">192.658337</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">194.35569</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Dec-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.8859</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16125000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2545910281.97</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">193.472489</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">195.171892</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Dec-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.9957</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16125000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2547681299.87</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">193.607038</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">195.309589</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Dec-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.8262</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16125000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2544947867.71</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">193.399333</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">195.099283</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Dec-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.9372</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">16050000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2518841586.98</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">192.309958</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">194.001914</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Dec-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.825</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2473330032.98</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">189.72168</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">191.393136</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Dec-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.462</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2435580785.89</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.826073</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">188.471139</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Dec-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.6639</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2438805865.89</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.07348</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">188.718567</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Dec-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.7466</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2456101377.06</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">188.400215</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">190.056761</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Nov-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.3913</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2434451512.64</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.739438</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">188.379375</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Nov-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.3741</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2450151572.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.943755</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">189.594598</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Nov-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.052</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2445005457.84</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.549056</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">189.196073</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Nov-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.9995</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2492091296.31</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">191.160906</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">192.837673</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Nov-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.3844</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2482266043.65</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">190.407165</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">192.076665</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Nov-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.1771</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2478954535.27</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">190.153141</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">191.821077</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Nov-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.3553</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2513750319.19</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">192.822295</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">194.512381</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Nov-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">158.049</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2524832369.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">193.672351</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">195.367511</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Nov-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">158.169</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2526749344.32</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">193.819399</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">195.514446</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Nov-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">158.8826</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2538148759.14</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">194.69384</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">196.395527</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Nov-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">158.5816</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2533340864.59</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">194.324996</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">196.023446</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Nov-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">158.3072</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2517084070.91</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">193.988748</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">195.685048</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Nov-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">158.3913</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2518421323.11</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">194.091804</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">195.786805</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Nov-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.2316</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2499983136.83</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">192.670714</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">194.354617</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Nov-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.9596</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2483886301.41</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">192.337407</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">194.017984</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Nov-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.8133</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2481570067.49</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">192.158131</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">193.835991</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Nov-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.4412</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2475682469.73</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">191.702162</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">193.376111</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Nov-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.0645</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2469720014.24</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">191.240556</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">192.909954</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Nov-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.1676</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2487176555.35</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">192.592289</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">194.274174</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Nov-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.5112</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2488528802.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">191.78794</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">193.462309</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Nov-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.5257</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2472858061.91</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">190.580314</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">192.242791</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Nov-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.4755</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2456160122.43</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">189.293405</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">190.943234</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Oct-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.1931</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2435769634.33</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.721959</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">189.352841</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Oct-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.7313</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2444327719.01</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">188.381466</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">190.020591</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Oct-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.7224</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2428285517.27</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.145166</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">188.772108</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Oct-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.3719</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2438613064.78</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.941059</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">189.575171</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Oct-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.4403</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2423801484.48</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.799482</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">188.423131</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Oct-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.5041</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2413376824.54</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.877662</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">188.502368</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Oct-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.2323</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2409076839.25</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.5446</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">188.16433</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Oct-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.9898</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2393840079.45</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.247442</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.864946</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Oct-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.1631</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2380818811.98</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.234408</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.84523</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Oct-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.5201</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2375076909.03</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.671874</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.284451</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Oct-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.46</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2374135343.55</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.598228</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.211095</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Oct-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.7057</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2362312423.27</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">184.673913</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.279106</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Oct-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149.5919</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2333633894.35</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">183.309069</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">184.89892</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Oct-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">148.6036</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2307071477.62</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">182.098011</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">183.677203</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Oct-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">148.5986</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2306992757.54</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">182.091885</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">183.668942</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Oct-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">148.4759</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2293952283.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">181.941529</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">183.515891</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Oct-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">148.5964</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2295813890.16</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">182.089189</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">183.663301</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Oct-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.3967</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2261829446.84</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">179.393689</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">180.948531</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Oct-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.8307</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2257521316.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">179.92551</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">181.484811</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Oct-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.5256</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15225000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2230852991.02</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">179.551642</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">181.105746</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Oct-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.7923</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15150000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2223903198.46</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">179.878455</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">181.441542</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Sep-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.6127</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15150000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2236331865.61</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">180.883768</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">182.456394</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Sep-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.3449</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15150000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2232275493.08</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">180.555608</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">182.118878</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Sep-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.7895</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15150000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2208710580.89</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">178.649629</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">180.196672</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Sep-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">148.7023</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15150000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2252840402.75</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">182.218958</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">183.798905</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Sep-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.4989</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15150000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2280057909.53</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">184.420501</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.021451</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Sep-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.0368</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15150000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2303357203.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.305035</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.921885</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Sep-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.7973</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2261959082.04</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">184.786159</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.391209</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Sep-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.1393</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2252089430.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">183.97985</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.578951</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Sep-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149.6844</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2245266168.47</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">183.422418</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.015096</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Sep-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.8406</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2277608937.71</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.064613</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.673751</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Sep-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.8491</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14925000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2281273492.44</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.300423</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">188.917934</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Sep-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.0836</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14925000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2269848359.48</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.362384</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.968842</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Sep-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.4373</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14925000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2290052189.98</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">188.0212</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">189.641692</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Sep-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.119809</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2273829164.97</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.632148</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">189.247304</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Sep-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.9999</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2272047840.77</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.485213</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">189.09919</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Sep-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.6276</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2281369829.44</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">188.254393</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">189.870539</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Sep-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.4738</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2293936004.44</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">189.291321</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">190.912744</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Sep-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.2363</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2320109693.91</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">191.451079</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">193.090889</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Sep-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.0768</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2332590994.26</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">192.481023</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">194.128686</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Sep-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.1399</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2318676844.37</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">191.332951</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">192.971207</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Sep-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.0923</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2332821244.9</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">192.500016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">194.14719</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Sep-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.9574</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2330817533.85</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">192.334711</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">193.978117</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Aug-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.4984</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2324001558.84</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">191.772255</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">193.408762</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Aug-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.0626</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2332379108.96</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">192.463622</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">194.107262</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Aug-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.8392</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2317299802.83</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">192.189869</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">193.828173</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Aug-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.2614</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2308762785.19</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">191.481836</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">193.110407</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Aug-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.7412</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2301076794.91</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">190.844386</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">192.466239</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Aug-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.483</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2312036873.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">191.753384</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">193.380616</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Aug-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.9093</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2318334571.42</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">192.275769</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">193.905198</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Aug-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.2151</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2308078095.13</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">191.425101</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">193.047274</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Aug-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.9663</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2304401935.79</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">191.120222</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">192.739692</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Aug-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.6619</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2329454165.21</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">193.198001</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">194.831829</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Aug-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.8374</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2317272461.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">192.187663</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">193.81278</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Aug-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.059</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2305771446.26</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">191.233816</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">192.852497</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Aug-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.5714</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2313341979.36</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">191.861709</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">193.483426</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Aug-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.1709</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2307424557.81</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">191.370938</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">192.985547</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Aug-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.6678</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2299991639.72</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">190.754442</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">192.361541</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Aug-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.4348</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2296549735.57</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">190.468925</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">192.077223</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Aug-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.8974</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2288608994.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">189.810398</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">191.415023</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Aug-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.5285</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2268383733.31</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">188.132956</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">189.72584</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Aug-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.9237</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2274222476.97</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">188.617232</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">190.21484</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Aug-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.6363</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2269975972.82</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">188.265054</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">189.856173</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Aug-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.3903</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2266342323.07</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.963607</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">189.552278</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Aug-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.5633</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2268897124.76</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">188.1756</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">189.768986</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Jul-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.8851</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2258877135.77</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.344537</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">188.928359</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Jul-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.4519</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2252476233.15</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.813697</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">188.392612</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Jul-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.2613</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2249661280.62</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.580136</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">188.156665</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Jul-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.7016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2241390768.28</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.894283</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.463027</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Jul-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.171</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2248326029.47</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.469483</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">188.044458</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Jul-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.0785</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2261734396.53</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.581529</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">189.162154</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Jul-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.3768</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2236592103.62</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.496275</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.06221</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Jul-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.839</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2243420573.63</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.062652</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.631035</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Jul-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.8145</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2228284310.47</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">184.807236</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.361892</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Jul-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.2127</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2208127019.99</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">183.628652</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.173027</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Jul-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.0955</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2235804199.3</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.930295</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.498048</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Jul-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.5879</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2228342244.29</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.309775</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.871592</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Jul-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.3759</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2239926184.35</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.273072</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.842577</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Jul-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.6938</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2244599270.51</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.661691</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">188.23168</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Jul-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.788311</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2245988172.96</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.777227</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">188.348302</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Jul-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.5973</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2228480340.43</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.321266</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.874765</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Jul-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.958</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2219082682.58</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">184.539749</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.092301</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Jul-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.8781</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2247307340.68</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.88699</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">188.457848</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Jul-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.3996</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2225573605.72</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.079586</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.636512</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Jul-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.4381</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2226140455.66</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.126651</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.684173</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Jul-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.4465</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2226263514.96</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.13692</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.690863</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Jul-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.3491</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2236182691.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.017852</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.567554</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Jun-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.9892</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2230866020.04</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">184.57789</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.124348</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Jun-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.001</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2245815431.68</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.814772</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.368655</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Jun-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.7006</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2241375646.15</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.447546</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.998126</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Jun-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.7108</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2241526638.96</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.460015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187.014767</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Jun-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.5896</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2251105684.48</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.311853</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.862971</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Jun-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.3971</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2255956309.39</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">183.854073</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.39274</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Jun-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.3444</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2270166204.58</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.012107</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.558864</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Jun-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.4039</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2271058041.79</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.084843</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.631481</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Jun-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.6268</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2259401451.98</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">184.134871</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.670082</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Jun-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.4762</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2272142972.06</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.173227</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.717223</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Jun-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.2544</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2268815881.91</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">184.902086</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186.442129</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Jun-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.6152</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2259227875.48</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">184.120691</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185.654205</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Jun-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149.9559</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2249337958.98</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">183.314724</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">184.844217</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Jun-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149.5807</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2243710040.09</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">182.856058</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">184.377847</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Jun-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149.0784</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2236175908.19</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">182.242018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">183.756859</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Jun-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149.0835</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2236251937.52</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">182.248252</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">183.768824</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Jun-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.6429</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2192497158.88</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">180.48718</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">181.993941</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Jun-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.3355</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2187931826.23</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">180.111397</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">181.612812</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Jun-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.7788</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2179665219.81</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">179.430855</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">180.928094</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Jun-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.9664</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2167601388.84</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">178.43773</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">179.926407</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Jun-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.5814</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2161883600.35</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">177.967084</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">179.4518</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Jun-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.1424</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2155365031.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">177.430425</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">178.909454</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-May-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.3252</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2143228843.59</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">176.431433</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">177.900969</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-May-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.9373</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2152318415.52</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">177.179699</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">178.653675</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-May-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.8583</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2136295837.47</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">175.860667</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">177.324131</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-May-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.8428</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14925000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2146853334.86</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">175.841719</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">177.304656</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-May-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.2806</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2149209411.52</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">175.154453</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">176.607495</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-May-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">142.2153</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2133229371.23</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">173.852169</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">175.295662</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-May-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.3134</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15075000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2130299419.38</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">172.749635</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">174.184978</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-May-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">139.9717</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15075000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2110072661.06</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">171.109464</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">172.529547</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-May-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.0885</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15075000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2126909583.57</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">172.474704</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">173.904582</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-May-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.69</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15075000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2120902066.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">171.987555</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">173.408516</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-May-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.8687</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15075000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2123596018.57</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">171.595708</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">173.010062</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-May-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">139.6499</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15075000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2105222709.01</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">170.111057</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">171.511261</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-May-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">139.2895</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15075000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2099788933.19</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">169.672044</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">171.07419</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-May-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.0857</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15075000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2126866638.34</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">171.860041</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">173.282516</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-May-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.823</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15075000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2137981974.02</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">172.758165</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">174.186987</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-May-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.7987</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15075000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2122539967.33</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">171.510439</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">172.927227</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-May-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.8717</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15075000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2123640266.98</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">171.599362</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">173.016566</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-May-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">139.1073</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15075000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2097042265.48</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">169.450102</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">170.851881</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-May-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.0456</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15075000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2126261839.65</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">171.811194</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">173.234605</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Apr-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.0099</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15075000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2110649842.67</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">170.549582</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">171.959858</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Apr-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.7883</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15150000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2132942087.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">171.49777</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">172.914469</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Apr-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.0813</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15075000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2126800428.63</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">171.854681</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">173.276403</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Apr-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.1609</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15075000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2128000605.37</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">171.951644</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">173.368708</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Apr-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.9539</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15075000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2139954332.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">172.917617</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">174.339205</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Apr-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">142.3755</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15075000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2146311014.42</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">173.431179</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">174.857316</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Apr-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">142.5708</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15075000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2149254171.07</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">173.669079</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">175.094967</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Apr-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">142.0783</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2131174087.97</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">173.069152</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">174.482506</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Apr-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.7425</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">15000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2111137525.22</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">171.44198</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">172.844348</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Apr-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">142.2147</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14925000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2122554346.31</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">173.235304</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">174.6537</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Apr-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.0443</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2124207496.52</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">173.198422</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">174.617213</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Apr-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">142.0785</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2109866301.51</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">172.029029</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">173.430636</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Apr-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.5939</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2081430358.21</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">171.442274</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">172.841122</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Apr-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.1802</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2075348334.26</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">170.941365</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">172.340705</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Apr-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.5739</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2081135645.78</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">171.418058</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">172.817776</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Apr-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">142.3638</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2092748275.85</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">172.374471</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">173.781466</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Apr-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">142.2351</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2090856188.82</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">171.467943</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">172.869219</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Apr-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.2239</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2075991769.32</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">170.248916</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">171.638054</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Apr-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.8089</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2073955597.56</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">170.954148</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">172.347763</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Apr-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.9409</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2061260626.68</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">169.907752</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">171.290074</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Mar-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">139.8539</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2034874042.25</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">168.597347</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">169.969732</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Mar-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.5772</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2045397863.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">169.469303</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">170.847944</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Mar-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.0158</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2037230142.21</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">168.792521</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">170.166269</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Mar-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.0616</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2037895988.63</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">168.847734</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">170.219523</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Mar-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">139.8043</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2034152038.43</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">168.537553</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">169.908628</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Mar-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">139.5036</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2019314935.44</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">168.175052</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">169.540245</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Mar-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">139.8752</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2024692998.96</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">168.623025</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">169.991745</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Mar-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">139.3031</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2016412139.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">167.933344</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">169.297503</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Mar-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">138.3343</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2002389138.56</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">166.765431</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">168.119485</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Mar-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">138.3771</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2003008760.52</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">166.817028</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">168.168322</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Mar-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">137.6894</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1982726994.52</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">165.312895</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">166.652847</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Mar-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">138.0045</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1987264939.71</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">165.691211</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">167.032992</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Mar-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">137.0051</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14325000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1962597767.47</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">164.491309</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">165.824521</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Mar-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136.5575</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14325000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1956186760.93</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">163.953911</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">165.279273</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Mar-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">137.1124</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14325000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1964135798.48</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">164.620136</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">165.951663</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Mar-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">137.1784</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14325000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1965080602.82</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">164.699377</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">166.031246</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Mar-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136.5798</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14325000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1956505446.96</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">163.980685</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">165.306386</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Mar-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.9891</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14325000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1948043293.74</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">163.271477</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">164.590133</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Mar-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.3814</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1920691974.28</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">160.140616</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">161.433236</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Mar-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.9724</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1943601966.92</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.050805</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">163.359709</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Mar-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.3601</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14325000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1939033253.11</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">161.603814</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.910164</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Mar-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.842</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14250000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1935748689.86</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.179145</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">163.488715</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Mar-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.6608</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14250000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1918916372.04</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">160.768933</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.06896</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Feb-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.3524</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14250000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1886021114.94</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">158.012979</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">159.289687</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Feb-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.121</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1881047576.27</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">160.124476</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">161.417932</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Feb-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.8815</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1891712778.01</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">161.032422</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.33381</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Feb-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.5233</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1872664382.26</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">159.410894</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">160.698694</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Feb-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.9579</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1892783881.82</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">161.123635</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.42664</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Feb-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.0723</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1884258556.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">161.260215</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.562489</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Feb-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.9806</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1882978911.93</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">161.150736</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.450341</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Feb-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.983</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1896962475.08</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.347482</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">163.6582</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Feb-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">137.298</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1915307782.18</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">163.917435</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">165.23882</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Feb-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">137.5244</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1918465568.08</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">164.18773</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">165.511096</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Feb-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136.8047</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1908426059.57</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">163.328494</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">164.643343</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Feb-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136.4783</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1893636562.45</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.938811</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">164.251088</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Feb-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136.0631</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1887876181.23</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.443112</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">163.749651</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Feb-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.8999</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1875418308.01</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.24827</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">163.553933</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Feb-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.7114</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1862638740.72</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.023224</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">163.328623</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Feb-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.3293</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1857394984.87</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">161.567042</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.866448</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Feb-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136.5158</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1873679533.21</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.983582</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">164.292892</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Feb-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.5607</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1860569927.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">161.843306</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">163.142847</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Feb-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.8125</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1864026907.16</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.143925</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">163.444622</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Feb-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.8212</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1850420553.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">160.960431</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.252346</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Jan-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.9513</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1824757188.09</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">158.727994</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">159.99976</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Jan-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.9789</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1866310330.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.342587</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">163.640243</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Jan-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136.4175</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1882561189.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.866223</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">164.167223</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Jan-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">137.1778</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1893053753.01</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">163.773931</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">165.083482</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Jan-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136.3971</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1882279846.12</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.841868</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">164.140163</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Jan-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136.6947</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1886387504.46</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">163.197167</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">164.498373</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Jan-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136.6202</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1885358100.92</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">163.108223</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">164.410894</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Jan-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136.8166</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1888069571.44</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">163.342701</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">164.644205</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Jan-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.997</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1876757961.92</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.364196</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">163.657832</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Jan-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136.372</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1881934264.45</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.811902</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">164.10985</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Jan-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.9452</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1876044192.72</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.302353</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">163.590619</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Jan-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.9256</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1875773324.61</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.278953</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">163.564281</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Jan-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.7109</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1872810341.26</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.022627</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">163.30415</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Jan-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.9819</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1876549794.08</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.346169</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">163.628719</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Jan-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.7877</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1873869604.53</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.114317</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">163.394267</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Jan-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.325</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1867484637.14</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Jan-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.9775</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1872812937.46</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">161.147035</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.418663</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Jan-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.6131</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1867756835.45</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">160.711985</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">161.98154</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Jan-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.2523</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">14025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1882889090.11</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">160.281233</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">161.548197</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Jan-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.8234</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1880785822.86</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">160.963058</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.235278</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Dec-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.33</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1873903573.37</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">160.373997</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">161.636482</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Dec-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.3303</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1863832635.48</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">160.374355</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">161.636482</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Dec-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.2234</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1862350132.92</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">160.246729</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">161.511079</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Dec-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.1586</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1847576236.89</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">158.975485</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">160.22783</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Dec-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.9756</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13650000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1787817508.93</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.369244</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.602529</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Dec-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.8127</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13650000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1785592909.64</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.17476</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.404369</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Dec-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.576</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13425000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1739558000.65</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.698288</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.917256</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Dec-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.0783</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13425000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1773151843.52</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.685736</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">158.926554</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Dec-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.1707</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13425000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1774391188.34</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.796051</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">159.036249</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Dec-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.0981</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13425000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1759992452.66</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.515494</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.7466</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Dec-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.7894</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13425000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1742422870.02</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.953062</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.171252</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Dec-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.0411</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13425000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1745802254.06</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.253562</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.469105</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Dec-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.2693</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13350000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1739095380.13</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.526006</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.744372</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Dec-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.2624</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13350000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1739003220.43</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.517768</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.735257</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Dec-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.6751</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13350000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1744512500</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.010482</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.232851</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Dec-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.1351</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13200000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1717783721.28</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.365787</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.582469</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Dec-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.0247</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13200000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1716325709.39</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.233982</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.450713</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Dec-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.9166</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13200000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1714898999.34</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.104924</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.317806</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Dec-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.6454</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13200000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1711319063.19</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.781144</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.991852</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Dec-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.6419</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13200000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1724472802.32</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.970846</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.19032</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Dec-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.8162</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13050000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1707152023.38</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.178939</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.401188</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Nov-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.0798</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13050000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1710591325.88</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.493646</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.701322</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Nov-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.4443</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13050000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1715348542.33</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.928816</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">158.154552</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Nov-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.2411</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13050000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1712696503.77</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.686219</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.916131</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Nov-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.9387</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">13050000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1708750297.38</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.325189</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.548538</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Nov-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.9313</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1689014411.02</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.316355</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.557479</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Nov-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.5883</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1684588929.43</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.906854</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.142806</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Nov-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.2042</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1682694098.55</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.642165</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.884048</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Nov-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.0527</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1680750954.64</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.461292</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.701481</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Nov-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.9304</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1692007143.96</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.509161</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">158.756343</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Nov-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.9314</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1692020006.81</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.510355</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">158.756823</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Nov-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.2493</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1696097416.87</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.88989</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">159.139533</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Nov-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.1928</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1682548181.15</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.628555</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.865924</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Nov-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.1825</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1682414934.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.616258</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.85458</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Nov-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.5873</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1687606909.82</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.09954</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">158.340247</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Nov-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.6213</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1652670977.75</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.752371</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.973781</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Nov-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.361</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1662102625.69</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.635485</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.862832</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Nov-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.3569</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1649300432.06</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.436709</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.654087</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Nov-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.2657</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1648137920.62</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.327827</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.544753</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Nov-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.0205</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1645010941.85</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.035087</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.249731</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Nov-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.6454</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1601979211.77</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.005621</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.190016</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Nov-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.1419</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1579295251.88</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.01674</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">148.178842</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Oct-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.8861</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1550363687.47</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.323584</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.464714</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Oct-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.4498</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1553802289.15</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.802694</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.937245</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Oct-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.9701</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1560514381.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.42387</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.563481</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Oct-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.34</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1603986140.07</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">148.447129</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149.618259</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Oct-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.3403</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1616890135.57</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149.641368</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.822001</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Oct-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.0616</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1626194367.3</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.502514</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.688603</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Oct-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.8301</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1623208024.31</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.22613</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.409541</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Oct-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.9317</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1624518384.71</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.347429</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.531235</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Oct-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.7877</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1648460779.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.563271</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.764845</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Oct-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.051</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1651858509.63</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.87762</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.080065</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Oct-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.3785</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1656082781.46</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.268616</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.472762</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Oct-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.8867</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1636838416.96</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.487585</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.679043</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Oct-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.6207</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1672106697.04</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.751655</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.97016</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Oct-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.143</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1678845325.77</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.375219</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.598902</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Oct-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.5016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1683470280.51</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.803344</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.026335</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Oct-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.865</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1665518225.56</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.04332</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.259939</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Oct-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.1914</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1656879710.02</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.239122</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.447613</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Oct-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.2128</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1644328875.46</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.07079</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.276809</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Oct-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.7044</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1650634341.83</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.657702</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.86179</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Oct-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.6618</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1662912428.62</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.800723</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.012666</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Oct-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.0675</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1655290314.06</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.0912</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.300165</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Oct-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.855</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1652565280.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.8375</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.042178</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Sep-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.2584</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1644914169.56</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.125231</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.320677</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Sep-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.5988</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1649280173.47</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.531628</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.73178</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Sep-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.376</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1649543975.23</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.459512</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.66332</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Sep-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.1704</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1634172804.92</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.020169</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.211843</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Sep-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.0286</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1632364192.59</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.850877</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.045392</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Sep-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.4542</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1650540746.01</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.552874</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.751821</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Sep-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.652</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1653063543.31</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.789023</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.991899</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Sep-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.2633</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1638412861.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.324962</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.524361</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Sep-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.757</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1670019677.86</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.302142</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">158.518527</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Sep-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.4472</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1666093207.47</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.932278</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">158.141724</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Sep-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.882</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1681495497.32</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.451377</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">158.670543</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Sep-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.3558</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1674786835.12</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.823157</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">158.028298</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Sep-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.6638</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1665962971.83</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.996992</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.199377</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Sep-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.4895</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1663740756.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.788898</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.982344</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Sep-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.9319</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1656631944.69</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.12319</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.320284</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Sep-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.1765</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1659750937.88</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.415214</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.613962</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Sep-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.3316</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1636228285.57</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.212623</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.394823</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Sep-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.9619</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1644264048.72</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.965126</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.145669</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Sep-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.2806</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1622827467.51</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.957854</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.13058</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Sep-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.316</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1636028935.97</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.193998</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.378889</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Sep-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.4367</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1663067896.89</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.725861</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.926054</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Sep-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.1829</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1624718856.02</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.035093</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.219321</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Aug-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.6077</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1617428215.49</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.348373</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.522674</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Aug-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.7756</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1619555557.09</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.548825</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.72525</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Aug-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.7492</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1631895627.95</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.711188</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.894239</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Aug-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.571</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1642312991.28</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.692319</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.887346</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Aug-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.4926</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1628643397.55</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.404838</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.584043</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Aug-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.3565</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1639594133.18</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.436231</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.625417</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Aug-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.2765</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1625905231.83</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.14684</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.325185</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Aug-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.4362</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1627928887.76</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.337503</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.52195</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Aug-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.3094</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1638996428.32</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.38</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.570893</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Aug-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.6247</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1617643604.16</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.368669</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.54033</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Aug-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.1761</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1624632335.89</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.026975</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.200759</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Aug-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.3551</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1623777161.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.046799</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.211436</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Aug-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.3976</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1637069781.04</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.291419</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.455662</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Aug-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.4638</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1637913991.28</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.370454</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.538029</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Aug-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.9793</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1618985976.14</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.598138</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.754999</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Aug-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.1337</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1608204594.67</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.588593</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.738309</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Aug-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.0105</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1606633925.09</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.441506</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.578352</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Aug-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.9143</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1605407823.18</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.326655</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.45557</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Aug-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.2135</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1609222466.68</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.683864</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.797165</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Aug-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.8809</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1617731815.96</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.48066</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.600611</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Aug-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.6545</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1627595356.33</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.404246</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.51964</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Jul-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.120356</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1595284551.51</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149.378781</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.473022</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Jul-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.3184</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1610560050.73</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.809102</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.914785</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Jul-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.3092</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1626318654.48</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.18588</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.312553</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Jul-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.274</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1625872411.62</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.143855</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.266879</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Jul-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.1989</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1624920507.98</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.054195</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.176256</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Jul-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.5386</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1616551900.41</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.265876</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.375373</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Jul-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.8019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1645239202.39</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.967986</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.095118</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Jul-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.2665</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1651127997.14</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.522663</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.650877</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Jul-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.1625</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1649810316.45</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.398499</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.544742</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Jul-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.1524</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1662357219.17</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.840116</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.991115</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Jul-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.5081</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1654190654.83</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.074535</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.214363</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Jul-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.6464</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1655943594.07</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.238868</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.369712</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Jul-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.9809</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1660183257.89</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.636333</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.764058</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Jul-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.5562</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1629450381.92</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.755215</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.859642</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Jul-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.2732</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1638537754.47</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.607181</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.721998</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Jul-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.3896</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1627337553.04</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.557255</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.662842</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Jul-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.3381</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1614011009.53</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.307824</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.408052</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Jul-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.6946</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1618529195.81</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.73143</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.832976</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Jul-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.941</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1612056566.78</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.024212</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.12426</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Jul-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.4459</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1608785143.02</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.624153</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.728469</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Jul-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.885</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1589235006.73</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.769434</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.861349</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Jul-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.5587</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1597673238.44</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.569949</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.666288</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Jul-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.5506</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1585046131.53</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.372087</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.45977</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Jun-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.0148</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1578335936.28</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149.73543</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.820322</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Jun-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.2109</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1580791302.24</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149.968443</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.053124</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Jun-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.9252</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1577212531.28</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149.628964</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.711667</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Jun-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.3546</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1582591431.42</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.139193</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.225541</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Jun-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.8158</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1575842981.3</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149.498971</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.577099</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Jun-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.3149</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1607144546.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.468494</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.572493</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Jun-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.3925</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1595590783.46</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.372464</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.467864</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Jun-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.5846</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1610522666.22</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.788961</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.891981</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Jun-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.6903</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1599320692.37</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.726321</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.815787</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Jun-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.9325</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1602354445.24</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.014112</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.111219</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Jun-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.7251</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1584135729.35</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149.391198</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.46426</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Jun-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.4179</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1555065809.12</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.649698</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.704456</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Jun-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.8666</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1548119481.68</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.994623</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.047884</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Jun-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.2963</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1553533488.96</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.505208</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.551269</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Jun-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.8942</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1598866832.89</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.780366</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.855371</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Jun-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.3235</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1604275764.12</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.290476</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.375372</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Jun-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.9064</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1599020183.75</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.794862</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.869971</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Jun-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.3195</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1604225578.59</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.285723</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.368455</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Jun-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.2872</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1591218204.44</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.059106</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.136523</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Jun-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.5355</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1606946961.56</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.542382</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.619645</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Jun-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.2269</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1568467453.16</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">148.799218</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149.870916</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-May-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.0887</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1554211135.06</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.446767</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">148.516384</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-May-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.9481</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1564974694.12</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">148.467938</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149.535393</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-May-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.3244</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1532112640.22</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.350361</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.398264</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-May-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.996</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1553049992.44</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.336617</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">148.397429</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-May-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.0484</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1553705998.27</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.398881</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">148.465825</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-May-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.4463</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1533640172.15</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.495207</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.54923</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-May-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.7597</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1550089927.18</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.055837</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">148.125222</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-May-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.3995</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1536323443.17</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.627834</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.696285</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-May-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.8788</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1520625576.49</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.009119</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.067464</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-May-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.0906</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1477114889.84</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">142.696077</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.737616</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-May-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">119.1972</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1466125850.16</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.634506</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">142.658401</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-May-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.6776</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1496634656.91</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.581809</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.634437</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-May-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.853</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1511091635.39</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.978463</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.040144</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-May-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.3939</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1505444705.48</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.432943</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.488855</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-May-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.9699</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1500230051.64</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.929131</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.982832</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-May-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.2902</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1491869266.55</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.121486</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.168573</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-May-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.7533</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12225000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1476209335.69</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.483522</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.527335</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-May-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">119.7958</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1437550131.19</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">142.345785</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.376192</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-May-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.9831</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11925000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1406948177.67</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.191868</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.198466</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Apr-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.6568</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11925000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1438832459.52</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.368857</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.390481</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Apr-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.2559</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11925000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1469826508.72</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.457203</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.501177</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Apr-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.5781</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11925000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1473668604.34</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.840053</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.891794</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Apr-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.4268</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11925000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1459939361.03</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.472036</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.517615</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Apr-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.7029</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11925000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1451307348.55</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.364505</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.385258</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Apr-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.5702</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11925000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1449724840.52</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.208187</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.218892</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Apr-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.6523</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11925000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1450704084.21</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.304899</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.32168</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Apr-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.3525</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11925000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1435203985.97</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.773751</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">142.774435</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Apr-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.9844</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11925000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1466588798.64</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.874097</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.901106</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Apr-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.8783</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12075000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1459605563.12</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">142.393137</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.39923</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Apr-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118.6391</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12075000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1432566894.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">139.755387</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.738985</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Apr-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.1188</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12075000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1414209176.85</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">137.964493</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">138.938375</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Apr-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">119.4962</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12150000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1451878360.11</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.76504</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.754762</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Apr-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118.2012</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12150000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1436143991.41</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">139.239546</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.214639</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Apr-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118.1518</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1453266921.37</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">139.181354</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.159122</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Apr-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118.6086</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1458885391.13</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">139.719458</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.696293</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Apr-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118.0354</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1451835456.13</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">139.044236</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.012796</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Apr-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.4474</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1420003530.66</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.995604</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136.945413</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Apr-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.8181</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1424562873.95</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.772611</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136.718124</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Apr-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.0085</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12225000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1405978556.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.823524</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.760042</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Mar-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.292</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12225000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1421669344.85</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136.32816</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">137.279935</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Mar-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.6611</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1418930952.56</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.416269</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.357488</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Mar-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.3154</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1389903540.63</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.666425</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.582143</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Mar-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.5171</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1417149265.19</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.247459</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.187623</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Mar-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.0505</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1378221040.37</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.355884</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.273747</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Mar-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.9973</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12225000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1332492551.01</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.776643</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.67019</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Mar-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.6483</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12225000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1254875508.48</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.333762</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.16365</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Mar-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.1718</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12150000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1314287910.27</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.808916</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.690681</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Mar-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.8462</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12075000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1326392688.14</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.771802</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.671632</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Mar-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.62</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12075000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1263286526.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.988687</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.842095</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Mar-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.3561</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11925000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1268296440.14</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.013009</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.869571</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Mar-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.5986</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11925000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1235413266.71</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.797717</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.639245</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Mar-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.6329</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1243827476.42</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.169745</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.030693</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Mar-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.7766</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1225886278.88</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.171285</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.026849</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Mar-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.2833</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1348814746.31</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.422274</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.359233</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Mar-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.975</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1356907445.06</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.228808</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136.169332</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Mar-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.1919</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1359445116.59</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.481717</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136.423982</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Mar-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.7126</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1444940582.27</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.084964</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.079672</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Mar-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.5448</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1530537952.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">148.719391</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149.751218</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Mar-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.9377</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1547252461.57</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.343535</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.38736</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Mar-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.0534</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12150000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1543699394.95</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">148.14641</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149.174773</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Mar-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.115</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12150000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1520147068.14</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.093311</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.100283</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Feb-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.569</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">12000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1482828325.66</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.300447</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.292241</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Feb-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.1743</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11925000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1528478898.78</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">148.641119</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149.668394</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Feb-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.9395</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1563483596.13</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.007545</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.065681</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Feb-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1559459837.36</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.613833</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.668284</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Feb-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.255</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1590921556.72</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.692783</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.769761</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Feb-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">139.1753</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1649227799.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">161.398754</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.513278</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Feb-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">139.7279</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1655775563.58</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.039593</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">163.157563</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Feb-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.8486</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1669055378.72</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">163.339246</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">164.465683</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Feb-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">139.425</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1652185796.83</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">161.688326</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.803532</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Feb-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">139.7696</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1656269184.83</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.087952</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">163.205801</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Feb-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">139.3825</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1651683160.41</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">161.63904</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.753035</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Feb-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">138.7231</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1643868313.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">160.874347</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">161.982503</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Feb-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">138.9025</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1645994492.86</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">161.082393</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.191129</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Feb-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">139.1513</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1648943187.73</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">161.370922</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">162.481287</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Feb-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">138.4669</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1640833060</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">160.577237</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">161.682003</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Feb-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">137.936</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1634542129.31</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">159.961563</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">161.060856</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Feb-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">138.1185</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1636703749.24</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">160.173205</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">161.273411</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Feb-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">137.9735</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1634986233.44</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">160.005051</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">161.10464</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Feb-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.8257</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1609534514.83</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.514291</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">158.597703</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Feb-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.1532</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1589715071.16</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.574727</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.644916</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Jan-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.683</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1584143370.81</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.029446</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.09544</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Jan-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.1607</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1601654731.97</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.743104</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.820372</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Jan-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136.5877</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1618564159.18</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">158.397967</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">159.483771</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Jan-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.6008</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1606869352.06</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.253479</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">158.330658</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Jan-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.4115</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1592775977.38</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.874272</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.941901</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Jan-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136.5853</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1618535316.18</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">158.395184</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">159.478105</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Jan-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136.1114</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1612919907.32</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.845612</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">158.925247</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Jan-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">137.2257</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1626124622.57</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">159.137843</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">160.225198</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Jan-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">137.046</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1623995379.67</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">158.929448</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">160.013603</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Jan-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136.4252</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1616638838.57</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">158.209519</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">159.289645</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Jan-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136.2488</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1604329624.61</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">158.004952</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">159.08203</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Jan-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.4884</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1583601468.17</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.963452</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.026638</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Jan-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.1415</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1579516721.96</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.561159</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.621387</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Jan-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.9344</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1577077897.66</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.320989</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.378838</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Jan-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.5538</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1572595502.17</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.879615</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.934179</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Jan-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.6465</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1563664434.04</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.987118</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.040931</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Jan-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.7947</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1565397634.83</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.158982</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.212651</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Jan-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.7829</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1565260012.57</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.145298</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.198719</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Jan-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.2532</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1570762100.36</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.690695</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.747326</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Jan-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.9937</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1567726597.3</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.389758</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.443644</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Jan-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.3995</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1572474619.95</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.860356</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.916193</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Dec-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.3489</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1560181679.92</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.641997</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.689222</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Dec-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.3492</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1560185391.9</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.642345</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.689222</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Dec-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.7507</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1576583004.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.267636</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.323343</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Dec-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.5986</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1564708617.9</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.091249</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">157.143796</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Dec-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.9584</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1557266445.96</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">155.348822</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">156.395024</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Dec-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.6249</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1541764666.89</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.802389</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.837023</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Dec-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.4316</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1539517264.31</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.578223</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.610527</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Dec-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.2883</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1537851295.87</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.412041</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.443477</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Dec-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.3837</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1538960342.04</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.522674</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.553045</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Dec-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.0433</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1523378105.66</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.96824</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.987725</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Dec-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.1954</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1525146657.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.144627</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.163955</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Dec-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.7111</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1519516495.93</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.582994</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.599207</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Dec-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.496</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1517016481.32</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.333547</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.347943</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Dec-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.1406</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1524509280.99</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.081077</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.099875</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Dec-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.4427</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1528021473.25</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.431416</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.451295</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Dec-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.1735</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1513266571.55</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.95955</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.968999</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Dec-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.785</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1508750677.11</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.509015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.514837</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Dec-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.5902</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1494861247.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149.12343</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.119372</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Dec-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.9454</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1510614723.21</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.695027</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.71502</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Nov-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.6858</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1530847855.71</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.713334</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.731947</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Nov-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.1398</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1536124796.89</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.239828</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.261109</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Nov-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.0896</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1535541411.65</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.181612</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">154.202412</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Nov-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.7749</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1531882701.31</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.816661</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.833904</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Nov-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.2399</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1525663287.66</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.196233</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">153.20982</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Nov-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.0216</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1511501063.3</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.783395</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.785239</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Nov-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.7163</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1507951800.81</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.429345</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.429796</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Nov-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.2494</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1514149471.74</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.04757</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">152.051863</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Nov-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.9679</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1510876789.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.72112</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.722016</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Nov-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.8562</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1509578538.17</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.591584</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.591615</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Nov-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.4525</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1504884882.77</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.123421</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.119179</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Nov-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.5165</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1494004266.93</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149.037961</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.025764</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Nov-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.3044</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1503163560.27</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149.951673</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.945747</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Nov-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.3836</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1513788077.07</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.043519</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.037341</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Nov-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.4009</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1513990006.35</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.063582</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.057179</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Nov-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.356</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1513465081.95</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.011512</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.003563</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Nov-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.5188</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1515370032.75</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.200308</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.192451</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Nov-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.3442</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1513326694.41</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149.997828</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.988168</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Nov-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.8108</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1487764531.82</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149.379255</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.366226</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Nov-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.5091</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1495829786.49</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.189059</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">151.181517</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Nov-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.531</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1474893157.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149.054777</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.038681</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Oct-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.1726</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1470780956.87</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">148.639148</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149.619903</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Oct-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.6762</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1476559434.08</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149.223162</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.207066</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Oct-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.5139</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1474697226.52</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149.034946</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150.01758</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Oct-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.2514</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1471684392.11</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">148.73053</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149.710695</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Oct-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.8564</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1467152454.13</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">148.272457</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">149.248905</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Oct-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.8741</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1455880542.44</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.133304</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">148.101352</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Oct-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.7492</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1442972459.29</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.82878</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.78765</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Oct-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.7661</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1443165728.12</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.848379</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.807203</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Oct-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.5323</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1440482770.33</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.577246</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.533999</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Oct-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.3214</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1438062658.19</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.332669</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.286436</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Oct-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.9362</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1445118196.86</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.04564</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.003914</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Oct-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.5787</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1452490323.86</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.790734</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.754869</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Oct-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.7594</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1454564459.33</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.000288</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.963526</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Oct-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.9</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1444702269.59</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.00366</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.961589</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Oct-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.5282</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1451910885.95</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.73217</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.693392</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Oct-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.2429</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1437161766.62</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.241634</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.192907</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Oct-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.4975</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1428609292.66</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.377209</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.322389</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Oct-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.1024</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1414767163.08</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.91902</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.861853</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Oct-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.4588</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1439640159.38</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.492009</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.44453</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Oct-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.3671</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1427112587.09</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.225987</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.169334</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Oct-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.4603</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1425966432.87</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.174389</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.107595</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Oct-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.3122</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1424255770.69</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.002641</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.935351</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Oct-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.6456</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1451206229.36</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.708637</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.661382</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Sep-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.1046</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1468058243.79</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.40061</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">148.359675</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Sep-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.6394</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1462685230.73</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.861127</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.816115</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Sep-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.3199</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1458995049.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.490609</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.444134</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Sep-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.1715</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1445730398.63</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.158833</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.104091</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Sep-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.1483</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1457012955.92</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.291608</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.244382</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Sep-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.0266</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1455607761.95</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.150475</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.099293</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Sep-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.6321</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1453103622.93</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.852661</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.798483</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Sep-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.7843</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1473867001.39</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.029164</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.979225</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Sep-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.2754</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1467951290.94</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.439003</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.386691</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Sep-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.1187</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1466130364.29</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.257282</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.202582</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Sep-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.4485</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1477156056.51</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.480064</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.416182</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Sep-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.4682</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1489163551.26</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.66259</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.60228</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Sep-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.2828</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1498754970.9</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.607265</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">148.557188</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Sep-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.2784</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1498702827.73</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.602162</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">148.555931</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Sep-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.3924</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1488270685.72</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.574686</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.521835</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Sep-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.1746</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1497481011.87</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.481787</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">148.436895</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Sep-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.4539</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1500769637.77</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.805686</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">148.766947</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Sep-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.3645</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1487942192.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.542331</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.490985</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Sep-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.4302</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1476940523.14</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.458842</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.404447</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Sep-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.8048</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1469576930.33</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.733579</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.676656</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Sep-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.6312</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1479307089.01</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.691938</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.636555</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Aug-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.3181</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1475621110.87</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.328842</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.271076</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Aug-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.4772</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1456383430.03</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.353668</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.287682</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Aug-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.4722</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1444624689.31</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.18819</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.115133</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Aug-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.8305</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1448816896.97</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.603703</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.534584</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Aug-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.916</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1438117668.97</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">142.543176</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.464369</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Aug-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.3299</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1442960178.31</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.023167</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.943572</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Aug-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.9787</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1450550864.38</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.775567</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.70065</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Aug-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.5019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1456672626.26</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.382312</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.312008</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Aug-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.4036</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1443821622.03</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.108636</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.026239</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Aug-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.1513</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1443259107.57</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.975728</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.900289</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Aug-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.8916</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1428614344.72</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">142.51488</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.429457</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Aug-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.3894</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1411151726.19</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.772809</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.679408</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Aug-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.717</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1414960312.53</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.15272</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">142.061933</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Aug-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.5978</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1427555138.58</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.333845</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.253921</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Aug-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.3686</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1415654394.13</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.068047</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.987804</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Aug-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.3237</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1415140013.94</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.015977</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.948903</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Aug-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.3438</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1415369763.93</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.039287</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.972888</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Aug-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.8686</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1386966947.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.168848</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.08436</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Aug-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.966</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1388085140.31</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.281801</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.196116</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Aug-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.4383</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1393504963.91</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.829517</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.74376</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Aug-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.0286</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1432530069.76</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.833435</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.770106</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Jul-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.3552</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1447852831.46</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.371866</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.313889</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Jul-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.9651</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1433974071.13</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.919475</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.860397</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Jul-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.8197</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1443780677.57</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.910537</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.852849</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Jul-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.6761</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1442133730.31</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.744007</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.68335</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Jul-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.5441</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1429143810.71</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.43125</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.360032</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Jul-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.8593</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1432760027.87</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.796781</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.729289</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Jul-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.4669</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1439733216.02</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.501402</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.434255</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Jul-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.8511</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1432666219.34</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.787272</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.717245</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Jul-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.9917</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1434279835.14</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.950323</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.880025</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Jul-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.678</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1442154711.38</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.746211</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.678336</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Jul-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.0161</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1425183915.74</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.978619</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.905784</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Jul-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.9116</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1412592043.47</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.697753</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.615083</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Jul-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.3381</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1417453996.94</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.334193</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.253197</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Jul-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.7505</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1410755935.49</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">142.656821</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.57095</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Jul-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.9613</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1424558813.97</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.052604</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.972432</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Jul-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.6325</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1432210090.42</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.826349</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.751831</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Jul-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.8952</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1435205588.08</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.129183</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.055981</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Jul-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.3723</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1440644553.64</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.679174</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.611241</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Jul-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.1699</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1438337284.12</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.445852</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.372168</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Jul-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.3165</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1451408055.49</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.767626</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.705231</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Jul-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.2817</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1451010990.38</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.72751</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">147.664397</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Jul-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.6836</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1444193066.25</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.038033</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.96777</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Jul-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.05</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1436969462.78</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.307633</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.231153</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Jun-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.2054</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1427341671.07</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.333997</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.257943</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Jun-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.5542</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1419918284.04</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.583309</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.497419</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Jun-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.2053</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1415940671.61</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.181104</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.087896</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Jun-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.996</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1424954424.02</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.092606</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.007139</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Jun-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.9809</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1424782104.93</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.075199</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.99213</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Jun-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.2788</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1437573707.57</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.418611</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.330213</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Jun-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.0183</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1446059608.32</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.27109</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.191927</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Jun-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.6988</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1442393168.59</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.902778</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.823684</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Jun-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.0349</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1446250499.31</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">145.290227</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146.206878</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Jun-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.4006</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1427496481.33</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.406242</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.311777</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Jun-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.3132</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1426494371.86</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.305489</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.211623</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Jun-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.546</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1429165545.45</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.573856</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.483379</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Jun-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.5026</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1438004794.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.523825</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.429956</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Jun-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.2312</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1434870335.16</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143.210961</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">144.114705</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Jun-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.1777</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1422702675.94</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.99651</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">142.892076</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Jun-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.3361</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1422157186.92</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.026332</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.914054</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Jun-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.161</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1420121650.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.824481</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.71506</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Jun-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.2882</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1409975295.46</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">139.818336</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.698489</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Jun-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.6111</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1413729029.35</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.190568</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.080051</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-May-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.6889</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1403008760.07</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">139.127477</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.008593</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-May-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.7492</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1403709295.03</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">139.196989</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.075621</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-May-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.4315</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1423266604.37</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.136307</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">142.026188</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-May-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.802</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1427573787.09</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.563411</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">142.455601</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-May-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.1674</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1420195698.82</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.831859</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.722653</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-May-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.3435</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1401517408.32</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">139.882085</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.76805</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-May-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.0696</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1409903629.21</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.719117</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.607261</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-May-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.67</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1405288621.91</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.258467</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.143579</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-May-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.0505</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1398133032.53</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">139.544321</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.425941</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-May-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.0275</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1409418142.45</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.670585</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.556993</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-May-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.1021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1410278859.17</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.756582</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.64935</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-May-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">119.9068</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1375930798.62</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">138.225889</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">139.106034</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-May-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">119.0379</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1365960138.49</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">137.224241</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">138.094181</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-May-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118.4555</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1359277010.12</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136.552863</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">137.41667</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-May-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">119.8637</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1375436035.87</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">138.176205</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">139.049197</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-May-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">119.3883</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1369980873.16</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">137.628174</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">138.496205</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-May-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.7634</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1397234833.25</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.366136</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.251263</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-May-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.216</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1390953690.03</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">139.735106</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.613832</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-May-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.0653</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1400698951.17</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.71416</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.60464</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-May-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.9896</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1420529671.51</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.271112</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">142.159426</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-May-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.8428</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1418834163</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.102491</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.987075</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Apr-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.1323</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1422177630.67</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.435023</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">142.320399</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Apr-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.8234</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1418610006.07</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.080207</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.963892</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Apr-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.6717</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1416858340.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.905958</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.790883</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Apr-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.3031</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1412601086.91</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.482569</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">141.366475</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Apr-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.8734</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1407637758.43</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">139.988997</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.867839</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Apr-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.619</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1404699451.09</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">139.696782</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">140.570568</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Apr-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.4495</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1391192292.81</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">138.353444</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">139.217229</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Apr-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.6178</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1393135529.51</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">138.546761</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">139.409572</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Apr-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.6545</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1384510631.18</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">138.588916</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">139.454074</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Apr-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">119.9079</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1375942811.46</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">137.73134</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">138.591706</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Apr-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">119.7302</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1409823376.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136.727084</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">137.579268</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Apr-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.3307</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1416893654.72</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">137.412831</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">138.262196</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Apr-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.4195</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1417940171.95</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">137.514237</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">138.361927</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Apr-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.6392</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1420526196.93</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">137.765126</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">138.61338</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Apr-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.2683</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1416158731.47</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">137.341573</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">138.186958</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Apr-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.1794</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1415112879.72</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">137.240053</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">138.081714</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Apr-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.329</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11925000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1434923812.69</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136.885588</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">137.726336</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Apr-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.4535</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11925000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1436407947.68</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">137.027219</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">137.868307</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Apr-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">119.9341</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11925000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1430213948.72</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136.436352</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">137.272262</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Apr-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">119.9388</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11925000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1430270032.99</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136.441699</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">137.27652</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Mar-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">119.1113</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Mar-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">119.1113</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1393602302.12</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.50034</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136.32965</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Mar-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118.2692</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1383749589.44</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.542371</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.364407</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Mar-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118.0463</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1363434977.78</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.288802</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.110781</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Mar-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118.1037</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1364097382.67</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.3541</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.174427</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Mar-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.9614</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1350904372.85</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.054626</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.866213</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Mar-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.2137</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1353818560.72</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.341641</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.155034</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Mar-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118.7851</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1371967486.96</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.129256</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.952855</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Mar-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118.7883</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1363096213.98</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.132897</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.954431</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Mar-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">119.4545</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1370740868.52</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.890762</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136.716487</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Mar-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">119.0879</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1366533921.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.47372</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136.297572</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Mar-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">119.0215</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1365771819.54</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.398184</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136.21987</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Mar-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118.9327</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1364752483.24</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">135.297165</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">136.116749</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Mar-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.789</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1351628394.54</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.996099</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.808668</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Mar-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.1361</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1344136937.99</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.253363</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.06165</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Mar-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.1899</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1353542894.08</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.314566</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.121695</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Mar-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.2854</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1343096283.39</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.285612</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.086487</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Mar-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.0129</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1351498974.25</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.113212</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.919526</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Mar-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.8192</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1360811895.63</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.416153</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.221918</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Mar-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.7583</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1360108365.25</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.347191</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">134.151371</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Mar-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.5948</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1358219731.27</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.162047</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.965757</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Mar-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.7964</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1360548987.74</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.644899</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.443065</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Feb-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.3825</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1355767486.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.178826</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.973566</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Feb-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.5787</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1384488681.56</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.399757</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.195466</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Feb-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118.2756</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1392695093.96</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.184503</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.984179</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Feb-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.6257</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1385042598.67</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.452682</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.243553</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Feb-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.086</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1378687601.27</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.844951</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.635737</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Feb-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.9671</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1377288189.3</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.711064</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.50004</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Feb-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.6952</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1374085675.46</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.40489</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.191536</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Feb-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.907</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1364804732.49</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.517336</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.297628</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Feb-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.1319</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1367452987.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.770585</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.553001</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Feb-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.6828</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1362164830.97</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.264875</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.043638</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Feb-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.6094</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1349525613.43</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.05617</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.828819</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Feb-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.5161</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1348426771.07</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.95111</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.721416</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Feb-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.1408</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1344007754.96</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.528502</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.294533</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Feb-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.4869</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1336307763.61</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.792177</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.554865</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Feb-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.7106</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1327167271.32</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.918022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.668549</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Feb-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.184</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1332741572.24</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.451095</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.210985</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Feb-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.5049</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1348294912.05</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.938498</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.706074</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Feb-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.5419</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1331550067.42</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.980162</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.748764</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Feb-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.8657</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1312063493.31</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.092673</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.849021</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Feb-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.7415</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1302163945.57</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.952817</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.708389</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Jan-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.5704</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1300188192.79</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.76015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.51477</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Jan-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.517</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1299571116.23</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.700019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.452252</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Jan-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.047</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1294143154.52</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.170774</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.919337</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Jan-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.0026</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1282080525.72</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.994725</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.737008</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Jan-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.7184</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1290347440.65</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.800753</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.546204</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Jan-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.9002</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1292447566.47</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.00547</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.751708</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Jan-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.0822</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1294549310.84</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.210411</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.956945</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Jan-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.0527</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1294208676.43</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.177193</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.923703</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Jan-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.5536</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1299994026.19</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.741232</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.489957</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Jan-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.6909</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1301579662.36</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.895839</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.645628</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Jan-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.4477</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1287220831.23</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.495931</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.236487</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Jan-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.9099</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1281008807.9</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.89034</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.627374</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Jan-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.2038</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1272854234.67</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.095235</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.827601</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Jan-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.4128</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1263717418.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.204527</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.93111</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Jan-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.211</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1272936797.42</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.103342</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.834441</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Jan-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.9244</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1269626330.79</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.780616</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.509685</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Jan-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.6554</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1254970432.83</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.351655</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.07259</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Jan-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.9058</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1246311620.13</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.507567</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.222112</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Jan-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.7583</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1233058037.19</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.215422</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.922714</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Jan-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.4288</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1240802740.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.97044</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.680731</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Jan-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.5599</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1219216624.11</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118.865961</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">119.561939</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Dec-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.2532</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1215674428.74</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118.5206</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">119.215996</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Dec-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.254</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1215683581.33</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118.521501</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">119.215996</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Dec-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.5409</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1176656900.74</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.466409</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.143106</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Dec-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.0689</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1197785268.63</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118.313069</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">119.00404</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Dec-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.9199</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1196086815.19</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118.145287</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118.83418</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Dec-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.5833</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1215049722.33</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.018362</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.718181</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Dec-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.4423</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1221424869.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">119.859589</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.557901</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Dec-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.4894</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1233441338.73</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.038678</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.743783</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Dec-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.9625</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1250345128.22</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.697466</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.411159</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Dec-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.2408</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1265013668.97</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.136899</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.858733</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Dec-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.7897</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1271311892.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.754989</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.479986</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Dec-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.0374</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1251203785.97</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.781807</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.494998</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Dec-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.1001</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1228973240.67</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.600306</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.301414</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Dec-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.4446</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1255876877.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.240336</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.955074</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Dec-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.463</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1244612509.64</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.135003</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.839702</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Dec-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.8225</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1283162761.25</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.917975</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.647943</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Dec-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.5318</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1302777865.64</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.842736</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.582286</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Dec-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.849</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1306417805.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.19992</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.941605</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Nov-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.8746</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1295235543.71</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.102695</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.837452</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Nov-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.8866</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1295373807.89</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.116207</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.851241</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Nov-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.5134</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1279616640.02</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.569913</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.296289</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Nov-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.5409</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1279932210.85</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.600879</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.323176</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Nov-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.9053</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1317685126.03</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.011212</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.739738</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Nov-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.9186</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1297747858.99</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.900137</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.621552</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Nov-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.1556</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1288820543.64</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.040959</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.755926</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Nov-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.7606</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1279284648.42</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.72222</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.441723</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Nov-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.8854</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1269175967.88</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.7367</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.448744</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Nov-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.4303</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1275470013.16</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.350285</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.066832</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Nov-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.7152</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1290310270.43</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.79715</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.519754</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Nov-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.3692</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1286313829.53</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.407536</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.128429</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Nov-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.2586</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1296586636.97</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.409047</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.144342</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Nov-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.3301</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1308962273.06</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.615612</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.356007</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Nov-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.0271</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1305462507.04</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.274418</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.007797</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Nov-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.3334</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1320550524.28</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.74538</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.48837</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Nov-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.5373</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1322906369.76</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.974982</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.7146</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Nov-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.1529</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1318465854.87</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.542127</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.284103</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Nov-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.4828</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1310726536.74</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.78756</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.516857</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Nov-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.6734</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1312927790.42</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.002185</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.733118</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Nov-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.6857</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1313069767.92</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.016036</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.748059</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Nov-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.9401</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1307462617.25</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.302504</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.984416</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Oct-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.8942</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1306936145.02</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.250818</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.984416</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Oct-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.8153</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1283080907.05</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.909868</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.62786</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Oct-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.6544</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1269758841.07</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.602634</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.312466</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Oct-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.475</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11325000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1239804300.91</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.274568</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.978747</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Oct-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.8812</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11325000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1244404977.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.73197</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.437016</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Oct-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.8858</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11325000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1244456159.64</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.73715</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.440218</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Oct-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.429</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11325000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1250608632.45</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.348822</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.056487</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Oct-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.063</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11325000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1269113423.34</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.188791</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.905887</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Oct-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.1098</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1252827408.64</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.24149</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.95977</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Oct-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.1375</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1241961324.06</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.14663</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.859207</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Oct-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.8403</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1238640824.46</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.811967</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.520723</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Oct-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.3013</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1243791924.61</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.331077</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.04362</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Oct-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.4307</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1222888563.89</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.224684</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.92372</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Oct-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.5812</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1224569698.92</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.394154</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.095209</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Oct-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.2551</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1220926112.49</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.026949</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.72462</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Oct-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.2244</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1254107463.38</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.370536</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.084328</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Oct-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.4616</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1267932892.09</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.763688</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.488854</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Oct-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.4397</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1267688525.27</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.739027</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.462478</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Oct-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.5744</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1280368597.14</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.016758</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.74485</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Oct-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.4367</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1281346905.42</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.987753</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.725279</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Oct-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.6851</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1277701868.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.393517</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.141815</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Oct-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.7451</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1267408960.23</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.335028</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.079202</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Oct-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.2158</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1272563487.93</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.865061</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.610523</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Sep-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.7417</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Sep-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.7417</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1267371345.02</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.331199</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.073909</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Sep-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.9493</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1269645052.56</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.564968</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.305959</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Sep-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.6114</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1265945052.33</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.184475</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.924461</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Sep-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.9708</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1258929869.54</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.463126</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.202085</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Sep-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.1781</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1250249969.76</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.570504</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.305657</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Sep-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.7787</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1256826294.26</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.246811</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.983996</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Sep-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.8953</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1258103845.06</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.378109</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.115915</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Sep-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.1918</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1250399983.66</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.585931</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.316048</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Sep-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.944</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1247686339.64</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.306895</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.039172</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Sep-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.1994</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1250483871.84</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.594489</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.328593</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Sep-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.6934</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1255892550.74</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.150759</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.887925</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Sep-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.465</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1253391975.53</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.893568</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.625372</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Sep-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.4886</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1253650282.53</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.920143</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.652522</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Sep-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.9868</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1248155253.88</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.35509</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.0874</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Sep-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.0555</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1248908169.08</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.43245</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.159789</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Sep-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.0115</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1237475860.73</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.256851</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.979651</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Sep-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.7589</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1234710136.19</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.972411</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.693521</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Sep-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.3716</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1232915816.97</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.662343</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.386498</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Sep-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.5552</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1245787311.27</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.995138</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.731618</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Sep-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.2989</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1245228034.19</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.832583</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.574934</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Aug-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.0185</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1242200305.48</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.516838</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.25557</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Aug-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.7109</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1249677439.49</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.296517</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.035642</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Aug-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.1674</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1254607490.67</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.81056</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.553739</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Aug-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.1472</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1254390286.36</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.787813</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.529238</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Aug-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.312</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1256169275.75</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.973387</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.714487</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Aug-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.7099</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1249667373.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.295391</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.034055</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Aug-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.7081</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1249647326.44</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.293364</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.029358</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Aug-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.5844</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1248311238.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.154071</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.889143</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Aug-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.9116</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1251845107.67</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.522515</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.255972</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Aug-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.5725</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10650000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1230846943.32</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.140671</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.871805</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Aug-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.8285</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10650000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1222923703.83</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.302888</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.027981</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Aug-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.7922</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10650000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1222537164.17</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.262013</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.988638</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Aug-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.9412</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10650000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1213473968.71</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.303742</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.026822</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Aug-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.0411</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10650000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1225187474.9</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.542287</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.273363</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Aug-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.9611</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11250000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1293312424.35</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.452203</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.180702</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Aug-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.3134</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11250000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1297275873.92</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.848911</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.579832</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Aug-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.7775</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11250000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1313746638.73</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.497564</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.236338</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Aug-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.9643</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11250000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1315848071.86</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.707911</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.446056</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Aug-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.2426</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11250000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1318978821.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.021291</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.757333</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Aug-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.6606</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1303682342.18</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.365929</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.101272</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Aug-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.6529</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1303595926.48</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.357258</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.091935</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Aug-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.5593</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1302550637.99</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.25186</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.984378</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Jul-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.7278</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1304432725.71</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.441599</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.168909</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Jul-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.7923</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1305153633.14</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.51423</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.246502</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Jul-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.95</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1298144685.06</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.691808</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.425662</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Jul-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.5395</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1293588872.63</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.229564</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.960064</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Jul-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.1411</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1278066066.67</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.654892</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.380459</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Jul-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.0402</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1276946550.02</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.541274</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.26487</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Jul-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.5424</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1271420667.58</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.980725</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.701183</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Jul-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.9349</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1275777312.65</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.4227</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.148015</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Jul-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.2713</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1268411941.82</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.675452</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.398402</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Jul-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.4403</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1270287738.96</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.865755</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.58734</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Jul-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.1915</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1256426082.73</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.459541</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.175122</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Jul-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.0785</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1266271378.03</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.782718</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.496968</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Jul-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.1947</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1276126055.65</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.912877</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.628017</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Jul-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.7356</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1262464695.52</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.398625</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.111736</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Jul-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.2409</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1245873841.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.724367</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.42915</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Jul-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.2343</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1256900504.27</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.837104</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.546856</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Jul-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.9788</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1254064640.78</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.550911</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.258726</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Jul-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.1596</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1244971551.49</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.633301</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.337544</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Jul-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.8094</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1241084214.21</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.241031</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.938272</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Jul-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.6198</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1238979298.07</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.028655</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.726087</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Jul-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.3715</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1236223141.05</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.750527</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.450106</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Jul-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.2409</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1223674385.68</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.484108</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.174832</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Jun-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.191</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Jun-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.191</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1234219967.73</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.548343</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.246164</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Jun-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.407</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1214418126.41</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.550032</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.235058</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Jun-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.0531</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1221589203.57</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.273748</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.963348</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Jun-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.6949</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1217613687.31</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.872517</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.561735</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Jun-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.4055</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1214400800.61</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.548352</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.233128</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Jun-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.2806</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1235214234.15</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.648707</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.344921</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Jun-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.431</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1214684352</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.576915</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.262426</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Jun-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.6314</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1228008313.94</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.921519</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.613875</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Jun-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.62</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1216782061.04</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.788619</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.476753</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Jun-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.4504</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1225998922.21</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.718775</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.411904</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Jun-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.9713</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1242880878.04</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.42238</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.124533</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Jun-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.6015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1249876906.27</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.128286</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.832301</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Jun-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.9854</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1243038116.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.438174</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.138664</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Jun-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.9333</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1242459422.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.379816</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.082319</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Jun-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.6376</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1239177525.33</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.048593</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.746619</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Jun-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.3705</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1225112925.27</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.629277</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.317241</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Jun-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.8395</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1230318255.38</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.154618</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.848231</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Jun-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.8016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1229897483.97</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.112165</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.80767</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Jun-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.6223</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1227906976.56</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.911325</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.599927</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Jun-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.5459</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1238159960.63</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.945877</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.639815</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Jun-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.2705</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1243447738.06</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.637394</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.327277</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-May-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.4456</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1223055076.88</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.593269</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.27535</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-May-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.7882</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1238058090.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.097155</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.782319</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-May-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.4758</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1245742445.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.867356</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.558394</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-May-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.1168</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1264080605.98</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.705489</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.402631</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-May-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.2763</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1257366755.54</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.414416</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.109375</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-May-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.2868</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1257483450.31</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.426134</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.119664</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-May-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.5425</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1260321289</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.71149</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.407025</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-May-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.1555</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1278226224.93</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.511571</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.21036</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-May-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.244</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1279207845.3</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.610335</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.31014</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-May-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.7826</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1285187209.65</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.211404</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.916153</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-May-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.5114</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1282176288.44</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.908749</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.606184</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-May-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.8449</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1285878056.31</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.280929</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.982352</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-May-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.9317</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1286842274.08</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.377797</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.080493</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-May-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.9022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1277822097.42</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.344875</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.04684</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-May-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.5924</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1274405704.74</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.999144</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.701332</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-May-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.135</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1269363761.14</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.488693</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.185003</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-May-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.4607</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1272953702.76</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.852169</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.54895</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-May-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.1335</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1258322150.51</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.371036</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.054612</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-May-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.4019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1241750358.07</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.554583</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.232463</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-May-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.9935</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1248228566.95</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.214799</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.898453</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Apr-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.7698</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1254312482.29</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.965153</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.64303</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Apr-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.3456</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1249635388.53</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.242502</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.168968</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Apr-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.1866</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1247881890</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.064007</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.987256</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Apr-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.8835</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1233516065.37</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.601139</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.525243</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Apr-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.6373</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">11025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1241825758.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.447359</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.372442</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Apr-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.6509</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1233527173.62</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.462627</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.386714</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Apr-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.5232</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1232129393.32</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.31927</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.239012</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Apr-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.7882</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1235031024.77</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.616761</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.537237</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Apr-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.7541</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1234657586.83</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.57848</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.497854</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Apr-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.5571</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10866953.92</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1232500683.74</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.357326</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.276177</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Apr-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.3625</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10866031.73</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1219418972.78</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.016261</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.935031</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Apr-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.9545</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10823676.35</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1225901772.43</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.203059</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.857938</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Apr-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.8618</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10888232.78</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1224886628.44</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.100217</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.752899</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Apr-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.99</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10887798.97</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1215340747.64</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.133037</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.779641</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Apr-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.5966</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10888355.78</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1221982675.97</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.806003</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.456454</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Apr-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.6974</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10888043.71</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1212136097.65</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.808424</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.452605</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Apr-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.5553</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10888322.69</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1210580819.69</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.650778</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.293384</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Apr-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.4839</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10847416.35</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1229109599.17</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.081893</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.727119</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Apr-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.1641</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10973158.27</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1203534000.81</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.520758</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.150613</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Apr-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.9947</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10978052.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1212692002.39</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.437767</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.069383</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Mar-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.357</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10978873.31</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Mar-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.357</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10978873.31</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.941791</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.579841</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Mar-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.357</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10978873.31</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1219359369.31</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.941791</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.579841</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Mar-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.4823</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10903823.13</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1220731434.07</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.080127</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.722105</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Mar-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.2474</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10903305.23</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1207208609.68</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.716757</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.353659</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Mar-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.6604</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10903407.12</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1189831815.43</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">119.964656</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.591228</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Mar-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.3488</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10905183.37</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1197369572.35</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.724673</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.354297</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Mar-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.1947</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1206631869.64</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.658574</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.291122</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Mar-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.9993</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1226392368.23</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.650912</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.292692</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Mar-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.6963</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1234024252.77</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.420423</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.065995</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Mar-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.2887</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1229561642.08</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.970419</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.613383</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Mar-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.0786</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1238210736.12</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.842494</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.486226</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Mar-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.1665</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1230685377.07</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.939539</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.585252</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Mar-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.9019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1219340149.92</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.095395</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.73627</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Mar-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.0227</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1220645035.38</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.228172</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.869035</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Mar-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.0657</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1231909888.3</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.374579</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.021142</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Mar-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.6572</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1227497951.95</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.925579</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.569188</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Mar-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.1096</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1221583222.43</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.323687</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.962693</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Mar-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.6895</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1206246507.64</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.762794</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.393214</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Mar-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.5369</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1204598946.44</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.595064</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.222744</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Mar-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.9805</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1209388923.85</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.35721</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.986589</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Mar-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.765</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1193694583.79</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">119.93641</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.553053</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Mar-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.7659</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1207071660.33</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.122724</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.747445</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Feb-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.283</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1223456231.97</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.780406</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.413467</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Feb-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.3604</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1235092525.01</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.957644</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.596425</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Feb-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.7738</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1239557198.24</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.409352</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.050397</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Feb-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.8074</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1229119948.72</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.3534</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.987292</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Feb-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.9933</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1231127180.75</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.556527</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.192001</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Feb-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.2578</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1233983777.55</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.845537</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.483168</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Feb-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.1056</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1232340522</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.679233</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.315244</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Feb-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.3083</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1215231026.57</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.808051</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.440105</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Feb-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.3347</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1226239722.78</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.929562</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.564987</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Feb-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.4684</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1216948225.88</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.982987</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.616316</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Feb-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.1568</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1213607212.69</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.642512</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.27257</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Feb-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.429</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1195076247.38</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.754605</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.373357</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Feb-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.2828</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1204233482.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.687522</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.312963</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Feb-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.5067</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10650000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1176896867.44</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.74684</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.362437</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Feb-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.579</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10650000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1188315933.08</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.918505</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.532914</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Feb-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.3339</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10650000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1217656170.85</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.928688</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.562871</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Feb-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.4243</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10575000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1188887189</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.842135</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.459685</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Feb-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.5075</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10575000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1221492108.84</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.21104</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.846677</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Feb-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.1113</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10575000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1238451744.83</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.963457</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.607328</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Feb-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118.1502</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10575000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1249438258.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.098627</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.748664</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Jan-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118.5814</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10500000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1245104962.62</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.569784</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.220548</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Jan-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">119.5129</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10500000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1254885516.47</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.587602</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.240547</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Jan-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">119.9347</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10500000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1259314787.74</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.048488</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.705391</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Jan-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.6319</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10500000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1266634783.94</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.810295</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.469633</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Jan-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.2314</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10500000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1262429449.02</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.372682</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.027991</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Jan-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.1435</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10500000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1272007116.69</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.369302</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.029025</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Jan-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.2384</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10500000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1273003667.86</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.472996</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.135088</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Jan-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.9417</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10500000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1269888049.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.148802</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.809889</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Jan-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.7675</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10500000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1268058747.01</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.95846</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.618244</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Jan-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.0729</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10500000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1260765889.38</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.199495</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.853957</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Jan-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">119.9814</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10500000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1259804302.22</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.099516</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.75565</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Jan-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.1424</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10575000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1270506275.29</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.275435</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.929086</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Jan-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.9172</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10575000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1278698904.37</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.122032</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.777444</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Jan-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.9565</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10575000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1279115114.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.164974</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.819192</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Jan-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.4231</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10575000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1273474403.76</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.582146</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.233545</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Jan-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.6803</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10575000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1276193679.54</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.86318</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.516414</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Jan-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.79</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10575000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1287928997.14</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.07571</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">133.734586</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Jan-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.8783</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10575000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1278288249.98</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.079527</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.732442</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Jan-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.9986</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10575000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1279560575.56</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.210975</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.863724</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Jan-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.3077</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10575000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1272253455.91</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.456052</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132.101101</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Jan-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">119.9214</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10575000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1268169181.02</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.033956</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.678867</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Dec-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118.7483</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10575000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1255763062.64</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.75215</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.391008</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Dec-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">119.0587</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10575000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1259045816.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.091313</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.729438</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Dec-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">119.332</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10575000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1261935796.53</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.389939</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.027315</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Dec-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118.8075</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10500000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1247478725.74</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.816836</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.450176</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Dec-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">119.0776</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10425000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1241383741.3</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.111965</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.74575</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Dec-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.8721</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10425000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1228816657.32</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.794757</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.421887</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Dec-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118.8976</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10350000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1230590049.01</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.915285</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.546867</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Dec-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">119.4218</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10350000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1236015191.33</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.48806</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131.121473</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Dec-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118.7219</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10350000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1228771444.12</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.723304</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.352729</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Dec-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118.6579</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10200000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1210310632.28</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.653373</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.282802</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Dec-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118.7617</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10200000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1211368920.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.766792</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.397072</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Dec-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118.4067</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10200000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1207748112.64</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.378896</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130.009087</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Dec-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.9127</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10200000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1202709389.62</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.839119</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.466125</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Dec-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118.0798</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10200000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1204414415.14</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.021703</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.647436</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Dec-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.4431</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10125000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1189111103.17</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.326003</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.949313</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Dec-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.7835</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10125000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1192558026.12</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.697947</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.321143</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Dec-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.5904</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10125000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1190603077.97</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.486953</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.109294</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Dec-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118.0226</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10125000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1194978833.74</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.959203</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.582876</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Dec-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.292</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10125000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1187581382.63</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.160902</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.775577</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Nov-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.9161</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10125000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1193900805.34</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.842834</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.462407</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Nov-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.6963</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10125000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1191674799.53</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.602666</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.220982</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Nov-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118.0515</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10125000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1195271285.07</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.990781</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.613177</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Nov-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.3619</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10050000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1179486711.71</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.237279</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.853136</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Nov-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118.0597</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">10050000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1186500054.99</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.999741</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.621118</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Nov-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.9244</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1167451469.12</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.851903</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.472766</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Nov-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.6501</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1164735733.73</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.552185</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.170647</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Nov-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118.1065</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1169254290.67</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.050878</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.671493</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Nov-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.6935</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1165165835.98</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.599607</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.217772</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Nov-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.348</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1151845328.54</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.129426</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.743674</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Nov-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.9762</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1130768259.27</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.723173</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.332482</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Nov-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.1283</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1122501023.48</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.796702</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.398824</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Nov-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.6838</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1075859579.82</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.403677</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.008897</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Nov-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.9877</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1078685432.61</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.735738</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.341339</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Nov-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.8003</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1076942352.36</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.530973</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.13644</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Nov-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.2521</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1081144952.31</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.024639</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.633054</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Nov-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.4327</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1092124000.3</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.31464</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.93202</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Nov-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.9297</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1087445929.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.765029</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.379699</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Nov-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.7267</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1103687793.16</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.635883</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.253946</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Nov-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118.104</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1107225044.21</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.048146</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.668132</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Nov-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.4626</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1101211820.76</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.34731</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.962312</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Nov-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.5215</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1101763882.53</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.411668</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.028897</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Oct-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.1393</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1098180512.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.994052</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.60692</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Oct-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.3138</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1090441887.83</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.092056</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.700426</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Oct-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.3309</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1090602393.43</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.110741</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.71743</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Oct-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.4668</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1091876136.05</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.259234</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.866767</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Oct-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.0618</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1078704722.59</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.724039</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.321724</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Oct-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.2007</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1089381384.64</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.968476</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.569301</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Oct-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.7763</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1094777593</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.597414</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.200219</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Oct-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.5901</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1093032342.05</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.39396</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.996704</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Oct-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.5208</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1092382753.85</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.318238</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.91859</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Oct-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.4809</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1101383819.05</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.367306</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.974485</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Oct-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.9521</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1096426296.79</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.789505</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.390723</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Oct-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.0997</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1089027490.73</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.950782</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.555172</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Oct-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.5777</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1093472925.56</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.473076</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129.079191</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Oct-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.3796</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1091630139.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.256619</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.859932</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Oct-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.9347</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1087492907.82</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.770492</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.371607</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Oct-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.9201</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1087357290.23</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.754539</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.207673</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Oct-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.7863</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1086112769.94</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.608341</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.207673</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Oct-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.642</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1084770224.96</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.450669</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.048011</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Oct-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.8504</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1086709098.82</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.678381</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.277222</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Oct-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.0642</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1088697450.19</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.911992</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.512215</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Oct-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.0163</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1088251884.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.859654</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128.458155</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Oct-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.444</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1082929326.29</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.234321</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127.830374</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Sep-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.4184</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1073391105.02</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.113684</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.702113</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Sep-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.8411</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1068021976.58</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.482888</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.067272</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Sep-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.5488</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1065303904.03</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.163502</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.744139</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Sep-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.7858</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1067507845</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.422464</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.005202</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Sep-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.172</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1071099943.92</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.844451</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.428414</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Sep-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.1315</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1070723320.12</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.800198</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.383285</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Sep-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.0732</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9225000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1061549860.54</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.736496</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.318759</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Sep-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.7532</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9225000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1058597957.65</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.386843</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.968161</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Sep-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.6883</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">9525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1092406486.15</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.315929</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.895551</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Sep-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.1957</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">993502227.59</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.777682</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.356143</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Sep-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.8655</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">990629847.96</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.416884</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.992871</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Sep-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.433</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">995567527</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.036971</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.61416</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Sep-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.1984</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">993526195.27</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.780632</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.355221</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Sep-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.2439</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">993921722.39</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.830348</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.405825</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Sep-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.3576</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">986211515.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.861919</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.432604</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Sep-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.4202</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">978055998.82</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.837655</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.402459</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Sep-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.3228</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">968784554.75</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.731229</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.294074</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Sep-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.6688</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">963143645.24</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.016626</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.575824</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Sep-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.852</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">956334720.27</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.216802</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.778066</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Sep-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.7856</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">955766786.74</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.144249</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.70404</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Sep-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.7062</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">963638329.83</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.150157</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.712871</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Aug-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.4453</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">961407657.51</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.865081</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.426261</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Aug-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.5407</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">953672664.02</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.876656</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.433057</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Aug-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.9757</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">948842026.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.2593</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.80983</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Aug-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.7315</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">955304040.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.085136</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.64235</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Aug-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.3181</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">960319642.23</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.726094</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.284746</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Aug-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.7238</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">963788162.22</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.169388</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.729393</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Aug-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.9046</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">965334075.84</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.366942</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.93041</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Aug-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.008</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">966218352.67</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.479923</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.042135</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Aug-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.9539</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">957205963.36</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.328145</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.884378</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Aug-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.8527</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">956340493.32</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.217567</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.772896</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Aug-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.7163</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">963724579.91</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.161193</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.71848</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Aug-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.6519</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">971723770.83</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.183491</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.743836</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Aug-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.3131</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">968827057.02</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.813296</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.372993</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Aug-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.5522</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">962355015.86</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.074552</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.635483</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Aug-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.7339</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">946944504.49</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.087758</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.63818</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Aug-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.5662</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">953998250.12</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.997184</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.551291</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Aug-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.6174</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">962907700.62</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.145794</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.707429</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Aug-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.2598</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">976826506.05</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.940387</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.506017</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Aug-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.1951</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">976278607.03</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.869692</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.43658</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Aug-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.4556</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">969827314.09</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.154331</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.721872</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Aug-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.9485</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">965567177.57</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.60024</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">126.162831</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Aug-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.7899</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">964235234.05</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.426944</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.990813</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Jul-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.9227</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">956950764.93</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.479384</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.043005</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Jul-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.4056</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8325000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">944101956.87</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.914367</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.473242</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Jul-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.397</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8325000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">944030214.97</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.90497</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.462109</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Jul-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.0523</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8325000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">941160107.01</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.528328</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.083404</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Jul-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.3602</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8325000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">935398464.32</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.772095</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.318278</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Jul-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.0218</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8250000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">924179847.52</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.402337</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.949365</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Jul-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.5371</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8250000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">928430672.95</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.965387</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.513925</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Jul-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.6514</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8250000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">937623754.77</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.182944</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.738505</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Jul-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.5773</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8250000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">937012530.59</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.101978</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.652377</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Jul-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.023</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">923963159.14</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.496313</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.045812</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Jul-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.4363</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">935516684.31</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.275712</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.823972</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Jul-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.2867</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">934294014.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.113249</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.658912</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Jul-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.8682</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">930872657.32</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.658765</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.199901</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Jul-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.0145</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">932068363.54</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.817645</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.359282</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Jul-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.2916</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">917983607.06</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.946607</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.480472</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Jul-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.1136</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">924703701.46</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.839284</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.376241</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Jul-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.4135</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">918980529.92</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.078988</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.613946</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Jul-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.2924</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">909568144.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.947476</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.485866</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Jul-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.1926</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">916860320.19</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.925076</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.466931</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Jul-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.29</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">917648804.09</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.030851</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.566565</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Jul-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.7846</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">930188697.61</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.567977</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.108701</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Jun-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.6129</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">920610348.39</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.295533</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.833459</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Jun-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.868</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">922696213.43</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.572567</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.107313</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Jun-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.4637</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">935740723.02</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.305467</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.847989</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Jun-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.5032</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">936063605.17</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.348364</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.890579</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Jun-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.1745</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">941551844.25</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.077383</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.625365</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Jun-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.2535</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">934022507.72</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.077194</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.620222</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Jun-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.4786</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">935862345.13</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.321649</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.867404</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Jun-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.7856</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">930196891.63</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.569063</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.113591</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Jun-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.2163</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">925151920.27</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.036796</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.579754</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Jun-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.3987</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">926629159.74</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.234879</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.782953</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Jun-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.5791</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">919990831.28</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.344808</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.888241</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Jun-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.1447</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">908372237.23</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.787076</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.322204</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Jun-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.2316</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">909075612.92</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.881448</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.414244</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Jun-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.34</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">909953870.09</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.999168</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.533092</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Jun-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.522</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">903328046.19</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.110835</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.638161</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Jun-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.2563</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">909276038.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.908272</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.441524</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Jun-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">888810389.35</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.412738</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.943586</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Jun-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.5704</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">894934372.87</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.249379</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.776152</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Jun-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.9188</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">889235357.21</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.627735</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.152514</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Jun-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.4282</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">901122203.18</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.266915</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.795337</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Jun-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.1774</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">899147244.75</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.994551</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.523213</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-May-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.9699</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">897512650.48</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.76921</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.295211</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-May-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.953</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">897379783.86</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.750857</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.277035</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-May-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.2008</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">899331004.37</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.019963</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.544236</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-May-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.3762</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">892134445.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.210444</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.737325</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-May-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.1928</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">890703727.38</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.011275</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.537072</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-May-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.4213</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">892486230.47</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.259422</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.781689</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-May-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.6427</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">894212673.51</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.499858</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.020668</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-May-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.8586</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">888096934.65</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.64834</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.166027</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-May-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.7323</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">879311983.68</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.425199</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.937774</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-May-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.5356</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">885577594.88</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.297568</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.814618</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-May-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.3416</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">899664396.29</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.258851</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.784311</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-May-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.0699</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">897545235.01</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.963789</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.488605</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-May-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.5997</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">901677417.95</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.104424</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.630491</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-May-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.8402</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">895753651.14</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.282477</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.800413</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-May-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.1686</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">915590342.01</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.637878</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.167391</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-May-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.4029</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">917452711.68</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.891443</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">125.415975</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-May-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.3842</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">909354347.73</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.788984</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">124.310299</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-May-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.8643</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">896681513.65</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.226338</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.746011</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-May-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.4059</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">893071843.51</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.730248</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">123.252984</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-May-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.417</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">885283970.56</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.660039</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">122.170422</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-May-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.25</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">883969075.38</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.479308</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.987963</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Apr-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.3326</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">876744287.34</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.486479</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.987211</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Apr-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.6325</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">879105938.17</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.811037</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">121.268106</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Apr-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.3277</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">876705856.63</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.481176</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.977947</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Apr-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.6149</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">854499869.26</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">119.709769</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120.201397</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Apr-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.5368</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">846171900.12</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118.543026</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">119.027738</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Apr-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.659</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">831665694.81</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.510832</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.991527</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Apr-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.726</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">832183552.46</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.58334</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.064803</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Apr-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.4134</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">829768810.85</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.245038</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.725963</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Apr-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.1658</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7650000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">819818233.99</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.97708</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.454186</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Apr-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.3229</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7650000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">828670534.74</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.229318</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.711095</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Apr-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.6524</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7650000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">831190592.33</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.58591</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">118.068124</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Apr-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.2685</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7650000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">828253773.37</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.170445</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.6497</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Apr-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.032</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7650000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">826444424.93</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.9145</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.392407</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Apr-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.5084</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">838227252.56</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.415676</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.888544</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Apr-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.4705</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">837934850.44</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.375014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.84791</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Apr-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.4833</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">838033197.35</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.388747</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.858846</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Apr-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.456</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">837822220.45</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.359457</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.8303</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Apr-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.2597</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">836306247.99</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.148853</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.618843</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Mar-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.5079</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">838223287.85</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.415139</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.88458</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Mar-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.7389</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">840008153.49</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.662973</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.132323</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Mar-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.1749</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">835651320.69</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.057873</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.523816</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Mar-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.4479</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">830035027.65</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.277895</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.73911</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Mar-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.3527</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7650000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">821248045.49</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.175757</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.638316</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Mar-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.6424</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7650000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">823464467.02</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.486568</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.949484</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Mar-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.7961</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7650000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">824640176.24</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.651469</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.114987</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Mar-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.9614</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7575000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">810232262.18</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.755942</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.21476</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Mar-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.5729</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7575000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">814864889.19</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.412004</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.872952</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Mar-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.5384</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7575000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">822178358.26</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.447862</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.913312</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Mar-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.5111</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7575000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">821971320.06</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.418573</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.882871</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Mar-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.1849</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7500000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">811387046.28</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.068602</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.53197</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Mar-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.3256</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7500000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">812442018.57</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.704576</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.164573</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Mar-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.0254</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7500000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">810190828.98</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.383927</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.84228</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Mar-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.2473</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7500000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">811854692.32</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.620942</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.080004</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Mar-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.0913</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7500000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">810684501.92</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.454316</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.912266</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Mar-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.6836</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7500000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">807626875.59</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.018844</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.474343</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Mar-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.5681</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7500000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">806760794.34</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.895476</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.349352</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Mar-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.5288</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7425000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">798401086.59</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.853499</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.307551</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Mar-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.861</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7425000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">800867848.87</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.208328</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.66277</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Mar-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.9096</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7425000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">801228476.94</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.260239</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.714568</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Mar-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.8303</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7425000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">800639792.21</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.175537</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.62871</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Mar-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.6504</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7425000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">799304189</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.2357</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.686588</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Feb-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.631</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7425000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">791735067.95</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.15394</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.601127</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Feb-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.3174</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7425000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">789406483.36</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.821156</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.265975</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Feb-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.2698</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7425000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">789052983.11</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.770644</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.214367</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Feb-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.8411</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7425000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">793294868.78</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.376892</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.82207</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Feb-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.0157</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">858800802.85</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.562173</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.008154</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Feb-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.7998</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">857068483.12</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.333066</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.777243</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Feb-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.1697</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">852012125.16</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.664421</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.105948</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Feb-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.9715</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">850421487.28</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.454096</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.893546</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Feb-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.5547</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">847076598.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.011799</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.449851</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Feb-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.7728</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">840893917.89</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.243241</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.681975</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Feb-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.0875</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">835445679.65</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.516019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.951226</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Feb-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.4517</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">838340668.75</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.902498</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.338506</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Feb-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.3744</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">837726871.9</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.82047</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.255727</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Feb-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.0919</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">827599013.44</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.520688</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.955</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Feb-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.4057</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">822194926.43</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.792511</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.223347</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Feb-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.3013</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">821372561.64</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.681725</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.111508</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Feb-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.7416</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">816964710.87</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.087786</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.514314</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Feb-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.9648</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">818723040.75</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.32464</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.75177</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Feb-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.1085</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">811979439.06</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.415958</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.839165</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Feb-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.649</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">816236113.46</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.989522</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.414652</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Jan-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.1825</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">812561891.62</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.494485</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.917217</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Jan-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.4883</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">814970312.15</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.818991</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.241573</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Jan-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.1938</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">820526501.12</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.567649</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.992974</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Jan-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.4598</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">822621258.08</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.849921</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.274447</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Jan-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.2513</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">820978914.19</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.628666</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.053589</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Jan-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.5941</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">807928461.09</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.87009</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.28857</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Jan-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.4861</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">807078417.78</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.755484</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.174025</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Jan-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.981</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">810975442.39</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.280658</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.700005</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Jan-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.9932</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">811071709.17</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.293605</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.713594</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Jan-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.3785</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">814105904.87</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.702475</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.122006</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Jan-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.2456</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">805315483.95</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.561445</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.981033</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Jan-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.8533</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">810055636.39</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.206319</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.626769</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Jan-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.8043</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">817473244.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.215495</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.638136</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Jan-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.9228</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">810598005.36</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.280071</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.698441</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Jan-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.5236</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">815284366.05</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.917624</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.338615</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Jan-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.7322</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">816911143.43</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.138984</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.561092</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Jan-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.4642</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">814820794.08</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.85459</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.274539</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Jan-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.36</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7500000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">782699816.64</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.744016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.16302</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Jan-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.0891</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">671374484.23</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.456544</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.87336</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Jan-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.6369</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">668457715.02</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.976682</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.391825</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Jan-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.1668</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">665425574.26</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.477824</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.890922</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Dec-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.0809</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">658421954.95</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.325496</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.733357</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Dec-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.3828</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">660369323.39</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.645865</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.054579</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Dec-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.4358</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">660710817.04</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.702107</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.111482</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Dec-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.4423</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">660752808.11</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.709004</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.117867</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Dec-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.0725</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">658367447.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.316583</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.723269</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Dec-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.0911</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6225000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">635517345.56</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.33632</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.742437</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Dec-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.9952</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6225000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">634920300.45</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.234554</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.642011</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Dec-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.0741</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6225000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">635410969.61</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.31828</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.724037</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Dec-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.9583</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6225000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">634690127.63</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.195397</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.599497</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Dec-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.8564</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6225000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">634056162.96</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.087263</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.488027</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Dec-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.6205</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6225000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">632587663.11</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.836932</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.236421</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Dec-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.8916</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6225000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">628050445.44</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.063443</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.469525</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Dec-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.1361</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6225000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">629571932.86</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.3229</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.7294</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Dec-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.7539</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6225000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">620967793.88</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.856147</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.261607</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Dec-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.5081</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6225000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">625662999.51</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.656483</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.063252</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Dec-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.8834</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6225000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">615549167.71</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.932396</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.333624</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Dec-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.6588</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6225000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">614150942.17</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.694056</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.093817</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Dec-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.5388</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">620794273.86</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.566715</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.958976</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Dec-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.8119</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">616215174.79</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.795349</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.183659</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Dec-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.0835</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">611625764</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.02239</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.407726</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Dec-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.1015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">611739607.44</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.041491</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.430415</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Nov-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.1876</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">618582182.93</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.194032</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.58297</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Nov-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.865</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">616549360.17</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.851697</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.240519</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Nov-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.6027</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">614897019.57</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.573351</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.960984</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Nov-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.2406</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">618915718.92</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.250274</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.638053</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Nov-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.292</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">634830526.87</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.243645</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.628969</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Nov-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">96.7459</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">631266897.31</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.664138</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.045916</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Nov-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">96.6892</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">630897347.28</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.60397</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.984277</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Nov-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.8387</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">631059483.32</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.823788</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.20801</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Nov-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.4747</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">635161824.96</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.498694</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.882131</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Nov-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.0115</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">638624081.23</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.068332</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.455398</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Nov-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.3896</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">634613135.19</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.408388</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.791308</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Nov-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.2701</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">633842026.04</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.281578</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.665561</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Nov-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.0984</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">632734423.91</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.099375</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.441924</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Nov-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.9415</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">631722935.86</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.932877</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.315536</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Nov-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.6065</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">636011745.57</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.638557</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.025583</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Nov-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.3546</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">634387271.14</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.371247</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.755761</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Nov-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">96.7041</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6075000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">587477571.19</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.619781</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.000027</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Nov-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">96.5605</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6075000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">586605261.75</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.467397</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.846452</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Nov-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">94.8814</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">626217218.46</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.685581</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.056594</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Nov-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">95.501</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">630306663.73</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.343084</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.716295</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Nov-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">96.1013</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">634268707.21</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.980106</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.354621</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Nov-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">96.9115</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">639615656.93</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.839869</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.217926</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Oct-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.6837</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">644712229.62</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.659306</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.039892</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Oct-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.489</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">650027312.55</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.513869</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.896524</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Oct-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.6208</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">650897454.31</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.653732</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.035412</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Oct-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.352</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">649123501.56</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.368488</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.751583</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Oct-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.7435</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">651707170.84</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.783938</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.166153</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Oct-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.4559</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">656409231.82</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.539917</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.924079</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Oct-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.9998</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">659998903.26</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.117089</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.502287</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Oct-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.316</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">662085399.82</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.452632</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.837542</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Oct-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.6686</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">664413049.99</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.826802</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.214587</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Oct-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.415522</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">662742448.21</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.558242</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.944788</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Oct-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.561374</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">657105069.24</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.651843</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.034047</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Oct-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.624364</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">664120804.08</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.77986</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.165382</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Oct-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.54881</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">657022148.18</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.638511</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.02121</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Oct-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.329107</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">662172109.78</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.466541</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.849702</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Oct-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.102791</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">667278425.49</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.287554</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.673667</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Oct-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.53666</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">670141961.66</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.747964</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.135639</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Oct-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.974002</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">666428414.13</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.150886</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.536816</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Oct-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.600445</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">670562942.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.815651</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.20416</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Oct-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.885613</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">649520786.34</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.118263</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.506308</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Oct-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.31922</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">652285029.32</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.578395</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.971056</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Oct-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.557884</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">647431512.32</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.770486</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.159011</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Sep-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.159932</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">644894569.98</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.34819</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.733382</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Sep-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.382273</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">646311990.63</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.584132</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.970279</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Sep-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.003535</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">650272539.49</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.243399</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.629281</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Sep-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.463676</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">646830937.38</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.670515</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.056167</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Sep-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.371477</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">646243169.29</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.572676</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.955441</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Sep-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.59677</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">654054410.47</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.872924</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.260895</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Sep-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.970918</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">656439604.74</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.269959</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.655676</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Sep-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.965584</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">650030603.69</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.203126</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.58655</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Sep-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.025984</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">650415649.03</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.267221</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.649505</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Sep-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.594973</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">647667953.19</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.809844</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.191383</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Sep-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.798549</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">642590754.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.9647</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.341911</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Sep-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.430318</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">646618280.83</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.635116</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.015018</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Sep-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.13886</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">652345647.65</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.325829</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.703414</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Sep-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.193781</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">652699889.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.38411</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.759902</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Sep-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.493487</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">654632992.82</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.70215</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.080008</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Sep-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.249264</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">659507757.92</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.50416</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.884681</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Sep-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.917266</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">663816366.31</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.213025</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.595535</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Sep-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.016064</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">664453618.02</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.317867</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.700882</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Sep-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.818505</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">663179361.49</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.108223</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.490566</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Sep-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.905648</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">663741434.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.200697</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.583029</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Sep-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.649192</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">662087289.28</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.928553</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.310077</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Sep-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.926387</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">650975197.52</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.100358</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.47352</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Aug-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.541087</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">654940016.88</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.752661</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.128018</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Aug-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.950114</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">657578240.85</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.18671</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.561141</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Aug-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.379866</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">646296647.89</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.581578</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.956011</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Aug-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.227072</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">645322587.71</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.419437</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.791927</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Aug-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.898903</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">643230507.89</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.071193</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.441595</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Aug-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.547022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">647362269.51</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.758959</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.132351</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Aug-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.583092</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">647592215.17</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.797236</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.169146</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Aug-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.091114</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">644455858.04</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.275162</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.645295</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Aug-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.754548</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">642310247.16</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.918007</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.286006</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Aug-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.488359</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">639376667.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.696708</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.068389</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Aug-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.004841</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">575727598.84</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.183612</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.55312</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Aug-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.813307</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">580335850.68</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.041534</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.412976</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Aug-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.888388</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">586463815.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.182381</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.558741</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Aug-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.753347</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">585694083.45</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.039079</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.413936</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Aug-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.757307</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">585716650.05</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.043281</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.418128</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Aug-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.734585</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">579887136.22</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.957996</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.329008</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Aug-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.923512</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">588608284.63</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.158481</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.528123</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Aug-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.143722</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">584104996</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.330988</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.696732</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Aug-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.34885</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">585289611.38</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.548665</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.913034</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Aug-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.090132</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">578020512.58</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.212947</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.572398</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Aug-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.198982</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">565434199.55</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.267283</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.623817</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Aug-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.254248</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">565749218.59</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.32593</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.680307</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Jul-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.556453</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">573171782.17</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.707794</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.065749</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Jul-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.161696</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">570921669.87</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.288889</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.646874</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Jul-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.512205</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">609073233.39</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.722013</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.083719</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Jul-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.505779</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">609034679.38</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.715194</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.075656</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Jul-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.125822</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">606754936.96</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.311993</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.671622</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Jul-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.116125</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">606696755.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.301703</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.659744</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Jul-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.923448</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">605540689.28</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.09724</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.453141</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Jul-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.201987</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">607211924.39</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.392818</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.751047</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Jul-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.139137</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">600834822.08</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.26495</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.618337</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Jul-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.478849</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">608873099.25</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.837678</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.184338</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Jul-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.304996</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">607829978.02</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.654644</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.003143</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Jul-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.574565</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">609447393.32</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.938448</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.286479</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Jul-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.231084</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">607386507.46</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.576829</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.925843</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Jul-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.170014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">607020089.83</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.512534</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.859248</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Jul-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.859327</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">605155964.78</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.18544</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.528995</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Jul-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.603858</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">597623152.78</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.863673</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.20005</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Jul-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.654628</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">591927771.66</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.864317</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.194964</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Jul-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.808198</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">586849188.54</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.973189</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.298386</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Jul-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.45807</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">590748425.75</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.657379</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.98977</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Jul-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.954201</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">599725210.45</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.232517</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.571379</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Jul-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.317843</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">601907059.65</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.615362</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.95481</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Jun-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.442395</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">596654372.46</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.693684</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.028542</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Jun-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.891921</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">593351531.65</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.114141</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.448864</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Jun-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">96.438323</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5925000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">571397065.61</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.530975</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.851537</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Jun-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">94.209725</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">551126892.44</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.184691</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.499431</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Jun-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">96.411615</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">556777078.09</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.502857</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.821384</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Jun-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.709076</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">575819914.72</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.974448</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.311706</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Jun-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.065306</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">572102144.03</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.296682</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.627465</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Jun-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.680294</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">569878702</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.891338</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.220139</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Jun-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.288881</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">567618292.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.479256</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.809821</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Jun-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">96.000349</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">554402019.11</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.069873</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.387104</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Jun-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">95.008663</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">598554582.17</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.025818</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.344134</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Jun-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">95.671629</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">602731264.88</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.723794</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.040004</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Jun-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">95.130728</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">599323591.49</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.154329</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.468328</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Jun-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">96.870604</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">610284807.19</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.986084</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.307138</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Jun-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.59599</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">621154739.18</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.802583</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.132459</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Jun-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.419567</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">572391533.91</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.722458</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.0614</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Jun-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.209417</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5700000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">576893677.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.554018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.895912</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Jun-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.07799</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">558876998.12</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.468458</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.814253</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Jun-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.478198</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">555593137.41</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.836992</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.174539</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Jun-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.265769</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">554430086.49</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.613346</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.951051</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Jun-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.853983</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">557650560.62</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.232622</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.569047</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Jun-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.682791</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">549087072.49</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.052389</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.390646</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-May-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.049751</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">551068656.43</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.438728</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.783829</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-May-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.688972</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">554520453.76</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.111704</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.451592</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-May-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.820755</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">555232080.3</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.250446</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.59085</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-May-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.161074</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">551669803.27</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.555929</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.89368</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-May-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.432545</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">547735745.98</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.788929</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.121773</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-May-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.966927</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">545221407.04</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.298722</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.629612</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-May-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.013711</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5325000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">532573013.92</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.29517</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.627055</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-May-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.501831</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5325000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">529847254.27</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.756259</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.081682</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-May-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.426884</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5325000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">524123162.43</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.624547</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.947072</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-May-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.029449</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5325000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">527331821.09</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.258931</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.585769</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-May-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.33402</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5325000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">523628659.99</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.526779</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.84975</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-May-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.428501</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5325000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">524131771.73</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.626249</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.947514</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-May-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.92975</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5325000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">521475921.89</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.10116</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.421823</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-May-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.32643</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5325000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">523588241.57</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.518788</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.838105</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-May-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.323191</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5325000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">523570997.18</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.515378</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.833589</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-May-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.097006</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5250000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">509759286.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.224441</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.540489</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-May-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">96.10662</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">518975750.66</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.181756</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.496374</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-May-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">96.564898</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">521450449.61</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.28503</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.593866</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-May-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.638788</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5400000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">527249456.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.411412</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.72459</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-May-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.033833</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5250000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">519927627.37</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.874647</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.191015</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Apr-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.751629</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5250000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">518446055.54</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.578649</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.895806</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Apr-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.243037</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5250000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">526275945.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.142958</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.46182</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Apr-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.107713</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5250000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">525565496.16</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.001019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.320346</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Apr-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.86556</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5250000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">524294191.33</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.74703</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.062414</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Apr-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.761211</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5250000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">523746358.76</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.63758</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.952097</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Apr-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.084089</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5250000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">525441470.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.97624</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.292752</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Apr-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.606981</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5250000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">528186654.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.524692</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.841726</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Apr-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.054727</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5250000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">530537317.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.994324</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.314774</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Apr-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.706925</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5250000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">528711356.57</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.629521</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.947441</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Apr-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.428673</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5250000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">522000534.3</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.288787</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.602368</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Apr-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.091563</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5250000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">520230710.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.935199</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.247576</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Apr-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.21556</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">513440524.34</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.065257</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.378814</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Apr-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.295715</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5175000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">508680329.99</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.10045</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.408909</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Apr-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">96.682938</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">493082984.35</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.40884</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.707798</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Apr-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">96.309464</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">491178268.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.01711</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.314079</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Apr-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.100187</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">495210955.48</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.049166</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.343644</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Apr-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">96.355038</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">491410693.97</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.273713</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.565407</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Apr-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">96.467688</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">491985212.58</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.390944</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.682558</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Apr-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">95.38266</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5100000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">486451567.43</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.261789</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.550495</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Apr-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">96.07128</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">475552836.88</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.978415</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.269032</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Apr-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">95.559114</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">473017614.67</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.445419</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.733205</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Mar-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">96.641762</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">478376724.17</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.572098</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.861394</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Mar-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">96.982232</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">480062049.43</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.926414</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.216005</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Mar-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">96.330214</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">476834559.39</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.247879</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.535186</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Mar-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">96.033471</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">475365685.41</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.939068</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.223533</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Mar-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.399763</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">482128829.06</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.360926</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.650837</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Mar-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">96.975845</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">480030433.89</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.919767</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.208362</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Mar-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">96.935488</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">465290342.69</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.877769</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.166779</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Mar-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">96.567797</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">463525430.32</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.495124</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.782515</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Mar-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.011743</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">465656369.32</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.957125</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.244654</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Mar-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.529107</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">468139717.94</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.49553</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.784241</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Mar-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.850543</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">469682607.37</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.830039</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.120016</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Mar-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.676952</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">473649371.81</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.690057</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.985163</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Mar-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.412472</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">472379866.92</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.414821</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.70717</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Mar-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.084101</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">466003686.72</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.032426</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.315297</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Mar-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.047567</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">470628321.72</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.035075</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.325166</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Mar-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.992694</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">470364934.46</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.977971</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.267359</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Mar-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.545932</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">473020476.33</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.553709</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.846579</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Mar-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.124087</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">470995619.64</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.114707</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.404177</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Mar-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.62368</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">468593667.03</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.593949</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.879369</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Mar-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.540703</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">472995377.62</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.048746</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.336206</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Mar-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.795961</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">469420614.54</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.277491</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.560532</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Feb-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">96.339508</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">455204179.47</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.769188</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.04605</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Feb-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">96.654781</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">456693842.64</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.095685</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.373227</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Feb-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">95.643088</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">459086826.92</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.047976</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.320161</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Feb-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">94.562068</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">453897927.41</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.058568</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.330966</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Feb-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">95.96035</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">460609682</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.493765</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.769945</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Feb-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.635601</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">468650888.94</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.213244</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.493263</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Feb-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">96.484393</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">455888757.03</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.031643</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.308231</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Feb-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.061449</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">458615347.65</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.623934</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.901543</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Feb-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.225365</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">459389849.73</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.792177</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.06961</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Feb-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">95.586007</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">451643887.08</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.109539</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.38258</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Feb-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">95.956009</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4650000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">446195441.92</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.48931</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.763288</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Feb-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">93.568825</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4575000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">428077375.19</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">96.039102</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">96.306259</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Feb-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">91.710715</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4650000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">426454828.43</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">94.131937</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">94.394105</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Feb-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">94.492803</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4650000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">439391533.99</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">96.987474</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.256334</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Feb-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">92.721249</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">452016089.27</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">95.16915</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">95.433306</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Feb-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">94.866605</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">462474700.93</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.371145</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.640589</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Feb-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.406686</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">474857595.13</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.978285</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.253673</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Feb-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.915046</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">477335851.36</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.500066</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.775679</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Feb-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.277264</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">483976662.54</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.898248</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.17765</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Feb-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.126731</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">488117815.16</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.770141</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.051357</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Feb-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.396479</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">509517307.92</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.073411</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.357885</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Jan-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.46801</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">509876751.53</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.146831</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.427966</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Jan-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.497326</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">499974066.19</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.12412</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.402198</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Jan-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.279242</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">508928195.85</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.953079</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.235929</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Jan-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.088911</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">507971782.44</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.757723</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.039297</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Jan-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.340506</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">504211043.25</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.98956</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.269842</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Jan-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.470216</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">504862837.64</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.122694</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.402532</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Jan-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.722553</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5025000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">491055830.69</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.302491</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.57512</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Jan-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">96.967512</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">479989185.06</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.527517</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.798193</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Jan-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.925906</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">494633236.76</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.564014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.841288</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Jan-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.380798</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">486984950.93</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.978115</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.255152</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Jan-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.568549</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">487914319.33</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.170822</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.443643</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Jan-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.966203</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">499782707.22</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.631776</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.910801</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Jan-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.329856</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">506532789.27</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.03143</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.31359</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Jan-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.38809</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">501871046.06</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.064801</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.343986</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Jan-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.002065</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">495010225.99</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.642184</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.917435</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Jan-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.488226</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">497416721.62</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.14118</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.417308</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Jan-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.646652</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">508100927.45</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.35659</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.637726</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Jan-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.630984</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">517923371.68</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.393309</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.678735</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Jan-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.726184</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">523344615.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.517423</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.805613</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Jan-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.226251</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">520869945.78</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.004292</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.291318</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Dec-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.169257</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.998594</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.289024</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Dec-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.169257</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">530487824.98</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.998594</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.289024</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Dec-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.87139</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">533963383.98</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.719264</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.01149</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Dec-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.209993</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">525739467.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.014005</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.301726</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Dec-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.789473</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">523657896.09</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.582383</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.867206</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Dec-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.632239</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">512979585.65</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.368197</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.647028</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Dec-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.908864</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">514348880.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.652125</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.931758</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Dec-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.647683</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">518006032.05</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.410449</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.691822</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Dec-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.221928</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4950000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">520848544.59</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.999855</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.280717</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Dec-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.584211</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4200000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">439253689.64</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.345302</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.625348</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Dec-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.290539</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4200000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">438020265.36</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.043876</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.322516</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Dec-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.880311</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4200000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">427897309.43</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.570017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.841834</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Dec-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.230188</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4200000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">433566790.84</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.955532</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.230011</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Dec-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.762309</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">416430182.22</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.528102</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.806232</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Dec-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.752824</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">416392477.16</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.518366</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.798019</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Dec-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.652388</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">419968244.99</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.441679</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.722892</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Dec-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.154781</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">417903648.76</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.983736</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.268879</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Dec-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.777352</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">424439976.18</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.596343</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.879359</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Dec-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.372694</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">426806459.79</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.207402</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.491641</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Dec-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.152532</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">433881317.16</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.034229</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.329348</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Dec-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.909099</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">432913670.52</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.784369</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.074259</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Nov-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.814267</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">432536714.34</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.687034</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.974379</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Nov-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.794407</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">432457769.96</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.666649</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.951441</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Nov-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.387192</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">430839091.75</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.248684</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.532983</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Nov-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.995933</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">429283835.84</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.847095</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.13829</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Nov-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.560098</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">423576390.47</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.373353</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.661474</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Nov-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.906989</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4050000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">437023307.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.755803</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.044205</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Nov-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.864154</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4050000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">440899827.3</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.738238</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.025761</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Nov-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.766864</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4050000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">440505801.37</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.638379</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.925643</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Nov-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.56514</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4050000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">439688820.22</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.43133</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.716973</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Nov-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.117723</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4050000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">437876778.32</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.972101</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.256907</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Nov-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.578638</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4050000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">427593485.03</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.365982</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.64442</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Nov-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.812268</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4050000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">428539686.62</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.60578</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.888043</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Nov-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.544702</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4050000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">431506043.15</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.357551</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.630831</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Nov-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.357434</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4050000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">434797611.06</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.191739</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.467558</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Nov-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.874059</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4050000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">432839942.59</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.695603</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.969419</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Nov-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.197215</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4050000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">434148721.07</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.027291</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.302195</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Nov-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.299153</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4050000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">438611571.9</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.15832</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.435651</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Nov-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.448788</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">431083933.35</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.311906</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.589945</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Nov-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.00856</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">429334026.32</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.860056</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.13816</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Nov-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.825391</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">428605933.19</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.672051</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.949502</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Nov-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.794618</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">428483608.34</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.640465</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.918106</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Oct-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.651814</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">427915963.98</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.493891</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.768142</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Oct-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.856266</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">428728658.79</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.703741</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.978369</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Oct-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.563787</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">427566054.49</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.40354</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.677645</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Oct-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.605419</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">423756543.15</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.419871</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.69116</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Oct-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.347659</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">426706947.54</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.181706</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.454926</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Oct-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.359656</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">426754634.09</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.19402</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.465454</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Oct-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.90418</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">420969118.26</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.700119</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.968655</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Oct-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.839991</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">412763968.07</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.581434</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.845362</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Oct-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.265779</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">406636539.97</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.018463</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.283613</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Oct-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.795411</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">408702105.48</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.562077</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.826035</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Oct-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.901945</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">401249943.41</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.671424</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.935765</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Oct-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.180761</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">398491412.57</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.9312</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.192681</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Oct-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.327642</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">395228233.47</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.055558</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.31501</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Oct-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.283472</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">398884283.76</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.036623</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.298069</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Oct-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.914004</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">401296068.55</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.683801</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.948386</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Oct-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.644592</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">400265566.25</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.407277</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.669075</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Oct-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.498632</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">391869870.83</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.257463</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.519564</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Oct-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.02985</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">390111940.94</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.776305</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.034615</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Oct-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.408752</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">395282823.17</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.191611</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.453268</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Oct-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.006418</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">393774068.39</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.778655</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.03777</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Oct-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.416551</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">384062069.73</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.120414</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.368336</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Oct-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.320555</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">383702082.02</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.021884</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.269256</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Sep-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.316742</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">383687785.91</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.01797</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.266225</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Sep-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.159583</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">375598438.54</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.803861</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.04554</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Sep-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.880819</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">378303073.16</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.544138</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.788235</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Sep-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.333072</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4050000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">414448943.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.034731</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.282785</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Sep-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.814967</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4050000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">404250617.67</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.450146</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.690891</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Sep-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.884461</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4050000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">412632067.37</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.574276</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.82089</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Sep-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.167531</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4050000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">413778502.03</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.86482</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.11346</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Sep-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.607692</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4050000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">427711155.79</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.395803</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.655283</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Sep-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.094872</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4050000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">425634233.32</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.869444</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.125001</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Sep-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.268327</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4050000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">430386727.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.073879</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.332558</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Sep-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.45691</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4050000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">431150487.69</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.267441</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.529161</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Sep-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.56043</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">419602711.04</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.347293</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.607814</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Sep-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.430023</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">407277091.34</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.187043</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.446105</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Sep-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.385819</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">411004694.95</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.168073</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.427927</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Sep-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.480853</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">411375327.61</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.265616</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.525709</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Sep-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.488004</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">415303216.49</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.299356</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.55977</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Sep-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.243979</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">410451521.03</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.022488</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.280915</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Sep-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.506707</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">407576158.27</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.265751</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.521227</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Sep-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.957158</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">405432919.53</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.701694</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.956807</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Sep-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.351597</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">410871230.32</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.132947</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.390081</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Sep-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.642691</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">404206498.28</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.378925</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.631161</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Sep-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.573522</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">403936739.39</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.30793</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.558787</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Aug-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.905215</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">413030341.82</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.701181</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.962631</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Aug-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.421395</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">411143443.66</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.204588</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.460601</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Aug-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.769416</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">404568017.05</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.561797</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.820477</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Aug-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.791914</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">393179072.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.505687</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.753109</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Aug-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.087488</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">401959641.78</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.861865</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.114473</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Aug-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.651387</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">388816555.8</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.335049</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.574876</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Aug-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.544763</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">403708720.63</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.331213</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.584214</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Aug-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.97318</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">416822413.67</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.850142</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.116387</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Aug-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.705607</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">423448947.94</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.628306</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.898907</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Aug-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.220377</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">429242944.63</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.183067</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.458111</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Aug-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.30434</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">429564101.23</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.269247</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.544693</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Aug-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.809359</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">427670799.76</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.761198</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.033789</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Aug-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.539062</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">426636912.15</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.483765</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.754201</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Aug-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.981557</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">412430839.19</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.885141</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.153585</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Aug-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.739975</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">422774906.84</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.716383</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.989919</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Aug-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.652191</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">426195716.51</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.652682</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.927135</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Aug-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.520079</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">421950299.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.490682</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.760828</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Aug-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.130699</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">424240122.76</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.117422</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.389643</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Aug-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.941029</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">427278860.63</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.949146</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">117.221669</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Aug-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.347845</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">416553332.11</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.340301</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.613164</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Aug-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.181654</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">415942579.91</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.169723</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.439764</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Jul-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.687371</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">414126091.93</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.66239</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.931262</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Jul-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.29741</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">412692982.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.262134</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.527599</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Jul-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.145099</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">412133240.91</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.105802</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.371711</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Jul-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.890594</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">407522936.3</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.818177</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.07991</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Jul-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.936699</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">404017371.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.839099</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.09806</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Jul-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.323883</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">409115270.56</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.262905</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.523323</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Jul-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.025766</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">411694693.24</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.983318</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.243836</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Jul-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.010214</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">407962537.35</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.940955</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.199087</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Jul-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.056039</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">411805945.77</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.014391</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.276752</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Jul-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.088646</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">419275774.33</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.094787</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.349994</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Jul-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.670295</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">417738335.05</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.66908</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.921249</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Jul-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.768781</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">418100272.01</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.769298</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">116.022475</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Jul-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.143753</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">412128294.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.115695</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.361265</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Jul-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.072911</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">411867948.64</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.043607</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.287917</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Jul-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.361717</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">409254313</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.319908</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.565715</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Jul-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.002114</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">404257770.98</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.936397</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.176718</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Jul-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.261244</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">405979668.28</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.164916</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.398839</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Jul-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.702263</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">400133488.88</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.578522</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.807423</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Jul-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.771199</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">396641999.06</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.631086</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.855304</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Jul-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.944608</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">393021436.64</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.825128</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.060884</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Jul-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.58605</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">395378736.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.477849</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.720475</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Jul-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.117391</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">397331414.16</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.018533</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.265933</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Jul-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.548484</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">403306816.13</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.439623</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.681431</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Jun-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.070831</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">389810304.75</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.935986</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.162337</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Jun-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.031971</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">393342496.9</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.914027</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.148967</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Jun-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.650632</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">366695883.83</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.561151</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.811441</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Jun-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.083533</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">368156926.47</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.001664</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.254299</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Jun-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.531885</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">369670112.15</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.4579</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.716665</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Jun-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.153798</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">363507535.78</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.090749</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.353675</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Jun-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.881809</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">359309972.45</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.796393</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.047552</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Jun-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.188229</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">353721158.25</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.073033</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.30541</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Jun-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.281952</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">354030442.57</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.168404</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.397762</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Jun-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.607643</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">355105225.13</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.499822</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.733934</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Jun-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.310969</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">357426199.65</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.215515</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.454302</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Jun-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.832293</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">355846568.35</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.728422</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.958335</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Jun-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.096975</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">360020017.72</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.015342</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.258838</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Jun-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.431064</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">364422513.58</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.37289</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.629173</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Jun-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.990137</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3150000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">346468934.61</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.92421</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.174259</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Jun-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.680568</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3150000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">342343791.75</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.591613</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.823709</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Jun-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.548879</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3150000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">345078971.79</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.475193</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.711097</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Jun-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.043644</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3150000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">346637479.59</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.978658</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.222363</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Jun-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.530303</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3075000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">342955682.23</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.491458</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.755248</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Jun-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.759809</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">335279429.03</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.725</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.987679</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Jun-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.13019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">333390572.32</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.08431</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.343551</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Jun-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.876673</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">335630019.18</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.843919</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.111596</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-May-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.502833</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">334508499.64</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.463505</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.728061</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-May-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.225853</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">339677561.16</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.216823</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.501636</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-May-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.234479</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">339703439.64</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.2256</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.508276</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-May-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.888265</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">335664797.75</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.855715</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.125348</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-May-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.851431</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">338554294.21</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.835817</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.112037</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-May-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.991418</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">338974255.55</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.978265</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.251204</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-May-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.521006</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">337563018.38</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.499582</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.766464</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-May-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.310233</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">336930699.08</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.285102</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.545705</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-May-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.186369</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3000000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">333559107.65</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.141476</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.394732</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-May-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.251836</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2925000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">322486621.96</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.190511</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.433616</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-May-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.509544</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2925000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">320315418.48</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.435166</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.67219</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-May-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.425577</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">311862896.32</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.349723</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.588788</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-May-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.308032</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">314377891.36</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.247695</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.491618</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-May-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.825674</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">313003171.3</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.756855</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.992106</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-May-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.418296</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">306142146.43</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.307145</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.525668</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-May-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.593754</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">306642199.79</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.485689</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.70783</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-May-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.131109</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2850000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">311023661.01</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.050077</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.280073</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-May-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.869127</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">304886829.43</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.801072</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.035923</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Apr-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.511989</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">303895771.37</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.437654</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.67425</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Apr-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.635727</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">304239145.15</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.563568</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.803037</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Apr-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.30437</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">308869628.63</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.261552</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.509298</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Apr-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.324713</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">311701079.48</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.299837</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.555561</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Apr-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.82074</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">310302555.94</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.787002</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.034118</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Apr-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.180056</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2775000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">311299656.92</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.152636</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.404857</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Apr-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.22857</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">294599996.91</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.202004</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.457893</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Apr-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.674557</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2625000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">293145713.72</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.638249</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.885487</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Apr-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.03402</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">283136752.61</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.986448</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.228558</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Apr-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.103755</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">283314575.82</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.307415</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.540675</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Apr-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.884831</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">287856321.43</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.107786</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.347479</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Apr-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.243913</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">288771979.52</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.470758</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.712071</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Apr-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.073478</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">288337369.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.298477</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.539455</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Apr-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.256045</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">288802916.95</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.483022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.724216</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Apr-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.678964</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">289881360.05</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.910522</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">115.152009</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Apr-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.752779</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">287519587.48</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.974303</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">114.211546</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Apr-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.108802</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">283327445.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.312516</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.534299</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Apr-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.216166</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">283601224.88</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.421043</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.646188</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Apr-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.507777</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2550000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">279244833.86</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.694146</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.902189</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Apr-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.495952</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">271002481.26</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.682193</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.893955</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Mar-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.417859</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">270809201.33</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.603254</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.813681</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Mar-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.251757</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">272873100.92</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.446186</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.665839</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Mar-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.860472</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">269429670.58</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.039829</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.251551</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Mar-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.916262</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">269567749.24</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.096223</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.307096</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Mar-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.085739</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">272462205.88</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.27837</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.50049</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Mar-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.283846</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">275427519.25</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.489457</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.718097</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Mar-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.039904</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">277298762.48</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.253705</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.488423</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Mar-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.282609</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2475000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">277899458.41</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.49904</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">113.734599</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Mar-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.437298</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">208944935.32</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.644571</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.876015</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Mar-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.656109</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">207480205.15</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.854919</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">112.078812</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Mar-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.080637</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">206401194.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.273212</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.489864</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Mar-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.551749</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">207284529.65</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.749428</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.970703</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Mar-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.688003</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">205665006.39</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.876325</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">111.090144</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Mar-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.186914</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1875000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">204725464.79</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.369807</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.577198</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Mar-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.037067</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">196266720.82</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.218337</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.42174</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Mar-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.036702</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">194466064.19</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.207134</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.403655</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Mar-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.439902</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">195191824.92</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.614702</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.807194</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Mar-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.788054</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">195818498.43</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.966626</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.166011</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Mar-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.27476</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">194894568.34</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.447771</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.645598</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Mar-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.652201</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">193773963.28</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.373701</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.563009</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Mar-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.275523</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1800000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">193095942.24</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.994498</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.181806</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Mar-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.539859</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">187231257.79</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.542482</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.732732</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Feb-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.008416</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Feb-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.008416</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186314519.11</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.011027</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.200674</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Feb-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.275084</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">186774521.37</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.277701</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.469687</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Feb-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.538988</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1725000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">185504754.37</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.541587</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.723126</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Feb-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.553419</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1650000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">177463142.82</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.556019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.736927</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Feb-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.3469</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1650000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">177122386.38</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.349495</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.532277</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Feb-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.369999</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1650000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">175510499.36</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.37257</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.54851</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Feb-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.455318</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1650000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">175651275.24</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.457891</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.633717</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Feb-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.335864</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1650000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">173804176.89</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.33841</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.513366</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Feb-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.590368</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1650000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">172574107.74</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.592896</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.767174</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Feb-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.204962</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1650000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">171938187.59</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.207481</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.378593</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Feb-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.52425</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1650000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">170815012.63</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.526752</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.693731</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Feb-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.983221</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1650000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">169922315.06</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.98571</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.149495</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Feb-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.487978</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1650000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">169105165.26</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.490455</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.653918</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Feb-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.954554</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1650000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">169875014.99</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.957042</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.124241</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Feb-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.981103</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1650000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">169918820.54</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.983592</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.147693</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Feb-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.535323</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1650000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">169183283.19</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.537801</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.695796</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Feb-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.08328</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1650000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">168437413.03</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.085747</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.242448</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Feb-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.682872</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1575000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">161725524.74</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.685354</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.848326</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Feb-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.944556</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1575000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">158987675.99</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.946996</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.105438</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Feb-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.587916</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1575000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">158425967.72</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.590347</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.746421</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Jan-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.057637</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1500000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150086455.56</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.060055</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.206751</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Jan-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.479098</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1500000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150718647.04</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.481527</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.630225</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Jan-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.05398</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1500000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">148580971.08</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.056374</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.202829</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Jan-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.030657</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1500000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">150045986.23</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.033075</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.182638</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Jan-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.980971</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1500000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">148471456.57</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.983363</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.122137</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Jan-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.391798</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1500000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146087697.62</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.394152</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.524988</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Jan-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">95.5641</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1500000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143346150.84</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">95.56641</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">95.695176</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Jan-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">95.663081</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1500000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">143494622.94</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">95.665393</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">95.797278</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Jan-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.583634</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1500000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">146375451.74</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.585993</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.723954</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Jan-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.376386</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1425000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">138761351.25</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.37874</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.518394</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Jan-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">94.517605</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1350000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127598767.9</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">94.51989</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">94.64845</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Jan-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.322829</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1200000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">120387394.85</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.325254</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.471298</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Jan-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.71685</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1200000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131660220.64</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.719502</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.89831</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Jan-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.699225</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1200000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">132839071.14</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.701901</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">110.889496</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Jan-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.179059</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1200000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">131014871.69</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.181698</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.360354</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Jan-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.676167</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1200000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130411401.27</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.678794</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.854678</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Jan-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.954781</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1200000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">130745738.32</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.957414</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.141769</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Jan-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.313626</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1200000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127576351.28</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.316196</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.488516</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Jan-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.029681</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1200000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">127235617.74</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.032244</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.203522</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Jan-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.74674</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1200000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128096088.73</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.74932</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.922361</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Jan-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.235833</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.238425</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.415487</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Jan-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.235833</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.238425</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.415487</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Dec-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.235833</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.238425</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.415487</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Dec-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.235833</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1200000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">128682999.96</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.238425</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.415487</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Dec-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.792706</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1200000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129351248.29</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.795311</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.972769</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Dec-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.657715</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.660317</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.82663</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Dec-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.657715</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.660317</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.82663</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Dec-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.657715</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.660317</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.82663</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Dec-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.657715</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1200000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129189258.09</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.660317</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.82663</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Dec-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.732479</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1200000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">129278975.14</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.735083</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.906033</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Dec-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.074209</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104397354.68</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.076797</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.249442</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Dec-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.324946</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104641823.28</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.32754</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.497711</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Dec-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.654621</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102038256.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.657151</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.815542</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Dec-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.795747</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102175853.38</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.79828</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.954282</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Dec-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.897828</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101300383.3</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.900339</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.051668</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Dec-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.915481</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103267594.88</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.918041</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.0785</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Dec-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.703012</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105010437.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.705615</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.87133</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Dec-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.329668</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104646427.09</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.332262</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.499713</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Dec-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.678134</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104986181.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.680737</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.847234</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Dec-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.224113</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106493511</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.226753</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.395581</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Dec-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.737555</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106994116.85</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.736952</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.901327</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Dec-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.591739</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105876946.13</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.594325</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.756266</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Dec-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.122304</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106394246.99</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.124837</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.286916</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Dec-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.7346</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">975000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106016188.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.737228</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.896271</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Dec-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.7979</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97918130.02</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.80053</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.966247</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Nov-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.9037</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Nov-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.9037</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98013359.21</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.906332</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">109.063231</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Nov-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.707</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97836331.09</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.709627</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.864913</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Nov-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.9003</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97110293.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.902908</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.05567</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Nov-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.7792</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97001258.27</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.781805</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.932648</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Nov-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.9182</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97126336.87</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.920808</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.068835</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Nov-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.097</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97287255.9</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.099613</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">108.261624</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Nov-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.0384</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">96334581.96</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.040987</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.19532</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Nov-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.9544</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">96258975.99</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.956985</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">107.114886</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Nov-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.8097</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">96128745.71</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.812282</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.972997</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Nov-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.2871</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">95658428.23</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.289669</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.435239</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Nov-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.1951</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">95575582.03</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.197667</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.338995</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Nov-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.6463</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">95981643.95</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.648878</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.79433</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Nov-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.7123</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">900000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">95141076.24</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.714855</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.856471</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Nov-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.971</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">87426035.53</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.973561</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">106.182775</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Nov-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.7124</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">87212710.87</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.714955</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.850714</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Nov-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.089</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">86698453.97</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.09154</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.224548</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Nov-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.6492</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">87160626.06</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.651754</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.78487</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Nov-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.3728</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">86932522.69</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.375347</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.507226</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Nov-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.9468</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">85756115.29</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.949312</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.080029</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Nov-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.2876</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">86037235.91</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.290121</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.422443</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Oct-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.2775</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">825000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">86853934.53</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.280045</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.411985</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Oct-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.9684</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">77976318.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.970913</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.096483</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Oct-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.2033</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">77402509.31</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.205794</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.329656</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Oct-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.8913</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">77168456.78</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.893787</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.016917</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Oct-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.6346</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">750000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">76225980.24</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.637057</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.756912</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Oct-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.8041</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">68717776.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.806561</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.925992</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Oct-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.9816</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">68837584.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.984065</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.101099</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Oct-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.4875</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">68504064.31</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.489953</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.600589</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Oct-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.2955</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">67699449.33</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.297924</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.40372</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Oct-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.8664</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">66734813.71</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.86879</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.976781</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Oct-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.4895</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">66480414.17</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.491881</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">98.605992</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Oct-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">96.1586</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">64907068.74</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">96.160924</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">96.277843</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Oct-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.069</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">65521590.82</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.071346</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">97.186257</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Oct-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.3016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">67028584.24</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.304</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.422712</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Oct-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.3545</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">675000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">67064308.68</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.356901</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.470321</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Oct-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.7801</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">59868037.94</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.782512</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.890419</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Oct-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.1361</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">60681655.72</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.138544</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.250547</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Oct-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.59</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">60951258.06</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.592455</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.711049</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Oct-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.14</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">61282397.07</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.142469</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.263914</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Oct-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.99</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">62392567.23</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.992513</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.111097</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Oct-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.63</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">62176639.96</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.632505</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.747378</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Oct-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.21</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">600000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">61928011.16</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.212495</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.330566</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Oct-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.78</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">55010344.26</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.782533</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.906686</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Sep-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.33</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">55298323.14</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.332546</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.454167</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Sep-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.68</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">54957853.95</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.684727</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.805215</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Sep-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.74</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">54990890.79</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.74473</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.866703</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Sep-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.76</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">55000432.96</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.764731</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.882177</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Sep-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.09</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">55171643.33</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.094746</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.211209</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Sep-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.76</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">54997660.72</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.764731</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.872253</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Sep-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.42</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">55344948.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.424761</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.540549</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Sep-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.67</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">55476709.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.674772</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.792397</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Sep-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.48</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">525000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">55378494.79</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.484763</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.605822</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Sep-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.37</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">47414905.79</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.374758</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.489066</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Sep-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.12</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">47304116.71</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.124747</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.244248</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Sep-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.11</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">47299008.87</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.114747</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.233681</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Sep-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.13</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">47307191.71</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.134747</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.249207</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Sep-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.46</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">47456993.82</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.464762</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.581644</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Sep-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.31</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">47391656.13</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.314756</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.433815</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Sep-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.46</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">47456701.48</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.464099</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.57411</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Sep-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.39</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">47425752.99</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.395321</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.501183</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Sep-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.13</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">47306542.43</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.130397</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.232695</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Sep-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.63</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">47534854</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.637779</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.735432</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Sep-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.32</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">47395068.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.327131</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">105.422137</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Sep-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.86</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">47185658.59</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.861754</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.955705</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Sep-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.67</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">47101709.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.675192</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.769002</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Aug-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.79</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">46706252.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.802994</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.885471</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Aug-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.39</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">46527422.25</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.40555</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.487039</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Aug-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.92</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">46762615.85</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.928259</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.013189</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Aug-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.98</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">46791616.76</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.992712</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.076692</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Aug-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.31</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">46491361.18</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.325405</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.406934</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Aug-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.63</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">46184129.78</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.642594</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.728442</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Aug-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.78</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">46251624.48</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.792599</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.878761</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Aug-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.31</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">46040938.47</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.324356</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.40763</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Aug-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.31</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">46040722.3</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.323876</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.403417</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Aug-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.42</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">45640372.98</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.434114</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.512286</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Aug-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">45181385.5</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.41403</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.491385</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Aug-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.09</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">45488369.13</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.096291</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.173593</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Aug-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.57</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">45256469.17</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.580901</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.658646</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Aug-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.88</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">44947090.85</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.893319</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.967716</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Aug-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.87</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">450000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">44940065.04</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.877704</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.95069</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Aug-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.09</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">37159336.14</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.102372</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.179371</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Aug-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.53</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">37325359.4</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.545149</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.622405</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Aug-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.39</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">37270838.23</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.399743</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.473469</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Aug-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.07</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">37528085</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.085809</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.158572</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Aug-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">37351616.59</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.615175</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">99.691945</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Jul-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.93</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">37848283.33</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.939764</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.016624</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Jul-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.96</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">38234887.02</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.970953</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.047337</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Jul-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.43</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">38410250.41</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.43864</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.511408</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Jul-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.34</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">38375726.57</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.346567</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.418487</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Jul-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.83</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">38559419.93</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.836469</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.906167</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Jul-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.58</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">38842810.28</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.592261</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.660489</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Jul-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.2</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">38698186.94</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.206556</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.275429</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Jul-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.02</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">38633462.62</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.033938</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.102678</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Jul-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">38289317.71</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.116117</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.185175</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Jul-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.14</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">38302148.83</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.150337</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.211876</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Jul-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.58</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">38467653.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.591733</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.656827</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Jul-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.32</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">38745551.96</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.332876</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.402576</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Jul-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.78</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">38541215.41</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.787919</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.859902</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Jul-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.71</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">38516051.17</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.720807</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.793888</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Jul-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.51</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">38066405.58</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.521619</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.599039</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Jul-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.54</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">38078799.92</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.554675</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.62853</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Jul-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.33</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">38375518.59</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.346012</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.418219</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Jul-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.54</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">38453253</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.553326</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.620196</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Jul-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.24</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">38713342.42</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.246975</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.30729</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Jul-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.97</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">38987181.44</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.977293</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.036779</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Jul-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.13</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">39048937.45</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.141994</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.202813</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Jul-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.12</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">38671450.26</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.13525</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.196152</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Jul-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.09</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">38659890.79</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.104421</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.163597</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Jun-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.48</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">38428504.42</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.487323</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.544537</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Jun-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.54</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">38451538.09</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.543491</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.60596</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-Jun-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.32</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">38369914.6</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.325815</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.391001</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Jun-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.75</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">38531569.61</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.756921</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.818671</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Jun-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.83</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">38935791.68</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.83491</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.899021</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Jun-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.51</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">38816506.77</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.516798</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.585776</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Jun-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.15</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">39055036.37</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.152915</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.222646</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Jun-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.83</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">375000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">38937425.51</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.839267</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.906863</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Jun-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.59</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">31076064.91</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.593001</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.653748</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Jun-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.64</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">31092681.29</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.648392</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.710851</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Jun-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.59</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">31077409.3</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.597482</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.662027</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Jun-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.62</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">31085981.49</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.626058</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.679795</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Jun-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.88</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">31162785.53</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.882087</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.928654</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Jun-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.27</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">31281822.88</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.278901</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.324475</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Jun-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.74</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">31420525.21</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.74127</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.788187</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Jun-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.79</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">31135504.64</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.791145</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.829157</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Jun-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.49</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">31046083.42</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.493057</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.533579</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Jun-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.62</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">31085478.99</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.624383</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.667617</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Jun-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.53</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">31059332.01</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.537221</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.586443</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Jun-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.89</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">31165725.09</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.891886</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.940689</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-May-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.74</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">31120944.57</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.736482</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.790018</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-May-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.99</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">31198445.22</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.994817</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.045482</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-May-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.01</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">31202438.99</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.00813</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.057918</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">26-May-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.98</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">31194646.66</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.982155</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">104.035284</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-May-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.79</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">31136903.38</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.789678</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.838274</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-May-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.7</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">31110825.32</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.702751</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.746785</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-May-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.24</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">30971866.85</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.239556</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.283685</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-May-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.96</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">30888215.53</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.960718</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.010678</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-May-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.02</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">30907430.59</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.024769</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.078085</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-May-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.34</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">300000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">31002166.19</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.340554</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.396026</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-May-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">225000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">23175253.62</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">103.001127</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.957197</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-May-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.93</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">225000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">23158243.95</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.925529</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.957197</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-May-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.25</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">225000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">23006862.16</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.252721</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.278268</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-May-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.23</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">225000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">23001789.35</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.230175</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">102.249796</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-May-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.67</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">225000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">22876697.73</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.674212</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.689793</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-May-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.16</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">225000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">22761368.95</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.16164</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.174646</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-May-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.67</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">225000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">22650273.38</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.667882</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.677538</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-May-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.45</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">225000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">22601611.1</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.451605</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.458632</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-May-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.62</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">225000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">22639700.23</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.62089</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.627021</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-May-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.84</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">225000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">22688724.74</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.838777</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.855811</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Apr-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.05</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">225000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">22737275.39</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.054557</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">101.06977</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Apr-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.59</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">225000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">22632595.91</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.589315</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100.602566</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Apr-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">CHF</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">225000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">22500000</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">100</ss:Data>
+</ss:Cell>
+</ss:Row>
+</ss:Table>
+</ss:Worksheet>
+<ss:Worksheet ss:Name="Performance">
+<ss:Table>
+<ss:Row >
+<ss:Cell ss:StyleID="headerstyle">
+<ss:Data ss:Type="String">iShares Core SPI® ETF (CH)</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row/>
+<ss:Row >
+<ss:Cell ss:StyleID="headerstyle">
+<ss:Data ss:Type="String">Fund Inception</ss:Data>
+</ss:Cell>
+<ss:Cell>
+<ss:Data ss:Type="String">28-Apr-2014</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row/>
+<ss:Row>
+<ss:Cell ss:StyleID="headerstyle">
+<ss:Data ss:Type="String">Month End Date</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="headerstyle">
+<ss:Data ss:Type="String">Monthly Total (NAV) Return</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Apr-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">--</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-May-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2.66</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Jun-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-1.21</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Jul-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-1.51</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Aug-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2.83</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Sep-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1.48</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Oct-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-0.049843</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Nov-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3.444421</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Dec-2014</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-1.531506</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Jan-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-6.693841</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Feb-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7.946199</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Mar-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2.399966</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Apr-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.754408</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-May-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1.817923</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Jun-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-4.871627</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Jul-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">7.15832</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Aug-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-6.018559</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Sep-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-3.388382</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Oct-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5.214271</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Nov-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1.079827</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Dec-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-1.511759</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Jan-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-5.319853</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Feb-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-4.203337</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Mar-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.804767</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Apr-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2.989449</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-May-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3.726712</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Jun-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-2.554985</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Jul-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1.923813</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Aug-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.979185</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Sep-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-0.37537</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Oct-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-3.436372</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Nov-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.515849</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Dec-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3.965165</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Jan-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1.079144</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Feb-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3.342137</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Mar-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2.882091</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Apr-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3.497259</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-May-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2.724564</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Jun-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-1.190665</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Jul-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1.785717</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Aug-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-1.296844</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Sep-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2.644041</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Oct-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1.49101</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Nov-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.663142</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Dec-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.705756</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Jan-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-0.140549</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Feb-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-4.468154</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Mar-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-0.677502</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Apr-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3.272575</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-May-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-3.443374</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Jun-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1.594765</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Jul-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5.534603</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Aug-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-1.464347</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Sep-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.628768</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Oct-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-1.596227</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Nov-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-0.895217</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Dec-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-6.752095</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Jan-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6.951998</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Feb-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4.274747</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Mar-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2.512894</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Apr-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4.379829</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-May-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-1.631524</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Jun-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3.742266</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Jul-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.719074</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Aug-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-0.029596</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Sep-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1.425572</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Oct-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.840253</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Nov-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2.740991</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Dec-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1.26293</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Jan-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.250546</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Feb-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-7.565659</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Mar-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-4.865502</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Apr-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5.164521</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-May-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2.844349</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Jun-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1.552196</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Jul-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-0.238186</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Aug-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1.987961</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Sep-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.509922</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Oct-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-5.748006</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Nov-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">8.432483</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Dec-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2.479558</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Jan-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-1.026353</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Feb-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-0.450466</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Mar-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">6.698417</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Apr-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1.157927</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-May-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3.448763</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Jun-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">4.61735</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Jul-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1.498905</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Aug-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2.363409</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Sep-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-5.677822</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Oct-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">3.780434</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Nov-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-0.523392</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Dec-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">5.858077</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Jan-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-5.675604</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Feb-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-2.202314</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-Mar-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">2.415178</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Apr-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.405163</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">31-May-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-4.386976</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-Jun-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">-7.278818</ss:Data>
+</ss:Cell>
+</ss:Row>
+</ss:Table>
+</ss:Worksheet>
+<ss:Worksheet ss:Name="Distributions">
+<ss:Table>
+<ss:Row>
+<ss:Cell ss:StyleID="headerstyle">
+<ss:Data ss:Type="String">Record Date</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="headerstyle">
+<ss:Data ss:Type="String">Ex-Date</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="headerstyle">
+<ss:Data ss:Type="String">Payable Date</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="headerstyle">
+<ss:Data ss:Type="String">Total Distribution</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-May-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-May-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-May-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.56</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Apr-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Apr-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Apr-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.72</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Apr-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Apr-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Apr-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.62</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Mar-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Mar-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Mar-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.58</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Mar-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Mar-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Mar-2022</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.72</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Jul-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Jul-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Jul-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.36</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-May-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-May-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-May-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.5</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Apr-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Apr-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Apr-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.86</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Apr-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Apr-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Apr-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.62</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Mar-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Mar-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Mar-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.56</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Mar-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Mar-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Mar-2021</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.76</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Jul-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Jul-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Jul-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.62</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-Apr-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">27-Apr-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Apr-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">1.06</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Apr-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Apr-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Apr-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.56</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Mar-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Mar-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Mar-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.56</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Mar-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Mar-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Mar-2020</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.68</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Jul-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Jul-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Jul-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.74</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-May-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-May-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-May-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.44</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Apr-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Apr-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Apr-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.7</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Apr-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Apr-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Apr-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.46</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Mar-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Mar-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Mar-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.54</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Mar-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Mar-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Mar-2019</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.66</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Jul-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Jul-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Jul-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.6</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-May-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">28-May-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">30-May-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.42</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Apr-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Apr-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Apr-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.66</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Apr-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Apr-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Apr-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.66</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Apr-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Apr-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Apr-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.54</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">14-Mar-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Mar-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Mar-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.5</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Mar-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Mar-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Mar-2018</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.66</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Jul-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Jul-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Jul-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.7</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-May-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-May-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-May-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.4</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Apr-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-Apr-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">12-Apr-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.94</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">15-Mar-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">16-Mar-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Mar-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.48</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">01-Mar-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Mar-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-Mar-2017</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.7</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">18-Jul-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">19-Jul-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Jul-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.8</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-May-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">06-May-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">10-May-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.36</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">08-Apr-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">11-Apr-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">13-Apr-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.76</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Mar-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Mar-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">07-Mar-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.48</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">24-Feb-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">25-Feb-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">29-Feb-2016</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.84</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Jul-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">21-Jul-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">23-Jul-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.98</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">17-Apr-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">20-Apr-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">22-Apr-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.74</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">04-Mar-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Mar-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">09-Mar-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.44</ss:Data>
+</ss:Cell>
+</ss:Row>
+<ss:Row>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">02-Mar-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">03-Mar-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Left">
+<ss:Data ss:Type="String">05-Mar-2015</ss:Data>
+</ss:Cell>
+<ss:Cell ss:StyleID="Right">
+<ss:Data ss:Type="Number">0.72</ss:Data>
+</ss:Cell>
+</ss:Row>
+</ss:Table>
+</ss:Worksheet>
+</ss:Workbook> \ No newline at end of file
diff --git a/test/xls-xml/empty-rows/check.txt b/test/xls-xml/empty-rows/check.txt
new file mode 100644
index 0000000..8e6f30a
--- /dev/null
+++ b/test/xls-xml/empty-rows/check.txt
@@ -0,0 +1,7 @@
+Sheet1/0/0:string:"Top row, followed by 2 empty rows."
+Sheet1/3/1:numeric:1
+Sheet1/4/1:numeric:2
+Sheet1/5/1:numeric:3
+Sheet1/6/1:numeric:4
+Sheet1/7/1:numeric:5
+Sheet1/8/1:formula:SUM(R[-5]C:R[-1]C):15
diff --git a/test/xls-xml/empty-rows/input.xml b/test/xls-xml/empty-rows/input.xml
new file mode 100644
index 0000000..624e94b
--- /dev/null
+++ b/test/xls-xml/empty-rows/input.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2016-12-14T01:54:30Z</Created>
+ <LastSaved>2016-12-14T01:58:30Z</LastSaved>
+ <Version>15.00</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <AllowPNG/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>14385</WindowHeight>
+ <WindowWidth>24000</WindowWidth>
+ <WindowTopX>0</WindowTopX>
+ <WindowTopY>0</WindowTopY>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Sheet1">
+ <Table ss:ExpandedColumnCount="2" ss:ExpandedRowCount="9" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Row>
+ <Cell><Data ss:Type="String">Top row, followed by 2 empty rows.</Data></Cell>
+ </Row>
+ <Row ss:Index="4">
+ <Cell ss:Index="2"><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:Index="2"><Data ss:Type="Number">2</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:Index="2"><Data ss:Type="Number">3</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:Index="2"><Data ss:Type="Number">4</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:Index="2"><Data ss:Type="Number">5</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:Index="2" ss:Formula="=SUM(R[-5]C:R[-1]C)"><Data ss:Type="Number">15</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Selected/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>9</ActiveRow>
+ <ActiveCol>1</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/test/xls-xml/formatted-text/basic.xml b/test/xls-xml/formatted-text/basic.xml
new file mode 100644
index 0000000..afdd730
--- /dev/null
+++ b/test/xls-xml/formatted-text/basic.xml
@@ -0,0 +1,241 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2023-09-03T16:52:11Z</Created>
+ <LastSaved>2023-09-04T00:51:59Z</LastSaved>
+ <Version>16.00</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <AllowPNG/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>15990</WindowHeight>
+ <WindowWidth>29040</WindowWidth>
+ <WindowTopX>32767</WindowTopX>
+ <WindowTopY>32767</WindowTopY>
+ <ActiveSheet>2</ActiveSheet>
+ <Iteration/>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ <Style ss:ID="s16">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"
+ ss:Bold="1"/>
+ </Style>
+ <Style ss:ID="s17">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"
+ ss:Italic="1"/>
+ </Style>
+ <Style ss:ID="s18">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"
+ ss:Bold="1" ss:Italic="1"/>
+ </Style>
+ <Style ss:ID="s19">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"
+ ss:Underline="Single"/>
+ </Style>
+ <Style ss:ID="s20">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"
+ ss:Bold="1" ss:Underline="Single"/>
+ </Style>
+ <Style ss:ID="s21">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"
+ ss:StrikeThrough="1"/>
+ </Style>
+ <Style ss:ID="s22">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"
+ ss:VerticalAlign="Superscript"/>
+ </Style>
+ <Style ss:ID="s23">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"
+ ss:VerticalAlign="Subscript"/>
+ </Style>
+ <Style ss:ID="s24">
+ <Font ss:FontName="Calibri Light" x:Family="Swiss" ss:Size="12"
+ ss:Color="#000000"/>
+ </Style>
+ <Style ss:ID="s25">
+ <Font ss:FontName="Arial" x:Family="Swiss" ss:Size="18" ss:Color="#000000"/>
+ </Style>
+ <Style ss:ID="s26">
+ <Font ss:FontName="Times New Roman" x:Family="Roman" ss:Size="14"
+ ss:Color="#000000"/>
+ </Style>
+ <Style ss:ID="s27">
+ <Font ss:FontName="Consolas" x:Family="Modern" ss:Size="9" ss:Color="#000000"/>
+ </Style>
+ <Style ss:ID="s28">
+ <Font ss:FontName="Bookman Old Style" x:Family="Roman" ss:Size="20"
+ ss:Color="#000000"/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Text Properties">
+ <Table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="15" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Column ss:Width="142.5"/>
+ <Row>
+ <Cell><Data ss:Type="String">Normal Text</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="s16"><Data ss:Type="String">Bold Text</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="s17"><Data ss:Type="String">Italic Text</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="s18"><Data ss:Type="String">Bold and Italic Text</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40"><B><Font
+ html:Color="#000000">Bold</Font></B><Font html:Color="#000000"> and </Font><I><Font
+ html:Color="#000000">Italic</Font></I><Font html:Color="#000000"> mixed</Font></ss:Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="s16"><ss:Data ss:Type="String"
+ xmlns="http://www.w3.org/TR/REC-html40"><B><Font html:Color="#000000">Bold base with </Font></B><Font
+ html:Color="#000000">non-bold</Font><B><Font html:Color="#000000"> part</Font></B></ss:Data></Cell>
+ </Row>
+ <Row>
+ <Cell><ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40"><Font
+ html:Color="#000000">Only partially </Font><U><Font html:Color="#000000">underlined</Font></U></ss:Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="s19"><Data ss:Type="String">All Underlined</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="s20"><Data ss:Type="String">Bold and underlined</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="s21"><Data ss:Type="String">All Strikethrough</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40"><Font
+ html:Color="#000000">Partial </Font><S><Font html:Color="#000000">strikethrough</Font></S></ss:Data></Cell>
+ </Row>
+ <Row ss:Height="17.25">
+ <Cell ss:StyleID="s22"><Data ss:Type="String">Superscript</Data></Cell>
+ </Row>
+ <Row ss:Height="18">
+ <Cell ss:StyleID="s23"><Data ss:Type="String">Subscript</Data></Cell>
+ </Row>
+ <Row ss:Height="17.25">
+ <Cell><ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40"><Font
+ html:Color="#000000">x</Font><Sup><Font html:Color="#000000">2</Font></Sup><Font
+ html:Color="#000000"> + y</Font><Sup><Font html:Color="#000000">2</Font></Sup><Font
+ html:Color="#000000"> = 10</Font><Sup><Font html:Color="#000000">2</Font></Sup></ss:Data></Cell>
+ </Row>
+ <Row ss:Height="18">
+ <Cell><ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40"><Font
+ html:Color="#000000">x</Font><Sub><Font html:Color="#000000">i</Font></Sub><Font
+ html:Color="#000000"> = y</Font><Sub><Font html:Color="#000000">i</Font></Sub><Font
+ html:Color="#000000"> + z</Font><Sub><Font html:Color="#000000">i</Font></Sub></ss:Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>10</ActiveRow>
+ <ActiveCol>14</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+ <Worksheet ss:Name="Fonts">
+ <Table ss:ExpandedColumnCount="2" ss:ExpandedRowCount="5" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Column ss:Width="240"/>
+ <Column ss:Width="117.75"/>
+ <Row ss:Height="15.75">
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Calibri Light 12</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Monterotondo</Data></Cell>
+ </Row>
+ <Row ss:Height="23.25">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Arial 18</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Ciayunan</Data></Cell>
+ </Row>
+ <Row ss:Height="18.75">
+ <Cell ss:StyleID="s26"><Data ss:Type="String">Times New Roman 14</Data></Cell>
+ <Cell ss:StyleID="s26"><Data ss:Type="String">Gaoguan</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Consolas 9</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Gumdag</Data></Cell>
+ </Row>
+ <Row ss:Height="25.5">
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Bookman Old Style 20</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Tornabous</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+ <Worksheet ss:Name="Mixed Fonts">
+ <Table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="2" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Column ss:Width="467.25"/>
+ <Row ss:Height="15.75">
+ <Cell><ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40"><Font
+ html:Color="#000000">C++ has </Font><Font html:Face="Liberation Mono"
+ x:Family="Modern" html:Color="#000000">class</Font><Font html:Color="#000000"> and </Font><Font
+ html:Face="Liberation Mono" x:Family="Modern" html:Color="#000000">struct</Font><Font
+ html:Color="#000000"> as keywords.</Font></ss:Data></Cell>
+ </Row>
+ <Row ss:Height="46.5">
+ <Cell><ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40"><Font
+ html:Color="#000000">Text with </Font><Font html:Size="12"
+ html:Color="#FF0000">12</Font><Font html:Size="12" html:Color="#000000">-point</Font><Font
+ html:Color="#000000"> font, </Font><Font html:Size="24" html:Color="#FF0000">24</Font><Font
+ html:Size="24" html:Color="#000000">-point</Font><Font html:Color="#000000"> font, and </Font><Font
+ html:Size="36" html:Color="#FF0000">36</Font><Font html:Size="36"
+ html:Color="#000000">-point</Font><Font html:Color="#000000"> font mixed.</Font></ss:Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Selected/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>1</ActiveRow>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/test/xls-xml/formula-array-1/check.txt b/test/xls-xml/formula-array-1/check.txt
new file mode 100644
index 0000000..2f2eacf
--- /dev/null
+++ b/test/xls-xml/formula-array-1/check.txt
@@ -0,0 +1,23 @@
+Sheet1/0/0:numeric:1
+Sheet1/0/2:numeric:4
+Sheet1/0/3:numeric:5
+Sheet1/0/4:numeric:6
+Sheet1/1/0:numeric:2
+Sheet1/2/0:numeric:3
+Sheet1/4/2:formula:{MMULT(R[-4]C[-2]:R[-2]C[-2],R[-4]C:R[-4]C[2])}:4
+Sheet1/4/3:formula:{MMULT(R[-4]C[-2]:R[-2]C[-2],R[-4]C:R[-4]C[2])}:5
+Sheet1/4/4:formula:{MMULT(R[-4]C[-2]:R[-2]C[-2],R[-4]C:R[-4]C[2])}:6
+Sheet1/5/2:formula:{MMULT(R[-4]C[-2]:R[-2]C[-2],R[-4]C:R[-4]C[2])}:8
+Sheet1/5/3:formula:{MMULT(R[-4]C[-2]:R[-2]C[-2],R[-4]C:R[-4]C[2])}:10
+Sheet1/5/4:formula:{MMULT(R[-4]C[-2]:R[-2]C[-2],R[-4]C:R[-4]C[2])}:12
+Sheet1/6/2:formula:{MMULT(R[-4]C[-2]:R[-2]C[-2],R[-4]C:R[-4]C[2])}:12
+Sheet1/6/3:formula:{MMULT(R[-4]C[-2]:R[-2]C[-2],R[-4]C:R[-4]C[2])}:15
+Sheet1/6/4:formula:{MMULT(R[-4]C[-2]:R[-2]C[-2],R[-4]C:R[-4]C[2])}:18
+Sheet1/8/0:numeric:2
+Sheet1/8/2:numeric:10
+Sheet1/8/3:numeric:12
+Sheet1/8/5:formula:{MMULT(RC[-5]:R[1]C[-5],RC[-3]:RC[-2])}:20
+Sheet1/8/6:formula:{MMULT(RC[-5]:R[1]C[-5],RC[-3]:RC[-2])}:24
+Sheet1/9/0:numeric:4
+Sheet1/9/5:formula:{MMULT(RC[-5]:R[1]C[-5],RC[-3]:RC[-2])}:40
+Sheet1/9/6:formula:{MMULT(RC[-5]:R[1]C[-5],RC[-3]:RC[-2])}:48
diff --git a/test/xls-xml/formula-array-1/input.xml b/test/xls-xml/formula-array-1/input.xml
new file mode 100644
index 0000000..206c810
--- /dev/null
+++ b/test/xls-xml/formula-array-1/input.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2018-04-05T01:00:20Z</Created>
+ <LastSaved>2018-04-08T03:39:54Z</LastSaved>
+ <Version>16.00</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <AllowPNG/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>12225</WindowHeight>
+ <WindowWidth>28800</WindowWidth>
+ <WindowTopX>0</WindowTopX>
+ <WindowTopY>0</WindowTopY>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Sheet1">
+ <Table ss:ExpandedColumnCount="7" ss:ExpandedRowCount="10" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Row>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="3"><Data ss:Type="Number">4</Data></Cell>
+ <Cell><Data ss:Type="Number">5</Data></Cell>
+ <Cell><Data ss:Type="Number">6</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="Number">2</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="Number">3</Data></Cell>
+ </Row>
+ <Row ss:Index="5">
+ <Cell ss:Index="3" ss:ArrayRange="RC:R[2]C[2]"
+ ss:Formula="=MMULT(R[-4]C[-2]:R[-2]C[-2],R[-4]C:R[-4]C[2])"><Data
+ ss:Type="Number">4</Data></Cell>
+ <Cell><Data ss:Type="Number">5</Data></Cell>
+ <Cell><Data ss:Type="Number">6</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:Index="3"><Data ss:Type="Number">8</Data></Cell>
+ <Cell><Data ss:Type="Number">10</Data></Cell>
+ <Cell><Data ss:Type="Number">12</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:Index="3"><Data ss:Type="Number">12</Data></Cell>
+ <Cell><Data ss:Type="Number">15</Data></Cell>
+ <Cell><Data ss:Type="Number">18</Data></Cell>
+ </Row>
+ <Row ss:Index="9">
+ <Cell><Data ss:Type="Number">2</Data></Cell>
+ <Cell ss:Index="3"><Data ss:Type="Number">10</Data></Cell>
+ <Cell><Data ss:Type="Number">12</Data></Cell>
+ <Cell ss:Index="6" ss:ArrayRange="RC:R[1]C[1]"
+ ss:Formula="=MMULT(RC[-5]:R[1]C[-5],RC[-3]:RC[-2])"><Data ss:Type="Number">20</Data></Cell>
+ <Cell><Data ss:Type="Number">24</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="Number">4</Data></Cell>
+ <Cell ss:Index="6"><Data ss:Type="Number">40</Data></Cell>
+ <Cell><Data ss:Type="Number">48</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Selected/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>11</ActiveRow>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/test/xls-xml/formula-cells-1/check.txt b/test/xls-xml/formula-cells-1/check.txt
new file mode 100644
index 0000000..cc0e42e
--- /dev/null
+++ b/test/xls-xml/formula-cells-1/check.txt
@@ -0,0 +1,7 @@
+Sheet1/0/0:numeric:1
+Sheet1/0/1:formula:RC[-1]*2:2
+Sheet1/1/0:numeric:2
+Sheet1/1/1:formula:RC[-1]-10:-8
+Sheet1/2/0:numeric:3
+Sheet1/2/1:formula:RC[-1]/3:1
+Sheet1/4/0:formula:SUM(R[-4]C:R[-2]C):6
diff --git a/test/xls-xml/formula-cells-1/input.xml b/test/xls-xml/formula-cells-1/input.xml
new file mode 100644
index 0000000..99710ec
--- /dev/null
+++ b/test/xls-xml/formula-cells-1/input.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2017-12-17T19:34:25Z</Created>
+ <LastSaved>2017-12-17T19:35:47Z</LastSaved>
+ <Version>16.00</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <AllowPNG/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>12210</WindowHeight>
+ <WindowWidth>28800</WindowWidth>
+ <WindowTopX>0</WindowTopX>
+ <WindowTopY>0</WindowTopY>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Sheet1">
+ <Table ss:ExpandedColumnCount="2" ss:ExpandedRowCount="5" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Row>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Formula="=RC[-1]*2"><Data ss:Type="Number">2</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="Number">2</Data></Cell>
+ <Cell ss:Formula="=RC[-1]-10"><Data ss:Type="Number">-8</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="Number">3</Data></Cell>
+ <Cell ss:Formula="=RC[-1]/3"><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row ss:Index="5">
+ <Cell ss:Formula="=SUM(R[-4]C:R[-2]C)"><Data ss:Type="Number">6</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Selected/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>4</ActiveRow>
+ <ActiveCol>1</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/test/xls-xml/formula-cells-2/check.txt b/test/xls-xml/formula-cells-2/check.txt
new file mode 100644
index 0000000..888c318
--- /dev/null
+++ b/test/xls-xml/formula-cells-2/check.txt
@@ -0,0 +1,41 @@
+Лист1/0/1:string:"14.06.2013"
+Лист1/0/5:string:"Надпись справа"
+Лист1/2/1:string:"Заголовок 1 (центр)"
+Лист1/4/1:string:"Назва"
+Лист1/4/2:string:"Кількість"
+Лист1/4/3:string:"Ціна"
+Лист1/4/4:string:"Сума"
+Лист1/5/1:string:"Український текст1 "
+Лист1/5/2:numeric:32.97
+Лист1/5/3:numeric:10.03
+Лист1/5/4:formula:RC[-2]*RC[-1]:330.69
+Лист1/6/1:string:"Український текст2 "
+Лист1/6/2:numeric:32.93
+Лист1/6/3:numeric:10.06
+Лист1/6/4:formula:RC[-2]*RC[-1]:331.28
+Лист1/7/1:string:"Український текст3 "
+Лист1/7/2:numeric:32.9
+Лист1/7/3:numeric:10.09
+Лист1/7/4:formula:RC[-2]*RC[-1]:331.96
+Лист1/8/1:string:"Український текст4 "
+Лист1/8/2:numeric:32.87
+Лист1/8/3:numeric:10.12
+Лист1/8/4:formula:RC[-2]*RC[-1]:332.64
+Лист1/9/1:string:"Український текст5 "
+Лист1/9/2:numeric:32.84
+Лист1/9/3:numeric:10.15
+Лист1/9/4:formula:RC[-2]*RC[-1]:333.33
+Лист1/10/0:string:"[ITOG]"
+Лист1/10/1:string:"Всього"
+Лист1/10/4:formula:SUM(R[-1]C:R[-1]C):333.33
+Лист1/14/2:string:"Підпис"
+Лист1/0/1:merge-width:4
+Лист1/0/1:merge-height:1
+Лист1/0/5:merge-width:3
+Лист1/0/5:merge-height:1
+Лист1/2/1:merge-width:10
+Лист1/2/1:merge-height:1
+Лист1/10/1:merge-width:3
+Лист1/10/1:merge-height:1
+Лист1/14/2:merge-width:4
+Лист1/14/2:merge-height:1
diff --git a/test/xls-xml/formula-cells-2/config.yaml b/test/xls-xml/formula-cells-2/config.yaml
new file mode 100644
index 0000000..f3a335c
--- /dev/null
+++ b/test/xls-xml/formula-cells-2/config.yaml
@@ -0,0 +1,3 @@
+---
+output-precision: 2
+
diff --git a/test/xls-xml/formula-cells-2/input.xml b/test/xls-xml/formula-cells-2/input.xml
new file mode 100644
index 0000000..0d8315c
--- /dev/null
+++ b/test/xls-xml/formula-cells-2/input.xml
@@ -0,0 +1,198 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40">
+<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+<Author>HOME</Author>
+<LastAuthor>HOME</LastAuthor>
+<LastPrinted>2012-11-18T17:17:34Z</LastPrinted>
+<Created>2012-10-20T06:27:34Z</Created>
+<LastSaved>2012-11-07T05:31:00Z</LastSaved>
+<Company>Home, sweet home !!!</Company>
+<Version>11.5606</Version>
+</DocumentProperties>
+<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+<WindowHeight>10545</WindowHeight>
+<WindowWidth>20940</WindowWidth>
+<WindowTopX>0</WindowTopX>
+<WindowTopY>1590</WindowTopY>
+<ProtectStructure>False</ProtectStructure>
+<ProtectWindows>False</ProtectWindows>
+</ExcelWorkbook>
+<Styles>
+<Style ss:ID="Default" ss:Name="Normal">
+<Alignment ss:Vertical="Bottom"/>
+<Borders/>
+<Font ss:FontName="Arial Cyr" x:CharSet="204"/>
+<Interior/>
+<NumberFormat/>
+<Protection/>
+</Style>
+<Style ss:ID="m24199894">
+<Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
+<Borders>
+<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
+<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+</Borders>
+<Font ss:FontName="Arial Cyr" x:CharSet="204" ss:Bold="1"/>
+</Style>
+<Style ss:ID="s22">
+<Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+<NumberFormat ss:Format="Fixed"/>
+</Style>
+<Style ss:ID="s24">
+<Alignment ss:Horizontal="Right" ss:Vertical="Bottom"/>
+</Style>
+<Style ss:ID="s26">
+<Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
+</Style>
+<Style ss:ID="s27">
+<Alignment ss:Horizontal="Right" ss:Vertical="Bottom"/>
+<Font ss:FontName="Arial Cyr" x:CharSet="204"/>
+</Style>
+<Style ss:ID="s29">
+<Borders>
+<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
+<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+</Borders>
+<Font ss:FontName="Arial Cyr" x:CharSet="204"/>
+</Style>
+<Style ss:ID="s30">
+<Alignment ss:Horizontal="Right" ss:Vertical="Bottom"/>
+<Borders>
+<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
+<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+</Borders>
+<NumberFormat ss:Format="Fixed"/>
+</Style>
+<Style ss:ID="s31">
+<Borders>
+<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
+<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+</Borders>
+<NumberFormat ss:Format="Fixed"/>
+</Style>
+<Style ss:ID="s32">
+<Alignment ss:Horizontal="Right" ss:Vertical="Bottom"/>
+<Borders>
+<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+</Borders>
+<Font ss:FontName="Arial Cyr" x:CharSet="204"/>
+</Style>
+<Style ss:ID="s41">
+<Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
+<Borders>
+<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
+<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+</Borders>
+</Style>
+<Style ss:ID="s43">
+<Alignment ss:Vertical="Bottom"/>
+</Style>
+<Style ss:ID="s44">
+<Borders>
+<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
+<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+</Borders>
+<Font ss:FontName="Arial Cyr" x:CharSet="204" ss:Bold="1"/>
+<NumberFormat ss:Format="Fixed"/>
+</Style>
+</Styles>
+<Worksheet ss:Name="Лист1">
+<Table ss:ExpandedColumnCount="11" ss:ExpandedRowCount="15" x:FullColumns="1" x:FullRows="1">
+<Column ss:AutoFitWidth="0" ss:Width="36"/>
+<Column ss:AutoFitWidth="0" ss:Width="182.25"/>
+<Column ss:Index="11" ss:AutoFitWidth="0" ss:Width="41.25"/>
+<Row>
+<Cell ss:Index="2" ss:MergeAcross="3" ss:StyleID="s22"><Data ss:Type="String">14.06.2013</Data></Cell>
+<Cell ss:MergeAcross="2" ss:StyleID="s24"><Data ss:Type="String">Надпись справа</Data></Cell>
+<Cell ss:StyleID="s43"/> <Cell ss:StyleID="s43"/> <Cell ss:StyleID="s43"/> </Row> <Row ss:Index="3"> <Cell ss:Index="2" ss:MergeAcross="9" ss:StyleID="s26"><Data ss:Type="String">Заголовок 1 (центр)</Data></Cell>
+</Row>
+<Row ss:Index="5">
+<Cell ss:StyleID="s27"><Data ss:Type="String"/></Cell>
+<Cell ss:StyleID="s41"><Data ss:Type="String">Назва</Data></Cell>
+<Cell ss:StyleID="s41"><Data ss:Type="String">Кількість</Data></Cell>
+<Cell ss:StyleID="s41"><Data ss:Type="String">Ціна</Data></Cell>
+<Cell ss:StyleID="s41"><Data ss:Type="String">Сума</Data></Cell>
+</Row>
+<Row>
+<Cell ss:StyleID="s27"><Data ss:Type="String"/></Cell>
+<Cell ss:StyleID="s29"><Data ss:Type="String">Український текст1 </Data></Cell>
+<Cell ss:StyleID="s30"><Data ss:Type="Number">32.97</Data></Cell>
+<Cell ss:StyleID="s30"><Data ss:Type="Number">10.03</Data></Cell>
+<Cell ss:StyleID="s31" ss:Formula="=RC[-2]*RC[-1]"/>
+</Row>
+<Row>
+<Cell ss:StyleID="s27"><Data ss:Type="String"/></Cell>
+<Cell ss:StyleID="s29"><Data ss:Type="String">Український текст2 </Data></Cell>
+<Cell ss:StyleID="s30"><Data ss:Type="Number">32.93</Data></Cell>
+<Cell ss:StyleID="s30"><Data ss:Type="Number">10.06</Data></Cell>
+<Cell ss:StyleID="s31" ss:Formula="=RC[-2]*RC[-1]"/>
+</Row>
+<Row>
+<Cell ss:StyleID="s27"><Data ss:Type="String"/></Cell>
+<Cell ss:StyleID="s29"><Data ss:Type="String">Український текст3 </Data></Cell>
+<Cell ss:StyleID="s30"><Data ss:Type="Number">32.90</Data></Cell>
+<Cell ss:StyleID="s30"><Data ss:Type="Number">10.09</Data></Cell>
+<Cell ss:StyleID="s31" ss:Formula="=RC[-2]*RC[-1]"/>
+</Row>
+<Row>
+<Cell ss:StyleID="s27"><Data ss:Type="String"/></Cell>
+<Cell ss:StyleID="s29"><Data ss:Type="String">Український текст4 </Data></Cell>
+<Cell ss:StyleID="s30"><Data ss:Type="Number">32.87</Data></Cell>
+<Cell ss:StyleID="s30"><Data ss:Type="Number">10.12</Data></Cell>
+<Cell ss:StyleID="s31" ss:Formula="=RC[-2]*RC[-1]"/>
+</Row>
+<Row>
+<Cell ss:StyleID="s27"><Data ss:Type="String"/></Cell>
+<Cell ss:StyleID="s29"><Data ss:Type="String">Український текст5 </Data></Cell>
+<Cell ss:StyleID="s30"><Data ss:Type="Number">32.84</Data></Cell>
+<Cell ss:StyleID="s30"><Data ss:Type="Number">10.15</Data></Cell>
+<Cell ss:StyleID="s31" ss:Formula="=RC[-2]*RC[-1]"/>
+</Row>
+<Row>
+<Cell ss:StyleID="s32"><Data ss:Type="String">[ITOG]</Data></Cell>
+<Cell ss:MergeAcross="2" ss:StyleID="m24199894"><Data ss:Type="String">Всього</Data></Cell>
+<Cell ss:StyleID="s44" ss:Formula="=SUM(R[-1]C:R[-1]C)"/>
+<Cell><Data ss:Type="String"/></Cell>
+</Row>
+<Row ss:Index="15">
+<Cell ss:Index="3" ss:MergeAcross="3" ss:StyleID="s26"><Data ss:Type="String">Підпис</Data></Cell>
+</Row>
+</Table>
+<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+<PageSetup>
+<Header x:Margin="0.26"/>
+<PageMargins x:Bottom="0.984251969" x:Left="0.45" x:Right="0.36" x:Top="0.44"/>
+</PageSetup>
+<Print>
+<ValidPrinterInfo/>
+<PaperSizeIndex>9</PaperSizeIndex>
+<HorizontalResolution>300</HorizontalResolution>
+<VerticalResolution>300</VerticalResolution>
+</Print>
+<PageBreakZoom>60</PageBreakZoom>
+<Selected/>
+<Panes>
+<Pane>
+<Number>3</Number>
+<ActiveRow>14</ActiveRow>
+<ActiveCol>8</ActiveCol>
+</Pane>
+</Panes>
+<ProtectObjects>False</ProtectObjects>
+<ProtectScenarios>False</ProtectScenarios>
+</WorksheetOptions>
+</Worksheet>
+</Workbook> \ No newline at end of file
diff --git a/test/xls-xml/formula-cells-3/check.txt b/test/xls-xml/formula-cells-3/check.txt
new file mode 100644
index 0000000..ad94e19
--- /dev/null
+++ b/test/xls-xml/formula-cells-3/check.txt
@@ -0,0 +1,6 @@
+Sheet1/0/0:formula:Sheet2!R[1]C[1]:Reference ME!
+Sheet1/1/0:formula:SUM(Sheet2!R[3]C[2]:R[5]C[2]):6
+Sheet2/1/1:string:"Reference ME!"
+Sheet2/4/2:numeric:1
+Sheet2/5/2:numeric:2
+Sheet2/6/2:numeric:3
diff --git a/test/xls-xml/formula-cells-3/input.xml b/test/xls-xml/formula-cells-3/input.xml
new file mode 100644
index 0000000..4161e6d
--- /dev/null
+++ b/test/xls-xml/formula-cells-3/input.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2020-05-23T00:44:47Z</Created>
+ <Version>16.00</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <AllowPNG/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>12315</WindowHeight>
+ <WindowWidth>28800</WindowWidth>
+ <WindowTopX>32767</WindowTopX>
+ <WindowTopY>32767</WindowTopY>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Sheet1">
+ <Table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="2" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:Formula="=Sheet2!R[1]C[1]"><Data ss:Type="String">Reference ME!</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:Formula="=SUM(Sheet2!R[3]C[2]:R[5]C[2])"><Data ss:Type="Number">6</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Unsynced/>
+ <Selected/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>1</ActiveRow>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+ <Worksheet ss:Name="Sheet2">
+ <Table ss:ExpandedColumnCount="3" ss:ExpandedRowCount="7" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Row ss:AutoFitHeight="0"/>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:Index="2"><Data ss:Type="String">Reference ME!</Data></Cell>
+ </Row>
+ <Row ss:Index="5" ss:AutoFitHeight="0">
+ <Cell ss:Index="3"><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:Index="3"><Data ss:Type="Number">2</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:Index="3"><Data ss:Type="Number">3</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Unsynced/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>4</ActiveRow>
+ <ActiveCol>2</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/test/xls-xml/formula-cells-parse-error/input.xml b/test/xls-xml/formula-cells-parse-error/input.xml
new file mode 100644
index 0000000..70a9476
--- /dev/null
+++ b/test/xls-xml/formula-cells-parse-error/input.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2017-12-17T19:34:25Z</Created>
+ <LastSaved>2017-12-17T19:35:47Z</LastSaved>
+ <Version>16.00</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <AllowPNG/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>12210</WindowHeight>
+ <WindowWidth>28800</WindowWidth>
+ <WindowTopX>0</WindowTopX>
+ <WindowTopY>0</WindowTopY>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Sheet1">
+ <Table ss:ExpandedColumnCount="2" ss:ExpandedRowCount="5" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Row>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Formula="=RC[-1]*2"><Data ss:Type="Number">2</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="Number">2</Data></Cell>
+ <Cell ss:Formula="=RC[-1]:Foo-10"><Data ss:Type="Number">-8</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="Number">3</Data></Cell>
+ <Cell ss:Formula="=RC[-1]/3"><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row ss:Index="5">
+ <Cell ss:Formula="=SUM(R[-4]C:R[-2]C):Error"><Data ss:Type="Number">6</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Selected/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>4</ActiveRow>
+ <ActiveCol>1</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/test/xls-xml/hidden-rows-columns/input.xml b/test/xls-xml/hidden-rows-columns/input.xml
new file mode 100644
index 0000000..6b4b597
--- /dev/null
+++ b/test/xls-xml/hidden-rows-columns/input.xml
@@ -0,0 +1,115 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2018-02-14T01:31:11Z</Created>
+ <LastSaved>2018-02-14T01:35:31Z</LastSaved>
+ <Version>16.00</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <AllowPNG/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>9105</WindowHeight>
+ <WindowWidth>13800</WindowWidth>
+ <WindowTopX>0</WindowTopX>
+ <WindowTopY>0</WindowTopY>
+ <ActiveSheet>1</ActiveSheet>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Hidden Rows">
+ <Table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="9" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Row>
+ <Cell><Data ss:Type="String">visible</Data></Cell>
+ </Row>
+ <Row ss:Hidden="1">
+ <Cell><Data ss:Type="String">hidden</Data></Cell>
+ </Row>
+ <Row ss:Hidden="1">
+ <Cell><Data ss:Type="String">hidden</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">visible</Data></Cell>
+ </Row>
+ <Row ss:Hidden="1">
+ <Cell><Data ss:Type="String">hidden</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">visible</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">visible</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">visible</Data></Cell>
+ </Row>
+ <Row ss:Hidden="1">
+ <Cell><Data ss:Type="String">hidden</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>14</ActiveRow>
+ <ActiveCol>3</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+ <Worksheet ss:Name="Hidden Columns">
+ <Table ss:ExpandedColumnCount="12" ss:ExpandedRowCount="1" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Column ss:Index="3" ss:Hidden="1" ss:AutoFitWidth="0" ss:Span="3"/>
+ <Column ss:Index="11" ss:Hidden="1" ss:AutoFitWidth="0"/>
+ <Row>
+ <Cell ss:Index="2"><Data ss:Type="String">hidden -&gt;</Data></Cell>
+ <Cell ss:Index="7"><Data ss:Type="String">&lt;- hidden</Data></Cell>
+ <Cell ss:Index="10"><Data ss:Type="String">hidden -&gt;</Data></Cell>
+ <Cell ss:Index="12"><Data ss:Type="String">&lt;- hidden</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Selected/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>10</ActiveRow>
+ <ActiveCol>1</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/test/xls-xml/invalid-sub-structure/check.txt b/test/xls-xml/invalid-sub-structure/check.txt
new file mode 100644
index 0000000..935cf22
--- /dev/null
+++ b/test/xls-xml/invalid-sub-structure/check.txt
@@ -0,0 +1,25 @@
+Num/1/0:numeric:1.1
+Num/1/2:numeric:2.1
+Num/1/4:numeric:3.1
+Num/2/0:numeric:1.2
+Num/2/2:numeric:2.2
+Num/2/4:numeric:3.2
+Num/3/0:numeric:1.3
+Num/3/2:numeric:2.3
+Num/3/4:numeric:3.3
+Num/6/2:numeric:5
+Num/6/3:numeric:6
+Num/6/4:numeric:7
+Text/0/0:string:"A"
+Text/1/0:string:"B"
+Text/1/1:string:"D"
+Text/2/0:string:"C"
+Text/2/1:string:"E"
+Text/2/2:string:"G"
+Text/3/1:string:"F"
+Text/3/2:string:"H"
+Text/4/2:string:"I"
+Text/6/3:string:"Andy"
+Text/7/3:string:"Bruce"
+Text/8/3:string:"Charlie"
+Text/9/3:string:"David"
diff --git a/test/xls-xml/invalid-sub-structure/input.xml b/test/xls-xml/invalid-sub-structure/input.xml
new file mode 100644
index 0000000..16787a5
--- /dev/null
+++ b/test/xls-xml/invalid-sub-structure/input.xml
@@ -0,0 +1,135 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2012-12-11T23:16:00Z</Created>
+ <LastSaved>2012-12-11T23:19:30Z</LastSaved>
+ <Company>Novell, Inc.</Company>
+ <Version>16.00</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <AllowPNG/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>8775</WindowHeight>
+ <WindowWidth>20880</WindowWidth>
+ <WindowTopX>360</WindowTopX>
+ <WindowTopY>75</WindowTopY>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Num">
+ <Table ss:ExpandedColumnCount="5" ss:ExpandedRowCount="7" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Row ss:Index="2">
+ <Cell><Data ss:Type="Number">1.1000000000000001</Data></Cell>
+ <Cell ss:Index="3"><Data ss:Type="Number">2.1</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="Number">3.1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="Number">1.2</Data></Cell>
+ <Cell ss:Index="3"><Data ss:Type="Number">2.2000000000000002</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="Number">3.2</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="Number">1.3</Data></Cell>
+ <Cell ss:Index="3"><Data ss:Type="Number">2.2999999999999998</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="Number">3.3</Data></Cell>
+ </Row>
+ <Row ss:Index="7">
+ <Cell ss:Index="3"><Data ss:Type="Number">5</Data></Cell>
+ <Cell><Data ss:Type="Number">6</Data></Cell>
+ <Cell><Data ss:Type="Number">7</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Selected/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>6</ActiveRow>
+ <ActiveCol>5</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+ <Worksheet ss:Name="Text">
+ <Table ss:ExpandedColumnCount="4" ss:ExpandedRowCount="10" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Row>
+ <Cell><Data ss:Type="String">A</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">B</Data></Cell>
+ <Cell><Data ss:Type="String">D</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">C</Data></Cell>
+ <Cell><Data ss:Type="String">E</Data></Cell>
+ <Cell><Data ss:Type="String">G</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:Index="2"><Data ss:Type="String">F</Data></Cell>
+ <Cell><Data ss:Type="String">H</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:Index="3"><Data ss:Type="String">I</Data></Cell>
+ </Row>
+ <Row ss:Index="7">
+ <Cell ss:Index="4"><Data ss:Type="String">Andy</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:Index="4"><Data ss:Type="String">Bruce</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:Index="4"><Data ss:Type="String">Charlie</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:Index="4"><Data ss:Type="String">David</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>8</ActiveRow>
+ <ActiveCol>3</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup/>
+ <Panes/>
+ </WorksheetOptions>
+</Workbook>
diff --git a/test/xls-xml/leading-whitespace/check.txt b/test/xls-xml/leading-whitespace/check.txt
new file mode 100644
index 0000000..7e198a8
--- /dev/null
+++ b/test/xls-xml/leading-whitespace/check.txt
@@ -0,0 +1,27 @@
+Data/0/0:string:"Numbers"
+Data/0/2:string:"Fractions"
+Data/0/4:string:"Text"
+Data/1/0:numeric:1
+Data/1/2:numeric:1.1
+Data/1/4:string:"A"
+Data/2/0:numeric:2
+Data/2/2:numeric:1.2
+Data/2/4:string:"B"
+Data/3/0:numeric:3
+Data/3/2:numeric:1.3
+Data/3/4:string:"C"
+Data/4/0:numeric:4
+Data/4/2:numeric:1.4
+Data/4/4:string:"D"
+Data/5/0:numeric:5
+Data/5/2:numeric:1.5
+Data/5/4:string:"E"
+Data/6/0:numeric:6
+Data/6/2:numeric:1.6
+Data/6/4:string:"F"
+Data/8/0:string:"One"
+Data/8/1:string:"Two"
+Data/8/2:string:"Three"
+Data/8/3:string:"Four"
+Data/8/4:string:"Five"
+2nd/0/0:string:"Empty Sheet"
diff --git a/test/xls-xml/leading-whitespace/input.xml b/test/xls-xml/leading-whitespace/input.xml
new file mode 100644
index 0000000..a645015
--- /dev/null
+++ b/test/xls-xml/leading-whitespace/input.xml
@@ -0,0 +1,112 @@
+ <?xml version="1.0"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2013-06-15T21:47:21Z</Created>
+ <Company>SUSE</Company>
+ <Version>10.2625</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <DownloadComponents/>
+ <LocationOfComponents HRef="file:///D:\"/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>9525</WindowHeight>
+ <WindowWidth>14355</WindowWidth>
+ <WindowTopX>240</WindowTopX>
+ <WindowTopY>30</WindowTopY>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Data">
+ <Table ss:ExpandedColumnCount="5" ss:ExpandedRowCount="9" x:FullColumns="1"
+ x:FullRows="1">
+ <Row>
+ <Cell><Data ss:Type="String">Numbers</Data></Cell>
+ <Cell ss:Index="3"><Data ss:Type="String">Fractions</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">Text</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="3"><Data ss:Type="Number">1.1</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">A</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="Number">2</Data></Cell>
+ <Cell ss:Index="3"><Data ss:Type="Number">1.2</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">B</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="Number">3</Data></Cell>
+ <Cell ss:Index="3"><Data ss:Type="Number">1.3</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">C</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="Number">4</Data></Cell>
+ <Cell ss:Index="3"><Data ss:Type="Number">1.4</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">D</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="Number">5</Data></Cell>
+ <Cell ss:Index="3"><Data ss:Type="Number">1.5</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">E</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="Number">6</Data></Cell>
+ <Cell ss:Index="3"><Data ss:Type="Number">1.6</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">F</Data></Cell>
+ </Row>
+ <Row ss:Index="9">
+ <Cell><Data ss:Type="String">One</Data></Cell>
+ <Cell><Data ss:Type="String">Two</Data></Cell>
+ <Cell><Data ss:Type="String">Three</Data></Cell>
+ <Cell><Data ss:Type="String">Four</Data></Cell>
+ <Cell><Data ss:Type="String">Five</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <Selected/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>9</ActiveRow>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+ <Worksheet ss:Name="2nd">
+ <Table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="1" x:FullColumns="1"
+ x:FullRows="1">
+ <Row>
+ <Cell><Data ss:Type="String">Empty Sheet</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>1</ActiveRow>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/test/xls-xml/matrix-results/input.xml b/test/xls-xml/matrix-results/input.xml
new file mode 100644
index 0000000..16f04fa
--- /dev/null
+++ b/test/xls-xml/matrix-results/input.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2017-12-17T16:17:53Z</Created>
+ <LastSaved>2017-12-17T16:20:44Z</LastSaved>
+ <Version>16.00</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <AllowPNG/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>12210</WindowHeight>
+ <WindowWidth>28800</WindowWidth>
+ <WindowTopX>0</WindowTopX>
+ <WindowTopY>0</WindowTopY>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Sheet1">
+ <Table ss:ExpandedColumnCount="9" ss:ExpandedRowCount="4" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Row ss:Index="2">
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell><Data ss:Type="Number">2</Data></Cell>
+ <Cell><Data ss:Type="Number">3</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="Number">7</Data></Cell>
+ <Cell><Data ss:Type="Number">10</Data></Cell>
+ <Cell ss:Index="8" ss:ArrayRange="RC:R[1]C[1]"
+ ss:Formula="=MMULT(RC[-7]:R[1]C[-5],RC[-3]:R[2]C[-2])"><Data ss:Type="Number">50</Data></Cell>
+ <Cell><Data ss:Type="Number">68</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="Number">4</Data></Cell>
+ <Cell><Data ss:Type="Number">5</Data></Cell>
+ <Cell><Data ss:Type="Number">6</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="Number">8</Data></Cell>
+ <Cell><Data ss:Type="Number">11</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">122</Data></Cell>
+ <Cell><Data ss:Type="Number">167</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:Index="5"><Data ss:Type="Number">9</Data></Cell>
+ <Cell><Data ss:Type="Number">12</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Selected/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>1</ActiveRow>
+ <ActiveCol>8</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/test/xls-xml/merged-cells/check.txt b/test/xls-xml/merged-cells/check.txt
new file mode 100644
index 0000000..9c9fee8
--- /dev/null
+++ b/test/xls-xml/merged-cells/check.txt
@@ -0,0 +1,16 @@
+Sheet1/0/0:numeric:1
+Sheet1/0/1:numeric:2
+Sheet1/0/3:numeric:3
+Sheet1/1/0:numeric:2
+Sheet1/2/2:string:"merged cell"
+Sheet1/3/0:numeric:3
+Sheet1/0/1:merge-width:2
+Sheet1/0/1:merge-height:1
+Sheet1/0/3:merge-width:3
+Sheet1/0/3:merge-height:1
+Sheet1/1/0:merge-width:1
+Sheet1/1/0:merge-height:2
+Sheet1/2/2:merge-width:4
+Sheet1/2/2:merge-height:4
+Sheet1/3/0:merge-width:1
+Sheet1/3/0:merge-height:3
diff --git a/test/xls-xml/merged-cells/input.xml b/test/xls-xml/merged-cells/input.xml
new file mode 100644
index 0000000..6bc69d5
--- /dev/null
+++ b/test/xls-xml/merged-cells/input.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2016-12-15T03:48:24Z</Created>
+ <LastSaved>2016-12-15T03:54:21Z</LastSaved>
+ <Version>15.00</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <AllowPNG/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>14385</WindowHeight>
+ <WindowWidth>24000</WindowWidth>
+ <WindowTopX>0</WindowTopX>
+ <WindowTopY>0</WindowTopY>
+ <RefModeR1C1/>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ <Style ss:ID="s17">
+ <Interior ss:Color="#FCE4D6" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s22">
+ <Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
+ <Interior ss:Color="#EDEDED" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s23">
+ <Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
+ <Interior ss:Color="#FFF2CC" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s24">
+ <Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
+ <Interior ss:Color="#F8CBAD" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s25">
+ <Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
+ <Interior ss:Color="#F4B084" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s26">
+ <Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
+ <Interior ss:Color="#FFFF00" ss:Pattern="Solid"/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Sheet1">
+ <Table ss:ExpandedColumnCount="6" ss:ExpandedRowCount="6" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Row>
+ <Cell ss:StyleID="s17"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:MergeAcross="1" ss:StyleID="s22"><Data ss:Type="Number">2</Data></Cell>
+ <Cell ss:MergeAcross="2" ss:StyleID="s23"><Data ss:Type="Number">3</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:MergeDown="1" ss:StyleID="s24"><Data ss:Type="Number">2</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:Index="3" ss:MergeAcross="3" ss:MergeDown="3" ss:StyleID="s26"><Data
+ ss:Type="String">merged cell</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:MergeDown="2" ss:StyleID="s25"><Data ss:Type="Number">3</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Print>
+ <ValidPrinterInfo/>
+ <VerticalResolution>0</VerticalResolution>
+ </Print>
+ <Selected/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>8</ActiveRow>
+ <ActiveCol>5</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/test/xls-xml/named-colors/check.txt b/test/xls-xml/named-colors/check.txt
new file mode 100644
index 0000000..323aa11
--- /dev/null
+++ b/test/xls-xml/named-colors/check.txt
@@ -0,0 +1,282 @@
+Sheet2/0/0:string:"Color Name"
+Sheet2/0/1:string:"Hex RGB"
+Sheet2/1/0:string:"aliceblue"
+Sheet2/1/1:string:"#F0F8FF"
+Sheet2/2/0:string:"antiquewhite"
+Sheet2/2/1:string:"#FAEBD7"
+Sheet2/3/0:string:"aqua"
+Sheet2/3/1:string:"#00FFFF"
+Sheet2/4/0:string:"aquamarine"
+Sheet2/4/1:string:"#7FFFD4"
+Sheet2/5/0:string:"azure"
+Sheet2/5/1:string:"#F0FFFF"
+Sheet2/6/0:string:"beige"
+Sheet2/6/1:string:"#F5F5DC"
+Sheet2/7/0:string:"bisque"
+Sheet2/7/1:string:"#FFE4C4"
+Sheet2/8/0:string:"black"
+Sheet2/8/1:string:"#000000"
+Sheet2/9/0:string:"blanchedalmond"
+Sheet2/9/1:string:"#FFEBCD"
+Sheet2/10/0:string:"blue"
+Sheet2/10/1:string:"#0000FF"
+Sheet2/11/0:string:"blueviolet"
+Sheet2/11/1:string:"#8A2BE2"
+Sheet2/12/0:string:"brown"
+Sheet2/12/1:string:"#A52A2A"
+Sheet2/13/0:string:"burlywood"
+Sheet2/13/1:string:"#DEB887"
+Sheet2/14/0:string:"cadetblue"
+Sheet2/14/1:string:"#5F9EA0"
+Sheet2/15/0:string:"chartreuse"
+Sheet2/15/1:string:"#7FFF00"
+Sheet2/16/0:string:"chocolate"
+Sheet2/16/1:string:"#D2691E"
+Sheet2/17/0:string:"coral"
+Sheet2/17/1:string:"#FF7F50"
+Sheet2/18/0:string:"cornflowerblue"
+Sheet2/18/1:string:"#6495ED"
+Sheet2/19/0:string:"cornsilk"
+Sheet2/19/1:string:"#FFF8DC"
+Sheet2/20/0:string:"crimson"
+Sheet2/20/1:string:"#DC143C"
+Sheet2/21/0:string:"cyan"
+Sheet2/21/1:string:"#00FFFF"
+Sheet2/22/0:string:"darkblue"
+Sheet2/22/1:string:"#00008B"
+Sheet2/23/0:string:"darkcyan"
+Sheet2/23/1:string:"#008B8B"
+Sheet2/24/0:string:"darkgoldenrod"
+Sheet2/24/1:string:"#B8860B"
+Sheet2/25/0:string:"darkgray"
+Sheet2/25/1:string:"#A9A9A9"
+Sheet2/26/0:string:"darkgreen"
+Sheet2/26/1:string:"#006400"
+Sheet2/27/0:string:"darkkhaki"
+Sheet2/27/1:string:"#BDB76B"
+Sheet2/28/0:string:"darkmagenta"
+Sheet2/28/1:string:"#8B008B"
+Sheet2/29/0:string:"darkolivegreen"
+Sheet2/29/1:string:"#556B2F"
+Sheet2/30/0:string:"darkorange"
+Sheet2/30/1:string:"#FF8C00"
+Sheet2/31/0:string:"darkorchid"
+Sheet2/31/1:string:"#9932CC"
+Sheet2/32/0:string:"darkred"
+Sheet2/32/1:string:"#8B0000"
+Sheet2/33/0:string:"darksalmon"
+Sheet2/33/1:string:"#E9967A"
+Sheet2/34/0:string:"darkseagreen"
+Sheet2/34/1:string:"#8FBC8F"
+Sheet2/35/0:string:"darkslateblue"
+Sheet2/35/1:string:"#483D8B"
+Sheet2/36/0:string:"darkslategray"
+Sheet2/36/1:string:"#2F4F4F"
+Sheet2/37/0:string:"darkturquoise"
+Sheet2/37/1:string:"#00CED1"
+Sheet2/38/0:string:"darkviolet"
+Sheet2/38/1:string:"#9400D3"
+Sheet2/39/0:string:"deeppink"
+Sheet2/39/1:string:"#FF1493"
+Sheet2/40/0:string:"deepskyblue"
+Sheet2/40/1:string:"#00BFFF"
+Sheet2/41/0:string:"dimgray"
+Sheet2/41/1:string:"#696969"
+Sheet2/42/0:string:"dodgerblue"
+Sheet2/42/1:string:"#1E90FF"
+Sheet2/43/0:string:"firebrick"
+Sheet2/43/1:string:"#B22222"
+Sheet2/44/0:string:"floralwhite"
+Sheet2/44/1:string:"#FFFAF0"
+Sheet2/45/0:string:"forestgreen"
+Sheet2/45/1:string:"#228B22"
+Sheet2/46/0:string:"fuchsia"
+Sheet2/46/1:string:"#FF00FF"
+Sheet2/47/0:string:"gainsboro"
+Sheet2/47/1:string:"#DCDCDC"
+Sheet2/48/0:string:"ghostwhite"
+Sheet2/48/1:string:"#F8F8FF"
+Sheet2/49/0:string:"gold"
+Sheet2/49/1:string:"#FFD700"
+Sheet2/50/0:string:"goldenrod"
+Sheet2/50/1:string:"#DAA520"
+Sheet2/51/0:string:"gray"
+Sheet2/51/1:string:"#808080"
+Sheet2/52/0:string:"green"
+Sheet2/52/1:string:"#008000"
+Sheet2/53/0:string:"greenyellow"
+Sheet2/53/1:string:"#ADFF2F"
+Sheet2/54/0:string:"honeydew"
+Sheet2/54/1:string:"#F0FFF0"
+Sheet2/55/0:string:"hotpink"
+Sheet2/55/1:string:"#FF69B4"
+Sheet2/56/0:string:"indianred"
+Sheet2/56/1:string:"#CD5C5C"
+Sheet2/57/0:string:"indigo"
+Sheet2/57/1:string:"#4B0082"
+Sheet2/58/0:string:"ivory"
+Sheet2/58/1:string:"#FFFFF0"
+Sheet2/59/0:string:"khaki"
+Sheet2/59/1:string:"#F0E68C"
+Sheet2/60/0:string:"lavender"
+Sheet2/60/1:string:"#E6E6FA"
+Sheet2/61/0:string:"lavenderblush"
+Sheet2/61/1:string:"#FFF0F5"
+Sheet2/62/0:string:"lawngreen"
+Sheet2/62/1:string:"#7CFC00"
+Sheet2/63/0:string:"lemonchiffon"
+Sheet2/63/1:string:"#FFFACD"
+Sheet2/64/0:string:"lightblue"
+Sheet2/64/1:string:"#ADD8E6"
+Sheet2/65/0:string:"lightcoral"
+Sheet2/65/1:string:"#F08080"
+Sheet2/66/0:string:"lightcyan"
+Sheet2/66/1:string:"#E0FFFF"
+Sheet2/67/0:string:"lightgoldenrodyellow"
+Sheet2/67/1:string:"#FAFAD2"
+Sheet2/68/0:string:"lightgray"
+Sheet2/68/1:string:"#D3D3D3"
+Sheet2/69/0:string:"lightgreen"
+Sheet2/69/1:string:"#90EE90"
+Sheet2/70/0:string:"lightpink"
+Sheet2/70/1:string:"#FFB6C1"
+Sheet2/71/0:string:"lightsalmon"
+Sheet2/71/1:string:"#FFA07A"
+Sheet2/72/0:string:"lightseagreen"
+Sheet2/72/1:string:"#20B2AA"
+Sheet2/73/0:string:"lightskyblue"
+Sheet2/73/1:string:"#87CEFA"
+Sheet2/74/0:string:"lightslategray"
+Sheet2/74/1:string:"#778899"
+Sheet2/75/0:string:"lightsteelblue"
+Sheet2/75/1:string:"#B0C4DE"
+Sheet2/76/0:string:"lightyellow"
+Sheet2/76/1:string:"#FFFFE0"
+Sheet2/77/0:string:"lime"
+Sheet2/77/1:string:"#00FF00"
+Sheet2/78/0:string:"limegreen"
+Sheet2/78/1:string:"#32CD32"
+Sheet2/79/0:string:"linen"
+Sheet2/79/1:string:"#FAF0E6"
+Sheet2/80/0:string:"magenta"
+Sheet2/80/1:string:"#FF00FF"
+Sheet2/81/0:string:"maroon"
+Sheet2/81/1:string:"#800000"
+Sheet2/82/0:string:"mediumaquamarine"
+Sheet2/82/1:string:"#66CDAA"
+Sheet2/83/0:string:"mediumblue"
+Sheet2/83/1:string:"#0000CD"
+Sheet2/84/0:string:"mediumorchid"
+Sheet2/84/1:string:"#BA55D3"
+Sheet2/85/0:string:"mediumpurple"
+Sheet2/85/1:string:"#9370DB"
+Sheet2/86/0:string:"mediumseagreen"
+Sheet2/86/1:string:"#3CB371"
+Sheet2/87/0:string:"mediumslateblue"
+Sheet2/87/1:string:"#7B68EE"
+Sheet2/88/0:string:"mediumspringgreen"
+Sheet2/88/1:string:"#00FA9A"
+Sheet2/89/0:string:"mediumturquoise"
+Sheet2/89/1:string:"#48D1CC"
+Sheet2/90/0:string:"mediumvioletred"
+Sheet2/90/1:string:"#C71585"
+Sheet2/91/0:string:"midnightblue"
+Sheet2/91/1:string:"#191970"
+Sheet2/92/0:string:"mintcream"
+Sheet2/92/1:string:"#F5FFFA"
+Sheet2/93/0:string:"mistyrose"
+Sheet2/93/1:string:"#FFE4E1"
+Sheet2/94/0:string:"moccasin"
+Sheet2/94/1:string:"#FFE4B5"
+Sheet2/95/0:string:"navajowhite"
+Sheet2/95/1:string:"#FFDEAD"
+Sheet2/96/0:string:"navy"
+Sheet2/96/1:string:"#000080"
+Sheet2/97/0:string:"oldlace"
+Sheet2/97/1:string:"#FDF5E6"
+Sheet2/98/0:string:"olive"
+Sheet2/98/1:string:"#808000"
+Sheet2/99/0:string:"olivedrab"
+Sheet2/99/1:string:"#6B8E23"
+Sheet2/100/0:string:"orange"
+Sheet2/100/1:string:"#FFA500"
+Sheet2/101/0:string:"orangered"
+Sheet2/101/1:string:"#FF4500"
+Sheet2/102/0:string:"orchid"
+Sheet2/102/1:string:"#DA70D6"
+Sheet2/103/0:string:"palegoldenrod"
+Sheet2/103/1:string:"#EEE8AA"
+Sheet2/104/0:string:"palegreen"
+Sheet2/104/1:string:"#98FB98"
+Sheet2/105/0:string:"paleturquoise"
+Sheet2/105/1:string:"#AFEEEE"
+Sheet2/106/0:string:"palevioletred"
+Sheet2/106/1:string:"#DB7093"
+Sheet2/107/0:string:"papayawhip"
+Sheet2/107/1:string:"#FFEFD5"
+Sheet2/108/0:string:"peachpuff"
+Sheet2/108/1:string:"#FFDAB9"
+Sheet2/109/0:string:"peru"
+Sheet2/109/1:string:"#CD853F"
+Sheet2/110/0:string:"pink"
+Sheet2/110/1:string:"#FFC0CB"
+Sheet2/111/0:string:"plum"
+Sheet2/111/1:string:"#DDA0DD"
+Sheet2/112/0:string:"powderblue"
+Sheet2/112/1:string:"#B0E0E6"
+Sheet2/113/0:string:"purple"
+Sheet2/113/1:string:"#800080"
+Sheet2/114/0:string:"red"
+Sheet2/114/1:string:"#FF0000"
+Sheet2/115/0:string:"rosybrown"
+Sheet2/115/1:string:"#BC8F8F"
+Sheet2/116/0:string:"royalblue"
+Sheet2/116/1:string:"#4169E1"
+Sheet2/117/0:string:"saddlebrown"
+Sheet2/117/1:string:"#8B4513"
+Sheet2/118/0:string:"salmon"
+Sheet2/118/1:string:"#FA8072"
+Sheet2/119/0:string:"sandybrown"
+Sheet2/119/1:string:"#F4A460"
+Sheet2/120/0:string:"seagreen"
+Sheet2/120/1:string:"#2E8B57"
+Sheet2/121/0:string:"seashell"
+Sheet2/121/1:string:"#FFF5EE"
+Sheet2/122/0:string:"sienna"
+Sheet2/122/1:string:"#A0522D"
+Sheet2/123/0:string:"silver"
+Sheet2/123/1:string:"#C0C0C0"
+Sheet2/124/0:string:"skyblue"
+Sheet2/124/1:string:"#87CEEB"
+Sheet2/125/0:string:"slateblue"
+Sheet2/125/1:string:"#6A5ACD"
+Sheet2/126/0:string:"slategray"
+Sheet2/126/1:string:"#708090"
+Sheet2/127/0:string:"snow"
+Sheet2/127/1:string:"#FFFAFA"
+Sheet2/128/0:string:"springgreen"
+Sheet2/128/1:string:"#00FF7F"
+Sheet2/129/0:string:"steelblue"
+Sheet2/129/1:string:"#4682B4"
+Sheet2/130/0:string:"tan"
+Sheet2/130/1:string:"#D2B48C"
+Sheet2/131/0:string:"teal"
+Sheet2/131/1:string:"#008080"
+Sheet2/132/0:string:"thistle"
+Sheet2/132/1:string:"#D8BFD8"
+Sheet2/133/0:string:"tomato"
+Sheet2/133/1:string:"#FF6347"
+Sheet2/134/0:string:"turquoise"
+Sheet2/134/1:string:"#40E0D0"
+Sheet2/135/0:string:"violet"
+Sheet2/135/1:string:"#EE82EE"
+Sheet2/136/0:string:"wheat"
+Sheet2/136/1:string:"#F5DEB3"
+Sheet2/137/0:string:"white"
+Sheet2/137/1:string:"#FFFFFF"
+Sheet2/138/0:string:"whitesmoke"
+Sheet2/138/1:string:"#F5F5F5"
+Sheet2/139/0:string:"yellow"
+Sheet2/139/1:string:"#FFFF00"
+Sheet2/140/0:string:"yellowgreen"
+Sheet2/140/1:string:"#9ACD32"
diff --git a/test/xls-xml/named-colors/input-upper.xml b/test/xls-xml/named-colors/input-upper.xml
new file mode 100644
index 0000000..931b78f
--- /dev/null
+++ b/test/xls-xml/named-colors/input-upper.xml
@@ -0,0 +1,1170 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2019-03-12T00:44:46Z</Created>
+ <LastSaved>2019-03-12T00:50:53Z</LastSaved>
+ <Version>16.00</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <AllowPNG/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>12315</WindowHeight>
+ <WindowWidth>28800</WindowWidth>
+ <WindowTopX>32767</WindowTopX>
+ <WindowTopY>32767</WindowTopY>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ <Style ss:ID="s62">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="ALICEBLUE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s63">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="ANTIQUEWHITE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s64">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="CYAN" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s65">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="AQUAMARINE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s66">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="AZURE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s67">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="BEIGE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s68">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="BISQUE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s69">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="BLACK" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s70">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="BLANCHEDALMOND" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s71">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="BLUE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s72">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="BLUEVIOLET" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s73">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="BROWN" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s74">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="BURLYWOOD" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s75">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="CADETBLUE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s76">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="CHARTREUSE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s77">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="CHOCOLATE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s78">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="CORAL" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s79">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="CORNFLOWERBLUE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s80">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="CORNSILK" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s81">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="CRIMSON" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s82">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="DARKBLUE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s83">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="DARKCYAN" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s84">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="DARKGOLDENROD" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s85">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="DARKGRAY" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s86">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="DARKGREEN" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s87">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="DARKKHAKI" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s88">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="DARKMAGENTA" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s89">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="DARKOLIVEGREEN" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s90">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="DARKORANGE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s91">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="DARKORCHID" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s92">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="DARKRED" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s93">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="DARKSALMON" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s94">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="DARKSEAGREEN" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s95">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="DARKSLATEBLUE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s96">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="DARKSLATEGRAY" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s97">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="DARKTURQUOISE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s98">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="DARKVIOLET" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s99">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="DEEPPINK" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s100">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="DEEPSKYBLUE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s101">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="DIMGRAY" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s102">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="DODGERBLUE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s103">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="FIREBRICK" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s104">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="FLORALWHITE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s105">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="FORESTGREEN" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s106">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="MAGENTA" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s107">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="GAINSBORO" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s108">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="GHOSTWHITE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s109">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="GOLD" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s110">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="GOLDENROD" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s111">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="GRAY" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s112">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="GREEN" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s113">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="GREENYELLOW" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s114">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="HONEYDEW" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s115">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="HOTPINK" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s116">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="INDIANRED" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s117">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="INDIGO" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s118">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="IVORY" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s119">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="KHAKI" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s120">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="LAVENDER" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s121">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="LAVENDERBLUSH" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s122">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="LAWNGREEN" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s123">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="LEMONCHIFFON" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s124">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="LIGHTBLUE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s125">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="LIGHTCORAL" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s126">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="LIGHTCYAN" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s127">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="LIGHTGOLDENRODYELLOW" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s128">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="LIGHTGRAY" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s129">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="LIGHTGREEN" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s130">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="LIGHTPINK" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s131">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="LIGHTSALMON" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s132">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="LIGHTSEAGREEN" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s133">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="LIGHTSKYBLUE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s134">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="LIGHTSLATEGRAY" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s135">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="LIGHTSTEELBLUE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s136">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="LIGHTYELLOW" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s137">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="LIME" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s138">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="LIMEGREEN" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s139">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="LINEN" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s140">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="MAROON" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s141">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="MEDIUMAQUAMARINE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s142">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="MEDIUMBLUE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s143">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="MEDIUMORCHID" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s144">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="MEDIUMPURPLE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s145">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="MEDIUMSEAGREEN" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s146">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="MEDIUMSLATEBLUE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s147">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="MEDIUMSPRINGGREEN" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s148">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="MEDIUMTURQUOISE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s149">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="MEDIUMVIOLETRED" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s150">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="MIDNIGHTBLUE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s151">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="MINTCREAM" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s152">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="MISTYROSE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s153">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="MOCCASIN" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s154">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="NAVAJOWHITE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s155">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="NAVY" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s156">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="OLDLACE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s157">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="OLIVE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s158">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="OLIVEDRAB" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s159">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="ORANGE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s160">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="ORANGERED" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s161">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="ORCHID" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s162">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="PALEGOLDENROD" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s163">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="PALEGREEN" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s164">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="PALETURQUOISE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s165">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="PALEVIOLETRED" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s166">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="PAPAYAWHIP" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s167">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="PEACHPUFF" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s168">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="PERU" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s169">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="PINK" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s170">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="PLUM" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s171">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="POWDERBLUE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s172">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="PURPLE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s173">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="RED" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s174">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="ROSYBROWN" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s175">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="ROYALBLUE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s176">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="SADDLEBROWN" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s177">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="SALMON" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s178">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="SANDYBROWN" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s179">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="SEAGREEN" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s180">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="SEASHELL" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s181">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="SIENNA" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s182">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="SILVER" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s183">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="SKYBLUE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s184">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="SLATEBLUE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s185">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="SLATEGRAY" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s186">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="SNOW" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s187">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="SPRINGGREEN" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s188">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="STEELBLUE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s189">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="TAN" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s190">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="TEAL" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s191">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="THISTLE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s192">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="TOMATO" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s193">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="TURQUOISE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s194">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="VIOLET" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s195">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="WHEAT" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s196">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="WHITE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s197">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="WHITESMOKE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s198">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="YELLOW" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s199">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="YELLOWGREEN" ss:Pattern="Solid"/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Sheet2">
+ <Table ss:ExpandedColumnCount="2" ss:ExpandedRowCount="141" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Column ss:Width="107.25"/>
+ <Column ss:AutoFitWidth="0" ss:Width="84"/>
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="String">Color Name</Data></Cell>
+ <Cell><Data ss:Type="String">Hex RGB</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s62"><Data ss:Type="String">aliceblue</Data></Cell>
+ <Cell ss:StyleID="s62"><Data ss:Type="String">#F0F8FF</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s63"><Data ss:Type="String">antiquewhite</Data></Cell>
+ <Cell ss:StyleID="s63"><Data ss:Type="String">#FAEBD7</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s64"><Data ss:Type="String">aqua</Data></Cell>
+ <Cell ss:StyleID="s64"><Data ss:Type="String">#00FFFF</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s65"><Data ss:Type="String">aquamarine</Data></Cell>
+ <Cell ss:StyleID="s65"><Data ss:Type="String">#7FFFD4</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s66"><Data ss:Type="String">azure</Data></Cell>
+ <Cell ss:StyleID="s66"><Data ss:Type="String">#F0FFFF</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s67"><Data ss:Type="String">beige</Data></Cell>
+ <Cell ss:StyleID="s67"><Data ss:Type="String">#F5F5DC</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s68"><Data ss:Type="String">bisque</Data></Cell>
+ <Cell ss:StyleID="s68"><Data ss:Type="String">#FFE4C4</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s69"><Data ss:Type="String">black</Data></Cell>
+ <Cell ss:StyleID="s69"><Data ss:Type="String">#000000</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s70"><Data ss:Type="String">blanchedalmond</Data></Cell>
+ <Cell ss:StyleID="s70"><Data ss:Type="String">#FFEBCD</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s71"><Data ss:Type="String">blue</Data></Cell>
+ <Cell ss:StyleID="s71"><Data ss:Type="String">#0000FF</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s72"><Data ss:Type="String">blueviolet</Data></Cell>
+ <Cell ss:StyleID="s72"><Data ss:Type="String">#8A2BE2</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s73"><Data ss:Type="String">brown</Data></Cell>
+ <Cell ss:StyleID="s73"><Data ss:Type="String">#A52A2A</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s74"><Data ss:Type="String">burlywood</Data></Cell>
+ <Cell ss:StyleID="s74"><Data ss:Type="String">#DEB887</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s75"><Data ss:Type="String">cadetblue</Data></Cell>
+ <Cell ss:StyleID="s75"><Data ss:Type="String">#5F9EA0</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s76"><Data ss:Type="String">chartreuse</Data></Cell>
+ <Cell ss:StyleID="s76"><Data ss:Type="String">#7FFF00</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s77"><Data ss:Type="String">chocolate</Data></Cell>
+ <Cell ss:StyleID="s77"><Data ss:Type="String">#D2691E</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s78"><Data ss:Type="String">coral</Data></Cell>
+ <Cell ss:StyleID="s78"><Data ss:Type="String">#FF7F50</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s79"><Data ss:Type="String">cornflowerblue</Data></Cell>
+ <Cell ss:StyleID="s79"><Data ss:Type="String">#6495ED</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s80"><Data ss:Type="String">cornsilk</Data></Cell>
+ <Cell ss:StyleID="s80"><Data ss:Type="String">#FFF8DC</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s81"><Data ss:Type="String">crimson</Data></Cell>
+ <Cell ss:StyleID="s81"><Data ss:Type="String">#DC143C</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s64"><Data ss:Type="String">cyan</Data></Cell>
+ <Cell ss:StyleID="s64"><Data ss:Type="String">#00FFFF</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s82"><Data ss:Type="String">darkblue</Data></Cell>
+ <Cell ss:StyleID="s82"><Data ss:Type="String">#00008B</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s83"><Data ss:Type="String">darkcyan</Data></Cell>
+ <Cell ss:StyleID="s83"><Data ss:Type="String">#008B8B</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s84"><Data ss:Type="String">darkgoldenrod</Data></Cell>
+ <Cell ss:StyleID="s84"><Data ss:Type="String">#B8860B</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s85"><Data ss:Type="String">darkgray</Data></Cell>
+ <Cell ss:StyleID="s85"><Data ss:Type="String">#A9A9A9</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s86"><Data ss:Type="String">darkgreen</Data></Cell>
+ <Cell ss:StyleID="s86"><Data ss:Type="String">#006400</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s87"><Data ss:Type="String">darkkhaki</Data></Cell>
+ <Cell ss:StyleID="s87"><Data ss:Type="String">#BDB76B</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s88"><Data ss:Type="String">darkmagenta</Data></Cell>
+ <Cell ss:StyleID="s88"><Data ss:Type="String">#8B008B</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s89"><Data ss:Type="String">darkolivegreen</Data></Cell>
+ <Cell ss:StyleID="s89"><Data ss:Type="String">#556B2F</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s90"><Data ss:Type="String">darkorange</Data></Cell>
+ <Cell ss:StyleID="s90"><Data ss:Type="String">#FF8C00</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s91"><Data ss:Type="String">darkorchid</Data></Cell>
+ <Cell ss:StyleID="s91"><Data ss:Type="String">#9932CC</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s92"><Data ss:Type="String">darkred</Data></Cell>
+ <Cell ss:StyleID="s92"><Data ss:Type="String">#8B0000</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s93"><Data ss:Type="String">darksalmon</Data></Cell>
+ <Cell ss:StyleID="s93"><Data ss:Type="String">#E9967A</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s94"><Data ss:Type="String">darkseagreen</Data></Cell>
+ <Cell ss:StyleID="s94"><Data ss:Type="String">#8FBC8F</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s95"><Data ss:Type="String">darkslateblue</Data></Cell>
+ <Cell ss:StyleID="s95"><Data ss:Type="String">#483D8B</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s96"><Data ss:Type="String">darkslategray</Data></Cell>
+ <Cell ss:StyleID="s96"><Data ss:Type="String">#2F4F4F</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s97"><Data ss:Type="String">darkturquoise</Data></Cell>
+ <Cell ss:StyleID="s97"><Data ss:Type="String">#00CED1</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s98"><Data ss:Type="String">darkviolet</Data></Cell>
+ <Cell ss:StyleID="s98"><Data ss:Type="String">#9400D3</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s99"><Data ss:Type="String">deeppink</Data></Cell>
+ <Cell ss:StyleID="s99"><Data ss:Type="String">#FF1493</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s100"><Data ss:Type="String">deepskyblue</Data></Cell>
+ <Cell ss:StyleID="s100"><Data ss:Type="String">#00BFFF</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s101"><Data ss:Type="String">dimgray</Data></Cell>
+ <Cell ss:StyleID="s101"><Data ss:Type="String">#696969</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s102"><Data ss:Type="String">dodgerblue</Data></Cell>
+ <Cell ss:StyleID="s102"><Data ss:Type="String">#1E90FF</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s103"><Data ss:Type="String">firebrick</Data></Cell>
+ <Cell ss:StyleID="s103"><Data ss:Type="String">#B22222</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s104"><Data ss:Type="String">floralwhite</Data></Cell>
+ <Cell ss:StyleID="s104"><Data ss:Type="String">#FFFAF0</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s105"><Data ss:Type="String">forestgreen</Data></Cell>
+ <Cell ss:StyleID="s105"><Data ss:Type="String">#228B22</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s106"><Data ss:Type="String">fuchsia</Data></Cell>
+ <Cell ss:StyleID="s106"><Data ss:Type="String">#FF00FF</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s107"><Data ss:Type="String">gainsboro</Data></Cell>
+ <Cell ss:StyleID="s107"><Data ss:Type="String">#DCDCDC</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s108"><Data ss:Type="String">ghostwhite</Data></Cell>
+ <Cell ss:StyleID="s108"><Data ss:Type="String">#F8F8FF</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s109"><Data ss:Type="String">gold</Data></Cell>
+ <Cell ss:StyleID="s109"><Data ss:Type="String">#FFD700</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s110"><Data ss:Type="String">goldenrod</Data></Cell>
+ <Cell ss:StyleID="s110"><Data ss:Type="String">#DAA520</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s111"><Data ss:Type="String">gray</Data></Cell>
+ <Cell ss:StyleID="s111"><Data ss:Type="String">#808080</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s112"><Data ss:Type="String">green</Data></Cell>
+ <Cell ss:StyleID="s112"><Data ss:Type="String">#008000</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s113"><Data ss:Type="String">greenyellow</Data></Cell>
+ <Cell ss:StyleID="s113"><Data ss:Type="String">#ADFF2F</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s114"><Data ss:Type="String">honeydew</Data></Cell>
+ <Cell ss:StyleID="s114"><Data ss:Type="String">#F0FFF0</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s115"><Data ss:Type="String">hotpink</Data></Cell>
+ <Cell ss:StyleID="s115"><Data ss:Type="String">#FF69B4</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s116"><Data ss:Type="String">indianred</Data></Cell>
+ <Cell ss:StyleID="s116"><Data ss:Type="String">#CD5C5C</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s117"><Data ss:Type="String">indigo</Data></Cell>
+ <Cell ss:StyleID="s117"><Data ss:Type="String">#4B0082</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s118"><Data ss:Type="String">ivory</Data></Cell>
+ <Cell ss:StyleID="s118"><Data ss:Type="String">#FFFFF0</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s119"><Data ss:Type="String">khaki</Data></Cell>
+ <Cell ss:StyleID="s119"><Data ss:Type="String">#F0E68C</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s120"><Data ss:Type="String">lavender</Data></Cell>
+ <Cell ss:StyleID="s120"><Data ss:Type="String">#E6E6FA</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s121"><Data ss:Type="String">lavenderblush</Data></Cell>
+ <Cell ss:StyleID="s121"><Data ss:Type="String">#FFF0F5</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s122"><Data ss:Type="String">lawngreen</Data></Cell>
+ <Cell ss:StyleID="s122"><Data ss:Type="String">#7CFC00</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s123"><Data ss:Type="String">lemonchiffon</Data></Cell>
+ <Cell ss:StyleID="s123"><Data ss:Type="String">#FFFACD</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s124"><Data ss:Type="String">lightblue</Data></Cell>
+ <Cell ss:StyleID="s124"><Data ss:Type="String">#ADD8E6</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s125"><Data ss:Type="String">lightcoral</Data></Cell>
+ <Cell ss:StyleID="s125"><Data ss:Type="String">#F08080</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s126"><Data ss:Type="String">lightcyan</Data></Cell>
+ <Cell ss:StyleID="s126"><Data ss:Type="String">#E0FFFF</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s127"><Data ss:Type="String">lightgoldenrodyellow</Data></Cell>
+ <Cell ss:StyleID="s127"><Data ss:Type="String">#FAFAD2</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s128"><Data ss:Type="String">lightgray</Data></Cell>
+ <Cell ss:StyleID="s128"><Data ss:Type="String">#D3D3D3</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s129"><Data ss:Type="String">lightgreen</Data></Cell>
+ <Cell ss:StyleID="s129"><Data ss:Type="String">#90EE90</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s130"><Data ss:Type="String">lightpink</Data></Cell>
+ <Cell ss:StyleID="s130"><Data ss:Type="String">#FFB6C1</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s131"><Data ss:Type="String">lightsalmon</Data></Cell>
+ <Cell ss:StyleID="s131"><Data ss:Type="String">#FFA07A</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s132"><Data ss:Type="String">lightseagreen</Data></Cell>
+ <Cell ss:StyleID="s132"><Data ss:Type="String">#20B2AA</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s133"><Data ss:Type="String">lightskyblue</Data></Cell>
+ <Cell ss:StyleID="s133"><Data ss:Type="String">#87CEFA</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s134"><Data ss:Type="String">lightslategray</Data></Cell>
+ <Cell ss:StyleID="s134"><Data ss:Type="String">#778899</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s135"><Data ss:Type="String">lightsteelblue</Data></Cell>
+ <Cell ss:StyleID="s135"><Data ss:Type="String">#B0C4DE</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s136"><Data ss:Type="String">lightyellow</Data></Cell>
+ <Cell ss:StyleID="s136"><Data ss:Type="String">#FFFFE0</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s137"><Data ss:Type="String">lime</Data></Cell>
+ <Cell ss:StyleID="s137"><Data ss:Type="String">#00FF00</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s138"><Data ss:Type="String">limegreen</Data></Cell>
+ <Cell ss:StyleID="s138"><Data ss:Type="String">#32CD32</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s139"><Data ss:Type="String">linen</Data></Cell>
+ <Cell ss:StyleID="s139"><Data ss:Type="String">#FAF0E6</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s106"><Data ss:Type="String">magenta</Data></Cell>
+ <Cell ss:StyleID="s106"><Data ss:Type="String">#FF00FF</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s140"><Data ss:Type="String">maroon</Data></Cell>
+ <Cell ss:StyleID="s140"><Data ss:Type="String">#800000</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s141"><Data ss:Type="String">mediumaquamarine</Data></Cell>
+ <Cell ss:StyleID="s141"><Data ss:Type="String">#66CDAA</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s142"><Data ss:Type="String">mediumblue</Data></Cell>
+ <Cell ss:StyleID="s142"><Data ss:Type="String">#0000CD</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s143"><Data ss:Type="String">mediumorchid</Data></Cell>
+ <Cell ss:StyleID="s143"><Data ss:Type="String">#BA55D3</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s144"><Data ss:Type="String">mediumpurple</Data></Cell>
+ <Cell ss:StyleID="s144"><Data ss:Type="String">#9370DB</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s145"><Data ss:Type="String">mediumseagreen</Data></Cell>
+ <Cell ss:StyleID="s145"><Data ss:Type="String">#3CB371</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s146"><Data ss:Type="String">mediumslateblue</Data></Cell>
+ <Cell ss:StyleID="s146"><Data ss:Type="String">#7B68EE</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s147"><Data ss:Type="String">mediumspringgreen</Data></Cell>
+ <Cell ss:StyleID="s147"><Data ss:Type="String">#00FA9A</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s148"><Data ss:Type="String">mediumturquoise</Data></Cell>
+ <Cell ss:StyleID="s148"><Data ss:Type="String">#48D1CC</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s149"><Data ss:Type="String">mediumvioletred</Data></Cell>
+ <Cell ss:StyleID="s149"><Data ss:Type="String">#C71585</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s150"><Data ss:Type="String">midnightblue</Data></Cell>
+ <Cell ss:StyleID="s150"><Data ss:Type="String">#191970</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s151"><Data ss:Type="String">mintcream</Data></Cell>
+ <Cell ss:StyleID="s151"><Data ss:Type="String">#F5FFFA</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s152"><Data ss:Type="String">mistyrose</Data></Cell>
+ <Cell ss:StyleID="s152"><Data ss:Type="String">#FFE4E1</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s153"><Data ss:Type="String">moccasin</Data></Cell>
+ <Cell ss:StyleID="s153"><Data ss:Type="String">#FFE4B5</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s154"><Data ss:Type="String">navajowhite</Data></Cell>
+ <Cell ss:StyleID="s154"><Data ss:Type="String">#FFDEAD</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s155"><Data ss:Type="String">navy</Data></Cell>
+ <Cell ss:StyleID="s155"><Data ss:Type="String">#000080</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s156"><Data ss:Type="String">oldlace</Data></Cell>
+ <Cell ss:StyleID="s156"><Data ss:Type="String">#FDF5E6</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s157"><Data ss:Type="String">olive</Data></Cell>
+ <Cell ss:StyleID="s157"><Data ss:Type="String">#808000</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s158"><Data ss:Type="String">olivedrab</Data></Cell>
+ <Cell ss:StyleID="s158"><Data ss:Type="String">#6B8E23</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s159"><Data ss:Type="String">orange</Data></Cell>
+ <Cell ss:StyleID="s159"><Data ss:Type="String">#FFA500</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s160"><Data ss:Type="String">orangered</Data></Cell>
+ <Cell ss:StyleID="s160"><Data ss:Type="String">#FF4500</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s161"><Data ss:Type="String">orchid</Data></Cell>
+ <Cell ss:StyleID="s161"><Data ss:Type="String">#DA70D6</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s162"><Data ss:Type="String">palegoldenrod</Data></Cell>
+ <Cell ss:StyleID="s162"><Data ss:Type="String">#EEE8AA</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s163"><Data ss:Type="String">palegreen</Data></Cell>
+ <Cell ss:StyleID="s163"><Data ss:Type="String">#98FB98</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s164"><Data ss:Type="String">paleturquoise</Data></Cell>
+ <Cell ss:StyleID="s164"><Data ss:Type="String">#AFEEEE</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s165"><Data ss:Type="String">palevioletred</Data></Cell>
+ <Cell ss:StyleID="s165"><Data ss:Type="String">#DB7093</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s166"><Data ss:Type="String">papayawhip</Data></Cell>
+ <Cell ss:StyleID="s166"><Data ss:Type="String">#FFEFD5</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s167"><Data ss:Type="String">peachpuff</Data></Cell>
+ <Cell ss:StyleID="s167"><Data ss:Type="String">#FFDAB9</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s168"><Data ss:Type="String">peru</Data></Cell>
+ <Cell ss:StyleID="s168"><Data ss:Type="String">#CD853F</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s169"><Data ss:Type="String">pink</Data></Cell>
+ <Cell ss:StyleID="s169"><Data ss:Type="String">#FFC0CB</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s170"><Data ss:Type="String">plum</Data></Cell>
+ <Cell ss:StyleID="s170"><Data ss:Type="String">#DDA0DD</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s171"><Data ss:Type="String">powderblue</Data></Cell>
+ <Cell ss:StyleID="s171"><Data ss:Type="String">#B0E0E6</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s172"><Data ss:Type="String">purple</Data></Cell>
+ <Cell ss:StyleID="s172"><Data ss:Type="String">#800080</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s173"><Data ss:Type="String">red</Data></Cell>
+ <Cell ss:StyleID="s173"><Data ss:Type="String">#FF0000</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s174"><Data ss:Type="String">rosybrown</Data></Cell>
+ <Cell ss:StyleID="s174"><Data ss:Type="String">#BC8F8F</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s175"><Data ss:Type="String">royalblue</Data></Cell>
+ <Cell ss:StyleID="s175"><Data ss:Type="String">#4169E1</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s176"><Data ss:Type="String">saddlebrown</Data></Cell>
+ <Cell ss:StyleID="s176"><Data ss:Type="String">#8B4513</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s177"><Data ss:Type="String">salmon</Data></Cell>
+ <Cell ss:StyleID="s177"><Data ss:Type="String">#FA8072</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s178"><Data ss:Type="String">sandybrown</Data></Cell>
+ <Cell ss:StyleID="s178"><Data ss:Type="String">#F4A460</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s179"><Data ss:Type="String">seagreen</Data></Cell>
+ <Cell ss:StyleID="s179"><Data ss:Type="String">#2E8B57</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s180"><Data ss:Type="String">seashell</Data></Cell>
+ <Cell ss:StyleID="s180"><Data ss:Type="String">#FFF5EE</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s181"><Data ss:Type="String">sienna</Data></Cell>
+ <Cell ss:StyleID="s181"><Data ss:Type="String">#A0522D</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s182"><Data ss:Type="String">silver</Data></Cell>
+ <Cell ss:StyleID="s182"><Data ss:Type="String">#C0C0C0</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s183"><Data ss:Type="String">skyblue</Data></Cell>
+ <Cell ss:StyleID="s183"><Data ss:Type="String">#87CEEB</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s184"><Data ss:Type="String">slateblue</Data></Cell>
+ <Cell ss:StyleID="s184"><Data ss:Type="String">#6A5ACD</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s185"><Data ss:Type="String">slategray</Data></Cell>
+ <Cell ss:StyleID="s185"><Data ss:Type="String">#708090</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s186"><Data ss:Type="String">snow</Data></Cell>
+ <Cell ss:StyleID="s186"><Data ss:Type="String">#FFFAFA</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s187"><Data ss:Type="String">springgreen</Data></Cell>
+ <Cell ss:StyleID="s187"><Data ss:Type="String">#00FF7F</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s188"><Data ss:Type="String">steelblue</Data></Cell>
+ <Cell ss:StyleID="s188"><Data ss:Type="String">#4682B4</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s189"><Data ss:Type="String">tan</Data></Cell>
+ <Cell ss:StyleID="s189"><Data ss:Type="String">#D2B48C</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s190"><Data ss:Type="String">teal</Data></Cell>
+ <Cell ss:StyleID="s190"><Data ss:Type="String">#008080</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s191"><Data ss:Type="String">thistle</Data></Cell>
+ <Cell ss:StyleID="s191"><Data ss:Type="String">#D8BFD8</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s192"><Data ss:Type="String">tomato</Data></Cell>
+ <Cell ss:StyleID="s192"><Data ss:Type="String">#FF6347</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s193"><Data ss:Type="String">turquoise</Data></Cell>
+ <Cell ss:StyleID="s193"><Data ss:Type="String">#40E0D0</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s194"><Data ss:Type="String">violet</Data></Cell>
+ <Cell ss:StyleID="s194"><Data ss:Type="String">#EE82EE</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s195"><Data ss:Type="String">wheat</Data></Cell>
+ <Cell ss:StyleID="s195"><Data ss:Type="String">#F5DEB3</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s196"><Data ss:Type="String">white</Data></Cell>
+ <Cell ss:StyleID="s196"><Data ss:Type="String">#FFFFFF</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s197"><Data ss:Type="String">whitesmoke</Data></Cell>
+ <Cell ss:StyleID="s197"><Data ss:Type="String">#F5F5F5</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s198"><Data ss:Type="String">yellow</Data></Cell>
+ <Cell ss:StyleID="s198"><Data ss:Type="String">#FFFF00</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s199"><Data ss:Type="String">yellowgreen</Data></Cell>
+ <Cell ss:StyleID="s199"><Data ss:Type="String">#9ACD32</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Unsynced/>
+ <Selected/>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/test/xls-xml/named-colors/input.xml b/test/xls-xml/named-colors/input.xml
new file mode 100644
index 0000000..056637a
--- /dev/null
+++ b/test/xls-xml/named-colors/input.xml
@@ -0,0 +1,1170 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2019-03-12T00:44:46Z</Created>
+ <LastSaved>2019-03-12T00:50:53Z</LastSaved>
+ <Version>16.00</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <AllowPNG/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>12315</WindowHeight>
+ <WindowWidth>28800</WindowWidth>
+ <WindowTopX>32767</WindowTopX>
+ <WindowTopY>32767</WindowTopY>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ <Style ss:ID="s62">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="aliceblue" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s63">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="antiquewhite" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s64">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="cyan" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s65">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="aquamarine" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s66">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="azure" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s67">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="beige" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s68">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="bisque" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s69">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="black" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s70">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="blanchedalmond" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s71">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="blue" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s72">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="blueviolet" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s73">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="brown" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s74">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="burlywood" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s75">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="cadetblue" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s76">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="chartreuse" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s77">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="chocolate" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s78">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="coral" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s79">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="cornflowerblue" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s80">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="cornsilk" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s81">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="crimson" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s82">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="darkblue" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s83">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="darkcyan" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s84">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="darkgoldenrod" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s85">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="darkgray" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s86">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="darkgreen" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s87">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="darkkhaki" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s88">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="darkmagenta" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s89">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="darkolivegreen" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s90">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="darkorange" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s91">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="darkorchid" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s92">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="darkred" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s93">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="darksalmon" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s94">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="darkseagreen" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s95">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="darkslateblue" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s96">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="darkslategray" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s97">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="darkturquoise" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s98">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="darkviolet" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s99">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="deeppink" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s100">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="deepskyblue" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s101">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="dimgray" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s102">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="dodgerblue" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s103">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="firebrick" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s104">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="floralwhite" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s105">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="forestgreen" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s106">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="magenta" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s107">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="gainsboro" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s108">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="ghostwhite" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s109">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="gold" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s110">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="goldenrod" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s111">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="gray" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s112">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="green" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s113">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="greenyellow" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s114">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="honeydew" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s115">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="hotpink" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s116">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="indianred" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s117">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="indigo" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s118">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="ivory" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s119">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="khaki" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s120">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="lavender" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s121">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="lavenderblush" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s122">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="lawngreen" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s123">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="lemonchiffon" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s124">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="lightblue" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s125">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="lightcoral" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s126">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="lightcyan" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s127">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="lightgoldenrodyellow" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s128">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="lightgray" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s129">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="lightgreen" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s130">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="lightpink" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s131">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="lightsalmon" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s132">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="lightseagreen" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s133">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="lightskyblue" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s134">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="lightslategray" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s135">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="lightsteelblue" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s136">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="lightyellow" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s137">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="lime" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s138">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="limegreen" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s139">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="linen" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s140">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="maroon" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s141">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="mediumaquamarine" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s142">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="mediumblue" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s143">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="mediumorchid" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s144">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="mediumpurple" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s145">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="mediumseagreen" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s146">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="mediumslateblue" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s147">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="mediumspringgreen" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s148">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="mediumturquoise" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s149">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="mediumvioletred" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s150">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="midnightblue" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s151">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="mintcream" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s152">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="mistyrose" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s153">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="moccasin" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s154">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="navajowhite" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s155">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="navy" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s156">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="oldlace" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s157">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="olive" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s158">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="olivedrab" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s159">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="orange" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s160">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="orangered" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s161">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="orchid" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s162">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="palegoldenrod" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s163">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="palegreen" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s164">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="paleturquoise" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s165">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="palevioletred" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s166">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="papayawhip" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s167">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="peachpuff" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s168">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="peru" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s169">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="pink" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s170">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="plum" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s171">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="powderblue" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s172">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="purple" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s173">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="red" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s174">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="rosybrown" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s175">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="royalblue" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s176">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="saddlebrown" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s177">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="salmon" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s178">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="sandybrown" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s179">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="seagreen" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s180">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="seashell" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s181">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="sienna" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s182">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="silver" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s183">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="skyblue" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s184">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="slateblue" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s185">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="slategray" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s186">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="snow" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s187">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="springgreen" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s188">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="steelblue" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s189">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="tan" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s190">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="teal" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s191">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="thistle" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s192">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="tomato" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s193">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="turquoise" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s194">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="violet" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s195">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="wheat" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s196">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="white" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s197">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="whitesmoke" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s198">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="yellow" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s199">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="yellowgreen" ss:Pattern="Solid"/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Sheet2">
+ <Table ss:ExpandedColumnCount="2" ss:ExpandedRowCount="141" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Column ss:Width="107.25"/>
+ <Column ss:AutoFitWidth="0" ss:Width="84"/>
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="String">Color Name</Data></Cell>
+ <Cell><Data ss:Type="String">Hex RGB</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s62"><Data ss:Type="String">aliceblue</Data></Cell>
+ <Cell ss:StyleID="s62"><Data ss:Type="String">#F0F8FF</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s63"><Data ss:Type="String">antiquewhite</Data></Cell>
+ <Cell ss:StyleID="s63"><Data ss:Type="String">#FAEBD7</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s64"><Data ss:Type="String">aqua</Data></Cell>
+ <Cell ss:StyleID="s64"><Data ss:Type="String">#00FFFF</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s65"><Data ss:Type="String">aquamarine</Data></Cell>
+ <Cell ss:StyleID="s65"><Data ss:Type="String">#7FFFD4</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s66"><Data ss:Type="String">azure</Data></Cell>
+ <Cell ss:StyleID="s66"><Data ss:Type="String">#F0FFFF</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s67"><Data ss:Type="String">beige</Data></Cell>
+ <Cell ss:StyleID="s67"><Data ss:Type="String">#F5F5DC</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s68"><Data ss:Type="String">bisque</Data></Cell>
+ <Cell ss:StyleID="s68"><Data ss:Type="String">#FFE4C4</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s69"><Data ss:Type="String">black</Data></Cell>
+ <Cell ss:StyleID="s69"><Data ss:Type="String">#000000</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s70"><Data ss:Type="String">blanchedalmond</Data></Cell>
+ <Cell ss:StyleID="s70"><Data ss:Type="String">#FFEBCD</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s71"><Data ss:Type="String">blue</Data></Cell>
+ <Cell ss:StyleID="s71"><Data ss:Type="String">#0000FF</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s72"><Data ss:Type="String">blueviolet</Data></Cell>
+ <Cell ss:StyleID="s72"><Data ss:Type="String">#8A2BE2</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s73"><Data ss:Type="String">brown</Data></Cell>
+ <Cell ss:StyleID="s73"><Data ss:Type="String">#A52A2A</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s74"><Data ss:Type="String">burlywood</Data></Cell>
+ <Cell ss:StyleID="s74"><Data ss:Type="String">#DEB887</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s75"><Data ss:Type="String">cadetblue</Data></Cell>
+ <Cell ss:StyleID="s75"><Data ss:Type="String">#5F9EA0</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s76"><Data ss:Type="String">chartreuse</Data></Cell>
+ <Cell ss:StyleID="s76"><Data ss:Type="String">#7FFF00</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s77"><Data ss:Type="String">chocolate</Data></Cell>
+ <Cell ss:StyleID="s77"><Data ss:Type="String">#D2691E</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s78"><Data ss:Type="String">coral</Data></Cell>
+ <Cell ss:StyleID="s78"><Data ss:Type="String">#FF7F50</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s79"><Data ss:Type="String">cornflowerblue</Data></Cell>
+ <Cell ss:StyleID="s79"><Data ss:Type="String">#6495ED</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s80"><Data ss:Type="String">cornsilk</Data></Cell>
+ <Cell ss:StyleID="s80"><Data ss:Type="String">#FFF8DC</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s81"><Data ss:Type="String">crimson</Data></Cell>
+ <Cell ss:StyleID="s81"><Data ss:Type="String">#DC143C</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s64"><Data ss:Type="String">cyan</Data></Cell>
+ <Cell ss:StyleID="s64"><Data ss:Type="String">#00FFFF</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s82"><Data ss:Type="String">darkblue</Data></Cell>
+ <Cell ss:StyleID="s82"><Data ss:Type="String">#00008B</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s83"><Data ss:Type="String">darkcyan</Data></Cell>
+ <Cell ss:StyleID="s83"><Data ss:Type="String">#008B8B</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s84"><Data ss:Type="String">darkgoldenrod</Data></Cell>
+ <Cell ss:StyleID="s84"><Data ss:Type="String">#B8860B</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s85"><Data ss:Type="String">darkgray</Data></Cell>
+ <Cell ss:StyleID="s85"><Data ss:Type="String">#A9A9A9</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s86"><Data ss:Type="String">darkgreen</Data></Cell>
+ <Cell ss:StyleID="s86"><Data ss:Type="String">#006400</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s87"><Data ss:Type="String">darkkhaki</Data></Cell>
+ <Cell ss:StyleID="s87"><Data ss:Type="String">#BDB76B</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s88"><Data ss:Type="String">darkmagenta</Data></Cell>
+ <Cell ss:StyleID="s88"><Data ss:Type="String">#8B008B</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s89"><Data ss:Type="String">darkolivegreen</Data></Cell>
+ <Cell ss:StyleID="s89"><Data ss:Type="String">#556B2F</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s90"><Data ss:Type="String">darkorange</Data></Cell>
+ <Cell ss:StyleID="s90"><Data ss:Type="String">#FF8C00</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s91"><Data ss:Type="String">darkorchid</Data></Cell>
+ <Cell ss:StyleID="s91"><Data ss:Type="String">#9932CC</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s92"><Data ss:Type="String">darkred</Data></Cell>
+ <Cell ss:StyleID="s92"><Data ss:Type="String">#8B0000</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s93"><Data ss:Type="String">darksalmon</Data></Cell>
+ <Cell ss:StyleID="s93"><Data ss:Type="String">#E9967A</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s94"><Data ss:Type="String">darkseagreen</Data></Cell>
+ <Cell ss:StyleID="s94"><Data ss:Type="String">#8FBC8F</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s95"><Data ss:Type="String">darkslateblue</Data></Cell>
+ <Cell ss:StyleID="s95"><Data ss:Type="String">#483D8B</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s96"><Data ss:Type="String">darkslategray</Data></Cell>
+ <Cell ss:StyleID="s96"><Data ss:Type="String">#2F4F4F</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s97"><Data ss:Type="String">darkturquoise</Data></Cell>
+ <Cell ss:StyleID="s97"><Data ss:Type="String">#00CED1</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s98"><Data ss:Type="String">darkviolet</Data></Cell>
+ <Cell ss:StyleID="s98"><Data ss:Type="String">#9400D3</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s99"><Data ss:Type="String">deeppink</Data></Cell>
+ <Cell ss:StyleID="s99"><Data ss:Type="String">#FF1493</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s100"><Data ss:Type="String">deepskyblue</Data></Cell>
+ <Cell ss:StyleID="s100"><Data ss:Type="String">#00BFFF</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s101"><Data ss:Type="String">dimgray</Data></Cell>
+ <Cell ss:StyleID="s101"><Data ss:Type="String">#696969</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s102"><Data ss:Type="String">dodgerblue</Data></Cell>
+ <Cell ss:StyleID="s102"><Data ss:Type="String">#1E90FF</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s103"><Data ss:Type="String">firebrick</Data></Cell>
+ <Cell ss:StyleID="s103"><Data ss:Type="String">#B22222</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s104"><Data ss:Type="String">floralwhite</Data></Cell>
+ <Cell ss:StyleID="s104"><Data ss:Type="String">#FFFAF0</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s105"><Data ss:Type="String">forestgreen</Data></Cell>
+ <Cell ss:StyleID="s105"><Data ss:Type="String">#228B22</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s106"><Data ss:Type="String">fuchsia</Data></Cell>
+ <Cell ss:StyleID="s106"><Data ss:Type="String">#FF00FF</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s107"><Data ss:Type="String">gainsboro</Data></Cell>
+ <Cell ss:StyleID="s107"><Data ss:Type="String">#DCDCDC</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s108"><Data ss:Type="String">ghostwhite</Data></Cell>
+ <Cell ss:StyleID="s108"><Data ss:Type="String">#F8F8FF</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s109"><Data ss:Type="String">gold</Data></Cell>
+ <Cell ss:StyleID="s109"><Data ss:Type="String">#FFD700</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s110"><Data ss:Type="String">goldenrod</Data></Cell>
+ <Cell ss:StyleID="s110"><Data ss:Type="String">#DAA520</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s111"><Data ss:Type="String">gray</Data></Cell>
+ <Cell ss:StyleID="s111"><Data ss:Type="String">#808080</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s112"><Data ss:Type="String">green</Data></Cell>
+ <Cell ss:StyleID="s112"><Data ss:Type="String">#008000</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s113"><Data ss:Type="String">greenyellow</Data></Cell>
+ <Cell ss:StyleID="s113"><Data ss:Type="String">#ADFF2F</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s114"><Data ss:Type="String">honeydew</Data></Cell>
+ <Cell ss:StyleID="s114"><Data ss:Type="String">#F0FFF0</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s115"><Data ss:Type="String">hotpink</Data></Cell>
+ <Cell ss:StyleID="s115"><Data ss:Type="String">#FF69B4</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s116"><Data ss:Type="String">indianred</Data></Cell>
+ <Cell ss:StyleID="s116"><Data ss:Type="String">#CD5C5C</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s117"><Data ss:Type="String">indigo</Data></Cell>
+ <Cell ss:StyleID="s117"><Data ss:Type="String">#4B0082</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s118"><Data ss:Type="String">ivory</Data></Cell>
+ <Cell ss:StyleID="s118"><Data ss:Type="String">#FFFFF0</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s119"><Data ss:Type="String">khaki</Data></Cell>
+ <Cell ss:StyleID="s119"><Data ss:Type="String">#F0E68C</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s120"><Data ss:Type="String">lavender</Data></Cell>
+ <Cell ss:StyleID="s120"><Data ss:Type="String">#E6E6FA</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s121"><Data ss:Type="String">lavenderblush</Data></Cell>
+ <Cell ss:StyleID="s121"><Data ss:Type="String">#FFF0F5</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s122"><Data ss:Type="String">lawngreen</Data></Cell>
+ <Cell ss:StyleID="s122"><Data ss:Type="String">#7CFC00</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s123"><Data ss:Type="String">lemonchiffon</Data></Cell>
+ <Cell ss:StyleID="s123"><Data ss:Type="String">#FFFACD</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s124"><Data ss:Type="String">lightblue</Data></Cell>
+ <Cell ss:StyleID="s124"><Data ss:Type="String">#ADD8E6</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s125"><Data ss:Type="String">lightcoral</Data></Cell>
+ <Cell ss:StyleID="s125"><Data ss:Type="String">#F08080</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s126"><Data ss:Type="String">lightcyan</Data></Cell>
+ <Cell ss:StyleID="s126"><Data ss:Type="String">#E0FFFF</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s127"><Data ss:Type="String">lightgoldenrodyellow</Data></Cell>
+ <Cell ss:StyleID="s127"><Data ss:Type="String">#FAFAD2</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s128"><Data ss:Type="String">lightgray</Data></Cell>
+ <Cell ss:StyleID="s128"><Data ss:Type="String">#D3D3D3</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s129"><Data ss:Type="String">lightgreen</Data></Cell>
+ <Cell ss:StyleID="s129"><Data ss:Type="String">#90EE90</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s130"><Data ss:Type="String">lightpink</Data></Cell>
+ <Cell ss:StyleID="s130"><Data ss:Type="String">#FFB6C1</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s131"><Data ss:Type="String">lightsalmon</Data></Cell>
+ <Cell ss:StyleID="s131"><Data ss:Type="String">#FFA07A</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s132"><Data ss:Type="String">lightseagreen</Data></Cell>
+ <Cell ss:StyleID="s132"><Data ss:Type="String">#20B2AA</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s133"><Data ss:Type="String">lightskyblue</Data></Cell>
+ <Cell ss:StyleID="s133"><Data ss:Type="String">#87CEFA</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s134"><Data ss:Type="String">lightslategray</Data></Cell>
+ <Cell ss:StyleID="s134"><Data ss:Type="String">#778899</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s135"><Data ss:Type="String">lightsteelblue</Data></Cell>
+ <Cell ss:StyleID="s135"><Data ss:Type="String">#B0C4DE</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s136"><Data ss:Type="String">lightyellow</Data></Cell>
+ <Cell ss:StyleID="s136"><Data ss:Type="String">#FFFFE0</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s137"><Data ss:Type="String">lime</Data></Cell>
+ <Cell ss:StyleID="s137"><Data ss:Type="String">#00FF00</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s138"><Data ss:Type="String">limegreen</Data></Cell>
+ <Cell ss:StyleID="s138"><Data ss:Type="String">#32CD32</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s139"><Data ss:Type="String">linen</Data></Cell>
+ <Cell ss:StyleID="s139"><Data ss:Type="String">#FAF0E6</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s106"><Data ss:Type="String">magenta</Data></Cell>
+ <Cell ss:StyleID="s106"><Data ss:Type="String">#FF00FF</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s140"><Data ss:Type="String">maroon</Data></Cell>
+ <Cell ss:StyleID="s140"><Data ss:Type="String">#800000</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s141"><Data ss:Type="String">mediumaquamarine</Data></Cell>
+ <Cell ss:StyleID="s141"><Data ss:Type="String">#66CDAA</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s142"><Data ss:Type="String">mediumblue</Data></Cell>
+ <Cell ss:StyleID="s142"><Data ss:Type="String">#0000CD</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s143"><Data ss:Type="String">mediumorchid</Data></Cell>
+ <Cell ss:StyleID="s143"><Data ss:Type="String">#BA55D3</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s144"><Data ss:Type="String">mediumpurple</Data></Cell>
+ <Cell ss:StyleID="s144"><Data ss:Type="String">#9370DB</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s145"><Data ss:Type="String">mediumseagreen</Data></Cell>
+ <Cell ss:StyleID="s145"><Data ss:Type="String">#3CB371</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s146"><Data ss:Type="String">mediumslateblue</Data></Cell>
+ <Cell ss:StyleID="s146"><Data ss:Type="String">#7B68EE</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s147"><Data ss:Type="String">mediumspringgreen</Data></Cell>
+ <Cell ss:StyleID="s147"><Data ss:Type="String">#00FA9A</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s148"><Data ss:Type="String">mediumturquoise</Data></Cell>
+ <Cell ss:StyleID="s148"><Data ss:Type="String">#48D1CC</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s149"><Data ss:Type="String">mediumvioletred</Data></Cell>
+ <Cell ss:StyleID="s149"><Data ss:Type="String">#C71585</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s150"><Data ss:Type="String">midnightblue</Data></Cell>
+ <Cell ss:StyleID="s150"><Data ss:Type="String">#191970</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s151"><Data ss:Type="String">mintcream</Data></Cell>
+ <Cell ss:StyleID="s151"><Data ss:Type="String">#F5FFFA</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s152"><Data ss:Type="String">mistyrose</Data></Cell>
+ <Cell ss:StyleID="s152"><Data ss:Type="String">#FFE4E1</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s153"><Data ss:Type="String">moccasin</Data></Cell>
+ <Cell ss:StyleID="s153"><Data ss:Type="String">#FFE4B5</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s154"><Data ss:Type="String">navajowhite</Data></Cell>
+ <Cell ss:StyleID="s154"><Data ss:Type="String">#FFDEAD</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s155"><Data ss:Type="String">navy</Data></Cell>
+ <Cell ss:StyleID="s155"><Data ss:Type="String">#000080</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s156"><Data ss:Type="String">oldlace</Data></Cell>
+ <Cell ss:StyleID="s156"><Data ss:Type="String">#FDF5E6</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s157"><Data ss:Type="String">olive</Data></Cell>
+ <Cell ss:StyleID="s157"><Data ss:Type="String">#808000</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s158"><Data ss:Type="String">olivedrab</Data></Cell>
+ <Cell ss:StyleID="s158"><Data ss:Type="String">#6B8E23</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s159"><Data ss:Type="String">orange</Data></Cell>
+ <Cell ss:StyleID="s159"><Data ss:Type="String">#FFA500</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s160"><Data ss:Type="String">orangered</Data></Cell>
+ <Cell ss:StyleID="s160"><Data ss:Type="String">#FF4500</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s161"><Data ss:Type="String">orchid</Data></Cell>
+ <Cell ss:StyleID="s161"><Data ss:Type="String">#DA70D6</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s162"><Data ss:Type="String">palegoldenrod</Data></Cell>
+ <Cell ss:StyleID="s162"><Data ss:Type="String">#EEE8AA</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s163"><Data ss:Type="String">palegreen</Data></Cell>
+ <Cell ss:StyleID="s163"><Data ss:Type="String">#98FB98</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s164"><Data ss:Type="String">paleturquoise</Data></Cell>
+ <Cell ss:StyleID="s164"><Data ss:Type="String">#AFEEEE</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s165"><Data ss:Type="String">palevioletred</Data></Cell>
+ <Cell ss:StyleID="s165"><Data ss:Type="String">#DB7093</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s166"><Data ss:Type="String">papayawhip</Data></Cell>
+ <Cell ss:StyleID="s166"><Data ss:Type="String">#FFEFD5</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s167"><Data ss:Type="String">peachpuff</Data></Cell>
+ <Cell ss:StyleID="s167"><Data ss:Type="String">#FFDAB9</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s168"><Data ss:Type="String">peru</Data></Cell>
+ <Cell ss:StyleID="s168"><Data ss:Type="String">#CD853F</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s169"><Data ss:Type="String">pink</Data></Cell>
+ <Cell ss:StyleID="s169"><Data ss:Type="String">#FFC0CB</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s170"><Data ss:Type="String">plum</Data></Cell>
+ <Cell ss:StyleID="s170"><Data ss:Type="String">#DDA0DD</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s171"><Data ss:Type="String">powderblue</Data></Cell>
+ <Cell ss:StyleID="s171"><Data ss:Type="String">#B0E0E6</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s172"><Data ss:Type="String">purple</Data></Cell>
+ <Cell ss:StyleID="s172"><Data ss:Type="String">#800080</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s173"><Data ss:Type="String">red</Data></Cell>
+ <Cell ss:StyleID="s173"><Data ss:Type="String">#FF0000</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s174"><Data ss:Type="String">rosybrown</Data></Cell>
+ <Cell ss:StyleID="s174"><Data ss:Type="String">#BC8F8F</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s175"><Data ss:Type="String">royalblue</Data></Cell>
+ <Cell ss:StyleID="s175"><Data ss:Type="String">#4169E1</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s176"><Data ss:Type="String">saddlebrown</Data></Cell>
+ <Cell ss:StyleID="s176"><Data ss:Type="String">#8B4513</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s177"><Data ss:Type="String">salmon</Data></Cell>
+ <Cell ss:StyleID="s177"><Data ss:Type="String">#FA8072</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s178"><Data ss:Type="String">sandybrown</Data></Cell>
+ <Cell ss:StyleID="s178"><Data ss:Type="String">#F4A460</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s179"><Data ss:Type="String">seagreen</Data></Cell>
+ <Cell ss:StyleID="s179"><Data ss:Type="String">#2E8B57</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s180"><Data ss:Type="String">seashell</Data></Cell>
+ <Cell ss:StyleID="s180"><Data ss:Type="String">#FFF5EE</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s181"><Data ss:Type="String">sienna</Data></Cell>
+ <Cell ss:StyleID="s181"><Data ss:Type="String">#A0522D</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s182"><Data ss:Type="String">silver</Data></Cell>
+ <Cell ss:StyleID="s182"><Data ss:Type="String">#C0C0C0</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s183"><Data ss:Type="String">skyblue</Data></Cell>
+ <Cell ss:StyleID="s183"><Data ss:Type="String">#87CEEB</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s184"><Data ss:Type="String">slateblue</Data></Cell>
+ <Cell ss:StyleID="s184"><Data ss:Type="String">#6A5ACD</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s185"><Data ss:Type="String">slategray</Data></Cell>
+ <Cell ss:StyleID="s185"><Data ss:Type="String">#708090</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s186"><Data ss:Type="String">snow</Data></Cell>
+ <Cell ss:StyleID="s186"><Data ss:Type="String">#FFFAFA</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s187"><Data ss:Type="String">springgreen</Data></Cell>
+ <Cell ss:StyleID="s187"><Data ss:Type="String">#00FF7F</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s188"><Data ss:Type="String">steelblue</Data></Cell>
+ <Cell ss:StyleID="s188"><Data ss:Type="String">#4682B4</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s189"><Data ss:Type="String">tan</Data></Cell>
+ <Cell ss:StyleID="s189"><Data ss:Type="String">#D2B48C</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s190"><Data ss:Type="String">teal</Data></Cell>
+ <Cell ss:StyleID="s190"><Data ss:Type="String">#008080</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s191"><Data ss:Type="String">thistle</Data></Cell>
+ <Cell ss:StyleID="s191"><Data ss:Type="String">#D8BFD8</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s192"><Data ss:Type="String">tomato</Data></Cell>
+ <Cell ss:StyleID="s192"><Data ss:Type="String">#FF6347</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s193"><Data ss:Type="String">turquoise</Data></Cell>
+ <Cell ss:StyleID="s193"><Data ss:Type="String">#40E0D0</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s194"><Data ss:Type="String">violet</Data></Cell>
+ <Cell ss:StyleID="s194"><Data ss:Type="String">#EE82EE</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s195"><Data ss:Type="String">wheat</Data></Cell>
+ <Cell ss:StyleID="s195"><Data ss:Type="String">#F5DEB3</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s196"><Data ss:Type="String">white</Data></Cell>
+ <Cell ss:StyleID="s196"><Data ss:Type="String">#FFFFFF</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s197"><Data ss:Type="String">whitesmoke</Data></Cell>
+ <Cell ss:StyleID="s197"><Data ss:Type="String">#F5F5F5</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s198"><Data ss:Type="String">yellow</Data></Cell>
+ <Cell ss:StyleID="s198"><Data ss:Type="String">#FFFF00</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s199"><Data ss:Type="String">yellowgreen</Data></Cell>
+ <Cell ss:StyleID="s199"><Data ss:Type="String">#9ACD32</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Unsynced/>
+ <Selected/>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/test/xls-xml/named-colors/run.py b/test/xls-xml/named-colors/run.py
new file mode 100755
index 0000000..082ddd0
--- /dev/null
+++ b/test/xls-xml/named-colors/run.py
@@ -0,0 +1,55 @@
+#!/usr/bin/env python3
+
+import xml.etree.ElementTree as ET
+import sys
+import re
+
+
+def build_color_map(infile):
+ tree = ET.parse(infile)
+ root = tree.getroot()
+ ns = {"n": "urn:schemas-microsoft-com:office:spreadsheet"}
+ nodes = root.findall("./n:Worksheet/n:Table/n:Row", ns)
+ colors = {}
+ for node in nodes[1:]:
+ vs = node.findall("./n:Cell/n:Data", ns)
+ assert(len(vs) == 2)
+ v, k = vs[0].text, vs[1].text
+ colors[k] = v
+
+ return colors
+
+
+def replace_color_rgb(line, colors):
+ regex = re.compile(r"#([0-9]|[A-F])*", re.IGNORECASE)
+ match = regex.search(line)
+ rgb = line[match.span()[0]:match.span()[1]]
+ name = colors.get(rgb)
+ if name is None:
+ raise RuntimeError("oops")
+ line = regex.sub(name, line)
+ return line
+
+
+def main():
+ colors = build_color_map(sys.argv[1])
+ for k, v in colors.items():
+ r = k[1:3]
+ g = k[3:5]
+ b = k[5:7]
+ print(f"{{ ORCUS_ASCII(\"{v}\"), {{ 0x{r}, 0x{g}, 0x{b} }} }},")
+
+ out_buffer = []
+ with open(sys.argv[1], 'r') as f:
+ for line in f.readlines():
+ if line.find("<Interior ss:Color=") >= 0:
+ line = replace_color_rgb(line, colors)
+ out_buffer.append(line)
+
+ out = "".join(out_buffer)
+ with open(sys.argv[2], "w") as f:
+ f.write(out)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/test/xls-xml/named-colors/saved-by-excel.xml b/test/xls-xml/named-colors/saved-by-excel.xml
new file mode 100644
index 0000000..4e801d0
--- /dev/null
+++ b/test/xls-xml/named-colors/saved-by-excel.xml
@@ -0,0 +1,1170 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2019-03-12T00:44:46Z</Created>
+ <LastSaved>2019-03-12T00:50:53Z</LastSaved>
+ <Version>16.00</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <AllowPNG/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>12315</WindowHeight>
+ <WindowWidth>28800</WindowWidth>
+ <WindowTopX>32767</WindowTopX>
+ <WindowTopY>32767</WindowTopY>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ <Style ss:ID="s62">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#F0F8FF" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s63">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#FAEBD7" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s64">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#00FFFF" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s65">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#7FFFD4" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s66">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#F0FFFF" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s67">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#F5F5DC" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s68">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#FFE4C4" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s69">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#000000" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s70">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#FFEBCD" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s71">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#0000FF" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s72">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#8A2BE2" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s73">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#A52A2A" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s74">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#DEB887" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s75">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#5F9EA0" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s76">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#7FFF00" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s77">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#D2691E" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s78">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#FF7F50" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s79">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#6495ED" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s80">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#FFF8DC" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s81">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#DC143C" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s82">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#00008B" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s83">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#008B8B" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s84">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#B8860B" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s85">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#A9A9A9" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s86">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#006400" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s87">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#BDB76B" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s88">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#8B008B" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s89">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#556B2F" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s90">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#FF8C00" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s91">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#9932CC" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s92">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#8B0000" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s93">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#E9967A" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s94">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#8FBC8F" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s95">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#483D8B" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s96">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#2F4F4F" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s97">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#00CED1" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s98">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#9400D3" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s99">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#FF1493" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s100">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#00BFFF" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s101">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#696969" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s102">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#1E90FF" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s103">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#B22222" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s104">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#FFFAF0" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s105">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#228B22" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s106">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#FF00FF" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s107">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#DCDCDC" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s108">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#F8F8FF" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s109">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#FFD700" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s110">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#DAA520" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s111">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#808080" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s112">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#008000" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s113">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#ADFF2F" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s114">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#F0FFF0" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s115">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#FF69B4" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s116">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#CD5C5C" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s117">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#4B0082" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s118">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#FFFFF0" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s119">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#F0E68C" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s120">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#E6E6FA" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s121">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#FFF0F5" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s122">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#7CFC00" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s123">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#FFFACD" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s124">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#ADD8E6" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s125">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#F08080" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s126">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#E0FFFF" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s127">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#FAFAD2" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s128">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#D3D3D3" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s129">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#90EE90" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s130">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#FFB6C1" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s131">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#FFA07A" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s132">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#20B2AA" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s133">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#87CEFA" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s134">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#778899" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s135">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#B0C4DE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s136">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#FFFFE0" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s137">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#00FF00" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s138">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#32CD32" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s139">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#FAF0E6" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s140">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#800000" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s141">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#66CDAA" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s142">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#0000CD" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s143">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#BA55D3" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s144">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#9370DB" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s145">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#3CB371" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s146">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#7B68EE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s147">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#00FA9A" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s148">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#48D1CC" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s149">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#C71585" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s150">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#191970" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s151">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#F5FFFA" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s152">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#FFE4E1" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s153">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#FFE4B5" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s154">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#FFDEAD" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s155">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#000080" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s156">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#FDF5E6" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s157">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#808000" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s158">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#6B8E23" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s159">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#FFA500" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s160">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#FF4500" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s161">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#DA70D6" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s162">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#EEE8AA" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s163">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#98FB98" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s164">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#AFEEEE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s165">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#DB7093" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s166">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#FFEFD5" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s167">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#FFDAB9" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s168">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#CD853F" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s169">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#FFC0CB" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s170">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#DDA0DD" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s171">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#B0E0E6" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s172">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#800080" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s173">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#FF0000" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s174">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#BC8F8F" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s175">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#4169E1" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s176">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#8B4513" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s177">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#FA8072" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s178">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#F4A460" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s179">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#2E8B57" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s180">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#FFF5EE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s181">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#A0522D" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s182">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#C0C0C0" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s183">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#87CEEB" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s184">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#6A5ACD" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s185">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#708090" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s186">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#FFFAFA" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s187">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#00FF7F" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s188">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#4682B4" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s189">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#D2B48C" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s190">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#008080" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s191">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#D8BFD8" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s192">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#FF6347" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s193">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#40E0D0" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s194">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#EE82EE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s195">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#F5DEB3" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s196">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#FFFFFF" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s197">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#F5F5F5" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s198">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#FFFF00" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s199">
+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
+ <Interior ss:Color="#9ACD32" ss:Pattern="Solid"/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Sheet2">
+ <Table ss:ExpandedColumnCount="2" ss:ExpandedRowCount="141" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Column ss:Width="107.25"/>
+ <Column ss:AutoFitWidth="0" ss:Width="84"/>
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="String">Color Name</Data></Cell>
+ <Cell><Data ss:Type="String">Hex RGB</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s62"><Data ss:Type="String">aliceblue</Data></Cell>
+ <Cell ss:StyleID="s62"><Data ss:Type="String">#F0F8FF</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s63"><Data ss:Type="String">antiquewhite</Data></Cell>
+ <Cell ss:StyleID="s63"><Data ss:Type="String">#FAEBD7</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s64"><Data ss:Type="String">aqua</Data></Cell>
+ <Cell ss:StyleID="s64"><Data ss:Type="String">#00FFFF</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s65"><Data ss:Type="String">aquamarine</Data></Cell>
+ <Cell ss:StyleID="s65"><Data ss:Type="String">#7FFFD4</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s66"><Data ss:Type="String">azure</Data></Cell>
+ <Cell ss:StyleID="s66"><Data ss:Type="String">#F0FFFF</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s67"><Data ss:Type="String">beige</Data></Cell>
+ <Cell ss:StyleID="s67"><Data ss:Type="String">#F5F5DC</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s68"><Data ss:Type="String">bisque</Data></Cell>
+ <Cell ss:StyleID="s68"><Data ss:Type="String">#FFE4C4</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s69"><Data ss:Type="String">black</Data></Cell>
+ <Cell ss:StyleID="s69"><Data ss:Type="String">#000000</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s70"><Data ss:Type="String">blanchedalmond</Data></Cell>
+ <Cell ss:StyleID="s70"><Data ss:Type="String">#FFEBCD</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s71"><Data ss:Type="String">blue</Data></Cell>
+ <Cell ss:StyleID="s71"><Data ss:Type="String">#0000FF</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s72"><Data ss:Type="String">blueviolet</Data></Cell>
+ <Cell ss:StyleID="s72"><Data ss:Type="String">#8A2BE2</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s73"><Data ss:Type="String">brown</Data></Cell>
+ <Cell ss:StyleID="s73"><Data ss:Type="String">#A52A2A</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s74"><Data ss:Type="String">burlywood</Data></Cell>
+ <Cell ss:StyleID="s74"><Data ss:Type="String">#DEB887</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s75"><Data ss:Type="String">cadetblue</Data></Cell>
+ <Cell ss:StyleID="s75"><Data ss:Type="String">#5F9EA0</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s76"><Data ss:Type="String">chartreuse</Data></Cell>
+ <Cell ss:StyleID="s76"><Data ss:Type="String">#7FFF00</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s77"><Data ss:Type="String">chocolate</Data></Cell>
+ <Cell ss:StyleID="s77"><Data ss:Type="String">#D2691E</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s78"><Data ss:Type="String">coral</Data></Cell>
+ <Cell ss:StyleID="s78"><Data ss:Type="String">#FF7F50</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s79"><Data ss:Type="String">cornflowerblue</Data></Cell>
+ <Cell ss:StyleID="s79"><Data ss:Type="String">#6495ED</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s80"><Data ss:Type="String">cornsilk</Data></Cell>
+ <Cell ss:StyleID="s80"><Data ss:Type="String">#FFF8DC</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s81"><Data ss:Type="String">crimson</Data></Cell>
+ <Cell ss:StyleID="s81"><Data ss:Type="String">#DC143C</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s64"><Data ss:Type="String">cyan</Data></Cell>
+ <Cell ss:StyleID="s64"><Data ss:Type="String">#00FFFF</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s82"><Data ss:Type="String">darkblue</Data></Cell>
+ <Cell ss:StyleID="s82"><Data ss:Type="String">#00008B</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s83"><Data ss:Type="String">darkcyan</Data></Cell>
+ <Cell ss:StyleID="s83"><Data ss:Type="String">#008B8B</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s84"><Data ss:Type="String">darkgoldenrod</Data></Cell>
+ <Cell ss:StyleID="s84"><Data ss:Type="String">#B8860B</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s85"><Data ss:Type="String">darkgray</Data></Cell>
+ <Cell ss:StyleID="s85"><Data ss:Type="String">#A9A9A9</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s86"><Data ss:Type="String">darkgreen</Data></Cell>
+ <Cell ss:StyleID="s86"><Data ss:Type="String">#006400</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s87"><Data ss:Type="String">darkkhaki</Data></Cell>
+ <Cell ss:StyleID="s87"><Data ss:Type="String">#BDB76B</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s88"><Data ss:Type="String">darkmagenta</Data></Cell>
+ <Cell ss:StyleID="s88"><Data ss:Type="String">#8B008B</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s89"><Data ss:Type="String">darkolivegreen</Data></Cell>
+ <Cell ss:StyleID="s89"><Data ss:Type="String">#556B2F</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s90"><Data ss:Type="String">darkorange</Data></Cell>
+ <Cell ss:StyleID="s90"><Data ss:Type="String">#FF8C00</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s91"><Data ss:Type="String">darkorchid</Data></Cell>
+ <Cell ss:StyleID="s91"><Data ss:Type="String">#9932CC</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s92"><Data ss:Type="String">darkred</Data></Cell>
+ <Cell ss:StyleID="s92"><Data ss:Type="String">#8B0000</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s93"><Data ss:Type="String">darksalmon</Data></Cell>
+ <Cell ss:StyleID="s93"><Data ss:Type="String">#E9967A</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s94"><Data ss:Type="String">darkseagreen</Data></Cell>
+ <Cell ss:StyleID="s94"><Data ss:Type="String">#8FBC8F</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s95"><Data ss:Type="String">darkslateblue</Data></Cell>
+ <Cell ss:StyleID="s95"><Data ss:Type="String">#483D8B</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s96"><Data ss:Type="String">darkslategray</Data></Cell>
+ <Cell ss:StyleID="s96"><Data ss:Type="String">#2F4F4F</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s97"><Data ss:Type="String">darkturquoise</Data></Cell>
+ <Cell ss:StyleID="s97"><Data ss:Type="String">#00CED1</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s98"><Data ss:Type="String">darkviolet</Data></Cell>
+ <Cell ss:StyleID="s98"><Data ss:Type="String">#9400D3</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s99"><Data ss:Type="String">deeppink</Data></Cell>
+ <Cell ss:StyleID="s99"><Data ss:Type="String">#FF1493</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s100"><Data ss:Type="String">deepskyblue</Data></Cell>
+ <Cell ss:StyleID="s100"><Data ss:Type="String">#00BFFF</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s101"><Data ss:Type="String">dimgray</Data></Cell>
+ <Cell ss:StyleID="s101"><Data ss:Type="String">#696969</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s102"><Data ss:Type="String">dodgerblue</Data></Cell>
+ <Cell ss:StyleID="s102"><Data ss:Type="String">#1E90FF</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s103"><Data ss:Type="String">firebrick</Data></Cell>
+ <Cell ss:StyleID="s103"><Data ss:Type="String">#B22222</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s104"><Data ss:Type="String">floralwhite</Data></Cell>
+ <Cell ss:StyleID="s104"><Data ss:Type="String">#FFFAF0</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s105"><Data ss:Type="String">forestgreen</Data></Cell>
+ <Cell ss:StyleID="s105"><Data ss:Type="String">#228B22</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s106"><Data ss:Type="String">fuchsia</Data></Cell>
+ <Cell ss:StyleID="s106"><Data ss:Type="String">#FF00FF</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s107"><Data ss:Type="String">gainsboro</Data></Cell>
+ <Cell ss:StyleID="s107"><Data ss:Type="String">#DCDCDC</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s108"><Data ss:Type="String">ghostwhite</Data></Cell>
+ <Cell ss:StyleID="s108"><Data ss:Type="String">#F8F8FF</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s109"><Data ss:Type="String">gold</Data></Cell>
+ <Cell ss:StyleID="s109"><Data ss:Type="String">#FFD700</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s110"><Data ss:Type="String">goldenrod</Data></Cell>
+ <Cell ss:StyleID="s110"><Data ss:Type="String">#DAA520</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s111"><Data ss:Type="String">gray</Data></Cell>
+ <Cell ss:StyleID="s111"><Data ss:Type="String">#808080</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s112"><Data ss:Type="String">green</Data></Cell>
+ <Cell ss:StyleID="s112"><Data ss:Type="String">#008000</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s113"><Data ss:Type="String">greenyellow</Data></Cell>
+ <Cell ss:StyleID="s113"><Data ss:Type="String">#ADFF2F</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s114"><Data ss:Type="String">honeydew</Data></Cell>
+ <Cell ss:StyleID="s114"><Data ss:Type="String">#F0FFF0</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s115"><Data ss:Type="String">hotpink</Data></Cell>
+ <Cell ss:StyleID="s115"><Data ss:Type="String">#FF69B4</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s116"><Data ss:Type="String">indianred</Data></Cell>
+ <Cell ss:StyleID="s116"><Data ss:Type="String">#CD5C5C</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s117"><Data ss:Type="String">indigo</Data></Cell>
+ <Cell ss:StyleID="s117"><Data ss:Type="String">#4B0082</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s118"><Data ss:Type="String">ivory</Data></Cell>
+ <Cell ss:StyleID="s118"><Data ss:Type="String">#FFFFF0</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s119"><Data ss:Type="String">khaki</Data></Cell>
+ <Cell ss:StyleID="s119"><Data ss:Type="String">#F0E68C</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s120"><Data ss:Type="String">lavender</Data></Cell>
+ <Cell ss:StyleID="s120"><Data ss:Type="String">#E6E6FA</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s121"><Data ss:Type="String">lavenderblush</Data></Cell>
+ <Cell ss:StyleID="s121"><Data ss:Type="String">#FFF0F5</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s122"><Data ss:Type="String">lawngreen</Data></Cell>
+ <Cell ss:StyleID="s122"><Data ss:Type="String">#7CFC00</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s123"><Data ss:Type="String">lemonchiffon</Data></Cell>
+ <Cell ss:StyleID="s123"><Data ss:Type="String">#FFFACD</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s124"><Data ss:Type="String">lightblue</Data></Cell>
+ <Cell ss:StyleID="s124"><Data ss:Type="String">#ADD8E6</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s125"><Data ss:Type="String">lightcoral</Data></Cell>
+ <Cell ss:StyleID="s125"><Data ss:Type="String">#F08080</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s126"><Data ss:Type="String">lightcyan</Data></Cell>
+ <Cell ss:StyleID="s126"><Data ss:Type="String">#E0FFFF</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s127"><Data ss:Type="String">lightgoldenrodyellow</Data></Cell>
+ <Cell ss:StyleID="s127"><Data ss:Type="String">#FAFAD2</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s128"><Data ss:Type="String">lightgray</Data></Cell>
+ <Cell ss:StyleID="s128"><Data ss:Type="String">#D3D3D3</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s129"><Data ss:Type="String">lightgreen</Data></Cell>
+ <Cell ss:StyleID="s129"><Data ss:Type="String">#90EE90</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s130"><Data ss:Type="String">lightpink</Data></Cell>
+ <Cell ss:StyleID="s130"><Data ss:Type="String">#FFB6C1</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s131"><Data ss:Type="String">lightsalmon</Data></Cell>
+ <Cell ss:StyleID="s131"><Data ss:Type="String">#FFA07A</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s132"><Data ss:Type="String">lightseagreen</Data></Cell>
+ <Cell ss:StyleID="s132"><Data ss:Type="String">#20B2AA</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s133"><Data ss:Type="String">lightskyblue</Data></Cell>
+ <Cell ss:StyleID="s133"><Data ss:Type="String">#87CEFA</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s134"><Data ss:Type="String">lightslategray</Data></Cell>
+ <Cell ss:StyleID="s134"><Data ss:Type="String">#778899</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s135"><Data ss:Type="String">lightsteelblue</Data></Cell>
+ <Cell ss:StyleID="s135"><Data ss:Type="String">#B0C4DE</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s136"><Data ss:Type="String">lightyellow</Data></Cell>
+ <Cell ss:StyleID="s136"><Data ss:Type="String">#FFFFE0</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s137"><Data ss:Type="String">lime</Data></Cell>
+ <Cell ss:StyleID="s137"><Data ss:Type="String">#00FF00</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s138"><Data ss:Type="String">limegreen</Data></Cell>
+ <Cell ss:StyleID="s138"><Data ss:Type="String">#32CD32</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s139"><Data ss:Type="String">linen</Data></Cell>
+ <Cell ss:StyleID="s139"><Data ss:Type="String">#FAF0E6</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s106"><Data ss:Type="String">magenta</Data></Cell>
+ <Cell ss:StyleID="s106"><Data ss:Type="String">#FF00FF</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s140"><Data ss:Type="String">maroon</Data></Cell>
+ <Cell ss:StyleID="s140"><Data ss:Type="String">#800000</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s141"><Data ss:Type="String">mediumaquamarine</Data></Cell>
+ <Cell ss:StyleID="s141"><Data ss:Type="String">#66CDAA</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s142"><Data ss:Type="String">mediumblue</Data></Cell>
+ <Cell ss:StyleID="s142"><Data ss:Type="String">#0000CD</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s143"><Data ss:Type="String">mediumorchid</Data></Cell>
+ <Cell ss:StyleID="s143"><Data ss:Type="String">#BA55D3</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s144"><Data ss:Type="String">mediumpurple</Data></Cell>
+ <Cell ss:StyleID="s144"><Data ss:Type="String">#9370DB</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s145"><Data ss:Type="String">mediumseagreen</Data></Cell>
+ <Cell ss:StyleID="s145"><Data ss:Type="String">#3CB371</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s146"><Data ss:Type="String">mediumslateblue</Data></Cell>
+ <Cell ss:StyleID="s146"><Data ss:Type="String">#7B68EE</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s147"><Data ss:Type="String">mediumspringgreen</Data></Cell>
+ <Cell ss:StyleID="s147"><Data ss:Type="String">#00FA9A</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s148"><Data ss:Type="String">mediumturquoise</Data></Cell>
+ <Cell ss:StyleID="s148"><Data ss:Type="String">#48D1CC</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s149"><Data ss:Type="String">mediumvioletred</Data></Cell>
+ <Cell ss:StyleID="s149"><Data ss:Type="String">#C71585</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s150"><Data ss:Type="String">midnightblue</Data></Cell>
+ <Cell ss:StyleID="s150"><Data ss:Type="String">#191970</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s151"><Data ss:Type="String">mintcream</Data></Cell>
+ <Cell ss:StyleID="s151"><Data ss:Type="String">#F5FFFA</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s152"><Data ss:Type="String">mistyrose</Data></Cell>
+ <Cell ss:StyleID="s152"><Data ss:Type="String">#FFE4E1</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s153"><Data ss:Type="String">moccasin</Data></Cell>
+ <Cell ss:StyleID="s153"><Data ss:Type="String">#FFE4B5</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s154"><Data ss:Type="String">navajowhite</Data></Cell>
+ <Cell ss:StyleID="s154"><Data ss:Type="String">#FFDEAD</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s155"><Data ss:Type="String">navy</Data></Cell>
+ <Cell ss:StyleID="s155"><Data ss:Type="String">#000080</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s156"><Data ss:Type="String">oldlace</Data></Cell>
+ <Cell ss:StyleID="s156"><Data ss:Type="String">#FDF5E6</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s157"><Data ss:Type="String">olive</Data></Cell>
+ <Cell ss:StyleID="s157"><Data ss:Type="String">#808000</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s158"><Data ss:Type="String">olivedrab</Data></Cell>
+ <Cell ss:StyleID="s158"><Data ss:Type="String">#6B8E23</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s159"><Data ss:Type="String">orange</Data></Cell>
+ <Cell ss:StyleID="s159"><Data ss:Type="String">#FFA500</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s160"><Data ss:Type="String">orangered</Data></Cell>
+ <Cell ss:StyleID="s160"><Data ss:Type="String">#FF4500</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s161"><Data ss:Type="String">orchid</Data></Cell>
+ <Cell ss:StyleID="s161"><Data ss:Type="String">#DA70D6</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s162"><Data ss:Type="String">palegoldenrod</Data></Cell>
+ <Cell ss:StyleID="s162"><Data ss:Type="String">#EEE8AA</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s163"><Data ss:Type="String">palegreen</Data></Cell>
+ <Cell ss:StyleID="s163"><Data ss:Type="String">#98FB98</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s164"><Data ss:Type="String">paleturquoise</Data></Cell>
+ <Cell ss:StyleID="s164"><Data ss:Type="String">#AFEEEE</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s165"><Data ss:Type="String">palevioletred</Data></Cell>
+ <Cell ss:StyleID="s165"><Data ss:Type="String">#DB7093</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s166"><Data ss:Type="String">papayawhip</Data></Cell>
+ <Cell ss:StyleID="s166"><Data ss:Type="String">#FFEFD5</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s167"><Data ss:Type="String">peachpuff</Data></Cell>
+ <Cell ss:StyleID="s167"><Data ss:Type="String">#FFDAB9</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s168"><Data ss:Type="String">peru</Data></Cell>
+ <Cell ss:StyleID="s168"><Data ss:Type="String">#CD853F</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s169"><Data ss:Type="String">pink</Data></Cell>
+ <Cell ss:StyleID="s169"><Data ss:Type="String">#FFC0CB</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s170"><Data ss:Type="String">plum</Data></Cell>
+ <Cell ss:StyleID="s170"><Data ss:Type="String">#DDA0DD</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s171"><Data ss:Type="String">powderblue</Data></Cell>
+ <Cell ss:StyleID="s171"><Data ss:Type="String">#B0E0E6</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s172"><Data ss:Type="String">purple</Data></Cell>
+ <Cell ss:StyleID="s172"><Data ss:Type="String">#800080</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s173"><Data ss:Type="String">red</Data></Cell>
+ <Cell ss:StyleID="s173"><Data ss:Type="String">#FF0000</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s174"><Data ss:Type="String">rosybrown</Data></Cell>
+ <Cell ss:StyleID="s174"><Data ss:Type="String">#BC8F8F</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s175"><Data ss:Type="String">royalblue</Data></Cell>
+ <Cell ss:StyleID="s175"><Data ss:Type="String">#4169E1</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s176"><Data ss:Type="String">saddlebrown</Data></Cell>
+ <Cell ss:StyleID="s176"><Data ss:Type="String">#8B4513</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s177"><Data ss:Type="String">salmon</Data></Cell>
+ <Cell ss:StyleID="s177"><Data ss:Type="String">#FA8072</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s178"><Data ss:Type="String">sandybrown</Data></Cell>
+ <Cell ss:StyleID="s178"><Data ss:Type="String">#F4A460</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s179"><Data ss:Type="String">seagreen</Data></Cell>
+ <Cell ss:StyleID="s179"><Data ss:Type="String">#2E8B57</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s180"><Data ss:Type="String">seashell</Data></Cell>
+ <Cell ss:StyleID="s180"><Data ss:Type="String">#FFF5EE</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s181"><Data ss:Type="String">sienna</Data></Cell>
+ <Cell ss:StyleID="s181"><Data ss:Type="String">#A0522D</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s182"><Data ss:Type="String">silver</Data></Cell>
+ <Cell ss:StyleID="s182"><Data ss:Type="String">#C0C0C0</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s183"><Data ss:Type="String">skyblue</Data></Cell>
+ <Cell ss:StyleID="s183"><Data ss:Type="String">#87CEEB</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s184"><Data ss:Type="String">slateblue</Data></Cell>
+ <Cell ss:StyleID="s184"><Data ss:Type="String">#6A5ACD</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s185"><Data ss:Type="String">slategray</Data></Cell>
+ <Cell ss:StyleID="s185"><Data ss:Type="String">#708090</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s186"><Data ss:Type="String">snow</Data></Cell>
+ <Cell ss:StyleID="s186"><Data ss:Type="String">#FFFAFA</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s187"><Data ss:Type="String">springgreen</Data></Cell>
+ <Cell ss:StyleID="s187"><Data ss:Type="String">#00FF7F</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s188"><Data ss:Type="String">steelblue</Data></Cell>
+ <Cell ss:StyleID="s188"><Data ss:Type="String">#4682B4</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s189"><Data ss:Type="String">tan</Data></Cell>
+ <Cell ss:StyleID="s189"><Data ss:Type="String">#D2B48C</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s190"><Data ss:Type="String">teal</Data></Cell>
+ <Cell ss:StyleID="s190"><Data ss:Type="String">#008080</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s191"><Data ss:Type="String">thistle</Data></Cell>
+ <Cell ss:StyleID="s191"><Data ss:Type="String">#D8BFD8</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s192"><Data ss:Type="String">tomato</Data></Cell>
+ <Cell ss:StyleID="s192"><Data ss:Type="String">#FF6347</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s193"><Data ss:Type="String">turquoise</Data></Cell>
+ <Cell ss:StyleID="s193"><Data ss:Type="String">#40E0D0</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s194"><Data ss:Type="String">violet</Data></Cell>
+ <Cell ss:StyleID="s194"><Data ss:Type="String">#EE82EE</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s195"><Data ss:Type="String">wheat</Data></Cell>
+ <Cell ss:StyleID="s195"><Data ss:Type="String">#F5DEB3</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s196"><Data ss:Type="String">white</Data></Cell>
+ <Cell ss:StyleID="s196"><Data ss:Type="String">#FFFFFF</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s197"><Data ss:Type="String">whitesmoke</Data></Cell>
+ <Cell ss:StyleID="s197"><Data ss:Type="String">#F5F5F5</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s198"><Data ss:Type="String">yellow</Data></Cell>
+ <Cell ss:StyleID="s198"><Data ss:Type="String">#FFFF00</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s199"><Data ss:Type="String">yellowgreen</Data></Cell>
+ <Cell ss:StyleID="s199"><Data ss:Type="String">#9ACD32</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Unsynced/>
+ <Selected/>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/test/xls-xml/named-expression-sheet-local/check.txt b/test/xls-xml/named-expression-sheet-local/check.txt
new file mode 100644
index 0000000..321f221
--- /dev/null
+++ b/test/xls-xml/named-expression-sheet-local/check.txt
@@ -0,0 +1,22 @@
+Sheet1/0/0:numeric:1
+Sheet1/0/1:numeric:6
+Sheet1/1/0:numeric:2
+Sheet1/1/1:numeric:7
+Sheet1/2/0:numeric:3
+Sheet1/2/1:numeric:8
+Sheet1/3/0:numeric:4
+Sheet1/3/1:numeric:9
+Sheet1/4/0:numeric:5
+Sheet1/4/1:numeric:10
+Sheet1/6/0:formula:SUM(MyRange):27
+Sheet2/0/0:numeric:10
+Sheet2/0/1:numeric:20
+Sheet2/1/0:numeric:11
+Sheet2/1/1:numeric:21
+Sheet2/2/0:numeric:12
+Sheet2/2/1:numeric:22
+Sheet2/3/0:numeric:13
+Sheet2/3/1:numeric:23
+Sheet2/4/0:numeric:14
+Sheet2/4/1:numeric:24
+Sheet2/6/0:formula:SUM(MyRange):74
diff --git a/test/xls-xml/named-expression-sheet-local/input.xml b/test/xls-xml/named-expression-sheet-local/input.xml
new file mode 100644
index 0000000..46f110b
--- /dev/null
+++ b/test/xls-xml/named-expression-sheet-local/input.xml
@@ -0,0 +1,131 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2017-02-08T02:38:34Z</Created>
+ <LastSaved>2017-02-08T02:41:56Z</LastSaved>
+ <Version>15.00</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <AllowPNG/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>14385</WindowHeight>
+ <WindowWidth>24000</WindowWidth>
+ <WindowTopX>0</WindowTopX>
+ <WindowTopY>0</WindowTopY>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Sheet1">
+ <Names>
+ <NamedRange ss:Name="MyRange" ss:RefersTo="=Sheet1!R1C1:R3C2"/>
+ </Names>
+ <Table ss:ExpandedColumnCount="2" ss:ExpandedRowCount="7" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="Number">1</Data><NamedCell ss:Name="MyRange"/></Cell>
+ <Cell><Data ss:Type="Number">6</Data><NamedCell ss:Name="MyRange"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="Number">2</Data><NamedCell ss:Name="MyRange"/></Cell>
+ <Cell><Data ss:Type="Number">7</Data><NamedCell ss:Name="MyRange"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="Number">3</Data><NamedCell ss:Name="MyRange"/></Cell>
+ <Cell><Data ss:Type="Number">8</Data><NamedCell ss:Name="MyRange"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="Number">4</Data></Cell>
+ <Cell><Data ss:Type="Number">9</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="Number">5</Data></Cell>
+ <Cell><Data ss:Type="Number">10</Data></Cell>
+ </Row>
+ <Row ss:Index="7" ss:AutoFitHeight="0">
+ <Cell ss:Formula="=SUM(MyRange)"><Data ss:Type="Number">27</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Unsynced/>
+ <Selected/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>6</ActiveRow>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+ <Worksheet ss:Name="Sheet2">
+ <Names>
+ <NamedRange ss:Name="MyRange" ss:RefersTo="=Sheet2!R4C1:R5C2"/>
+ </Names>
+ <Table ss:ExpandedColumnCount="2" ss:ExpandedRowCount="7" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="Number">10</Data></Cell>
+ <Cell><Data ss:Type="Number">20</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="Number">11</Data></Cell>
+ <Cell><Data ss:Type="Number">21</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="Number">12</Data></Cell>
+ <Cell><Data ss:Type="Number">22</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="Number">13</Data><NamedCell ss:Name="MyRange"/></Cell>
+ <Cell><Data ss:Type="Number">23</Data><NamedCell ss:Name="MyRange"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="Number">14</Data><NamedCell ss:Name="MyRange"/></Cell>
+ <Cell><Data ss:Type="Number">24</Data><NamedCell ss:Name="MyRange"/></Cell>
+ </Row>
+ <Row ss:Index="7" ss:AutoFitHeight="0">
+ <Cell ss:Formula="=SUM(MyRange)"><Data ss:Type="Number">74</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Unsynced/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>6</ActiveRow>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/test/xls-xml/named-expression/check.txt b/test/xls-xml/named-expression/check.txt
new file mode 100644
index 0000000..d6d6ff0
--- /dev/null
+++ b/test/xls-xml/named-expression/check.txt
@@ -0,0 +1,12 @@
+Sheet1/0/0:numeric:1
+Sheet1/0/1:numeric:6
+Sheet1/1/0:numeric:2
+Sheet1/1/1:numeric:7
+Sheet1/2/0:numeric:3
+Sheet1/2/1:numeric:8
+Sheet1/3/0:numeric:4
+Sheet1/3/1:numeric:9
+Sheet1/4/0:numeric:5
+Sheet1/4/1:numeric:10
+Sheet1/6/0:formula:SUM(MyRange):15
+Sheet1/6/1:formula:SUM(MyRange2):55
diff --git a/test/xls-xml/named-expression/input.xml b/test/xls-xml/named-expression/input.xml
new file mode 100644
index 0000000..151ed70
--- /dev/null
+++ b/test/xls-xml/named-expression/input.xml
@@ -0,0 +1,92 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2016-12-17T20:46:03Z</Created>
+ <LastSaved>2016-12-17T20:49:13Z</LastSaved>
+ <Version>15.00</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <AllowPNG/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>14385</WindowHeight>
+ <WindowWidth>24000</WindowWidth>
+ <WindowTopX>0</WindowTopX>
+ <WindowTopY>0</WindowTopY>
+ <RefModeR1C1/>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ </Styles>
+ <Names>
+ <NamedRange ss:Name="MyRange" ss:RefersTo="=Sheet1!R1C1:R5C1"/>
+ <NamedRange ss:Name="MyRange2" ss:RefersTo="=Sheet1!R1C1:R5C2"/>
+ </Names>
+ <Worksheet ss:Name="Sheet1">
+ <Table ss:ExpandedColumnCount="2" ss:ExpandedRowCount="7" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Row>
+ <Cell><Data ss:Type="Number">1</Data><NamedCell ss:Name="MyRange"/><NamedCell
+ ss:Name="MyRange2"/></Cell>
+ <Cell><Data ss:Type="Number">6</Data><NamedCell ss:Name="MyRange2"/></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="Number">2</Data><NamedCell ss:Name="MyRange"/><NamedCell
+ ss:Name="MyRange2"/></Cell>
+ <Cell><Data ss:Type="Number">7</Data><NamedCell ss:Name="MyRange2"/></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="Number">3</Data><NamedCell ss:Name="MyRange"/><NamedCell
+ ss:Name="MyRange2"/></Cell>
+ <Cell><Data ss:Type="Number">8</Data><NamedCell ss:Name="MyRange2"/></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="Number">4</Data><NamedCell ss:Name="MyRange"/><NamedCell
+ ss:Name="MyRange2"/></Cell>
+ <Cell><Data ss:Type="Number">9</Data><NamedCell ss:Name="MyRange2"/></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="Number">5</Data><NamedCell ss:Name="MyRange"/><NamedCell
+ ss:Name="MyRange2"/></Cell>
+ <Cell><Data ss:Type="Number">10</Data><NamedCell ss:Name="MyRange2"/></Cell>
+ </Row>
+ <Row ss:Index="7">
+ <Cell ss:Formula="=SUM(MyRange)"><Data ss:Type="Number">15</Data></Cell>
+ <Cell ss:Formula="=SUM(MyRange2)"><Data ss:Type="Number">55</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Selected/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>6</ActiveRow>
+ <ActiveCol>1</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/test/xls-xml/number-format/date-time.xml b/test/xls-xml/number-format/date-time.xml
new file mode 100644
index 0000000..45a56ec
--- /dev/null
+++ b/test/xls-xml/number-format/date-time.xml
@@ -0,0 +1,244 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2019-08-26T12:53:11Z</Created>
+ <LastSaved>2019-08-26T12:59:50Z</LastSaved>
+ <Version>16.00</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <AllowPNG/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>10590</WindowHeight>
+ <WindowWidth>20550</WindowWidth>
+ <WindowTopX>32767</WindowTopX>
+ <WindowTopY>32767</WindowTopY>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ <Style ss:ID="s62">
+ <NumberFormat ss:Format="@"/>
+ </Style>
+ <Style ss:ID="s63">
+ <NumberFormat ss:Format="[$-F800]dddd\,\ mmmm\ dd\,\ yyyy"/>
+ </Style>
+ <Style ss:ID="s64">
+ <NumberFormat ss:Format="[ENG][$-409]mmmm\ d\,\ yyyy;@"/>
+ </Style>
+ <Style ss:ID="s65">
+ <NumberFormat ss:Format="m/d/yy;@"/>
+ </Style>
+ <Style ss:ID="s66">
+ <NumberFormat ss:Format="General Date"/>
+ </Style>
+ <Style ss:ID="s67">
+ <NumberFormat ss:Format="Medium Date"/>
+ </Style>
+ <Style ss:ID="s68">
+ <NumberFormat ss:Format="Short Time"/>
+ </Style>
+ <Style ss:ID="s70">
+ <NumberFormat ss:Format="Short Date"/>
+ </Style>
+ <Style ss:ID="s71">
+ <NumberFormat ss:Format="Long Time"/>
+ </Style>
+ <Style ss:ID="s72">
+ <NumberFormat ss:Format="Medium Time"/>
+ </Style>
+ <Style ss:ID="s73">
+ <NumberFormat ss:Format="Fixed"/>
+ </Style>
+ <Style ss:ID="s74">
+ <NumberFormat ss:Format="Standard"/>
+ </Style>
+ <Style ss:ID="s75">
+ <NumberFormat ss:Format="Percent"/>
+ </Style>
+ <Style ss:ID="s76">
+ <NumberFormat ss:Format="Scientific"/>
+ </Style>
+ <Style ss:ID="s77">
+ <NumberFormat ss:Format="Yes/No"/>
+ </Style>
+ <Style ss:ID="s78">
+ <NumberFormat ss:Format="True/False"/>
+ </Style>
+ <Style ss:ID="s79">
+ <NumberFormat ss:Format="On/Off"/>
+ </Style>
+ <Style ss:ID="s80">
+ <NumberFormat ss:Format="Currency"/>
+ </Style>
+ <Style ss:ID="s81">
+ <NumberFormat ss:Format="Euro Currency"/>
+ </Style>
+ <Style ss:ID="s91">
+ <NumberFormat/>
+ </Style>
+ <Style ss:ID="s92">
+ <Alignment ss:Vertical="Center"/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Color="#FFFFFF"/>
+ <NumberFormat ss:Format="[$€-2]\ #,##0.00;[Red]\-[$€-2]\ #,##0.00"/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Sheet1">
+ <Table ss:ExpandedColumnCount="4" ss:ExpandedRowCount="19" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="14.4375">
+ <Column ss:AutoFitWidth="0" ss:Width="123.75"/>
+ <Column ss:AutoFitWidth="0" ss:Width="168"/>
+ <Column ss:StyleID="s62" ss:Width="156"/>
+ <Column ss:AutoFitWidth="0" ss:Width="99.75"/>
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="String">Type</Data></Cell>
+ <Cell><Data ss:Type="String">Value</Data></Cell>
+ <Cell><Data ss:Type="String">String</Data></Cell>
+ <Cell><Data ss:Type="String">Format Name</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="String">Date</Data></Cell>
+ <Cell ss:StyleID="s63"><Data ss:Type="DateTime">2003-09-24T00:00:00.000</Data></Cell>
+ <Cell><Data ss:Type="String">Wednesday, September 24, 2003</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="String">Date</Data></Cell>
+ <Cell ss:StyleID="s64"><Data ss:Type="DateTime">2003-09-24T00:00:00.000</Data></Cell>
+ <Cell><Data ss:Type="String">September 24, 2003</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="String">Date</Data></Cell>
+ <Cell ss:StyleID="s65"><Data ss:Type="DateTime">2003-09-24T00:00:00.000</Data></Cell>
+ <Cell><Data ss:Type="String">9/24/03</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="String">Date &amp; Time</Data></Cell>
+ <Cell ss:StyleID="s66"><Data ss:Type="DateTime">2019-08-26T08:57:31.280</Data></Cell>
+ <Cell><Data ss:Type="String">8/26/2019 8:57</Data></Cell>
+ <Cell><Data ss:Type="String">General Date</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="String">Date</Data></Cell>
+ <Cell ss:StyleID="s67"><Data ss:Type="DateTime">2019-08-26T08:57:31.280</Data></Cell>
+ <Cell><Data ss:Type="String">26-Aug-19</Data></Cell>
+ <Cell><Data ss:Type="String">Medium Date</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="String">Time</Data></Cell>
+ <Cell ss:StyleID="s70"><Data ss:Type="DateTime">2019-08-26T08:57:31.280</Data></Cell>
+ <Cell><Data ss:Type="String" x:Ticked="1">8/26/2019</Data></Cell>
+ <Cell><Data ss:Type="String">Short Date</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="String">Time</Data></Cell>
+ <Cell ss:StyleID="s71"><Data ss:Type="DateTime">2019-08-26T08:57:31.280</Data></Cell>
+ <Cell><Data ss:Type="String" x:Ticked="1">8:57:31 AM</Data></Cell>
+ <Cell><Data ss:Type="String">Long Time</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="String">Time</Data></Cell>
+ <Cell ss:StyleID="s72"><Data ss:Type="DateTime">2019-08-26T08:57:31.280</Data></Cell>
+ <Cell><Data ss:Type="String" x:Ticked="1">8:57 AM</Data></Cell>
+ <Cell><Data ss:Type="String">Medium Time</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="String">Time</Data></Cell>
+ <Cell ss:StyleID="s68"><Data ss:Type="DateTime">2019-08-26T08:57:31.280</Data></Cell>
+ <Cell><Data ss:Type="String" x:Ticked="1">8:57</Data></Cell>
+ <Cell><Data ss:Type="String">Short Time</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="String">Number</Data></Cell>
+ <Cell ss:StyleID="s73"><Data ss:Type="Number">42</Data></Cell>
+ <Cell><Data ss:Type="String" x:Ticked="1">42.00</Data></Cell>
+ <Cell><Data ss:Type="String">Fixed</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="String">Number</Data></Cell>
+ <Cell ss:StyleID="s74"><Data ss:Type="Number">42</Data></Cell>
+ <Cell><Data ss:Type="String" x:Ticked="1">42.00</Data></Cell>
+ <Cell><Data ss:Type="String">Standard</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="String">Number</Data></Cell>
+ <Cell ss:StyleID="s75"><Data ss:Type="Number">42</Data></Cell>
+ <Cell><Data ss:Type="String" x:Ticked="1">4200.00%</Data></Cell>
+ <Cell><Data ss:Type="String">Percent</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="String">Number</Data></Cell>
+ <Cell ss:StyleID="s76"><Data ss:Type="Number">42</Data></Cell>
+ <Cell><Data ss:Type="String" x:Ticked="1">4.20E+01</Data></Cell>
+ <Cell><Data ss:Type="String">Scientific</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="String">Boolean</Data></Cell>
+ <Cell ss:StyleID="s77"><Data ss:Type="Number">1</Data></Cell>
+ <Cell><Data ss:Type="String" x:Ticked="1">Yes</Data></Cell>
+ <Cell><Data ss:Type="String">Yes/No</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="String">Boolean</Data></Cell>
+ <Cell ss:StyleID="s78"><Data ss:Type="Number">1</Data></Cell>
+ <Cell><Data ss:Type="String" x:Ticked="1">True</Data></Cell>
+ <Cell><Data ss:Type="String">True/False</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="String">Boolean</Data></Cell>
+ <Cell ss:StyleID="s79"><Data ss:Type="Number">1</Data></Cell>
+ <Cell><Data ss:Type="String" x:Ticked="1">On</Data></Cell>
+ <Cell><Data ss:Type="String">On/Off</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="String">Currency</Data></Cell>
+ <Cell ss:StyleID="s80"><Data ss:Type="Number">1.52</Data></Cell>
+ <Cell><Data ss:Type="String" x:Ticked="1">$1.52</Data></Cell>
+ <Cell><Data ss:Type="String">Currency</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="String">Currency</Data></Cell>
+ <Cell ss:StyleID="s81"><Data ss:Type="Number">1.52</Data></Cell>
+ <Cell ss:StyleID="s92"/>
+ <Cell ss:StyleID="s91"><Data ss:Type="String">Euro Currency</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Unsynced/>
+ <Print>
+ <ValidPrinterInfo/>
+ <HorizontalResolution>600</HorizontalResolution>
+ <VerticalResolution>600</VerticalResolution>
+ </Print>
+ <Selected/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>18</ActiveRow>
+ <ActiveCol>2</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/test/xls-xml/raw-values-1/check.txt b/test/xls-xml/raw-values-1/check.txt
new file mode 100644
index 0000000..935cf22
--- /dev/null
+++ b/test/xls-xml/raw-values-1/check.txt
@@ -0,0 +1,25 @@
+Num/1/0:numeric:1.1
+Num/1/2:numeric:2.1
+Num/1/4:numeric:3.1
+Num/2/0:numeric:1.2
+Num/2/2:numeric:2.2
+Num/2/4:numeric:3.2
+Num/3/0:numeric:1.3
+Num/3/2:numeric:2.3
+Num/3/4:numeric:3.3
+Num/6/2:numeric:5
+Num/6/3:numeric:6
+Num/6/4:numeric:7
+Text/0/0:string:"A"
+Text/1/0:string:"B"
+Text/1/1:string:"D"
+Text/2/0:string:"C"
+Text/2/1:string:"E"
+Text/2/2:string:"G"
+Text/3/1:string:"F"
+Text/3/2:string:"H"
+Text/4/2:string:"I"
+Text/6/3:string:"Andy"
+Text/7/3:string:"Bruce"
+Text/8/3:string:"Charlie"
+Text/9/3:string:"David"
diff --git a/test/xls-xml/raw-values-1/input.xml b/test/xls-xml/raw-values-1/input.xml
new file mode 100644
index 0000000..76a09bf
--- /dev/null
+++ b/test/xls-xml/raw-values-1/input.xml
@@ -0,0 +1,131 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2012-12-11T23:16:00Z</Created>
+ <LastSaved>2012-12-11T23:19:30Z</LastSaved>
+ <Company>Novell, Inc.</Company>
+ <Version>16.00</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <AllowPNG/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>8775</WindowHeight>
+ <WindowWidth>20880</WindowWidth>
+ <WindowTopX>360</WindowTopX>
+ <WindowTopY>75</WindowTopY>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Num">
+ <Table ss:ExpandedColumnCount="5" ss:ExpandedRowCount="7" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Row ss:Index="2">
+ <Cell><Data ss:Type="Number">1.1000000000000001</Data></Cell>
+ <Cell ss:Index="3"><Data ss:Type="Number">2.1</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="Number">3.1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="Number">1.2</Data></Cell>
+ <Cell ss:Index="3"><Data ss:Type="Number">2.2000000000000002</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="Number">3.2</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="Number">1.3</Data></Cell>
+ <Cell ss:Index="3"><Data ss:Type="Number">2.2999999999999998</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="Number">3.3</Data></Cell>
+ </Row>
+ <Row ss:Index="7">
+ <Cell ss:Index="3"><Data ss:Type="Number">5</Data></Cell>
+ <Cell><Data ss:Type="Number">6</Data></Cell>
+ <Cell><Data ss:Type="Number">7</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Selected/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>6</ActiveRow>
+ <ActiveCol>5</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+ <Worksheet ss:Name="Text">
+ <Table ss:ExpandedColumnCount="4" ss:ExpandedRowCount="10" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Row>
+ <Cell><Data ss:Type="String">A</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">B</Data></Cell>
+ <Cell><Data ss:Type="String">D</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">C</Data></Cell>
+ <Cell><Data ss:Type="String">E</Data></Cell>
+ <Cell><Data ss:Type="String">G</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:Index="2"><Data ss:Type="String">F</Data></Cell>
+ <Cell><Data ss:Type="String">H</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:Index="3"><Data ss:Type="String">I</Data></Cell>
+ </Row>
+ <Row ss:Index="7">
+ <Cell ss:Index="4"><Data ss:Type="String">Andy</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:Index="4"><Data ss:Type="String">Bruce</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:Index="4"><Data ss:Type="String">Charlie</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:Index="4"><Data ss:Type="String">David</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>8</ActiveRow>
+ <ActiveCol>3</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/test/xls-xml/styles/column-styles.xml b/test/xls-xml/styles/column-styles.xml
new file mode 100644
index 0000000..eab62f5
--- /dev/null
+++ b/test/xls-xml/styles/column-styles.xml
@@ -0,0 +1,175 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2022-09-20T00:22:37Z</Created>
+ <LastSaved>2022-09-20T01:16:51Z</LastSaved>
+ <Version>16.00</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <AllowPNG/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>12315</WindowHeight>
+ <WindowWidth>28800</WindowWidth>
+ <WindowTopX>32767</WindowTopX>
+ <WindowTopY>32767</WindowTopY>
+ <ActiveSheet>1</ActiveSheet>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ <Style ss:ID="s27" ss:Name="Bad">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#800000"/>
+ <Interior ss:Color="#FFC7CE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s26" ss:Name="Good">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#008000"/>
+ <Interior ss:Color="#C6EFCE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s28" ss:Name="Neutral">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#993300"/>
+ <Interior ss:Color="#FFEB9C" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s35" ss:Name="Note">
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"
+ ss:Color="#B2B2B2"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"
+ ss:Color="#B2B2B2"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"
+ ss:Color="#B2B2B2"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"
+ ss:Color="#B2B2B2"/>
+ </Borders>
+ <Interior ss:Color="#FFFFCC" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s69" ss:Parent="s35">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
+ </Style>
+ <Style ss:ID="s70">
+ <Interior ss:Color="#92D050" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s71" ss:Parent="s27">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#800000"/>
+ <Interior ss:Color="#92D050" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s72" ss:Parent="s26">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#008000"/>
+ <Interior ss:Color="#92D050" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s73" ss:Parent="s28">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#993300"/>
+ <Interior ss:Color="#92D050" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s74" ss:Parent="s35">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
+ <Interior ss:Color="#92D050" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s75">
+ <Interior ss:Color="#FFC000" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s76" ss:Parent="s27">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#800000"/>
+ <Interior ss:Color="#FFC000" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s77" ss:Parent="s26">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#008000"/>
+ <Interior ss:Color="#FFC000" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s78" ss:Parent="s28">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#993300"/>
+ <Interior ss:Color="#FFC000" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s79" ss:Parent="s35">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
+ <Interior ss:Color="#FFC000" ss:Pattern="Solid"/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Sheet1">
+ <Table ss:ExpandedColumnCount="6" ss:ExpandedRowCount="11" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Column ss:Index="2" ss:StyleID="s27"/>
+ <Column ss:StyleID="s26"/>
+ <Column ss:StyleID="s28"/>
+ <Column ss:Index="6" ss:StyleID="s69"/>
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="String">Normal</Data></Cell>
+ <Cell><Data ss:Type="String">Bad</Data></Cell>
+ <Cell><Data ss:Type="String">Good</Data></Cell>
+ <Cell><Data ss:Type="String">Neutral</Data></Cell>
+ <Cell><Data ss:Type="String">Normal</Data></Cell>
+ <Cell><Data ss:Type="String">Note</Data></Cell>
+ </Row>
+ <Row ss:Index="10" ss:AutoFitHeight="0" ss:StyleID="s70">
+ <Cell><Data ss:Type="String">Green background on row 10</Data></Cell>
+ <Cell ss:StyleID="s71"/>
+ <Cell ss:StyleID="s72"/>
+ <Cell ss:StyleID="s73"/>
+ <Cell ss:Index="6" ss:StyleID="s74"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:StyleID="s75">
+ <Cell><Data ss:Type="String">Orange background on row 11</Data></Cell>
+ <Cell ss:StyleID="s76"/>
+ <Cell ss:StyleID="s77"/>
+ <Cell ss:StyleID="s78"/>
+ <Cell ss:Index="6" ss:StyleID="s79"/>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Unsynced/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>10</ActiveRow>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+ <Worksheet ss:Name="Sheet2">
+ <Table ss:ExpandedColumnCount="4" ss:ExpandedRowCount="1" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Column ss:Index="2" ss:StyleID="s26" ss:Span="2"/>
+ <Row>
+ <Cell ss:Index="2"><Data ss:Type="String">Good style on columns B:D</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Selected/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveCol>1</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/test/xls-xml/styles/data-offset.xml b/test/xls-xml/styles/data-offset.xml
new file mode 100644
index 0000000..60ff78f
--- /dev/null
+++ b/test/xls-xml/styles/data-offset.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40">
+<Styles>
+<Style ss:ID="s1"><Font ss:Bold="1" ss:Color="#008000"/><NumberFormat ss:Format="0.00_ ;[Red]\-0.00\ "/></Style>
+<Style ss:ID="s2"><Font ss:Color="red"/></Style>
+<Style ss:ID="s3"><Font ss:Color="blue"/><NumberFormat ss:Format="yyyy/mm\-dd;@"/></Style>
+</Styles>
+<Worksheet ss:Name="Sheet1">
+<Table ss:TopCell="2" ss:LeftCell="2" ss:DefaultColumnWidth="20" ss:ExpandedColumnCount="3">
+<Column ss:StyleID="s1" ss:AutoFitWidth="1"/>
+<Column ss:StyleID="s2"/>
+<Column ss:StyleID="s3" ss:Index="3" ss:AutoFitWidth="1"/>
+<Row ss:StyleID="s1">
+<Cell ss:Index="2"><Data ss:Type="String">Title</Data></Cell>
+</Row>
+<Row>
+<Cell><Data ss:Type="Number">111</Data></Cell>
+<Cell><Data ss:Type="String">aaaa</Data></Cell>
+<Cell><Data ss:Type="DateTime">1999-04-01</Data></Cell>
+</Row>
+<Row>
+<Cell><Data ss:Type="Number">2222</Data></Cell>
+<Cell><Data ss:Type="String">bbbb</Data></Cell>
+<Cell><Data ss:Type="DateTime">1999-04-02T00:00:00.000</Data></Cell>
+</Row>
+</Table>
+</Worksheet>
+</Workbook> \ No newline at end of file
diff --git a/test/xls-xml/styles/direct-format.xml b/test/xls-xml/styles/direct-format.xml
new file mode 100644
index 0000000..4a45a94
--- /dev/null
+++ b/test/xls-xml/styles/direct-format.xml
@@ -0,0 +1,97 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2022-09-20T21:06:33Z</Created>
+ <Version>16.00</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <AllowPNG/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>12315</WindowHeight>
+ <WindowWidth>28800</WindowWidth>
+ <WindowTopX>32767</WindowTopX>
+ <WindowTopY>32767</WindowTopY>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ <Style ss:ID="s26" ss:Name="Good">
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#006100"/>
+ <Interior ss:Color="#C6EFCE" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s65">
+ <Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+ </Borders>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"
+ ss:Bold="1"/>
+ </Style>
+ <Style ss:ID="s70">
+ <Alignment ss:Horizontal="Right" ss:Vertical="Bottom" ss:WrapText="1"/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="14" ss:Color="#375623"/>
+ <Interior ss:Color="#FFFF00" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s74" ss:Parent="s26">
+ <Alignment ss:Horizontal="Center" ss:Vertical="Bottom" ss:WrapText="1"/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#006100"
+ ss:Bold="1"/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Sheet1">
+ <Table ss:ExpandedColumnCount="4" ss:ExpandedRowCount="8" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Column ss:Index="2" ss:AutoFitWidth="0" ss:Width="178.5"/>
+ <Column ss:Index="4" ss:AutoFitWidth="0" ss:Width="122.25"/>
+ <Row ss:Index="2">
+ <Cell ss:Index="2" ss:StyleID="s65"><Data ss:Type="String">Bold and underlined</Data></Cell>
+ </Row>
+ <Row ss:Index="4" ss:Height="56.25">
+ <Cell ss:Index="2" ss:StyleID="s70"><Data ss:Type="String">Yellow background&#10;and&#10;right aligned</Data></Cell>
+ </Row>
+ <Row ss:Index="6" ss:AutoFitHeight="0" ss:Height="33">
+ <Cell ss:Index="4" ss:StyleID="s26"><Data ss:Type="String">Named Format (Good)</Data></Cell>
+ </Row>
+ <Row ss:Index="8" ss:Height="30">
+ <Cell ss:Index="4" ss:StyleID="s74"><Data ss:Type="String">Named Format (Good) plus direct format on top</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Print>
+ <ValidPrinterInfo/>
+ <VerticalResolution>0</VerticalResolution>
+ </Print>
+ <Selected/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>10</ActiveRow>
+ <ActiveCol>3</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/test/xls-xml/table-offset/check.txt b/test/xls-xml/table-offset/check.txt
new file mode 100644
index 0000000..faf6c69
--- /dev/null
+++ b/test/xls-xml/table-offset/check.txt
@@ -0,0 +1,7 @@
+Sheet1/1/2:string:"Title"
+Sheet1/2/1:numeric:111
+Sheet1/2/2:string:"aaaa"
+Sheet1/2/3:numeric:36251
+Sheet1/3/1:numeric:2222
+Sheet1/3/2:string:"bbbb"
+Sheet1/3/3:numeric:36252
diff --git a/test/xls-xml/table-offset/input.xml b/test/xls-xml/table-offset/input.xml
new file mode 100644
index 0000000..b3770ad
--- /dev/null
+++ b/test/xls-xml/table-offset/input.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40">
+ <Styles>
+ <Style ss:ID="s1">
+ <Font ss:Bold="1" ss:Color="#008000"/>
+ <NumberFormat ss:Format="0.00_ ;[Red]\-0.00\ "/>
+ </Style>
+ <Style ss:ID="s2">
+ <Font ss:Color="red"/>
+ </Style>
+ <Style ss:ID="s3">
+ <Font ss:Color="blue"/>
+ <NumberFormat ss:Format="yyyy/mm\-dd;@"/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Sheet1">
+ <Table ss:TopCell="2" ss:LeftCell="2" ss:DefaultColumnWidth="20" ss:ExpandedColumnCount="3">
+ <Column ss:StyleID="s1" ss:AutoFitWidth="1"/>
+ <Column ss:StyleID="s2"/>
+ <Column ss:StyleID="s3" ss:Index="3" ss:AutoFitWidth="1"/>
+ <Row ss:StyleID="s1">
+ <Cell ss:Index="2">
+ <Data ss:Type="String">Title</Data>
+ </Cell>
+ </Row>
+ <Row>
+ <Cell>
+ <Data ss:Type="Number">111</Data>
+ </Cell>
+ <Cell>
+ <Data ss:Type="String">aaaa</Data>
+ </Cell>
+ <Cell>
+ <Data ss:Type="DateTime">1999-04-01</Data>
+ </Cell>
+ </Row>
+ <Row>
+ <Cell>
+ <Data ss:Type="Number">2222</Data>
+ </Cell>
+ <Cell>
+ <Data ss:Type="String">bbbb</Data>
+ </Cell>
+ <Cell>
+ <Data ss:Type="DateTime">1999-04-02T00:00:00.000</Data>
+ </Cell>
+ </Row>
+ </Table>
+ </Worksheet>
+</Workbook>
diff --git a/test/xls-xml/table/autofilter.xml b/test/xls-xml/table/autofilter.xml
new file mode 100644
index 0000000..6a65df8
--- /dev/null
+++ b/test/xls-xml/table/autofilter.xml
@@ -0,0 +1,180 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2013-11-02T20:32:38Z</Created>
+ <LastSaved>2017-03-03T02:41:39Z</LastSaved>
+ <Version>15.00</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <AllowPNG/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>9525</WindowHeight>
+ <WindowWidth>19155</WindowWidth>
+ <WindowTopX>0</WindowTopX>
+ <WindowTopY>75</WindowTopY>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ <Style ss:ID="s16">
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
+ </Borders>
+ </Style>
+ <Style ss:ID="s17">
+ <Borders>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+ </Borders>
+ </Style>
+ <Style ss:ID="s18">
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
+ </Borders>
+ </Style>
+ <Style ss:ID="s19">
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+ </Borders>
+ </Style>
+ <Style ss:ID="s20">
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+ </Borders>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"
+ ss:Bold="1"/>
+ <Interior ss:Color="#92D050" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s21">
+ <Borders>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+ </Borders>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"
+ ss:Bold="1"/>
+ <Interior ss:Color="#92D050" ss:Pattern="Solid"/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Filter">
+ <Names>
+ <NamedRange ss:Name="_FilterDatabase" ss:RefersTo="=Filter!R2C2:R11C3"
+ ss:Hidden="1"/>
+ </Names>
+ <Table ss:ExpandedColumnCount="3" ss:ExpandedRowCount="11" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Row ss:Index="2">
+ <Cell ss:Index="2" ss:StyleID="s20"><Data ss:Type="String">Field1</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s21"><Data ss:Type="String">Field2</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row>
+ <Cell ss:Index="2" ss:StyleID="s16"><Data ss:Type="String">A</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s17"><Data ss:Type="Number">1</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:Hidden="1">
+ <Cell ss:Index="2" ss:StyleID="s16"><Data ss:Type="String">B</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s17"><Data ss:Type="Number">2</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row>
+ <Cell ss:Index="2" ss:StyleID="s16"><Data ss:Type="String">C</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s17"><Data ss:Type="Number">1</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:Hidden="1">
+ <Cell ss:Index="2" ss:StyleID="s16"><Data ss:Type="String">A</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s17"><Data ss:Type="Number">2</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:Hidden="1">
+ <Cell ss:Index="2" ss:StyleID="s16"><Data ss:Type="String">B</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s17"><Data ss:Type="Number">1</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:Hidden="1">
+ <Cell ss:Index="2" ss:StyleID="s16"><Data ss:Type="String">C</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s17"><Data ss:Type="Number">2</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row>
+ <Cell ss:Index="2" ss:StyleID="s16"><Data ss:Type="String">A</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s17"><Data ss:Type="Number">1</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:Hidden="1">
+ <Cell ss:Index="2" ss:StyleID="s16"><Data ss:Type="String">B</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s17"><Data ss:Type="Number">2</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row>
+ <Cell ss:Index="2" ss:StyleID="s18"><Data ss:Type="String">C</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s19"><Data ss:Type="Number">1</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Print>
+ <ValidPrinterInfo/>
+ <HorizontalResolution>600</HorizontalResolution>
+ <VerticalResolution>600</VerticalResolution>
+ </Print>
+ <Selected/>
+ <FilterOn/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>15</ActiveRow>
+ <ActiveCol>3</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ <AutoFilter x:Range="R2C2:R11C3"
+ xmlns="urn:schemas-microsoft-com:office:excel">
+ <AutoFilterColumn x:Type="Custom">
+ <AutoFilterOr>
+ <AutoFilterCondition x:Operator="Equals" x:Value="A"/>
+ <AutoFilterCondition x:Operator="Equals" x:Value="C"/>
+ </AutoFilterOr>
+ </AutoFilterColumn>
+ <AutoFilterColumn x:Type="Custom">
+ <AutoFilterCondition x:Operator="Equals" x:Value="1"/>
+ </AutoFilterColumn>
+ </AutoFilter>
+ </Worksheet>
+</Workbook>
diff --git a/test/xls-xml/text-alignment/input.xml b/test/xls-xml/text-alignment/input.xml
new file mode 100644
index 0000000..c66e45d
--- /dev/null
+++ b/test/xls-xml/text-alignment/input.xml
@@ -0,0 +1,290 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2018-01-06T03:30:32Z</Created>
+ <LastSaved>2018-01-11T02:10:53Z</LastSaved>
+ <Version>16.00</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <AllowPNG/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>9855</WindowHeight>
+ <WindowWidth>11580</WindowWidth>
+ <WindowTopX>0</WindowTopX>
+ <WindowTopY>0</WindowTopY>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ <Style ss:ID="s16">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ </Style>
+ <Style ss:ID="s17">
+ <Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
+ </Style>
+ <Style ss:ID="s18">
+ <Alignment ss:Horizontal="Right" ss:Vertical="Bottom"/>
+ </Style>
+ <Style ss:ID="s19">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom" ss:Indent="2"/>
+ </Style>
+ <Style ss:ID="s20">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom" ss:Indent="1"/>
+ </Style>
+ <Style ss:ID="s21">
+ <Alignment ss:Horizontal="Right" ss:Vertical="Bottom" ss:Indent="1"/>
+ </Style>
+ <Style ss:ID="s22">
+ <Alignment ss:Horizontal="Right" ss:Vertical="Bottom" ss:Indent="2"/>
+ </Style>
+ <Style ss:ID="s23">
+ <Alignment ss:Vertical="Center"/>
+ </Style>
+ <Style ss:ID="s24">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Center"/>
+ </Style>
+ <Style ss:ID="s25">
+ <Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
+ </Style>
+ <Style ss:ID="s26">
+ <Alignment ss:Horizontal="Right" ss:Vertical="Center"/>
+ </Style>
+ <Style ss:ID="s27">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Center" ss:Indent="1"/>
+ </Style>
+ <Style ss:ID="s28">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Center" ss:Indent="2"/>
+ </Style>
+ <Style ss:ID="s29">
+ <Alignment ss:Horizontal="Right" ss:Vertical="Center" ss:Indent="1"/>
+ </Style>
+ <Style ss:ID="s30">
+ <Alignment ss:Horizontal="Right" ss:Vertical="Center" ss:Indent="2"/>
+ </Style>
+ <Style ss:ID="s31">
+ <Alignment ss:Vertical="Top"/>
+ </Style>
+ <Style ss:ID="s32">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Top"/>
+ </Style>
+ <Style ss:ID="s33">
+ <Alignment ss:Horizontal="Center" ss:Vertical="Top"/>
+ </Style>
+ <Style ss:ID="s34">
+ <Alignment ss:Horizontal="Right" ss:Vertical="Top"/>
+ </Style>
+ <Style ss:ID="s35">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Top" ss:Indent="1"/>
+ </Style>
+ <Style ss:ID="s36">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Top" ss:Indent="2"/>
+ </Style>
+ <Style ss:ID="s37">
+ <Alignment ss:Horizontal="Right" ss:Vertical="Top" ss:Indent="1"/>
+ </Style>
+ <Style ss:ID="s38">
+ <Alignment ss:Horizontal="Right" ss:Vertical="Top" ss:Indent="2"/>
+ </Style>
+ <Style ss:ID="s39">
+ <Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"
+ ss:Bold="1"/>
+ </Style>
+ <Style ss:ID="s40">
+ <Alignment ss:Vertical="Justify" ss:WrapText="1"/>
+ </Style>
+ <Style ss:ID="s41">
+ <Alignment ss:Horizontal="Justify" ss:Vertical="Bottom" ss:WrapText="1"/>
+ </Style>
+ <Style ss:ID="s119">
+ <Alignment ss:Horizontal="Distributed" ss:Vertical="Distributed" ss:WrapText="1"/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Sheet1">
+ <Table ss:ExpandedColumnCount="3" ss:ExpandedRowCount="28" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Column ss:AutoFitWidth="0" ss:Width="74.25"/>
+ <Column ss:AutoFitWidth="0" ss:Width="68.25"/>
+ <Column ss:AutoFitWidth="0" ss:Width="135"/>
+ <Row>
+ <Cell ss:StyleID="s39"><Data ss:Type="String">Horizontal</Data></Cell>
+ <Cell ss:StyleID="s39"><Data ss:Type="String">Vertical</Data></Cell>
+ <Cell ss:StyleID="s39"><Data ss:Type="String">Content</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="24.9375">
+ <Cell><Data ss:Type="String">General</Data></Cell>
+ <Cell><Data ss:Type="String">Bottom</Data></Cell>
+ <Cell><Data ss:Type="String">Text</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="24.9375">
+ <Cell><Data ss:Type="String">Left</Data></Cell>
+ <Cell><Data ss:Type="String">Bottom</Data></Cell>
+ <Cell ss:StyleID="s16"><Data ss:Type="String">Text</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="24.9375">
+ <Cell><Data ss:Type="String">Center</Data></Cell>
+ <Cell><Data ss:Type="String">Bottom</Data></Cell>
+ <Cell ss:StyleID="s17"><Data ss:Type="String">Text</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="24.9375">
+ <Cell><Data ss:Type="String">Right</Data></Cell>
+ <Cell><Data ss:Type="String">Bottom</Data></Cell>
+ <Cell ss:StyleID="s18"><Data ss:Type="String">Text</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="24.9375">
+ <Cell><Data ss:Type="String">Left Indent 1</Data></Cell>
+ <Cell><Data ss:Type="String">Bottom</Data></Cell>
+ <Cell ss:StyleID="s20"><Data ss:Type="String">Text</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="24.9375">
+ <Cell><Data ss:Type="String">Left Indent 2</Data></Cell>
+ <Cell><Data ss:Type="String">Bottom</Data></Cell>
+ <Cell ss:StyleID="s19"><Data ss:Type="String">Text</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="24.9375">
+ <Cell><Data ss:Type="String">Right Indent 1</Data></Cell>
+ <Cell><Data ss:Type="String">Bottom</Data></Cell>
+ <Cell ss:StyleID="s21"><Data ss:Type="String">Text</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="24.9375">
+ <Cell><Data ss:Type="String">Right Indent 2</Data></Cell>
+ <Cell><Data ss:Type="String">Bottom</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">Text</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="24.9375">
+ <Cell><Data ss:Type="String">General</Data></Cell>
+ <Cell><Data ss:Type="String">Center</Data></Cell>
+ <Cell ss:StyleID="s23"><Data ss:Type="String">Text</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="24.9375">
+ <Cell><Data ss:Type="String">Left</Data></Cell>
+ <Cell><Data ss:Type="String">Center</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Text</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="24.9375">
+ <Cell><Data ss:Type="String">Center</Data></Cell>
+ <Cell><Data ss:Type="String">Center</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Text</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="24.9375">
+ <Cell><Data ss:Type="String">Right</Data></Cell>
+ <Cell><Data ss:Type="String">Center</Data></Cell>
+ <Cell ss:StyleID="s26"><Data ss:Type="String">Text</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="24.9375">
+ <Cell><Data ss:Type="String">Left Indent 1</Data></Cell>
+ <Cell><Data ss:Type="String">Center</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Text</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="24.9375">
+ <Cell><Data ss:Type="String">Left Indent 2</Data></Cell>
+ <Cell><Data ss:Type="String">Center</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Text</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="24.9375">
+ <Cell><Data ss:Type="String">Right Indent 1</Data></Cell>
+ <Cell><Data ss:Type="String">Center</Data></Cell>
+ <Cell ss:StyleID="s29"><Data ss:Type="String">Text</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="24.9375">
+ <Cell><Data ss:Type="String">Right Indent 2</Data></Cell>
+ <Cell><Data ss:Type="String">Center</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">Text</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="24.9375">
+ <Cell><Data ss:Type="String">General</Data></Cell>
+ <Cell><Data ss:Type="String">Top</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">Text</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="24.9375">
+ <Cell><Data ss:Type="String">Left</Data></Cell>
+ <Cell><Data ss:Type="String">Top</Data></Cell>
+ <Cell ss:StyleID="s32"><Data ss:Type="String">Text</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="24.9375">
+ <Cell><Data ss:Type="String">Center</Data></Cell>
+ <Cell><Data ss:Type="String">Top</Data></Cell>
+ <Cell ss:StyleID="s33"><Data ss:Type="String">Text</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="24.9375">
+ <Cell><Data ss:Type="String">Right</Data></Cell>
+ <Cell><Data ss:Type="String">Top</Data></Cell>
+ <Cell ss:StyleID="s34"><Data ss:Type="String">Text</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="24.9375">
+ <Cell><Data ss:Type="String">Left Indent 1</Data></Cell>
+ <Cell><Data ss:Type="String">Top</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Text</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="24.9375">
+ <Cell><Data ss:Type="String">Left Indent 2</Data></Cell>
+ <Cell><Data ss:Type="String">Top</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">Text</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="24.9375">
+ <Cell><Data ss:Type="String">Right Indent 1</Data></Cell>
+ <Cell><Data ss:Type="String">Top</Data></Cell>
+ <Cell ss:StyleID="s37"><Data ss:Type="String">Text</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="24.9375">
+ <Cell><Data ss:Type="String">Right Indent 2</Data></Cell>
+ <Cell><Data ss:Type="String">Top</Data></Cell>
+ <Cell ss:StyleID="s38"><Data ss:Type="String">Text</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="52.5">
+ <Cell><Data ss:Type="String">General</Data></Cell>
+ <Cell><Data ss:Type="String">Justify</Data></Cell>
+ <Cell ss:StyleID="s40"><Data ss:Type="String">Vertical justification looks like this.</Data></Cell>
+ </Row>
+ <Row ss:Height="45">
+ <Cell><Data ss:Type="String">Justify</Data></Cell>
+ <Cell><Data ss:Type="String">Bottom</Data></Cell>
+ <Cell ss:StyleID="s41"><Data ss:Type="String">Horizontal justification looks like this.</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="43.5">
+ <Cell><Data ss:Type="String">Distributed</Data></Cell>
+ <Cell><Data ss:Type="String">Distributed</Data></Cell>
+ <Cell ss:StyleID="s119"><Data ss:Type="String">Both horizontally and vertically distributed.</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Print>
+ <ValidPrinterInfo/>
+ <HorizontalResolution>600</HorizontalResolution>
+ <VerticalResolution>600</VerticalResolution>
+ </Print>
+ <Selected/>
+ <TopRowVisible>18</TopRowVisible>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>27</ActiveRow>
+ <ActiveCol>2</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/test/xls-xml/unnamed-parent-styles/check.txt b/test/xls-xml/unnamed-parent-styles/check.txt
new file mode 100644
index 0000000..0772827
--- /dev/null
+++ b/test/xls-xml/unnamed-parent-styles/check.txt
@@ -0,0 +1,37 @@
+Sheet #1/0/0:string:"Date"
+Sheet #1/0/1:string:"Pinnacle Inlet"
+Sheet #1/0/2:string:"Pinnacle Sales"
+Sheet #1/0/3:string:"Cryo Inlet"
+Sheet #1/0/4:string:"Cryo Sales"
+Sheet #1/0/5:string:"NGL Sales"
+Sheet #1/0/6:string:"Anadarko Sales"
+Sheet #1/0/7:string:"Combined"
+Sheet #1/0/8:string:"Capitan"
+Sheet #1/0/9:string:"+ / -"
+Sheet #1/1/0:string:"8/19/2021"
+Sheet #1/2/0:string:"8/20/2021"
+Sheet #1/3/0:string:"8/21/2021"
+Sheet #1/4/0:string:"8/22/2021"
+Sheet #1/5/0:string:"8/23/2021"
+Sheet #1/6/0:string:"8/24/2021"
+Sheet #1/7/0:string:"8/25/2021"
+Sheet #1/8/0:string:"Aug-2021"
+Sheet #1/8/1:numeric:0
+Sheet #1/8/2:numeric:0
+Sheet #1/8/3:numeric:0
+Sheet #1/8/4:numeric:0
+Sheet #1/8/5:numeric:0
+Sheet #1/8/6:numeric:0
+Sheet #1/8/7:numeric:0
+Sheet #1/8/8:numeric:0
+Sheet #1/8/9:numeric:0
+Sheet #1/10/0:string:"Grand totals"
+Sheet #1/10/1:numeric:0
+Sheet #1/10/2:numeric:0
+Sheet #1/10/3:numeric:0
+Sheet #1/10/4:numeric:0
+Sheet #1/10/5:numeric:0
+Sheet #1/10/6:numeric:0
+Sheet #1/10/7:numeric:0
+Sheet #1/10/8:numeric:0
+Sheet #1/10/9:numeric:0
diff --git a/test/xls-xml/unnamed-parent-styles/input.xml b/test/xls-xml/unnamed-parent-styles/input.xml
new file mode 100644
index 0000000..6f124b5
--- /dev/null
+++ b/test/xls-xml/unnamed-parent-styles/input.xml
@@ -0,0 +1,447 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http:www.w3.org/TR/REC-html40">
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>600</WindowHeight>
+ <WindowWidth>800</WindowWidth>
+ <WindowTopX>0</WindowTopX>
+ <WindowTopY>0</WindowTopY>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Horizontal="Left"/>
+ <Font ss:FontName="Arial" ss:Size="10" ss:Color="#000000"/>
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous"/>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous"/>
+ </Borders>
+ </Style>
+ <Style ss:ID="d" ss:Parent="Default">
+ <NumberFormat ss:Format="dd/mm/yyyy"/>
+ </Style>
+ <Style ss:ID="s" ss:Parent="Default">
+ <Alignment ss:Horizontal="Left"/>
+ </Style>
+ <Style ss:ID="sb" ss:Parent="s">
+ <Font ss:Bold="1"/>
+ </Style>
+ <Style ss:ID="sgrey" ss:Parent="s">
+ <Interior ss:Color="#e4e4e4" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="n" ss:Parent="Default">
+ <NumberFormat ss:Format="#,##0"/>
+ <Alignment ss:Horizontal="Right"/>
+ <Interior ss:Pattern="None"/>
+ </Style>
+ <Style ss:ID="n1" ss:Parent="n">
+ <NumberFormat ss:Format="#,##0.0"/>
+ </Style>
+ <Style ss:ID="n2" ss:Parent="n">
+ <NumberFormat ss:Format="#,##0.00"/>
+ </Style>
+ <Style ss:ID="h" ss:Parent="Default">
+ <Font ss:Bold="1" ss:Size="10"/>
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous"/>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="2"/>
+ </Borders>
+ </Style>
+ <Style ss:ID="hc" ss:Parent="h">
+ <Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
+ </Style>
+ <Style ss:ID="hr" ss:Parent="h">
+ <Alignment ss:Horizontal="Right" ss:Vertical="Bottom"/>
+ </Style>
+ </Styles>
+ <ss:Worksheet ss:Name="Sheet #1">
+ <Table>
+ <Column ss:Width="130.0000"/>
+ <Column ss:Width="118.0000"/>
+ <Column ss:Width="130.0000"/>
+ <Column ss:Width="88.0000"/>
+ <Column ss:Width="99.0000"/>
+ <Column ss:Width="97.0000"/>
+ <Column ss:Width="137.0000"/>
+ <Column ss:Width="93.0000"/>
+ <Column ss:Width="74.0000"/>
+ <Column ss:Width="50.0000"/>
+ <Row>
+ <Cell ss:StyleID="h">
+ <Data ss:Type="String">Date</Data>
+ </Cell>
+ <Cell ss:StyleID="h">
+ <Data ss:Type="String">Pinnacle Inlet</Data>
+ </Cell>
+ <Cell ss:StyleID="h">
+ <Data ss:Type="String">Pinnacle Sales</Data>
+ </Cell>
+ <Cell ss:StyleID="h">
+ <Data ss:Type="String">Cryo Inlet</Data>
+ </Cell>
+ <Cell ss:StyleID="h">
+ <Data ss:Type="String">Cryo Sales</Data>
+ </Cell>
+ <Cell ss:StyleID="h">
+ <Data ss:Type="String">NGL Sales</Data>
+ </Cell>
+ <Cell ss:StyleID="h">
+ <Data ss:Type="String">Anadarko Sales</Data>
+ </Cell>
+ <Cell ss:StyleID="h">
+ <Data ss:Type="String">Combined</Data>
+ </Cell>
+ <Cell ss:StyleID="h">
+ <Data ss:Type="String">Capitan</Data>
+ </Cell>
+ <Cell ss:StyleID="h">
+ <Data ss:Type="String">+ / -</Data>
+ </Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="d">
+ <Data ss:Type="String">8/19/2021</Data>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="d">
+ <Data ss:Type="String">8/20/2021</Data>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="d">
+ <Data ss:Type="String">8/21/2021</Data>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="d">
+ <Data ss:Type="String">8/22/2021</Data>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="d">
+ <Data ss:Type="String">8/23/2021</Data>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="d">
+ <Data ss:Type="String">8/24/2021</Data>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="d">
+ <Data ss:Type="String">8/25/2021</Data>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="String"/>
+ </Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="sb">
+ <Data ss:Type="String">Aug-2021</Data>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="Number">0.0</Data>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="Number">0.0</Data>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="Number">0.0</Data>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="Number">0.0</Data>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="Number">0.0</Data>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="Number">0.0</Data>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="Number">0.0</Data>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="Number">0.0</Data>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="Number">0.0</Data>
+ </Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="sb">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="sb">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="sb">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="sb">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="sb">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="sb">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="sb">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="sb">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="sb">
+ <Data ss:Type="String"/>
+ </Cell>
+ <Cell ss:StyleID="sb">
+ <Data ss:Type="String"/>
+ </Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="sb">
+ <Data ss:Type="String">Grand totals</Data>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="Number">0.0</Data>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="Number">0.0</Data>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="Number">0.0</Data>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="Number">0.0</Data>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="Number">0.0</Data>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="Number">0.0</Data>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="Number">0.0</Data>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="Number">0.0</Data>
+ </Cell>
+ <Cell ss:StyleID="n1">
+ <Data ss:Type="Number">0.0</Data>
+ </Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <Selected/>
+ <FreezePanes/>
+ <FrozenNoSplit/>
+ <SplitHorizontal>1</SplitHorizontal>
+ <TopRowBottomPane>1</TopRowBottomPane>
+ <ActivePane>2</ActivePane>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ </Pane>
+ <Pane>
+ <Number>2</Number>
+ <ActiveRow>2</ActiveRow>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </ss:Worksheet>
+</Workbook>
diff --git a/test/xls-xml/view/cursor-per-sheet.xml b/test/xls-xml/view/cursor-per-sheet.xml
new file mode 100644
index 0000000..db7e2df
--- /dev/null
+++ b/test/xls-xml/view/cursor-per-sheet.xml
@@ -0,0 +1,164 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2017-04-27T02:41:27Z</Created>
+ <LastSaved>2017-05-09T20:36:09Z</LastSaved>
+ <Version>16.00</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <AllowPNG/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>8760</WindowHeight>
+ <WindowWidth>19680</WindowWidth>
+ <WindowTopX>0</WindowTopX>
+ <WindowTopY>0</WindowTopY>
+ <ActiveSheet>2</ActiveSheet>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ <Style ss:ID="s57">
+ <Interior ss:Color="#FFFF00" ss:Pattern="Solid"/>
+ </Style>
+ <Style ss:ID="s58">
+ <Interior ss:Color="#FFE699" ss:Pattern="Solid"/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Sheet1">
+ <Table ss:ExpandedColumnCount="3" ss:ExpandedRowCount="4" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Row ss:AutoFitHeight="0"/>
+ <Row ss:Index="4" ss:AutoFitHeight="0">
+ <Cell ss:Index="3" ss:StyleID="s57"><Data ss:Type="String">cursor</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Unsynced/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>3</ActiveRow>
+ <ActiveCol>2</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+ <Worksheet ss:Name="Sheet2">
+ <Table ss:ExpandedColumnCount="4" ss:ExpandedRowCount="8" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Row ss:AutoFitHeight="0"/>
+ <Row ss:Index="8" ss:AutoFitHeight="0">
+ <Cell ss:Index="4" ss:StyleID="s57"><Data ss:Type="String">cursor</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Unsynced/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>7</ActiveRow>
+ <ActiveCol>3</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+ <Worksheet ss:Name="Sheet3">
+ <Table ss:ExpandedColumnCount="4" ss:ExpandedRowCount="2" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Row ss:AutoFitHeight="0"/>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:Index="4" ss:StyleID="s57"><Data ss:Type="String">cursor</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Unsynced/>
+ <Selected/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>1</ActiveRow>
+ <ActiveCol>3</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+ <Worksheet ss:Name="Sheet4">
+ <Table ss:ExpandedColumnCount="5" ss:ExpandedRowCount="8" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Row ss:Index="5">
+ <Cell ss:Index="3" ss:StyleID="s58"><Data ss:Type="String">top-left</Data></Cell>
+ <Cell ss:StyleID="s58"/>
+ <Cell ss:StyleID="s58"/>
+ </Row>
+ <Row>
+ <Cell ss:Index="3" ss:StyleID="s58"/>
+ <Cell ss:StyleID="s58"/>
+ <Cell ss:StyleID="s58"/>
+ </Row>
+ <Row>
+ <Cell ss:Index="3" ss:StyleID="s58"/>
+ <Cell ss:StyleID="s58"/>
+ <Cell ss:StyleID="s58"/>
+ </Row>
+ <Row>
+ <Cell ss:Index="3" ss:StyleID="s58"/>
+ <Cell ss:StyleID="s58"/>
+ <Cell ss:StyleID="s58"><Data ss:Type="String">bottom-right</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>4</ActiveRow>
+ <ActiveCol>2</ActiveCol>
+ <RangeSelection>R5C3:R8C5</RangeSelection>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/test/xls-xml/view/cursor-split-pane.xml b/test/xls-xml/view/cursor-split-pane.xml
new file mode 100644
index 0000000..7a67630
--- /dev/null
+++ b/test/xls-xml/view/cursor-split-pane.xml
@@ -0,0 +1,270 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2017-04-27T02:47:16Z</Created>
+ <LastSaved>2017-06-09T21:45:20Z</LastSaved>
+ <Version>16.00</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <AllowPNG/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>8760</WindowHeight>
+ <WindowWidth>19680</WindowWidth>
+ <WindowTopX>0</WindowTopX>
+ <WindowTopY>0</WindowTopY>
+ <TabRatio>841</TabRatio>
+ <ActiveSheet>3</ActiveSheet>
+ <FirstVisibleSheet>3</FirstVisibleSheet>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ <Style ss:ID="s57">
+ <Interior ss:Color="#FFFF00" ss:Pattern="Solid"/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Sheet1">
+ <Table ss:ExpandedColumnCount="10" ss:ExpandedRowCount="17" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Row ss:AutoFitHeight="0"/>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:Index="10" ss:StyleID="s57"><Data ss:Type="String">cursor</Data></Cell>
+ </Row>
+ <Row ss:Index="4" ss:AutoFitHeight="0">
+ <Cell ss:Index="5" ss:StyleID="s57"><Data ss:Type="String">cursor</Data></Cell>
+ </Row>
+ <Row ss:Index="8" ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s57"><Data ss:Type="String">cursor</Data></Cell>
+ </Row>
+ <Row ss:Index="17" ss:AutoFitHeight="0">
+ <Cell ss:Index="10" ss:StyleID="s57"><Data ss:Type="String">cursor</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Unsynced/>
+ <SplitHorizontal>1800</SplitHorizontal>
+ <TopRowBottomPane>5</TopRowBottomPane>
+ <SplitVertical>5190</SplitVertical>
+ <LeftColumnRightPane>5</LeftColumnRightPane>
+ <ActivePane>2</ActivePane>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>3</ActiveRow>
+ <ActiveCol>4</ActiveCol>
+ </Pane>
+ <Pane>
+ <Number>1</Number>
+ <ActiveRow>1</ActiveRow>
+ <ActiveCol>9</ActiveCol>
+ </Pane>
+ <Pane>
+ <Number>2</Number>
+ <ActiveRow>7</ActiveRow>
+ </Pane>
+ <Pane>
+ <Number>0</Number>
+ <ActiveRow>16</ActiveRow>
+ <ActiveCol>9</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+ <Worksheet ss:Name="Sheet2">
+ <Table ss:ExpandedColumnCount="12" ss:ExpandedRowCount="23" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Row ss:Index="2">
+ <Cell ss:Index="3" ss:StyleID="s57"><Data ss:Type="String">top</Data></Cell>
+ <Cell ss:Index="8" ss:StyleID="s57"><Data ss:Type="String">left</Data></Cell>
+ <Cell ss:StyleID="s57"/>
+ <Cell ss:StyleID="s57"/>
+ <Cell ss:StyleID="s57"/>
+ <Cell ss:StyleID="s57"><Data ss:Type="String">right</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:Index="3" ss:StyleID="s57"/>
+ </Row>
+ <Row>
+ <Cell ss:Index="3" ss:StyleID="s57"/>
+ </Row>
+ <Row>
+ <Cell ss:Index="3" ss:StyleID="s57"/>
+ </Row>
+ <Row>
+ <Cell ss:Index="3" ss:StyleID="s57"><Data ss:Type="String">bottom</Data></Cell>
+ </Row>
+ <Row ss:Index="11">
+ <Cell ss:Index="8" ss:StyleID="s57"><Data ss:Type="String">top-left</Data></Cell>
+ <Cell ss:StyleID="s57"/>
+ <Cell ss:StyleID="s57"/>
+ </Row>
+ <Row>
+ <Cell ss:Index="8" ss:StyleID="s57"/>
+ <Cell ss:StyleID="s57"/>
+ <Cell ss:StyleID="s57"/>
+ </Row>
+ <Row>
+ <Cell ss:Index="8" ss:StyleID="s57"/>
+ <Cell ss:StyleID="s57"/>
+ <Cell ss:StyleID="s57"><Data ss:Type="String">bottom-right</Data></Cell>
+ </Row>
+ <Row ss:Index="18">
+ <Cell ss:Index="2" ss:StyleID="s57"><Data ss:Type="String">top-left</Data></Cell>
+ <Cell ss:StyleID="s57"/>
+ </Row>
+ <Row>
+ <Cell ss:Index="2" ss:StyleID="s57"/>
+ <Cell ss:StyleID="s57"/>
+ </Row>
+ <Row>
+ <Cell ss:Index="2" ss:StyleID="s57"/>
+ <Cell ss:StyleID="s57"/>
+ </Row>
+ <Row>
+ <Cell ss:Index="2" ss:StyleID="s57"/>
+ <Cell ss:StyleID="s57"/>
+ </Row>
+ <Row>
+ <Cell ss:Index="2" ss:StyleID="s57"/>
+ <Cell ss:StyleID="s57"/>
+ </Row>
+ <Row>
+ <Cell ss:Index="2" ss:StyleID="s57"/>
+ <Cell ss:StyleID="s57"><Data ss:Type="String">bottom-right</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <SplitHorizontal>2400</SplitHorizontal>
+ <TopRowBottomPane>7</TopRowBottomPane>
+ <SplitVertical>5190</SplitVertical>
+ <LeftColumnRightPane>5</LeftColumnRightPane>
+ <ActivePane>1</ActivePane>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>1</ActiveRow>
+ <ActiveCol>2</ActiveCol>
+ <RangeSelection>R2C3:R6C3</RangeSelection>
+ </Pane>
+ <Pane>
+ <Number>1</Number>
+ <ActiveRow>1</ActiveRow>
+ <ActiveCol>7</ActiveCol>
+ <RangeSelection>R2C8:R2C12</RangeSelection>
+ </Pane>
+ <Pane>
+ <Number>2</Number>
+ <ActiveRow>17</ActiveRow>
+ <ActiveCol>1</ActiveCol>
+ <RangeSelection>R18C2:R23C3</RangeSelection>
+ </Pane>
+ <Pane>
+ <Number>0</Number>
+ <ActiveRow>10</ActiveRow>
+ <ActiveCol>7</ActiveCol>
+ <RangeSelection>R11C8:R13C10</RangeSelection>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+ <Worksheet ss:Name="Sheet3">
+ <Table ss:ExpandedColumnCount="4" ss:ExpandedRowCount="9" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Row ss:Index="2">
+ <Cell ss:Index="4" ss:StyleID="s57"><Data ss:Type="String">cursor</Data></Cell>
+ </Row>
+ <Row ss:Index="9">
+ <Cell ss:Index="3" ss:StyleID="s57"><Data ss:Type="String">cursor</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <SplitHorizontal>1500</SplitHorizontal>
+ <TopRowBottomPane>4</TopRowBottomPane>
+ <ActivePane>2</ActivePane>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>1</ActiveRow>
+ <ActiveCol>3</ActiveCol>
+ </Pane>
+ <Pane>
+ <Number>2</Number>
+ <ActiveRow>8</ActiveRow>
+ <ActiveCol>2</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+ <Worksheet ss:Name="Sheet4">
+ <Table ss:ExpandedColumnCount="9" ss:ExpandedRowCount="18" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Row ss:Index="11">
+ <Cell ss:Index="9" ss:StyleID="s57"><Data ss:Type="String">cursor</Data></Cell>
+ </Row>
+ <Row ss:Index="18">
+ <Cell ss:Index="2" ss:StyleID="s57"><Data ss:Type="String">cursor</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Selected/>
+ <SplitVertical>4230</SplitVertical>
+ <LeftColumnRightPane>4</LeftColumnRightPane>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>17</ActiveRow>
+ <ActiveCol>1</ActiveCol>
+ </Pane>
+ <Pane>
+ <Number>1</Number>
+ <ActiveRow>10</ActiveRow>
+ <ActiveCol>8</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/test/xls-xml/view/frozen-pane.xml b/test/xls-xml/view/frozen-pane.xml
new file mode 100644
index 0000000..f00839a
--- /dev/null
+++ b/test/xls-xml/view/frozen-pane.xml
@@ -0,0 +1,155 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Kohei Yoshida</Author>
+ <LastAuthor>Kohei Yoshida</LastAuthor>
+ <Created>2017-06-09T21:52:57Z</Created>
+ <LastSaved>2017-06-09T21:55:27Z</LastSaved>
+ <Version>16.00</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <AllowPNG/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>12210</WindowHeight>
+ <WindowWidth>28800</WindowWidth>
+ <WindowTopX>0</WindowTopX>
+ <WindowTopY>0</WindowTopY>
+ <ActiveSheet>2</ActiveSheet>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ <Style ss:ID="s16">
+ <Interior ss:Color="#FFFF00" ss:Pattern="Solid"/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Sheet1">
+ <Table ss:ExpandedColumnCount="6" ss:ExpandedRowCount="12" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Column ss:Width="75.75"/>
+ <Row>
+ <Cell><Data ss:Type="String">Frozen Column</Data></Cell>
+ </Row>
+ <Row ss:Index="12">
+ <Cell ss:Index="6" ss:StyleID="s16"><Data ss:Type="String">cursor</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <FreezePanes/>
+ <FrozenNoSplit/>
+ <SplitVertical>1</SplitVertical>
+ <LeftColumnRightPane>1</LeftColumnRightPane>
+ <ActivePane>1</ActivePane>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ </Pane>
+ <Pane>
+ <Number>1</Number>
+ <ActiveRow>11</ActiveRow>
+ <ActiveCol>5</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+ <Worksheet ss:Name="Sheet2">
+ <Table ss:ExpandedColumnCount="6" ss:ExpandedRowCount="7" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Row>
+ <Cell><Data ss:Type="String">Frozen Row</Data></Cell>
+ </Row>
+ <Row ss:Index="7">
+ <Cell ss:Index="6" ss:StyleID="s16"><Data ss:Type="String">cursor</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <FreezePanes/>
+ <FrozenNoSplit/>
+ <SplitHorizontal>1</SplitHorizontal>
+ <TopRowBottomPane>1</TopRowBottomPane>
+ <ActivePane>2</ActivePane>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ </Pane>
+ <Pane>
+ <Number>2</Number>
+ <ActiveRow>6</ActiveRow>
+ <ActiveCol>5</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+ <Worksheet ss:Name="Sheet3">
+ <Table ss:ExpandedColumnCount="9" ss:ExpandedRowCount="16" x:FullColumns="1"
+ x:FullRows="1" ss:DefaultRowHeight="15">
+ <Row ss:Index="9">
+ <Cell ss:Index="5"><Data ss:Type="String">Frozen pane</Data></Cell>
+ </Row>
+ <Row ss:Index="16">
+ <Cell ss:Index="9" ss:StyleID="s16"><Data ss:Type="String">cursor</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Header x:Margin="0.3"/>
+ <Footer x:Margin="0.3"/>
+ <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
+ </PageSetup>
+ <Selected/>
+ <FreezePanes/>
+ <FrozenNoSplit/>
+ <SplitHorizontal>8</SplitHorizontal>
+ <TopRowBottomPane>8</TopRowBottomPane>
+ <SplitVertical>4</SplitVertical>
+ <LeftColumnRightPane>4</LeftColumnRightPane>
+ <ActivePane>0</ActivePane>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ </Pane>
+ <Pane>
+ <Number>1</Number>
+ </Pane>
+ <Pane>
+ <Number>2</Number>
+ </Pane>
+ <Pane>
+ <Number>0</Number>
+ <ActiveRow>15</ActiveRow>
+ <ActiveCol>8</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/test/xlsx/background-color/standard.xlsx b/test/xlsx/background-color/standard.xlsx
new file mode 100644
index 0000000..91de475
--- /dev/null
+++ b/test/xlsx/background-color/standard.xlsx
Binary files differ
diff --git a/test/xlsx/boolean-values/check.txt b/test/xlsx/boolean-values/check.txt
new file mode 100644
index 0000000..db2adbf
--- /dev/null
+++ b/test/xlsx/boolean-values/check.txt
@@ -0,0 +1,3 @@
+Sheet1/0/0:string:"Boolean Value"
+Sheet1/0/1:boolean:true
+Sheet1/0/2:boolean:false
diff --git a/test/xlsx/boolean-values/input.xlsx b/test/xlsx/boolean-values/input.xlsx
new file mode 100644
index 0000000..c2415cb
--- /dev/null
+++ b/test/xlsx/boolean-values/input.xlsx
Binary files differ
diff --git a/test/xlsx/borders/colors.xlsx b/test/xlsx/borders/colors.xlsx
new file mode 100644
index 0000000..c1f5400
--- /dev/null
+++ b/test/xlsx/borders/colors.xlsx
Binary files differ
diff --git a/test/xlsx/borders/directions.xlsx b/test/xlsx/borders/directions.xlsx
new file mode 100644
index 0000000..ce293ca
--- /dev/null
+++ b/test/xlsx/borders/directions.xlsx
Binary files differ
diff --git a/test/xlsx/borders/grid-box.xlsx b/test/xlsx/borders/grid-box.xlsx
new file mode 100644
index 0000000..9f52582
--- /dev/null
+++ b/test/xlsx/borders/grid-box.xlsx
Binary files differ
diff --git a/test/xlsx/borders/single-cells.xlsx b/test/xlsx/borders/single-cells.xlsx
new file mode 100644
index 0000000..95ed7ca
--- /dev/null
+++ b/test/xlsx/borders/single-cells.xlsx
Binary files differ
diff --git a/test/xlsx/cell-properties/wrap-and-shrink.xlsx b/test/xlsx/cell-properties/wrap-and-shrink.xlsx
new file mode 100644
index 0000000..cfc98d5
--- /dev/null
+++ b/test/xlsx/cell-properties/wrap-and-shrink.xlsx
Binary files differ
diff --git a/test/xlsx/column-width-row-height/input.xlsx b/test/xlsx/column-width-row-height/input.xlsx
new file mode 100644
index 0000000..b488590
--- /dev/null
+++ b/test/xlsx/column-width-row-height/input.xlsx
Binary files differ
diff --git a/test/xlsx/conditional-format/basic.xlsx b/test/xlsx/conditional-format/basic.xlsx
new file mode 100644
index 0000000..58dd589
--- /dev/null
+++ b/test/xlsx/conditional-format/basic.xlsx
Binary files differ
diff --git a/test/xlsx/conditional-format/data-bars.xlsx b/test/xlsx/conditional-format/data-bars.xlsx
new file mode 100644
index 0000000..92abfab
--- /dev/null
+++ b/test/xlsx/conditional-format/data-bars.xlsx
Binary files differ
diff --git a/test/xlsx/data-table/multi-table.xlsx b/test/xlsx/data-table/multi-table.xlsx
new file mode 100644
index 0000000..c2bf488
--- /dev/null
+++ b/test/xlsx/data-table/multi-table.xlsx
Binary files differ
diff --git a/test/xlsx/data-table/one-variable.xlsx b/test/xlsx/data-table/one-variable.xlsx
new file mode 100644
index 0000000..7ff098b
--- /dev/null
+++ b/test/xlsx/data-table/one-variable.xlsx
Binary files differ
diff --git a/test/xlsx/date-cell/input.xlsx b/test/xlsx/date-cell/input.xlsx
new file mode 100644
index 0000000..e855f4d
--- /dev/null
+++ b/test/xlsx/date-cell/input.xlsx
Binary files differ
diff --git a/test/xlsx/date-time/input.xlsx b/test/xlsx/date-time/input.xlsx
new file mode 100644
index 0000000..3f9bd7c
--- /dev/null
+++ b/test/xlsx/date-time/input.xlsx
Binary files differ
diff --git a/test/xlsx/doc-structure/unordered-sheet-positions.xlsx b/test/xlsx/doc-structure/unordered-sheet-positions.xlsx
new file mode 100644
index 0000000..1669d2d
--- /dev/null
+++ b/test/xlsx/doc-structure/unordered-sheet-positions.xlsx
Binary files differ
diff --git a/test/xlsx/empty-shared-strings/check.txt b/test/xlsx/empty-shared-strings/check.txt
new file mode 100644
index 0000000..44ade31
--- /dev/null
+++ b/test/xlsx/empty-shared-strings/check.txt
@@ -0,0 +1,8 @@
+Sheet1/0/2:numeric:1
+Sheet1/0/4:numeric:5
+Sheet1/1/2:numeric:2
+Sheet1/1/4:numeric:6
+Sheet1/2/2:numeric:3
+Sheet1/2/4:numeric:7
+Sheet1/3/2:numeric:4
+Sheet1/3/4:numeric:8
diff --git a/test/xlsx/empty-shared-strings/input.xlsx b/test/xlsx/empty-shared-strings/input.xlsx
new file mode 100644
index 0000000..cf81cf2
--- /dev/null
+++ b/test/xlsx/empty-shared-strings/input.xlsx
Binary files differ
diff --git a/test/xlsx/formatted-text/basic.xlsx b/test/xlsx/formatted-text/basic.xlsx
new file mode 100644
index 0000000..ffeec9f
--- /dev/null
+++ b/test/xlsx/formatted-text/basic.xlsx
Binary files differ
diff --git a/test/xlsx/formatted-text/bold-and-italic.xlsx b/test/xlsx/formatted-text/bold-and-italic.xlsx
new file mode 100644
index 0000000..40d4830
--- /dev/null
+++ b/test/xlsx/formatted-text/bold-and-italic.xlsx
Binary files differ
diff --git a/test/xlsx/formatted-text/colored-text.xlsx b/test/xlsx/formatted-text/colored-text.xlsx
new file mode 100644
index 0000000..4a85d37
--- /dev/null
+++ b/test/xlsx/formatted-text/colored-text.xlsx
Binary files differ
diff --git a/test/xlsx/formula-array-1/check.txt b/test/xlsx/formula-array-1/check.txt
new file mode 100644
index 0000000..7e457d3
--- /dev/null
+++ b/test/xlsx/formula-array-1/check.txt
@@ -0,0 +1,23 @@
+Sheet1/0/0:numeric:1
+Sheet1/0/2:numeric:4
+Sheet1/0/3:numeric:5
+Sheet1/0/4:numeric:6
+Sheet1/1/0:numeric:2
+Sheet1/2/0:numeric:3
+Sheet1/4/2:formula:{MMULT(A1:A3,C1:E1)}:4
+Sheet1/4/3:formula:{MMULT(A1:A3,C1:E1)}:5
+Sheet1/4/4:formula:{MMULT(A1:A3,C1:E1)}:6
+Sheet1/5/2:formula:{MMULT(A1:A3,C1:E1)}:8
+Sheet1/5/3:formula:{MMULT(A1:A3,C1:E1)}:10
+Sheet1/5/4:formula:{MMULT(A1:A3,C1:E1)}:12
+Sheet1/6/2:formula:{MMULT(A1:A3,C1:E1)}:12
+Sheet1/6/3:formula:{MMULT(A1:A3,C1:E1)}:15
+Sheet1/6/4:formula:{MMULT(A1:A3,C1:E1)}:18
+Sheet1/8/0:numeric:2
+Sheet1/8/2:numeric:10
+Sheet1/8/3:numeric:12
+Sheet1/8/5:formula:{MMULT(A9:A10,C9:D9)}:20
+Sheet1/8/6:formula:{MMULT(A9:A10,C9:D9)}:24
+Sheet1/9/0:numeric:4
+Sheet1/9/5:formula:{MMULT(A9:A10,C9:D9)}:40
+Sheet1/9/6:formula:{MMULT(A9:A10,C9:D9)}:48
diff --git a/test/xlsx/formula-array-1/input.xlsx b/test/xlsx/formula-array-1/input.xlsx
new file mode 100644
index 0000000..18016f8
--- /dev/null
+++ b/test/xlsx/formula-array-1/input.xlsx
Binary files differ
diff --git a/test/xlsx/formula-cells/check.txt b/test/xlsx/formula-cells/check.txt
new file mode 100644
index 0000000..b6abe9c
--- /dev/null
+++ b/test/xlsx/formula-cells/check.txt
@@ -0,0 +1,7 @@
+Sheet1/0/0:numeric:1
+Sheet1/0/1:formula:A1*2:2
+Sheet1/1/0:numeric:2
+Sheet1/1/1:formula:A2-10:-8
+Sheet1/2/0:numeric:3
+Sheet1/2/1:formula:A3/3:1
+Sheet1/4/0:formula:SUM(A1:A3):6
diff --git a/test/xlsx/formula-cells/input.xlsx b/test/xlsx/formula-cells/input.xlsx
new file mode 100644
index 0000000..ce73c72
--- /dev/null
+++ b/test/xlsx/formula-cells/input.xlsx
Binary files differ
diff --git a/test/xlsx/formula-shared/check.txt b/test/xlsx/formula-shared/check.txt
new file mode 100644
index 0000000..8ffca11
--- /dev/null
+++ b/test/xlsx/formula-shared/check.txt
@@ -0,0 +1,29 @@
+Sheet1/0/0:numeric:10
+Sheet1/0/1:numeric:20
+Sheet1/0/3:numeric:11
+Sheet1/0/4:numeric:11
+Sheet1/0/6:numeric:100
+Sheet1/0/7:formula:G1+2:102
+Sheet1/0/8:formula:H1+2:104
+Sheet1/0/9:formula:I1+2:106
+Sheet1/0/10:formula:J1+2:108
+Sheet1/0/11:formula:K1+2:110
+Sheet1/1/0:formula:A1+1:11
+Sheet1/1/1:formula:B1+1:21
+Sheet1/1/3:formula:D1+1:12
+Sheet1/1/4:formula:E1+1:12
+Sheet1/2/0:formula:A2+1:12
+Sheet1/2/1:formula:B2+1:22
+Sheet1/2/3:formula:D2+1:13
+Sheet1/2/4:formula:E2+1:13
+Sheet1/3/0:formula:A3+1:13
+Sheet1/3/1:formula:B3+1:23
+Sheet1/3/3:formula:D3+1:14
+Sheet1/3/4:formula:E3+1:14
+Sheet1/4/0:formula:A4+1:14
+Sheet1/4/1:formula:B4+1:24
+Sheet1/4/3:formula:D4+1:15
+Sheet1/4/4:formula:E4+1:15
+Sheet1/5/0:formula:A5+1:15
+Sheet1/5/1:formula:B5+1:25
+Sheet1/5/3:formula:D5+1:16
diff --git a/test/xlsx/formula-shared/input.xlsx b/test/xlsx/formula-shared/input.xlsx
new file mode 100644
index 0000000..6b31a3f
--- /dev/null
+++ b/test/xlsx/formula-shared/input.xlsx
Binary files differ
diff --git a/test/xlsx/formula-simple.xlsx b/test/xlsx/formula-simple.xlsx
new file mode 100644
index 0000000..e60c1b0
--- /dev/null
+++ b/test/xlsx/formula-simple.xlsx
Binary files differ
diff --git a/test/xlsx/formula-with-string-results/check.txt b/test/xlsx/formula-with-string-results/check.txt
new file mode 100644
index 0000000..2148be4
--- /dev/null
+++ b/test/xlsx/formula-with-string-results/check.txt
@@ -0,0 +1,33 @@
+Sheet1/0/0:string:"A"
+Sheet1/0/1:formula:CONCATENATE(A1,"-1"):A-1
+Sheet1/0/2:formula:LEFT(B1,2):A-
+Sheet1/1/0:string:"B"
+Sheet1/1/1:formula:CONCATENATE(A2,"-1"):B-1
+Sheet1/1/2:formula:LEFT(B2,2):B-
+Sheet1/2/0:string:"C"
+Sheet1/2/1:formula:CONCATENATE(A3,"-1"):C-1
+Sheet1/2/2:formula:LEFT(B3,2):C-
+Sheet1/3/0:string:"D"
+Sheet1/3/1:formula:CONCATENATE(A4,"-1"):D-1
+Sheet1/3/2:formula:LEFT(B4,2):D-
+Sheet1/4/0:string:"E"
+Sheet1/4/1:formula:CONCATENATE(A5,"-1"):E-1
+Sheet1/4/2:formula:LEFT(B5,2):E-
+Sheet1/5/0:string:"F"
+Sheet1/5/1:formula:CONCATENATE(A6,"-1"):F-1
+Sheet1/5/2:formula:LEFT(B6,2):F-
+Sheet1/6/0:string:"G"
+Sheet1/6/1:formula:CONCATENATE(A7,"-1"):G-1
+Sheet1/6/2:formula:LEFT(B7,2):G-
+Sheet1/7/0:string:"H"
+Sheet1/7/1:formula:CONCATENATE(A8,"-1"):H-1
+Sheet1/7/2:formula:LEFT(B8,2):H-
+Sheet1/8/0:string:"I"
+Sheet1/8/1:formula:CONCATENATE(A9,"-1"):I-1
+Sheet1/8/2:formula:LEFT(B9,2):I-
+Sheet1/9/0:string:"J"
+Sheet1/9/1:formula:CONCATENATE(A10,"-1"):J-1
+Sheet1/9/2:formula:LEFT(B10,2):J-
+Sheet1/10/0:string:"K"
+Sheet1/10/1:formula:CONCATENATE(A11,"-1"):K-1
+Sheet1/10/2:formula:LEFT(B11,2):K-
diff --git a/test/xlsx/formula-with-string-results/input.xlsx b/test/xlsx/formula-with-string-results/input.xlsx
new file mode 100644
index 0000000..ce95397
--- /dev/null
+++ b/test/xlsx/formula-with-string-results/input.xlsx
Binary files differ
diff --git a/test/xlsx/hidden-rows-columns/input.xlsx b/test/xlsx/hidden-rows-columns/input.xlsx
new file mode 100644
index 0000000..7ebc2f5
--- /dev/null
+++ b/test/xlsx/hidden-rows-columns/input.xlsx
Binary files differ
diff --git a/test/xlsx/matrix-results/input.xlsx b/test/xlsx/matrix-results/input.xlsx
new file mode 100644
index 0000000..c8e1b54
--- /dev/null
+++ b/test/xlsx/matrix-results/input.xlsx
Binary files differ
diff --git a/test/xlsx/merged-cells/simple.xlsx b/test/xlsx/merged-cells/simple.xlsx
new file mode 100644
index 0000000..ce3ed29
--- /dev/null
+++ b/test/xlsx/merged-cells/simple.xlsx
Binary files differ
diff --git a/test/xlsx/named-expression-relative/input.xlsx b/test/xlsx/named-expression-relative/input.xlsx
new file mode 100755
index 0000000..af8abe0
--- /dev/null
+++ b/test/xlsx/named-expression-relative/input.xlsx
Binary files differ
diff --git a/test/xlsx/named-expression-sheet-local/check.txt b/test/xlsx/named-expression-sheet-local/check.txt
new file mode 100644
index 0000000..321f221
--- /dev/null
+++ b/test/xlsx/named-expression-sheet-local/check.txt
@@ -0,0 +1,22 @@
+Sheet1/0/0:numeric:1
+Sheet1/0/1:numeric:6
+Sheet1/1/0:numeric:2
+Sheet1/1/1:numeric:7
+Sheet1/2/0:numeric:3
+Sheet1/2/1:numeric:8
+Sheet1/3/0:numeric:4
+Sheet1/3/1:numeric:9
+Sheet1/4/0:numeric:5
+Sheet1/4/1:numeric:10
+Sheet1/6/0:formula:SUM(MyRange):27
+Sheet2/0/0:numeric:10
+Sheet2/0/1:numeric:20
+Sheet2/1/0:numeric:11
+Sheet2/1/1:numeric:21
+Sheet2/2/0:numeric:12
+Sheet2/2/1:numeric:22
+Sheet2/3/0:numeric:13
+Sheet2/3/1:numeric:23
+Sheet2/4/0:numeric:14
+Sheet2/4/1:numeric:24
+Sheet2/6/0:formula:SUM(MyRange):74
diff --git a/test/xlsx/named-expression-sheet-local/input.xlsx b/test/xlsx/named-expression-sheet-local/input.xlsx
new file mode 100644
index 0000000..6820085
--- /dev/null
+++ b/test/xlsx/named-expression-sheet-local/input.xlsx
Binary files differ
diff --git a/test/xlsx/named-expression/check.txt b/test/xlsx/named-expression/check.txt
new file mode 100644
index 0000000..d6d6ff0
--- /dev/null
+++ b/test/xlsx/named-expression/check.txt
@@ -0,0 +1,12 @@
+Sheet1/0/0:numeric:1
+Sheet1/0/1:numeric:6
+Sheet1/1/0:numeric:2
+Sheet1/1/1:numeric:7
+Sheet1/2/0:numeric:3
+Sheet1/2/1:numeric:8
+Sheet1/3/0:numeric:4
+Sheet1/3/1:numeric:9
+Sheet1/4/0:numeric:5
+Sheet1/4/1:numeric:10
+Sheet1/6/0:formula:SUM(MyRange):15
+Sheet1/6/1:formula:SUM(MyRange2):55
diff --git a/test/xlsx/named-expression/input.xlsx b/test/xlsx/named-expression/input.xlsx
new file mode 100644
index 0000000..080521c
--- /dev/null
+++ b/test/xlsx/named-expression/input.xlsx
Binary files differ
diff --git a/test/xlsx/number-format/date-time.xlsx b/test/xlsx/number-format/date-time.xlsx
new file mode 100644
index 0000000..0a8cccc
--- /dev/null
+++ b/test/xlsx/number-format/date-time.xlsx
Binary files differ
diff --git a/test/xlsx/pivot-table/chart-simple.xlsx b/test/xlsx/pivot-table/chart-simple.xlsx
new file mode 100644
index 0000000..ec16b93
--- /dev/null
+++ b/test/xlsx/pivot-table/chart-simple.xlsx
Binary files differ
diff --git a/test/xlsx/pivot-table/error-values.xlsx b/test/xlsx/pivot-table/error-values.xlsx
new file mode 100644
index 0000000..9158a10
--- /dev/null
+++ b/test/xlsx/pivot-table/error-values.xlsx
Binary files differ
diff --git a/test/xlsx/pivot-table/group-by-dates.xlsx b/test/xlsx/pivot-table/group-by-dates.xlsx
new file mode 100644
index 0000000..73e4b23
--- /dev/null
+++ b/test/xlsx/pivot-table/group-by-dates.xlsx
Binary files differ
diff --git a/test/xlsx/pivot-table/group-by-numbers.xlsx b/test/xlsx/pivot-table/group-by-numbers.xlsx
new file mode 100644
index 0000000..a69a255
--- /dev/null
+++ b/test/xlsx/pivot-table/group-by-numbers.xlsx
Binary files differ
diff --git a/test/xlsx/pivot-table/group-field.xlsx b/test/xlsx/pivot-table/group-field.xlsx
new file mode 100644
index 0000000..053edef
--- /dev/null
+++ b/test/xlsx/pivot-table/group-field.xlsx
Binary files differ
diff --git a/test/xlsx/pivot-table/many-fields.xlsx b/test/xlsx/pivot-table/many-fields.xlsx
new file mode 100644
index 0000000..157cee4
--- /dev/null
+++ b/test/xlsx/pivot-table/many-fields.xlsx
Binary files differ
diff --git a/test/xlsx/pivot-table/mixed-type-field.xlsx b/test/xlsx/pivot-table/mixed-type-field.xlsx
new file mode 100644
index 0000000..cf75f1a
--- /dev/null
+++ b/test/xlsx/pivot-table/mixed-type-field.xlsx
Binary files differ
diff --git a/test/xlsx/pivot-table/three-pivot-tables-on-one-sheet.xlsx b/test/xlsx/pivot-table/three-pivot-tables-on-one-sheet.xlsx
new file mode 100644
index 0000000..19fdb1b
--- /dev/null
+++ b/test/xlsx/pivot-table/three-pivot-tables-on-one-sheet.xlsx
Binary files differ
diff --git a/test/xlsx/pivot-table/two-pivot-caches.xlsx b/test/xlsx/pivot-table/two-pivot-caches.xlsx
new file mode 100644
index 0000000..d94790f
--- /dev/null
+++ b/test/xlsx/pivot-table/two-pivot-caches.xlsx
Binary files differ
diff --git a/test/xlsx/pivot-table/two-tables-one-source.xlsx b/test/xlsx/pivot-table/two-tables-one-source.xlsx
new file mode 100644
index 0000000..bae1477
--- /dev/null
+++ b/test/xlsx/pivot-table/two-tables-one-source.xlsx
Binary files differ
diff --git a/test/xlsx/raw-values-1/check.txt b/test/xlsx/raw-values-1/check.txt
new file mode 100644
index 0000000..935cf22
--- /dev/null
+++ b/test/xlsx/raw-values-1/check.txt
@@ -0,0 +1,25 @@
+Num/1/0:numeric:1.1
+Num/1/2:numeric:2.1
+Num/1/4:numeric:3.1
+Num/2/0:numeric:1.2
+Num/2/2:numeric:2.2
+Num/2/4:numeric:3.2
+Num/3/0:numeric:1.3
+Num/3/2:numeric:2.3
+Num/3/4:numeric:3.3
+Num/6/2:numeric:5
+Num/6/3:numeric:6
+Num/6/4:numeric:7
+Text/0/0:string:"A"
+Text/1/0:string:"B"
+Text/1/1:string:"D"
+Text/2/0:string:"C"
+Text/2/1:string:"E"
+Text/2/2:string:"G"
+Text/3/1:string:"F"
+Text/3/2:string:"H"
+Text/4/2:string:"I"
+Text/6/3:string:"Andy"
+Text/7/3:string:"Bruce"
+Text/8/3:string:"Charlie"
+Text/9/3:string:"David"
diff --git a/test/xlsx/raw-values-1/input.xlsx b/test/xlsx/raw-values-1/input.xlsx
new file mode 100644
index 0000000..6754e81
--- /dev/null
+++ b/test/xlsx/raw-values-1/input.xlsx
Binary files differ
diff --git a/test/xlsx/revision/cell-change-basic.xlsx b/test/xlsx/revision/cell-change-basic.xlsx
new file mode 100755
index 0000000..29e8027
--- /dev/null
+++ b/test/xlsx/revision/cell-change-basic.xlsx
Binary files differ
diff --git a/test/xlsx/styles/column-styles.xlsx b/test/xlsx/styles/column-styles.xlsx
new file mode 100644
index 0000000..f757c43
--- /dev/null
+++ b/test/xlsx/styles/column-styles.xlsx
Binary files differ
diff --git a/test/xlsx/styles/direct-format.xlsx b/test/xlsx/styles/direct-format.xlsx
new file mode 100644
index 0000000..838060c
--- /dev/null
+++ b/test/xlsx/styles/direct-format.xlsx
Binary files differ
diff --git a/test/xlsx/table/autofilter-text-filter-1.xlsx b/test/xlsx/table/autofilter-text-filter-1.xlsx
new file mode 100644
index 0000000..57b27e2
--- /dev/null
+++ b/test/xlsx/table/autofilter-text-filter-1.xlsx
Binary files differ
diff --git a/test/xlsx/table/autofilter.xlsx b/test/xlsx/table/autofilter.xlsx
new file mode 100644
index 0000000..ed81361
--- /dev/null
+++ b/test/xlsx/table/autofilter.xlsx
Binary files differ
diff --git a/test/xlsx/table/table-1.xlsx b/test/xlsx/table/table-1.xlsx
new file mode 100644
index 0000000..a936f8d
--- /dev/null
+++ b/test/xlsx/table/table-1.xlsx
Binary files differ
diff --git a/test/xlsx/table/table-2.xlsx b/test/xlsx/table/table-2.xlsx
new file mode 100644
index 0000000..a29bae8
--- /dev/null
+++ b/test/xlsx/table/table-2.xlsx
Binary files differ
diff --git a/test/xlsx/test.xlsx b/test/xlsx/test.xlsx
new file mode 100644
index 0000000..95dadfb
--- /dev/null
+++ b/test/xlsx/test.xlsx
Binary files differ
diff --git a/test/xlsx/text-alignment/input.xlsx b/test/xlsx/text-alignment/input.xlsx
new file mode 100644
index 0000000..6d35d2d
--- /dev/null
+++ b/test/xlsx/text-alignment/input.xlsx
Binary files differ
diff --git a/test/xlsx/view/cursor-per-sheet.xlsx b/test/xlsx/view/cursor-per-sheet.xlsx
new file mode 100644
index 0000000..29d4fb0
--- /dev/null
+++ b/test/xlsx/view/cursor-per-sheet.xlsx
Binary files differ
diff --git a/test/xlsx/view/cursor-split-pane.xlsx b/test/xlsx/view/cursor-split-pane.xlsx
new file mode 100644
index 0000000..fd37d06
--- /dev/null
+++ b/test/xlsx/view/cursor-split-pane.xlsx
Binary files differ
diff --git a/test/xlsx/view/frozen-pane.xlsx b/test/xlsx/view/frozen-pane.xlsx
new file mode 100644
index 0000000..26e5558
--- /dev/null
+++ b/test/xlsx/view/frozen-pane.xlsx
Binary files differ
diff --git a/test/xml-mapped/attribute-basic/check-nomap.txt b/test/xml-mapped/attribute-basic/check-nomap.txt
new file mode 100644
index 0000000..d1bb6ef
--- /dev/null
+++ b/test/xml-mapped/attribute-basic/check-nomap.txt
@@ -0,0 +1,30 @@
+range-0/0/0:string:"id"
+range-0/0/1:string:"first-name"
+range-0/0/2:string:"last-name"
+range-0/0/3:string:"score"
+range-0/0/4:string:"entry"
+range-0/1/0:numeric:1
+range-0/1/1:string:"Bill"
+range-0/1/2:string:"Clinton"
+range-0/1/3:numeric:456
+range-0/1/4:string:"in"
+range-0/2/0:numeric:2
+range-0/2/1:string:"David"
+range-0/2/2:string:"Cameron"
+range-0/2/3:numeric:323
+range-0/2/4:string:"out"
+range-0/3/0:numeric:3
+range-0/3/1:string:"Barak"
+range-0/3/2:string:"Obama"
+range-0/3/3:numeric:234
+range-0/3/4:string:"unknown"
+range-0/4/0:numeric:4
+range-0/4/1:string:"Yoshihiko"
+range-0/4/2:string:"Noda"
+range-0/4/3:numeric:192
+range-0/4/4:string:"in"
+range-0/5/0:numeric:5
+range-0/5/1:string:"Angela"
+range-0/5/2:string:"Merkel"
+range-0/5/3:numeric:210
+range-0/5/4:string:"ask later"
diff --git a/test/xml-mapped/attribute-basic/check.txt b/test/xml-mapped/attribute-basic/check.txt
new file mode 100644
index 0000000..31fc805
--- /dev/null
+++ b/test/xml-mapped/attribute-basic/check.txt
@@ -0,0 +1,34 @@
+data/0/0:string:"TOP SECRET"
+data/0/2:numeric:1.1
+data/1/0:string:"Simple Data File"
+data/1/2:string:"2012-08-12"
+data/3/0:string:"id"
+data/3/1:string:"first-name"
+data/3/2:string:"last-name"
+data/3/3:string:"score"
+data/3/4:string:"entry"
+data/4/0:numeric:1
+data/4/1:string:"Bill"
+data/4/2:string:"Clinton"
+data/4/3:numeric:456
+data/4/4:string:"in"
+data/5/0:numeric:2
+data/5/1:string:"David"
+data/5/2:string:"Cameron"
+data/5/3:numeric:323
+data/5/4:string:"out"
+data/6/0:numeric:3
+data/6/1:string:"Barak"
+data/6/2:string:"Obama"
+data/6/3:numeric:234
+data/6/4:string:"unknown"
+data/7/0:numeric:4
+data/7/1:string:"Yoshihiko"
+data/7/2:string:"Noda"
+data/7/3:numeric:192
+data/7/4:string:"in"
+data/8/0:numeric:5
+data/8/1:string:"Angela"
+data/8/2:string:"Merkel"
+data/8/3:numeric:210
+data/8/4:string:"ask later"
diff --git a/test/xml-mapped/attribute-basic/input.xml b/test/xml-mapped/attribute-basic/input.xml
new file mode 100644
index 0000000..f19bc3f
--- /dev/null
+++ b/test/xml-mapped/attribute-basic/input.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<data version="1.1">
+ <header label="TOP SECRET">Simple Data File</header>
+ <entries>
+ <entry id="1" first-name="Bill" last-name="Clinton" score="456">in</entry>
+ <entry id="2" first-name="David" last-name="Cameron" score="323">out</entry>
+ <entry id="3" first-name="Barak" last-name="Obama" score="234">unknown</entry>
+ <entry id="4" first-name="Yoshihiko" last-name="Noda" score="192">in</entry>
+ <entry id="5" first-name="Angela" last-name="Merkel" score="210">ask later</entry>
+ </entries>
+ <footer date="2012-08-12">
+ <extra>Not for distribution</extra>
+ </footer>
+</data>
diff --git a/test/xml-mapped/attribute-basic/map.xml b/test/xml-mapped/attribute-basic/map.xml
new file mode 100644
index 0000000..97172f2
--- /dev/null
+++ b/test/xml-mapped/attribute-basic/map.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<map xmlns="http://gitorious.org/orcus/xml-map">
+ <sheet name="data"/>
+ <cell path="/data/header/@label" row="0" column="0" sheet="data"/>
+ <cell path="/data/header" row="1" column="0" sheet="data"/>
+ <cell path="/data/footer/@date" row="1" column="2" sheet="data"/>
+ <cell path="/data/@version" row="0" column="2" sheet="data"/>
+ <range row="3" column="0" sheet="data">
+ <field path="/data/entries/entry/@id"/>
+ <field path="/data/entries/entry/@first-name"/>
+ <field path="/data/entries/entry/@last-name"/>
+ <field path="/data/entries/entry/@score"/>
+ <field path="/data/entries/entry"/>
+ <row-group path="/data/entries/entry"/>
+ </range>
+</map>
diff --git a/test/xml-mapped/attribute-namespace-2/check-nomap.txt b/test/xml-mapped/attribute-namespace-2/check-nomap.txt
new file mode 100644
index 0000000..63fe3cc
--- /dev/null
+++ b/test/xml-mapped/attribute-namespace-2/check-nomap.txt
@@ -0,0 +1,12 @@
+range-0/0/0:string:"ns1:date-received"
+range-0/0/1:string:"ns1:date-processed"
+range-0/0/2:string:"ns1:received-by"
+range-0/1/0:string:"2011-01-01"
+range-0/1/1:string:"2011-01-03"
+range-0/1/2:string:"JKB"
+range-0/2/0:string:"2011-01-01"
+range-0/2/1:string:"2011-01-04"
+range-0/2/2:string:"CJ"
+range-0/3/0:string:"2011-12-23"
+range-0/3/1:string:"2012-01-01"
+range-0/3/2:string:"KY"
diff --git a/test/xml-mapped/attribute-namespace-2/check.txt b/test/xml-mapped/attribute-namespace-2/check.txt
new file mode 100644
index 0000000..c8f23a3
--- /dev/null
+++ b/test/xml-mapped/attribute-namespace-2/check.txt
@@ -0,0 +1,12 @@
+data/1/1:string:"ns1:date-received"
+data/1/2:string:"ns1:date-processed"
+data/1/3:string:"ns1:received-by"
+data/2/1:string:"2011-01-01"
+data/2/2:string:"2011-01-03"
+data/2/3:string:"JKB"
+data/3/1:string:"2011-01-01"
+data/3/2:string:"2011-01-04"
+data/3/3:string:"CJ"
+data/4/1:string:"2011-12-23"
+data/4/2:string:"2012-01-01"
+data/4/3:string:"KY"
diff --git a/test/xml-mapped/attribute-namespace-2/input.xml b/test/xml-mapped/attribute-namespace-2/input.xml
new file mode 100644
index 0000000..4a29806
--- /dev/null
+++ b/test/xml-mapped/attribute-namespace-2/input.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<a:data xmlns:a="http://ns-1" xmlns:b="http://ns-2">
+ <b:entries>
+ <b:entry b:date-received="2011-01-01" b:date-processed="2011-01-03" b:received-by="JKB"/>
+ <b:entry b:date-received="2011-01-01" b:date-processed="2011-01-04" b:received-by="CJ"/>
+ <b:entry b:date-received="2011-12-23" b:date-processed="2012-01-01" b:received-by="KY"/>
+ </b:entries>
+</a:data>
diff --git a/test/xml-mapped/attribute-namespace-2/map.xml b/test/xml-mapped/attribute-namespace-2/map.xml
new file mode 100644
index 0000000..4a51c85
--- /dev/null
+++ b/test/xml-mapped/attribute-namespace-2/map.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<map xmlns="http://gitorious.org/orcus/xml-map">
+ <ns alias="x" uri="http://ns-1"/>
+ <ns alias="y" uri="http://ns-2" default="true"/>
+ <sheet name="data"/>
+ <range row="1" column="1" sheet="data">
+ <field path="/x:data/entries/entry/@date-received"/>
+ <field path="/x:data/entries/entry/@date-processed"/>
+ <field path="/x:data/entries/entry/@received-by"/>
+ <row-group path="/x:data/entries/entry"/>
+ </range>
+</map>
diff --git a/test/xml-mapped/attribute-namespace/check-nomap.txt b/test/xml-mapped/attribute-namespace/check-nomap.txt
new file mode 100644
index 0000000..63fe3cc
--- /dev/null
+++ b/test/xml-mapped/attribute-namespace/check-nomap.txt
@@ -0,0 +1,12 @@
+range-0/0/0:string:"ns1:date-received"
+range-0/0/1:string:"ns1:date-processed"
+range-0/0/2:string:"ns1:received-by"
+range-0/1/0:string:"2011-01-01"
+range-0/1/1:string:"2011-01-03"
+range-0/1/2:string:"JKB"
+range-0/2/0:string:"2011-01-01"
+range-0/2/1:string:"2011-01-04"
+range-0/2/2:string:"CJ"
+range-0/3/0:string:"2011-12-23"
+range-0/3/1:string:"2012-01-01"
+range-0/3/2:string:"KY"
diff --git a/test/xml-mapped/attribute-namespace/check.txt b/test/xml-mapped/attribute-namespace/check.txt
new file mode 100644
index 0000000..c8f23a3
--- /dev/null
+++ b/test/xml-mapped/attribute-namespace/check.txt
@@ -0,0 +1,12 @@
+data/1/1:string:"ns1:date-received"
+data/1/2:string:"ns1:date-processed"
+data/1/3:string:"ns1:received-by"
+data/2/1:string:"2011-01-01"
+data/2/2:string:"2011-01-03"
+data/2/3:string:"JKB"
+data/3/1:string:"2011-01-01"
+data/3/2:string:"2011-01-04"
+data/3/3:string:"CJ"
+data/4/1:string:"2011-12-23"
+data/4/2:string:"2012-01-01"
+data/4/3:string:"KY"
diff --git a/test/xml-mapped/attribute-namespace/input.xml b/test/xml-mapped/attribute-namespace/input.xml
new file mode 100644
index 0000000..4a29806
--- /dev/null
+++ b/test/xml-mapped/attribute-namespace/input.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<a:data xmlns:a="http://ns-1" xmlns:b="http://ns-2">
+ <b:entries>
+ <b:entry b:date-received="2011-01-01" b:date-processed="2011-01-03" b:received-by="JKB"/>
+ <b:entry b:date-received="2011-01-01" b:date-processed="2011-01-04" b:received-by="CJ"/>
+ <b:entry b:date-received="2011-12-23" b:date-processed="2012-01-01" b:received-by="KY"/>
+ </b:entries>
+</a:data>
diff --git a/test/xml-mapped/attribute-namespace/map.xml b/test/xml-mapped/attribute-namespace/map.xml
new file mode 100644
index 0000000..76e5b72
--- /dev/null
+++ b/test/xml-mapped/attribute-namespace/map.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<map xmlns="http://gitorious.org/orcus/xml-map">
+ <ns alias="x" uri="http://ns-1"/>
+ <ns alias="y" uri="http://ns-2"/>
+ <sheet name="data"/>
+ <range row="1" column="1" sheet="data">
+ <field path="/x:data/y:entries/y:entry/@y:date-received"/>
+ <field path="/x:data/y:entries/y:entry/@y:date-processed"/>
+ <field path="/x:data/y:entries/y:entry/@y:received-by"/>
+ <row-group path="/x:data/y:entries/y:entry"/>
+ </range>
+</map>
diff --git a/test/xml-mapped/attribute-range-self-close/check-nomap.txt b/test/xml-mapped/attribute-range-self-close/check-nomap.txt
new file mode 100644
index 0000000..4c5a8d5
--- /dev/null
+++ b/test/xml-mapped/attribute-range-self-close/check-nomap.txt
@@ -0,0 +1,24 @@
+range-0/0/0:string:"id"
+range-0/0/1:string:"first-name"
+range-0/0/2:string:"last-name"
+range-0/0/3:string:"score"
+range-0/1/0:numeric:1
+range-0/1/1:string:"Bill"
+range-0/1/2:string:"Clinton"
+range-0/1/3:numeric:456
+range-0/2/0:numeric:2
+range-0/2/1:string:"David"
+range-0/2/2:string:"Cameron"
+range-0/2/3:numeric:323
+range-0/3/0:numeric:3
+range-0/3/1:string:"Barak"
+range-0/3/2:string:"Obama"
+range-0/3/3:numeric:234
+range-0/4/0:numeric:4
+range-0/4/1:string:"Yoshihiko"
+range-0/4/2:string:"Noda"
+range-0/4/3:numeric:192
+range-0/5/0:numeric:5
+range-0/5/1:string:"Angela"
+range-0/5/2:string:"Merkel"
+range-0/5/3:numeric:210
diff --git a/test/xml-mapped/attribute-range-self-close/check.txt b/test/xml-mapped/attribute-range-self-close/check.txt
new file mode 100644
index 0000000..5a049c0
--- /dev/null
+++ b/test/xml-mapped/attribute-range-self-close/check.txt
@@ -0,0 +1,24 @@
+data/3/0:string:"id"
+data/3/1:string:"first-name"
+data/3/2:string:"last-name"
+data/3/3:string:"score"
+data/4/0:numeric:1
+data/4/1:string:"Bill"
+data/4/2:string:"Clinton"
+data/4/3:numeric:456
+data/5/0:numeric:2
+data/5/1:string:"David"
+data/5/2:string:"Cameron"
+data/5/3:numeric:323
+data/6/0:numeric:3
+data/6/1:string:"Barak"
+data/6/2:string:"Obama"
+data/6/3:numeric:234
+data/7/0:numeric:4
+data/7/1:string:"Yoshihiko"
+data/7/2:string:"Noda"
+data/7/3:numeric:192
+data/8/0:numeric:5
+data/8/1:string:"Angela"
+data/8/2:string:"Merkel"
+data/8/3:numeric:210
diff --git a/test/xml-mapped/attribute-range-self-close/input.xml b/test/xml-mapped/attribute-range-self-close/input.xml
new file mode 100644
index 0000000..6e9e31d
--- /dev/null
+++ b/test/xml-mapped/attribute-range-self-close/input.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<data>
+ <entry id="1" first-name="Bill" last-name="Clinton" score="456"/>
+ <entry id="2" first-name="David" last-name="Cameron" score="323"/>
+ <entry id="3" first-name="Barak" last-name="Obama" score="234"/>
+ <entry id="4" first-name="Yoshihiko" last-name="Noda" score="192"/>
+ <entry id="5" first-name="Angela" last-name="Merkel" score="210"/>
+</data>
diff --git a/test/xml-mapped/attribute-range-self-close/map.xml b/test/xml-mapped/attribute-range-self-close/map.xml
new file mode 100644
index 0000000..4e03133
--- /dev/null
+++ b/test/xml-mapped/attribute-range-self-close/map.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<map xmlns="http://gitorious.org/orcus/xml-map">
+ <sheet name="data"/>
+ <range row="3" column="0" sheet="data">
+ <field path="/data/entry/@id"/>
+ <field path="/data/entry/@first-name"/>
+ <field path="/data/entry/@last-name"/>
+ <field path="/data/entry/@score"/>
+ <row-group path="/data/entry"/>
+ </range>
+</map>
diff --git a/test/xml-mapped/attribute-single-element-2/check.txt b/test/xml-mapped/attribute-single-element-2/check.txt
new file mode 100644
index 0000000..8a0ff58
--- /dev/null
+++ b/test/xml-mapped/attribute-single-element-2/check.txt
@@ -0,0 +1,2 @@
+data/2/3:numeric:1.1
+data/2/4:string:"2012-09-30"
diff --git a/test/xml-mapped/attribute-single-element-2/input.xml b/test/xml-mapped/attribute-single-element-2/input.xml
new file mode 100644
index 0000000..82dffee
--- /dev/null
+++ b/test/xml-mapped/attribute-single-element-2/input.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0"?>
+<root-only version="1.1" date="2012-09-30">This is not linked</root-only>
diff --git a/test/xml-mapped/attribute-single-element-2/map.xml b/test/xml-mapped/attribute-single-element-2/map.xml
new file mode 100644
index 0000000..0ba42ff
--- /dev/null
+++ b/test/xml-mapped/attribute-single-element-2/map.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<map xmlns="http://gitorious.org/orcus/xml-map">
+ <sheet name="data"/>
+ <cell path="/root-only/@version" row="2" column="3" sheet="data"/>
+ <cell path="/root-only/@date" row="2" column="4" sheet="data"/>
+</map>
diff --git a/test/xml-mapped/attribute-single-element/check.txt b/test/xml-mapped/attribute-single-element/check.txt
new file mode 100644
index 0000000..8a0ff58
--- /dev/null
+++ b/test/xml-mapped/attribute-single-element/check.txt
@@ -0,0 +1,2 @@
+data/2/3:numeric:1.1
+data/2/4:string:"2012-09-30"
diff --git a/test/xml-mapped/attribute-single-element/input.xml b/test/xml-mapped/attribute-single-element/input.xml
new file mode 100644
index 0000000..dd24486
--- /dev/null
+++ b/test/xml-mapped/attribute-single-element/input.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0"?>
+<root-only version="1.1" date="2012-09-30"/>
diff --git a/test/xml-mapped/attribute-single-element/map.xml b/test/xml-mapped/attribute-single-element/map.xml
new file mode 100644
index 0000000..0ba42ff
--- /dev/null
+++ b/test/xml-mapped/attribute-single-element/map.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<map xmlns="http://gitorious.org/orcus/xml-map">
+ <sheet name="data"/>
+ <cell path="/root-only/@version" row="2" column="3" sheet="data"/>
+ <cell path="/root-only/@date" row="2" column="4" sheet="data"/>
+</map>
diff --git a/test/xml-mapped/content-basic/check-nomap.txt b/test/xml-mapped/content-basic/check-nomap.txt
new file mode 100644
index 0000000..b0ec4d7
--- /dev/null
+++ b/test/xml-mapped/content-basic/check-nomap.txt
@@ -0,0 +1,24 @@
+range-0/0/0:string:"id"
+range-0/0/1:string:"first"
+range-0/0/2:string:"last"
+range-0/0/3:string:"score"
+range-0/1/0:numeric:1
+range-0/1/1:string:"Bill"
+range-0/1/2:string:"Clinton"
+range-0/1/3:numeric:456
+range-0/2/0:numeric:2
+range-0/2/1:string:"David"
+range-0/2/2:string:"Cameron"
+range-0/2/3:numeric:323
+range-0/3/0:numeric:3
+range-0/3/1:string:"Barak"
+range-0/3/2:string:"Obama"
+range-0/3/3:numeric:234
+range-0/4/0:numeric:4
+range-0/4/1:string:"Yoshihiko"
+range-0/4/2:string:"Noda"
+range-0/4/3:numeric:192
+range-0/5/0:numeric:5
+range-0/5/1:string:"Angela"
+range-0/5/2:string:"Merkel"
+range-0/5/3:numeric:210
diff --git a/test/xml-mapped/content-basic/check.txt b/test/xml-mapped/content-basic/check.txt
new file mode 100644
index 0000000..ef90e22
--- /dev/null
+++ b/test/xml-mapped/content-basic/check.txt
@@ -0,0 +1,27 @@
+data/0/0:string:"TOP SECRET"
+data/1/0:string:"Simple Data File"
+data/1/2:string:"2012-08-12"
+data/3/0:string:"id"
+data/3/1:string:"first"
+data/3/2:string:"last"
+data/3/3:string:"score"
+data/4/0:numeric:1
+data/4/1:string:"Bill"
+data/4/2:string:"Clinton"
+data/4/3:numeric:456
+data/5/0:numeric:2
+data/5/1:string:"David"
+data/5/2:string:"Cameron"
+data/5/3:numeric:323
+data/6/0:numeric:3
+data/6/1:string:"Barak"
+data/6/2:string:"Obama"
+data/6/3:numeric:234
+data/7/0:numeric:4
+data/7/1:string:"Yoshihiko"
+data/7/2:string:"Noda"
+data/7/3:numeric:192
+data/8/0:numeric:5
+data/8/1:string:"Angela"
+data/8/2:string:"Merkel"
+data/8/3:numeric:210
diff --git a/test/xml-mapped/content-basic/input.xml b/test/xml-mapped/content-basic/input.xml
new file mode 100644
index 0000000..f6d4abc
--- /dev/null
+++ b/test/xml-mapped/content-basic/input.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<data>
+ <label>TOP SECRET</label>
+ <header>
+ <title>Simple Data File</title>
+ </header>
+ <entries>
+ <entry>
+ <id>1</id><name><first>Bill</first><last>Clinton</last></name><score>456</score>
+ </entry>
+ <entry>
+ <id>2</id><name><first>David</first><last>Cameron</last></name><score>323</score>
+ </entry>
+ <entry>
+ <id>3</id><name><first>Barak</first><last>Obama</last></name><score>234</score>
+ </entry>
+ <entry>
+ <id>4</id><name><first>Yoshihiko</first><last>Noda</last></name><score>192</score>
+ </entry>
+ <entry>
+ <id>5</id><name><first>Angela</first><last>Merkel</last></name><score>210</score>
+ </entry>
+ </entries>
+ <footer>
+ <date>2012-08-12</date>
+ </footer>
+</data>
diff --git a/test/xml-mapped/content-basic/map.xml b/test/xml-mapped/content-basic/map.xml
new file mode 100644
index 0000000..248daa7
--- /dev/null
+++ b/test/xml-mapped/content-basic/map.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<map xmlns="http://gitorious.org/orcus/xml-map">
+ <sheet name="data"/>
+ <cell path="/data/label" row="0" column="0" sheet="data"/>
+ <cell path="/data/header/title" row="1" column="0" sheet="data"/>
+ <cell path="/data/footer/date" row="1" column="2" sheet="data"/>
+ <range row="3" column="0" sheet="data">
+ <field path="/data/entries/entry/id"/>
+ <field path="/data/entries/entry/name/first"/>
+ <field path="/data/entries/entry/name/last"/>
+ <field path="/data/entries/entry/score"/>
+ <row-group path="/data/entries/entry"/>
+ </range>
+</map>
diff --git a/test/xml-mapped/content-namespace-2/check-nomap.txt b/test/xml-mapped/content-namespace-2/check-nomap.txt
new file mode 100644
index 0000000..d7c6de8
--- /dev/null
+++ b/test/xml-mapped/content-namespace-2/check-nomap.txt
@@ -0,0 +1,12 @@
+range-0/0/0:string:"ns2:date"
+range-0/0/1:string:"ns2:category"
+range-0/0/2:string:"ns2:amount"
+range-0/1/0:string:"2011-01-02"
+range-0/1/1:string:"Lunch"
+range-0/1/2:numeric:6.32
+range-0/2/0:string:"2011-01-03"
+range-0/2/1:string:"Lunch"
+range-0/2/2:numeric:7.45
+range-0/3/0:string:"2011-01-04"
+range-0/3/1:string:"Gas"
+range-0/3/2:numeric:44.35
diff --git a/test/xml-mapped/content-namespace-2/check.txt b/test/xml-mapped/content-namespace-2/check.txt
new file mode 100644
index 0000000..a4c7237
--- /dev/null
+++ b/test/xml-mapped/content-namespace-2/check.txt
@@ -0,0 +1,12 @@
+data/2/0:string:"ns2:date"
+data/2/1:string:"ns2:category"
+data/2/2:string:"ns2:amount"
+data/3/0:string:"2011-01-02"
+data/3/1:string:"Lunch"
+data/3/2:numeric:6.32
+data/4/0:string:"2011-01-03"
+data/4/1:string:"Lunch"
+data/4/2:numeric:7.45
+data/5/0:string:"2011-01-04"
+data/5/1:string:"Gas"
+data/5/2:numeric:44.35
diff --git a/test/xml-mapped/content-namespace-2/input.xml b/test/xml-mapped/content-namespace-2/input.xml
new file mode 100644
index 0000000..435dfce
--- /dev/null
+++ b/test/xml-mapped/content-namespace-2/input.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<a:data xmlns:a="http://namespace-1">
+ <b:monthly xmlns:b="http://namespace-2" xmlns:c="http://namespace-3">
+ <b:entries>
+ <b:entry>
+ <c:date>2011-01-02</c:date>
+ <c:category>Lunch</c:category>
+ <c:amount>6.32</c:amount>
+ </b:entry>
+ <b:entry>
+ <c:date>2011-01-03</c:date>
+ <c:category>Lunch</c:category>
+ <c:amount>7.45</c:amount>
+ </b:entry>
+ <b:entry>
+ <c:date>2011-01-04</c:date>
+ <c:category>Gas</c:category>
+ <c:amount>44.35</c:amount>
+ </b:entry>
+ </b:entries>
+ </b:monthly>
+</a:data>
diff --git a/test/xml-mapped/content-namespace-2/map.xml b/test/xml-mapped/content-namespace-2/map.xml
new file mode 100644
index 0000000..172de50
--- /dev/null
+++ b/test/xml-mapped/content-namespace-2/map.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<map xmlns="http://gitorious.org/orcus/xml-map">
+ <ns alias="x" uri="http://namespace-1"/>
+ <ns alias="y" uri="http://namespace-2"/>
+ <ns alias="z" uri="http://namespace-3"/>
+ <sheet name="data"/>
+ <range row="2" column="0" sheet="data">
+ <field path="/x:data/y:monthly/y:entries/y:entry/z:date"/>
+ <field path="/x:data/y:monthly/y:entries/y:entry/z:category"/>
+ <field path="/x:data/y:monthly/y:entries/y:entry/z:amount"/>
+ <row-group path="/x:data/y:monthly/y:entries/y:entry"/>
+ </range>
+</map>
diff --git a/test/xml-mapped/content-namespace-3/check-nomap.txt b/test/xml-mapped/content-namespace-3/check-nomap.txt
new file mode 100644
index 0000000..dce2781
--- /dev/null
+++ b/test/xml-mapped/content-namespace-3/check-nomap.txt
@@ -0,0 +1,12 @@
+range-0/0/0:string:"ns0:city"
+range-0/0/1:string:"ns0:population"
+range-0/0/2:string:"ns0:year"
+range-0/1/0:string:"Tokyo"
+range-0/1/1:numeric:13189000
+range-0/1/2:numeric:2011
+range-0/2/0:string:"New York City"
+range-0/2/1:numeric:8244910
+range-0/2/2:numeric:2011
+range-0/3/0:string:"London"
+range-0/3/1:numeric:8174100
+range-0/3/2:numeric:2011
diff --git a/test/xml-mapped/content-namespace-3/check.txt b/test/xml-mapped/content-namespace-3/check.txt
new file mode 100644
index 0000000..98d2013
--- /dev/null
+++ b/test/xml-mapped/content-namespace-3/check.txt
@@ -0,0 +1,13 @@
+data/0/0:string:"Sample data"
+data/2/0:string:"ns0:city"
+data/2/1:string:"ns0:population"
+data/2/2:string:"ns0:year"
+data/3/0:string:"Tokyo"
+data/3/1:numeric:13189000
+data/3/2:numeric:2011
+data/4/0:string:"New York City"
+data/4/1:numeric:8244910
+data/4/2:numeric:2011
+data/5/0:string:"London"
+data/5/1:numeric:8174100
+data/5/2:numeric:2011
diff --git a/test/xml-mapped/content-namespace-3/input.xml b/test/xml-mapped/content-namespace-3/input.xml
new file mode 100644
index 0000000..6e3c8b8
--- /dev/null
+++ b/test/xml-mapped/content-namespace-3/input.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<b:table xmlns:b="http://some-namespace" xmlns:skip="http://namespace-to-skip">
+ <b:title>Sample data</b:title>
+ <b:rows>
+ <b:row>
+ <b:city>Tokyo</b:city>
+ <b:population>13189000</b:population>
+ <b:year>2011</b:year>
+ </b:row>
+ <b:row>
+ <b:city>New York City</b:city>
+ <b:population>8244910</b:population>
+ <b:year>2011</b:year>
+ </b:row>
+ <b:row>
+ <b:city>London</b:city>
+ <b:population>8174100</b:population>
+ <b:year>2011</b:year>
+ </b:row>
+ <skip:row>
+ <b:city>Beijing</b:city>
+ <b:population>20180000</b:population>
+ <b:year>2011</b:year>
+ </skip:row>
+ </b:rows>
+</b:table>
diff --git a/test/xml-mapped/content-namespace-3/map.xml b/test/xml-mapped/content-namespace-3/map.xml
new file mode 100644
index 0000000..419bf0c
--- /dev/null
+++ b/test/xml-mapped/content-namespace-3/map.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<map xmlns="http://gitorious.org/orcus/xml-map">
+ <ns alias="a" uri="http://some-namespace" default="true"/>
+ <sheet name="data"/>
+ <cell path="/a:table/title" row="0" column="0" sheet="data"/>
+ <range row="2" column="0" sheet="data">
+ <field path="/a:table/rows/a:row/city"/>
+ <field path="/a:table/rows/a:row/population"/>
+ <field path="/a:table/rows/a:row/year"/>
+ <row-group path="/table/rows/row"/>
+ </range>
+</map>
diff --git a/test/xml-mapped/content-namespace/check-nomap.txt b/test/xml-mapped/content-namespace/check-nomap.txt
new file mode 100644
index 0000000..dce2781
--- /dev/null
+++ b/test/xml-mapped/content-namespace/check-nomap.txt
@@ -0,0 +1,12 @@
+range-0/0/0:string:"ns0:city"
+range-0/0/1:string:"ns0:population"
+range-0/0/2:string:"ns0:year"
+range-0/1/0:string:"Tokyo"
+range-0/1/1:numeric:13189000
+range-0/1/2:numeric:2011
+range-0/2/0:string:"New York City"
+range-0/2/1:numeric:8244910
+range-0/2/2:numeric:2011
+range-0/3/0:string:"London"
+range-0/3/1:numeric:8174100
+range-0/3/2:numeric:2011
diff --git a/test/xml-mapped/content-namespace/check.txt b/test/xml-mapped/content-namespace/check.txt
new file mode 100644
index 0000000..98d2013
--- /dev/null
+++ b/test/xml-mapped/content-namespace/check.txt
@@ -0,0 +1,13 @@
+data/0/0:string:"Sample data"
+data/2/0:string:"ns0:city"
+data/2/1:string:"ns0:population"
+data/2/2:string:"ns0:year"
+data/3/0:string:"Tokyo"
+data/3/1:numeric:13189000
+data/3/2:numeric:2011
+data/4/0:string:"New York City"
+data/4/1:numeric:8244910
+data/4/2:numeric:2011
+data/5/0:string:"London"
+data/5/1:numeric:8174100
+data/5/2:numeric:2011
diff --git a/test/xml-mapped/content-namespace/input.xml b/test/xml-mapped/content-namespace/input.xml
new file mode 100644
index 0000000..6e3c8b8
--- /dev/null
+++ b/test/xml-mapped/content-namespace/input.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<b:table xmlns:b="http://some-namespace" xmlns:skip="http://namespace-to-skip">
+ <b:title>Sample data</b:title>
+ <b:rows>
+ <b:row>
+ <b:city>Tokyo</b:city>
+ <b:population>13189000</b:population>
+ <b:year>2011</b:year>
+ </b:row>
+ <b:row>
+ <b:city>New York City</b:city>
+ <b:population>8244910</b:population>
+ <b:year>2011</b:year>
+ </b:row>
+ <b:row>
+ <b:city>London</b:city>
+ <b:population>8174100</b:population>
+ <b:year>2011</b:year>
+ </b:row>
+ <skip:row>
+ <b:city>Beijing</b:city>
+ <b:population>20180000</b:population>
+ <b:year>2011</b:year>
+ </skip:row>
+ </b:rows>
+</b:table>
diff --git a/test/xml-mapped/content-namespace/map.xml b/test/xml-mapped/content-namespace/map.xml
new file mode 100644
index 0000000..9cd4bed
--- /dev/null
+++ b/test/xml-mapped/content-namespace/map.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<map xmlns="http://gitorious.org/orcus/xml-map">
+ <ns alias="a" uri="http://some-namespace"/>
+ <sheet name="data"/>
+ <cell path="/a:table/a:title" row="0" column="0" sheet="data"/>
+ <range row="2" column="0" sheet="data">
+ <field path="/a:table/a:rows/a:row/a:city"/>
+ <field path="/a:table/a:rows/a:row/a:population"/>
+ <field path="/a:table/a:rows/a:row/a:year"/>
+ <row-group path="/a:table/a:rows/a:row"/>
+ </range>
+</map>
diff --git a/test/xml-mapped/content-one-column/check-nomap.txt b/test/xml-mapped/content-one-column/check-nomap.txt
new file mode 100644
index 0000000..8d43e1f
--- /dev/null
+++ b/test/xml-mapped/content-one-column/check-nomap.txt
@@ -0,0 +1,4 @@
+range-0/0/0:string:"data"
+range-0/1/0:string:"v1"
+range-0/2/0:string:"v2"
+range-0/3/0:string:"v3"
diff --git a/test/xml-mapped/content-one-column/input.xml b/test/xml-mapped/content-one-column/input.xml
new file mode 100644
index 0000000..e43b477
--- /dev/null
+++ b/test/xml-mapped/content-one-column/input.xml
@@ -0,0 +1,6 @@
+<?xml encoding="utf-8"?>
+<root>
+ <data>v1</data>
+ <data>v2</data>
+ <data>v3</data>
+</root>
diff --git a/test/xml-mapped/custom-labels-2/check.txt b/test/xml-mapped/custom-labels-2/check.txt
new file mode 100644
index 0000000..829dc2e
--- /dev/null
+++ b/test/xml-mapped/custom-labels-2/check.txt
@@ -0,0 +1,12 @@
+data/1/1:string:"Date Received"
+data/1/2:string:"Date Processed"
+data/1/3:string:"Received by"
+data/2/1:string:"2011-01-01"
+data/2/2:string:"2011-01-03"
+data/2/3:string:"JKB"
+data/3/1:string:"2011-01-01"
+data/3/2:string:"2011-01-04"
+data/3/3:string:"CJ"
+data/4/1:string:"2011-12-23"
+data/4/2:string:"2012-01-01"
+data/4/3:string:"KY"
diff --git a/test/xml-mapped/custom-labels-2/input.xml b/test/xml-mapped/custom-labels-2/input.xml
new file mode 100644
index 0000000..4a29806
--- /dev/null
+++ b/test/xml-mapped/custom-labels-2/input.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<a:data xmlns:a="http://ns-1" xmlns:b="http://ns-2">
+ <b:entries>
+ <b:entry b:date-received="2011-01-01" b:date-processed="2011-01-03" b:received-by="JKB"/>
+ <b:entry b:date-received="2011-01-01" b:date-processed="2011-01-04" b:received-by="CJ"/>
+ <b:entry b:date-received="2011-12-23" b:date-processed="2012-01-01" b:received-by="KY"/>
+ </b:entries>
+</a:data>
diff --git a/test/xml-mapped/custom-labels-2/map.xml b/test/xml-mapped/custom-labels-2/map.xml
new file mode 100644
index 0000000..3dcdf47
--- /dev/null
+++ b/test/xml-mapped/custom-labels-2/map.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<map xmlns="http://gitorious.org/orcus/xml-map">
+ <ns alias="x" uri="http://ns-1"/>
+ <ns alias="y" uri="http://ns-2" default="true"/>
+ <sheet name="data"/>
+ <range row="1" column="1" sheet="data">
+ <field path="/x:data/entries/entry/@date-received" label="Date Received"/>
+ <field path="/x:data/entries/entry/@date-processed" label="Date Processed"/>
+ <field path="/x:data/entries/entry/@received-by" label="Received by"/>
+ <row-group path="/x:data/entries/entry"/>
+ </range>
+</map>
diff --git a/test/xml-mapped/custom-labels/check.txt b/test/xml-mapped/custom-labels/check.txt
new file mode 100644
index 0000000..d1ebce5
--- /dev/null
+++ b/test/xml-mapped/custom-labels/check.txt
@@ -0,0 +1,27 @@
+data/0/0:string:"TOP SECRET"
+data/1/0:string:"Simple Data File"
+data/1/2:string:"2012-08-12"
+data/3/0:string:"ID"
+data/3/1:string:"First Name"
+data/3/2:string:"Last Name"
+data/3/3:string:"Test Score"
+data/4/0:numeric:1
+data/4/1:string:"Bill"
+data/4/2:string:"Clinton"
+data/4/3:numeric:456
+data/5/0:numeric:2
+data/5/1:string:"David"
+data/5/2:string:"Cameron"
+data/5/3:numeric:323
+data/6/0:numeric:3
+data/6/1:string:"Barak"
+data/6/2:string:"Obama"
+data/6/3:numeric:234
+data/7/0:numeric:4
+data/7/1:string:"Yoshihiko"
+data/7/2:string:"Noda"
+data/7/3:numeric:192
+data/8/0:numeric:5
+data/8/1:string:"Angela"
+data/8/2:string:"Merkel"
+data/8/3:numeric:210
diff --git a/test/xml-mapped/custom-labels/input.xml b/test/xml-mapped/custom-labels/input.xml
new file mode 100644
index 0000000..f6d4abc
--- /dev/null
+++ b/test/xml-mapped/custom-labels/input.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<data>
+ <label>TOP SECRET</label>
+ <header>
+ <title>Simple Data File</title>
+ </header>
+ <entries>
+ <entry>
+ <id>1</id><name><first>Bill</first><last>Clinton</last></name><score>456</score>
+ </entry>
+ <entry>
+ <id>2</id><name><first>David</first><last>Cameron</last></name><score>323</score>
+ </entry>
+ <entry>
+ <id>3</id><name><first>Barak</first><last>Obama</last></name><score>234</score>
+ </entry>
+ <entry>
+ <id>4</id><name><first>Yoshihiko</first><last>Noda</last></name><score>192</score>
+ </entry>
+ <entry>
+ <id>5</id><name><first>Angela</first><last>Merkel</last></name><score>210</score>
+ </entry>
+ </entries>
+ <footer>
+ <date>2012-08-12</date>
+ </footer>
+</data>
diff --git a/test/xml-mapped/custom-labels/map.xml b/test/xml-mapped/custom-labels/map.xml
new file mode 100644
index 0000000..0a7b64e
--- /dev/null
+++ b/test/xml-mapped/custom-labels/map.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<map xmlns="https://gitlab.com/orcus/orcus">
+ <sheet name="data"/>
+ <cell path="/data/label" row="0" column="0" sheet="data"/>
+ <cell path="/data/header/title" row="1" column="0" sheet="data"/>
+ <cell path="/data/footer/date" row="1" column="2" sheet="data"/>
+ <range row="3" column="0" sheet="data">
+ <field path="/data/entries/entry/id" label="ID"/>
+ <field path="/data/entries/entry/name/first" label="First Name"/>
+ <field path="/data/entries/entry/name/last" label="Last Name"/>
+ <field path="/data/entries/entry/score" label="Test Score"/>
+ <row-group path="/data/entries/entry"/>
+ </range>
+</map>
diff --git a/test/xml-mapped/encoding/euc-jp.xml b/test/xml-mapped/encoding/euc-jp.xml
new file mode 100644
index 0000000..30f963b
--- /dev/null
+++ b/test/xml-mapped/encoding/euc-jp.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="EUC-JP"?>
+<root>
+ <entry>ܸ죱</entry>
+ <entry>ܸ죲</entry>
+ <entry>ܸ죳</entry>
+ <entry>ܸ죴</entry>
+ <entry>ܸ죵</entry>
+ <entry>ܸ죶</entry>
+ <entry>ܸ죷</entry>
+ <entry>ܸ죸</entry>
+ <entry>ܸ죹</entry>
+</root>
diff --git a/test/xml-mapped/encoding/gbk.xml b/test/xml-mapped/encoding/gbk.xml
new file mode 100644
index 0000000..92d45e7
--- /dev/null
+++ b/test/xml-mapped/encoding/gbk.xml
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="GBK"?>
+<Kp>
+ <Version>2.0</Version>
+ <Fpxx>
+ <Zsl>43</Zsl>
+ <Fpsj>
+ <Fp>
+ <Djh/>
+ <Fpzl>ר÷Ʊ</Fpzl>
+ <Lbdm>210***3130</Lbdm>
+ <Fphm>01***724</Fphm>
+ <Kprq>202***02</Kprq>
+ <Gfmc>Ϻ***ҵ޹˾</Gfmc>
+ <Gfsh>913101***95811677F</Gfsh>
+ <Gfyhzh>Ϻ·֧31001546***050004961</Gfyhzh>
+ <Gfdzdh>Ϻв·1***A10 021-62***662</Gfdzdh>
+ <Xfmc>******޹˾</Xfmc>
+ <Xfsh>9121***826612142928</Xfsh>
+ <Xfyhzh>йũҵ***֧ 50590***0003583</Xfyhzh>
+ <Xfdzdh>*** 8922857</Xfdzdh>
+ <Hjje>94847.03</Hjje>
+ <Hjse>8536.23</Hjse>
+ <Bz/>
+ <Kpr>*</Kpr>
+ <Fhr>*Ӣ</Fhr>
+ <Skr>*Ө</Skr>
+ <Spbmbbh>39.0</Spbmbbh>
+ <Hsbz>0</Hsbz>
+ <Spxx>
+ <Sph>
+ <Xh>1</Xh>
+ <Spmc>*****</Spmc>
+ <Ggxh/>
+ <Jldw>kg</Jldw>
+ <Spbm>1030107010100000000</Spbm>
+ <Qyspbm>00005</Qyspbm>
+ <Syyhzcbz>0</Syyhzcbz>
+ <Lslbz/>
+ <Yhzcsm/>
+ <Dj>11.743119266055046</Dj>
+ <Sl>169.2</Sl>
+ <Je>1986.94</Je>
+ <Slv>0.09</Slv>
+ <Se>178.82</Se>
+ </Sph>
+ <Sph>
+ <Xh>2</Xh>
+ <Spmc>*****</Spmc>
+ <Ggxh/>
+ <Jldw>kg</Jldw>
+ <Spbm>1030107010100000000</Spbm>
+ <Qyspbm>00005</Qyspbm>
+ <Syyhzcbz>0</Syyhzcbz>
+ <Lslbz/>
+ <Yhzcsm/>
+ <Dj>11.467889908256881</Dj>
+ <Sl>385.4</Sl>
+ <Je>4419.72</Je>
+ <Slv>0.09</Slv>
+ <Se>397.78</Se>
+ </Sph>
+ <Sph>
+ <Xh>3</Xh>
+ <Spmc>*****</Spmc>
+ <Ggxh/>
+ <Jldw>kg</Jldw>
+ <Spbm>1030107010100000000</Spbm>
+ <Qyspbm>00021</Qyspbm>
+ <Syyhzcbz>0</Syyhzcbz>
+ <Lslbz/>
+ <Yhzcsm/>
+ <Dj>10.550458715596330</Dj>
+ <Sl>500</Sl>
+ <Je>5275.23</Je>
+ <Slv>0.09</Slv>
+ <Se>474.77</Se>
+ </Sph>
+ <Sph>
+ <Xh>4</Xh>
+ <Spmc>*****</Spmc>
+ <Ggxh/>
+ <Jldw>kg</Jldw>
+ <Spbm>1030107010100000000</Spbm>
+ <Qyspbm>00015</Qyspbm>
+ <Syyhzcbz>0</Syyhzcbz>
+ <Lslbz/>
+ <Yhzcsm/>
+ <Dj>33.944954128440367</Dj>
+ <Sl>2450</Sl>
+ <Je>83165.14</Je>
+ <Slv>0.09</Slv>
+ <Se>7484.86</Se>
+ </Sph>
+ </Spxx>
+ </Fp>
+ <Fp>
+ <Djh/>
+ <Fpzl>ͨƱ</Fpzl>
+ <Lbdm>0210***00404</Lbdm>
+ <Fphm>47***608</Fphm>
+ <Kprq>20***802</Kprq>
+ <Gfmc>Ϻ***ʳƷ޹˾</Gfmc>
+ <Gfsh>9131011***1334373K</Gfsh>
+ <Gfyhzh>Ϻɽ·֧ 10012469***06906246</Gfyhzh>
+ <Gfdzdh>Ϻͨ·4***Ū418¥ 52***0300</Gfdzdh>
+ <Xfmc>***޹˾</Xfmc>
+ <Xfsh>91210******12142928</Xfsh>
+ <Xfyhzh>йũҵ***֧ 50590***0003583</Xfyhzh>
+ <Xfdzdh>*** 8922857</Xfdzdh>
+ <Hjje>87590.64</Hjje>
+ <Hjse>7883.16</Hjse>
+ <Bz/>
+ <Kpr>*</Kpr>
+ <Fhr>*Ӣ</Fhr>
+ <Skr>*Ө</Skr>
+ <Spbmbbh>39.0</Spbmbbh>
+ <Hsbz>0</Hsbz>
+ <Spxx>
+ <Sph>
+ <Xh>1</Xh>
+ <Spmc>****</Spmc>
+ <Ggxh/>
+ <Jldw>kg</Jldw>
+ <Spbm>1030107010100000000</Spbm>
+ <Qyspbm>00002</Qyspbm>
+ <Syyhzcbz>0</Syyhzcbz>
+ <Lslbz/>
+ <Yhzcsm/>
+ <Dj>10.642201834862385</Dj>
+ <Sl>8230.5</Sl>
+ <Je>87590.64</Je>
+ <Slv>0.09</Slv>
+ <Se>7883.16</Se>
+ </Sph>
+ </Spxx>
+ </Fp>
+ </Fpsj>
+ </Fpxx>
+</Kp> \ No newline at end of file
diff --git a/test/xml-mapped/encoding/utf-8.xml b/test/xml-mapped/encoding/utf-8.xml
new file mode 100644
index 0000000..09d902a
--- /dev/null
+++ b/test/xml-mapped/encoding/utf-8.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<data>
+ <label>TOP SECRET</label>
+ <header>
+ <title>Simple Data File</title>
+ </header>
+ <entries>
+ <entry>
+ <id>1</id><name><first>Bill</first><last>Clinton</last></name><score>456</score>
+ </entry>
+ <entry>
+ <id>2</id><name><first>David</first><last>Cameron</last></name><score>323</score>
+ </entry>
+ <entry>
+ <id>3</id><name><first>Barak</first><last>Obama</last></name><score>234</score>
+ </entry>
+ <entry>
+ <id>4</id><name><first>Yoshihiko</first><last>Noda</last></name><score>192</score>
+ </entry>
+ <entry>
+ <id>5</id><name><first>Angela</first><last>Merkel</last></name><score>210</score>
+ </entry>
+ </entries>
+ <footer>
+ <date>2012-08-12</date>
+ </footer>
+</data>
diff --git a/test/xml-mapped/fuel-economy/check-nomap.txt b/test/xml-mapped/fuel-economy/check-nomap.txt
new file mode 100644
index 0000000..ae3e59a
--- /dev/null
+++ b/test/xml-mapped/fuel-economy/check-nomap.txt
@@ -0,0 +1,3 @@
+range-0/0/0:string:"barrels08"
+range-0/1/0:numeric:15
+range-0/2/0:numeric:29
diff --git a/test/xml-mapped/fuel-economy/check.txt b/test/xml-mapped/fuel-economy/check.txt
new file mode 100644
index 0000000..76224a9
--- /dev/null
+++ b/test/xml-mapped/fuel-economy/check.txt
@@ -0,0 +1,4 @@
+data/0/0:string:"atvType"
+data/0/1:string:"barrels08"
+data/1/1:numeric:15
+data/2/1:numeric:29
diff --git a/test/xml-mapped/fuel-economy/input.xml b/test/xml-mapped/fuel-economy/input.xml
new file mode 100644
index 0000000..dc043fe
--- /dev/null
+++ b/test/xml-mapped/fuel-economy/input.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<vehicles>
+ <vehicle>
+ <atvType/>
+ <barrels08>15</barrels08>
+ </vehicle>
+ <vehicle>
+ <atvType/>
+ <barrels08>29</barrels08>
+ </vehicle>
+</vehicles>
diff --git a/test/xml-mapped/fuel-economy/map.xml b/test/xml-mapped/fuel-economy/map.xml
new file mode 100644
index 0000000..fc20890
--- /dev/null
+++ b/test/xml-mapped/fuel-economy/map.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<map xmlns="http://gitorious.org/orcus/xml-map">
+ <sheet name="data"/>
+ <range row="0" column="0" sheet="data">
+ <field path="/vehicles/vehicle/atvType"/>
+ <field path="/vehicles/vehicle/barrels08"/>
+ <row-group path="/vehicles/vehicle"/>
+ </range>
+</map>
diff --git a/test/xml-mapped/invalids/map-defs/non-leaf-element-linked.xml b/test/xml-mapped/invalids/map-defs/non-leaf-element-linked.xml
new file mode 100644
index 0000000..de94368
--- /dev/null
+++ b/test/xml-mapped/invalids/map-defs/non-leaf-element-linked.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<map xmlns="http://gitorious.org/orcus/xml-map">
+ <sheet name="data"/>
+ <range row="3" column="0" sheet="data">
+ <field path="/data/entries/entry/name"/>
+ <field path="/data/entries/entry/name/first"/>
+ <row-group path="/data/entries/entry"/>
+ </range>
+</map>
diff --git a/test/xml-mapped/invalids/map-defs/not-xml.xml b/test/xml-mapped/invalids/map-defs/not-xml.xml
new file mode 100644
index 0000000..dce8dbc
--- /dev/null
+++ b/test/xml-mapped/invalids/map-defs/not-xml.xml
@@ -0,0 +1 @@
+asdfdasf
diff --git a/test/xml-mapped/nested-repeats-2/check-nomap.txt b/test/xml-mapped/nested-repeats-2/check-nomap.txt
new file mode 100644
index 0000000..029c983
--- /dev/null
+++ b/test/xml-mapped/nested-repeats-2/check-nomap.txt
@@ -0,0 +1,31 @@
+range-0/0/0:string:"name"
+range-0/0/1:string:"id"
+range-0/0/2:string:"ref"
+range-0/1/0:string:"foo"
+range-0/1/1:string:"A"
+range-0/1/2:numeric:123456789
+range-0/2/0:string:"foo"
+range-0/2/1:string:"A"
+range-0/2/2:numeric:987654321
+range-0/3/0:string:"foo"
+range-0/3/1:string:"B"
+range-0/3/2:numeric:1
+range-0/4/0:string:"foo"
+range-0/4/1:string:"B"
+range-0/4/2:numeric:2
+range-0/5/0:string:"foo"
+range-0/5/1:string:"B"
+range-0/5/2:numeric:3
+range-0/6/0:string:"foo"
+range-0/6/1:string:"C"
+range-0/6/2:numeric:1.1
+range-0/7/0:string:"foo"
+range-0/7/1:string:"C"
+range-0/7/2:numeric:2.2
+range-0/8/0:string:"foo"
+range-0/8/1:string:"C"
+range-0/8/2:numeric:3.3
+range-0/9/0:string:"foo"
+range-0/9/1:string:"C"
+range-0/9/2:numeric:4.4
+range-0/10/0:string:"bah"
diff --git a/test/xml-mapped/nested-repeats-2/check.txt b/test/xml-mapped/nested-repeats-2/check.txt
new file mode 100644
index 0000000..adbe04a
--- /dev/null
+++ b/test/xml-mapped/nested-repeats-2/check.txt
@@ -0,0 +1,31 @@
+data/0/0:string:"name"
+data/0/1:string:"id"
+data/0/2:string:"ref"
+data/1/0:string:"foo"
+data/1/1:string:"A"
+data/1/2:numeric:123456789
+data/2/0:string:"foo"
+data/2/1:string:"A"
+data/2/2:numeric:987654321
+data/3/0:string:"foo"
+data/3/1:string:"B"
+data/3/2:numeric:1
+data/4/0:string:"foo"
+data/4/1:string:"B"
+data/4/2:numeric:2
+data/5/0:string:"foo"
+data/5/1:string:"B"
+data/5/2:numeric:3
+data/6/0:string:"foo"
+data/6/1:string:"C"
+data/6/2:numeric:1.1
+data/7/0:string:"foo"
+data/7/1:string:"C"
+data/7/2:numeric:2.2
+data/8/0:string:"foo"
+data/8/1:string:"C"
+data/8/2:numeric:3.3
+data/9/0:string:"foo"
+data/9/1:string:"C"
+data/9/2:numeric:4.4
+data/10/0:string:"bah"
diff --git a/test/xml-mapped/nested-repeats-2/input.xml b/test/xml-mapped/nested-repeats-2/input.xml
new file mode 100644
index 0000000..325dc82
--- /dev/null
+++ b/test/xml-mapped/nested-repeats-2/input.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<osm version="0.6">
+ <parent name="foo">
+ <way id="A">
+ <nd ref="123456789"/>
+ <nd ref="987654321"/>
+ </way>
+ <way id="B">
+ <nd ref="1"/>
+ <nd ref="2"/>
+ <nd ref="3"/>
+ </way>
+ <way id="C">
+ <nd ref="1.1"/>
+ <nd ref="2.2"/>
+ <nd ref="3.3"/>
+ <nd ref="4.4"/>
+ </way>
+ </parent>
+ <parent name="bah"/>
+</osm>
diff --git a/test/xml-mapped/nested-repeats-2/map.xml b/test/xml-mapped/nested-repeats-2/map.xml
new file mode 100644
index 0000000..3a03807
--- /dev/null
+++ b/test/xml-mapped/nested-repeats-2/map.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<map xmlns="http://gitorious.org/orcus/xml-map">
+ <sheet name="data"/>
+ <range row="0" column="0" sheet="data">
+ <field path="/osm/parent/@name"/>
+ <field path="/osm/parent/way/@id"/>
+ <field path="/osm/parent/way/nd/@ref"/>
+ <row-group path="/osm/parent"/>
+ <row-group path="/osm/parent/way"/>
+ <row-group path="/osm/parent/way/nd"/>
+ </range>
+</map>
diff --git a/test/xml-mapped/nested-repeats-3/check-nomap.txt b/test/xml-mapped/nested-repeats-3/check-nomap.txt
new file mode 100644
index 0000000..e7e0703
--- /dev/null
+++ b/test/xml-mapped/nested-repeats-3/check-nomap.txt
@@ -0,0 +1,44 @@
+range-0/0/0:string:"id"
+range-0/0/1:string:"first_name"
+range-0/0/2:string:"last_name"
+range-0/0/3:string:"gender"
+range-0/0/4:string:"score"
+range-0/1/0:numeric:1
+range-0/1/1:string:"Mace"
+range-0/1/2:string:"Stainton"
+range-0/1/3:string:"Male"
+range-0/1/4:numeric:39
+range-0/2/0:numeric:1
+range-0/2/1:string:"Mace"
+range-0/2/2:string:"Stainton"
+range-0/2/3:string:"Male"
+range-0/2/4:numeric:42
+range-0/3/0:numeric:1
+range-0/3/1:string:"Mace"
+range-0/3/2:string:"Stainton"
+range-0/3/3:string:"Male"
+range-0/3/4:numeric:58
+range-0/4/0:numeric:2
+range-0/4/1:string:"Kelley"
+range-0/4/2:string:"Schelle"
+range-0/4/3:string:"Female"
+range-0/4/4:numeric:96
+range-0/5/0:numeric:2
+range-0/5/1:string:"Kelley"
+range-0/5/2:string:"Schelle"
+range-0/5/3:string:"Female"
+range-0/5/4:numeric:158
+range-0/6/0:numeric:2
+range-0/6/1:string:"Kelley"
+range-0/6/2:string:"Schelle"
+range-0/6/3:string:"Female"
+range-0/6/4:numeric:23
+range-0/7/0:numeric:2
+range-0/7/1:string:"Kelley"
+range-0/7/2:string:"Schelle"
+range-0/7/3:string:"Female"
+range-0/7/4:numeric:44
+range-0/8/0:numeric:3
+range-0/8/1:string:"Ashbey"
+range-0/8/2:string:"Fishly"
+range-0/8/3:string:"Male"
diff --git a/test/xml-mapped/nested-repeats-3/check.txt b/test/xml-mapped/nested-repeats-3/check.txt
new file mode 100644
index 0000000..33bc184
--- /dev/null
+++ b/test/xml-mapped/nested-repeats-3/check.txt
@@ -0,0 +1,44 @@
+data/0/0:string:"id"
+data/0/1:string:"first_name"
+data/0/2:string:"last_name"
+data/0/3:string:"gender"
+data/0/4:string:"score"
+data/1/0:numeric:1
+data/1/1:string:"Mace"
+data/1/2:string:"Stainton"
+data/1/3:string:"Male"
+data/1/4:numeric:39
+data/2/0:numeric:1
+data/2/1:string:"Mace"
+data/2/2:string:"Stainton"
+data/2/3:string:"Male"
+data/2/4:numeric:42
+data/3/0:numeric:1
+data/3/1:string:"Mace"
+data/3/2:string:"Stainton"
+data/3/3:string:"Male"
+data/3/4:numeric:58
+data/4/0:numeric:2
+data/4/1:string:"Kelley"
+data/4/2:string:"Schelle"
+data/4/3:string:"Female"
+data/4/4:numeric:96
+data/5/0:numeric:2
+data/5/1:string:"Kelley"
+data/5/2:string:"Schelle"
+data/5/3:string:"Female"
+data/5/4:numeric:158
+data/6/0:numeric:2
+data/6/1:string:"Kelley"
+data/6/2:string:"Schelle"
+data/6/3:string:"Female"
+data/6/4:numeric:23
+data/7/0:numeric:2
+data/7/1:string:"Kelley"
+data/7/2:string:"Schelle"
+data/7/3:string:"Female"
+data/7/4:numeric:44
+data/8/0:numeric:3
+data/8/1:string:"Ashbey"
+data/8/2:string:"Fishly"
+data/8/3:string:"Male"
diff --git a/test/xml-mapped/nested-repeats-3/input.xml b/test/xml-mapped/nested-repeats-3/input.xml
new file mode 100644
index 0000000..883142d
--- /dev/null
+++ b/test/xml-mapped/nested-repeats-3/input.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<dataset>
+ <record>
+ <id>1</id>
+ <first_name>Mace</first_name>
+ <last_name>Stainton</last_name>
+ <gender>Male</gender>
+ <scores>
+ <score>39</score>
+ <score>42</score>
+ <score>58</score>
+ </scores>
+ </record>
+ <record>
+ <id>2</id>
+ <first_name>Kelley</first_name>
+ <last_name>Schelle</last_name>
+ <gender>Female</gender>
+ <scores>
+ <score>96</score>
+ <score>158</score>
+ <score>23</score>
+ <score>44</score>
+ </scores>
+ </record>
+ <record>
+ <id>3</id>
+ <first_name>Ashbey</first_name>
+ <last_name>Fishly</last_name>
+ <gender>Male</gender>
+ </record>
+</dataset>
diff --git a/test/xml-mapped/nested-repeats-3/map.xml b/test/xml-mapped/nested-repeats-3/map.xml
new file mode 100644
index 0000000..ec0fdef
--- /dev/null
+++ b/test/xml-mapped/nested-repeats-3/map.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<map xmlns="http://gitorious.org/orcus/xml-map">
+ <sheet name="data"/>
+ <range row="0" column="0" sheet="data">
+ <field path="/dataset/record/id"/>
+ <field path="/dataset/record/first_name"/>
+ <field path="/dataset/record/last_name"/>
+ <field path="/dataset/record/gender"/>
+ <field path="/dataset/record/scores/score"/>
+ <row-group path="/dataset/record"/>
+ <row-group path="/dataset/record/scores/score"/>
+ </range>
+</map>
diff --git a/test/xml-mapped/nested-repeats-4/check-nomap.txt b/test/xml-mapped/nested-repeats-4/check-nomap.txt
new file mode 100644
index 0000000..5b6d8ff
--- /dev/null
+++ b/test/xml-mapped/nested-repeats-4/check-nomap.txt
@@ -0,0 +1,44 @@
+range-0/0/0:string:"id"
+range-0/0/1:string:"first"
+range-0/0/2:string:"last"
+range-0/0/3:string:"gender"
+range-0/0/4:string:"score"
+range-0/1/0:numeric:1
+range-0/1/1:string:"Mace"
+range-0/1/2:string:"Stainton"
+range-0/1/3:string:"Male"
+range-0/1/4:numeric:39
+range-0/2/0:numeric:1
+range-0/2/1:string:"Mace"
+range-0/2/2:string:"Stainton"
+range-0/2/3:string:"Male"
+range-0/2/4:numeric:42
+range-0/3/0:numeric:1
+range-0/3/1:string:"Mace"
+range-0/3/2:string:"Stainton"
+range-0/3/3:string:"Male"
+range-0/3/4:numeric:58
+range-0/4/0:numeric:2
+range-0/4/1:string:"Kelley"
+range-0/4/2:string:"Schelle"
+range-0/4/3:string:"Female"
+range-0/4/4:numeric:96
+range-0/5/0:numeric:2
+range-0/5/1:string:"Kelley"
+range-0/5/2:string:"Schelle"
+range-0/5/3:string:"Female"
+range-0/5/4:numeric:158
+range-0/6/0:numeric:2
+range-0/6/1:string:"Kelley"
+range-0/6/2:string:"Schelle"
+range-0/6/3:string:"Female"
+range-0/6/4:numeric:23
+range-0/7/0:numeric:2
+range-0/7/1:string:"Kelley"
+range-0/7/2:string:"Schelle"
+range-0/7/3:string:"Female"
+range-0/7/4:numeric:44
+range-0/8/0:numeric:3
+range-0/8/1:string:"Ashbey"
+range-0/8/2:string:"Fishly"
+range-0/8/3:string:"Male"
diff --git a/test/xml-mapped/nested-repeats-4/check.txt b/test/xml-mapped/nested-repeats-4/check.txt
new file mode 100644
index 0000000..a576382
--- /dev/null
+++ b/test/xml-mapped/nested-repeats-4/check.txt
@@ -0,0 +1,44 @@
+data/0/0:string:"id"
+data/0/1:string:"first"
+data/0/2:string:"last"
+data/0/3:string:"gender"
+data/0/4:string:"score"
+data/1/0:numeric:1
+data/1/1:string:"Mace"
+data/1/2:string:"Stainton"
+data/1/3:string:"Male"
+data/1/4:numeric:39
+data/2/0:numeric:1
+data/2/1:string:"Mace"
+data/2/2:string:"Stainton"
+data/2/3:string:"Male"
+data/2/4:numeric:42
+data/3/0:numeric:1
+data/3/1:string:"Mace"
+data/3/2:string:"Stainton"
+data/3/3:string:"Male"
+data/3/4:numeric:58
+data/4/0:numeric:2
+data/4/1:string:"Kelley"
+data/4/2:string:"Schelle"
+data/4/3:string:"Female"
+data/4/4:numeric:96
+data/5/0:numeric:2
+data/5/1:string:"Kelley"
+data/5/2:string:"Schelle"
+data/5/3:string:"Female"
+data/5/4:numeric:158
+data/6/0:numeric:2
+data/6/1:string:"Kelley"
+data/6/2:string:"Schelle"
+data/6/3:string:"Female"
+data/6/4:numeric:23
+data/7/0:numeric:2
+data/7/1:string:"Kelley"
+data/7/2:string:"Schelle"
+data/7/3:string:"Female"
+data/7/4:numeric:44
+data/8/0:numeric:3
+data/8/1:string:"Ashbey"
+data/8/2:string:"Fishly"
+data/8/3:string:"Male"
diff --git a/test/xml-mapped/nested-repeats-4/input.xml b/test/xml-mapped/nested-repeats-4/input.xml
new file mode 100644
index 0000000..4f50b59
--- /dev/null
+++ b/test/xml-mapped/nested-repeats-4/input.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<dataset>
+ <record>
+ <id>1</id>
+ <name>
+ <first>Mace</first>
+ <last>Stainton</last>
+ </name>
+ <gender>Male</gender>
+ <scores>
+ <score>39</score>
+ <score>42</score>
+ <score>58</score>
+ </scores>
+ </record>
+ <record>
+ <id>2</id>
+ <name>
+ <first>Kelley</first>
+ <last>Schelle</last>
+ </name>
+ <gender>Female</gender>
+ <scores>
+ <score>96</score>
+ <score>158</score>
+ <score>23</score>
+ <score>44</score>
+ </scores>
+ </record>
+ <record>
+ <id>3</id>
+ <name>
+ <first>Ashbey</first>
+ <last>Fishly</last>
+ </name>
+ <gender>Male</gender>
+ </record>
+</dataset>
diff --git a/test/xml-mapped/nested-repeats-4/map.xml b/test/xml-mapped/nested-repeats-4/map.xml
new file mode 100644
index 0000000..284bffe
--- /dev/null
+++ b/test/xml-mapped/nested-repeats-4/map.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<map xmlns="http://gitorious.org/orcus/xml-map">
+ <sheet name="data"/>
+ <range row="0" column="0" sheet="data">
+ <field path="/dataset/record/id"/>
+ <field path="/dataset/record/name/first"/>
+ <field path="/dataset/record/name/last"/>
+ <field path="/dataset/record/gender"/>
+ <field path="/dataset/record/scores/score"/>
+ <row-group path="/dataset/record"/>
+ <row-group path="/dataset/record/scores/score"/>
+ </range>
+</map>
diff --git a/test/xml-mapped/nested-repeats/check-nomap.txt b/test/xml-mapped/nested-repeats/check-nomap.txt
new file mode 100644
index 0000000..2afd080
--- /dev/null
+++ b/test/xml-mapped/nested-repeats/check-nomap.txt
@@ -0,0 +1,20 @@
+range-0/0/0:string:"id"
+range-0/0/1:string:"ref"
+range-0/1/0:string:"A"
+range-0/1/1:numeric:123456789
+range-0/2/0:string:"A"
+range-0/2/1:numeric:987654321
+range-0/3/0:string:"B"
+range-0/3/1:numeric:1
+range-0/4/0:string:"B"
+range-0/4/1:numeric:2
+range-0/5/0:string:"B"
+range-0/5/1:numeric:3
+range-0/6/0:string:"C"
+range-0/6/1:numeric:1.1
+range-0/7/0:string:"C"
+range-0/7/1:numeric:2.2
+range-0/8/0:string:"C"
+range-0/8/1:numeric:3.3
+range-0/9/0:string:"C"
+range-0/9/1:numeric:4.4
diff --git a/test/xml-mapped/nested-repeats/check.txt b/test/xml-mapped/nested-repeats/check.txt
new file mode 100644
index 0000000..9672007
--- /dev/null
+++ b/test/xml-mapped/nested-repeats/check.txt
@@ -0,0 +1,20 @@
+data/0/0:string:"id"
+data/0/1:string:"ref"
+data/1/0:string:"A"
+data/1/1:numeric:123456789
+data/2/0:string:"A"
+data/2/1:numeric:987654321
+data/3/0:string:"B"
+data/3/1:numeric:1
+data/4/0:string:"B"
+data/4/1:numeric:2
+data/5/0:string:"B"
+data/5/1:numeric:3
+data/6/0:string:"C"
+data/6/1:numeric:1.1
+data/7/0:string:"C"
+data/7/1:numeric:2.2
+data/8/0:string:"C"
+data/8/1:numeric:3.3
+data/9/0:string:"C"
+data/9/1:numeric:4.4
diff --git a/test/xml-mapped/nested-repeats/input.xml b/test/xml-mapped/nested-repeats/input.xml
new file mode 100644
index 0000000..8828369
--- /dev/null
+++ b/test/xml-mapped/nested-repeats/input.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<osm version="0.6">
+ <way id="A">
+ <nd ref="123456789"/>
+ <nd ref="987654321"/>
+ </way>
+ <way id="B">
+ <nd ref="1"/>
+ <nd ref="2"/>
+ <nd ref="3"/>
+ </way>
+ <way id="C">
+ <nd ref="1.1"/>
+ <nd ref="2.2"/>
+ <nd ref="3.3"/>
+ <nd ref="4.4"/>
+ </way>
+</osm>
diff --git a/test/xml-mapped/nested-repeats/map.xml b/test/xml-mapped/nested-repeats/map.xml
new file mode 100644
index 0000000..60b1743
--- /dev/null
+++ b/test/xml-mapped/nested-repeats/map.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<map xmlns="http://gitorious.org/orcus/xml-map">
+ <sheet name="data"/>
+ <range row="0" column="0" sheet="data">
+ <field path="/osm/way/@id"/>
+ <field path="/osm/way/nd/@ref"/>
+ <row-group path="/osm/way"/>
+ <row-group path="/osm/way/nd"/>
+ </range>
+</map>
diff --git a/test/xml-structure/attribute-1/check.txt b/test/xml-structure/attribute-1/check.txt
new file mode 100644
index 0000000..02bc1cb
--- /dev/null
+++ b/test/xml-structure/attribute-1/check.txt
@@ -0,0 +1,7 @@
+/root
+/root/@version
+/root/@type
+/root/entry[*]
+/root/entry[*]/@attr1
+/root/entry[*]/@attr2
+/root/entry[*]/@attr3
diff --git a/test/xml-structure/attribute-1/input.xml b/test/xml-structure/attribute-1/input.xml
new file mode 100644
index 0000000..fabfeda
--- /dev/null
+++ b/test/xml-structure/attribute-1/input.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+<root version="2.1" type="a">
+ <entry attr1="val1" attr2="val2"/>
+ <entry attr2="val2" attr3="foo"/>
+</root>
diff --git a/test/xml-structure/basic-1/check.txt b/test/xml-structure/basic-1/check.txt
new file mode 100644
index 0000000..95e0737
--- /dev/null
+++ b/test/xml-structure/basic-1/check.txt
@@ -0,0 +1,5 @@
+/root
+/root/entry[*]
+/root/entry[*]/name
+/root/entry[*]/id
+
diff --git a/test/xml-structure/basic-1/input.xml b/test/xml-structure/basic-1/input.xml
new file mode 100644
index 0000000..e7c95a9
--- /dev/null
+++ b/test/xml-structure/basic-1/input.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<!--When recurring elements contain inconsistent set of child elements, we assume that such element structurally contain union of all encountered child elements. -->
+<root>
+ <entry>
+ <name>Foo</name>
+ </entry>
+ <entry>
+ <id>12</id>
+ </entry>
+ <entry>
+ <name>Bah</name>
+ </entry>
+</root>
diff --git a/test/xml-structure/basic-2/check.txt b/test/xml-structure/basic-2/check.txt
new file mode 100644
index 0000000..2072ab1
--- /dev/null
+++ b/test/xml-structure/basic-2/check.txt
@@ -0,0 +1,5 @@
+/root
+/root/name
+/root/age
+/root/nickname
+
diff --git a/test/xml-structure/basic-2/input.xml b/test/xml-structure/basic-2/input.xml
new file mode 100644
index 0000000..1466be4
--- /dev/null
+++ b/test/xml-structure/basic-2/input.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<!--This one has no recurring sub-structure at all.-->
+<root>
+ <name>Thomas Anderson</name>
+ <age>unknown</age>
+ <nickname>Neo</nickname>
+</root>
diff --git a/test/xml-structure/basic-3/check.txt b/test/xml-structure/basic-3/check.txt
new file mode 100644
index 0000000..81a05a6
--- /dev/null
+++ b/test/xml-structure/basic-3/check.txt
@@ -0,0 +1,9 @@
+/data
+/data/entries
+/data/entries/entry[*]
+/data/entries/entry[*]/id
+/data/entries/entry[*]/name
+/data/entries/entry[*]/name/first
+/data/entries/entry[*]/name/last
+/data/entries/entry[*]/nickname
+/data/entries/entry[*]/gender
diff --git a/test/xml-structure/basic-3/input.xml b/test/xml-structure/basic-3/input.xml
new file mode 100644
index 0000000..4eee597
--- /dev/null
+++ b/test/xml-structure/basic-3/input.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<data>
+ <entries>
+ <entry>
+ <id>0</id>
+ <name>
+ <first>Thomas</first>
+ <last>Anderson</last>
+ </name>
+ <nickname>Neo</nickname>
+ <gender>male</gender>
+ </entry>
+ <entry>
+ <id>1</id>
+ <nickname>Trinity</nickname>
+ <gender>female</gender>
+ </entry>
+ </entries>
+</data>
diff --git a/test/xml-structure/namespace-default/check.txt b/test/xml-structure/namespace-default/check.txt
new file mode 100644
index 0000000..811b06b
--- /dev/null
+++ b/test/xml-structure/namespace-default/check.txt
@@ -0,0 +1,5 @@
+ns0="http://test.test.org/"
+/ns0:root
+/ns0:root/ns0:entry
+/ns0:root/ns0:entry/ns0:name
+
diff --git a/test/xml-structure/namespace-default/input.xml b/test/xml-structure/namespace-default/input.xml
new file mode 100644
index 0000000..012dd06
--- /dev/null
+++ b/test/xml-structure/namespace-default/input.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<root xmlns="http://test.test.org/">
+ <entry>
+ <name>Foo</name>
+ </entry>
+</root>
diff --git a/test/xml-structure/nested-repeat-1/check.txt b/test/xml-structure/nested-repeat-1/check.txt
new file mode 100644
index 0000000..8d6380e
--- /dev/null
+++ b/test/xml-structure/nested-repeat-1/check.txt
@@ -0,0 +1,12 @@
+/root
+/root/mode
+/root/mode/insert[*]
+/root/mode/insert[*]/command
+/root/mode/insert[*]/command/@name
+/root/mode/remove[*]
+/root/mode/remove[*]/command
+/root/mode/remove[*]/command/@name
+/root/mode/edit
+/root/mode/edit/command
+/root/mode/edit/command/@name
+
diff --git a/test/xml-structure/nested-repeat-1/input.xml b/test/xml-structure/nested-repeat-1/input.xml
new file mode 100644
index 0000000..9f190cc
--- /dev/null
+++ b/test/xml-structure/nested-repeat-1/input.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<root>
+ <mode>
+ <insert>
+ <command name="foo"/>
+ </insert>
+ <remove>
+ <command name="foo"/>
+ </remove>
+ <insert>
+ <command name="baa"/>
+ </insert>
+ <remove>
+ <command name="baa"/>
+ </remove>
+ <edit>
+ <command name="non-repeat"/>
+ </edit>
+ </mode>
+</root>
diff --git a/test/xml/bom/check.txt b/test/xml/bom/check.txt
new file mode 100644
index 0000000..3ec9051
--- /dev/null
+++ b/test/xml/bom/check.txt
@@ -0,0 +1,11 @@
+ns0="http://schemas.openxmlformats.org/package/2006/content-types"
+/ns0:Types
+/ns0:Types/ns0:Default
+/ns0:Types/ns0:Default@ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"
+/ns0:Types/ns0:Default@Extension="xml"
+/ns0:Types/ns0:Default
+/ns0:Types/ns0:Default@ContentType="application/vnd.openxmlformats-package.relationships+xml"
+/ns0:Types/ns0:Default@Extension="rels"
+/ns0:Types/ns0:Override
+/ns0:Types/ns0:Override@ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"
+/ns0:Types/ns0:Override@PartName="/xl/worksheets/sheet.xml"
diff --git a/test/xml/bom/input.xml b/test/xml/bom/input.xml
new file mode 100644
index 0000000..2a7290b
--- /dev/null
+++ b/test/xml/bom/input.xml
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="utf-8"?><Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"><Default Extension="xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml" /><Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml" /><Override PartName="/xl/worksheets/sheet.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml" /></Types> \ No newline at end of file
diff --git a/test/xml/cdata-1/check.txt b/test/xml/cdata-1/check.txt
new file mode 100644
index 0000000..27bb3fe
--- /dev/null
+++ b/test/xml/cdata-1/check.txt
@@ -0,0 +1,18 @@
+/root
+/root/header
+/root/header"simple text"
+/root/header
+/root/header"[[inside double braces]]"
+/root/header
+/root/header"multiple"
+/root/header"CDATA"
+/root/header"in succession"
+/root/header
+/root/header"<html><body>...</body></html>"
+/root/header
+/root/header"!@#$%^&*()"
+/root/header
+/root/header"$amp;"
+/root/header
+/root/header"Normal character data and"
+/root/header"CDATA"
diff --git a/test/xml/cdata-1/input.xml b/test/xml/cdata-1/input.xml
new file mode 100644
index 0000000..d5f4e5f
--- /dev/null
+++ b/test/xml/cdata-1/input.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<root>
+ <header><![CDATA[simple text]]></header>
+ <header><![CDATA[[[inside double braces]]]]></header>
+ <header><![CDATA[multiple]]><![CDATA[CDATA]]><![CDATA[in succession]]></header>
+ <header><![CDATA[<html><body>...</body></html>]]></header><!-- make sure tags are not parsed as xml -->
+ <header><![CDATA[!@#$%^&*()]]></header>
+ <header><![CDATA[$amp;]]></header><!-- encoded characters are taken literally without decoding -->
+ <header>Normal character data and <![CDATA[CDATA]]></header>
+</root>
diff --git a/test/xml/custom-decl-1/check.txt b/test/xml/custom-decl-1/check.txt
new file mode 100644
index 0000000..ac564ae
--- /dev/null
+++ b/test/xml/custom-decl-1/check.txt
@@ -0,0 +1,99 @@
+ns0="urn:schemas-microsoft-com:office:spreadsheet"
+ns1="urn:schemas-microsoft-com:office:component:spreadsheet"
+ns2="http://www.w3.org/TR/REC-html40"
+ns3="urn:schemas-microsoft-com:office:office"
+ns4="http://schemas.microsoft.com/office/excel/2003/xml"
+ns5="urn:schemas-microsoft-com:office:excel"
+ns6="http://www.w3.org/2001/XMLSchema-instance"
+/ns0:Workbook
+/ns0:Workbook/ns3:OfficeDocumentSettings
+/ns0:Workbook/ns3:OfficeDocumentSettings/ns3:Colors
+/ns0:Workbook/ns3:OfficeDocumentSettings/ns3:Colors/ns3:Color
+/ns0:Workbook/ns3:OfficeDocumentSettings/ns3:Colors/ns3:Color/ns3:Index
+/ns0:Workbook/ns3:OfficeDocumentSettings/ns3:Colors/ns3:Color/ns3:Index"3"
+/ns0:Workbook/ns3:OfficeDocumentSettings/ns3:Colors/ns3:Color/ns3:RGB
+/ns0:Workbook/ns3:OfficeDocumentSettings/ns3:Colors/ns3:Color/ns3:RGB"#c0c0c0"
+/ns0:Workbook/ns3:OfficeDocumentSettings/ns3:Colors/ns3:Color
+/ns0:Workbook/ns3:OfficeDocumentSettings/ns3:Colors/ns3:Color/ns3:Index
+/ns0:Workbook/ns3:OfficeDocumentSettings/ns3:Colors/ns3:Color/ns3:Index"4"
+/ns0:Workbook/ns3:OfficeDocumentSettings/ns3:Colors/ns3:Color/ns3:RGB
+/ns0:Workbook/ns3:OfficeDocumentSettings/ns3:Colors/ns3:Color/ns3:RGB"#ff0000"
+/ns0:Workbook/ns5:ExcelWorkbook
+/ns0:Workbook/ns5:ExcelWorkbook/ns5:WindowHeight
+/ns0:Workbook/ns5:ExcelWorkbook/ns5:WindowHeight"9000"
+/ns0:Workbook/ns5:ExcelWorkbook/ns5:WindowWidth
+/ns0:Workbook/ns5:ExcelWorkbook/ns5:WindowWidth"13860"
+/ns0:Workbook/ns5:ExcelWorkbook/ns5:WindowTopX
+/ns0:Workbook/ns5:ExcelWorkbook/ns5:WindowTopX"240"
+/ns0:Workbook/ns5:ExcelWorkbook/ns5:WindowTopY
+/ns0:Workbook/ns5:ExcelWorkbook/ns5:WindowTopY"75"
+/ns0:Workbook/ns5:ExcelWorkbook/ns5:ProtectStructure
+/ns0:Workbook/ns5:ExcelWorkbook/ns5:ProtectStructure"False"
+/ns0:Workbook/ns5:ExcelWorkbook/ns5:ProtectWindows
+/ns0:Workbook/ns5:ExcelWorkbook/ns5:ProtectWindows"False"
+/ns0:Workbook/ns0:Styles
+/ns0:Workbook/ns0:Styles/ns0:Style
+/ns0:Workbook/ns0:Styles/ns0:Style@ns0:ID="Default"
+/ns0:Workbook/ns0:Styles/ns0:Style@ns0:Name="Default"
+/ns0:Workbook/ns0:Styles/ns0:Style
+/ns0:Workbook/ns0:Styles/ns0:Style@ns0:ID="Result"
+/ns0:Workbook/ns0:Styles/ns0:Style@ns0:Name="Result"
+/ns0:Workbook/ns0:Styles/ns0:Style/ns0:Font
+/ns0:Workbook/ns0:Styles/ns0:Style/ns0:Font@ns0:Bold="1"
+/ns0:Workbook/ns0:Styles/ns0:Style/ns0:Font@ns0:Italic="1"
+/ns0:Workbook/ns0:Styles/ns0:Style/ns0:Font@ns0:Underline="Single"
+/ns0:Workbook/ns0:Styles/ns0:Style
+/ns0:Workbook/ns0:Styles/ns0:Style@ns0:ID="Result2"
+/ns0:Workbook/ns0:Styles/ns0:Style@ns0:Name="Result2"
+/ns0:Workbook/ns0:Styles/ns0:Style/ns0:Font
+/ns0:Workbook/ns0:Styles/ns0:Style/ns0:Font@ns0:Bold="1"
+/ns0:Workbook/ns0:Styles/ns0:Style/ns0:Font@ns0:Italic="1"
+/ns0:Workbook/ns0:Styles/ns0:Style/ns0:Font@ns0:Underline="Single"
+/ns0:Workbook/ns0:Styles/ns0:Style/ns0:NumberFormat
+/ns0:Workbook/ns0:Styles/ns0:Style/ns0:NumberFormat@ns0:Format="Currency"
+/ns0:Workbook/ns0:Styles/ns0:Style
+/ns0:Workbook/ns0:Styles/ns0:Style@ns0:ID="Heading"
+/ns0:Workbook/ns0:Styles/ns0:Style@ns0:Name="Heading"
+/ns0:Workbook/ns0:Styles/ns0:Style/ns0:Font
+/ns0:Workbook/ns0:Styles/ns0:Style/ns0:Font@ns0:Bold="1"
+/ns0:Workbook/ns0:Styles/ns0:Style/ns0:Font@ns0:Italic="1"
+/ns0:Workbook/ns0:Styles/ns0:Style/ns0:Font@ns0:Size="16"
+/ns0:Workbook/ns0:Styles/ns0:Style
+/ns0:Workbook/ns0:Styles/ns0:Style@ns0:ID="Heading1"
+/ns0:Workbook/ns0:Styles/ns0:Style@ns0:Name="Heading1"
+/ns0:Workbook/ns0:Styles/ns0:Style/ns0:Font
+/ns0:Workbook/ns0:Styles/ns0:Style/ns0:Font@ns0:Bold="1"
+/ns0:Workbook/ns0:Styles/ns0:Style/ns0:Font@ns0:Italic="1"
+/ns0:Workbook/ns0:Styles/ns0:Style/ns0:Font@ns0:Size="16"
+/ns0:Workbook/ns0:Styles/ns0:Style
+/ns0:Workbook/ns0:Styles/ns0:Style@ns0:ID="co1"
+/ns0:Workbook/ns0:Styles/ns0:Style
+/ns0:Workbook/ns0:Styles/ns0:Style@ns0:ID="ta1"
+/ns0:Workbook/ns0:Worksheet
+/ns0:Workbook/ns0:Worksheet@ns0:Name="Sheet1"
+/ns0:Workbook/ns0:Worksheet/ns0:Table
+/ns0:Workbook/ns0:Worksheet/ns0:Table@ns0:StyleID="ta1"
+/ns0:Workbook/ns0:Worksheet/ns0:Table/ns0:Column
+/ns0:Workbook/ns0:Worksheet/ns0:Table/ns0:Column@ns0:Span="1"
+/ns0:Workbook/ns0:Worksheet/ns0:Table/ns0:Column@ns0:Width="64.0063"
+/ns0:Workbook/ns0:Worksheet/ns0:Table/ns0:Row
+/ns0:Workbook/ns0:Worksheet/ns0:Table/ns0:Row@ns0:Height="12.8126"
+/ns0:Workbook/ns0:Worksheet/ns0:Table/ns0:Row/ns0:Cell
+/ns0:Workbook/ns0:Worksheet/ns0:Table/ns0:Row/ns0:Cell/ns0:Data
+/ns0:Workbook/ns0:Worksheet/ns0:Table/ns0:Row/ns0:Cell/ns0:Data@ns0:Type="String"
+/ns0:Workbook/ns0:Worksheet/ns0:Table/ns0:Row/ns0:Cell/ns0:Data"a"
+/ns0:Workbook/ns0:Worksheet/ns0:Table/ns0:Row/ns0:Cell
+/ns0:Workbook/ns0:Worksheet/ns0:Table/ns0:Row/ns0:Cell/ns0:Data
+/ns0:Workbook/ns0:Worksheet/ns0:Table/ns0:Row/ns0:Cell/ns0:Data@ns0:Type="String"
+/ns0:Workbook/ns0:Worksheet/ns0:Table/ns0:Row/ns0:Cell/ns0:Data"b"
+/ns0:Workbook/ns0:Worksheet/ns0:Table/ns0:Row
+/ns0:Workbook/ns0:Worksheet/ns0:Table/ns0:Row@ns0:Height="12.8126"
+/ns0:Workbook/ns0:Worksheet/ns0:Table/ns0:Row/ns0:Cell
+/ns0:Workbook/ns0:Worksheet/ns0:Table/ns0:Row/ns0:Cell/ns0:Data
+/ns0:Workbook/ns0:Worksheet/ns0:Table/ns0:Row/ns0:Cell/ns0:Data@ns0:Type="String"
+/ns0:Workbook/ns0:Worksheet/ns0:Table/ns0:Row/ns0:Cell/ns0:Data"c"
+/ns0:Workbook/ns0:Worksheet/ns0:Table/ns0:Row/ns0:Cell
+/ns0:Workbook/ns0:Worksheet/ns0:Table/ns0:Row/ns0:Cell/ns0:Data
+/ns0:Workbook/ns0:Worksheet/ns0:Table/ns0:Row/ns0:Cell/ns0:Data@ns0:Type="String"
+/ns0:Workbook/ns0:Worksheet/ns0:Table/ns0:Row/ns0:Cell/ns0:Data"d"
+/ns0:Workbook/ns0:Worksheet/ns5:WorksheetOptions
diff --git a/test/xml/custom-decl-1/input.xml b/test/xml/custom-decl-1/input.xml
new file mode 100644
index 0000000..146ee57
--- /dev/null
+++ b/test/xml/custom-decl-1/input.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office"><Colors><Color><Index>3</Index><RGB>#c0c0c0</RGB></Color><Color><Index>4</Index><RGB>#ff0000</RGB></Color></Colors></OfficeDocumentSettings><ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"><WindowHeight>9000</WindowHeight><WindowWidth>13860</WindowWidth><WindowTopX>240</WindowTopX><WindowTopY>75</WindowTopY><ProtectStructure>False</ProtectStructure><ProtectWindows>False</ProtectWindows></ExcelWorkbook><Styles><Style ss:ID="Default" ss:Name="Default"/><Style ss:ID="Result" ss:Name="Result"><Font ss:Bold="1" ss:Italic="1" ss:Underline="Single"/></Style><Style ss:ID="Result2" ss:Name="Result2"><Font ss:Bold="1" ss:Italic="1" ss:Underline="Single"/><NumberFormat ss:Format="Currency"/></Style><Style ss:ID="Heading" ss:Name="Heading"><Font ss:Bold="1" ss:Italic="1" ss:Size="16"/></Style><Style ss:ID="Heading1" ss:Name="Heading1"><Font ss:Bold="1" ss:Italic="1" ss:Size="16"/></Style><Style ss:ID="co1"/><Style ss:ID="ta1"/></Styles><ss:Worksheet ss:Name="Sheet1"><Table ss:StyleID="ta1"><Column ss:Span="1" ss:Width="64.0063"/><Row ss:Height="12.8126"><Cell><Data ss:Type="String">a</Data></Cell><Cell><Data ss:Type="String">b</Data></Cell></Row><Row ss:Height="12.8126"><Cell><Data ss:Type="String">c</Data></Cell><Cell><Data ss:Type="String">d</Data></Cell></Row></Table><x:WorksheetOptions/></ss:Worksheet></Workbook> \ No newline at end of file
diff --git a/test/xml/default-ns/check.txt b/test/xml/default-ns/check.txt
new file mode 100644
index 0000000..1497b8d
--- /dev/null
+++ b/test/xml/default-ns/check.txt
@@ -0,0 +1,17 @@
+ns0="http://some.xmlns.org/1.0"
+ns1="http://some.xmlns.org/2.0"
+/ns0:data
+/ns0:data/ns0:entries
+/ns0:data/ns0:entries@count="2"
+/ns0:data/ns0:entries/ns0:entry
+/ns0:data/ns0:entries/ns0:entry"Foo"
+/ns0:data/ns0:entries/ns0:entry
+/ns0:data/ns0:entries/ns0:entry"Baa"
+/ns0:data/ns1:entries
+/ns0:data/ns1:entries@count="3"
+/ns0:data/ns1:entries/ns1:entry
+/ns0:data/ns1:entries/ns1:entry@value="One"
+/ns0:data/ns1:entries/ns1:entry
+/ns0:data/ns1:entries/ns1:entry@value="Two"
+/ns0:data/ns1:entries/ns1:entry
+/ns0:data/ns1:entries/ns1:entry@value="Three"
diff --git a/test/xml/default-ns/input.xml b/test/xml/default-ns/input.xml
new file mode 100644
index 0000000..ec69874
--- /dev/null
+++ b/test/xml/default-ns/input.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<data xmlns="http://some.xmlns.org/1.0">
+ <entries count="2">
+ <entry>Foo</entry>
+ <entry>Baa</entry>
+ </entries>
+ <entries xmlns="http://some.xmlns.org/2.0" count="3">
+ <entry value="One"/>
+ <entry value="Two"/>
+ <entry value="Three"/>
+ </entries>
+</data>
diff --git a/test/xml/doctype/html.xml b/test/xml/doctype/html.xml
new file mode 100644
index 0000000..1d37890
--- /dev/null
+++ b/test/xml/doctype/html.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<!DOCTYPE html PUBLIC
+ "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+ <body></body>
+</html>
diff --git a/test/xml/encoded-attrs/test1.xml b/test/xml/encoded-attrs/test1.xml
new file mode 100644
index 0000000..ffce99c
--- /dev/null
+++ b/test/xml/encoded-attrs/test1.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <elem attr1="1 &amp; 2" attr2="3 &amp; 4" attr3="5 &amp; 6"/>
+</root>
+
diff --git a/test/xml/encoded-char/check.txt b/test/xml/encoded-char/check.txt
new file mode 100644
index 0000000..5aba73d
--- /dev/null
+++ b/test/xml/encoded-char/check.txt
@@ -0,0 +1,19 @@
+/root
+/root/data
+/root/data"Tom & Jerry"
+/root/data
+/root/data@attr="Black & Whilte"
+/root/data@attr2="'quoted'"
+/root/data"This is 'single-quoted', and this is \"double-quoted\"."
+/root/data
+/root/data@attr="<>'\"&"
+/root/data"Less than (<) and greater than (>) are also encoded."
+/root/data
+/root/data"<>'\"&"
+/root/data
+/root/data@single-char="&"
+/root/data">"
+/root/data
+/root/data"\"B\";"
+/root/data
+/root/data"\";\""
diff --git a/test/xml/encoded-char/input.xml b/test/xml/encoded-char/input.xml
new file mode 100644
index 0000000..289fc57
--- /dev/null
+++ b/test/xml/encoded-char/input.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Test for correctly converting encoded characters. -->
+<root>
+ <data>Tom &amp; Jerry</data>
+ <data attr="Black &amp; Whilte" attr2="&apos;quoted&apos;">This is &apos;single-quoted&apos;, and this is &quot;double-quoted&quot;.</data>
+ <data attr="&lt;&gt;&apos;&quot;&amp;">Less than (&lt;) and greater than (&gt;) are also encoded.</data>
+ <data>&lt;&gt;&apos;&quot;&amp;</data>
+ <data single-char="&amp;">&gt;</data>
+ <data>&quot;B&quot;;</data>
+ <data>&quot;;&quot;</data>
+</root>
diff --git a/test/xml/invalids/double-boms-and-invalid-byte.xml b/test/xml/invalids/double-boms-and-invalid-byte.xml
new file mode 100644
index 0000000..43254d2
--- /dev/null
+++ b/test/xml/invalids/double-boms-and-invalid-byte.xml
@@ -0,0 +1 @@
+<?xml version="1.0" ?><root/> \ No newline at end of file
diff --git a/test/xml/invalids/only-bom.xml b/test/xml/invalids/only-bom.xml
new file mode 100644
index 0000000..5f28270
--- /dev/null
+++ b/test/xml/invalids/only-bom.xml
@@ -0,0 +1 @@
+ \ No newline at end of file
diff --git a/test/xml/invalids/only-double-boms.xml b/test/xml/invalids/only-double-boms.xml
new file mode 100644
index 0000000..83ea941
--- /dev/null
+++ b/test/xml/invalids/only-double-boms.xml
@@ -0,0 +1 @@
+ \ No newline at end of file
diff --git a/test/xml/invalids/partial-attr-value-with-encoding-char.xml b/test/xml/invalids/partial-attr-value-with-encoding-char.xml
new file mode 100644
index 0000000..a0237ab
--- /dev/null
+++ b/test/xml/invalids/partial-attr-value-with-encoding-char.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0"?>
+<root attr="encoding char is present &amp; no closing quote.
diff --git a/test/xml/invalids/partial-open-element.xml b/test/xml/invalids/partial-open-element.xml
new file mode 100644
index 0000000..7f93d4f
--- /dev/null
+++ b/test/xml/invalids/partial-open-element.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0"?>
+<root
diff --git a/test/xml/no-decl-1/check.txt b/test/xml/no-decl-1/check.txt
new file mode 100644
index 0000000..4b84925
--- /dev/null
+++ b/test/xml/no-decl-1/check.txt
@@ -0,0 +1,8 @@
+/root
+/root/child
+/root/child
+/root/child@attr1="value1"
+/root/child@attr2="value2"
+/root/child
+/root/child/baby
+/root/child/baby"some text"
diff --git a/test/xml/no-decl-1/input.xml b/test/xml/no-decl-1/input.xml
new file mode 100644
index 0000000..fc938d4
--- /dev/null
+++ b/test/xml/no-decl-1/input.xml
@@ -0,0 +1,8 @@
+<root>
+ <child/>
+ <child attr2="value2" attr1="value1"/>
+ <child>
+ <baby>some text</baby>
+ </child>
+</root>
+
diff --git a/test/xml/ns-alias-1/check.txt b/test/xml/ns-alias-1/check.txt
new file mode 100644
index 0000000..7a2225e
--- /dev/null
+++ b/test/xml/ns-alias-1/check.txt
@@ -0,0 +1,10 @@
+ns0="http://default-namespace"
+ns1="http://namespace-1"
+ns2="http://namespace-2"
+/ns1:data
+/ns1:data/ns0:entry
+/ns1:data/ns0:entry"Default"
+/ns1:data/ns1:entry
+/ns1:data/ns1:entry"Inside 1"
+/ns1:data/ns2:entry
+/ns1:data/ns2:entry"Inside 2"
diff --git a/test/xml/ns-alias-1/input.xml b/test/xml/ns-alias-1/input.xml
new file mode 100644
index 0000000..250064a
--- /dev/null
+++ b/test/xml/ns-alias-1/input.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<a:data xmlns="http://default-namespace" xmlns:a="http://namespace-1" xmlns:b="http://namespace-2">
+ <entry>Default</entry>
+ <a:entry>Inside 1</a:entry>
+ <b:entry>Inside 2</b:entry>
+</a:data>
diff --git a/test/xml/osm/street-in-aizu.osm b/test/xml/osm/street-in-aizu.osm
new file mode 100644
index 0000000..2958bb4
--- /dev/null
+++ b/test/xml/osm/street-in-aizu.osm
@@ -0,0 +1,227 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<osm version="0.6" generator="CGImap 0.6.1 (1984 thorn-02.openstreetmap.org)" copyright="OpenStreetMap and contributors" attribution="http://www.openstreetmap.org/copyright" license="http://opendatacommons.org/licenses/odbl/1-0/">
+ <bounds minlat="37.4793300" minlon="139.9158300" maxlat="37.4798000" maxlon="139.9162300"/>
+ <node id="755713171" visible="true" version="3" changeset="26166007" timestamp="2014-10-18T08:39:27Z" user="jun_meguro" uid="279283" lat="37.4793416" lon="139.9160310"/>
+ <node id="761578574" visible="true" version="3" changeset="34357111" timestamp="2015-09-30T22:02:58Z" user="DannyAiquipa" uid="2226712" lat="37.4793344" lon="139.9158428"/>
+ <node id="761578575" visible="true" version="2" changeset="16173374" timestamp="2013-05-17T21:30:31Z" user="jun_meguro" uid="279283" lat="37.4797907" lon="139.9157685"/>
+ <node id="761578576" visible="true" version="2" changeset="16173374" timestamp="2013-05-17T21:30:31Z" user="jun_meguro" uid="279283" lat="37.4801316" lon="139.9157429"/>
+ <node id="2308855657" visible="true" version="3" changeset="53955991" timestamp="2017-11-20T17:45:36Z" user="jun_meguro" uid="279283" lat="37.4791258" lon="139.9161905">
+ <tag k="highway" v="crossing"/>
+ </node>
+ <node id="2308855711" visible="true" version="3" changeset="53955991" timestamp="2017-11-20T17:45:36Z" user="jun_meguro" uid="279283" lat="37.4792845" lon="139.9163414">
+ <tag k="highway" v="traffic_signals"/>
+ </node>
+ <node id="2308855735" visible="true" version="3" changeset="39933437" timestamp="2016-06-10T15:59:44Z" user="jun_meguro" uid="279283" lat="37.4793437" lon="139.9161752">
+ <tag k="highway" v="crossing"/>
+ </node>
+ <node id="2342696889" visible="true" version="2" changeset="34357111" timestamp="2015-09-30T22:02:58Z" user="DannyAiquipa" uid="2226712" lat="37.4792636" lon="139.9145748"/>
+ <node id="2342697034" visible="true" version="1" changeset="16530860" timestamp="2013-06-12T22:40:59Z" user="jun_meguro" uid="279283" lat="37.4797682" lon="139.9160743"/>
+ <node id="2342697041" visible="true" version="2" changeset="39933437" timestamp="2016-06-10T15:59:44Z" user="jun_meguro" uid="279283" lat="37.4797768" lon="139.9163279"/>
+ <node id="2343446366" visible="true" version="1" changeset="16539371" timestamp="2013-06-13T15:58:17Z" user="jun_meguro" uid="279283" lat="37.4793697" lon="139.9158791"/>
+ <node id="2343446367" visible="true" version="1" changeset="16539371" timestamp="2013-06-13T15:58:17Z" user="jun_meguro" uid="279283" lat="37.4793745" lon="139.9160509"/>
+ <node id="2343446368" visible="true" version="1" changeset="16539371" timestamp="2013-06-13T15:58:17Z" user="jun_meguro" uid="279283" lat="37.4793778" lon="139.9161283"/>
+ <node id="2343446369" visible="true" version="1" changeset="16539371" timestamp="2013-06-13T15:58:17Z" user="jun_meguro" uid="279283" lat="37.4793790" lon="139.9159997"/>
+ <node id="2343446370" visible="true" version="1" changeset="16539371" timestamp="2013-06-13T15:58:17Z" user="jun_meguro" uid="279283" lat="37.4794417" lon="139.9161239"/>
+ <node id="2343446371" visible="true" version="1" changeset="16539371" timestamp="2013-06-13T15:58:17Z" user="jun_meguro" uid="279283" lat="37.4794428" lon="139.9161500"/>
+ <node id="2343446372" visible="true" version="1" changeset="16539371" timestamp="2013-06-13T15:58:17Z" user="jun_meguro" uid="279283" lat="37.4794436" lon="139.9158701"/>
+ <node id="2343446373" visible="true" version="1" changeset="16539371" timestamp="2013-06-13T15:58:17Z" user="jun_meguro" uid="279283" lat="37.4794529" lon="139.9159907"/>
+ <node id="2343446374" visible="true" version="1" changeset="16539371" timestamp="2013-06-13T15:58:17Z" user="jun_meguro" uid="279283" lat="37.4794967" lon="139.9160426"/>
+ <node id="2343446375" visible="true" version="1" changeset="16539371" timestamp="2013-06-13T15:58:17Z" user="jun_meguro" uid="279283" lat="37.4795007" lon="139.9158986"/>
+ <node id="2343446376" visible="true" version="1" changeset="16539371" timestamp="2013-06-13T15:58:17Z" user="jun_meguro" uid="279283" lat="37.4795007" lon="139.9160191"/>
+ <node id="2343446377" visible="true" version="1" changeset="16539371" timestamp="2013-06-13T15:58:17Z" user="jun_meguro" uid="279283" lat="37.4795012" lon="139.9161460"/>
+ <node id="2343446378" visible="true" version="1" changeset="16539371" timestamp="2013-06-13T15:58:17Z" user="jun_meguro" uid="279283" lat="37.4795089" lon="139.9160771"/>
+ <node id="2343446379" visible="true" version="1" changeset="16539371" timestamp="2013-06-13T15:58:17Z" user="jun_meguro" uid="279283" lat="37.4795140" lon="139.9161548"/>
+ <node id="2343446380" visible="true" version="1" changeset="16539371" timestamp="2013-06-13T15:58:17Z" user="jun_meguro" uid="279283" lat="37.4795738" lon="139.9158986"/>
+ <node id="2343446381" visible="true" version="1" changeset="16539371" timestamp="2013-06-13T15:58:17Z" user="jun_meguro" uid="279283" lat="37.4795738" lon="139.9160191"/>
+ <node id="2343446382" visible="true" version="1" changeset="16539371" timestamp="2013-06-13T15:58:17Z" user="jun_meguro" uid="279283" lat="37.4796391" lon="139.9158794"/>
+ <node id="2343446383" visible="true" version="1" changeset="16539371" timestamp="2013-06-13T15:58:17Z" user="jun_meguro" uid="279283" lat="37.4796457" lon="139.9160167"/>
+ <node id="2343446384" visible="true" version="1" changeset="16539371" timestamp="2013-06-13T15:58:17Z" user="jun_meguro" uid="279283" lat="37.4797160" lon="139.9158734"/>
+ <node id="2343446385" visible="true" version="1" changeset="16539371" timestamp="2013-06-13T15:58:17Z" user="jun_meguro" uid="279283" lat="37.4797189" lon="139.9160554"/>
+ <node id="2343446386" visible="true" version="1" changeset="16539371" timestamp="2013-06-13T15:58:17Z" user="jun_meguro" uid="279283" lat="37.4797226" lon="139.9160108"/>
+ <node id="2343446387" visible="true" version="1" changeset="16539371" timestamp="2013-06-13T15:58:17Z" user="jun_meguro" uid="279283" lat="37.4797240" lon="139.9161330"/>
+ <node id="2343446388" visible="true" version="1" changeset="16539371" timestamp="2013-06-13T15:58:17Z" user="jun_meguro" uid="279283" lat="37.4797439" lon="139.9159353"/>
+ <node id="2343446389" visible="true" version="1" changeset="16539371" timestamp="2013-06-13T15:58:17Z" user="jun_meguro" uid="279283" lat="37.4797466" lon="139.9160492"/>
+ <node id="2343446390" visible="true" version="1" changeset="16539371" timestamp="2013-06-13T15:58:17Z" user="jun_meguro" uid="279283" lat="37.4797864" lon="139.9159337"/>
+ <node id="2343446391" visible="true" version="1" changeset="16539371" timestamp="2013-06-13T15:58:17Z" user="jun_meguro" uid="279283" lat="37.4797891" lon="139.9160476"/>
+ <node id="3136449574" visible="true" version="1" changeset="26166007" timestamp="2014-10-18T08:39:20Z" user="jun_meguro" uid="279283" lat="37.4792352" lon="139.9141591"/>
+ <node id="3136449575" visible="true" version="1" changeset="26166007" timestamp="2014-10-18T08:39:20Z" user="jun_meguro" uid="279283" lat="37.4792357" lon="139.9141669"/>
+ <node id="4235793561" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:25Z" user="jun_meguro" uid="279283" lat="37.4796203" lon="139.9161051">
+ <tag k="name" v="アーティストハウス"/>
+ <tag k="shop" v="variety_store"/>
+ </node>
+ <node id="4235793567" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:25Z" user="jun_meguro" uid="279283" lat="37.4701581" lon="139.9161869"/>
+ <node id="4235793568" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:25Z" user="jun_meguro" uid="279283" lat="37.4701637" lon="139.9162140"/>
+ <node id="4235793569" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:25Z" user="jun_meguro" uid="279283" lat="37.4701684" lon="139.9162316"/>
+ <node id="4235793571" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:25Z" user="jun_meguro" uid="279283" lat="37.4701833" lon="139.9162564"/>
+ <node id="4235793573" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:25Z" user="jun_meguro" uid="279283" lat="37.4702067" lon="139.9162788"/>
+ <node id="4235793575" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:25Z" user="jun_meguro" uid="279283" lat="37.4702282" lon="139.9162929"/>
+ <node id="4235793576" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:25Z" user="jun_meguro" uid="279283" lat="37.4702637" lon="139.9162976"/>
+ <node id="4235793577" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:25Z" user="jun_meguro" uid="279283" lat="37.4703460" lon="139.9163000"/>
+ <node id="4235793578" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:25Z" user="jun_meguro" uid="279283" lat="37.4705470" lon="139.9162976"/>
+ <node id="4235793580" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:25Z" user="jun_meguro" uid="279283" lat="37.4712414" lon="139.9163094"/>
+ <node id="4235793582" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:26Z" user="jun_meguro" uid="279283" lat="37.4721138" lon="139.9163047"/>
+ <node id="4235793588" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:26Z" user="jun_meguro" uid="279283" lat="37.4756994" lon="139.9162879"/>
+ <node id="4235795990" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:26Z" user="jun_meguro" uid="279283" lat="37.4760347" lon="139.9162916"/>
+ <node id="4235795992" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:26Z" user="jun_meguro" uid="279283" lat="37.4765378" lon="139.9162920"/>
+ <node id="4235795994" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:26Z" user="jun_meguro" uid="279283" lat="37.4769583" lon="139.9162836"/>
+ <node id="4235795996" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:26Z" user="jun_meguro" uid="279283" lat="37.4774011" lon="139.9162629"/>
+ <node id="4235796011" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:26Z" user="jun_meguro" uid="279283" lat="37.4779859" lon="139.9162473"/>
+ <node id="4235796054" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:27Z" user="jun_meguro" uid="279283" lat="37.4785655" lon="139.9162711"/>
+ <node id="4235796117" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:28Z" user="jun_meguro" uid="279283" lat="37.4790400" lon="139.9162695"/>
+ <node id="4235796123" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:28Z" user="jun_meguro" uid="279283" lat="37.4790592" lon="139.9162671"/>
+ <node id="4235796125" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:28Z" user="jun_meguro" uid="279283" lat="37.4790721" lon="139.9162630"/>
+ <node id="4235796128" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:28Z" user="jun_meguro" uid="279283" lat="37.4790836" lon="139.9162533"/>
+ <node id="4235796131" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:28Z" user="jun_meguro" uid="279283" lat="37.4790964" lon="139.9162339"/>
+ <node id="4235796133" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:28Z" user="jun_meguro" uid="279283" lat="37.4791003" lon="139.9162178"/>
+ <node id="4235796134" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:28Z" user="jun_meguro" uid="279283" lat="37.4791016" lon="139.9161919"/>
+ <node id="4235796142" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:28Z" user="jun_meguro" uid="279283" lat="37.4791481" lon="139.9161887"/>
+ <node id="4235796158" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:28Z" user="jun_meguro" uid="279283" lat="37.4791864" lon="139.9161860">
+ <tag k="highway" v="crossing"/>
+ </node>
+ <node id="4235796176" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:29Z" user="jun_meguro" uid="279283" lat="37.4792793" lon="139.9161796">
+ <tag k="highway" v="crossing"/>
+ </node>
+ <node id="4235796191" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:29Z" user="jun_meguro" uid="279283" lat="37.4793168" lon="139.9161770"/>
+ <node id="4235796205" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:29Z" user="jun_meguro" uid="279283" lat="37.4793888" lon="139.9161711"/>
+ <node id="4235796209" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:29Z" user="jun_meguro" uid="279283" lat="37.4794017" lon="139.9162131"/>
+ <node id="4235796211" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:29Z" user="jun_meguro" uid="279283" lat="37.4794100" lon="139.9162293"/>
+ <node id="4235796213" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:29Z" user="jun_meguro" uid="279283" lat="37.4794209" lon="139.9162463"/>
+ <node id="4235796221" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:29Z" user="jun_meguro" uid="279283" lat="37.4794485" lon="139.9162576"/>
+ <node id="4235796227" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:29Z" user="jun_meguro" uid="279283" lat="37.4797165" lon="139.9162592"/>
+ <node id="4235796236" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:29Z" user="jun_meguro" uid="279283" lat="37.4801090" lon="139.9162665"/>
+ <node id="4235796347" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:31Z" user="jun_meguro" uid="279283" lat="37.4795493" lon="139.9161108">
+ <tag k="amenity" v="restaurant"/>
+ <tag k="cuisine" v="chinese"/>
+ <tag k="name" v="大龍軒"/>
+ </node>
+ <node id="4235796350" visible="true" version="1" changeset="39933437" timestamp="2016-06-10T15:59:31Z" user="jun_meguro" uid="279283" lat="37.4796932" lon="139.9160989">
+ <tag k="amenity" v="restaurant"/>
+ <tag k="cuisine" v="chinese"/>
+ <tag k="name" v="鈴木飯店"/>
+ </node>
+ <node id="5252454385" visible="true" version="1" changeset="54155492" timestamp="2017-11-28T17:52:34Z" user="jun_meguro" uid="279283" lat="37.4778775" lon="139.9162502"/>
+ <node id="6086973524" visible="true" version="1" changeset="64836723" timestamp="2018-11-24T05:02:55Z" user="jun_meguro" uid="279283" lat="37.4792738" lon="139.9147579"/>
+ <way id="60521477" visible="true" version="7" changeset="64836723" timestamp="2018-11-24T05:02:55Z" user="jun_meguro" uid="279283">
+ <nd ref="3136449574"/>
+ <nd ref="3136449575"/>
+ <nd ref="2342696889"/>
+ <nd ref="6086973524"/>
+ <nd ref="761578574"/>
+ <nd ref="755713171"/>
+ <nd ref="2308855735"/>
+ <nd ref="2308855711"/>
+ <tag k="highway" v="unclassified"/>
+ </way>
+ <way id="60839396" visible="true" version="1" changeset="4877772" timestamp="2010-06-01T19:36:13Z" user="jun_meguro" uid="279283">
+ <nd ref="761578574"/>
+ <nd ref="761578575"/>
+ <nd ref="761578576"/>
+ <tag k="highway" v="unclassified"/>
+ </way>
+ <way id="225498209" visible="true" version="1" changeset="16530860" timestamp="2013-06-12T22:41:35Z" user="jun_meguro" uid="279283">
+ <nd ref="2342697041"/>
+ <nd ref="2342697034"/>
+ <tag k="highway" v="residential"/>
+ <tag k="source" v="GSI/KIBAN 2500; NARO"/>
+ </way>
+ <way id="225581287" visible="true" version="1" changeset="16539371" timestamp="2013-06-13T15:58:33Z" user="jun_meguro" uid="279283">
+ <nd ref="2343446387"/>
+ <nd ref="2343446379"/>
+ <nd ref="2343446378"/>
+ <nd ref="2343446385"/>
+ <nd ref="2343446387"/>
+ <tag k="building" v="residential"/>
+ </way>
+ <way id="225581303" visible="true" version="1" changeset="16539371" timestamp="2013-06-13T15:58:34Z" user="jun_meguro" uid="279283">
+ <nd ref="2343446372"/>
+ <nd ref="2343446373"/>
+ <nd ref="2343446369"/>
+ <nd ref="2343446366"/>
+ <nd ref="2343446372"/>
+ <tag k="building" v="residential"/>
+ </way>
+ <way id="225581308" visible="true" version="1" changeset="16539371" timestamp="2013-06-13T15:58:34Z" user="jun_meguro" uid="279283">
+ <nd ref="2343446390"/>
+ <nd ref="2343446391"/>
+ <nd ref="2343446389"/>
+ <nd ref="2343446388"/>
+ <nd ref="2343446390"/>
+ <tag k="building" v="residential"/>
+ </way>
+ <way id="225581312" visible="true" version="1" changeset="16539371" timestamp="2013-06-13T15:58:34Z" user="jun_meguro" uid="279283">
+ <nd ref="2343446384"/>
+ <nd ref="2343446386"/>
+ <nd ref="2343446383"/>
+ <nd ref="2343446382"/>
+ <nd ref="2343446384"/>
+ <tag k="building" v="residential"/>
+ </way>
+ <way id="225581316" visible="true" version="1" changeset="16539371" timestamp="2013-06-13T15:58:34Z" user="jun_meguro" uid="279283">
+ <nd ref="2343446380"/>
+ <nd ref="2343446381"/>
+ <nd ref="2343446376"/>
+ <nd ref="2343446375"/>
+ <nd ref="2343446380"/>
+ <tag k="building" v="residential"/>
+ </way>
+ <way id="225581392" visible="true" version="1" changeset="16539371" timestamp="2013-06-13T15:58:38Z" user="jun_meguro" uid="279283">
+ <nd ref="2343446374"/>
+ <nd ref="2343446377"/>
+ <nd ref="2343446371"/>
+ <nd ref="2343446370"/>
+ <nd ref="2343446368"/>
+ <nd ref="2343446367"/>
+ <nd ref="2343446374"/>
+ <tag k="building" v="residential"/>
+ </way>
+ <way id="424116497" visible="true" version="3" changeset="54155492" timestamp="2017-11-28T17:52:36Z" user="jun_meguro" uid="279283">
+ <nd ref="4235796205"/>
+ <nd ref="2308855735"/>
+ <nd ref="4235796191"/>
+ <nd ref="4235796176"/>
+ <nd ref="4235796158"/>
+ <nd ref="4235796142"/>
+ <nd ref="2308855657"/>
+ <nd ref="4235796134"/>
+ <nd ref="4235796133"/>
+ <nd ref="4235796131"/>
+ <nd ref="4235796128"/>
+ <nd ref="4235796125"/>
+ <nd ref="4235796123"/>
+ <nd ref="4235796117"/>
+ <nd ref="4235796054"/>
+ <nd ref="4235796011"/>
+ <nd ref="5252454385"/>
+ <nd ref="4235795996"/>
+ <nd ref="4235795994"/>
+ <nd ref="4235795992"/>
+ <nd ref="4235795990"/>
+ <nd ref="4235793588"/>
+ <nd ref="4235793582"/>
+ <nd ref="4235793580"/>
+ <nd ref="4235793578"/>
+ <nd ref="4235793577"/>
+ <nd ref="4235793576"/>
+ <nd ref="4235793575"/>
+ <nd ref="4235793573"/>
+ <nd ref="4235793571"/>
+ <nd ref="4235793569"/>
+ <nd ref="4235793568"/>
+ <nd ref="4235793567"/>
+ <tag k="footway" v="sidewalk"/>
+ <tag k="highway" v="footway"/>
+ </way>
+ <way id="424116516" visible="true" version="3" changeset="55053671" timestamp="2017-12-31T09:48:02Z" user="jun_meguro" uid="279283">
+ <nd ref="4235796236"/>
+ <nd ref="4235796227"/>
+ <nd ref="4235796221"/>
+ <nd ref="4235796213"/>
+ <nd ref="4235796211"/>
+ <nd ref="4235796209"/>
+ <nd ref="4235796205"/>
+ <tag k="footway" v="sidewalk"/>
+ <tag k="highway" v="footway"/>
+ <tag k="tactile_paving" v="yes"/>
+ <tag k="width" v="2.6"/>
+ </way>
+</osm>
diff --git a/test/xml/parse-only/rss/input.xml b/test/xml/parse-only/rss/input.xml
new file mode 100644
index 0000000..172377c
--- /dev/null
+++ b/test/xml/parse-only/rss/input.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<rss version="2.0"
+ xmlns:content="http://purl.org/rss/1.0/modules/content/"
+ xmlns:wfw="http://wellformedweb.org/CommentAPI/"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:atom="http://www.w3.org/2005/Atom"
+ xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
+ xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
+ >
+
+<channel>
+ <title>Roundtrip to Shanghai via Tokyo</title>
+ <atom:link href="http://kohei.us/feed/" rel="self" type="application/rss+xml" />
+ <link>http://kohei.us</link>
+ <description>Kohei Yoshida&#039;s Webspace</description>
+ <lastBuildDate>Wed, 17 Apr 2013 16:48:48 +0000</lastBuildDate>
+ <language>en-US</language>
+ <sy:updatePeriod>hourly</sy:updatePeriod>
+ <sy:updateFrequency>1</sy:updateFrequency>
+ <generator>http://wordpress.org/?v=3.5.1</generator>
+ <item>
+ <title>SUSE Hack Week</title>
+ <link>http://kohei.us/2013/04/17/suse-hack-week/</link>
+ <comments>http://kohei.us/2013/04/17/suse-hack-week/#comments</comments>
+ <pubDate>Wed, 17 Apr 2013 16:48:48 +0000</pubDate>
+ <dc:creator>Kohei Yoshida</dc:creator>
+ <category><![CDATA[]]></category>
+ <category><![CDATA[calc]]></category>
+ <category><![CDATA[excel]]></category>
+ <category><![CDATA[hack week]]></category>
+ <category><![CDATA[orcus]]></category>
+ <category><![CDATA[performance]]></category>
+
+ <guid isPermaLink="false">http://kohei.us/?p=1646</guid>
+ <description><![CDATA[Last week was SUSE&#8217;s Hack Week &#8211; an event my employer does periodically to allow us &#8211; hard working engineers &#8211; to go wild with our wildest ideas and execute them in one week. Just like what I did at my last Hack Week event, I decided to work on integration of Orcus library into LibreOffice once again, to pick up on what I&#8217;d left off from my previous integration work. Integration bits Prior to Hack Week, orcus was already partially integrated; it was used to provide the backend functionality for Calc&#8217;s XML Source feature, and experimental support for Gnumeric file import. The XML Source side was pretty well integrated, [...]]]></description>
+ <content:encoded><![CDATA[<p>Last week was SUSE&#8217;s Hack Week &#8211; an event my employer does periodically to allow us &#8211; hard working engineers &#8211; to go wild with our wildest ideas and execute them in one week. Just like what I did at <a href="2012/08/08/orcus-integration-into-libreoffice/">my last Hack Week event</a>, I decided to work on integration of <a href="https://gitorious.org/orcus">Orcus library</a> into LibreOffice once again, to pick up on what I&#8217;d left off from my previous integration work.</p>
+<h3>Integration bits</h3>
+<p>Prior to Hack Week, orcus was already partially integrated; it was used to provide the backend functionality for <a href="https://wiki.documentfoundation.org/Development/Calc/XMLSource">Calc&#8217;s XML Source feature</a>, and experimental support for Gnumeric file import. The XML Source side was pretty well integrated, but the normal file import side was only partially integrated. Lots of essential pieces were still missing, the largest of which were</p>
+<ul>
+<li>support for multiple filters from a single external filter provider source (such as orcus),</li>
+<li>progress indicator in the status bar, and</li>
+<li>proper type detection by analyzing file content rather than its extension (which we call &#8220;deep detection&#8221;).</li>
+</ul>
+<p>In short, I was able to complete the first two pieces during Hack Week, while the last item still has yet to be worked on. Aside from this, there are still more minor pieces missing, but perhaps I can work on the remaining bits during the next Hack Week.</p>
+<h3>Enabling orcus in your build</h3>
+<p>If you have a recent enough build from the master branch of the LibreOffice repository, you can enable imports via orcus library by</p>
+<ol>
+<li>checking the <strong>Enable experimental features</strong> box in the Options dialog, and</li>
+<li>setting the environment variable <strong>LIBO_USE_ORCUS</strong> to <strong>YES</strong> before launching Calc.</li>
+</ol>
+<p>This will overwrite the stock import filters for ODS, XLSX and CSV. At present, orcus only performs file extension based detection rather than content based one, so be mindful of this when you try this on your machine. To go back to the current import filters, simply disable experimental features, or unset the environment variable.</p>
+<p>Note that I&#8217;ve added this bits to showcase a preview of what orcus can potentially do as a future import filter framework. As such, <em>never use this in production if you want stable file loading experience, or don&#8217;t file bugs against this</em>. We are not ready for that yet. Orcus filters are still missing lots and lots of features.</p>
+<p>Also note that, while in theory you could enable orcus with the Windows build, the performance of orcus on Windows may not be that impressive; in fact, in some cases slower than the current filters. That is because orcus relies on strtod and strtol system calls to convert string numbers into numeric values, and their implementation depend on the platform. And <a href="http://tinodidriksen.com/2011/05/28/cpp-convert-string-to-double-speed/">the performance of MSVC&#8217;s strtod implementation is known to be suboptimal compared to those of gcc and clang on Linux</a>. I&#8217;m very much aware of this, and will work on addressing this at a later time.</p>
+<h3>Performance comparison</h3>
+<p>This is perhaps the most interesting part. I wanted to do a quick performance comparison and see how this orcus filter stands up against the current filter. Given the orcus filter is still only capable of importing raw cell values and not any other features or properties (not even cell formats), I&#8217;ve used <a href="http://cgit.freedesktop.org/libreoffice/contrib/test-files/plain/calc/xlsx-import/perf/8-by-300000-cells.xlsx">this test file which <em>only</em> consists of raw text and numeric values in a 8-by-300000 range</a>, to measure the load times that are as fair and representative as I could make them. Here is the result on my machine running openSUSE 11.4:</p>
+<p><a href="http://kohei.us/wp-content/uploads/2013/04/xlsx-load-times.png"><img src="http://kohei.us/wp-content/uploads/2013/04/xlsx-load-times.png" alt="xlsx-load-times" width="575" height="340" class="alignnone size-full wp-image-1648" /></a></p>
+<p>The current filter, which has undergone its set of performance optimizations on raw cell values, still spends upwards of 50 seconds. Given that it used to take minutes to load this file, it&#8217;s still an improvement.</p>
+<p>The orcus filter, on the other hand, combined with the heavily optimized load handler in Calc core that I put in place during Hack Week, can load the same file in 4.5 seconds. I would say that is pretty impressive.</p>
+<p>I also measured the load time on the same file using Excel 2007, on the same machine running on top of wine, and the result was 7.5 seconds. While running an Windows app via wine emulation layer may incur some performance cost, <a href="http://wiki.winehq.org/Debunking_Wine_Myths#head-7c9ecddfaff60d8891414b68d74277244e7109eb">this page</a> suggests that it should not be noticeable, if any. And my own experience of running various versions of Excel via wine backs up that argument. So this number should be fairly representative of Excel&#8217;s native performance on the same hardware.</p>
+<p>Considering that my ultimate goal with orcus is to beat Excel on performance on loading its own files (or at least not be slower than Excel), I would say we are making good progress toward that goal.</p>
+<p>That&#8217;s all for today. Thank you, ladies and gentlemen.</p>
+]]></content:encoded>
+ <wfw:commentRss>http://kohei.us/2013/04/17/suse-hack-week/feed/</wfw:commentRss>
+ <slash:comments>3</slash:comments>
+ </item>
+ </channel>
+</rss>
diff --git a/test/xml/self-closing-root/check.txt b/test/xml/self-closing-root/check.txt
new file mode 100644
index 0000000..0661686
--- /dev/null
+++ b/test/xml/self-closing-root/check.txt
@@ -0,0 +1 @@
+/foo
diff --git a/test/xml/self-closing-root/input.xml b/test/xml/self-closing-root/input.xml
new file mode 100644
index 0000000..6cb0d72
--- /dev/null
+++ b/test/xml/self-closing-root/input.xml
@@ -0,0 +1 @@
+<foo/><foo/><foo/>
diff --git a/test/xml/simple/check.txt b/test/xml/simple/check.txt
new file mode 100644
index 0000000..a90483e
--- /dev/null
+++ b/test/xml/simple/check.txt
@@ -0,0 +1,12 @@
+/root
+/root/child
+/root/child
+/root/child@attr1="value1"
+/root/child@attr2="value2"
+/root/child
+/root/child/baby
+/root/child/baby"some text"
+/root"before comment|"
+/root"|after comment"
+/root/child
+/root/child@attr3="value3"
diff --git a/test/xml/simple/input.xml b/test/xml/simple/input.xml
new file mode 100644
index 0000000..10ad8fd
--- /dev/null
+++ b/test/xml/simple/input.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- this is a comment -->
+<root>
+ <child/>
+ <child attr2="value2" attr1="value1"/>
+ <child>
+ <baby>some text</baby>
+ </child>
+ before comment|<!-- another comment -->|after comment
+ <child attr3="value3"/>
+ <!-- another comment - with a single hyphen. -->
+</root>
+
diff --git a/test/xml/single-quote/check.txt b/test/xml/single-quote/check.txt
new file mode 100644
index 0000000..b07f0ac
--- /dev/null
+++ b/test/xml/single-quote/check.txt
@@ -0,0 +1,11 @@
+/root
+/root/child
+/root/child@attr1="value1"
+/root/child@attr2="value2"
+/root/child
+/root/child@attr3="\"quoted\""
+/root/child@attr4="before\"after"
+/root/child
+/root/child@attr5=""
+/root/child
+/root/child@attr6="double-quoted"
diff --git a/test/xml/single-quote/input.xml b/test/xml/single-quote/input.xml
new file mode 100644
index 0000000..1cd65db
--- /dev/null
+++ b/test/xml/single-quote/input.xml
@@ -0,0 +1,9 @@
+<?xml version='1.0' encoding='utf-8'?>
+<!-- this is a comment -->
+<root>
+ <child attr2='value2' attr1='value1'/>
+ <child attr3='"quoted"' attr4='before"after'/>
+ <child attr5=''/> <!-- empty attribute value -->
+ <child attr6="double-quoted"/>
+</root>
+
diff --git a/test/xml/underscore-identifier/check.txt b/test/xml/underscore-identifier/check.txt
new file mode 100644
index 0000000..924ade2
--- /dev/null
+++ b/test/xml/underscore-identifier/check.txt
@@ -0,0 +1,5 @@
+/root
+/root/_child
+/root/_child
+/root/_child@_attr2="value2"
+/root/_child@at_tr1="value1"
diff --git a/test/xml/underscore-identifier/input.xml b/test/xml/underscore-identifier/input.xml
new file mode 100644
index 0000000..682514e
--- /dev/null
+++ b/test/xml/underscore-identifier/input.xml
@@ -0,0 +1,4 @@
+<root>
+ <_child/>
+ <_child _attr2="value2" at_tr1="value1"/>
+</root>
diff --git a/test/xml/utf8-1/check.txt b/test/xml/utf8-1/check.txt
new file mode 100644
index 0000000..77b7c00
--- /dev/null
+++ b/test/xml/utf8-1/check.txt
@@ -0,0 +1,4 @@
+/Myšička
+/Myšička@jméno="Žužla"
+/Myšička/Nožičky
+/Myšička/Nožičky"4"
diff --git a/test/xml/utf8-1/input.xml b/test/xml/utf8-1/input.xml
new file mode 100644
index 0000000..c516744
--- /dev/null
+++ b/test/xml/utf8-1/input.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Myšička jméno="Žužla">
+ <Nožičky>4</Nožičky>
+</Myšička>
diff --git a/test/xml/utf8-2/check.txt b/test/xml/utf8-2/check.txt
new file mode 100644
index 0000000..d847aa6
--- /dev/null
+++ b/test/xml/utf8-2/check.txt
@@ -0,0 +1,4 @@
+/ИдОтпр
+/ИдОтпр/ФИООтв
+/ИдОтпр/ФИООтв@Имя="_"
+/ИдОтпр/ФИООтв@Фамилия="_"
diff --git a/test/xml/utf8-2/input.xml b/test/xml/utf8-2/input.xml
new file mode 100644
index 0000000..9e8b294
--- /dev/null
+++ b/test/xml/utf8-2/input.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ИдОтпр>
+ <ФИООтв Фамилия="_" Имя="_"/>
+</ИдОтпр>
+
diff --git a/test/xml/valids/double-boms.xml b/test/xml/valids/double-boms.xml
new file mode 100644
index 0000000..dbb1ebd
--- /dev/null
+++ b/test/xml/valids/double-boms.xml
@@ -0,0 +1 @@
+<?xml version="1.0" ?><root/> \ No newline at end of file
diff --git a/test/yaml/basic1/input.yaml b/test/yaml/basic1/input.yaml
new file mode 100644
index 0000000..4ba06b4
--- /dev/null
+++ b/test/yaml/basic1/input.yaml
@@ -0,0 +1,19 @@
+# header comment.
+--- # start of document
+dict:
+ a: 1 # one
+ b: 2 # two
+ c:
+ - foo
+ - bar
+list:
+ - 1
+ - 2
+ -
+ a: 1.1
+ b: 1.2
+ c: 1.3
+
+number: 12.3
+string: foo
+
diff --git a/test/yaml/basic2/input.yaml b/test/yaml/basic2/input.yaml
new file mode 100644
index 0000000..ddc993a
--- /dev/null
+++ b/test/yaml/basic2/input.yaml
@@ -0,0 +1,6 @@
+# Missing document start marker '---'
+- 1
+-
+ 2
+-
+ 3
diff --git a/test/yaml/basic3/input.yaml b/test/yaml/basic3/input.yaml
new file mode 100644
index 0000000..ab3e3b1
--- /dev/null
+++ b/test/yaml/basic3/input.yaml
@@ -0,0 +1,7 @@
+---
+- a: 1
+ b: 2
+ c: 3
+- d: 4
+ e: 5
+ f: 6
diff --git a/test/yaml/boolean/input.yaml b/test/yaml/boolean/input.yaml
new file mode 100644
index 0000000..1afeeab
--- /dev/null
+++ b/test/yaml/boolean/input.yaml
@@ -0,0 +1,33 @@
+---
+positive:
+ - y
+ - Y
+ - yes
+ - Yes
+ - YES
+ - true
+ - True
+ - TRUE
+ - on
+ - On
+ - ON
+negative:
+ - n
+ - N
+ - no
+ - No
+ - NO
+ - false
+ - False
+ - FALSE
+ - off
+ - Off
+ - OFF
+non boolean:
+ - yES
+ - nO
+ - tRUE
+ - faLSE
+ - oN
+ - oFF
+
diff --git a/test/yaml/empty-value-map-1/input.yaml b/test/yaml/empty-value-map-1/input.yaml
new file mode 100644
index 0000000..6ae0793
--- /dev/null
+++ b/test/yaml/empty-value-map-1/input.yaml
@@ -0,0 +1,3 @@
+---
+key:
+
diff --git a/test/yaml/empty-value-map-2/input.yaml b/test/yaml/empty-value-map-2/input.yaml
new file mode 100644
index 0000000..abc4334
--- /dev/null
+++ b/test/yaml/empty-value-map-2/input.yaml
@@ -0,0 +1,3 @@
+---
+key1:
+key2:
diff --git a/test/yaml/empty-value-sequence-1/input.yaml b/test/yaml/empty-value-sequence-1/input.yaml
new file mode 100644
index 0000000..d55221c
--- /dev/null
+++ b/test/yaml/empty-value-sequence-1/input.yaml
@@ -0,0 +1,2 @@
+---
+- # empty sequence element should be interpreted as null.
diff --git a/test/yaml/empty-value-sequence-2/input.yaml b/test/yaml/empty-value-sequence-2/input.yaml
new file mode 100644
index 0000000..417173f
--- /dev/null
+++ b/test/yaml/empty-value-sequence-2/input.yaml
@@ -0,0 +1,3 @@
+--- # sequence with two empty elements which implicitly contain null values.
+-
+-
diff --git a/test/yaml/invalids/1.yaml b/test/yaml/invalids/1.yaml
new file mode 100644
index 0000000..3280620
--- /dev/null
+++ b/test/yaml/invalids/1.yaml
@@ -0,0 +1,4 @@
+---
+ a: # the first non-comment line should not be indented.
+b:
+
diff --git a/test/yaml/invalids/2.yaml b/test/yaml/invalids/2.yaml
new file mode 100644
index 0000000..fbe4023
--- /dev/null
+++ b/test/yaml/invalids/2.yaml
@@ -0,0 +1,4 @@
+---
+key:
+a # key is expected here but not found.
+
diff --git a/test/yaml/invalids/3.yaml b/test/yaml/invalids/3.yaml
new file mode 100644
index 0000000..cf14ffe
--- /dev/null
+++ b/test/yaml/invalids/3.yaml
@@ -0,0 +1,4 @@
+---
+- a
+c # sequence element is expected, but not found.
+- b
diff --git a/test/yaml/literal-block-1/input.yaml b/test/yaml/literal-block-1/input.yaml
new file mode 100644
index 0000000..38a7799
--- /dev/null
+++ b/test/yaml/literal-block-1/input.yaml
@@ -0,0 +1,11 @@
+# Multi-line string where line breaks need to be preserved.
+
+# When the line begins with '|', the next line needs to be indented, and all
+# the other lines thereafter need to have indent level greater than that of
+# the first line.
+--- |
+ line 1
+ line 2
+ line 3
+ 2 blanks follow
+
diff --git a/test/yaml/literal-block-2/input.yaml b/test/yaml/literal-block-2/input.yaml
new file mode 100644
index 0000000..a71fa09
--- /dev/null
+++ b/test/yaml/literal-block-2/input.yaml
@@ -0,0 +1,9 @@
+---
+literal block: | # line breaks and white spaces are preserved.
+ line 1
+ line 2
+ line 3
+multi line: # the lines are merged into "line 1 line 2 line 3"
+ line 1
+ line 2
+ line 3
diff --git a/test/yaml/map-key-1/input.yaml b/test/yaml/map-key-1/input.yaml
new file mode 100644
index 0000000..6778b52
--- /dev/null
+++ b/test/yaml/map-key-1/input.yaml
@@ -0,0 +1,5 @@
+-key: # this is a map key that starts with a '-'.
+ value
+key:
+ value
+
diff --git a/test/yaml/multi-line-1/input.yaml b/test/yaml/multi-line-1/input.yaml
new file mode 100644
index 0000000..824ed7b
--- /dev/null
+++ b/test/yaml/multi-line-1/input.yaml
@@ -0,0 +1,4 @@
+# This document contains one root value of "1 2 3".
+--- 1
+2
+3
diff --git a/test/yaml/multi-line-2/input.yaml b/test/yaml/multi-line-2/input.yaml
new file mode 100644
index 0000000..a382e66
--- /dev/null
+++ b/test/yaml/multi-line-2/input.yaml
@@ -0,0 +1,5 @@
+# Once a multi-line string starts, everything becomes part of it.
+# This document has only one root value that has a string value of "1 - 2 - 3".
+1
+- 2
+- 3
diff --git a/test/yaml/null/input.yaml b/test/yaml/null/input.yaml
new file mode 100644
index 0000000..56d68d3
--- /dev/null
+++ b/test/yaml/null/input.yaml
@@ -0,0 +1,10 @@
+--- # Handle null keywords.
+# These are all valid null values.
+- null
+- Null
+- NULL
+- ~
+# However, these are not null values but string values according to the spec.
+- nULL
+- NUll
+
diff --git a/test/yaml/quoted-string/input.yaml b/test/yaml/quoted-string/input.yaml
new file mode 100644
index 0000000..d2b50e5
--- /dev/null
+++ b/test/yaml/quoted-string/input.yaml
@@ -0,0 +1,22 @@
+---
+"I am quoted: ~ " : "Here is another quote."
+list with quoted string values :
+ - "1 2 3"
+ - "null"
+ - "true"
+ - "false"
+ - "#hashtag"
+ - "\"quoted inside\""
+ - "'single quote inside'"
+ - "Japan's finest beer"
+'single quoted string values' :
+ - '8.8.8.8'
+ - '''single quote inside'''
+ - 'prefix ''quoted'' suffix'
+ - '"double quote"'
+ - 'before "quote" after'
+ - 'http://www.google.com'
+ - '''''''' # equivalent of "'''"
+ - ' '' '' '' ' # equivalent of " ' ' ' "
+ - '#hashtag'
+
diff --git a/test/yaml/swagger/input.yaml b/test/yaml/swagger/input.yaml
new file mode 100644
index 0000000..3577bb0
--- /dev/null
+++ b/test/yaml/swagger/input.yaml
@@ -0,0 +1,155 @@
+swagger: '2.0'
+info:
+ version: '1.0.0'
+ title: Swagger Petstore (Simple)
+ description: A sample API that uses a petstore as an example to demonstrate features in the swagger-2.0 specification
+ termsOfService: http://helloreverb.com/terms/
+ contact:
+ name: Swagger API team
+ email: foo@example.com
+ url: http://swagger.io
+ license:
+ name: MIT
+ url: http://opensource.org/licenses/MIT
+host: petstore.swagger.wordnik.com
+basePath: /api
+schemes:
+ - http
+consumes:
+ - application/json
+produces:
+ - application/json
+paths:
+ /pets:
+ get:
+ description: Returns all pets from the system that the user has access to
+ operationId: findPets
+ produces:
+ - application/json
+ - application/xml
+ - text/xml
+ - text/html
+ parameters:
+ - name: tags
+ in: query
+ description: tags to filter by
+ required: false
+ type: array
+ items:
+ type: string
+ collectionFormat: csv
+ - name: limit
+ in: query
+ description: maximum number of results to return
+ required: false
+ type: integer
+ format: int32
+ responses:
+ '200':
+ description: pet response
+ schema:
+ type: array
+ items:
+ $ref: '#/definitions/pet'
+ default:
+ description: unexpected error
+ schema:
+ $ref: '#/definitions/errorModel'
+ post:
+ description: Creates a new pet in the store. Duplicates are allowed
+ operationId: addPet
+ produces:
+ - application/json
+ parameters:
+ - name: pet
+ in: body
+ description: Pet to add to the store
+ required: true
+ schema:
+ $ref: '#/definitions/newPet'
+ responses:
+ '200':
+ description: pet response
+ schema:
+ $ref: '#/definitions/pet'
+ default:
+ description: unexpected error
+ schema:
+ $ref: '#/definitions/errorModel'
+ /pets/{id}:
+ get:
+ description: Returns a user based on a single ID, if the user does not have access to the pet
+ operationId: findPetById
+ produces:
+ - application/json
+ - application/xml
+ - text/xml
+ - text/html
+ parameters:
+ - name: id
+ in: path
+ description: ID of pet to fetch
+ required: true
+ type: integer
+ format: int64
+ responses:
+ '200':
+ description: pet response
+ schema:
+ $ref: '#/definitions/pet'
+ default:
+ description: unexpected error
+ schema:
+ $ref: '#/definitions/errorModel'
+ delete:
+ description: deletes a single pet based on the ID supplied
+ operationId: deletePet
+ parameters:
+ - name: id
+ in: path
+ description: ID of pet to delete
+ required: true
+ type: integer
+ format: int64
+ responses:
+ '204':
+ description: pet deleted
+ default:
+ description: unexpected error
+ schema:
+ $ref: '#/definitions/errorModel'
+definitions:
+ pet:
+ required:
+ - id
+ - name
+ properties:
+ id:
+ type: integer
+ format: int64
+ name:
+ type: string
+ tag:
+ type: string
+ newPet:
+ required:
+ - name
+ properties:
+ id:
+ type: integer
+ format: int64
+ name:
+ type: string
+ tag:
+ type: string
+ errorModel:
+ required:
+ - code
+ - message
+ properties:
+ code:
+ type: integer
+ format: int32
+ message:
+ type: string
+
diff --git a/test/yaml/url/input.yaml b/test/yaml/url/input.yaml
new file mode 100644
index 0000000..7818ae0
--- /dev/null
+++ b/test/yaml/url/input.yaml
@@ -0,0 +1,7 @@
+---
+- http://www.google.com/
+- mailto:joe@joe-me.com
+- orcus-url:
+ http://gitlab.com/orcus/orcus
+ debian-bugs: mailto:submit@bugs.debian.org
+